Pull USB / Thunderbolt fixes from Greg KH: "Here are some small bugfixes and new device ids for USB and Thunderbolt drivers for 6.7-rc7. Included in here are: - new usb-serial device ids - thunderbolt driver fixes - typec driver fix - usb-storage driver quirk added - fotg210 driver fix All of these have been in linux-next with no reported issues" * tag 'usb-6.7-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: USB: serial: option: add Quectel EG912Y module support USB: serial: ftdi_sio: update Actisense PIDs constant names usb: fotg210-hcd: delete an incorrect bounds test usb-storage: Add quirk for incorrect WP on Kingston DT Ultimate 3.0 G3 usb: typec: ucsi: fix gpio-based orientation detection net: usb: ax88179_178a: avoid failed operations when device is disconnected USB: serial: option: add Quectel RM500Q R13 firmware support USB: serial: option: add Foxconn T99W265 with new baseline thunderbolt: Fix minimum allocated USB 3.x and PCIe bandwidth thunderbolt: Fix memory leak in margining_port_remove()
Unified · Split
| @@ -173,6 +173,7 @@ struct ax88179_data { · 172 unmodified lines | |||
| 173 | u8 in_pm; | 173 | u8 in_pm; |
| 174 | u32 wol_supported; | 174 | u32 wol_supported; |
| 175 | u32 wolopts; | 175 | u32 wolopts; |
| 176 | u8 disconnecting; | ||
| 176 | }; | 177 | }; |
| 177 | 178 | ||
| 178 | struct ax88179_int_data { | 179 | struct ax88179_int_data { |
| @@ -208,6 +209,7 @@ static int __ax88179_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, · 29 unmodified lines | |||
| 208 | { | 209 | { |
| 209 | int ret; | 210 | int ret; |
| 210 | int (*fn)(struct usbnet *, u8, u8, u16, u16, void *, u16); | 211 | int (*fn)(struct usbnet *, u8, u8, u16, u16, void *, u16); |
| 212 | struct ax88179_data *ax179_data = dev->driver_priv; | ||
| 211 | 213 | ||
| 212 | BUG_ON(!dev); | 214 | BUG_ON(!dev); |
| 213 | 215 | ||
| @@ -219,7 +221,7 @@ static int __ax88179_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, · 5 unmodified lines | |||
| 219 | ret = fn(dev, cmd, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 221 | ret = fn(dev, cmd, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
| 220 | value, index, data, size); | 222 | value, index, data, size); |
| 221 | 223 | ||
| 222 | if (unlikely(ret < 0)) | 224 | if (unlikely((ret < 0) && !(ret == -ENODEV && ax179_data->disconnecting))) |
| 223 | netdev_warn(dev->net, "Failed to read reg index 0x%04x: %d\n", | 225 | netdev_warn(dev->net, "Failed to read reg index 0x%04x: %d\n", |
| 224 | index, ret); | 226 | index, ret); |
| 225 | 227 | ||
| @@ -231,6 +233,7 @@ static int __ax88179_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, · 5 unmodified lines | |||
| 231 | { | 233 | { |
| 232 | int ret; | 234 | int ret; |
| 233 | int (*fn)(struct usbnet *, u8, u8, u16, u16, const void *, u16); | 235 | int (*fn)(struct usbnet *, u8, u8, u16, u16, const void *, u16); |
| 236 | struct ax88179_data *ax179_data = dev->driver_priv; | ||
| 234 | 237 | ||
| 235 | BUG_ON(!dev); | 238 | BUG_ON(!dev); |
| 236 | 239 | ||
| @@ -242,7 +245,7 @@ static int __ax88179_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index, · 5 unmodified lines | |||
| 242 | ret = fn(dev, cmd, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | 245 | ret = fn(dev, cmd, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
| 243 | value, index, data, size); | 246 | value, index, data, size); |
| 244 | 247 | ||
| 245 | if (unlikely(ret < 0)) | 248 | if (unlikely((ret < 0) && !(ret == -ENODEV && ax179_data->disconnecting))) |
| 246 | netdev_warn(dev->net, "Failed to write reg index 0x%04x: %d\n", | 249 | netdev_warn(dev->net, "Failed to write reg index 0x%04x: %d\n", |
| 247 | index, ret); | 250 | index, ret); |
| 248 | 251 | ||
| @@ -492,6 +495,20 @@ static int ax88179_resume(struct usb_interface *intf) · 243 unmodified lines | |||
| 492 | return usbnet_resume(intf); | 495 | return usbnet_resume(intf); |
| 493 | } | 496 | } |
| 494 | 497 | ||
| 498 | static void ax88179_disconnect(struct usb_interface *intf) | ||
| 499 | { | ||
| 500 | struct usbnet *dev = usb_get_intfdata(intf); | ||
| 501 | struct ax88179_data *ax179_data; | ||
| 502 | |||
| 503 | if (!dev) | ||
| 504 | return; | ||
| 505 | |||
| 506 | ax179_data = dev->driver_priv; | ||
| 507 | ax179_data->disconnecting = 1; | ||
| 508 | |||
| 509 | usbnet_disconnect(intf); | ||
| 510 | } | ||
| 511 | |||
| 495 | static void | 512 | static void |
| 496 | ax88179_get_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) | 513 | ax88179_get_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo) |
| 497 | { | 514 | { |
| @@ -1906,7 +1923,7 @@ static struct usb_driver ax88179_178a_driver = { · 1408 unmodified lines | |||
| 1906 | .suspend = ax88179_suspend, | 1923 | .suspend = ax88179_suspend, |
| 1907 | .resume = ax88179_resume, | 1924 | .resume = ax88179_resume, |
| 1908 | .reset_resume = ax88179_resume, | 1925 | .reset_resume = ax88179_resume, |
| 1909 | .disconnect = usbnet_disconnect, | 1926 | .disconnect = ax88179_disconnect, |
| 1910 | .supports_autosuspend = 1, | 1927 | .supports_autosuspend = 1, |
| 1911 | .disable_hub_initiated_lpm = 1, | 1928 | .disable_hub_initiated_lpm = 1, |
| 1912 | }; | 1929 | }; |
| @@ -959,7 +959,7 @@ static void margining_port_remove(struct tb_port *port) · 958 unmodified lines | |||
| 959 | snprintf(dir_name, sizeof(dir_name), "port%d", port->port); | 959 | snprintf(dir_name, sizeof(dir_name), "port%d", port->port); |
| 960 | parent = debugfs_lookup(dir_name, port->sw->debugfs_dir); | 960 | parent = debugfs_lookup(dir_name, port->sw->debugfs_dir); |
| 961 | if (parent) | 961 | if (parent) |
| 962 | debugfs_remove_recursive(debugfs_lookup("margining", parent)); | 962 | debugfs_lookup_and_remove("margining", parent); |
| 963 | 963 | ||
| 964 | kfree(port->usb4->margining); | 964 | kfree(port->usb4->margining); |
| 965 | port->usb4->margining = NULL; | 965 | port->usb4->margining = NULL; |
| @@ -2311,13 +2311,13 @@ int usb4_usb3_port_release_bandwidth(struct tb_port *port, int *upstream_bw, · 2310 unmodified lines | |||
| 2311 | goto err_request; | 2311 | goto err_request; |
| 2312 | 2312 | ||
| 2313 | /* | 2313 | /* |
| 2314 | * Always keep 1000 Mb/s to make sure xHCI has at least some | 2314 | * Always keep 900 Mb/s to make sure xHCI has at least some |
| 2315 | * bandwidth available for isochronous traffic. | 2315 | * bandwidth available for isochronous traffic. |
| 2316 | */ | 2316 | */ |
| 2317 | if (consumed_up < 1000) | 2317 | if (consumed_up < 900) |
| 2318 | consumed_up = 1000; | 2318 | consumed_up = 900; |
| 2319 | if (consumed_down < 1000) | 2319 | if (consumed_down < 900) |
| 2320 | consumed_down = 1000; | 2320 | consumed_down = 900; |
| 2321 | 2321 | ||
| 2322 | ret = usb4_usb3_port_write_allocated_bandwidth(port, consumed_up, | 2322 | ret = usb4_usb3_port_write_allocated_bandwidth(port, consumed_up, |
| 2323 | consumed_down); | 2323 | consumed_down); |
| @@ -428,8 +428,6 @@ static void qh_lines(struct fotg210_hcd *fotg210, struct fotg210_qh *qh, · 427 unmodified lines | |||
| 428 | temp = size; | 428 | temp = size; |
| 429 | size -= temp; | 429 | size -= temp; |
| 430 | next += temp; | 430 | next += temp; |
| 431 | if (temp == size) | ||
| 432 | goto done; | ||
| 433 | } | 431 | } |
| 434 | 432 | ||
| 435 | temp = snprintf(next, size, "\n"); | 433 | temp = snprintf(next, size, "\n"); |
| @@ -439,7 +437,6 @@ static void qh_lines(struct fotg210_hcd *fotg210, struct fotg210_qh *qh, · 3 unmodified lines | |||
| 439 | size -= temp; | 437 | size -= temp; |
| 440 | next += temp; | 438 | next += temp; |
| 441 | 439 | ||
| 442 | done: | ||
| 443 | *sizep = size; | 440 | *sizep = size; |
| 444 | *nextp = next; | 441 | *nextp = next; |
| 445 | } | 442 | } |
| @@ -1033,9 +1033,9 @@ static const struct usb_device_id id_table_combined[] = { · 1032 unmodified lines | |||
| 1033 | { USB_DEVICE(FTDI_VID, ACTISENSE_USG_PID) }, | 1033 | { USB_DEVICE(FTDI_VID, ACTISENSE_USG_PID) }, |
| 1034 | { USB_DEVICE(FTDI_VID, ACTISENSE_NGT_PID) }, | 1034 | { USB_DEVICE(FTDI_VID, ACTISENSE_NGT_PID) }, |
| 1035 | { USB_DEVICE(FTDI_VID, ACTISENSE_NGW_PID) }, | 1035 | { USB_DEVICE(FTDI_VID, ACTISENSE_NGW_PID) }, |
| 1036 | { USB_DEVICE(FTDI_VID, ACTISENSE_D9AC_PID) }, | 1036 | { USB_DEVICE(FTDI_VID, ACTISENSE_UID_PID) }, |
| 1037 | { USB_DEVICE(FTDI_VID, ACTISENSE_D9AD_PID) }, | 1037 | { USB_DEVICE(FTDI_VID, ACTISENSE_USA_PID) }, |
| 1038 | { USB_DEVICE(FTDI_VID, ACTISENSE_D9AE_PID) }, | 1038 | { USB_DEVICE(FTDI_VID, ACTISENSE_NGX_PID) }, |
| 1039 | { USB_DEVICE(FTDI_VID, ACTISENSE_D9AF_PID) }, | 1039 | { USB_DEVICE(FTDI_VID, ACTISENSE_D9AF_PID) }, |
| 1040 | { USB_DEVICE(FTDI_VID, CHETCO_SEAGAUGE_PID) }, | 1040 | { USB_DEVICE(FTDI_VID, CHETCO_SEAGAUGE_PID) }, |
| 1041 | { USB_DEVICE(FTDI_VID, CHETCO_SEASWITCH_PID) }, | 1041 | { USB_DEVICE(FTDI_VID, CHETCO_SEASWITCH_PID) }, |
| @@ -1568,9 +1568,9 @@ · 1567 unmodified lines | |||
| 1568 | #define ACTISENSE_USG_PID 0xD9A9 /* USG USB Serial Adapter */ | 1568 | #define ACTISENSE_USG_PID 0xD9A9 /* USG USB Serial Adapter */ |
| 1569 | #define ACTISENSE_NGT_PID 0xD9AA /* NGT NMEA2000 Interface */ | 1569 | #define ACTISENSE_NGT_PID 0xD9AA /* NGT NMEA2000 Interface */ |
| 1570 | #define ACTISENSE_NGW_PID 0xD9AB /* NGW NMEA2000 Gateway */ | 1570 | #define ACTISENSE_NGW_PID 0xD9AB /* NGW NMEA2000 Gateway */ |
| 1571 | #define ACTISENSE_D9AC_PID 0xD9AC /* Actisense Reserved */ | 1571 | #define ACTISENSE_UID_PID 0xD9AC /* USB Isolating Device */ |
| 1572 | #define ACTISENSE_D9AD_PID 0xD9AD /* Actisense Reserved */ | 1572 | #define ACTISENSE_USA_PID 0xD9AD /* USB to Serial Adapter */ |
| 1573 | #define ACTISENSE_D9AE_PID 0xD9AE /* Actisense Reserved */ | 1573 | #define ACTISENSE_NGX_PID 0xD9AE /* NGX NMEA2000 Gateway */ |
| 1574 | #define ACTISENSE_D9AF_PID 0xD9AF /* Actisense Reserved */ | 1574 | #define ACTISENSE_D9AF_PID 0xD9AF /* Actisense Reserved */ |
| 1575 | #define CHETCO_SEAGAUGE_PID 0xA548 /* SeaGauge USB Adapter */ | 1575 | #define CHETCO_SEAGAUGE_PID 0xA548 /* SeaGauge USB Adapter */ |
| 1576 | #define CHETCO_SEASWITCH_PID 0xA549 /* SeaSwitch USB Adapter */ | 1576 | #define CHETCO_SEASWITCH_PID 0xA549 /* SeaSwitch USB Adapter */ |
| @@ -272,6 +272,7 @@ static void option_instat_callback(struct urb *urb); · 271 unmodified lines | |||
| 272 | #define QUECTEL_PRODUCT_RM500Q 0x0800 | 272 | #define QUECTEL_PRODUCT_RM500Q 0x0800 |
| 273 | #define QUECTEL_PRODUCT_RM520N 0x0801 | 273 | #define QUECTEL_PRODUCT_RM520N 0x0801 |
| 274 | #define QUECTEL_PRODUCT_EC200U 0x0901 | 274 | #define QUECTEL_PRODUCT_EC200U 0x0901 |
| 275 | #define QUECTEL_PRODUCT_EG912Y 0x6001 | ||
| 275 | #define QUECTEL_PRODUCT_EC200S_CN 0x6002 | 276 | #define QUECTEL_PRODUCT_EC200S_CN 0x6002 |
| 276 | #define QUECTEL_PRODUCT_EC200A 0x6005 | 277 | #define QUECTEL_PRODUCT_EC200A 0x6005 |
| 277 | #define QUECTEL_PRODUCT_EM061K_LWW 0x6008 | 278 | #define QUECTEL_PRODUCT_EM061K_LWW 0x6008 |
| @@ -1232,6 +1233,7 @@ static const struct usb_device_id option_ids[] = { · 954 unmodified lines | |||
| 1232 | { USB_DEVICE_INTERFACE_CLASS(QUECTEL_VENDOR_ID, 0x0700, 0xff), /* BG95 */ | 1233 | { USB_DEVICE_INTERFACE_CLASS(QUECTEL_VENDOR_ID, 0x0700, 0xff), /* BG95 */ |
| 1233 | .driver_info = RSVD(3) | ZLP }, | 1234 | .driver_info = RSVD(3) | ZLP }, |
| 1234 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x30) }, | 1235 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x30) }, |
| 1236 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0, 0x40) }, | ||
| 1235 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0, 0) }, | 1237 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0, 0) }, |
| 1236 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x10), | 1238 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x10), |
| 1237 | .driver_info = ZLP }, | 1239 | .driver_info = ZLP }, |
| @@ -1244,6 +1246,7 @@ static const struct usb_device_id option_ids[] = { · 6 unmodified lines | |||
| 1244 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200U, 0xff, 0, 0) }, | 1246 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200U, 0xff, 0, 0) }, |
| 1245 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200S_CN, 0xff, 0, 0) }, | 1247 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200S_CN, 0xff, 0, 0) }, |
| 1246 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200T, 0xff, 0, 0) }, | 1248 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200T, 0xff, 0, 0) }, |
| 1249 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG912Y, 0xff, 0, 0) }, | ||
| 1247 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500K, 0xff, 0x00, 0x00) }, | 1250 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500K, 0xff, 0x00, 0x00) }, |
| 1248 | 1251 | ||
| 1249 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, | 1252 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, |
| @@ -2242,6 +2245,8 @@ static const struct usb_device_id option_ids[] = { · 992 unmodified lines | |||
| 2242 | .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, | 2245 | .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, |
| 2243 | { USB_DEVICE(0x0489, 0xe0b5), /* Foxconn T77W968 ESIM */ | 2246 | { USB_DEVICE(0x0489, 0xe0b5), /* Foxconn T77W968 ESIM */ |
| 2244 | .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, | 2247 | .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, |
| 2248 | { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0da, 0xff), /* Foxconn T99W265 MBIM variant */ | ||
| 2249 | .driver_info = RSVD(3) | RSVD(5) }, | ||
| 2245 | { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0db, 0xff), /* Foxconn T99W265 MBIM */ | 2250 | { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0db, 0xff), /* Foxconn T99W265 MBIM */ |
| 2246 | .driver_info = RSVD(3) }, | 2251 | .driver_info = RSVD(3) }, |
| 2247 | { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0ee, 0xff), /* Foxconn T99W368 MBIM */ | 2252 | { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0ee, 0xff), /* Foxconn T99W368 MBIM */ |
| @@ -1305,6 +1305,17 @@ UNUSUAL_DEV( 0x090c, 0x6000, 0x0100, 0x0100, · 1304 unmodified lines | |||
| 1305 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 1305 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
| 1306 | US_FL_INITIAL_READ10 ), | 1306 | US_FL_INITIAL_READ10 ), |
| 1307 | 1307 | ||
| 1308 | /* | ||
| 1309 | * Patch by Tasos Sahanidis <tasos@tasossah.com> | ||
| 1310 | * This flash drive always shows up with write protect enabled | ||
| 1311 | * during the first mode sense. | ||
| 1312 | */ | ||
| 1313 | UNUSUAL_DEV(0x0951, 0x1697, 0x0100, 0x0100, | ||
| 1314 | "Kingston", | ||
| 1315 | "DT Ultimate G3", | ||
| 1316 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
| 1317 | US_FL_NO_WP_DETECT), | ||
| 1318 | |||
| 1308 | /* | 1319 | /* |
| 1309 | * This Pentax still camera is not conformant | 1320 | * This Pentax still camera is not conformant |
| 1310 | * to the USB storage specification: - | 1321 | * to the USB storage specification: - |
| @@ -228,7 +228,7 @@ static void pmic_glink_ucsi_notify(struct work_struct *work) · 227 unmodified lines | |||
| 228 | 228 | ||
| 229 | con_num = UCSI_CCI_CONNECTOR(cci); | 229 | con_num = UCSI_CCI_CONNECTOR(cci); |
| 230 | if (con_num) { | 230 | if (con_num) { |
| 231 | if (con_num < PMIC_GLINK_MAX_PORTS && | 231 | if (con_num <= PMIC_GLINK_MAX_PORTS && |
| 232 | ucsi->port_orientation[con_num - 1]) { | 232 | ucsi->port_orientation[con_num - 1]) { |
| 233 | int orientation = gpiod_get_value(ucsi->port_orientation[con_num - 1]); | 233 | int orientation = gpiod_get_value(ucsi->port_orientation[con_num - 1]); |
| 234 | 234 | ||