diff options
Diffstat (limited to 'src')
| -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); |
