aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/class/cdc-acm.c14
-rw-r--r--drivers/usb/class/cdc-acm.h1
-rw-r--r--drivers/usb/core/hub.c8
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
5501re_enumerate: 5503re_enumerate: