static void musb_ep_program(struct musb *musb, u8 epnum,
struct urb *urb, unsigned int nOut,
- u8 * buf, u32 len);
+ u8 *buf, u32 len);
/*
* Clear TX fifo. Needed to avoid BABBLE errors.
case USB_ENDPOINT_XFER_BULK: s = "-bulk"; break;
case USB_ENDPOINT_XFER_ISOC: s = "-iso"; break;
default: s = "-intr"; break;
- }; s;}),
+ }; s; }),
epnum, buf, len);
/* Configure endpoint */
} else {
qh->frame = urb->start_frame;
/* enable SOF interrupt so we can count down */
-DBG(1,"SOF for %d\n", epnum);
+ DBG(1, "SOF for %d\n", epnum);
#if 1 /* ifndef CONFIG_ARCH_DAVINCI */
musb_writeb(mbase, MUSB_INTRUSBE, 0xff);
#endif
qh = hw_ep->in_qh;
else
qh = hw_ep->out_qh;
- qh = musb_giveback(qh, urb, 0);
+
+ if (urb->status == -EINPROGRESS)
+ qh = musb_giveback(qh, urb, 0);
+ else
+ qh = musb_giveback(qh, urb, urb->status);
if (qh && qh->is_ready && !list_empty(&qh->hep->urb_list)) {
DBG(4, "... next ep%d %cX urb %p\n",
* leave toggle alone (may not have been saved yet)
*/
csr |= MUSB_RXCSR_FLUSHFIFO | MUSB_RXCSR_RXPKTRDY;
- csr &= ~( MUSB_RXCSR_H_REQPKT
+ csr &= ~(MUSB_RXCSR_H_REQPKT
| MUSB_RXCSR_H_AUTOREQ
- | MUSB_RXCSR_AUTOCLEAR
- );
+ | MUSB_RXCSR_AUTOCLEAR);
/* write 2x to allow double buffering */
musb_writew(hw_ep->regs, MUSB_RXCSR, csr);
} else {
csr = musb_readw(ep->regs, MUSB_RXCSR);
if (csr & MUSB_RXCSR_RXPKTRDY)
- WARN("rx%d, packet/%d ready?\n", ep->epnum,
+ WARNING("rx%d, packet/%d ready?\n", ep->epnum,
musb_readw(ep->regs, MUSB_RXCOUNT));
musb_h_flush_rxfifo(ep, MUSB_RXCSR_CLRDATATOG);
*/
static void musb_ep_program(struct musb *musb, u8 epnum,
struct urb *urb, unsigned int is_out,
- u8 * buf, u32 len)
+ u8 *buf, u32 len)
{
struct dma_controller *dma_controller;
struct dma_channel *dma_channel;
csr &= ~(MUSB_TXCSR_AUTOSET
| MUSB_TXCSR_DMAMODE
| MUSB_TXCSR_DMAENAB);
- csr |= MUSB_TXCSR_MODE;
+ csr |= MUSB_TXCSR_MODE;
musb_writew(epio, MUSB_TXCSR,
csr | MUSB_TXCSR_MODE);
* we have a candidate... NAKing is *NOT* an error
*/
musb_ep_select(mbase, epnum);
- musb_writew(epio, MUSB_CSR0,
+ musb_writew(epio, MUSB_TXCSR,
MUSB_TXCSR_H_WZC_BITS
| MUSB_TXCSR_TXPKTRDY);
goto finish;
if (qh->segsize < qh->maxpacket)
done = true;
else if (qh->offset == urb->transfer_buffer_length
- && !(urb-> transfer_flags
- & URB_ZERO_PACKET))
+ && !(urb->transfer_flags
+ & URB_ZERO_PACKET))
done = true;
if (!done) {
buf = urb->transfer_buffer
pipe = urb->pipe;
- DBG(5, "<== hw %d rxcsr %04x, urb actual %d (+dma %zd)\n",
+ DBG(5, "<== hw %d rxcsr %04x, urb actual %d (+dma %zu)\n",
epnum, rx_csr, urb->actual_length,
dma ? dma->actual_len : 0);
(void) musb->dma_controller->channel_abort(dma);
xfer_len = dma->actual_len;
}
- musb_h_flush_rxfifo(hw_ep, 0);
+ musb_h_flush_rxfifo(hw_ep, MUSB_RXCSR_CLRDATATOG);
musb_writeb(epio, MUSB_RXINTERVAL, 0);
done = true;
goto finish;
done = true;
}
- DBG(2, "RXCSR%d %04x, reqpkt, len %zd%s\n", epnum, rx_csr,
+ DBG(2, "RXCSR%d %04x, reqpkt, len %zu%s\n", epnum, rx_csr,
xfer_len, dma ? ", dma" : "");
rx_csr &= ~MUSB_RXCSR_H_REQPKT;
if (dma) {
struct dma_controller *c;
u16 rx_count;
- int status;
+ int ret;
rx_count = musb_readw(epio, MUSB_RXCOUNT);
* transfer_buffer_length needs to be
* adjusted first...
*/
- status = c->channel_program(
+ ret = c->channel_program(
dma, qh->maxpacket,
dma->desired_mode,
urb->transfer_dma
? rx_count
: urb->transfer_buffer_length);
- if (!status) {
+ if (!ret) {
c->channel_release(dma);
dma = hw_ep->rx_channel = NULL;
/* REVISIT reset CSR */
if (!is_host_active(musb) || !musb->is_active)
return -ENODEV;
+ spin_lock_irqsave(&musb->lock, flags);
ret = usb_hcd_link_urb_to_ep(hcd, urb);
+ spin_unlock_irqrestore(&musb->lock, flags);
if (ret)
return ret;
} else {
musb_h_tx_flush_fifo(ep);
csr = musb_readw(epio, MUSB_TXCSR);
- csr &= ~( MUSB_TXCSR_AUTOSET
+ csr &= ~(MUSB_TXCSR_AUTOSET
| MUSB_TXCSR_DMAENAB
| MUSB_TXCSR_H_RXSTALL
| MUSB_TXCSR_H_NAKTIMEOUT
| MUSB_TXCSR_H_ERROR
- | MUSB_TXCSR_TXPKTRDY
- );
+ | MUSB_TXCSR_TXPKTRDY);
musb_writew(epio, MUSB_TXCSR, csr);
/* REVISIT may need to clear FLUSHFIFO ... */
musb_writew(epio, MUSB_TXCSR, csr);
return 0;
if (is_host_active(musb) && musb->is_active) {
- WARN("trying to suspend as %s is_active=%i\n",
+ WARNING("trying to suspend as %s is_active=%i\n",
otg_state_string(musb), musb->is_active);
return -EBUSY;
} else
const struct hc_driver musb_hc_driver = {
.description = "musb-hcd",
.product_desc = "MUSB HDRC host driver",
- .hcd_priv_size = sizeof (struct musb),
+ .hcd_priv_size = sizeof(struct musb),
.flags = HCD_USB2 | HCD_MEMORY,
/* not using irq handler or reset hooks from usbcore, since