On Mon, 2012-02-13 at 16:25 -0800, Sarah Sharp wrote: > We have a PCI USB xhci host controller on a new platform. It doesn't > have a line IRQ definition in BIOS. The Linux driver refuses to > initial this controller, but Windows works well because it only depends > on MSI. > > Actually, Linux also can work for MSI. This patch skips the first line > IRQ checking for our HCD in usb-core pci probe, then try to enable MSI > firstly. That make this HCD works well under Linux. > > This patch should be backported to kernels as old as 2.6.32. > > Signed-off-by: Alex Shi <alex.shi@xxxxxxxxx> > Signed-off-by: Sarah Sharp <sarah.a.sharp@xxxxxxxxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx > --- > > Hi Alex, > > Please test this on your Panther Point system that doesn't have a BIOS > provided IRQ line. I think this is a much simpler solution. It is Ok on the platform. Thanks! > > Sarah Sharp > > drivers/usb/core/hcd-pci.c | 5 ++++- > drivers/usb/core/hcd.c | 6 ++++-- > drivers/usb/host/xhci.c | 5 +++++ > 3 files changed, 13 insertions(+), 3 deletions(-) > > diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c > index d136b8f..81e2c0d 100644 > --- a/drivers/usb/core/hcd-pci.c > +++ b/drivers/usb/core/hcd-pci.c > @@ -187,7 +187,10 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) > return -ENODEV; > dev->current_state = PCI_D0; > > - if (!dev->irq) { > + /* The xHCI driver supports MSI and MSI-X, > + * so don't fail if the BIOS doesn't provide a legacy IRQ. > + */ > + if (!dev->irq && (driver->flags & HCD_MASK) != HCD_USB3) { > dev_err(&dev->dev, > "Found HC with no IRQ. Check BIOS/PCI %s setup!\n", > pci_name(dev)); > diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c > index eb19cba..e128232 100644 > --- a/drivers/usb/core/hcd.c > +++ b/drivers/usb/core/hcd.c > @@ -2447,8 +2447,10 @@ int usb_add_hcd(struct usb_hcd *hcd, > && device_can_wakeup(&hcd->self.root_hub->dev)) > dev_dbg(hcd->self.controller, "supports USB remote wakeup\n"); > > - /* enable irqs just before we start the controller */ > - if (usb_hcd_is_primary_hcd(hcd)) { > + /* enable irqs just before we start the controller, > + * if the BIOS provides legacy PCI irqs. > + */ > + if (usb_hcd_is_primary_hcd(hcd) && irqnum) { > retval = usb_hcd_request_irqs(hcd, irqnum, irqflags); > if (retval) > goto err_request_irq; > diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c > index 6bbe3c3..c939f5f 100644 > --- a/drivers/usb/host/xhci.c > +++ b/drivers/usb/host/xhci.c > @@ -352,6 +352,11 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd) > /* hcd->irq is -1, we have MSI */ > return 0; > > + if (!pdev->irq) { > + xhci_err(xhci, "No msi-x/msi found and no IRQ in BIOS\n"); > + return -EINVAL; > + } > + > /* fall back to legacy interrupt*/ > ret = request_irq(pdev->irq, &usb_hcd_irq, IRQF_SHARED, > hcd->irq_descr, hcd); -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html