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

Pull USB / Thunderbolt driver fixes from Greg KH:
"Here are some small USB and Thunderbolt driver fixes for 6.9-rc5.
Included in here are:

- MAINTAINER file update for invalid email address

- usb-serial device id updates

- typec driver fixes

- thunderbolt / usb4 driver fixes

- usb core shutdown fixes

- cdc-wdm driver revert for reported problem in -rc1

- usb gadget driver fixes

- xhci driver fixes

All of these have been in linux-next for a while with no reported
problems"

* tag 'usb-6.9-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (25 commits)
USB: serial: option: add Telit FN920C04 rmnet compositions
usb: dwc3: ep0: Don't reset resource alloc flag
Revert "usb: cdc-wdm: close race between read and workqueue"
USB: serial: option: add Rolling RW101-GL and RW135-GL support
USB: serial: option: add Lonsung U8300/U9300 product
USB: serial: option: add support for Fibocom FM650/FG650
USB: serial: option: support Quectel EM060K sub-models
USB: serial: option: add Fibocom FM135-GL variants
usb: misc: onboard_usb_hub: Disable the USB hub clock on failure
thunderbolt: Avoid notify PM core about runtime PM resume
thunderbolt: Fix wake configurations after device unplug
usb: dwc2: host: Fix dereference issue in DDMA completion flow.
usb: typec: mux: it5205: Fix ChipID value typo
MAINTAINERS: Drop Li Yang as their email address stopped working
usb: gadget: fsl: Initialize udc before using it
usb: Disable USB3 LPM at shutdown
usb: gadget: f_ncm: Fix UAF ncm object at re-bind after usb ep transport error
usb: typec: tcpm: Correct the PDO counting in pd_set
usb: gadget: functionfs: Wait for fences before enqueueing DMABUF
usb: gadget: functionfs: Fix inverted DMA fence direction
...

Changed files
+148 -65
drivers
thunderbolt
usb
class
core
dwc2
dwc3
gadget
host
misc
serial
typec
mux
tcpm
ucsi
+1 -2
MAINTAINERS
··· 8746 8746 F: drivers/usb/gadget/udc/fsl* 8747 8747 8748 8748 FREESCALE USB PHY DRIVER 8749 - M: Ran Wang <ran.wang_1@nxp.com> 8750 8749 L: linux-usb@vger.kernel.org 8751 8750 L: linuxppc-dev@lists.ozlabs.org 8752 - S: Maintained 8751 + S: Orphan 8753 8752 F: drivers/usb/phy/phy-fsl-usb* 8754 8753 8755 8754 FREEVXFS FILESYSTEM
+40 -10
drivers/thunderbolt/switch.c
··· 3180 3180 { 3181 3181 struct tb_port *up, *down; 3182 3182 3183 - if (sw->is_unplugged) 3184 - return; 3185 3183 if (!tb_route(sw) || tb_switch_is_icm(sw)) 3184 + return; 3185 + 3186 + /* 3187 + * Unconfigure downstream port so that wake-on-connect can be 3188 + * configured after router unplug. No need to unconfigure upstream port 3189 + * since its router is unplugged. 3190 + */ 3191 + up = tb_upstream_port(sw); 3192 + down = up->remote; 3193 + if (tb_switch_is_usb4(down->sw)) 3194 + usb4_port_unconfigure(down); 3195 + else 3196 + tb_lc_unconfigure_port(down); 3197 + 3198 + if (sw->is_unplugged) 3186 3199 return; 3187 3200 3188 3201 up = tb_upstream_port(sw); ··· 3203 3190 usb4_port_unconfigure(up); 3204 3191 else 3205 3192 tb_lc_unconfigure_port(up); 3206 - 3207 - down = up->remote; 3208 - if (tb_switch_is_usb4(down->sw)) 3209 - usb4_port_unconfigure(down); 3210 - else 3211 - tb_lc_unconfigure_port(down); 3212 3193 } 3213 3194 3214 3195 static void tb_switch_credits_init(struct tb_switch *sw) ··· 3448 3441 return tb_lc_set_wake(sw, flags); 3449 3442 } 3450 3443 3451 - int tb_switch_resume(struct tb_switch *sw) 3444 + static void tb_switch_check_wakes(struct tb_switch *sw) 3445 + { 3446 + if (device_may_wakeup(&sw->dev)) { 3447 + if (tb_switch_is_usb4(sw)) 3448 + usb4_switch_check_wakes(sw); 3449 + } 3450 + } 3451 + 3452 + /** 3453 + * tb_switch_resume() - Resume a switch after sleep 3454 + * @sw: Switch to resume 3455 + * @runtime: Is this resume from runtime suspend or system sleep 3456 + * 3457 + * Resumes and re-enumerates router (and all its children), if still plugged 3458 + * after suspend. Don't enumerate device router whose UID was changed during 3459 + * suspend. If this is resume from system sleep, notifies PM core about the 3460 + * wakes occurred during suspend. Disables all wakes, except USB4 wake of 3461 + * upstream port for USB4 routers that shall be always enabled. 3462 + */ 3463 + int tb_switch_resume(struct tb_switch *sw, bool runtime) 3452 3464 { 3453 3465 struct tb_port *port; 3454 3466 int err; ··· 3516 3490 if (err) 3517 3491 return err; 3518 3492 3493 + if (!runtime) 3494 + tb_switch_check_wakes(sw); 3495 + 3519 3496 /* Disable wakes */ 3520 3497 tb_switch_set_wake(sw, 0); 3521 3498 ··· 3548 3519 */ 3549 3520 if (tb_port_unlock(port)) 3550 3521 tb_port_warn(port, "failed to unlock port\n"); 3551 - if (port->remote && tb_switch_resume(port->remote->sw)) { 3522 + if (port->remote && 3523 + tb_switch_resume(port->remote->sw, runtime)) { 3552 3524 tb_port_warn(port, 3553 3525 "lost during suspend, disconnecting\n"); 3554 3526 tb_sw_set_unplugged(port->remote->sw);
+8 -2
drivers/thunderbolt/tb.c
··· 1801 1801 continue; 1802 1802 } 1803 1803 1804 + /* Needs to be on different routers */ 1805 + if (in->sw == port->sw) { 1806 + tb_port_dbg(port, "skipping DP OUT on same router\n"); 1807 + continue; 1808 + } 1809 + 1804 1810 tb_port_dbg(port, "DP OUT available\n"); 1805 1811 1806 1812 /* ··· 2942 2936 if (!tb_switch_is_usb4(tb->root_switch)) 2943 2937 tb_switch_reset(tb->root_switch); 2944 2938 2945 - tb_switch_resume(tb->root_switch); 2939 + tb_switch_resume(tb->root_switch, false); 2946 2940 tb_free_invalid_tunnels(tb); 2947 2941 tb_free_unplugged_children(tb->root_switch); 2948 2942 tb_restore_children(tb->root_switch); ··· 3068 3062 struct tb_tunnel *tunnel, *n; 3069 3063 3070 3064 mutex_lock(&tb->lock); 3071 - tb_switch_resume(tb->root_switch); 3065 + tb_switch_resume(tb->root_switch, true); 3072 3066 tb_free_invalid_tunnels(tb); 3073 3067 tb_restore_children(tb->root_switch); 3074 3068 list_for_each_entry_safe(tunnel, n, &tcm->tunnel_list, list)
+2 -1
drivers/thunderbolt/tb.h
··· 827 827 int tb_switch_add(struct tb_switch *sw); 828 828 void tb_switch_remove(struct tb_switch *sw); 829 829 void tb_switch_suspend(struct tb_switch *sw, bool runtime); 830 - int tb_switch_resume(struct tb_switch *sw); 830 + int tb_switch_resume(struct tb_switch *sw, bool runtime); 831 831 int tb_switch_reset(struct tb_switch *sw); 832 832 int tb_switch_wait_for_bit(struct tb_switch *sw, u32 offset, u32 bit, 833 833 u32 value, int timeout_msec); ··· 1288 1288 return usb4_switch_version(sw) > 0; 1289 1289 } 1290 1290 1291 + void usb4_switch_check_wakes(struct tb_switch *sw); 1291 1292 int usb4_switch_setup(struct tb_switch *sw); 1292 1293 int usb4_switch_configuration_valid(struct tb_switch *sw); 1293 1294 int usb4_switch_read_uid(struct tb_switch *sw, u64 *uid);
+7 -6
drivers/thunderbolt/usb4.c
··· 155 155 tx_dwords, rx_data, rx_dwords); 156 156 } 157 157 158 - static void usb4_switch_check_wakes(struct tb_switch *sw) 158 + /** 159 + * usb4_switch_check_wakes() - Check for wakes and notify PM core about them 160 + * @sw: Router whose wakes to check 161 + * 162 + * Checks wakes occurred during suspend and notify the PM core about them. 163 + */ 164 + void usb4_switch_check_wakes(struct tb_switch *sw) 159 165 { 160 166 bool wakeup_usb4 = false; 161 167 struct usb4_port *usb4; 162 168 struct tb_port *port; 163 169 bool wakeup = false; 164 170 u32 val; 165 - 166 - if (!device_may_wakeup(&sw->dev)) 167 - return; 168 171 169 172 if (tb_route(sw)) { 170 173 if (tb_sw_read(sw, &val, TB_CFG_SWITCH, ROUTER_CS_6, 1)) ··· 246 243 bool tbt3, xhci; 247 244 u32 val = 0; 248 245 int ret; 249 - 250 - usb4_switch_check_wakes(sw); 251 246 252 247 if (!tb_route(sw)) 253 248 return 0;
+1 -5
drivers/usb/class/cdc-wdm.c
··· 485 485 static int service_outstanding_interrupt(struct wdm_device *desc) 486 486 { 487 487 int rv = 0; 488 - int used; 489 488 490 489 /* submit read urb only if the device is waiting for it */ 491 490 if (!desc->resp_count || !--desc->resp_count) ··· 499 500 goto out; 500 501 } 501 502 502 - used = test_and_set_bit(WDM_RESPONDING, &desc->flags); 503 - if (used) 504 - goto out; 505 - 503 + set_bit(WDM_RESPONDING, &desc->flags); 506 504 spin_unlock_irq(&desc->iuspin); 507 505 rv = usb_submit_urb(desc->response, GFP_KERNEL); 508 506 spin_lock_irq(&desc->iuspin);
+3 -1
drivers/usb/core/port.c
··· 449 449 { 450 450 struct usb_port *port_dev = to_usb_port(dev); 451 451 452 - if (port_dev->child) 452 + if (port_dev->child) { 453 453 usb_disable_usb2_hardware_lpm(port_dev->child); 454 + usb_unlocked_disable_lpm(port_dev->child); 455 + } 454 456 } 455 457 456 458 static const struct dev_pm_ops usb_port_pm_ops = {
+3 -1
drivers/usb/dwc2/hcd_ddma.c
··· 867 867 struct dwc2_dma_desc *dma_desc; 868 868 struct dwc2_hcd_iso_packet_desc *frame_desc; 869 869 u16 frame_desc_idx; 870 - struct urb *usb_urb = qtd->urb->priv; 870 + struct urb *usb_urb; 871 871 u16 remain = 0; 872 872 int rc = 0; 873 873 874 874 if (!qtd->urb) 875 875 return -EINVAL; 876 + 877 + usb_urb = qtd->urb->priv; 876 878 877 879 dma_sync_single_for_cpu(hsotg->dev, qh->desc_list_dma + (idx * 878 880 sizeof(struct dwc2_dma_desc)),
+2 -1
drivers/usb/dwc3/ep0.c
··· 226 226 227 227 /* reinitialize physical ep1 */ 228 228 dep = dwc->eps[1]; 229 - dep->flags = DWC3_EP_ENABLED; 229 + dep->flags &= DWC3_EP_RESOURCE_ALLOCATED; 230 + dep->flags |= DWC3_EP_ENABLED; 230 231 231 232 /* stall is always issued on EP0 */ 232 233 dep = dwc->eps[0];
+16 -13
drivers/usb/gadget/function/f_fs.c
··· 46 46 47 47 #define FUNCTIONFS_MAGIC 0xa647361 /* Chosen by a honest dice roll ;) */ 48 48 49 + #define DMABUF_ENQUEUE_TIMEOUT_MS 5000 50 + 49 51 MODULE_IMPORT_NS(DMA_BUF); 50 52 51 53 /* Reference counter handling */ ··· 1580 1578 struct ffs_dmabuf_priv *priv; 1581 1579 struct ffs_dma_fence *fence; 1582 1580 struct usb_request *usb_req; 1581 + enum dma_resv_usage resv_dir; 1583 1582 struct dma_buf *dmabuf; 1583 + unsigned long timeout; 1584 1584 struct ffs_ep *ep; 1585 1585 bool cookie; 1586 1586 u32 seqno; 1587 + long retl; 1587 1588 int ret; 1588 1589 1589 1590 if (req->flags & ~USB_FFS_DMABUF_TRANSFER_MASK) ··· 1620 1615 goto err_attachment_put; 1621 1616 1622 1617 /* Make sure we don't have writers */ 1623 - if (!dma_resv_test_signaled(dmabuf->resv, DMA_RESV_USAGE_WRITE)) { 1624 - pr_vdebug("FFS WRITE fence is not signaled\n"); 1625 - ret = -EBUSY; 1626 - goto err_resv_unlock; 1627 - } 1628 - 1629 - /* If we're writing to the DMABUF, make sure we don't have readers */ 1630 - if (epfile->in && 1631 - !dma_resv_test_signaled(dmabuf->resv, DMA_RESV_USAGE_READ)) { 1632 - pr_vdebug("FFS READ fence is not signaled\n"); 1633 - ret = -EBUSY; 1618 + timeout = nonblock ? 0 : msecs_to_jiffies(DMABUF_ENQUEUE_TIMEOUT_MS); 1619 + retl = dma_resv_wait_timeout(dmabuf->resv, 1620 + dma_resv_usage_rw(epfile->in), 1621 + true, timeout); 1622 + if (retl == 0) 1623 + retl = -EBUSY; 1624 + if (retl < 0) { 1625 + ret = (int)retl; 1634 1626 goto err_resv_unlock; 1635 1627 } 1636 1628 ··· 1667 1665 dma_fence_init(&fence->base, &ffs_dmabuf_fence_ops, 1668 1666 &priv->lock, priv->context, seqno); 1669 1667 1670 - dma_resv_add_fence(dmabuf->resv, &fence->base, 1671 - dma_resv_usage_rw(epfile->in)); 1668 + resv_dir = epfile->in ? DMA_RESV_USAGE_WRITE : DMA_RESV_USAGE_READ; 1669 + 1670 + dma_resv_add_fence(dmabuf->resv, &fence->base, resv_dir); 1672 1671 dma_resv_unlock(dmabuf->resv); 1673 1672 1674 1673 /* Now that the dma_fence is in place, queue the transfer. */
+2 -2
drivers/usb/gadget/function/f_ncm.c
··· 878 878 if (alt > 1) 879 879 goto fail; 880 880 881 - if (ncm->port.in_ep->enabled) { 881 + if (ncm->netdev) { 882 882 DBG(cdev, "reset ncm\n"); 883 883 ncm->netdev = NULL; 884 884 gether_disconnect(&ncm->port); ··· 1367 1367 1368 1368 DBG(cdev, "ncm deactivated\n"); 1369 1369 1370 - if (ncm->port.in_ep->enabled) { 1370 + if (ncm->netdev) { 1371 1371 ncm->netdev = NULL; 1372 1372 gether_disconnect(&ncm->port); 1373 1373 }
+2 -3
drivers/usb/gadget/udc/fsl_udc_core.c
··· 868 868 { 869 869 struct fsl_ep *ep = container_of(_ep, struct fsl_ep, ep); 870 870 struct fsl_req *req = container_of(_req, struct fsl_req, req); 871 - struct fsl_udc *udc; 871 + struct fsl_udc *udc = ep->udc; 872 872 unsigned long flags; 873 873 int ret; 874 874 ··· 878 878 dev_vdbg(&udc->gadget.dev, "%s, bad params\n", __func__); 879 879 return -EINVAL; 880 880 } 881 - if (unlikely(!_ep || !ep->ep.desc)) { 881 + if (unlikely(!ep->ep.desc)) { 882 882 dev_vdbg(&udc->gadget.dev, "%s, bad ep\n", __func__); 883 883 return -EINVAL; 884 884 } ··· 887 887 return -EMSGSIZE; 888 888 } 889 889 890 - udc = ep->udc; 891 890 if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN) 892 891 return -ESHUTDOWN; 893 892
+4 -5
drivers/usb/host/xhci-ring.c
··· 3133 3133 irqreturn_t xhci_irq(struct usb_hcd *hcd) 3134 3134 { 3135 3135 struct xhci_hcd *xhci = hcd_to_xhci(hcd); 3136 - irqreturn_t ret = IRQ_NONE; 3136 + irqreturn_t ret = IRQ_HANDLED; 3137 3137 u32 status; 3138 3138 3139 3139 spin_lock(&xhci->lock); ··· 3141 3141 status = readl(&xhci->op_regs->status); 3142 3142 if (status == ~(u32)0) { 3143 3143 xhci_hc_died(xhci); 3144 - ret = IRQ_HANDLED; 3145 3144 goto out; 3146 3145 } 3147 3146 3148 - if (!(status & STS_EINT)) 3147 + if (!(status & STS_EINT)) { 3148 + ret = IRQ_NONE; 3149 3149 goto out; 3150 + } 3150 3151 3151 3152 if (status & STS_HCE) { 3152 3153 xhci_warn(xhci, "WARNING: Host Controller Error\n"); ··· 3157 3156 if (status & STS_FATAL) { 3158 3157 xhci_warn(xhci, "WARNING: Host System Error\n"); 3159 3158 xhci_halt(xhci); 3160 - ret = IRQ_HANDLED; 3161 3159 goto out; 3162 3160 } 3163 3161 ··· 3167 3167 */ 3168 3168 status |= STS_EINT; 3169 3169 writel(status, &xhci->op_regs->status); 3170 - ret = IRQ_HANDLED; 3171 3170 3172 3171 /* This is the handler of the primary interrupter */ 3173 3172 xhci_handle_events(xhci, xhci->interrupters[0]);
+5 -7
drivers/usb/host/xhci-trace.h
··· 172 172 __field(void *, vdev) 173 173 __field(unsigned long long, out_ctx) 174 174 __field(unsigned long long, in_ctx) 175 - __field(int, hcd_portnum) 176 - __field(int, hw_portnum) 175 + __field(int, slot_id) 177 176 __field(u16, current_mel) 178 177 179 178 ), ··· 180 181 __entry->vdev = vdev; 181 182 __entry->in_ctx = (unsigned long long) vdev->in_ctx->dma; 182 183 __entry->out_ctx = (unsigned long long) vdev->out_ctx->dma; 183 - __entry->hcd_portnum = (int) vdev->rhub_port->hcd_portnum; 184 - __entry->hw_portnum = (int) vdev->rhub_port->hw_portnum; 184 + __entry->slot_id = (int) vdev->slot_id; 185 185 __entry->current_mel = (u16) vdev->current_mel; 186 186 ), 187 - TP_printk("vdev %p ctx %llx | %llx hcd_portnum %d hw_portnum %d current_mel %d", 188 - __entry->vdev, __entry->in_ctx, __entry->out_ctx, 189 - __entry->hcd_portnum, __entry->hw_portnum, __entry->current_mel 187 + TP_printk("vdev %p slot %d ctx %llx | %llx current_mel %d", 188 + __entry->vdev, __entry->slot_id, __entry->in_ctx, 189 + __entry->out_ctx, __entry->current_mel 190 190 ) 191 191 ); 192 192
+5 -1
drivers/usb/misc/onboard_usb_hub.c
··· 78 78 err = regulator_bulk_enable(hub->pdata->num_supplies, hub->supplies); 79 79 if (err) { 80 80 dev_err(hub->dev, "failed to enable supplies: %pe\n", ERR_PTR(err)); 81 - return err; 81 + goto disable_clk; 82 82 } 83 83 84 84 fsleep(hub->pdata->reset_us); ··· 87 87 hub->is_powered_on = true; 88 88 89 89 return 0; 90 + 91 + disable_clk: 92 + clk_disable_unprepare(hub->clk); 93 + return err; 90 94 } 91 95 92 96 static int onboard_hub_power_off(struct onboard_hub *hub)
+40
drivers/usb/serial/option.c
··· 255 255 #define QUECTEL_PRODUCT_EM061K_LMS 0x0124 256 256 #define QUECTEL_PRODUCT_EC25 0x0125 257 257 #define QUECTEL_PRODUCT_EM060K_128 0x0128 258 + #define QUECTEL_PRODUCT_EM060K_129 0x0129 259 + #define QUECTEL_PRODUCT_EM060K_12a 0x012a 260 + #define QUECTEL_PRODUCT_EM060K_12b 0x012b 261 + #define QUECTEL_PRODUCT_EM060K_12c 0x012c 258 262 #define QUECTEL_PRODUCT_EG91 0x0191 259 263 #define QUECTEL_PRODUCT_EG95 0x0195 260 264 #define QUECTEL_PRODUCT_BG96 0x0296 ··· 1222 1218 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_128, 0xff, 0xff, 0x30) }, 1223 1219 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_128, 0xff, 0x00, 0x40) }, 1224 1220 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_128, 0xff, 0xff, 0x40) }, 1221 + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_129, 0xff, 0xff, 0x30) }, 1222 + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_129, 0xff, 0x00, 0x40) }, 1223 + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_129, 0xff, 0xff, 0x40) }, 1224 + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_12a, 0xff, 0xff, 0x30) }, 1225 + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_12a, 0xff, 0x00, 0x40) }, 1226 + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_12a, 0xff, 0xff, 0x40) }, 1227 + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_12b, 0xff, 0xff, 0x30) }, 1228 + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_12b, 0xff, 0x00, 0x40) }, 1229 + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_12b, 0xff, 0xff, 0x40) }, 1230 + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_12c, 0xff, 0xff, 0x30) }, 1231 + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_12c, 0xff, 0x00, 0x40) }, 1232 + { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM060K_12c, 0xff, 0xff, 0x40) }, 1225 1233 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM061K_LCN, 0xff, 0xff, 0x30) }, 1226 1234 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM061K_LCN, 0xff, 0x00, 0x40) }, 1227 1235 { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EM061K_LCN, 0xff, 0xff, 0x40) }, ··· 1376 1360 .driver_info = NCTRL(2) | RSVD(3) }, 1377 1361 { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1083, 0xff), /* Telit FE990 (ECM) */ 1378 1362 .driver_info = NCTRL(0) | RSVD(1) }, 1363 + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a0, 0xff), /* Telit FN20C04 (rmnet) */ 1364 + .driver_info = RSVD(0) | NCTRL(3) }, 1365 + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a4, 0xff), /* Telit FN20C04 (rmnet) */ 1366 + .driver_info = RSVD(0) | NCTRL(3) }, 1367 + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x10a9, 0xff), /* Telit FN20C04 (rmnet) */ 1368 + .driver_info = RSVD(0) | NCTRL(2) | RSVD(3) | RSVD(4) }, 1379 1369 { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910), 1380 1370 .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) }, 1381 1371 { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM), ··· 2074 2052 .driver_info = RSVD(3) }, 2075 2053 { USB_DEVICE_INTERFACE_CLASS(LONGCHEER_VENDOR_ID, 0x9803, 0xff), 2076 2054 .driver_info = RSVD(4) }, 2055 + { USB_DEVICE(LONGCHEER_VENDOR_ID, 0x9b05), /* Longsung U8300 */ 2056 + .driver_info = RSVD(4) | RSVD(5) }, 2057 + { USB_DEVICE(LONGCHEER_VENDOR_ID, 0x9b3c), /* Longsung U9300 */ 2058 + .driver_info = RSVD(0) | RSVD(4) }, 2077 2059 { USB_DEVICE(LONGCHEER_VENDOR_ID, ZOOM_PRODUCT_4597) }, 2078 2060 { USB_DEVICE(LONGCHEER_VENDOR_ID, IBALL_3_5G_CONNECT) }, 2079 2061 { USB_DEVICE(HAIER_VENDOR_ID, HAIER_PRODUCT_CE100) }, ··· 2298 2272 { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0xff, 0x30) }, /* Fibocom FG150 Diag */ 2299 2273 { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0, 0) }, /* Fibocom FG150 AT */ 2300 2274 { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0111, 0xff) }, /* Fibocom FM160 (MBIM mode) */ 2275 + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0115, 0xff), /* Fibocom FM135 (laptop MBIM) */ 2276 + .driver_info = RSVD(5) }, 2301 2277 { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) }, /* Fibocom NL668-AM/NL652-EU (laptop MBIM) */ 2302 2278 { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a2, 0xff) }, /* Fibocom FM101-GL (laptop MBIM) */ 2303 2279 { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a3, 0xff) }, /* Fibocom FM101-GL (laptop MBIM) */ 2304 2280 { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a4, 0xff), /* Fibocom FM101-GL (laptop MBIM) */ 2305 2281 .driver_info = RSVD(4) }, 2282 + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0a04, 0xff) }, /* Fibocom FM650-CN (ECM mode) */ 2283 + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0a05, 0xff) }, /* Fibocom FM650-CN (NCM mode) */ 2284 + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0a06, 0xff) }, /* Fibocom FM650-CN (RNDIS mode) */ 2285 + { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0a07, 0xff) }, /* Fibocom FM650-CN (MBIM mode) */ 2306 2286 { USB_DEVICE_INTERFACE_CLASS(0x2df3, 0x9d03, 0xff) }, /* LongSung M5710 */ 2307 2287 { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1404, 0xff) }, /* GosunCn GM500 RNDIS */ 2308 2288 { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1405, 0xff) }, /* GosunCn GM500 MBIM */ 2309 2289 { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1406, 0xff) }, /* GosunCn GM500 ECM/NCM */ 2290 + { USB_DEVICE(0x33f8, 0x0104), /* Rolling RW101-GL (laptop RMNET) */ 2291 + .driver_info = RSVD(4) | RSVD(5) }, 2292 + { USB_DEVICE_INTERFACE_CLASS(0x33f8, 0x01a2, 0xff) }, /* Rolling RW101-GL (laptop MBIM) */ 2293 + { USB_DEVICE_INTERFACE_CLASS(0x33f8, 0x01a3, 0xff) }, /* Rolling RW101-GL (laptop MBIM) */ 2294 + { USB_DEVICE_INTERFACE_CLASS(0x33f8, 0x01a4, 0xff), /* Rolling RW101-GL (laptop MBIM) */ 2295 + .driver_info = RSVD(4) }, 2296 + { USB_DEVICE_INTERFACE_CLASS(0x33f8, 0x0115, 0xff), /* Rolling RW135-GL (laptop MBIM) */ 2297 + .driver_info = RSVD(5) }, 2310 2298 { USB_DEVICE_AND_INTERFACE_INFO(OPPO_VENDOR_ID, OPPO_PRODUCT_R11, 0xff, 0xff, 0x30) }, 2311 2299 { USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0xff, 0x30) }, 2312 2300 { USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0xff, 0x40) },
+1 -1
drivers/usb/typec/mux/it5205.c
··· 22 22 #include <linux/usb/typec_mux.h> 23 23 24 24 #define IT5205_REG_CHIP_ID(x) (0x4 + (x)) 25 - #define IT5205FN_CHIP_ID 0x35323035 /* "5205" */ 25 + #define IT5205FN_CHIP_ID 0x35303235 /* "5025" -> "5205" */ 26 26 27 27 /* MUX power down register */ 28 28 #define IT5205_REG_MUXPDR 0x10
+2 -2
drivers/usb/typec/tcpm/tcpm.c
··· 6855 6855 if (data->sink_desc.pdo[0]) { 6856 6856 for (i = 0; i < PDO_MAX_OBJECTS && data->sink_desc.pdo[i]; i++) 6857 6857 port->snk_pdo[i] = data->sink_desc.pdo[i]; 6858 - port->nr_snk_pdo = i + 1; 6858 + port->nr_snk_pdo = i; 6859 6859 port->operating_snk_mw = data->operating_snk_mw; 6860 6860 } 6861 6861 6862 6862 if (data->source_desc.pdo[0]) { 6863 6863 for (i = 0; i < PDO_MAX_OBJECTS && data->source_desc.pdo[i]; i++) 6864 6864 port->src_pdo[i] = data->source_desc.pdo[i]; 6865 - port->nr_src_pdo = i + 1; 6865 + port->nr_src_pdo = i; 6866 6866 } 6867 6867 6868 6868 switch (port->state) {
+4 -2
drivers/usb/typec/ucsi/ucsi.c
··· 1736 1736 ucsi->connector = connector; 1737 1737 ucsi->ntfy = ntfy; 1738 1738 1739 + mutex_lock(&ucsi->ppm_lock); 1739 1740 ret = ucsi->ops->read(ucsi, UCSI_CCI, &cci, sizeof(cci)); 1741 + mutex_unlock(&ucsi->ppm_lock); 1740 1742 if (ret) 1741 1743 return ret; 1742 - if (UCSI_CCI_CONNECTOR(READ_ONCE(cci))) 1743 - ucsi_connector_change(ucsi, cci); 1744 + if (UCSI_CCI_CONNECTOR(cci)) 1745 + ucsi_connector_change(ucsi, UCSI_CCI_CONNECTOR(cci)); 1744 1746 1745 1747 return 0; 1746 1748