summaryrefslogtreecommitdiffstats
path: root/meta/recipes-kernel/linux/linux-omap-2.6.29/musb/0004-USB-musb-rewrite-host-periodic-endpoint-allocation.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-kernel/linux/linux-omap-2.6.29/musb/0004-USB-musb-rewrite-host-periodic-endpoint-allocation.patch')
-rw-r--r--meta/recipes-kernel/linux/linux-omap-2.6.29/musb/0004-USB-musb-rewrite-host-periodic-endpoint-allocation.patch106
1 files changed, 106 insertions, 0 deletions
diff --git a/meta/recipes-kernel/linux/linux-omap-2.6.29/musb/0004-USB-musb-rewrite-host-periodic-endpoint-allocation.patch b/meta/recipes-kernel/linux/linux-omap-2.6.29/musb/0004-USB-musb-rewrite-host-periodic-endpoint-allocation.patch
new file mode 100644
index 0000000000..438f11cf7a
--- /dev/null
+++ b/meta/recipes-kernel/linux/linux-omap-2.6.29/musb/0004-USB-musb-rewrite-host-periodic-endpoint-allocation.patch
@@ -0,0 +1,106 @@
1From 9ebf351bcd28a89a0b1ba8d0496fffbc72421611 Mon Sep 17 00:00:00 2001
2From: Sergei Shtylyov <sshtylyov-hkdhdckH98+B+jHODAdFcQ@public.gmane.org>
3Date: Tue, 24 Mar 2009 17:22:50 -0700
4Subject: [PATCH] USB: musb: rewrite host periodic endpoint allocation
5
6The current MUSB host code doesn't make use of all the available
7FIFOs in for periodic transfers since it wrongly assumes the RX
8and TX sides of any given hw_ep always share one FIFO.
9
10Change: use 'in_qh' and 'out_qh' fields of the 'struct musb_hw_ep'
11to check the endpoint's business; get rid of the now-unused 'periodic'
12array in the 'struct musb'. Also optimize a loop induction variable
13in the endpoint lookup code.
14
15(Based on a previous patch from Ajay Kumar Gupta <ajay.gupta-l0cyMroinI0@public.gmane.org>)
16
17[ dbrownell-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@public.gmane.org: clarify description and origin
18 of this fix; whitespace ]
19
20Signed-off-by: Sergei Shtylyov <sshtylyov-hkdhdckH98+B+jHODAdFcQ@public.gmane.org>
21Signed-off-by: David Brownell <dbrownell-Rn4VEauK+AKRv+LV9MX5uipxlwaOVQ5f@public.gmane.org>
22Cc: Felipe Balbi <felipe.balbi-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
23Signed-off-by: Greg Kroah-Hartman <gregkh-l3A5Bk7waGM@public.gmane.org>
24---
25 drivers/usb/musb/musb_core.h | 1 -
26 drivers/usb/musb/musb_host.c | 28 +++++++++++-----------------
27 2 files changed, 11 insertions(+), 18 deletions(-)
28
29diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h
30index 630946a..adf1806 100644
31--- a/drivers/usb/musb/musb_core.h
32+++ b/drivers/usb/musb/musb_core.h
33@@ -331,7 +331,6 @@ struct musb {
34 struct list_head control; /* of musb_qh */
35 struct list_head in_bulk; /* of musb_qh */
36 struct list_head out_bulk; /* of musb_qh */
37- struct musb_qh *periodic[32]; /* tree of interrupt+iso */
38 #endif
39
40 /* called with IRQs blocked; ON/nonzero implies starting a session,
41diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
42index bd1d5ae..499c431 100644
43--- a/drivers/usb/musb/musb_host.c
44+++ b/drivers/usb/musb/musb_host.c
45@@ -390,7 +390,6 @@ musb_giveback(struct musb_qh *qh, struct urb *urb, int status)
46 * de-allocated if it's tracked and allocated;
47 * and where we'd update the schedule tree...
48 */
49- musb->periodic[ep->epnum] = NULL;
50 kfree(qh);
51 qh = NULL;
52 break;
53@@ -1760,31 +1759,27 @@ static int musb_schedule(
54
55 /* else, periodic transfers get muxed to other endpoints */
56
57- /* FIXME this doesn't consider direction, so it can only
58- * work for one half of the endpoint hardware, and assumes
59- * the previous cases handled all non-shared endpoints...
60- */
61-
62- /* we know this qh hasn't been scheduled, so all we need to do
63+ /*
64+ * We know this qh hasn't been scheduled, so all we need to do
65 * is choose which hardware endpoint to put it on ...
66 *
67 * REVISIT what we really want here is a regular schedule tree
68- * like e.g. OHCI uses, but for now musb->periodic is just an
69- * array of the _single_ logical endpoint associated with a
70- * given physical one (identity mapping logical->physical).
71- *
72- * that simplistic approach makes TT scheduling a lot simpler;
73- * there is none, and thus none of its complexity...
74+ * like e.g. OHCI uses.
75 */
76 best_diff = 4096;
77 best_end = -1;
78
79- for (epnum = 1; epnum < musb->nr_endpoints; epnum++) {
80+ for (epnum = 1, hw_ep = musb->endpoints + 1;
81+ epnum < musb->nr_endpoints;
82+ epnum++, hw_ep++) {
83 int diff;
84
85- if (musb->periodic[epnum])
86+ if (is_in || hw_ep->is_shared_fifo) {
87+ if (hw_ep->in_qh != NULL)
88+ continue;
89+ } else if (hw_ep->out_qh != NULL)
90 continue;
91- hw_ep = &musb->endpoints[epnum];
92+
93 if (hw_ep == musb->bulk_ep)
94 continue;
95
96@@ -1824,7 +1819,6 @@ static int musb_schedule(
97 idle = 1;
98 qh->mux = 0;
99 hw_ep = musb->endpoints + best_end;
100- musb->periodic[best_end] = qh;
101 DBG(4, "qh %p periodic slot %d\n", qh, best_end);
102 success:
103 if (head) {
104--
1051.6.0.4
106