Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'usb-4.5-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb

Pull USB driver fixes from Greg KH:
"Here are some small USB fixes and new device ids for 4.5-rc2. Nothing
major here, full details are in the shortlog, and all of these have
been in linux-next successfully"

* tag 'usb-4.5-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb:
USB: option: fix Cinterion AHxx enumeration
USB: mxu11x0: fix memory leak on usb_serial private data
USB: serial: ftdi_sio: add support for Yaesu SCU-18 cable
USB: serial: option: Adding support for Telit LE922
USB: serial: visor: fix crash on detecting device without write_urbs
USB: visor: fix null-deref at probe
USB: cp210x: add ID for IAI USB to RS485 adaptor
usb: hub: do not clear BOS field during reset device
cdc-acm:exclude Samsung phone 04e8:685d
usb: cdc-acm: send zero packet for intel 7260 modem
usb: cdc-acm: handle unlinked urb in acm read callback

+68 -7
+13 -1
drivers/usb/class/cdc-acm.c
··· 428 428 set_bit(rb->index, &acm->read_urbs_free); 429 429 dev_dbg(&acm->data->dev, "%s - non-zero urb status: %d\n", 430 430 __func__, status); 431 - return; 431 + if ((status != -ENOENT) || (urb->actual_length == 0)) 432 + return; 432 433 } 433 434 434 435 usb_mark_last_busy(acm->dev); ··· 1405 1404 usb_sndbulkpipe(usb_dev, epwrite->bEndpointAddress), 1406 1405 NULL, acm->writesize, acm_write_bulk, snd); 1407 1406 snd->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 1407 + if (quirks & SEND_ZERO_PACKET) 1408 + snd->urb->transfer_flags |= URB_ZERO_PACKET; 1408 1409 snd->instance = acm; 1409 1410 } 1410 1411 ··· 1841 1838 }, 1842 1839 #endif 1843 1840 1841 + /*Samsung phone in firmware update mode */ 1842 + { USB_DEVICE(0x04e8, 0x685d), 1843 + .driver_info = IGNORE_DEVICE, 1844 + }, 1845 + 1844 1846 /* Exclude Infineon Flash Loader utility */ 1845 1847 { USB_DEVICE(0x058b, 0x0041), 1846 1848 .driver_info = IGNORE_DEVICE, ··· 1868 1860 USB_CDC_ACM_PROTO_AT_3G) }, 1869 1861 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, 1870 1862 USB_CDC_ACM_PROTO_AT_CDMA) }, 1863 + 1864 + { USB_DEVICE(0x1519, 0x0452), /* Intel 7260 modem */ 1865 + .driver_info = SEND_ZERO_PACKET, 1866 + }, 1871 1867 1872 1868 { } 1873 1869 };
+1
drivers/usb/class/cdc-acm.h
··· 134 134 #define IGNORE_DEVICE BIT(5) 135 135 #define QUIRK_CONTROL_LINE_STATE BIT(6) 136 136 #define CLEAR_HALT_CONDITIONS BIT(7) 137 + #define SEND_ZERO_PACKET BIT(8)
+5 -3
drivers/usb/core/hub.c
··· 5401 5401 } 5402 5402 5403 5403 bos = udev->bos; 5404 - udev->bos = NULL; 5405 5404 5406 5405 for (i = 0; i < SET_CONFIG_TRIES; ++i) { 5407 5406 ··· 5493 5494 usb_set_usb2_hardware_lpm(udev, 1); 5494 5495 usb_unlocked_enable_lpm(udev); 5495 5496 usb_enable_ltm(udev); 5496 - usb_release_bos_descriptor(udev); 5497 - udev->bos = bos; 5497 + /* release the new BOS descriptor allocated by hub_port_init() */ 5498 + if (udev->bos != bos) { 5499 + usb_release_bos_descriptor(udev); 5500 + udev->bos = bos; 5501 + } 5498 5502 return 0; 5499 5503 5500 5504 re_enumerate:
+1
drivers/usb/serial/cp210x.c
··· 99 99 { USB_DEVICE(0x10C4, 0x81AC) }, /* MSD Dash Hawk */ 100 100 { USB_DEVICE(0x10C4, 0x81AD) }, /* INSYS USB Modem */ 101 101 { USB_DEVICE(0x10C4, 0x81C8) }, /* Lipowsky Industrie Elektronik GmbH, Baby-JTAG */ 102 + { USB_DEVICE(0x10C4, 0x81D7) }, /* IAI Corp. RCB-CV-USB USB to RS485 Adaptor */ 102 103 { USB_DEVICE(0x10C4, 0x81E2) }, /* Lipowsky Industrie Elektronik GmbH, Baby-LIN */ 103 104 { USB_DEVICE(0x10C4, 0x81E7) }, /* Aerocomm Radio */ 104 105 { USB_DEVICE(0x10C4, 0x81E8) }, /* Zephyr Bioharness */
+1
drivers/usb/serial/ftdi_sio.c
··· 824 824 { USB_DEVICE(FTDI_VID, FTDI_TURTELIZER_PID), 825 825 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, 826 826 { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_USB60F) }, 827 + { USB_DEVICE(RATOC_VENDOR_ID, RATOC_PRODUCT_ID_SCU18) }, 827 828 { USB_DEVICE(FTDI_VID, FTDI_REU_TINY_PID) }, 828 829 829 830 /* Papouch devices based on FTDI chip */
+1
drivers/usb/serial/ftdi_sio_ids.h
··· 615 615 */ 616 616 #define RATOC_VENDOR_ID 0x0584 617 617 #define RATOC_PRODUCT_ID_USB60F 0xb020 618 + #define RATOC_PRODUCT_ID_SCU18 0xb03a 618 619 619 620 /* 620 621 * Infineon Technologies
+20
drivers/usb/serial/mxu11x0.c
··· 368 368 return 0; 369 369 } 370 370 371 + static int mxu1_port_remove(struct usb_serial_port *port) 372 + { 373 + struct mxu1_port *mxport; 374 + 375 + mxport = usb_get_serial_port_data(port); 376 + kfree(mxport); 377 + 378 + return 0; 379 + } 380 + 371 381 static int mxu1_startup(struct usb_serial *serial) 372 382 { 373 383 struct mxu1_device *mxdev; ··· 435 425 kfree(mxdev); 436 426 437 427 return err; 428 + } 429 + 430 + static void mxu1_release(struct usb_serial *serial) 431 + { 432 + struct mxu1_device *mxdev; 433 + 434 + mxdev = usb_get_serial_data(serial); 435 + kfree(mxdev); 438 436 } 439 437 440 438 static int mxu1_write_byte(struct usb_serial_port *port, u32 addr, ··· 975 957 .id_table = mxu1_idtable, 976 958 .num_ports = 1, 977 959 .port_probe = mxu1_port_probe, 960 + .port_remove = mxu1_port_remove, 978 961 .attach = mxu1_startup, 962 + .release = mxu1_release, 979 963 .open = mxu1_open, 980 964 .close = mxu1_close, 981 965 .ioctl = mxu1_ioctl,
+17 -1
drivers/usb/serial/option.c
··· 268 268 #define TELIT_PRODUCT_CC864_SINGLE 0x1006 269 269 #define TELIT_PRODUCT_DE910_DUAL 0x1010 270 270 #define TELIT_PRODUCT_UE910_V2 0x1012 271 + #define TELIT_PRODUCT_LE922_USBCFG0 0x1042 272 + #define TELIT_PRODUCT_LE922_USBCFG3 0x1043 271 273 #define TELIT_PRODUCT_LE920 0x1200 272 274 #define TELIT_PRODUCT_LE910 0x1201 273 275 ··· 615 613 static const struct option_blacklist_info telit_le920_blacklist = { 616 614 .sendsetup = BIT(0), 617 615 .reserved = BIT(1) | BIT(5), 616 + }; 617 + 618 + static const struct option_blacklist_info telit_le922_blacklist_usbcfg0 = { 619 + .sendsetup = BIT(2), 620 + .reserved = BIT(0) | BIT(1) | BIT(3), 621 + }; 622 + 623 + static const struct option_blacklist_info telit_le922_blacklist_usbcfg3 = { 624 + .sendsetup = BIT(0), 625 + .reserved = BIT(1) | BIT(2) | BIT(3), 618 626 }; 619 627 620 628 static const struct usb_device_id option_ids[] = { ··· 1172 1160 { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_CC864_SINGLE) }, 1173 1161 { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_DE910_DUAL) }, 1174 1162 { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UE910_V2) }, 1163 + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE922_USBCFG0), 1164 + .driver_info = (kernel_ulong_t)&telit_le922_blacklist_usbcfg0 }, 1165 + { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE922_USBCFG3), 1166 + .driver_info = (kernel_ulong_t)&telit_le922_blacklist_usbcfg3 }, 1175 1167 { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910), 1176 1168 .driver_info = (kernel_ulong_t)&telit_le910_blacklist }, 1177 1169 { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE920), ··· 1695 1679 { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_EU3_P) }, 1696 1680 { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PH8), 1697 1681 .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, 1698 - { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_AHXX) }, 1682 + { USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, CINTERION_PRODUCT_AHXX, 0xff) }, 1699 1683 { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_PLXX), 1700 1684 .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, 1701 1685 { USB_DEVICE(CINTERION_VENDOR_ID, CINTERION_PRODUCT_HC28_MDM) },
+9 -2
drivers/usb/serial/visor.c
··· 544 544 (serial->num_interrupt_in == 0)) 545 545 return 0; 546 546 547 + if (serial->num_bulk_in < 2 || serial->num_interrupt_in < 2) { 548 + dev_err(&serial->interface->dev, "missing endpoints\n"); 549 + return -ENODEV; 550 + } 551 + 547 552 /* 548 553 * It appears that Treos and Kyoceras want to use the 549 554 * 1st bulk in endpoint to communicate with the 2nd bulk out endpoint, ··· 602 597 */ 603 598 604 599 /* some sanity check */ 605 - if (serial->num_ports < 2) 606 - return -1; 600 + if (serial->num_bulk_out < 2) { 601 + dev_err(&serial->interface->dev, "missing bulk out endpoints\n"); 602 + return -ENODEV; 603 + } 607 604 608 605 /* port 0 now uses the modified endpoint Address */ 609 606 port = serial->port[0];