musb_hdrc: disable sending PING packet in host mode.
Subsystems (2)
PATCH 1/1 musb_hdrc: disable sending PING packet in host mode.
From: Bryan Wu <[email protected]>
Date: Thu, 20 Dec 2007 15:25:34 +0800
Subject: [PATCH] [MUSB] musb_hdrc: disable sending PING packet in host mode.
Some High Speed USB stick does not answer PING pakcet correctly, so the USB enumeration will fail in MUSB host mode.
Disable using PING packet in host mode, almost all the USB stick enumeration is OK on Blackfin BF54x/BF52x platform. I hope this is a common problem in other MUSB platform.
This bug is tracked here:
https://blackfin.uclinux.org/gf/project/uclinux-dist/tracker/?action=TrackerItemEdit&tracker_id=141&tracker_item_id=3778
--- drivers/usb/musb/musb_host.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
drivers/usb/musb/musb_host.c +2 -0
@@ -1112,6 +1112,8 @@ irqreturn_t musb_h_ep0_irq(struct musb *musb) csr =MUSB_CSR0_H_STATUSPKT |MUSB_CSR0_TXPKTRDY ; + csr |=MUSB_CSR0_H_DIS_PING ; +/* flag status stage */ musb->ep0_stage =MUSB_EP0_STATUS ;
Signature · 1 line
1.5.3
A message that is not in the archive (sent off-list or not yet received): [email protected]
Quoted 9 lines · David Brownell
Quoted 8 lines · Bryan Wu
From: Bryan Wu <[email protected]>
Date: Thu, 20 Dec 2007 15:25:34 +0800
Subject: [PATCH] [MUSB]musb_hdrc: disable sending PING packet in host mode.Some High Speed USB stick does not answer PING pakcet correctly, so the USB enumeration will fail in MUSB host mode.
Quoted 9 lines
Quoted 6 lines
Disable using PING packet in host mode, almost all the USB stick enumeration is OK on Blackfin BF54x/BF52x platform. I hope this is a common problem in other MUSB platform.
This bug is tracked here:
https://blackfin.uclinux.org/gf/project/uclinux-dist/tracker/?action=TrackerItemEdit&tracker_id=141&tracker_item_id=3778The referenced PNG images aren't listed in that bug report. :)
The bug was reported by a customer and I also found a USB stick reproducing the bug. So the PNG pictures were attached in our forum at following URL:
https://blackfin.uclinux.org/gf/project/uclinux-dist/forum/?action=ForumBrowse&forum_id=39&_forum_action=ForumMessageBrowse&thread_id=24780
Quoted 14 lines
Quoted 14 lines
Signed-off-by Bryan Wu <[email protected]>--- drivers/usb/musb/musb_host.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)drivers/usb/musb/musb_host.c +0
-0@@ -1112,6 +1112,8 @@ irqreturn_t musb_h_ep0_irq(struct musb *musb) csr =MUSB_CSR0_H_STATUSPKT |MUSB_CSR0_TXPKTRDY ;
Quoted 8 lines
drivers/usb/musb/musb_host.c irqreturn_t musb_h_ep0_irq(struct musb *musb) · line 1116
Quoted 2 lines
drivers/usb/musb/musb_host.c +2
-0+ csr |=MUSB_CSR0_H_DIS_PING ; +Is PING actually allowed for control endpoints? I'm not entirely sure this wouldn't be a case of "make the driver follow the specs"... don't have time just now to check what the USB 2.0 spec says.
Yes, according to USB 2.0 spec, the control and bulk endpoints of High-Speed devices should answer NAK/ACK to PING packet. I think the MUSB driver follows the spec without my patch. But some USB sticks are not follows this, the control endpoint never answer ACK to PING, always NAK. This endless NAK will be stopped by MUSB upper USB stack by resetting. So this kind USB sticks can not enumerate with MUSB driver.
I test the same problem USB sticks on Linux PC host. There is no PING for control endpoint.
Because in EHCI spec, there is a status bit named PING status bit in the qTD. You can found it in Section 4.11 "Ping Control" of the EHCI spec. EHCI HCD can choose ping or not.
Do you know how to decide to ping or not in MUSB?
I have an idea: the USB_NAKLIMIT0 should be set to some value, when we got NAK timeout interrupt, we can disable PING. When enumerating normal USB stick, there is no NAK timeout, because PING is efficient for handshaking. While problem USB stick will generate NAK timeout interrupt, we disable PING for this kind of USB device enumeration.
Thanks
Regards,
-Bryan