On Mon, Mar 04, 2013 at 09:22:04AM +0100, Hannes Reinecke wrote: >xhci has its own interrupt enabling routine, which will try to >use MSI-X/MSI if present. So the usb core shouldn't try to enable >legacy interrupts; on some machines the xhci legacy IRQ setting >is invalid. > >Cc: Bjorn Helgaas <bhelgaas@xxxxxxxxxx> >Cc: Oliver Neukum <oneukum@xxxxxxx> >Cc: Thomas Renninger <trenn@xxxxxxx> >Cc: Yinghai Lu <yinghai@xxxxxxxxxx> >Cc: Frederik Himpe <fhimpe@xxxxxxxxx> >Cc: David Haerdeman <david@xxxxxxxxxxx> >Cc: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> >Signed-off-by: Hannes Reinecke <hare@xxxxxxx> No idea if it's the "right" solution but it works for me. Tested-by: David Härdeman <david@xxxxxxxxxxx> > >diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c >index 622b4a4..2647e75 100644 >--- a/drivers/usb/core/hcd-pci.c >+++ b/drivers/usb/core/hcd-pci.c >@@ -173,6 +173,7 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) > struct hc_driver *driver; > struct usb_hcd *hcd; > int retval; >+ int hcd_irq = 0; > > if (usb_disabled()) > return -ENODEV; >@@ -187,15 +188,21 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) > return -ENODEV; > dev->current_state = PCI_D0; > >- /* The xHCI driver supports MSI and MSI-X, >- * so don't fail if the BIOS doesn't provide a legacy IRQ. >+ /* >+ * The xHCI driver supports MSI and MSI-X, >+ * so don't fail if the BIOS doesn't provide a legacy IRQ >+ * and do not try to enable legacy IRQs. > */ >- 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)); >- retval = -ENODEV; >- goto disable_pci; >+ if ((driver->flags & HCD_MASK) != HCD_USB3) { >+ if (!dev->irq) { >+ dev_err(&dev->dev, >+ "Found HC with no IRQ. " >+ "Check BIOS/PCI %s setup!\n", >+ pci_name(dev)); >+ retval = -ENODEV; >+ goto disable_pci; >+ } >+ hcd_irq = dev->irq; > } > > hcd = usb_create_hcd(driver, &dev->dev, pci_name(dev)); >@@ -245,7 +252,7 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) > > pci_set_master(dev); > >- retval = usb_add_hcd(hcd, dev->irq, IRQF_SHARED); >+ retval = usb_add_hcd(hcd, hcd_irq, IRQF_SHARED); > if (retval != 0) > goto unmap_registers; > set_hs_companion(dev, hcd); > -- David Härdeman -- 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