Skip to contentSkip to conversation

musb_hdrc: disable sending PING packet in host mode.

PATCH In review Bryan Wu 1 participant 2 messages Dec 20, 2007 – Dec 21, 2007 1 message not in the archive

Subsystems (2)
lore
Share & tools
lore

Bryan Wu

author
#0 lore raw

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
index 2ad2ed9..34a2991 100644
@@ -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]

author
#2 lore raw
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=3778

The 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
---
 drivers/usb/musb/musb_host.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)
drivers/usb/musb/musb_host.c +0 -0
index 2ad2ed9..34a2991 100644
@@ -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