summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Eliyahu Stern2022-12-23 10:24:46 +0200
committerGravatar Eliyahu Stern2022-12-23 10:24:46 +0200
commit1eb5a01477da3a29803ce5602c85e9e98e4a4b72 (patch)
tree5150fbb0821d9115e0522e13362ae6b856b10a41
parent0fdad22f14b0da6fe864df3aae1f84d385e95b73 (diff)
downloadusbmuxd-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.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/src/usb.c b/src/usb.c
index 2e42e59..b0810a2 100644
--- a/src/usb.c
+++ b/src/usb.c
@@ -591,28 +591,47 @@ static void device_complete_initialization(struct mode_context *context, struct
591 591
592static void switch_mode_cb(struct libusb_transfer* transfer) 592static 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
608static void get_mode_cb(struct libusb_transfer* transfer) 618static 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);