diff options
author | Koen Kooi <koen@openembedded.org> | 2008-09-30 18:07:43 +0000 |
---|---|---|
committer | Koen Kooi <koen@openembedded.org> | 2008-09-30 18:07:43 +0000 |
commit | 302e925dd73f00efea3aa559b9e2f83eb793c87c (patch) | |
tree | 5528949d21a9b1561ceefcf3dbe818a5a2625d87 /packages/linux/linux-omap | |
parent | 8010e8e17d718200683c7bb0f4de90f92c9ffe4d (diff) |
linux-omap git: add patch to fix soft lockups in MUSB code, run dos2unix on remaining musb patches, bump PR, fix PV
Diffstat (limited to 'packages/linux/linux-omap')
3 files changed, 341 insertions, 272 deletions
diff --git a/packages/linux/linux-omap/musb-dma-iso-in.eml b/packages/linux/linux-omap/musb-dma-iso-in.eml index 8f0a6c5689..56fc827a5d 100644 --- a/packages/linux/linux-omap/musb-dma-iso-in.eml +++ b/packages/linux/linux-omap/musb-dma-iso-in.eml @@ -1,138 +1,138 @@ -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
-
+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 + diff --git a/packages/linux/linux-omap/musb-fix-ISO-in-unlink.diff b/packages/linux/linux-omap/musb-fix-ISO-in-unlink.diff new file mode 100644 index 0000000000..c93a5b06c8 --- /dev/null +++ b/packages/linux/linux-omap/musb-fix-ISO-in-unlink.diff @@ -0,0 +1,69 @@ +From: Ajay Kumar Gupta <ajay.gupta@ti.com> +To: linux-omap@vger.kernel.org +Cc: linux-usb@vger.kernel.org, felipe.balbi@nokia.com, + stern@rowland.harvard.edu, Ajay Kumar Gupta <ajay.gupta@ti.com> +Subject: [PATCH v3] OMAP:MUSB: Corrects urb unlink function path +Date: Mon, 25 Aug 2008 10:52:16 +0530 + +Fixes kernel panic while ISO IN transfer is aborted.Replaced +usb_hcd_unlink_urb_from_ep() from musb_giveback() to __musb_giveback() +to make sure urb is unlinked before giveback when __musb_giveback() is +called from musb_urb_dequeue(). + +Acquired musb->lock() before usb_hcd_unlink_urb_from_ep() within in +enqueue path. + +Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com> +--- + drivers/usb/musb/musb_host.c | 7 +++++-- + 1 files changed, 5 insertions(+), 2 deletions(-) + +diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c +index 08e421f..4279311 100644 +--- a/drivers/usb/musb/musb_host.c ++++ b/drivers/usb/musb/musb_host.c +@@ -291,6 +291,7 @@ __acquires(musb->lock) + urb->actual_length, urb->transfer_buffer_length + ); + ++ usb_hcd_unlink_urb_from_ep(musb_to_hcd(musb), urb); + spin_unlock(&musb->lock); + usb_hcd_giveback_urb(musb_to_hcd(musb), urb, status); + spin_lock(&musb->lock); +@@ -353,8 +354,6 @@ musb_giveback(struct musb_qh *qh, struct urb *urb, int status) + break; + } + +- usb_hcd_unlink_urb_from_ep(musb_to_hcd(musb), urb); +- + qh->is_ready = 0; + __musb_giveback(musb, urb, status); + qh->is_ready = ready; +@@ -1787,7 +1786,9 @@ static int musb_urb_enqueue( + */ + qh = kzalloc(sizeof *qh, mem_flags); + if (!qh) { ++ spin_lock_irqsave(&musb->lock, flags); + usb_hcd_unlink_urb_from_ep(hcd, urb); ++ spin_unlock_irqrestore(&musb->lock, flags); + return -ENOMEM; + } + +@@ -1899,7 +1900,9 @@ static int musb_urb_enqueue( + + done: + if (ret != 0) { ++ spin_lock_irqsave(&musb->lock, flags); + usb_hcd_unlink_urb_from_ep(hcd, urb); ++ spin_unlock_irqrestore(&musb->lock, flags); + kfree(qh); + } + return ret; +-- +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 + diff --git a/packages/linux/linux-omap/musb-support-high-bandwidth.patch.eml b/packages/linux/linux-omap/musb-support-high-bandwidth.patch.eml index 0054093603..0264a97045 100644 --- a/packages/linux/linux-omap/musb-support-high-bandwidth.patch.eml +++ b/packages/linux/linux-omap/musb-support-high-bandwidth.patch.eml @@ -1,134 +1,134 @@ -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
-
+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 + |