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

Configure Feed

Select the types of activity you want to include in your feed.

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

Pull USB fixes from Greg KH:
"Here are a handful of USB driver fixes for 4.14-rc5.

There is the "usual" usb-serial fixes and device ids, USB gadget
fixes, and some more fixes found by the fuzz testing that is happening
on the USB layer right now.

All of these have been in my tree this week with no reported issues"

* tag 'usb-4.14-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb:
usb: usbtest: fix NULL pointer dereference
usb: gadget: configfs: Fix memory leak of interface directory data
usb: gadget: composite: Fix use-after-free in usb_composite_overwrite_options
usb: misc: usbtest: Fix overflow in usbtest_do_ioctl()
usb: renesas_usbhs: Fix DMAC sequence for receiving zero-length packet
USB: dummy-hcd: Fix deadlock caused by disconnect detection
usb: phy: tegra: Fix phy suspend for UDC
USB: serial: console: fix use-after-free after failed setup
USB: serial: console: fix use-after-free on disconnect
USB: serial: qcserial: add Dell DW5818, DW5819
USB: serial: cp210x: add support for ELV TFD500
USB: serial: cp210x: fix partnum regression
USB: serial: option: add support for TP-Link LTE module
USB: serial: ftdi_sio: add id for Cypress WICED dev board

+86 -27
+5
drivers/usb/gadget/composite.c
··· 2026 static void __composite_unbind(struct usb_gadget *gadget, bool unbind_driver) 2027 { 2028 struct usb_composite_dev *cdev = get_gadget_data(gadget); 2029 2030 /* composite_disconnect() must already have been called 2031 * by the underlying peripheral controller driver! ··· 2046 cdev->driver->unbind(cdev); 2047 2048 composite_dev_cleanup(cdev); 2049 2050 kfree(cdev->def_manufacturer); 2051 kfree(cdev);
··· 2026 static void __composite_unbind(struct usb_gadget *gadget, bool unbind_driver) 2027 { 2028 struct usb_composite_dev *cdev = get_gadget_data(gadget); 2029 + struct usb_gadget_strings *gstr = cdev->driver->strings[0]; 2030 + struct usb_string *dev_str = gstr->strings; 2031 2032 /* composite_disconnect() must already have been called 2033 * by the underlying peripheral controller driver! ··· 2044 cdev->driver->unbind(cdev); 2045 2046 composite_dev_cleanup(cdev); 2047 + 2048 + if (dev_str[USB_GADGET_MANUFACTURER_IDX].s == cdev->def_manufacturer) 2049 + dev_str[USB_GADGET_MANUFACTURER_IDX].s = ""; 2050 2051 kfree(cdev->def_manufacturer); 2052 kfree(cdev);
+8 -7
drivers/usb/gadget/configfs.c
··· 1143 NULL 1144 }; 1145 1146 - int usb_os_desc_prepare_interf_dir(struct config_group *parent, 1147 - int n_interf, 1148 - struct usb_os_desc **desc, 1149 - char **names, 1150 - struct module *owner) 1151 { 1152 struct config_group *os_desc_group; 1153 struct config_item_type *os_desc_type, *interface_type; ··· 1160 1161 char *vlabuf = kzalloc(vla_group_size(data_chunk), GFP_KERNEL); 1162 if (!vlabuf) 1163 - return -ENOMEM; 1164 1165 os_desc_group = vla_ptr(vlabuf, data_chunk, os_desc_group); 1166 os_desc_type = vla_ptr(vlabuf, data_chunk, os_desc_type); ··· 1185 configfs_add_default_group(&d->group, os_desc_group); 1186 } 1187 1188 - return 0; 1189 } 1190 EXPORT_SYMBOL(usb_os_desc_prepare_interf_dir); 1191
··· 1143 NULL 1144 }; 1145 1146 + struct config_group *usb_os_desc_prepare_interf_dir( 1147 + struct config_group *parent, 1148 + int n_interf, 1149 + struct usb_os_desc **desc, 1150 + char **names, 1151 + struct module *owner) 1152 { 1153 struct config_group *os_desc_group; 1154 struct config_item_type *os_desc_type, *interface_type; ··· 1159 1160 char *vlabuf = kzalloc(vla_group_size(data_chunk), GFP_KERNEL); 1161 if (!vlabuf) 1162 + return ERR_PTR(-ENOMEM); 1163 1164 os_desc_group = vla_ptr(vlabuf, data_chunk, os_desc_group); 1165 os_desc_type = vla_ptr(vlabuf, data_chunk, os_desc_type); ··· 1184 configfs_add_default_group(&d->group, os_desc_group); 1185 } 1186 1187 + return os_desc_group; 1188 } 1189 EXPORT_SYMBOL(usb_os_desc_prepare_interf_dir); 1190
+6 -5
drivers/usb/gadget/configfs.h
··· 5 6 void unregister_gadget_item(struct config_item *item); 7 8 - int usb_os_desc_prepare_interf_dir(struct config_group *parent, 9 - int n_interf, 10 - struct usb_os_desc **desc, 11 - char **names, 12 - struct module *owner); 13 14 static inline struct usb_os_desc *to_usb_os_desc(struct config_item *item) 15 {
··· 5 6 void unregister_gadget_item(struct config_item *item); 7 8 + struct config_group *usb_os_desc_prepare_interf_dir( 9 + struct config_group *parent, 10 + int n_interf, 11 + struct usb_os_desc **desc, 12 + char **names, 13 + struct module *owner); 14 15 static inline struct usb_os_desc *to_usb_os_desc(struct config_item *item) 16 {
+10 -2
drivers/usb/gadget/function/f_rndis.c
··· 908 free_netdev(opts->net); 909 } 910 911 kfree(opts); 912 } 913 ··· 917 struct f_rndis_opts *opts; 918 struct usb_os_desc *descs[1]; 919 char *names[1]; 920 921 opts = kzalloc(sizeof(*opts), GFP_KERNEL); 922 if (!opts) ··· 942 names[0] = "rndis"; 943 config_group_init_type_name(&opts->func_inst.group, "", 944 &rndis_func_type); 945 - usb_os_desc_prepare_interf_dir(&opts->func_inst.group, 1, descs, 946 - names, THIS_MODULE); 947 948 return &opts->func_inst; 949 }
··· 908 free_netdev(opts->net); 909 } 910 911 + kfree(opts->rndis_interf_group); /* single VLA chunk */ 912 kfree(opts); 913 } 914 ··· 916 struct f_rndis_opts *opts; 917 struct usb_os_desc *descs[1]; 918 char *names[1]; 919 + struct config_group *rndis_interf_group; 920 921 opts = kzalloc(sizeof(*opts), GFP_KERNEL); 922 if (!opts) ··· 940 names[0] = "rndis"; 941 config_group_init_type_name(&opts->func_inst.group, "", 942 &rndis_func_type); 943 + rndis_interf_group = 944 + usb_os_desc_prepare_interf_dir(&opts->func_inst.group, 1, descs, 945 + names, THIS_MODULE); 946 + if (IS_ERR(rndis_interf_group)) { 947 + rndis_free_inst(&opts->func_inst); 948 + return ERR_CAST(rndis_interf_group); 949 + } 950 + opts->rndis_interf_group = rndis_interf_group; 951 952 return &opts->func_inst; 953 }
+1
drivers/usb/gadget/function/u_rndis.h
··· 26 bool bound; 27 bool borrowed_net; 28 29 struct usb_os_desc rndis_os_desc; 30 char rndis_ext_compat_id[16]; 31
··· 26 bool bound; 27 bool borrowed_net; 28 29 + struct config_group *rndis_interf_group; 30 struct usb_os_desc rndis_os_desc; 31 char rndis_ext_compat_id[16]; 32
+6 -3
drivers/usb/gadget/udc/dummy_hcd.c
··· 419 static void set_link_state(struct dummy_hcd *dum_hcd) 420 { 421 struct dummy *dum = dum_hcd->dum; 422 423 dum_hcd->active = 0; 424 if (dum->pullup) ··· 430 return; 431 432 set_link_state_by_speed(dum_hcd); 433 434 if ((dum_hcd->port_status & USB_PORT_STAT_ENABLE) == 0 || 435 dum_hcd->active) 436 dum_hcd->resuming = 0; 437 438 /* Currently !connected or in reset */ 439 - if ((dum_hcd->port_status & USB_PORT_STAT_CONNECTION) == 0 || 440 (dum_hcd->port_status & USB_PORT_STAT_RESET) != 0) { 441 - unsigned disconnect = USB_PORT_STAT_CONNECTION & 442 dum_hcd->old_status & (~dum_hcd->port_status); 443 - unsigned reset = USB_PORT_STAT_RESET & 444 (~dum_hcd->old_status) & dum_hcd->port_status; 445 446 /* Report reset and disconnect events to the driver */
··· 419 static void set_link_state(struct dummy_hcd *dum_hcd) 420 { 421 struct dummy *dum = dum_hcd->dum; 422 + unsigned int power_bit; 423 424 dum_hcd->active = 0; 425 if (dum->pullup) ··· 429 return; 430 431 set_link_state_by_speed(dum_hcd); 432 + power_bit = (dummy_hcd_to_hcd(dum_hcd)->speed == HCD_USB3 ? 433 + USB_SS_PORT_STAT_POWER : USB_PORT_STAT_POWER); 434 435 if ((dum_hcd->port_status & USB_PORT_STAT_ENABLE) == 0 || 436 dum_hcd->active) 437 dum_hcd->resuming = 0; 438 439 /* Currently !connected or in reset */ 440 + if ((dum_hcd->port_status & power_bit) == 0 || 441 (dum_hcd->port_status & USB_PORT_STAT_RESET) != 0) { 442 + unsigned int disconnect = power_bit & 443 dum_hcd->old_status & (~dum_hcd->port_status); 444 + unsigned int reset = USB_PORT_STAT_RESET & 445 (~dum_hcd->old_status) & dum_hcd->port_status; 446 447 /* Report reset and disconnect events to the driver */
+8 -2
drivers/usb/misc/usbtest.c
··· 202 return tmp; 203 } 204 205 - if (in) { 206 dev->in_pipe = usb_rcvbulkpipe(udev, 207 in->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK); 208 dev->out_pipe = usb_sndbulkpipe(udev, 209 out->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK); 210 - } 211 if (iso_in) { 212 dev->iso_in = &iso_in->desc; 213 dev->in_iso_pipe = usb_rcvisocpipe(udev, ··· 1965 int status = 0; 1966 struct urb *urbs[param->sglen]; 1967 1968 memset(&context, 0, sizeof(context)); 1969 context.count = param->iterations * param->sglen; 1970 context.dev = dev; ··· 2090 int retval = -EOPNOTSUPP; 2091 2092 if (param->iterations <= 0) 2093 return -EINVAL; 2094 /* 2095 * Just a bunch of test cases that every HCD is expected to handle.
··· 202 return tmp; 203 } 204 205 + if (in) 206 dev->in_pipe = usb_rcvbulkpipe(udev, 207 in->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK); 208 + if (out) 209 dev->out_pipe = usb_sndbulkpipe(udev, 210 out->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK); 211 + 212 if (iso_in) { 213 dev->iso_in = &iso_in->desc; 214 dev->in_iso_pipe = usb_rcvisocpipe(udev, ··· 1964 int status = 0; 1965 struct urb *urbs[param->sglen]; 1966 1967 + if (!param->sglen || param->iterations > UINT_MAX / param->sglen) 1968 + return -EINVAL; 1969 + 1970 memset(&context, 0, sizeof(context)); 1971 context.count = param->iterations * param->sglen; 1972 context.dev = dev; ··· 2086 int retval = -EOPNOTSUPP; 2087 2088 if (param->iterations <= 0) 2089 + return -EINVAL; 2090 + if (param->sglen > MAX_SGLEN) 2091 return -EINVAL; 2092 /* 2093 * Just a bunch of test cases that every HCD is expected to handle.
+17
drivers/usb/phy/phy-tegra-usb.c
··· 329 unsigned long val; 330 void __iomem *base = phy->regs; 331 332 if (phy->is_legacy_phy) { 333 val = readl(base + USB_SUSP_CTRL); 334 val |= USB_SUSP_SET; ··· 358 { 359 unsigned long val; 360 void __iomem *base = phy->regs; 361 362 if (phy->is_legacy_phy) { 363 val = readl(base + USB_SUSP_CTRL);
··· 329 unsigned long val; 330 void __iomem *base = phy->regs; 331 332 + /* 333 + * The USB driver may have already initiated the phy clock 334 + * disable so wait to see if the clock turns off and if not 335 + * then proceed with gating the clock. 336 + */ 337 + if (utmi_wait_register(base + USB_SUSP_CTRL, USB_PHY_CLK_VALID, 0) == 0) 338 + return; 339 + 340 if (phy->is_legacy_phy) { 341 val = readl(base + USB_SUSP_CTRL); 342 val |= USB_SUSP_SET; ··· 350 { 351 unsigned long val; 352 void __iomem *base = phy->regs; 353 + 354 + /* 355 + * The USB driver may have already initiated the phy clock 356 + * enable so wait to see if the clock turns on and if not 357 + * then proceed with ungating the clock. 358 + */ 359 + if (utmi_wait_register(base + USB_SUSP_CTRL, USB_PHY_CLK_VALID, 360 + USB_PHY_CLK_VALID) == 0) 361 + return; 362 363 if (phy->is_legacy_phy) { 364 val = readl(base + USB_SUSP_CTRL);
+1 -1
drivers/usb/renesas_usbhs/fifo.c
··· 857 fifo->name, usbhs_pipe_number(pipe), pkt->length, pkt->zero); 858 859 usbhs_pipe_running(pipe, 1); 860 - usbhsf_dma_start(pipe, fifo); 861 usbhs_pipe_set_trans_count_if_bulk(pipe, pkt->trans); 862 dma_async_issue_pending(chan); 863 usbhs_pipe_enable(pipe); 864 865 xfer_work_end:
··· 857 fifo->name, usbhs_pipe_number(pipe), pkt->length, pkt->zero); 858 859 usbhs_pipe_running(pipe, 1); 860 usbhs_pipe_set_trans_count_if_bulk(pipe, pkt->trans); 861 dma_async_issue_pending(chan); 862 + usbhsf_dma_start(pipe, fifo); 863 usbhs_pipe_enable(pipe); 864 865 xfer_work_end:
+2 -1
drivers/usb/serial/console.c
··· 186 tty_kref_put(tty); 187 reset_open_count: 188 port->port.count = 0; 189 usb_autopm_put_interface(serial->interface); 190 error_get_interface: 191 usb_serial_put(serial); ··· 266 267 void usb_serial_console_disconnect(struct usb_serial *serial) 268 { 269 - if (serial->port[0] == usbcons_info.port) { 270 usb_serial_console_exit(); 271 usb_serial_put(serial); 272 }
··· 186 tty_kref_put(tty); 187 reset_open_count: 188 port->port.count = 0; 189 + info->port = NULL; 190 usb_autopm_put_interface(serial->interface); 191 error_get_interface: 192 usb_serial_put(serial); ··· 265 266 void usb_serial_console_disconnect(struct usb_serial *serial) 267 { 268 + if (serial->port[0] && serial->port[0] == usbcons_info.port) { 269 usb_serial_console_exit(); 270 usb_serial_put(serial); 271 }
+7 -6
drivers/usb/serial/cp210x.c
··· 177 { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */ 178 { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ 179 { USB_DEVICE(0x18EF, 0xE025) }, /* ELV Marble Sound Board 1 */ 180 { USB_DEVICE(0x1901, 0x0190) }, /* GE B850 CP2105 Recorder interface */ 181 { USB_DEVICE(0x1901, 0x0193) }, /* GE B650 CP2104 PMC interface */ 182 { USB_DEVICE(0x1901, 0x0194) }, /* GE Healthcare Remote Alarm Box */ ··· 353 #define CP210X_PARTNUM_CP2104 0x04 354 #define CP210X_PARTNUM_CP2105 0x05 355 #define CP210X_PARTNUM_CP2108 0x08 356 357 /* CP210X_GET_COMM_STATUS returns these 0x13 bytes */ 358 struct cp210x_comm_status { ··· 1493 result = cp210x_read_vendor_block(serial, REQTYPE_DEVICE_TO_HOST, 1494 CP210X_GET_PARTNUM, &priv->partnum, 1495 sizeof(priv->partnum)); 1496 - if (result < 0) 1497 - goto err_free_priv; 1498 1499 usb_set_serial_data(serial, priv); 1500 ··· 1510 } 1511 1512 return 0; 1513 - err_free_priv: 1514 - kfree(priv); 1515 - 1516 - return result; 1517 } 1518 1519 static void cp210x_disconnect(struct usb_serial *serial)
··· 177 { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */ 178 { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ 179 { USB_DEVICE(0x18EF, 0xE025) }, /* ELV Marble Sound Board 1 */ 180 + { USB_DEVICE(0x18EF, 0xE032) }, /* ELV TFD500 Data Logger */ 181 { USB_DEVICE(0x1901, 0x0190) }, /* GE B850 CP2105 Recorder interface */ 182 { USB_DEVICE(0x1901, 0x0193) }, /* GE B650 CP2104 PMC interface */ 183 { USB_DEVICE(0x1901, 0x0194) }, /* GE Healthcare Remote Alarm Box */ ··· 352 #define CP210X_PARTNUM_CP2104 0x04 353 #define CP210X_PARTNUM_CP2105 0x05 354 #define CP210X_PARTNUM_CP2108 0x08 355 + #define CP210X_PARTNUM_UNKNOWN 0xFF 356 357 /* CP210X_GET_COMM_STATUS returns these 0x13 bytes */ 358 struct cp210x_comm_status { ··· 1491 result = cp210x_read_vendor_block(serial, REQTYPE_DEVICE_TO_HOST, 1492 CP210X_GET_PARTNUM, &priv->partnum, 1493 sizeof(priv->partnum)); 1494 + if (result < 0) { 1495 + dev_warn(&serial->interface->dev, 1496 + "querying part number failed\n"); 1497 + priv->partnum = CP210X_PARTNUM_UNKNOWN; 1498 + } 1499 1500 usb_set_serial_data(serial, priv); 1501 ··· 1505 } 1506 1507 return 0; 1508 } 1509 1510 static void cp210x_disconnect(struct usb_serial *serial)
+2
drivers/usb/serial/ftdi_sio.c
··· 1015 { USB_DEVICE(WICED_VID, WICED_USB20706V2_PID) }, 1016 { USB_DEVICE(TI_VID, TI_CC3200_LAUNCHPAD_PID), 1017 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, 1018 { } /* Terminating entry */ 1019 }; 1020
··· 1015 { USB_DEVICE(WICED_VID, WICED_USB20706V2_PID) }, 1016 { USB_DEVICE(TI_VID, TI_CC3200_LAUNCHPAD_PID), 1017 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, 1018 + { USB_DEVICE(CYPRESS_VID, CYPRESS_WICED_BT_USB_PID) }, 1019 + { USB_DEVICE(CYPRESS_VID, CYPRESS_WICED_WL_USB_PID) }, 1020 { } /* Terminating entry */ 1021 }; 1022
+7
drivers/usb/serial/ftdi_sio_ids.h
··· 610 #define ADI_GNICEPLUS_PID 0xF001 611 612 /* 613 * Microchip Technology, Inc. 614 * 615 * MICROCHIP_VID (0x04D8) and MICROCHIP_USB_BOARD_PID (0x000A) are
··· 610 #define ADI_GNICEPLUS_PID 0xF001 611 612 /* 613 + * Cypress WICED USB UART 614 + */ 615 + #define CYPRESS_VID 0x04B4 616 + #define CYPRESS_WICED_BT_USB_PID 0x009B 617 + #define CYPRESS_WICED_WL_USB_PID 0xF900 618 + 619 + /* 620 * Microchip Technology, Inc. 621 * 622 * MICROCHIP_VID (0x04D8) and MICROCHIP_USB_BOARD_PID (0x000A) are
+2
drivers/usb/serial/option.c
··· 522 523 /* TP-LINK Incorporated products */ 524 #define TPLINK_VENDOR_ID 0x2357 525 #define TPLINK_PRODUCT_MA180 0x0201 526 527 /* Changhong products */ ··· 2012 { USB_DEVICE(CELLIENT_VENDOR_ID, CELLIENT_PRODUCT_MEN200) }, 2013 { USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T_600A) }, 2014 { USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T_600E) }, 2015 { USB_DEVICE(TPLINK_VENDOR_ID, TPLINK_PRODUCT_MA180), 2016 .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, 2017 { USB_DEVICE(TPLINK_VENDOR_ID, 0x9000), /* TP-Link MA260 */
··· 522 523 /* TP-LINK Incorporated products */ 524 #define TPLINK_VENDOR_ID 0x2357 525 + #define TPLINK_PRODUCT_LTE 0x000D 526 #define TPLINK_PRODUCT_MA180 0x0201 527 528 /* Changhong products */ ··· 2011 { USB_DEVICE(CELLIENT_VENDOR_ID, CELLIENT_PRODUCT_MEN200) }, 2012 { USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T_600A) }, 2013 { USB_DEVICE(PETATEL_VENDOR_ID, PETATEL_PRODUCT_NP10T_600E) }, 2014 + { USB_DEVICE_AND_INTERFACE_INFO(TPLINK_VENDOR_ID, TPLINK_PRODUCT_LTE, 0xff, 0x00, 0x00) }, /* TP-Link LTE Module */ 2015 { USB_DEVICE(TPLINK_VENDOR_ID, TPLINK_PRODUCT_MA180), 2016 .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, 2017 { USB_DEVICE(TPLINK_VENDOR_ID, 0x9000), /* TP-Link MA260 */
+4
drivers/usb/serial/qcserial.c
··· 174 {DEVICE_SWI(0x413c, 0x81b3)}, /* Dell Wireless 5809e Gobi(TM) 4G LTE Mobile Broadband Card (rev3) */ 175 {DEVICE_SWI(0x413c, 0x81b5)}, /* Dell Wireless 5811e QDL */ 176 {DEVICE_SWI(0x413c, 0x81b6)}, /* Dell Wireless 5811e QDL */ 177 178 /* Huawei devices */ 179 {DEVICE_HWI(0x03f0, 0x581d)}, /* HP lt4112 LTE/HSPA+ Gobi 4G Modem (Huawei me906e) */
··· 174 {DEVICE_SWI(0x413c, 0x81b3)}, /* Dell Wireless 5809e Gobi(TM) 4G LTE Mobile Broadband Card (rev3) */ 175 {DEVICE_SWI(0x413c, 0x81b5)}, /* Dell Wireless 5811e QDL */ 176 {DEVICE_SWI(0x413c, 0x81b6)}, /* Dell Wireless 5811e QDL */ 177 + {DEVICE_SWI(0x413c, 0x81cf)}, /* Dell Wireless 5819 */ 178 + {DEVICE_SWI(0x413c, 0x81d0)}, /* Dell Wireless 5819 */ 179 + {DEVICE_SWI(0x413c, 0x81d1)}, /* Dell Wireless 5818 */ 180 + {DEVICE_SWI(0x413c, 0x81d2)}, /* Dell Wireless 5818 */ 181 182 /* Huawei devices */ 183 {DEVICE_HWI(0x03f0, 0x581d)}, /* HP lt4112 LTE/HSPA+ Gobi 4G Modem (Huawei me906e) */