[lkml]   [2012]   [Mar]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[ 21/34] USB: Fix handoff when BIOS disables host PCI device.
    2.6.32-longterm review patch.  If anyone has any objections, please let me know.


    From: Sarah Sharp <>

    commit cab928ee1f221c9cc48d6615070fefe2e444384a upstream.

    On some systems with an Intel Panther Point xHCI host controller, the
    BIOS disables the xHCI PCI device during boot, and switches the xHCI
    ports over to EHCI. This allows the BIOS to access USB devices without
    having xHCI support.

    The downside is that the xHCI BIOS handoff mechanism will fail because
    memory mapped I/O is not enabled for the disabled PCI device.
    Jesse Barnes says this is expected behavior. The PCI core will enable
    BARs before quirks run, but it will leave it in an undefined state, and
    it may not have memory mapped I/O enabled.

    Make the generic USB quirk handler call pci_enable_device() to re-enable
    MMIO, and call pci_disable_device() once the host-specific BIOS handoff
    is finished. This will balance the ref counts in the PCI core. When
    the PCI probe function is called, usb_hcd_pci_probe() will call
    pci_enable_device() again.

    This should be back ported to kernels as old as 2.6.31. That was the
    first kernel with xHCI support, and no one has complained about BIOS
    handoffs failing due to memory mapped I/O being disabled on other hosts
    (EHCI, UHCI, or OHCI).

    Signed-off-by: Sarah Sharp <>
    Acked-by: Oliver Neukum <>
    Cc: Jesse Barnes <>
    Signed-off-by: Greg Kroah-Hartman <>

    drivers/usb/host/pci-quirks.c | 11 +++++++++++
    1 file changed, 11 insertions(+)

    --- a/drivers/usb/host/pci-quirks.c
    +++ b/drivers/usb/host/pci-quirks.c
    @@ -503,7 +503,17 @@ static void __devinit quirk_usb_early_ha
    if (pdev->vendor == 0x184e) /* vendor Netlogic */
    + if (pdev->class != PCI_CLASS_SERIAL_USB_UHCI &&
    + pdev->class != PCI_CLASS_SERIAL_USB_OHCI &&
    + pdev->class != PCI_CLASS_SERIAL_USB_EHCI &&
    + pdev->class != PCI_CLASS_SERIAL_USB_XHCI)
    + return;

    + if (pci_enable_device(pdev) < 0) {
    + dev_warn(&pdev->dev, "Can't enable PCI device, "
    + "BIOS handoff failed.\n");
    + return;
    + }
    if (pdev->class == PCI_CLASS_SERIAL_USB_UHCI)
    else if (pdev->class == PCI_CLASS_SERIAL_USB_OHCI)
    @@ -512,5 +522,6 @@ static void __devinit quirk_usb_early_ha
    else if (pdev->class == PCI_CLASS_SERIAL_USB_XHCI)
    + pci_disable_device(pdev);
    DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, quirk_usb_early_handoff);

     \ /
      Last update: 2012-03-01 22:53    [W:0.021 / U:134.536 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site