[U-Boot] [PATCH] USB: musb_udc: Bugfix musb_peri_rx_ep

Tom Rini trini at ti.com
Thu Sep 13 19:26:31 CEST 2012


From: Pankaj Bharadiya <pankaj.bharadiya at ti.com>

The endpoint rx count register value will be zero if it is read before
receive packet ready bit (PERI_RXCSR:RXPKTRDY) is set.

Check for the receive packet ready bit (PERI_RXCSR:RXPKTRDY) before
reading endpoint rx count register. Proceed with rx count read and
FIFO read only if RXPKTRDY bit is set.

As this makes the function fit less-well within 80 columns, use __func__
in some debug statements rather than __PRETTY_FUNCTION__ as they are
identical for C programs.

Signed-off-by: Pankaj Bharadiya <pankaj.bharadiya at ti.com>
Signed-off-by: Tom Rini <trini at ti.com>
---
 drivers/usb/musb/musb_udc.c |   97 +++++++++++++++++++++++--------------------
 1 file changed, 52 insertions(+), 45 deletions(-)

diff --git a/drivers/usb/musb/musb_udc.c b/drivers/usb/musb/musb_udc.c
index 09cdec3..7180de8 100644
--- a/drivers/usb/musb/musb_udc.c
+++ b/drivers/usb/musb/musb_udc.c
@@ -640,58 +640,65 @@ static void musb_peri_ep0(void)
 
 static void musb_peri_rx_ep(unsigned int ep)
 {
-	u16 peri_rxcount = readw(&musbr->ep[ep].epN.rxcount);
-
-	if (peri_rxcount) {
-		struct usb_endpoint_instance *endpoint;
-		u32 length;
-		u8 *data;
-
-		endpoint = GET_ENDPOINT(udc_device, ep);
-		if (endpoint && endpoint->rcv_urb) {
-			struct urb *urb = endpoint->rcv_urb;
-			unsigned int remaining_space = urb->buffer_length -
-				urb->actual_length;
-
-			if (remaining_space) {
-				int urb_bad = 0; /* urb is good */
-
-				if (peri_rxcount > remaining_space)
-					length = remaining_space;
-				else
-					length = peri_rxcount;
-
-				data = (u8 *) urb->buffer_data;
-				data += urb->actual_length;
-
-				/* The common musb fifo reader */
-				read_fifo(ep, length, data);
-
-				musb_peri_rx_ack(ep);
-
-				/*
-				 * urb's actual_length is updated in
-				 * usbd_rcv_complete
-				 */
-				usbd_rcv_complete(endpoint, length, urb_bad);
+	u8 peri_rxcsr = readw(&musbr->ep[ep].epN.rxcsr);
+	if ((peri_rxcsr & MUSB_RXCSR_RXPKTRDY)) {
+		u16 peri_rxcount = readw(&musbr->ep[ep].epN.rxcount);
+		if (peri_rxcount) {
+			struct usb_endpoint_instance *endpoint;
+			u32 length;
+			u8 *data;
 
+			endpoint = GET_ENDPOINT(udc_device, ep);
+			if (endpoint && endpoint->rcv_urb) {
+				struct urb *urb = endpoint->rcv_urb;
+				unsigned int remaining_space =
+					urb->buffer_length -
+					urb->actual_length;
+
+				if (remaining_space) {
+					int urb_bad = 0; /* urb is good */
+
+					if (peri_rxcount > remaining_space)
+						length = remaining_space;
+					else
+						length = peri_rxcount;
+
+					data = (u8 *) urb->buffer_data;
+					data += urb->actual_length;
+
+					/* The common musb fifo reader */
+					read_fifo(ep, length, data);
+
+					musb_peri_rx_ack(ep);
+
+					/*
+					 * urb's actual_length is updated in
+					 * usbd_rcv_complete
+					 */
+					usbd_rcv_complete(endpoint, length,
+							urb_bad);
+
+				} else {
+					if (debug_level > 0)
+						serial_printf("ERROR : %s %d"
+								" no space "
+								"in rcv "
+								"buffer\n",
+								__func__,
+								ep);
+				}
 			} else {
 				if (debug_level > 0)
-					serial_printf("ERROR : %s %d no space "
-						      "in rcv buffer\n",
-						      __PRETTY_FUNCTION__, ep);
+					serial_printf("ERROR : %s %d problem "
+							"with endpoint\n",
+							__func__, ep);
+
 			}
 		} else {
 			if (debug_level > 0)
-				serial_printf("ERROR : %s %d problem with "
-					      "endpoint\n",
-					      __PRETTY_FUNCTION__, ep);
+				serial_printf("ERROR : %s %d with nothing "
+					"to do\n", __func__, ep);
 		}
-
-	} else {
-		if (debug_level > 0)
-			serial_printf("ERROR : %s %d with nothing to do\n",
-				      __PRETTY_FUNCTION__, ep);
 	}
 }
 
-- 
1.7.9.5



More information about the U-Boot mailing list