[PATCH] usb:musb: Fix for Full Speed issue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



After sending the USB Bus reset, Host waits for High Speed Chirps.
If the soft-disconnect and soft-connect happens during this chirp time,
then Host doesn't detect this disconnect.
Host treats this as Full Speed Device as there are no chirps.
To avoid this Full Speed Enumeration, soft-disconnect and soft-connect
should have a 500 mili-second gap when USB cable is connected.

Signed-off-by: Ajay Jawade <ajay.jawade@xxxxxxxxxxxxxx>
Acked-by: srinidhi kasagar <srinidhi.kasagar@xxxxxxxxxxxxxx>
---
 drivers/usb/musb/musb_gadget.c |   26 ++++++++++++++++++++++++++
 1 files changed, 26 insertions(+), 0 deletions(-)

diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index f7194cf..801dbe6 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -1743,6 +1743,7 @@ static int musb_gadget_pullup(struct usb_gadget *gadget, int is_on)  {
 	struct musb	*musb = gadget_to_musb(gadget);
 	unsigned long	flags;
+	u8 devctl;
 
 	is_on = !!is_on;
 
@@ -1751,6 +1752,31 @@ static int musb_gadget_pullup(struct usb_gadget *gadget, int is_on)
 	/* NOTE: this assumes we are sensing vbus; we'd rather
 	 * not pullup unless the B-session is active.
 	 */
+
+	/* After sending the USB Bus reset, Host waits for
+	 * High Speed Chirps. If the soft-disconnect and soft-connect
+	 * happens during this chirp time, then Host doesn't
+	 * detect this disconnect. Host treats this as Full Speed
+	 * Device as there are no chirps. To avoid this Full Speed
+	 * Enumeration, soft-disconnect and soft-connect should have
+	 * a 500 mili-second delay when USB cable is connected.
+	 */
+
+	if (is_on && (is_on != musb->softconnect)) {
+
+		/* USB cable presence is decided by reading the VBUS
+		 * Level bits of DevCtl register.
+		 */
+
+		devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
+		devctl = (devctl & MUSB_DEVCTL_VBUS) >> MUSB_DEVCTL_VBUS_SHIFT;
+
+		if (devctl != 0) {
+			/* USB Cable is connected. Delay the soft-connect */
+			msleep(500);
+		}
+	}
+
 	spin_lock_irqsave(&musb->lock, flags);
 	if (is_on != musb->softconnect) {
 		musb->softconnect = is_on;
--
1.7.4.3

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux