summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: a7d48ca)
raw | patch | inline | side by side (parent: a7d48ca)
author | Ravi B <ravibabu@ti.com> | |
Tue, 14 Jun 2011 18:20:57 +0000 (23:50 +0530) | ||
committer | Vaibhav Hiremath <hvaibhav@ti.com> | |
Mon, 23 Jan 2012 19:14:11 +0000 (00:44 +0530) |
ISO doesn't work without this patch as CPPI DMA is not even
programmed for ISO IN transfer.
Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
Signed-off-by: Vaibhav Hiremath <hvaibhav@ti.com>
programmed for ISO IN transfer.
Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
Signed-off-by: Vaibhav Hiremath <hvaibhav@ti.com>
drivers/usb/musb/musb_host.c | patch | blob | history |
index 73c2c635821aa5f78c910f7b753216994552ad0e..382482c036a4021ebb5a8ce3adda851ad47ddf87 100644 (file)
} else {
csr = musb_readw(hw_ep->regs, MUSB_RXCSR);
- if (csr & (MUSB_RXCSR_RXPKTRDY
- | MUSB_RXCSR_DMAENAB
- | MUSB_RXCSR_H_REQPKT))
+ if (csr & (MUSB_RXCSR_RXPKTRDY | (is_cppi_enabled(musb)
+ || is_cppi41_enabled(musb)) ? 0 : MUSB_RXCSR_DMAENAB
+ | MUSB_RXCSR_H_REQPKT))
ERR("broken !rx_reinit, ep%d csr %04x\n",
hw_ep->epnum, csr);
| MUSB_RXCSR_H_AUTOREQ
| MUSB_RXCSR_AUTOCLEAR
| MUSB_RXCSR_RXPKTRDY);
- musb_writew(hw_ep->regs, MUSB_RXCSR, val);
- if (is_inventra_dma(musb)) {
- if (usb_pipeisoc(pipe)) {
- struct usb_iso_packet_descriptor *d;
+ if (is_cppi_enabled(musb) || is_cppi41_enabled(musb))
+ val |= MUSB_RXCSR_DMAENAB;
- d = urb->iso_frame_desc + qh->iso_idx;
- d->actual_length = xfer_len;
+ musb_writew(hw_ep->regs, MUSB_RXCSR, val);
- /* even if there was an error, we did the dma
- * for iso_frame_desc->length
- */
- if (d->status != -EILSEQ
- && d->status != -EOVERFLOW)
- d->status = 0;
+ if (usb_pipeisoc(pipe)) {
+ struct usb_iso_packet_descriptor *d;
- if (++qh->iso_idx >= urb->number_of_packets)
- done = true;
- else
- done = false;
+ d = urb->iso_frame_desc + qh->iso_idx;
+ d->actual_length = xfer_len;
+
+ /* even if there was an error, we did the dma
+ * for iso_frame_desc->length
+ */
+ if (d->status != -EILSEQ && d->status != -EOVERFLOW)
+ d->status = 0;
- } else {
+ if (++qh->iso_idx >= urb->number_of_packets)
+ done = true;
+ else if (is_cppi_enabled(musb) ||
+ is_cppi41_enabled(musb)) {
+ struct dma_controller *c;
+ void *buf;
+ u32 length, ret;
+
+ c = musb->dma_controller;
+ buf = (void *)
+ urb->iso_frame_desc[qh->iso_idx].offset
+ + (u32)urb->transfer_dma;
+
+ length =
+ urb->iso_frame_desc[qh->iso_idx].length;
+
+ ret = c->channel_program(dma, qh->maxpacket,
+ 0, (u32) buf, length);
+ done = false;
+ } else {
+ done = false;
+ }
+ } else {
/* done if urb buffer is full or short packet is recd */
done = (urb->actual_length + xfer_len >=
urb->transfer_buffer_length
|| dma->actual_len < qh->maxpacket);
- }
+ }
- /* send IN token for next packet, without AUTOREQ */
- if (!done) {
- val |= MUSB_RXCSR_H_REQPKT;
- musb_writew(epio, MUSB_RXCSR,
- MUSB_RXCSR_H_WZC_BITS | val);
- }
+ /* send IN token for next packet, without AUTOREQ */
+ if (!done) {
+ val |= MUSB_RXCSR_H_REQPKT;
+ musb_writew(epio, MUSB_RXCSR,
+ MUSB_RXCSR_H_WZC_BITS | val);
+ }
- dev_dbg(musb->controller,
+ dev_dbg(musb->controller,
"ep %d dma %s, rxcsr %04x, rxcount %d\n", epnum,
- done ? "off" : "reset",
- musb_readw(epio, MUSB_RXCSR),
- musb_readw(epio, MUSB_RXCOUNT));
- } else {
- done = true;
- }
+ done ? "off" : "reset",
+ musb_readw(epio, MUSB_RXCSR),
+ musb_readw(epio, MUSB_RXCOUNT));
} else if (urb->status == -EINPROGRESS) {
/* if no errors, be sure a packet is ready for unloading */
if (unlikely(!(rx_csr & MUSB_RXCSR_RXPKTRDY))) {
}
/* we are expecting IN packets */
- if (is_inventra_dma(musb) && dma) {
+ if (dma) {
struct dma_controller *c;
u16 rx_count;
int ret, length;