Hi Sergey, I managed to dig up a Fresco Logic add-in card, and I verified both that the problem with MSI does exist (for me) in Linux 3.0-rc1, and that this patch fixes it. I still don't understand why it works for you on 2.6.39 without this patch. Anyway, thanks for reporting the issue! Sarah Sharp On Thu, Jun 02, 2011 at 12:22:53PM -0700, Sarah Sharp wrote: > 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. > I'm waiting on confirmation from Fresco Logic as to what revisions of the > chip were affected, and unfortunately, the PCI vendor and device ID is the > same for the chip in the USB-IF PDK FPGA card, and the production chip. > > Completely disable MSI for all Fresco Logic hosts that have the PCI vendor > ID 0x1b73 and device ID 0x1000. > > Signed-off-by: Sarah Sharp <sarah.a.sharp@xxxxxxxxxxxxxxx> > --- > > Hi Sergey, > > Can you try 2.6.38 with and without this patch? I see a lot of reports > on the Ubuntu forums about this chip, and I'd like to get the Ubuntu > kernel team to fix it in their distro kernel, even if 2.6.38 isn't a > supported stable kernel anymore. > > Sarah Sharp > > drivers/usb/host/xhci-pci.c | 12 ++++++++++-- > drivers/usb/host/xhci.c | 7 +++++++ > drivers/usb/host/xhci.h | 1 + > 3 files changed, 18 insertions(+), 2 deletions(-) > > diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c > index bb668a8..93545ec 100644 > --- a/drivers/usb/host/xhci-pci.c > +++ b/drivers/usb/host/xhci-pci.c > @@ -73,12 +73,20 @@ static int xhci_pci_setup(struct usb_hcd *hcd) > > /* Look for vendor-specific quirks */ > if (pdev->vendor == PCI_VENDOR_ID_FRESCO_LOGIC && > - pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK && > - pdev->revision == 0x0) { > + pdev->device == PCI_DEVICE_ID_FRESCO_LOGIC_PDK) { > + if (pdev->revision == 0x0) { > xhci->quirks |= XHCI_RESET_EP_QUIRK; > xhci_dbg(xhci, "QUIRK: Fresco Logic xHC needs configure" > " endpoint cmd after reset endpoint\n"); > + } else { > + /* Not sure which revisions of the chip are broken. */ > + xhci->quirks |= XHCI_BROKEN_MSI; > + xhci_dbg(xhci, "QUIRK: Fresco Logic revision %u " > + "has broken MSI implementation\n", > + pdev->revision); > + } > } > + > if (pdev->vendor == PCI_VENDOR_ID_NEC) > xhci->quirks |= XHCI_NEC_HOST; > > diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c > index 150349d..ac09016 100644 > --- a/drivers/usb/host/xhci.c > +++ b/drivers/usb/host/xhci.c > @@ -412,12 +412,19 @@ int xhci_run(struct usb_hcd *hcd) > free_irq(hcd->irq, hcd); > hcd->irq = -1; > > + /* Some Fresco Logic host controllers advertise MSI, but fail to > + * generate interrupts. Don't even try to enable MSI. > + */ > + if (xhci->quirks & XHCI_BROKEN_MSI) > + goto legacy_irq; > + > ret = xhci_setup_msix(xhci); > if (ret) > /* fall back to msi*/ > ret = xhci_setup_msi(xhci); > > if (ret) { > +legacy_irq: > /* fall back to legacy interrupt*/ > ret = request_irq(pdev->irq, &usb_hcd_irq, IRQF_SHARED, > hcd->irq_descr, hcd); > diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h > index 19040c5..21470fa 100644 > --- a/drivers/usb/host/xhci.h > +++ b/drivers/usb/host/xhci.h > @@ -1259,6 +1259,7 @@ struct xhci_hcd { > #define XHCI_LINK_TRB_QUIRK (1 << 0) > #define XHCI_RESET_EP_QUIRK (1 << 1) > #define XHCI_NEC_HOST (1 << 2) > +#define XHCI_BROKEN_MSI (1 << 6) > u32 port_c_suspend[8]; /* port suspend change*/ > u32 suspended_ports[8]; /* which ports are > suspended */ > -- > 1.7.4.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-usb" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html