[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