diff options
author | 2022-12-23 10:24:46 +0200 | |
---|---|---|
committer | 2022-12-23 10:24:46 +0200 | |
commit | 1eb5a01477da3a29803ce5602c85e9e98e4a4b72 (patch) | |
tree | 5150fbb0821d9115e0522e13362ae6b856b10a41 | |
parent | 0fdad22f14b0da6fe864df3aae1f84d385e95b73 (diff) | |
download | usbmuxd-1eb5a01477da3a29803ce5602c85e9e98e4a4b72.tar.gz usbmuxd-1eb5a01477da3a29803ce5602c85e9e98e4a4b72.tar.bz2 |
Best effort for old devices (potentially not supporting mode switch) to ignore unexpected responses and complete initializations.
-rw-r--r-- | src/usb.c | 35 |
1 files changed, 28 insertions, 7 deletions
@@ -591,28 +591,47 @@ static void device_complete_initialization(struct mode_context *context, struct | |||
591 | 591 | ||
592 | static void switch_mode_cb(struct libusb_transfer* transfer) | 592 | static void switch_mode_cb(struct libusb_transfer* transfer) |
593 | { | 593 | { |
594 | // For old devices not supporting mode swtich, if anything goes wrong - continue in current mode | ||
594 | struct mode_context* context = transfer->user_data; | 595 | struct mode_context* context = transfer->user_data; |
595 | 596 | struct usb_device *dev = find_device(context->bus, context->address); | |
597 | if(!dev) { | ||
598 | usbmuxd_log(LL_WARNING, "Device %d-%d is missing from device list", context->bus, context->address); | ||
599 | } | ||
596 | if(transfer->status != LIBUSB_TRANSFER_COMPLETED) { | 600 | if(transfer->status != LIBUSB_TRANSFER_COMPLETED) { |
597 | usbmuxd_log(LL_ERROR, "Failed to request mode switch for device %i-%i (%i)", context->bus, context->address, transfer->status); | 601 | usbmuxd_log(LL_ERROR, "Failed to request mode switch for device %i-%i (%i). Completing initialization in current mode", |
602 | context->bus, context->address, transfer->status); | ||
603 | device_complete_initialization(context, transfer->dev_handle); | ||
598 | } | 604 | } |
599 | else { | 605 | else { |
600 | unsigned char *data = libusb_control_transfer_get_data(transfer); | 606 | unsigned char *data = libusb_control_transfer_get_data(transfer); |
601 | usbmuxd_log(LL_INFO, "Received response %i for switch mode %i for device %i-%i", data[0], context->wIndex, context->bus, context->address); | 607 | if(data[0] != 0) { |
608 | usbmuxd_log(LL_INFO, "Received unexpected response for device %i-%i mode switch (%i). Completing initialization in current mode", | ||
609 | context->bus, context->address, data[0]); | ||
610 | device_complete_initialization(context, transfer->dev_handle); | ||
611 | } | ||
602 | } | 612 | } |
603 | free(transfer->user_data); | 613 | free(context); |
604 | if(transfer->buffer) | 614 | if(transfer->buffer) |
605 | free(transfer->buffer); | 615 | free(transfer->buffer); |
606 | } | 616 | } |
607 | 617 | ||
608 | static void get_mode_cb(struct libusb_transfer* transfer) | 618 | static void get_mode_cb(struct libusb_transfer* transfer) |
609 | { | 619 | { |
610 | struct mode_context* context = transfer->user_data; | 620 | // For old devices not supporting mode swtich, if anything goes wrong - continue in current mode |
611 | int res; | 621 | int res; |
622 | struct mode_context* context = transfer->user_data; | ||
623 | struct usb_device *dev = find_device(context->bus, context->address); | ||
624 | if(!dev) { | ||
625 | usbmuxd_log(LL_ERROR, "Device %d-%d is missing from device list, aborting mode switch", context->bus, context->address); | ||
626 | free(context); | ||
627 | return; | ||
628 | } | ||
612 | 629 | ||
613 | if(transfer->status != LIBUSB_TRANSFER_COMPLETED) { | 630 | if(transfer->status != LIBUSB_TRANSFER_COMPLETED) { |
614 | usbmuxd_log(LL_ERROR, "Failed to request get mode for device %i-%i (%i)", context->bus, context->address, transfer->status); | 631 | usbmuxd_log(LL_ERROR, "Failed to request get mode for device %i-%i (%i). Completing initialization in current mode", |
632 | context->bus, context->address, transfer->status); | ||
615 | free(context); | 633 | free(context); |
634 | device_complete_initialization(context, transfer->dev_handle); | ||
616 | return; | 635 | return; |
617 | } | 636 | } |
618 | 637 | ||
@@ -641,10 +660,12 @@ static void get_mode_cb(struct libusb_transfer* transfer) | |||
641 | 660 | ||
642 | if((res = submit_vendor_specific(transfer->dev_handle, context, switch_mode_cb)) != 0) { | 661 | if((res = submit_vendor_specific(transfer->dev_handle, context, switch_mode_cb)) != 0) { |
643 | usbmuxd_log(LL_WARNING, "Could not request to switch mode %i for device %i-%i (%i)", context->wIndex, context->bus, context->address, res); | 662 | usbmuxd_log(LL_WARNING, "Could not request to switch mode %i for device %i-%i (%i)", context->wIndex, context->bus, context->address, res); |
663 | dev->alive = 0; | ||
664 | free(context); | ||
644 | } | 665 | } |
645 | } | 666 | } |
646 | else { | 667 | else { |
647 | // in other modes, usually 5:3:3:0 | 668 | // in other modes, usually 5:3:3:0 (but in any other unexpected case as well), complete init: |
648 | usbmuxd_log(LL_WARNING, "Skipping switch device %i-%i mode", context->bus, context->address); | 669 | usbmuxd_log(LL_WARNING, "Skipping switch device %i-%i mode", context->bus, context->address); |
649 | device_complete_initialization(context, transfer->dev_handle); | 670 | device_complete_initialization(context, transfer->dev_handle); |
650 | free(context); | 671 | free(context); |