USB EHCI: repeated resets on full and low speed devices
Subsystems (2)
cover USB EHCI: repeated resets on full and low speed devices
I recently replaced the motherboard on my desktop with an MSI B450-A Pro Max motherboard. Since then my keybaords, mouse and tablet have become very unreliable. I see messages like this over and over in dmesg:
ug 23 00:01:49 rhapsody kernel: [198769.314732] usb 1-2.4: reset full-speed USB
device number 27 using ehci-pci
Aug 23 00:01:49 rhapsody kernel: [198769.562234] usb 1-2.1: reset full-speed USB device number 28 using ehci-pci Aug 23 00:01:52 rhapsody kernel: [198772.570704] usb 1-2.1: reset full-speed USB device number 28 using ehci-pci Aug 23 00:02:02 rhapsody kernel: [198782.526669] usb 1-2.4: reset full-speed USB device number 27 using ehci-pci Aug 23 00:02:03 rhapsody kernel: [198782.714660] usb 1-2.1: reset full-speed USB device number 28 using ehci-pci Aug 23 00:02:04 rhapsody kernel: [198784.210171] usb 1-2.3: reset low-speed USB device number 26 using ehci-pci Aug 23 00:02:06 rhapsody kernel: [198786.110181] usb 1-2.4: reset full-speed USB device number 27 using ehci-pci Aug 23 00:02:08 rhapsody kernel: [198787.726158] usb 1-2.4: reset full-speed USB device number 27 using ehci-pci Aug 23 00:02:10 rhapsody kernel: [198790.126628] usb 1-2.1: reset full-speed USB device number 28 using ehci-pci Aug 23 00:02:10 rhapsody kernel: [198790.314141] usb 1-2.4: reset full-speed USB device number 27 using ehci-pci Aug 23 00:02:12 rhapsody kernel: [198792.518765] usb 1-2.4: reset full-speed USB device number 27 using ehci-pci
The devices I am using are:
- Logitech K360 wireless keyboard
- Wired Lenovo USB keyboard
- Wired Lenovo USB mouse
- Wired Wacom Intuos tablet
After a reset, the wireless keyboard simply stops working. Rest of the devices keep seeing intermittent failure.
I tried various combinations of hubs and USB controllers to see what works. MSI B450-A motherboard has USB 3.0 and USB 3.1 controllers. I added a USB 2.0 PCI card as well for this test:
03:00.0 USB controller: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset USB 3.1 XHCI Controller (rev 01) 29:01.0 USB controller: NEC Corporation OHCI USB Controller (rev 43)
29:01.1 USB controller: NEC Corporation OHCI USB Controller (rev 43)
29:01.2 USB controller: NEC Corporation uPD72010x USB 2.0 Controller (rev 04)
2c:00.3 USB controller: Advanced Micro Devices, Inc. [AMD] Matisse USB 3.0 Host Controller
I have a bus powered USB 3.0 hub, a bus powered USB 2.0 hub and a self powered USB 2.0 hub built into my monitor.
I have connected my devices directly into the ports on motherboard and PCI card as well as into external hub. Here are the results I saw when devices wee plugged into various combination of ports:
1. USB 3.0/3.1 controller - does NOT work
2. USB 2.0 controller - WORKS
3. USB 3.0/3.1 controller -> Self powered USB 2.0 hub in monitor - does NOT work
4. USB 3.0/3.1 controller -> bus powered USB 3.0 hub - does NOT work
5. USB 3.0/3.1 controller -> Bus powered USB 2.0 hub - WORKS
7. USB 2.0 controller -> Bus powered USB 3.0 hub - does NOT work
8. USB 2.0 controller -> Bus powered 2.0 hub - Does not work
I narrowed the failure down to following lines (this code was added in 5.5 with commit 64cc3f12d1c7 "USB: EHCI: Do not return -EPIPE when hub is disconnected"):
drivers/usb/host/ehci-q.c:
217 } else if ((token & QTD_STS_MMF) &&
218 (QTD_PID(token) == PID_CODE_IN)) {
219 status = -EPROTO;
220 /* CERR nonzero + halt --> stall */
At the time of failure, when we reach this conditional, token is either 0x80408d46 or 0x408d46 which means following bits are set:
QTD_STS_STS, QTD_STS_MMF, QTD_STS_HALT, QTD_IOC, QTD_TOGGLE
and
QTD_PID = 1
QTD_CERR = 3
QTD_LENGTH = 0x40 (64)This causes the branch "(token & QTD_STS_MMF) && (QTD_PID(token) == PID_CODE_IN" to be taken and qtd_copy_status() returns EPROTO. This return value in qh_completions() results in ehci_clear_tt_buffer() being called:
drivers/usb/host/ehci-q.c:
472 /* As part of low/full-speed endpoint-halt processi ng
473 * we must clear the TT buffer (11.17.5).
474 */
475 if (unlikely(last_status != -EINPROGRESS &&
476 last_status != -EREMOTEIO)) {
477 /* The TT's in some hubs malfunction when t hey 478 * receive this request following a STALL ( they 479 * stop sending isochronous packets). Sinc e a 480 * STALL can't leave the TT buffer in a bus y 481 * state (if you believe Figures 11-48 - 11 -51 482 * in the USB 2.0 spec), we won't clear the TT 483 * buffer in this case. Strictly speaking this 484 * is a violation of the spec. 485 */
486 if (last_status != -EPIPE)
487 ehci_clear_tt_buffer(ehci, qh, urb,
488 token);
489 }
It seems like clearing TT buffers in this case is resulting in hub hanging. A USB reset gets it going again until we repeat the cycle over again. The comment in this code says "The TT's in some hubs malfunction when they receive this request following a STALL (they stop sending isochronous packets)". That may be what is happening.
Removing the code that returns EPROTO for such case solves the problem on my machine (as in the RFC patch) but that probably is not the right solution. I do not understand USB protocol well enough to propose a better solution. Does anyone have a better idea?
Khalid Aziz (1):
usb: ehci: Remove erroneous return of EPROTO upon detection of stall
drivers/usb/host/ehci-q.c | 4 ---- 1 file changed, 4 deletions(-)
Signature · 1 line
2.25.1
RFC PATCH 1/1 usb: ehci: Remove erroneous return of EPROTO upon detection of stall
With the USB 3.0/3.1 controller on MSI B450-A Pro Max motherboard, full speed and low speed devices see constant resets making keyboards and mouse unreliable and unusable. These resets are caused by detection of stall in qtd_copy_status() and returning EPROTO which in turn results in TT buffers in hub being cleared. Hubs do not seem to repsond well to this and seem to hang which causes further USB transactions to time out. A reset finally clears the issue until we repeat the cycle all over again.
--- drivers/usb/host/ehci-q.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/usb/host/ehci-q.c +0 -4
@@ -214,10 +214,6 @@ static int qtd_copy_status (* When MMF is active and PID Code is IN, queue is halted. * EHCI Specification, Table 4-13. */ - }else if ((token &QTD_STS_MMF ) && - (QTD_PID (token) ==PID_CODE_IN )) { - status = -EPROTO ; -/* CERR nonzero + halt --> stall */ }else if (QTD_CERR (token)) { status = -EPIPE ;
Signature · 1 line
2.25.1
Greg KH
maintainerRe: [RFC PATCH 1/1] usb: ehci: Remove erroneous return of EPROTO upon detection of stall
Quoted 20 lines · Khalid Aziz
With the USB 3.0/3.1 controller on MSI B450-A Pro Max motherboard, full speed and low speed devices see constant resets making keyboards and mouse unreliable and unusable. These resets are caused by detection of stall in
qtd_copy_status()and returning EPROTO which in turn results in TT buffers in hub being cleared. Hubs do not seem to repsond well to this and seem to hang which causes further USB transactions to time out. A reset finally clears the issue until we repeat the cycle all over again.Signed-off-by Khalid Aziz <[email protected]>Cc Khalid Aziz <[email protected]>--- drivers/usb/host/ehci-q.c | 4 ---- 1 file changed, 4 deletions(-)drivers/usb/host/ehci-q.c +0
-0
drivers/usb/host/ehci-q.c static int qtd_copy_status ( · line 219
Quoted 10 lines
drivers/usb/host/ehci-q.c +0
-4@@ -214,10 +214,6 @@ static int qtd_copy_status (* When MMF is active and PID Code is IN, queue is halted. * EHCI Specification, Table 4-13. */ - }else if ((token &QTD_STS_MMF ) && - (QTD_PID (token) ==PID_CODE_IN )) { - status = -EPROTO ; -/* CERR nonzero + halt --> stall */ }else if (QTD_CERR (token)) { status = -EPIPE ;
Removing this check is not a good idea, any chance you can come up with some other test instead for this broken hardware?
What about getting a USB hub that works? :)
thanks,
greg k-h
Re: [RFC PATCH 1/1] usb: ehci: Remove erroneous return of EPROTO upon detection of stall
Quoted 35 lines · Greg KH
Quoted 20 lines · Khalid Aziz
With the USB 3.0/3.1 controller on MSI B450-A Pro Max motherboard, full speed and low speed devices see constant resets making keyboards and mouse unreliable and unusable. These resets are caused by detection of stall in
qtd_copy_status()and returning EPROTO which in turn results in TT buffers in hub being cleared. Hubs do not seem to repsond well to this and seem to hang which causes further USB transactions to time out. A reset finally clears the issue until we repeat the cycle all over again.Signed-off-by Khalid Aziz <[email protected]>Cc Khalid Aziz <[email protected]>--- drivers/usb/host/ehci-q.c | 4 ---- 1 file changed, 4 deletions(-)drivers/usb/host/ehci-q.c +0
-0drivers/usb/host/ehci-q.c static int qtd_copy_status ( · line 219
Quoted 10 lines
drivers/usb/host/ehci-q.c +0
-4@@ -214,10 +214,6 @@ static int qtd_copy_status (* When MMF is active and PID Code is IN, queue is halted. * EHCI Specification, Table 4-13. */ - }else if ((token &QTD_STS_MMF ) && - (QTD_PID (token) ==PID_CODE_IN )) { - status = -EPROTO ; -/* CERR nonzero + halt --> stall */ }else if (QTD_CERR (token)) { status = -EPIPE ;Removing this check is not a good idea, any chance you can come up with some other test instead for this broken hardware?
Quoted 2 lines
What about getting a USB hub that works? :)
I agree removing that check is not the right way to fix this problem. It just so happens, the USB resets disappear when that check is removed. It is more likely that check needs to be refined further to differentiate between a hub that was unplugged (reason for the original commit) and a hub that is seeing split transaction errors on full/low speed devices.
I am not sure if hardware is broken. I currently am using one of the four hubs I have in a working configuration. The hub I was using before motherboard replacement on my desktop stopped working with new motherboard. Suspecting hardware defect on the motherboard, I bought a PCI plug in USB 2.0 card but that showed the same failure. So I got two more USB hubs just in case my existing hubs were broken. In all I tried seven combinations of hardware and five of them failed the same way. Every one of these hubs, keyboards, mouse and tablet works with no problems on my laptop. All high speed and super speed devices (various storage devices I have) work flawlessly on my desktop plugged into any port or any hub. My desktop is a Ryzen 5 3600X in an MSI B450-A pro max motherboard. Previous motherboard on my desktop was an ASRock Z77 Extreme motherboard with Intel core i7-3770. My laptop is an Intel i5-7300U in a Lenovo thinkpad. Somehow hubs are getting set up differently for split transactions full/low speed devices between two machines.
Since I have a working configuration of hardware, my next steps are to use my desktop with working configuration of hardware and then go deeper into USB debugging to find out what is wrong with non-working configurations.
Thanks,
Khalid
Alan Stern
maintainerQuoted 53 lines · Khalid Aziz
[Resending since I screwed up linux-usb mailing list address in cut-n-paste in original email]
I recently replaced the motherboard on my desktop with an MSI B450-A Pro Max motherboard. Since then my keybaords, mouse and tablet have become very unreliable. I see messages like this over and over in dmesg:
ug 23 00:01:49 rhapsody kernel: [198769.314732] usb 1-2.4: reset full-speed USB
device number 27 using ehci-pciAug 23 00:01:49 rhapsody kernel: [198769.562234] usb 1-2.1: reset full-speed USB device number 28 using ehci-pci Aug 23 00:01:52 rhapsody kernel: [198772.570704] usb 1-2.1: reset full-speed USB device number 28 using ehci-pci Aug 23 00:02:02 rhapsody kernel: [198782.526669] usb 1-2.4: reset full-speed USB device number 27 using ehci-pci Aug 23 00:02:03 rhapsody kernel: [198782.714660] usb 1-2.1: reset full-speed USB device number 28 using ehci-pci Aug 23 00:02:04 rhapsody kernel: [198784.210171] usb 1-2.3: reset low-speed USB device number 26 using ehci-pci Aug 23 00:02:06 rhapsody kernel: [198786.110181] usb 1-2.4: reset full-speed USB device number 27 using ehci-pci Aug 23 00:02:08 rhapsody kernel: [198787.726158] usb 1-2.4: reset full-speed USB device number 27 using ehci-pci Aug 23 00:02:10 rhapsody kernel: [198790.126628] usb 1-2.1: reset full-speed USB device number 28 using ehci-pci Aug 23 00:02:10 rhapsody kernel: [198790.314141] usb 1-2.4: reset full-speed USB device number 27 using ehci-pci Aug 23 00:02:12 rhapsody kernel: [198792.518765] usb 1-2.4: reset full-speed USB device number 27 using ehci-pciThe devices I am using are:
- Logitech K360 wireless keyboard
- Wired Lenovo USB keyboard
- Wired Lenovo USB mouse
- Wired Wacom Intuos tabletAfter a reset, the wireless keyboard simply stops working. Rest of the devices keep seeing intermittent failure.
I tried various combinations of hubs and USB controllers to see what works. MSI B450-A motherboard has USB 3.0 and USB 3.1 controllers. I added a USB 2.0 PCI card as well for this test:
03:00.0 USB controller: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset USB 3.1 XHCI Controller (rev 01) 29:01.0 USB controller: NEC Corporation OHCI USB Controller (rev 43)
29:01.1 USB controller: NEC Corporation OHCI USB Controller (rev 43)
29:01.2 USB controller: NEC Corporation uPD72010x USB 2.0 Controller (rev 04)
2c:00.3 USB controller: Advanced Micro Devices, Inc. [AMD] Matisse USB 3.0 Host ControllerI have a bus powered USB 3.0 hub, a bus powered USB 2.0 hub and a self powered USB 2.0 hub built into my monitor.
I have connected my devices directly into the ports on motherboard and PCI card as well as into external hub. Here are the results I saw when devices wee plugged into various combination of ports:
Quoted 8 lines
1. USB 3.0/3.1 controller - does NOT work
2. USB 2.0 controller - WORKS
3. USB 3.0/3.1 controller -> Self powered USB 2.0 hub in monitor - does NOT work
4. USB 3.0/3.1 controller -> bus powered USB 3.0 hub - does NOT work
5. USB 3.0/3.1 controller -> Bus powered USB 2.0 hub - WORKS
7. USB 2.0 controller -> Bus powered USB 3.0 hub - does NOT work
8. USB 2.0 controller -> Bus powered 2.0 hub - Does not work
The error messages in your log extract all refer to ehci-pci, which is the driver for a USB-2 controller. They are completely unrelated to any problems you may be having with USB-3 controllers.
Quoted 47 lines
I narrowed the failure down to following lines (this code was added in 5.5 with commit
64cc3f12d1c7"USB: EHCI: Do not return-EPIPEwhen hub is disconnected"):
drivers/usb/host/ehci-q.c:217 } else if ((token &
QTD_STS_MMF) &&
218 (QTD_PID(token)==PID_CODE_IN)) {
219 status =-EPROTO;
220 /* CERR nonzero + halt --> stall */At the time of failure, when we reach this conditional, token is either
0x80408d46or0x408d46which means following bits are set:
QTD_STS_STS,QTD_STS_MMF,QTD_STS_HALT,QTD_IOC,QTD_TOGGLEand
QTD_PID = 1 QTD_CERR = 3 QTD_LENGTH = 0x40 (64)This causes the branch "(token &
QTD_STS_MMF) && (QTD_PID(token)==PID_CODE_IN" to be taken andqtd_copy_status()returns EPROTO. This return value inqh_completions()results inehci_clear_tt_buffer()being called:
drivers/usb/host/ehci-q.c:
472 /* As part of low/full-speed endpoint-halt processi ng
473 * we must clear the TT buffer (11.17.5).
474 */
475 if (unlikely(last_status !=-EINPROGRESS&&
476last_status!=-EREMOTEIO)) {477 /* The TT's in some hubs malfunction when t hey 478 * receive this request following a STALL ( they 479 * stop sending isochronous packets). Sinc e a 480 * STALL can't leave the TT buffer in a bus y 481 * state (if you believe Figures 11-48 - 11 -51 482 * in the USB 2.0 spec), we won't clear the TT 483 * buffer in this case. Strictly speaking this 484 * is a violation of the spec. 485 */486 if (
last_status!=-EPIPE)
487 ehci_clear_tt_buffer(ehci, qh, urb,
488 token);
489 }
Quoted 5 lines
It seems like clearing TT buffers in this case is resulting in hub hanging. A USB reset gets it going again until we repeat the cycle over again. The comment in this code says "The TT's in some hubs malfunction when they receive this request following a STALL (they stop sending isochronous packets)". That may be what is happening.
What makes you think that? Do you have any evidence that the hub is receiving a STALL? Indeed, the commit you referenced above specifically mentions that when MMF is set and the PID code is IN then it is not a STALL.
Quoted 2 lines
Removing the code that returns EPROTO for such case solves the problem on my machine (as in the RFC patch)
It certainly can't solve the problem for any USB-3 connections, because the patch doesn't touch any of the USB-3 driver code.
Quoted 3 lines
but that probably is not
the right solution. I do not understand USB protocol well enough to propose a better solution. Does anyone have a better idea?
Can you collect a usbmon trace showing an example of this problem?
One possibility is to introduce a special quirk for the NEC uPD72010x EHCI controller. But we should hold off on that until we know exactly what is happening.
Alan Stern
Quoted 63 lines · Alan Stern
Quoted 53 lines · Khalid Aziz
[Resending since I screwed up linux-usb mailing list address in cut-n-paste in original email]
I recently replaced the motherboard on my desktop with an MSI B450-A Pro Max motherboard. Since then my keybaords, mouse and tablet have become very unreliable. I see messages like this over and over in dmesg:
ug 23 00:01:49 rhapsody kernel: [198769.314732] usb 1-2.4: reset full-speed USB
device number 27 using ehci-pciAug 23 00:01:49 rhapsody kernel: [198769.562234] usb 1-2.1: reset full-speed USB device number 28 using ehci-pci Aug 23 00:01:52 rhapsody kernel: [198772.570704] usb 1-2.1: reset full-speed USB device number 28 using ehci-pci Aug 23 00:02:02 rhapsody kernel: [198782.526669] usb 1-2.4: reset full-speed USB device number 27 using ehci-pci Aug 23 00:02:03 rhapsody kernel: [198782.714660] usb 1-2.1: reset full-speed USB device number 28 using ehci-pci Aug 23 00:02:04 rhapsody kernel: [198784.210171] usb 1-2.3: reset low-speed USB device number 26 using ehci-pci Aug 23 00:02:06 rhapsody kernel: [198786.110181] usb 1-2.4: reset full-speed USB device number 27 using ehci-pci Aug 23 00:02:08 rhapsody kernel: [198787.726158] usb 1-2.4: reset full-speed USB device number 27 using ehci-pci Aug 23 00:02:10 rhapsody kernel: [198790.126628] usb 1-2.1: reset full-speed USB device number 28 using ehci-pci Aug 23 00:02:10 rhapsody kernel: [198790.314141] usb 1-2.4: reset full-speed USB device number 27 using ehci-pci Aug 23 00:02:12 rhapsody kernel: [198792.518765] usb 1-2.4: reset full-speed USB device number 27 using ehci-pciThe devices I am using are:
- Logitech K360 wireless keyboard
- Wired Lenovo USB keyboard
- Wired Lenovo USB mouse
- Wired Wacom Intuos tabletAfter a reset, the wireless keyboard simply stops working. Rest of the devices keep seeing intermittent failure.
I tried various combinations of hubs and USB controllers to see what works. MSI B450-A motherboard has USB 3.0 and USB 3.1 controllers. I added a USB 2.0 PCI card as well for this test:
03:00.0 USB controller: Advanced Micro Devices, Inc. [AMD] 400 Series Chipset USB 3.1 XHCI Controller (rev 01) 29:01.0 USB controller: NEC Corporation OHCI USB Controller (rev 43)
29:01.1 USB controller: NEC Corporation OHCI USB Controller (rev 43)
29:01.2 USB controller: NEC Corporation uPD72010x USB 2.0 Controller (rev 04)
2c:00.3 USB controller: Advanced Micro Devices, Inc. [AMD] Matisse USB 3.0 Host ControllerI have a bus powered USB 3.0 hub, a bus powered USB 2.0 hub and a self powered USB 2.0 hub built into my monitor.
I have connected my devices directly into the ports on motherboard and PCI card as well as into external hub. Here are the results I saw when devices wee plugged into various combination of ports:
Quoted 8 lines
1. USB 3.0/3.1 controller - does NOT work
2. USB 2.0 controller - WORKS
3. USB 3.0/3.1 controller -> Self powered USB 2.0 hub in monitor - does NOT work
4. USB 3.0/3.1 controller -> bus powered USB 3.0 hub - does NOT work
5. USB 3.0/3.1 controller -> Bus powered USB 2.0 hub - WORKS
7. USB 2.0 controller -> Bus powered USB 3.0 hub - does NOT work
8. USB 2.0 controller -> Bus powered 2.0 hub - Does not work
Quoted 3 lines
The error messages in your log extract all refer to ehci-pci, which is the driver for a USB-2 controller. They are completely unrelated to any problems you may be having with USB-3 controllers.
I just happened to cut and paste the messages from when I was testing with the USB 2.0 controller. Here are the messages when I ran the test with USB 3.0 controller:
Aug 13 14:25:48 rhapsody kernel: [78779.868354] usb 1-9.4: reset full-speed USB device number 38 using xhci_hcd Aug 13 14:26:18 rhapsody kernel: [78809.939457] usb 1-9.4: reset full-speed USB device number 38 using xhci_hcd Aug 13 14:26:39 rhapsody kernel: [78830.899982] usb 1-9.4: reset full-speed USB device number 38 using xhci_hcd Aug 13 14:26:39 rhapsody kernel: [78831.379883] usb 1-9.2: reset low-speed USB device number 36 using xhci_hcd Aug 13 14:26:40 rhapsody kernel: [78832.043900] usb 1-9.3: reset low-speed USB device number 37 using xhci_hcd Aug 13 14:26:47 rhapsody kernel: [78839.520211] usb 1-9.4: reset full-speed USB device number 38 using xhci_hcd Aug 13 14:26:49 rhapsody kernel: [78841.035843] usb 1-9.2: reset low-speed USB device number 36 using xhci_hcd Aug 13 14:26:50 rhapsody kernel: [78841.695837] usb 1-9.3: reset low-speed USB device number 37 using xhci_hcd Aug 13 14:27:57 rhapsody kernel: [78909.299772] usb 1-9.4: reset full-speed USB device number 38 using xhci_hcd Aug 13 14:27:58 rhapsody kernel: [78909.779179] usb 1-9.2: reset low-speed USB device number 36 using xhci_hcd Aug 13 14:28:05 rhapsody kernel: [78916.650851] usb 1-9.4: reset full-speed USB device number 38 using xhci_hcd Aug 13 14:32:02 rhapsody kernel: [79153.986777] usb 1-9.4: reset full-speed USB device number 38 using xhci_hcd Aug 13 14:32:22 rhapsody kernel: [79173.898757] usb 1-9.4: reset full-speed USB device number 38 using xhci_hcd Aug 13 14:32:23 rhapsody kernel: [79175.174206] usb 1-9.3: reset low-speed USB device number 37 using xhci_hcd Aug 13 14:32:24 rhapsody kernel: [79175.833619] usb 1-9.2: reset low-speed USB device number 36 using xhci_hcd Aug 13 14:34:23 rhapsody kernel: [79295.230293] usb 1-9.4: reset
full-speed USB device number 38 using xhci_hcd
Quoted 54 lines
Quoted 48 lines
I narrowed the failure down to following lines (this code was added in 5.5 with commit
64cc3f12d1c7"USB: EHCI: Do not return-EPIPEwhen hub is disconnected"):
drivers/usb/host/ehci-q.c:217 } else if ((token &
QTD_STS_MMF) &&
218 (QTD_PID(token)==PID_CODE_IN)) {
219 status =-EPROTO;
220 /* CERR nonzero + halt --> stall */At the time of failure, when we reach this conditional, token is either
0x80408d46or0x408d46which means following bits are set:
QTD_STS_STS,QTD_STS_MMF,QTD_STS_HALT,QTD_IOC,QTD_TOGGLEand
QTD_PID = 1 QTD_CERR = 3 QTD_LENGTH = 0x40 (64)This causes the branch "(token &
QTD_STS_MMF) && (QTD_PID(token)==PID_CODE_IN" to be taken andqtd_copy_status()returns EPROTO. This return value inqh_completions()results inehci_clear_tt_buffer()being called:
drivers/usb/host/ehci-q.c:
472 /* As part of low/full-speed endpoint-halt processi ng
473 * we must clear the TT buffer (11.17.5).
474 */
475 if (unlikely(last_status !=-EINPROGRESS&&
476last_status!=-EREMOTEIO)) {477 /* The TT's in some hubs malfunction when t hey 478 * receive this request following a STALL ( they 479 * stop sending isochronous packets). Sinc e a 480 * STALL can't leave the TT buffer in a bus y 481 * state (if you believe Figures 11-48 - 11 -51 482 * in the USB 2.0 spec), we won't clear the TT 483 * buffer in this case. Strictly speaking this 484 * is a violation of the spec. 485 */486 if (
last_status!=-EPIPE)
487 ehci_clear_tt_buffer(ehci, qh, urb,
488 token);
489 }Quoted 5 lines
It seems like clearing TT buffers in this case is resulting in hub hanging. A USB reset gets it going again until we repeat the cycle over again. The comment in this code says "The TT's in some hubs malfunction when they receive this request following a STALL (they stop sending isochronous packets)". That may be what is happening.
Quoted 5 lines
What makes you think that? Do you have any evidence that the hub is receiving a STALL? Indeed, the commit you referenced above specifically mentions that when MMF is set and the PID code is IN then it is not a STALL.
You are probably right about that. I do not understand USB protocol well enough. Eliminating clearing TT buffers when split transaction is incomplete fixed the problem for me. If I changed qtd_copy_status() to return EPIPE as it was doing before commit 64cc3f12d1c7, USB resets went away on my machine, so I am wondering if the comment at drivers/usb/host/ehci-q.c:477 is applicable here.
Quoted 5 lines
Quoted 2 lines
Removing the code that returns EPROTO for such case solves the problem on my machine (as in the RFC patch)
It certainly can't solve the problem for any USB-3 connections, because the patch doesn't touch any of the USB-3 driver code.
Right. It solves the problem I see with USB 2.0 controller. I continue to see issues with USB 3.0 if I move the hub to a USB 3.0 port.
Quoted 6 lines
Quoted 4 lines
but that probably is not
the right solution. I do not understand USB protocol well enough to propose a better solution. Does anyone have a better idea?Can you collect a usbmon trace showing an example of this problem?
Sure. I will do that. Tracing the code when debugging for USB 2.0 controller led me to that specific line of code. As I said, I do not understand USB well enough to say if changing that code is the right solution, and it indeed solves the problem for USB 2.0 only.
Quoted 4 lines
One possibility is to introduce a special quirk for the NEC uPD72010x EHCI controller. But we should hold off on that until we know exactly what is happening.
I do not believe whatever is causing USB resets is unique to NEC chip. I am seeing issues on the USB 3.0 controllers as well.
Quoted 3 lines
Alan Stern
Thanks,
Khalid
Alan Stern
maintainerQuoted 7 lines · Khalid Aziz
Quoted 7 lines
Quoted 7 lines
At the time of failure, when we reach this conditional, token is either
0x80408d46or0x408d46which means following bits are set:
QTD_STS_STS,QTD_STS_MMF,QTD_STS_HALT,QTD_IOC,QTD_TOGGLEand
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
QTD_PID = 1 QTD_CERR = 3 QTD_LENGTH = 0x40 (64)This causes the branch "(token &
QTD_STS_MMF) && (QTD_PID(token)==PID_CODE_IN" to be taken andqtd_copy_status()returns EPROTO. This return value inqh_completions()results inehci_clear_tt_buffer()being called:
I didn't mention this before, but that combination of events doesn't make sense. The MMF bit is supposed to get set only for queue heads in the periodic list, that is, only for interrupt transactions. But ehci_clear_tt_buffer() doesn't do anything for interrupt endpoints; it tests specifically for that right at the start.
Maybe your EHCI controller is setting the MMF bit when it shouldn't. The usbmon output will help clear this up.
Or maybe the hubs you are testing don't work right. That's the only reason I can think of for the failures you see with the USB-3 controller; the way it operates is very different from the way EHCI does.
Alan Stern
A message that is not in the archive (sent off-list or not yet received): [email protected]
Alan Stern
maintainerQuoted 7 lines · Khalid Aziz
Quoted 2 lines · Alan Stern
Can you collect a usbmon trace showing an example of this problem?
I have attached usbmon traces for when USB hub with keyboards and mouse is plugged into USB 2.0 port and when it is plugged into the NEC USB 3.0 port.
The usbmon traces show lots of errors, but no Clear-TT events. The large number of errors suggests that you've got a hardware problem; either a bad hub or bad USB connections.
Alan Stern
Quoted 5 lines · Alan Stern
Quoted 4 lines · Khalid Aziz
Quoted 2 lines · Alan Stern
Can you collect a usbmon trace showing an example of this problem?
Quoted 7 lines
Quoted 3 lines
I have attached usbmon traces for when USB hub with keyboards and mouse is plugged into USB 2.0 port and when it is plugged into the NEC USB 3.0 port.
The usbmon traces show lots of errors, but no Clear-TT events. The large number of errors suggests that you've got a hardware problem; either a bad hub or bad USB connections.
That is what I thought initially which is why I got additional hubs and a USB 2.0 PCI card to test. I am seeing errors across 3 USB controllers, 4 USB hubs and 4 slow/full speed devices. All of the hubs and slow/full devices work with zero errors on my laptop. My keyboard/mouse devices and 2 of my USB hubs predate motherboard update and they all worked flawlessly before the motherboard upgrade. Some combinations of these also works with no errors on my desktop with new motherboard that I had listed in my original email:
2. USB 2.0 controller - WORKS
5. USB 3.0/3.1 controller -> Bus powered USB 2.0 hub - WORKS
I am not seeing a common failure here that would point to any specific hardware being bad. Besides, that one code change (which I still can't say is the right code change) in ehci-q.c makes USB 2.0 controller work reliably with all my devices.
--
Khalid
Alan Stern
maintainerQuoted 14 lines · Khalid Aziz
Quoted 5 lines · Alan Stern
Quoted 4 lines · Khalid Aziz
Quoted 2 lines · Alan Stern
Can you collect a usbmon trace showing an example of this problem?
Quoted 7 lines
Quoted 3 lines
I have attached usbmon traces for when USB hub with keyboards and mouse is plugged into USB 2.0 port and when it is plugged into the NEC USB 3.0 port.
The usbmon traces show lots of errors, but no Clear-TT events. The large number of errors suggests that you've got a hardware problem; either a bad hub or bad USB connections.
Quoted 8 lines
That is what I thought initially which is why I got additional hubs and a USB 2.0 PCI card to test. I am seeing errors across 3 USB controllers, 4 USB hubs and 4 slow/full speed devices. All of the hubs and slow/full devices work with zero errors on my laptop. My keyboard/mouse devices and 2 of my USB hubs predate motherboard update and they all worked flawlessly before the motherboard upgrade. Some combinations of these also works with no errors on my desktop with new motherboard that I had listed in my original email:
It's a very puzzling situation.
One thing which probably would work well, surprisingly, would be to buy an old USB-1.1 hub and plug it into the PCI card. That combination is likely to be similar to what you see when plugging the devices directly into the PCI card. It might even work okay with the USB-3 controllers.
Quoted 7 lines
2. USB 2.0 controller - WORKS
5. USB 3.0/3.1 controller -> Bus powered USB 2.0 hub - WORKSI am not seeing a common failure here that would point to any specific hardware being bad. Besides, that one code change (which I still can't say is the right code change) in
ehci-q.cmakes USB 2.0 controller work reliably with all my devices.
The USB and EHCI designs are flawed in that under the circumstances you're seeing, they don't have any way to tell the difference between a STALL and a host timing error. The current code treats these situations as timing/transmission errors (resulting in device resets); your change causes them to be treated as STALLs. However, there are known, common situations in which those same symptoms really are caused by transmission errors, so we don't want to start treating them as STALLs.
Besides, I suspect that your code change does _not_ make the USB-2 controller work reliably with your devices. You should collect a usbmon trace under those conditions; I predict it will be full of STALLs. And furthermore, I believe these STALLs will not show up in a usbmon trace made with the devices plugged directly into the PCI card. If I'm right about these things, the errors are still present even with your patch; all it does is hide them.
Short of a USB bus analyzer, however, there's no way to tell what's really going on.
Alan Stern
Quoted 55 lines · Alan Stern
Quoted 14 lines · Khalid Aziz
Quoted 5 lines · Alan Stern
Quoted 4 lines · Khalid Aziz
Quoted 2 lines · Alan Stern
Can you collect a usbmon trace showing an example of this problem?
Quoted 7 lines
Quoted 3 lines
I have attached usbmon traces for when USB hub with keyboards and mouse is plugged into USB 2.0 port and when it is plugged into the NEC USB 3.0 port.
The usbmon traces show lots of errors, but no Clear-TT events. The large number of errors suggests that you've got a hardware problem; either a bad hub or bad USB connections.
Quoted 8 lines
That is what I thought initially which is why I got additional hubs and a USB 2.0 PCI card to test. I am seeing errors across 3 USB controllers, 4 USB hubs and 4 slow/full speed devices. All of the hubs and slow/full devices work with zero errors on my laptop. My keyboard/mouse devices and 2 of my USB hubs predate motherboard update and they all worked flawlessly before the motherboard upgrade. Some combinations of these also works with no errors on my desktop with new motherboard that I had listed in my original email:
It's a very puzzling situation.
One thing which probably would work well, surprisingly, would be to buy an old USB-1.1 hub and plug it into the PCI card. That combination is likely to be similar to what you see when plugging the devices directly into the PCI card. It might even work okay with the USB-3 controllers.
Quoted 7 lines
2. USB 2.0 controller - WORKS
5. USB 3.0/3.1 controller -> Bus powered USB 2.0 hub - WORKSI am not seeing a common failure here that would point to any specific hardware being bad. Besides, that one code change (which I still can't say is the right code change) in
ehci-q.cmakes USB 2.0 controller work reliably with all my devices.The USB and EHCI designs are flawed in that under the circumstances you're seeing, they don't have any way to tell the difference between a STALL and a host timing error. The current code treats these situations as timing/transmission errors (resulting in device resets); your change causes them to be treated as STALLs. However, there are known, common situations in which those same symptoms really are caused by transmission errors, so we don't want to start treating them as STALLs.
Besides, I suspect that your code change does _not_ make the USB-2 controller work reliably with your devices. You should collect a usbmon trace under those conditions; I predict it will be full of STALLs. And furthermore, I believe these STALLs will not show up in a usbmon trace made with the devices plugged directly into the PCI card. If I'm right about these things, the errors are still present even with your patch; all it does is hide them.
Quoted 2 lines
Short of a USB bus analyzer, however, there's no way to tell what's really going on.
I have managed to find a hardware combination that seems to work, so for now at least my machine is usable. I will figure out how to interpret usbmon output and run more experiments. There seems to be a real problem in the driver somewhere and should be solved.
Thanks,
Khalid
Alan Stern
maintainerQuoted 4 lines · Khalid Aziz
I have managed to find a hardware combination that seems to work, so for now at least my machine is usable. I will figure out how to interpret usbmon output and run more experiments. There seems to be a real problem in the driver somewhere and should be solved.
Correction: You're using two different drivers. Although it's not impossible, it seems very unlikely that they both contain the same bug.
Alan Stern