linux-omap git: add patch to fix soft lockups in MUSB code, run dos2unix on remaining...
authorKoen Kooi <koen@openembedded.org>
Tue, 30 Sep 2008 18:07:43 +0000 (18:07 +0000)
committerKoen Kooi <koen@openembedded.org>
Tue, 30 Sep 2008 18:07:43 +0000 (18:07 +0000)
packages/linux/linux-omap/musb-dma-iso-in.eml
packages/linux/linux-omap/musb-fix-ISO-in-unlink.diff [new file with mode: 0644]
packages/linux/linux-omap/musb-support-high-bandwidth.patch.eml
packages/linux/linux-omap_git.bb

index 8f0a6c5..56fc827 100644 (file)
-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
+
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 (file)
index 0000000..c93a5b0
--- /dev/null
@@ -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
+
index 0054093..0264a97 100644 (file)
-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
+
index d9e6c53..54a73b3 100644 (file)
@@ -8,8 +8,8 @@ COMPATIBLE_MACHINE = "omap5912osk|omap1710h3|omap2430sdp|omap2420h4|beagleboard|
 
 SRCREV = "e1c49d7d22af768188e2a54c167ed79919361e55"
 
-PV = "2.6.26+2.6.27-rc6+${PR}+git${SRCREV}"
-PR = "r8"
+PV = "2.6.26+2.6.27-rc7+${PR}+git${SRCREV}"
+PR = "r9"
 
 SRC_URI = "git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6.git;protocol=git \
           file://defconfig"
@@ -30,6 +30,7 @@ SRC_URI_append = " \
            file://mru-improve-pixclock-config.diff;patch=1 \
            file://mru-make-video-timings-selectable.diff;patch=1 \
            file://mru-enable-overlay-optimalization.diff;patch=1 \
+           file://musb-fix-ISO-in-unlink.diff;patch=1 \
 "
 
 temporarely-disabled = " \