Skip to content

Commit f5182b4

Browse files
author
Sarah Sharp
committed
xhci: Disable MSI for some Fresco Logic hosts.
Some Fresco Logic hosts, including those found in the AUAU N533V laptop, advertise MSI, but fail to actually generate MSI interrupts. Add a new xHCI quirk to skip MSI enabling for the Fresco Logic host controllers. Fresco Logic confirms that all chips with PCI vendor ID 0x1b73 and device ID 0x1000, regardless of PCI revision ID, do not support MSI. This should be backported to stable kernels as far back as 2.6.36, which was the first kernel to support MSI on xHCI hosts. Signed-off-by: Sarah Sharp <[email protected]> Reported-by: Sergey Galanov <[email protected]> Cc: [email protected]
1 parent 001fd38 commit f5182b4

File tree

3 files changed

+20
-2
lines changed

3 files changed

+20
-2
lines changed

drivers/usb/host/xhci-pci.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,22 @@ static int xhci_pci_setup(struct usb_hcd *hcd)
106106

107107
/* Look for vendor-specific quirks */
108108
if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC &&
109-
pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK &&
110-
pdev->revision == 0x0) {
109+
pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK) {
110+
if (pdev->revision == 0x0) {
111111
xhci->quirks |= XHCI_RESET_EP_QUIRK;
112112
xhci_dbg(xhci, "QUIRK: Fresco Logic xHC needs configure"
113113
" endpoint cmd after reset endpoint\n");
114+
}
115+
/* Fresco Logic confirms: all revisions of this chip do not
116+
* support MSI, even though some of them claim to in their PCI
117+
* capabilities.
118+
*/
119+
xhci->quirks |= XHCI_BROKEN_MSI;
120+
xhci_dbg(xhci, "QUIRK: Fresco Logic revision %u "
121+
"has broken MSI implementation\n",
122+
pdev->revision);
114123
}
124+
115125
if (pdev->vendor == PCI_VENDOR_ID_NEC)
116126
xhci->quirks |= XHCI_NEC_HOST;
117127

drivers/usb/host/xhci.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,12 +430,19 @@ int xhci_run(struct usb_hcd *hcd)
430430
free_irq(hcd->irq, hcd);
431431
hcd->irq = -1;
432432

433+
/* Some Fresco Logic host controllers advertise MSI, but fail to
434+
* generate interrupts. Don't even try to enable MSI.
435+
*/
436+
if (xhci->quirks & XHCI_BROKEN_MSI)
437+
goto legacy_irq;
438+
433439
ret = xhci_setup_msix(xhci);
434440
if (ret)
435441
/* fall back to msi*/
436442
ret = xhci_setup_msi(xhci);
437443

438444
if (ret) {
445+
legacy_irq:
439446
/* fall back to legacy interrupt*/
440447
ret = request_irq(pdev->irq, &usb_hcd_irq, IRQF_SHARED,
441448
hcd->irq_descr, hcd);

drivers/usb/host/xhci.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1307,6 +1307,7 @@ struct xhci_hcd {
13071307
* commands.
13081308
*/
13091309
#define XHCI_EP_LIMIT_QUIRK (1 << 5)
1310+
#define XHCI_BROKEN_MSI (1 << 6)
13101311
unsigned int num_active_eps;
13111312
unsigned int limit_active_eps;
13121313
/* There are two roothubs to keep track of bus suspend info for */

0 commit comments

Comments
 (0)