-Fixes blurred capture images in dma mode. Isochronous error field in\r
-urb and source data buffer pointer were not updated properly in dma\r
-mode.\r
-\r
-Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>\r
----\r
-diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c\r
-index 08e421f..a481d54 100644\r
---- a/drivers/usb/musb/musb_host.c\r
-+++ b/drivers/usb/musb/musb_host.c\r
-@@ -1505,10 +1505,29 @@ void musb_host_rx(struct musb *musb, u8 epnum)\r
- musb_writew(hw_ep->regs, MUSB_RXCSR, val);\r
- \r
- #ifdef CONFIG_USB_INVENTRA_DMA\r
-+ if (usb_pipeisoc(pipe)) {\r
-+ struct usb_iso_packet_descriptor *d;\r
-+\r
-+ d = urb->iso_frame_desc + qh->iso_idx;\r
-+ d->actual_length = xfer_len;\r
-+\r
-+ /* even if there was an error, we did the dma\r
-+ * for iso_frame_desc->length\r
-+ */\r
-+ if (d->status != EILSEQ && d->status != -EOVERFLOW)\r
-+ d->status = 0;\r
-+\r
-+ if (++qh->iso_idx >= urb->number_of_packets)\r
-+ done = true;\r
-+ else\r
-+ done = false;\r
-+\r
-+ } else {\r
- /* done if urb buffer is full or short packet is recd */\r
- done = (urb->actual_length + xfer_len >=\r
- urb->transfer_buffer_length\r
- || dma->actual_len < qh->maxpacket);\r
-+ }\r
- \r
- /* send IN token for next packet, without AUTOREQ */\r
- if (!done) {\r
-@@ -1545,7 +1564,8 @@ void musb_host_rx(struct musb *musb, u8 epnum)\r
- if (dma) {\r
- struct dma_controller *c;\r
- u16 rx_count;\r
-- int ret;\r
-+ int ret, length;\r
-+ dma_addr_t buf;\r
- \r
- rx_count = musb_readw(epio, MUSB_RXCOUNT);\r
- \r
-@@ -1558,6 +1578,35 @@ void musb_host_rx(struct musb *musb, u8 epnum)\r
- \r
- c = musb->dma_controller;\r
- \r
-+ if (usb_pipeisoc(pipe)) {\r
-+ int status = 0;\r
-+ struct usb_iso_packet_descriptor *d;\r
-+\r
-+ d = urb->iso_frame_desc + qh->iso_idx;\r
-+\r
-+ if (iso_err) {\r
-+ status = -EILSEQ;\r
-+ urb->error_count++;\r
-+ }\r
-+ if (rx_count > d->length) {\r
-+ if (status == 0) {\r
-+ status = -EOVERFLOW;\r
-+ urb->error_count++;\r
-+ }\r
-+ DBG(2, "** OVERFLOW %d into %d\n",\\r
-+ rx_count, d->length);\r
-+\r
-+ length = d->length;\r
-+ } else\r
-+ length = rx_count;\r
-+ d->status = status;\r
-+ buf = urb->transfer_dma + d->offset;\r
-+ } else {\r
-+ length = rx_count;\r
-+ buf = urb->transfer_dma +\r
-+ urb->actual_length;\r
-+ }\r
-+\r
- dma->desired_mode = 0;\r
- #ifdef USE_MODE1\r
- /* because of the issue below, mode 1 will\r
-@@ -1569,6 +1618,12 @@ void musb_host_rx(struct musb *musb, u8 epnum)\r
- urb->actual_length)\r
- > qh->maxpacket)\r
- dma->desired_mode = 1;\r
-+ if (rx_count < hw_ep->max_packet_sz_rx) {\r
-+ length = rx_count;\r
-+ dma->bDesiredMode = 0;\r
-+ } else {\r
-+ length = urb->transfer_buffer_length;\r
-+ }\r
- #endif\r
- \r
- /* Disadvantage of using mode 1:\r
-@@ -1606,12 +1661,7 @@ void musb_host_rx(struct musb *musb, u8 epnum)\r
- */\r
- ret = c->channel_program(\r
- dma, qh->maxpacket,\r
-- dma->desired_mode,\r
-- urb->transfer_dma\r
-- + urb->actual_length,\r
-- (dma->desired_mode == 0)\r
-- ? rx_count\r
-- : urb->transfer_buffer_length);\r
-+ dma->desired_mode, buf, length);\r
- \r
- if (!ret) {\r
- c->channel_release(dma);\r
-@@ -1628,19 +1678,6 @@ void musb_host_rx(struct musb *musb, u8 epnum)\r
- }\r
- }\r
- \r
-- if (dma && usb_pipeisoc(pipe)) {\r
-- struct usb_iso_packet_descriptor *d;\r
-- int iso_stat = status;\r
--\r
-- d = urb->iso_frame_desc + qh->iso_idx;\r
-- d->actual_length += xfer_len;\r
-- if (iso_err) {\r
-- iso_stat = -EILSEQ;\r
-- urb->error_count++;\r
-- }\r
-- d->status = iso_stat;\r
-- }\r
--\r
- finish:\r
- urb->actual_length += xfer_len;\r
- qh->offset += xfer_len;\r
---\r
-To unsubscribe from this list: send the line "unsubscribe linux-omap" in\r
-the body of a message to majordomo@vger.kernel.org\r
-More majordomo info at http://vger.kernel.org/majordomo-info.html\r
-\r
+Fixes blurred capture images in dma mode. Isochronous error field in
+urb and source data buffer pointer were not updated properly in dma
+mode.
+
+Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
+---
+diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
+index 08e421f..a481d54 100644
+--- a/drivers/usb/musb/musb_host.c
++++ b/drivers/usb/musb/musb_host.c
+@@ -1505,10 +1505,29 @@ void musb_host_rx(struct musb *musb, u8 epnum)
+ musb_writew(hw_ep->regs, MUSB_RXCSR, val);
+
+ #ifdef CONFIG_USB_INVENTRA_DMA
++ if (usb_pipeisoc(pipe)) {
++ struct usb_iso_packet_descriptor *d;
++
++ 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;
++
++ if (++qh->iso_idx >= urb->number_of_packets)
++ done = true;
++ 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) {
+@@ -1545,7 +1564,8 @@ void musb_host_rx(struct musb *musb, u8 epnum)
+ if (dma) {
+ struct dma_controller *c;
+ u16 rx_count;
+- int ret;
++ int ret, length;
++ dma_addr_t buf;
+
+ rx_count = musb_readw(epio, MUSB_RXCOUNT);
+
+@@ -1558,6 +1578,35 @@ void musb_host_rx(struct musb *musb, u8 epnum)
+
+ c = musb->dma_controller;
+
++ if (usb_pipeisoc(pipe)) {
++ int status = 0;
++ struct usb_iso_packet_descriptor *d;
++
++ d = urb->iso_frame_desc + qh->iso_idx;
++
++ if (iso_err) {
++ status = -EILSEQ;
++ urb->error_count++;
++ }
++ if (rx_count > d->length) {
++ if (status == 0) {
++ status = -EOVERFLOW;
++ urb->error_count++;
++ }
++ DBG(2, "** OVERFLOW %d into %d\n",\
++ rx_count, d->length);
++
++ length = d->length;
++ } else
++ length = rx_count;
++ d->status = status;
++ buf = urb->transfer_dma + d->offset;
++ } else {
++ length = rx_count;
++ buf = urb->transfer_dma +
++ urb->actual_length;
++ }
++
+ dma->desired_mode = 0;
+ #ifdef USE_MODE1
+ /* because of the issue below, mode 1 will
+@@ -1569,6 +1618,12 @@ void musb_host_rx(struct musb *musb, u8 epnum)
+ urb->actual_length)
+ > qh->maxpacket)
+ dma->desired_mode = 1;
++ if (rx_count < hw_ep->max_packet_sz_rx) {
++ length = rx_count;
++ dma->bDesiredMode = 0;
++ } else {
++ length = urb->transfer_buffer_length;
++ }
+ #endif
+
+ /* Disadvantage of using mode 1:
+@@ -1606,12 +1661,7 @@ void musb_host_rx(struct musb *musb, u8 epnum)
+ */
+ ret = c->channel_program(
+ dma, qh->maxpacket,
+- dma->desired_mode,
+- urb->transfer_dma
+- + urb->actual_length,
+- (dma->desired_mode == 0)
+- ? rx_count
+- : urb->transfer_buffer_length);
++ dma->desired_mode, buf, length);
+
+ if (!ret) {
+ c->channel_release(dma);
+@@ -1628,19 +1678,6 @@ void musb_host_rx(struct musb *musb, u8 epnum)
+ }
+ }
+
+- if (dma && usb_pipeisoc(pipe)) {
+- struct usb_iso_packet_descriptor *d;
+- int iso_stat = status;
+-
+- d = urb->iso_frame_desc + qh->iso_idx;
+- d->actual_length += xfer_len;
+- if (iso_err) {
+- iso_stat = -EILSEQ;
+- urb->error_count++;
+- }
+- d->status = iso_stat;
+- }
+-
+ finish:
+ urb->actual_length += xfer_len;
+ qh->offset += xfer_len;
+--
+To unsubscribe from this list: send the line "unsubscribe linux-omap" in
+the body of a message to majordomo@vger.kernel.org
+More majordomo info at http://vger.kernel.org/majordomo-info.html
+
-Enables support for camera (as creative) requiring high bandwidth\r
-isochronous transfer.\r
-\r
-Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>\r
----\r
- drivers/usb/musb/musb_core.c | 18 +++++++++---------\r
- drivers/usb/musb/musb_host.c | 32 +++++++++++++++++++++-----------\r
- 2 files changed, 30 insertions(+), 20 deletions(-)\r
-\r
-diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c\r
-index c939f81..9914f70 100644\r
---- a/drivers/usb/musb/musb_core.c\r
-+++ b/drivers/usb/musb/musb_core.c\r
-@@ -1063,17 +1063,17 @@ static struct fifo_cfg __initdata mode_4_cfg[] = {\r
- { .hw_ep_num = 7, .style = FIFO_TX, .maxpacket = 512, },\r
- { .hw_ep_num = 7, .style = FIFO_RX, .maxpacket = 512, },\r
- { .hw_ep_num = 8, .style = FIFO_TX, .maxpacket = 512, },\r
--{ .hw_ep_num = 8, .style = FIFO_RX, .maxpacket = 512, },\r
-+{ .hw_ep_num = 8, .style = FIFO_RX, .maxpacket = 64, },\r
- { .hw_ep_num = 9, .style = FIFO_TX, .maxpacket = 512, },\r
--{ .hw_ep_num = 9, .style = FIFO_RX, .maxpacket = 512, },\r
-+{ .hw_ep_num = 9, .style = FIFO_RX, .maxpacket = 64, },\r
- { .hw_ep_num = 10, .style = FIFO_TX, .maxpacket = 512, },\r
--{ .hw_ep_num = 10, .style = FIFO_RX, .maxpacket = 512, },\r
--{ .hw_ep_num = 11, .style = FIFO_TX, .maxpacket = 512, },\r
--{ .hw_ep_num = 11, .style = FIFO_RX, .maxpacket = 512, },\r
--{ .hw_ep_num = 12, .style = FIFO_TX, .maxpacket = 512, },\r
--{ .hw_ep_num = 12, .style = FIFO_RX, .maxpacket = 512, },\r
--{ .hw_ep_num = 13, .style = FIFO_TX, .maxpacket = 512, },\r
--{ .hw_ep_num = 13, .style = FIFO_RX, .maxpacket = 512, },\r
-+{ .hw_ep_num = 10, .style = FIFO_RX, .maxpacket = 64, },\r
-+{ .hw_ep_num = 11, .style = FIFO_TX, .maxpacket = 256, },\r
-+{ .hw_ep_num = 11, .style = FIFO_RX, .maxpacket = 256, },\r
-+{ .hw_ep_num = 12, .style = FIFO_TX, .maxpacket = 256, },\r
-+{ .hw_ep_num = 12, .style = FIFO_RX, .maxpacket = 256, },\r
-+{ .hw_ep_num = 13, .style = FIFO_TX, .maxpacket = 256, },\r
-+{ .hw_ep_num = 13, .style = FIFO_RX, .maxpacket = 4096, },\r
- { .hw_ep_num = 14, .style = FIFO_RXTX, .maxpacket = 1024, },\r
- { .hw_ep_num = 15, .style = FIFO_RXTX, .maxpacket = 1024, },\r
- };\r
-diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c\r
-index 08e421f..84173df 100644\r
---- a/drivers/usb/musb/musb_host.c\r
-+++ b/drivers/usb/musb/musb_host.c\r
-@@ -1443,6 +1443,10 @@ void musb_host_rx(struct musb *musb, u8 epnum)\r
- /* packet error reported later */\r
- iso_err = true;\r
- }\r
-+ } else if (rx_csr & MUSB_RXCSR_INCOMPRX) {\r
-+ DBG(3, "end %d Highbandwidth incomplete ISO packet received\n"\r
-+ , epnum);\r
-+ status = -EPROTO;\r
- }\r
- \r
- /* faults abort the transfer */\r
-@@ -1595,7 +1599,13 @@ void musb_host_rx(struct musb *musb, u8 epnum)\r
- val &= ~MUSB_RXCSR_H_AUTOREQ;\r
- else\r
- val |= MUSB_RXCSR_H_AUTOREQ;\r
-- val |= MUSB_RXCSR_AUTOCLEAR | MUSB_RXCSR_DMAENAB;\r
-+\r
-+ if (qh->maxpacket & ~0x7ff)\r
-+ /* Autoclear doesn't work in high bandwidth iso */\r
-+ val |= MUSB_RXCSR_DMAENAB;\r
-+ else\r
-+ val |= MUSB_RXCSR_AUTOCLEAR\r
-+ | MUSB_RXCSR_DMAENAB;\r
- \r
- musb_writew(epio, MUSB_RXCSR,\r
- MUSB_RXCSR_H_WZC_BITS | val);\r
-@@ -1666,6 +1676,7 @@ static int musb_schedule(\r
- int best_end, epnum;\r
- struct musb_hw_ep *hw_ep = NULL;\r
- struct list_head *head = NULL;\r
-+ u16 maxpacket;\r
- \r
- /* use fixed hardware for control and bulk */\r
- switch (qh->type) {\r
-@@ -1708,6 +1719,13 @@ static int musb_schedule(\r
- best_diff = 4096;\r
- best_end = -1;\r
- \r
-+ if (qh->maxpacket & (1<<11))\r
-+ maxpacket = 2 * (qh->maxpacket & 0x7ff);\r
-+ else if (qh->maxpacket & (1<<12))\r
-+ maxpacket = 3 * (qh->maxpacket & 0x7ff);\r
-+ else\r
-+ maxpacket = (qh->maxpacket & 0x7ff);\r
-+\r
- for (epnum = 1; epnum < musb->nr_endpoints; epnum++) {\r
- int diff;\r
- \r
-@@ -1718,9 +1736,9 @@ static int musb_schedule(\r
- continue;\r
- \r
- if (is_in)\r
-- diff = hw_ep->max_packet_sz_rx - qh->maxpacket;\r
-+ diff = hw_ep->max_packet_sz_rx - maxpacket;\r
- else\r
-- diff = hw_ep->max_packet_sz_tx - qh->maxpacket;\r
-+ diff = hw_ep->max_packet_sz_tx - maxpacket;\r
- \r
- if (diff > 0 && best_diff > diff) {\r
- best_diff = diff;\r
-@@ -1797,13 +1815,6 @@ static int musb_urb_enqueue(\r
- qh->is_ready = 1;\r
- \r
- qh->maxpacket = le16_to_cpu(epd->wMaxPacketSize);\r
--\r
-- /* no high bandwidth support yet */\r
-- if (qh->maxpacket & ~0x7ff) {\r
-- ret = -EMSGSIZE;\r
-- goto done;\r
-- }\r
--\r
- qh->epnum = epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;\r
- qh->type = epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;\r
- \r
-@@ -1897,7 +1908,6 @@ static int musb_urb_enqueue(\r
- }\r
- spin_unlock_irqrestore(&musb->lock, flags);\r
- \r
--done:\r
- if (ret != 0) {\r
- usb_hcd_unlink_urb_from_ep(hcd, urb);\r
- kfree(qh);\r
--- \r
-1.5.6\r
-\r
---\r
-To unsubscribe from this list: send the line "unsubscribe linux-omap" in\r
-the body of a message to majordomo@vger.kernel.org\r
-More majordomo info at http://vger.kernel.org/majordomo-info.html\r
-\r
+Enables support for camera (as creative) requiring high bandwidth
+isochronous transfer.
+
+Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com>
+---
+ drivers/usb/musb/musb_core.c | 18 +++++++++---------
+ drivers/usb/musb/musb_host.c | 32 +++++++++++++++++++++-----------
+ 2 files changed, 30 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
+index c939f81..9914f70 100644
+--- a/drivers/usb/musb/musb_core.c
++++ b/drivers/usb/musb/musb_core.c
+@@ -1063,17 +1063,17 @@ static struct fifo_cfg __initdata mode_4_cfg[] = {
+ { .hw_ep_num = 7, .style = FIFO_TX, .maxpacket = 512, },
+ { .hw_ep_num = 7, .style = FIFO_RX, .maxpacket = 512, },
+ { .hw_ep_num = 8, .style = FIFO_TX, .maxpacket = 512, },
+-{ .hw_ep_num = 8, .style = FIFO_RX, .maxpacket = 512, },
++{ .hw_ep_num = 8, .style = FIFO_RX, .maxpacket = 64, },
+ { .hw_ep_num = 9, .style = FIFO_TX, .maxpacket = 512, },
+-{ .hw_ep_num = 9, .style = FIFO_RX, .maxpacket = 512, },
++{ .hw_ep_num = 9, .style = FIFO_RX, .maxpacket = 64, },
+ { .hw_ep_num = 10, .style = FIFO_TX, .maxpacket = 512, },
+-{ .hw_ep_num = 10, .style = FIFO_RX, .maxpacket = 512, },
+-{ .hw_ep_num = 11, .style = FIFO_TX, .maxpacket = 512, },
+-{ .hw_ep_num = 11, .style = FIFO_RX, .maxpacket = 512, },
+-{ .hw_ep_num = 12, .style = FIFO_TX, .maxpacket = 512, },
+-{ .hw_ep_num = 12, .style = FIFO_RX, .maxpacket = 512, },
+-{ .hw_ep_num = 13, .style = FIFO_TX, .maxpacket = 512, },
+-{ .hw_ep_num = 13, .style = FIFO_RX, .maxpacket = 512, },
++{ .hw_ep_num = 10, .style = FIFO_RX, .maxpacket = 64, },
++{ .hw_ep_num = 11, .style = FIFO_TX, .maxpacket = 256, },
++{ .hw_ep_num = 11, .style = FIFO_RX, .maxpacket = 256, },
++{ .hw_ep_num = 12, .style = FIFO_TX, .maxpacket = 256, },
++{ .hw_ep_num = 12, .style = FIFO_RX, .maxpacket = 256, },
++{ .hw_ep_num = 13, .style = FIFO_TX, .maxpacket = 256, },
++{ .hw_ep_num = 13, .style = FIFO_RX, .maxpacket = 4096, },
+ { .hw_ep_num = 14, .style = FIFO_RXTX, .maxpacket = 1024, },
+ { .hw_ep_num = 15, .style = FIFO_RXTX, .maxpacket = 1024, },
+ };
+diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
+index 08e421f..84173df 100644
+--- a/drivers/usb/musb/musb_host.c
++++ b/drivers/usb/musb/musb_host.c
+@@ -1443,6 +1443,10 @@ void musb_host_rx(struct musb *musb, u8 epnum)
+ /* packet error reported later */
+ iso_err = true;
+ }
++ } else if (rx_csr & MUSB_RXCSR_INCOMPRX) {
++ DBG(3, "end %d Highbandwidth incomplete ISO packet received\n"
++ , epnum);
++ status = -EPROTO;
+ }
+
+ /* faults abort the transfer */
+@@ -1595,7 +1599,13 @@ void musb_host_rx(struct musb *musb, u8 epnum)
+ val &= ~MUSB_RXCSR_H_AUTOREQ;
+ else
+ val |= MUSB_RXCSR_H_AUTOREQ;
+- val |= MUSB_RXCSR_AUTOCLEAR | MUSB_RXCSR_DMAENAB;
++
++ if (qh->maxpacket & ~0x7ff)
++ /* Autoclear doesn't work in high bandwidth iso */
++ val |= MUSB_RXCSR_DMAENAB;
++ else
++ val |= MUSB_RXCSR_AUTOCLEAR
++ | MUSB_RXCSR_DMAENAB;
+
+ musb_writew(epio, MUSB_RXCSR,
+ MUSB_RXCSR_H_WZC_BITS | val);
+@@ -1666,6 +1676,7 @@ static int musb_schedule(
+ int best_end, epnum;
+ struct musb_hw_ep *hw_ep = NULL;
+ struct list_head *head = NULL;
++ u16 maxpacket;
+
+ /* use fixed hardware for control and bulk */
+ switch (qh->type) {
+@@ -1708,6 +1719,13 @@ static int musb_schedule(
+ best_diff = 4096;
+ best_end = -1;
+
++ if (qh->maxpacket & (1<<11))
++ maxpacket = 2 * (qh->maxpacket & 0x7ff);
++ else if (qh->maxpacket & (1<<12))
++ maxpacket = 3 * (qh->maxpacket & 0x7ff);
++ else
++ maxpacket = (qh->maxpacket & 0x7ff);
++
+ for (epnum = 1; epnum < musb->nr_endpoints; epnum++) {
+ int diff;
+
+@@ -1718,9 +1736,9 @@ static int musb_schedule(
+ continue;
+
+ if (is_in)
+- diff = hw_ep->max_packet_sz_rx - qh->maxpacket;
++ diff = hw_ep->max_packet_sz_rx - maxpacket;
+ else
+- diff = hw_ep->max_packet_sz_tx - qh->maxpacket;
++ diff = hw_ep->max_packet_sz_tx - maxpacket;
+
+ if (diff > 0 && best_diff > diff) {
+ best_diff = diff;
+@@ -1797,13 +1815,6 @@ static int musb_urb_enqueue(
+ qh->is_ready = 1;
+
+ qh->maxpacket = le16_to_cpu(epd->wMaxPacketSize);
+-
+- /* no high bandwidth support yet */
+- if (qh->maxpacket & ~0x7ff) {
+- ret = -EMSGSIZE;
+- goto done;
+- }
+-
+ qh->epnum = epd->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
+ qh->type = epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
+
+@@ -1897,7 +1908,6 @@ static int musb_urb_enqueue(
+ }
+ spin_unlock_irqrestore(&musb->lock, flags);
+
+-done:
+ if (ret != 0) {
+ usb_hcd_unlink_urb_from_ep(hcd, urb);
+ kfree(qh);
+--
+1.5.6
+
+--
+To unsubscribe from this list: send the line "unsubscribe linux-omap" in
+the body of a message to majordomo@vger.kernel.org
+More majordomo info at http://vger.kernel.org/majordomo-info.html
+