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 | 173 | u8 in_pm; |
| 174 | 174 | u32 wol_supported; |
| 175 | 175 | u32 wolopts; |
| 176 | + u8 disconnecting; | |
| 176 | 177 | }; |
| 177 | 178 | |
| 178 | 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 | 210 | int ret; |
| 210 | 211 | int (*fn)(struct usbnet *, u8, u8, u16, u16, void *, u16); |
| 212 | + struct ax88179_data *ax179_data = dev->driver_priv; | |
| 211 | 213 | |
| 212 | 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 | 221 | ret = fn(dev, cmd, USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
| 220 | 222 | value, index, data, size); |
| 221 | 223 | |
| 222 | − if (unlikely(ret < 0)) | |
| 224 | + if (unlikely((ret < 0) && !(ret == -ENODEV && ax179_data->disconnecting))) | |
| 223 | 225 | netdev_warn(dev->net, "Failed to read reg index 0x%04x: %d\n", |
| 224 | 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 | 234 | int ret; |
| 233 | 235 | int (*fn)(struct usbnet *, u8, u8, u16, u16, const void *, u16); |
| 236 | + struct ax88179_data *ax179_data = dev->driver_priv; | |
| 234 | 237 | |
| 235 | 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 | 245 | ret = fn(dev, cmd, USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, |
| 243 | 246 | value, index, data, size); |
| 244 | 247 | |
| 245 | − if (unlikely(ret < 0)) | |
| 248 | + if (unlikely((ret < 0) && !(ret == -ENODEV && ax179_data->disconnecting))) | |
| 246 | 249 | netdev_warn(dev->net, "Failed to write reg index 0x%04x: %d\n", |
| 247 | 250 | index, ret); |
| 248 | 251 | |
| @@ -492,6 +495,20 @@ static int ax88179_resume(struct usb_interface *intf) · 243 unmodified lines | ||
| 492 | 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 | 512 | static void |
| 496 | 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 | 1923 | .suspend = ax88179_suspend, |
| 1907 | 1924 | .resume = ax88179_resume, |
| 1908 | 1925 | .reset_resume = ax88179_resume, |
| 1909 | − .disconnect = usbnet_disconnect, | |
| 1926 | + .disconnect = ax88179_disconnect, | |
| 1910 | 1927 | .supports_autosuspend = 1, |
| 1911 | 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 | 959 | snprintf(dir_name, sizeof(dir_name), "port%d", port->port); |
| 960 | 960 | parent = debugfs_lookup(dir_name, port->sw->debugfs_dir); |
| 961 | 961 | if (parent) |
| 962 | − debugfs_remove_recursive(debugfs_lookup("margining", parent)); | |
| 962 | + debugfs_lookup_and_remove("margining", parent); | |
| 963 | 963 | |
| 964 | 964 | kfree(port->usb4->margining); |
| 965 | 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 | 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 | 2315 | * bandwidth available for isochronous traffic. |
| 2316 | 2316 | */ |
| 2317 | − if (consumed_up < 1000) | |
| 2318 | − consumed_up = 1000; | |
| 2319 | − if (consumed_down < 1000) | |
| 2320 | − consumed_down = 1000; | |
| 2317 | + if (consumed_up < 900) | |
| 2318 | + consumed_up = 900; | |
| 2319 | + if (consumed_down < 900) | |
| 2320 | + consumed_down = 900; | |
| 2321 | 2321 | |
| 2322 | 2322 | ret = usb4_usb3_port_write_allocated_bandwidth(port, consumed_up, |
| 2323 | 2323 | consumed_down); |
| @@ -428,8 +428,6 @@ static void qh_lines(struct fotg210_hcd *fotg210, struct fotg210_qh *qh, · 427 unmodified lines | ||
| 428 | 428 | temp = size; |
| 429 | 429 | size -= temp; |
| 430 | 430 | next += temp; |
| 431 | − if (temp == size) | |
| 432 | − goto done; | |
| 433 | 431 | } |
| 434 | 432 | |
| 435 | 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 | 437 | size -= temp; |
| 440 | 438 | next += temp; |
| 441 | 439 | |
| 442 | −done: | |
| 443 | 440 | *sizep = size; |
| 444 | 441 | *nextp = next; |
| 445 | 442 | } |
| @@ -1033,9 +1033,9 @@ static const struct usb_device_id id_table_combined[] = { · 1032 unmodified lines | ||
| 1033 | 1033 | { USB_DEVICE(FTDI_VID, ACTISENSE_USG_PID) }, |
| 1034 | 1034 | { USB_DEVICE(FTDI_VID, ACTISENSE_NGT_PID) }, |
| 1035 | 1035 | { USB_DEVICE(FTDI_VID, ACTISENSE_NGW_PID) }, |
| 1036 | − { USB_DEVICE(FTDI_VID, ACTISENSE_D9AC_PID) }, | |
| 1037 | − { USB_DEVICE(FTDI_VID, ACTISENSE_D9AD_PID) }, | |
| 1038 | − { USB_DEVICE(FTDI_VID, ACTISENSE_D9AE_PID) }, | |
| 1036 | + { USB_DEVICE(FTDI_VID, ACTISENSE_UID_PID) }, | |
| 1037 | + { USB_DEVICE(FTDI_VID, ACTISENSE_USA_PID) }, | |
| 1038 | + { USB_DEVICE(FTDI_VID, ACTISENSE_NGX_PID) }, | |
| 1039 | 1039 | { USB_DEVICE(FTDI_VID, ACTISENSE_D9AF_PID) }, |
| 1040 | 1040 | { USB_DEVICE(FTDI_VID, CHETCO_SEAGAUGE_PID) }, |
| 1041 | 1041 | { USB_DEVICE(FTDI_VID, CHETCO_SEASWITCH_PID) }, |
| @@ -1568,9 +1568,9 @@ · 1567 unmodified lines | ||
| 1568 | 1568 | #define ACTISENSE_USG_PID 0xD9A9 /* USG USB Serial Adapter */ |
| 1569 | 1569 | #define ACTISENSE_NGT_PID 0xD9AA /* NGT NMEA2000 Interface */ |
| 1570 | 1570 | #define ACTISENSE_NGW_PID 0xD9AB /* NGW NMEA2000 Gateway */ |
| 1571 | −#define ACTISENSE_D9AC_PID 0xD9AC /* Actisense Reserved */ | |
| 1572 | −#define ACTISENSE_D9AD_PID 0xD9AD /* Actisense Reserved */ | |
| 1573 | −#define ACTISENSE_D9AE_PID 0xD9AE /* Actisense Reserved */ | |
| 1571 | +#define ACTISENSE_UID_PID 0xD9AC /* USB Isolating Device */ | |
| 1572 | +#define ACTISENSE_USA_PID 0xD9AD /* USB to Serial Adapter */ | |
| 1573 | +#define ACTISENSE_NGX_PID 0xD9AE /* NGX NMEA2000 Gateway */ | |
| 1574 | 1574 | #define ACTISENSE_D9AF_PID 0xD9AF /* Actisense Reserved */ |
| 1575 | 1575 | #define CHETCO_SEAGAUGE_PID 0xA548 /* SeaGauge USB Adapter */ |
| 1576 | 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 | 272 | #define QUECTEL_PRODUCT_RM500Q 0x0800 |
| 273 | 273 | #define QUECTEL_PRODUCT_RM520N 0x0801 |
| 274 | 274 | #define QUECTEL_PRODUCT_EC200U 0x0901 |
| 275 | +#define QUECTEL_PRODUCT_EG912Y 0x6001 | |
| 275 | 276 | #define QUECTEL_PRODUCT_EC200S_CN 0x6002 |
| 276 | 277 | #define QUECTEL_PRODUCT_EC200A 0x6005 |
| 277 | 278 | #define QUECTEL_PRODUCT_EM061K_LWW 0x6008 |
| @@ -1232,6 +1233,7 @@ static const struct usb_device_id option_ids[] = { · 954 unmodified lines | ||
| 1232 | 1233 | { USB_DEVICE_INTERFACE_CLASS(QUECTEL_VENDOR_ID, 0x0700, 0xff), /* BG95 */ |
| 1233 | 1234 | .driver_info = RSVD(3) | ZLP }, |
| 1234 | 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 | 1237 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0, 0) }, |
| 1236 | 1238 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500Q, 0xff, 0xff, 0x10), |
| 1237 | 1239 | .driver_info = ZLP }, |
| @@ -1244,6 +1246,7 @@ static const struct usb_device_id option_ids[] = { · 6 unmodified lines | ||
| 1244 | 1246 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200U, 0xff, 0, 0) }, |
| 1245 | 1247 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC200S_CN, 0xff, 0, 0) }, |
| 1246 | 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 | 1250 | { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500K, 0xff, 0x00, 0x00) }, |
| 1248 | 1251 | |
| 1249 | 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 | 2245 | .driver_info = RSVD(0) | RSVD(1) | RSVD(6) }, |
| 2243 | 2246 | { USB_DEVICE(0x0489, 0xe0b5), /* Foxconn T77W968 ESIM */ |
| 2244 | 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 | 2250 | { USB_DEVICE_INTERFACE_CLASS(0x0489, 0xe0db, 0xff), /* Foxconn T99W265 MBIM */ |
| 2246 | 2251 | .driver_info = RSVD(3) }, |
| 2247 | 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 | 1305 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
| 1306 | 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 | 1320 | * This Pentax still camera is not conformant |
| 1310 | 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 | 229 | con_num = UCSI_CCI_CONNECTOR(cci); |
| 230 | 230 | if (con_num) { |
| 231 | − if (con_num < PMIC_GLINK_MAX_PORTS && | |
| 231 | + if (con_num <= PMIC_GLINK_MAX_PORTS && | |
| 232 | 232 | ucsi->port_orientation[con_num - 1]) { |
| 233 | 233 | int orientation = gpiod_get_value(ucsi->port_orientation[con_num - 1]); |
| 234 | 234 | |