From 302e925dd73f00efea3aa559b9e2f83eb793c87c Mon Sep 17 00:00:00 2001 From: Koen Kooi Date: Tue, 30 Sep 2008 18:07:43 +0000 Subject: [PATCH] linux-omap git: add patch to fix soft lockups in MUSB code, run dos2unix on remaining musb patches, bump PR, fix PV --- packages/linux/linux-omap/musb-dma-iso-in.eml | 276 +++++++++--------- .../linux-omap/musb-fix-ISO-in-unlink.diff | 69 +++++ .../musb-support-high-bandwidth.patch.eml | 268 ++++++++--------- packages/linux/linux-omap_git.bb | 5 +- 4 files changed, 344 insertions(+), 274 deletions(-) create mode 100644 packages/linux/linux-omap/musb-fix-ISO-in-unlink.diff 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 ---- -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 +--- +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 +To: linux-omap@vger.kernel.org +Cc: linux-usb@vger.kernel.org, felipe.balbi@nokia.com, + stern@rowland.harvard.edu, Ajay Kumar Gupta +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 +--- + 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 ---- - 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 +--- + 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 + diff --git a/packages/linux/linux-omap_git.bb b/packages/linux/linux-omap_git.bb index d9e6c53bf4..54a73b308c 100644 --- a/packages/linux/linux-omap_git.bb +++ b/packages/linux/linux-omap_git.bb @@ -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 = " \ -- 2.39.5