diff options
| author | Jeff Brown <jeffbrown@google.com> | 2010-05-21 14:06:04 -0700 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2010-05-21 14:06:04 -0700 |
| commit | dc5942840e1d1501a7ac4d633e8c5311e90c903b (patch) | |
| tree | 26a2e095c5281a1133222fd89db1bfdf20a87284 /fastboot | |
| parent | ac322da69ee48aa792baf5c48cfb719ce077f67e (diff) | |
| parent | b64063737e93638a09205e9310b58d8ddd7138ec (diff) | |
| download | system_core-dc5942840e1d1501a7ac4d633e8c5311e90c903b.tar.gz system_core-dc5942840e1d1501a7ac4d633e8c5311e90c903b.tar.bz2 system_core-dc5942840e1d1501a7ac4d633e8c5311e90c903b.zip | |
Merge "Fix kernel panics in fastboot on OS X." into kraken
Diffstat (limited to 'fastboot')
| -rw-r--r-- | fastboot/usb_osx.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/fastboot/usb_osx.c b/fastboot/usb_osx.c index 0b0512d1..94886872 100644 --- a/fastboot/usb_osx.c +++ b/fastboot/usb_osx.c @@ -64,7 +64,7 @@ struct usb_handle /** Try out all the interfaces and see if there's a match. Returns 0 on * success, -1 on failure. */ -static int try_interfaces(IOUSBDeviceInterface **dev, usb_handle *handle) { +static int try_interfaces(IOUSBDeviceInterface182 **dev, usb_handle *handle) { IOReturn kr; IOUSBFindInterfaceRequest request; io_iterator_t iterator; @@ -515,8 +515,29 @@ int usb_write(usb_handle *h, const void *data, int len) { return -1; } +#if 0 result = (*h->interface)->WritePipe( h->interface, h->bulkOut, (void *)data, len); +#else + /* Attempt to work around crashes in the USB driver that may be caused + * by trying to write too much data at once. The kernel IOCopyMapper + * panics if a single iovmAlloc needs more than half of its mapper pages. + */ + const int maxLenToSend = 1048576; // 1 MiB + int lenRemaining = len; + result = 0; + while (lenRemaining > 0) { + int lenToSend = lenRemaining > maxLenToSend + ? maxLenToSend : lenRemaining; + + result = (*h->interface)->WritePipe( + h->interface, h->bulkOut, (void *)data, lenToSend); + if (result != 0) break; + + lenRemaining -= lenToSend; + data = (const char*)data + lenToSend; + } +#endif #if 0 if ((result == 0) && (h->zero_mask)) { |
