lkml.org 
[lkml]   [2015]   [Jun]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.4 135/172] usb: xhci: apply XHCI_AVOID_BEI quirk to all Intel xHCI controllers
    Date
    From: Lu Baolu <baolu.lu@linux.intel.com>

    3.4.108-rc1 review patch. If anyone has any objections, please let me know.

    ------------------


    commit 227a4fd801c8a9fa2c4700ab98ec1aec06e3b44d upstream.

    When a device with an isochronous endpoint is plugged into the Intel
    xHCI host controller, and the driver submits multiple frames per URB,
    the xHCI driver will set the Block Event Interrupt (BEI) flag on all
    but the last TD for the URB. This causes the host controller to place
    an event on the event ring, but not send an interrupt. When the last
    TD for the URB completes, BEI is cleared, and we get an interrupt for
    the whole URB.

    However, under Intel xHCI host controllers, if the event ring is full
    of events from transfers with BEI set, an "Event Ring is Full" event
    will be posted to the last entry of the event ring, but no interrupt
    is generated. Host will cease all transfer and command executions and
    wait until software completes handling the pending events in the event
    ring. That means xHC stops, but event of "event ring is full" is not
    notified. As the result, the xHC looks like dead to user.

    This patch is to apply XHCI_AVOID_BEI quirk to Intel xHC devices. And
    it should be backported to kernels as old as 3.0, that contains the
    commit 69e848c2090a ("Intel xhci: Support EHCI/xHCI port switching.").

    Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
    Tested-by: Alistair Grant <akgrant0710@gmail.com>
    Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    [lizf: Backported to 3.4: adjust context]
    Signed-off-by: Zefan Li <lizefan@huawei.com>
    ---
    drivers/usb/host/xhci-pci.c | 3 ++-
    1 file changed, 2 insertions(+), 1 deletion(-)

    diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
    index 037185d..710b2e9 100644
    --- a/drivers/usb/host/xhci-pci.c
    +++ b/drivers/usb/host/xhci-pci.c
    @@ -105,6 +105,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
    if (pdev->vendor == PCI_VENDOR_ID_AMD)
    xhci->quirks |= XHCI_TRUST_TX_LENGTH;

    + if (pdev->vendor == PCI_VENDOR_ID_INTEL)
    + xhci->quirks |= XHCI_AVOID_BEI;
    if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
    pdev->device == PCI_DEVICE_ID_INTEL_PANTHERPOINT_XHCI) {
    xhci->quirks |= XHCI_EP_LIMIT_QUIRK;
    @@ -119,7 +121,6 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
    * PPT chipsets.
    */
    xhci->quirks |= XHCI_SPURIOUS_REBOOT;
    - xhci->quirks |= XHCI_AVOID_BEI;
    }
    if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
    (pdev->device == PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_XHCI ||
    --
    1.9.1


    \
     
     \ /
      Last update: 2015-06-16 11:21    [W:4.229 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site