diff options
| -rw-r--r-- | drivers/usb/class/cdc-acm.c | 14 | ||||
| -rw-r--r-- | drivers/usb/class/cdc-acm.h | 1 | ||||
| -rw-r--r-- | drivers/usb/core/hub.c | 8 |
3 files changed, 19 insertions, 4 deletions
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 26ca4f910cb0..fa4e23930614 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
| @@ -428,7 +428,8 @@ static void acm_read_bulk_callback(struct urb *urb) | |||
| 428 | set_bit(rb->index, &acm->read_urbs_free); | 428 | set_bit(rb->index, &acm->read_urbs_free); |
| 429 | dev_dbg(&acm->data->dev, "%s - non-zero urb status: %d\n", | 429 | dev_dbg(&acm->data->dev, "%s - non-zero urb status: %d\n", |
| 430 | __func__, status); | 430 | __func__, status); |
| 431 | return; | 431 | if ((status != -ENOENT) || (urb->actual_length == 0)) |
| 432 | return; | ||
| 432 | } | 433 | } |
| 433 | 434 | ||
| 434 | usb_mark_last_busy(acm->dev); | 435 | usb_mark_last_busy(acm->dev); |
| @@ -1404,6 +1405,8 @@ made_compressed_probe: | |||
| 1404 | usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress), | 1405 | usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress), |
| 1405 | NULL, acm->writesize, acm_write_bulk, snd); | 1406 | NULL, acm->writesize, acm_write_bulk, snd); |
| 1406 | snd->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; | 1407 | snd->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
| 1408 | if (quirks & SEND_ZERO_PACKET) | ||
| 1409 | snd->urb->transfer_flags |= URB_ZERO_PACKET; | ||
| 1407 | snd->instance = acm; | 1410 | snd->instance = acm; |
| 1408 | } | 1411 | } |
| 1409 | 1412 | ||
| @@ -1838,6 +1841,11 @@ static const struct usb_device_id acm_ids[] = { | |||
| 1838 | }, | 1841 | }, |
| 1839 | #endif | 1842 | #endif |
| 1840 | 1843 | ||
| 1844 | /*Samsung phone in firmware update mode */ | ||
| 1845 | { USB_DEVICE(0x04e8, 0x685d), | ||
| 1846 | .driver_info = IGNORE_DEVICE, | ||
| 1847 | }, | ||
| 1848 | |||
| 1841 | /* Exclude Infineon Flash Loader utility */ | 1849 | /* Exclude Infineon Flash Loader utility */ |
| 1842 | { USB_DEVICE(0x058b, 0x0041), | 1850 | { USB_DEVICE(0x058b, 0x0041), |
| 1843 | .driver_info = IGNORE_DEVICE, | 1851 | .driver_info = IGNORE_DEVICE, |
| @@ -1861,6 +1869,10 @@ static const struct usb_device_id acm_ids[] = { | |||
| 1861 | { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, | 1869 | { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, |
| 1862 | USB_CDC_ACM_PROTO_AT_CDMA) }, | 1870 | USB_CDC_ACM_PROTO_AT_CDMA) }, |
| 1863 | 1871 | ||
| 1872 | { USB_DEVICE(0x1519, 0x0452), /* Intel 7260 modem */ | ||
| 1873 | .driver_info = SEND_ZERO_PACKET, | ||
| 1874 | }, | ||
| 1875 | |||
| 1864 | { } | 1876 | { } |
| 1865 | }; | 1877 | }; |
| 1866 | 1878 | ||
diff --git a/drivers/usb/class/cdc-acm.h b/drivers/usb/class/cdc-acm.h index dd9af38e7cda..ccfaba9ab4e4 100644 --- a/drivers/usb/class/cdc-acm.h +++ b/drivers/usb/class/cdc-acm.h | |||
| @@ -134,3 +134,4 @@ struct acm { | |||
| 134 | #define IGNORE_DEVICE BIT(5) | 134 | #define IGNORE_DEVICE BIT(5) |
| 135 | #define QUIRK_CONTROL_LINE_STATE BIT(6) | 135 | #define QUIRK_CONTROL_LINE_STATE BIT(6) |
| 136 | #define CLEAR_HALT_CONDITIONS BIT(7) | 136 | #define CLEAR_HALT_CONDITIONS BIT(7) |
| 137 | #define SEND_ZERO_PACKET BIT(8) | ||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 51b436918f78..350dcd9af5d8 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
| @@ -5401,7 +5401,6 @@ static int usb_reset_and_verify_device(struct usb_device *udev) | |||
| 5401 | } | 5401 | } |
| 5402 | 5402 | ||
| 5403 | bos = udev->bos; | 5403 | bos = udev->bos; |
| 5404 | udev->bos = NULL; | ||
| 5405 | 5404 | ||
| 5406 | for (i = 0; i < SET_CONFIG_TRIES; ++i) { | 5405 | for (i = 0; i < SET_CONFIG_TRIES; ++i) { |
| 5407 | 5406 | ||
| @@ -5494,8 +5493,11 @@ done: | |||
| 5494 | usb_set_usb2_hardware_lpm(udev, 1); | 5493 | usb_set_usb2_hardware_lpm(udev, 1); |
| 5495 | usb_unlocked_enable_lpm(udev); | 5494 | usb_unlocked_enable_lpm(udev); |
| 5496 | usb_enable_ltm(udev); | 5495 | usb_enable_ltm(udev); |
| 5497 | usb_release_bos_descriptor(udev); | 5496 | /* release the new BOS descriptor allocated by hub_port_init() */ |
| 5498 | udev->bos = bos; | 5497 | if (udev->bos != bos) { |
| 5498 | usb_release_bos_descriptor(udev); | ||
| 5499 | udev->bos = bos; | ||
| 5500 | } | ||
| 5499 | return 0; | 5501 | return 0; |
| 5500 | 5502 | ||
| 5501 | re_enumerate: | 5503 | re_enumerate: |
