diff options
| -rw-r--r-- | src/usb.c | 24 |
1 files changed, 18 insertions, 6 deletions
| @@ -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 | ||
| 67 | static struct collection device_list; | 66 | static 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); | ||
| 487 | usbmuxd_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 | } |
