From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marek Vasut Date: Fri, 14 Sep 2012 02:43:28 +0200 Subject: [U-Boot] [PATCH] USB: musb_udc: Bugfix musb_peri_rx_ep In-Reply-To: <1347557191-32760-1-git-send-email-trini@ti.com> References: <1347557191-32760-1-git-send-email-trini@ti.com> Message-ID: <201209140243.28372.marex@denx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de Dear Tom Rini, > From: Pankaj Bharadiya > > 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 > Signed-off-by: Tom Rini > --- > 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)) { if (!cond) return; This will cut down one indent below. > + 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); So ... if (error) print error and die. if (!remaining_space && debug_level) print and die. { rest of the function, as above } One more indent level down. Apply common sense to the other else {} and it's work out. > + } > } 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 " use printf(), serial_printf is flat out forbidden and this is a NACK /!\ > + "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); > } > } Best regards, Marek Vasut