Re: [PATCH v2 1/1] usb: xhci: apply XHCI_AVOID_BEI quirk to all Intel xHCI controllers

From: Mathias Nyman
Date: Mon Mar 16 2015 - 10:46:34 EST


On 16.03.2015 16:31, Alistair Grant wrote:
> On Mon, Mar 16, 2015 at 1:55 PM, Mathias Nyman
> <mathias.nyman@xxxxxxxxxxxxxxx> wrote:
>> On 15.03.2015 21:18, Alistair Grant wrote:
>>> On Sun, Mar 15, 2015 at 3:54 PM, Alistair Grant <akgrant0710@xxxxxxxxx> wrote:
>>>> On Thu, Mar 12, 2015 at 8:14 PM, Alistair Grant <akgrant0710@xxxxxxxxx> wrote:
>>>>> On Thu, Mar 12, 2015 at 11:15 AM, Lu Baolu <baolu.lu@xxxxxxxxxxxxxxx> wrote:
>>>>>> 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@xxxxxxxxxxxxxxx>
>>>>>> Cc: stable@xxxxxxxxxxxxxxx
>>>>>> ---
>>>>>> drivers/usb/host/xhci-pci.c | 2 +-
>>>>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>>>>
>>>>>> diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
>>>>>> index fd53c9e..2af32e2 100644
>>>>>> --- a/drivers/usb/host/xhci-pci.c
>>>>>> +++ b/drivers/usb/host/xhci-pci.c
>>>>>> @@ -115,6 +115,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
>>>>>> if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
>>>>>> xhci->quirks |= XHCI_LPM_SUPPORT;
>>>>>> xhci->quirks |= XHCI_INTEL_HOST;
>>>>>> + xhci->quirks |= XHCI_AVOID_BEI;
>>>>>> }
>>>>>> if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
>>>>>> pdev->device == PCI_DEVICE_ID_INTEL_PANTHERPOINT_XHCI) {
>>>>>> @@ -130,7 +131,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_LYNXPOINT_LP_XHCI) {
>>>>>> --
>>>>>> 2.1.0
>>>>>>
>>>>>> --
>>>>>
>>>>> This works for me...
>>>>>
>>>>> Computer: Dell XPS13 9333
>>>>> USB controller: Intel Corporation 8 Series USB xHCI HC (rev 04)
>>>>> (prog-if 30 [XHCI])
>>>>> Kernel: 3.19.1
>>>>> USB Device: Hauppauge USB-Live2
>>>>>
>>>>> Please let me know if I can help in any other way.
>>>>>
>>>>> Tested-by: Alistair Grant <akgrant0710@xxxxxxxxx>
>>>>
>>>> Just FYI...
>>>>
>>>> I was able to test this on a slightly older laptop that had both USB2
>>>> and USB3 ports and can confirm that it also works there:
>>>>
>>>> 00:14.0 USB controller: Intel Corporation 7 Series/C210 Series Chipset
>>>> Family USB xHCI Host Controller (rev 04)
>>>
>>> It looks like I may have signed-off a little too soon. While the patch is
>>> working correctly if the Hauppauge Live2 is plugged in after the system has
>>> booted and settled down (my normal use case), it fails if the Live2 is
>>> plugged in while the system is booted up.
>>>
>>> Unplugging the Live2 after recording (which appears to succeed from the
>>> command line, but had no audio), executing lsusb just hangs.
>>>
>>> I've included what I think is the relevant portions of /var/log/syslog
>>> below. If you'd like the entire log file posted somewhere please let me
>>> know.
>>
>> Hi
>>
>> What kernel did you try this patch on?
>>
>> The output look a bit like the regression in 4.0-rc3 caused by:
>> commit 27082e2654dc148078b0abdfc3c8e5ccbde0ebfa
>> xhci: Clear the host side toggle manually when endpoint is 'soft reset'
>>
>> which will be reverted (in 4.0-rc5 I hope).
>>
>> If you boot the same base kernel without the patch does it work then?
>>
>> -Mathias
>>
>
> Hi Mathias,
>
> This is on top of 3.19.1 with only the XHCI_AVOID_BEI quirk patch applied.
>
> If you'd like me to try it against 4.0-rc3, 4 or 5, please let me know.

Thanks, no that's not needed.
But did the patch cause regression on top of 3.19.1?
I mean, did it make 3.19.1 worse, better or just different for you, while
booting with the device connected?

-Mathias
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/