summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/usb.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/usb.c b/src/usb.c
index 88d781d..df05b9d 100644
--- a/src/usb.c
+++ b/src/usb.c
@@ -61,7 +61,6 @@ struct usb_device {
61 int wMaxPacketSize; 61 int wMaxPacketSize;
62 uint64_t speed; 62 uint64_t speed;
63 struct libusb_device_descriptor devdesc; 63 struct libusb_device_descriptor devdesc;
64 unsigned char transfer_buffer[1024 + LIBUSB_CONTROL_SETUP_SIZE];
65}; 64};
66 65
67static struct collection device_list; 66static struct collection device_list;
@@ -321,6 +320,8 @@ static void get_langid_callback(struct libusb_transfer *transfer)
321 int res; 320 int res;
322 struct usb_device *usbdev = transfer->user_data; 321 struct usb_device *usbdev = transfer->user_data;
323 322
323 transfer->flags |= LIBUSB_TRANSFER_FREE_BUFFER;
324
324 if(transfer->status != LIBUSB_TRANSFER_COMPLETED) { 325 if(transfer->status != LIBUSB_TRANSFER_COMPLETED) {
325 usbmuxd_log(LL_ERROR, "Failed to request lang ID for device %d-%d (%i)", usbdev->bus, 326 usbmuxd_log(LL_ERROR, "Failed to request lang ID for device %d-%d (%i)", usbdev->bus,
326 usbdev->address, transfer->status); 327 usbdev->address, transfer->status);
@@ -333,10 +334,10 @@ static void get_langid_callback(struct libusb_transfer *transfer)
333 usbmuxd_log(LL_INFO, "Got lang ID %u for device %d-%d", langid, usbdev->bus, usbdev->address); 334 usbmuxd_log(LL_INFO, "Got lang ID %u for device %d-%d", langid, usbdev->bus, usbdev->address);
334 335
335 /* re-use the same transfer */ 336 /* re-use the same transfer */
336 libusb_fill_control_setup(usbdev->transfer_buffer, LIBUSB_ENDPOINT_IN, LIBUSB_REQUEST_GET_DESCRIPTOR, 337 libusb_fill_control_setup(transfer->buffer, LIBUSB_ENDPOINT_IN, LIBUSB_REQUEST_GET_DESCRIPTOR,
337 (uint16_t)((LIBUSB_DT_STRING << 8) | usbdev->devdesc.iSerialNumber), 338 (uint16_t)((LIBUSB_DT_STRING << 8) | usbdev->devdesc.iSerialNumber),
338 langid, sizeof(usbdev->transfer_buffer)); 339 langid, 1024 + LIBUSB_CONTROL_SETUP_SIZE);
339 libusb_fill_control_transfer(transfer, usbdev->dev, usbdev->transfer_buffer, get_serial_callback, usbdev, 1000); 340 libusb_fill_control_transfer(transfer, usbdev->dev, transfer->buffer, get_serial_callback, usbdev, 1000);
340 341
341 if((res = libusb_submit_transfer(transfer)) < 0) { 342 if((res = libusb_submit_transfer(transfer)) < 0) {
342 usbmuxd_log(LL_ERROR, "Could not request transfer for device %d-%d (%d)", usbdev->bus, usbdev->address, res); 343 usbmuxd_log(LL_ERROR, "Could not request transfer for device %d-%d (%d)", usbdev->bus, usbdev->address, res);
@@ -482,6 +483,16 @@ static int usb_device_add(libusb_device* dev)
482 return -1; 483 return -1;
483 } 484 }
484 485
486 unsigned char *transfer_buffer = malloc(1024 + LIBUSB_CONTROL_SETUP_SIZE + 8);
487usbmuxd_log(LL_INFO, "%p", transfer_buffer);
488 if (!transfer_buffer) {
489 usbmuxd_log(LL_WARNING, "Failed to allocate transfer buffer for device %d-%d: %d", bus, address, res);
490 libusb_close(handle);
491 free(usbdev);
492 return -1;
493 }
494 memset(transfer_buffer, '\0', 1024 + LIBUSB_CONTROL_SETUP_SIZE + 8);
495
485 usbdev->serial[0] = 0; 496 usbdev->serial[0] = 0;
486 usbdev->bus = bus; 497 usbdev->bus = bus;
487 usbdev->address = address; 498 usbdev->address = address;
@@ -522,13 +533,14 @@ static int usb_device_add(libusb_device* dev)
522 * descriptor that contains all the language IDs supported by the 533 * descriptor that contains all the language IDs supported by the
523 * device. 534 * device.
524 **/ 535 **/
525 libusb_fill_control_setup(usbdev->transfer_buffer, LIBUSB_ENDPOINT_IN, LIBUSB_REQUEST_GET_DESCRIPTOR, LIBUSB_DT_STRING << 8, 0, sizeof(usbdev->transfer_buffer)); 536 libusb_fill_control_setup(transfer_buffer, LIBUSB_ENDPOINT_IN, LIBUSB_REQUEST_GET_DESCRIPTOR, LIBUSB_DT_STRING << 8, 0, 1024 + LIBUSB_CONTROL_SETUP_SIZE);
526 libusb_fill_control_transfer(transfer, handle, usbdev->transfer_buffer, get_langid_callback, usbdev, 1000); 537 libusb_fill_control_transfer(transfer, handle, transfer_buffer, get_langid_callback, usbdev, 1000);
527 538
528 if((res = libusb_submit_transfer(transfer)) < 0) { 539 if((res = libusb_submit_transfer(transfer)) < 0) {
529 usbmuxd_log(LL_ERROR, "Could not request transfer for device %d-%d (%d)", usbdev->bus, usbdev->address, res); 540 usbmuxd_log(LL_ERROR, "Could not request transfer for device %d-%d (%d)", usbdev->bus, usbdev->address, res);
530 libusb_free_transfer(transfer); 541 libusb_free_transfer(transfer);
531 libusb_close(handle); 542 libusb_close(handle);
543 free(transfer_buffer);
532 free(usbdev); 544 free(usbdev);
533 return -1; 545 return -1;
534 } 546 }