Skip to content

Commit 5d324e5

Browse files
committed
Merge tag 'usb-6.18-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB/Thunderbolt fixes from Greg KH: "Here are some last-minutes USB and Thunderbolt driver fixes and new device ids for 6.18-rc8. Included in here are: - usb storage quirk fixup - xhci driver fixes for reported issues - usb gadget driver fixes - dwc3 driver fixes - UAS driver fixup - thunderbolt new device ids - usb-serial driver new ids All of these have been in linux-next with no reported issues, many for many weeks" * tag 'usb-6.18-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (21 commits) usb: gadget: renesas_usbf: Handle devm_pm_runtime_enable() errors USB: storage: Remove subclass and protocol overrides from Novatek quirk usb: uas: fix urb unmapping issue when the uas device is remove during ongoing data transfer usb: dwc3: Fix race condition between concurrent dwc3_remove_requests() call paths xhci: dbgtty: fix device unregister usb: storage: sddr55: Reject out-of-bound new_pba USB: serial: option: add support for Rolling RW101R-GL usb: typec: ucsi: psy: Set max current to zero when disconnected usb: gadget: f_eem: Fix memory leak in eem_unwrap usb: dwc3: pci: Sort out the Intel device IDs usb: dwc3: pci: add support for the Intel Nova Lake -S drivers/usb/dwc3: fix PCI parent check usb: storage: Fix memory leak in USB bulk transport xhci: sideband: Fix race condition in sideband unregister xhci: dbgtty: Fix data corruption when transmitting data form DbC to host xhci: fix stale flag preventig URBs after link state error is cleared USB: serial: ftdi_sio: add support for u-blox EVK-M101 usb: cdns3: Fix double resource release in cdns3_pci_probe usb: gadget: udc: fix use-after-free in usb_gadget_state_work usb: renesas_usbhs: Fix synchronous external abort on unbind ...
2 parents 24a84ea + 74851fb commit 5d324e5

25 files changed

Lines changed: 227 additions & 107 deletions

File tree

drivers/thunderbolt/nhi.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1538,6 +1538,8 @@ static struct pci_device_id nhi_ids[] = {
15381538
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
15391539
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_PTL_P_NHI1),
15401540
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
1541+
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_WCL_NHI0),
1542+
.driver_data = (kernel_ulong_t)&icl_nhi_ops },
15411543
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_80G_NHI) },
15421544
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_40G_NHI) },
15431545

drivers/thunderbolt/nhi.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ extern const struct tb_nhi_ops icl_nhi_ops;
7575
#define PCI_DEVICE_ID_INTEL_TITAN_RIDGE_DD_BRIDGE 0x15ef
7676
#define PCI_DEVICE_ID_INTEL_ADL_NHI0 0x463e
7777
#define PCI_DEVICE_ID_INTEL_ADL_NHI1 0x466d
78+
#define PCI_DEVICE_ID_INTEL_WCL_NHI0 0x4d33
7879
#define PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_80G_NHI 0x5781
7980
#define PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HOST_40G_NHI 0x5784
8081
#define PCI_DEVICE_ID_INTEL_BARLOW_RIDGE_HUB_80G_BRIDGE 0x5786

drivers/usb/cdns3/cdns3-pci-wrap.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,8 @@ static int cdns3_pci_probe(struct pci_dev *pdev,
9898
wrap = pci_get_drvdata(func);
9999
} else {
100100
wrap = kzalloc(sizeof(*wrap), GFP_KERNEL);
101-
if (!wrap) {
102-
pci_disable_device(pdev);
101+
if (!wrap)
103102
return -ENOMEM;
104-
}
105103
}
106104

107105
res = wrap->dev_res;
@@ -160,7 +158,6 @@ static int cdns3_pci_probe(struct pci_dev *pdev,
160158
/* register platform device */
161159
wrap->plat_dev = platform_device_register_full(&plat_info);
162160
if (IS_ERR(wrap->plat_dev)) {
163-
pci_disable_device(pdev);
164161
err = PTR_ERR(wrap->plat_dev);
165162
kfree(wrap);
166163
return err;

drivers/usb/dwc3/core.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include <linux/of.h>
2626
#include <linux/of_graph.h>
2727
#include <linux/acpi.h>
28+
#include <linux/pci.h>
2829
#include <linux/pinctrl/consumer.h>
2930
#include <linux/pinctrl/devinfo.h>
3031
#include <linux/reset.h>
@@ -2241,7 +2242,7 @@ int dwc3_core_probe(const struct dwc3_probe_data *data)
22412242
dev_set_drvdata(dev, dwc);
22422243
dwc3_cache_hwparams(dwc);
22432244

2244-
if (!dwc->sysdev_is_parent &&
2245+
if (!dev_is_pci(dwc->sysdev) &&
22452246
DWC3_GHWPARAMS0_AWIDTH(dwc->hwparams.hwparams0) == 64) {
22462247
ret = dma_set_mask_and_coherent(dwc->sysdev, DMA_BIT_MASK(64));
22472248
if (ret)

drivers/usb/dwc3/dwc3-pci.c

Lines changed: 41 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -21,40 +21,41 @@
2121
#include <linux/acpi.h>
2222
#include <linux/delay.h>
2323

24+
#define PCI_DEVICE_ID_INTEL_CMLLP 0x02ee
25+
#define PCI_DEVICE_ID_INTEL_CMLH 0x06ee
26+
#define PCI_DEVICE_ID_INTEL_BXT 0x0aaa
2427
#define PCI_DEVICE_ID_INTEL_BYT 0x0f37
2528
#define PCI_DEVICE_ID_INTEL_MRFLD 0x119e
26-
#define PCI_DEVICE_ID_INTEL_BSW 0x22b7
27-
#define PCI_DEVICE_ID_INTEL_SPTLP 0x9d30
28-
#define PCI_DEVICE_ID_INTEL_SPTH 0xa130
29-
#define PCI_DEVICE_ID_INTEL_BXT 0x0aaa
3029
#define PCI_DEVICE_ID_INTEL_BXT_M 0x1aaa
31-
#define PCI_DEVICE_ID_INTEL_APL 0x5aaa
32-
#define PCI_DEVICE_ID_INTEL_KBP 0xa2b0
33-
#define PCI_DEVICE_ID_INTEL_CMLLP 0x02ee
34-
#define PCI_DEVICE_ID_INTEL_CMLH 0x06ee
30+
#define PCI_DEVICE_ID_INTEL_BSW 0x22b7
3531
#define PCI_DEVICE_ID_INTEL_GLK 0x31aa
36-
#define PCI_DEVICE_ID_INTEL_CNPLP 0x9dee
37-
#define PCI_DEVICE_ID_INTEL_CNPH 0xa36e
38-
#define PCI_DEVICE_ID_INTEL_CNPV 0xa3b0
3932
#define PCI_DEVICE_ID_INTEL_ICLLP 0x34ee
40-
#define PCI_DEVICE_ID_INTEL_EHL 0x4b7e
41-
#define PCI_DEVICE_ID_INTEL_TGPLP 0xa0ee
4233
#define PCI_DEVICE_ID_INTEL_TGPH 0x43ee
43-
#define PCI_DEVICE_ID_INTEL_JSP 0x4dee
44-
#define PCI_DEVICE_ID_INTEL_WCL 0x4d7e
4534
#define PCI_DEVICE_ID_INTEL_ADL 0x460e
46-
#define PCI_DEVICE_ID_INTEL_ADL_PCH 0x51ee
4735
#define PCI_DEVICE_ID_INTEL_ADLN 0x465e
36+
#define PCI_DEVICE_ID_INTEL_EHL 0x4b7e
37+
#define PCI_DEVICE_ID_INTEL_WCL 0x4d7e
38+
#define PCI_DEVICE_ID_INTEL_JSP 0x4dee
39+
#define PCI_DEVICE_ID_INTEL_ADL_PCH 0x51ee
4840
#define PCI_DEVICE_ID_INTEL_ADLN_PCH 0x54ee
49-
#define PCI_DEVICE_ID_INTEL_ADLS 0x7ae1
50-
#define PCI_DEVICE_ID_INTEL_RPL 0xa70e
41+
#define PCI_DEVICE_ID_INTEL_APL 0x5aaa
42+
#define PCI_DEVICE_ID_INTEL_NVLS_PCH 0x6e6f
43+
#define PCI_DEVICE_ID_INTEL_ARLH_PCH 0x777e
5144
#define PCI_DEVICE_ID_INTEL_RPLS 0x7a61
45+
#define PCI_DEVICE_ID_INTEL_MTL 0x7e7e
46+
#define PCI_DEVICE_ID_INTEL_ADLS 0x7ae1
5247
#define PCI_DEVICE_ID_INTEL_MTLM 0x7eb1
5348
#define PCI_DEVICE_ID_INTEL_MTLP 0x7ec1
5449
#define PCI_DEVICE_ID_INTEL_MTLS 0x7f6f
55-
#define PCI_DEVICE_ID_INTEL_MTL 0x7e7e
56-
#define PCI_DEVICE_ID_INTEL_ARLH_PCH 0x777e
5750
#define PCI_DEVICE_ID_INTEL_TGL 0x9a15
51+
#define PCI_DEVICE_ID_INTEL_SPTLP 0x9d30
52+
#define PCI_DEVICE_ID_INTEL_CNPLP 0x9dee
53+
#define PCI_DEVICE_ID_INTEL_TGPLP 0xa0ee
54+
#define PCI_DEVICE_ID_INTEL_SPTH 0xa130
55+
#define PCI_DEVICE_ID_INTEL_KBP 0xa2b0
56+
#define PCI_DEVICE_ID_INTEL_CNPH 0xa36e
57+
#define PCI_DEVICE_ID_INTEL_CNPV 0xa3b0
58+
#define PCI_DEVICE_ID_INTEL_RPL 0xa70e
5859
#define PCI_DEVICE_ID_INTEL_PTLH 0xe332
5960
#define PCI_DEVICE_ID_INTEL_PTLH_PCH 0xe37e
6061
#define PCI_DEVICE_ID_INTEL_PTLU 0xe432
@@ -412,40 +413,41 @@ static void dwc3_pci_remove(struct pci_dev *pci)
412413
}
413414

414415
static const struct pci_device_id dwc3_pci_id_table[] = {
415-
{ PCI_DEVICE_DATA(INTEL, BSW, &dwc3_pci_intel_swnode) },
416-
{ PCI_DEVICE_DATA(INTEL, BYT, &dwc3_pci_intel_byt_swnode) },
417-
{ PCI_DEVICE_DATA(INTEL, MRFLD, &dwc3_pci_intel_mrfld_swnode) },
418416
{ PCI_DEVICE_DATA(INTEL, CMLLP, &dwc3_pci_intel_swnode) },
419417
{ PCI_DEVICE_DATA(INTEL, CMLH, &dwc3_pci_intel_swnode) },
420-
{ PCI_DEVICE_DATA(INTEL, SPTLP, &dwc3_pci_intel_swnode) },
421-
{ PCI_DEVICE_DATA(INTEL, SPTH, &dwc3_pci_intel_swnode) },
422418
{ PCI_DEVICE_DATA(INTEL, BXT, &dwc3_pci_intel_swnode) },
419+
{ PCI_DEVICE_DATA(INTEL, BYT, &dwc3_pci_intel_byt_swnode) },
420+
{ PCI_DEVICE_DATA(INTEL, MRFLD, &dwc3_pci_intel_mrfld_swnode) },
423421
{ PCI_DEVICE_DATA(INTEL, BXT_M, &dwc3_pci_intel_swnode) },
424-
{ PCI_DEVICE_DATA(INTEL, APL, &dwc3_pci_intel_swnode) },
425-
{ PCI_DEVICE_DATA(INTEL, KBP, &dwc3_pci_intel_swnode) },
422+
{ PCI_DEVICE_DATA(INTEL, BSW, &dwc3_pci_intel_swnode) },
426423
{ PCI_DEVICE_DATA(INTEL, GLK, &dwc3_pci_intel_swnode) },
427-
{ PCI_DEVICE_DATA(INTEL, CNPLP, &dwc3_pci_intel_swnode) },
428-
{ PCI_DEVICE_DATA(INTEL, CNPH, &dwc3_pci_intel_swnode) },
429-
{ PCI_DEVICE_DATA(INTEL, CNPV, &dwc3_pci_intel_swnode) },
430424
{ PCI_DEVICE_DATA(INTEL, ICLLP, &dwc3_pci_intel_swnode) },
431-
{ PCI_DEVICE_DATA(INTEL, EHL, &dwc3_pci_intel_swnode) },
432-
{ PCI_DEVICE_DATA(INTEL, TGPLP, &dwc3_pci_intel_swnode) },
433425
{ PCI_DEVICE_DATA(INTEL, TGPH, &dwc3_pci_intel_swnode) },
434-
{ PCI_DEVICE_DATA(INTEL, JSP, &dwc3_pci_intel_swnode) },
435-
{ PCI_DEVICE_DATA(INTEL, WCL, &dwc3_pci_intel_swnode) },
436426
{ PCI_DEVICE_DATA(INTEL, ADL, &dwc3_pci_intel_swnode) },
437-
{ PCI_DEVICE_DATA(INTEL, ADL_PCH, &dwc3_pci_intel_swnode) },
438427
{ PCI_DEVICE_DATA(INTEL, ADLN, &dwc3_pci_intel_swnode) },
428+
{ PCI_DEVICE_DATA(INTEL, EHL, &dwc3_pci_intel_swnode) },
429+
{ PCI_DEVICE_DATA(INTEL, WCL, &dwc3_pci_intel_swnode) },
430+
{ PCI_DEVICE_DATA(INTEL, JSP, &dwc3_pci_intel_swnode) },
431+
{ PCI_DEVICE_DATA(INTEL, ADL_PCH, &dwc3_pci_intel_swnode) },
439432
{ PCI_DEVICE_DATA(INTEL, ADLN_PCH, &dwc3_pci_intel_swnode) },
440-
{ PCI_DEVICE_DATA(INTEL, ADLS, &dwc3_pci_intel_swnode) },
441-
{ PCI_DEVICE_DATA(INTEL, RPL, &dwc3_pci_intel_swnode) },
433+
{ PCI_DEVICE_DATA(INTEL, APL, &dwc3_pci_intel_swnode) },
434+
{ PCI_DEVICE_DATA(INTEL, NVLS_PCH, &dwc3_pci_intel_swnode) },
435+
{ PCI_DEVICE_DATA(INTEL, ARLH_PCH, &dwc3_pci_intel_swnode) },
442436
{ PCI_DEVICE_DATA(INTEL, RPLS, &dwc3_pci_intel_swnode) },
437+
{ PCI_DEVICE_DATA(INTEL, MTL, &dwc3_pci_intel_swnode) },
438+
{ PCI_DEVICE_DATA(INTEL, ADLS, &dwc3_pci_intel_swnode) },
443439
{ PCI_DEVICE_DATA(INTEL, MTLM, &dwc3_pci_intel_swnode) },
444440
{ PCI_DEVICE_DATA(INTEL, MTLP, &dwc3_pci_intel_swnode) },
445-
{ PCI_DEVICE_DATA(INTEL, MTL, &dwc3_pci_intel_swnode) },
446441
{ PCI_DEVICE_DATA(INTEL, MTLS, &dwc3_pci_intel_swnode) },
447-
{ PCI_DEVICE_DATA(INTEL, ARLH_PCH, &dwc3_pci_intel_swnode) },
448442
{ PCI_DEVICE_DATA(INTEL, TGL, &dwc3_pci_intel_swnode) },
443+
{ PCI_DEVICE_DATA(INTEL, SPTLP, &dwc3_pci_intel_swnode) },
444+
{ PCI_DEVICE_DATA(INTEL, CNPLP, &dwc3_pci_intel_swnode) },
445+
{ PCI_DEVICE_DATA(INTEL, TGPLP, &dwc3_pci_intel_swnode) },
446+
{ PCI_DEVICE_DATA(INTEL, SPTH, &dwc3_pci_intel_swnode) },
447+
{ PCI_DEVICE_DATA(INTEL, KBP, &dwc3_pci_intel_swnode) },
448+
{ PCI_DEVICE_DATA(INTEL, CNPH, &dwc3_pci_intel_swnode) },
449+
{ PCI_DEVICE_DATA(INTEL, CNPV, &dwc3_pci_intel_swnode) },
450+
{ PCI_DEVICE_DATA(INTEL, RPL, &dwc3_pci_intel_swnode) },
449451
{ PCI_DEVICE_DATA(INTEL, PTLH, &dwc3_pci_intel_swnode) },
450452
{ PCI_DEVICE_DATA(INTEL, PTLH_PCH, &dwc3_pci_intel_swnode) },
451453
{ PCI_DEVICE_DATA(INTEL, PTLU, &dwc3_pci_intel_swnode) },

drivers/usb/dwc3/ep0.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ static int __dwc3_gadget_ep0_queue(struct dwc3_ep *dep,
9494
req->request.actual = 0;
9595
req->request.status = -EINPROGRESS;
9696
req->epnum = dep->number;
97+
req->status = DWC3_REQUEST_STATUS_QUEUED;
9798

9899
list_add_tail(&req->list, &dep->pending_list);
99100

drivers/usb/dwc3/gadget.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,13 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req,
228228
{
229229
struct dwc3 *dwc = dep->dwc;
230230

231+
/*
232+
* The request might have been processed and completed while the
233+
* spinlock was released. Skip processing if already completed.
234+
*/
235+
if (req->status == DWC3_REQUEST_STATUS_COMPLETED)
236+
return;
237+
231238
dwc3_gadget_del_and_unmap_request(dep, req, status);
232239
req->status = DWC3_REQUEST_STATUS_COMPLETED;
233240

drivers/usb/gadget/function/f_eem.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -477,8 +477,13 @@ static int eem_unwrap(struct gether *port,
477477
req->complete = eem_cmd_complete;
478478
req->zero = 1;
479479
req->context = ctx;
480-
if (usb_ep_queue(port->in_ep, req, GFP_ATOMIC))
480+
if (usb_ep_queue(port->in_ep, req, GFP_ATOMIC)) {
481481
DBG(cdev, "echo response queue fail\n");
482+
kfree(ctx);
483+
kfree(req->buf);
484+
usb_ep_free_request(ep, req);
485+
dev_kfree_skb_any(skb2);
486+
}
482487
break;
483488

484489
case 1: /* echo response */

drivers/usb/gadget/udc/core.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1126,8 +1126,13 @@ static void usb_gadget_state_work(struct work_struct *work)
11261126
void usb_gadget_set_state(struct usb_gadget *gadget,
11271127
enum usb_device_state state)
11281128
{
1129+
unsigned long flags;
1130+
1131+
spin_lock_irqsave(&gadget->state_lock, flags);
11291132
gadget->state = state;
1130-
schedule_work(&gadget->work);
1133+
if (!gadget->teardown)
1134+
schedule_work(&gadget->work);
1135+
spin_unlock_irqrestore(&gadget->state_lock, flags);
11311136
trace_usb_gadget_set_state(gadget, 0);
11321137
}
11331138
EXPORT_SYMBOL_GPL(usb_gadget_set_state);
@@ -1361,6 +1366,8 @@ static void usb_udc_nop_release(struct device *dev)
13611366
void usb_initialize_gadget(struct device *parent, struct usb_gadget *gadget,
13621367
void (*release)(struct device *dev))
13631368
{
1369+
spin_lock_init(&gadget->state_lock);
1370+
gadget->teardown = false;
13641371
INIT_WORK(&gadget->work, usb_gadget_state_work);
13651372
gadget->dev.parent = parent;
13661373

@@ -1535,6 +1542,7 @@ EXPORT_SYMBOL_GPL(usb_add_gadget_udc);
15351542
void usb_del_gadget(struct usb_gadget *gadget)
15361543
{
15371544
struct usb_udc *udc = gadget->udc;
1545+
unsigned long flags;
15381546

15391547
if (!udc)
15401548
return;
@@ -1548,6 +1556,13 @@ void usb_del_gadget(struct usb_gadget *gadget)
15481556
kobject_uevent(&udc->dev.kobj, KOBJ_REMOVE);
15491557
sysfs_remove_link(&udc->dev.kobj, "gadget");
15501558
device_del(&gadget->dev);
1559+
/*
1560+
* Set the teardown flag before flushing the work to prevent new work
1561+
* from being scheduled while we are cleaning up.
1562+
*/
1563+
spin_lock_irqsave(&gadget->state_lock, flags);
1564+
gadget->teardown = true;
1565+
spin_unlock_irqrestore(&gadget->state_lock, flags);
15511566
flush_work(&gadget->work);
15521567
ida_free(&gadget_id_numbers, gadget->id_number);
15531568
cancel_work_sync(&udc->vbus_work);

drivers/usb/gadget/udc/renesas_usbf.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3262,7 +3262,9 @@ static int usbf_probe(struct platform_device *pdev)
32623262
if (IS_ERR(udc->regs))
32633263
return PTR_ERR(udc->regs);
32643264

3265-
devm_pm_runtime_enable(&pdev->dev);
3265+
ret = devm_pm_runtime_enable(&pdev->dev);
3266+
if (ret)
3267+
return ret;
32663268
ret = pm_runtime_resume_and_get(&pdev->dev);
32673269
if (ret < 0)
32683270
return ret;

0 commit comments

Comments
 (0)