Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 887aa58e authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

Merge tag 'for-usb-linus-2012-02-14' of...

Merge tag 'for-usb-linus-2012-02-14' of git://git.kernel.org/pub/scm/linux/kernel/git/sarah/xhci into usb-linus

xHCI bug fix for broken BIOS on some Intel systems.

Happy Valentine's Day!  Your present is a working xHCI driver under some
Intel systems with buggy BIOSes that don't provide a legacy PCI IRQ line
for the USB 3.0 host.

Please queue for 3.3 and stable to share the love!
parents b7bc5925 68d07f64
Loading
Loading
Loading
Loading
+4 −1
Original line number Original line Diff line number Diff line
@@ -187,7 +187,10 @@ int usb_hcd_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
		return -ENODEV;
		return -ENODEV;
	dev->current_state = PCI_D0;
	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,
		dev_err(&dev->dev,
			"Found HC with no IRQ.  Check BIOS/PCI %s setup!\n",
			"Found HC with no IRQ.  Check BIOS/PCI %s setup!\n",
			pci_name(dev));
			pci_name(dev));
+4 −2
Original line number Original line Diff line number Diff line
@@ -2447,8 +2447,10 @@ int usb_add_hcd(struct usb_hcd *hcd,
			&& device_can_wakeup(&hcd->self.root_hub->dev))
			&& device_can_wakeup(&hcd->self.root_hub->dev))
		dev_dbg(hcd->self.controller, "supports USB remote wakeup\n");
		dev_dbg(hcd->self.controller, "supports USB remote wakeup\n");


	/* enable irqs just before we start the controller */
	/* enable irqs just before we start the controller,
	if (usb_hcd_is_primary_hcd(hcd)) {
	 * if the BIOS provides legacy PCI irqs.
	 */
	if (usb_hcd_is_primary_hcd(hcd) && irqnum) {
		retval = usb_hcd_request_irqs(hcd, irqnum, irqflags);
		retval = usb_hcd_request_irqs(hcd, irqnum, irqflags);
		if (retval)
		if (retval)
			goto err_request_irq;
			goto err_request_irq;
+5 −0
Original line number Original line Diff line number Diff line
@@ -352,6 +352,11 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd)
		/* hcd->irq is -1, we have MSI */
		/* hcd->irq is -1, we have MSI */
		return 0;
		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*/
	/* fall back to legacy interrupt*/
	ret = request_irq(pdev->irq, &usb_hcd_irq, IRQF_SHARED,
	ret = request_irq(pdev->irq, &usb_hcd_irq, IRQF_SHARED,
			hcd->irq_descr, hcd);
			hcd->irq_descr, hcd);