diff options
author | Michael Grzeschik <m.grzeschik@pengutronix.de> | 2013-06-13 17:59:53 +0300 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-06-17 13:45:47 -0700 |
commit | cc9e6c495b0a37cc4f7003e470bcbb15ea760377 (patch) | |
tree | 620189fb514e382806ac61237b2812476c9abe07 /drivers/usb/chipidea/debug.c | |
parent | 20a677fd63c57edd5b0c463baa44f133b2f2d4a0 (diff) | |
download | talos-obmc-linux-cc9e6c495b0a37cc4f7003e470bcbb15ea760377.tar.gz talos-obmc-linux-cc9e6c495b0a37cc4f7003e470bcbb15ea760377.zip |
usb: chipidea: udc: manage dynamic amount of tds with a linked list
Instead of having a limited number of usable tds in the udc we use a
linked list to support dynamic amount of needed tds for all special
gadget types. This improves throughput.
Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
Reviewed-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/chipidea/debug.c')
-rw-r--r-- | drivers/usb/chipidea/debug.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/drivers/usb/chipidea/debug.c b/drivers/usb/chipidea/debug.c index 36a7063a6cba..64b8c32d4f33 100644 --- a/drivers/usb/chipidea/debug.c +++ b/drivers/usb/chipidea/debug.c @@ -162,6 +162,7 @@ static int ci_requests_show(struct seq_file *s, void *data) unsigned long flags; struct list_head *ptr = NULL; struct ci13xxx_req *req = NULL; + struct td_node *node, *tmpnode; unsigned i, j, qsize = sizeof(struct ci13xxx_td)/sizeof(u32); if (ci->role != CI_ROLE_GADGET) { @@ -174,13 +175,17 @@ static int ci_requests_show(struct seq_file *s, void *data) list_for_each(ptr, &ci->ci13xxx_ep[i].qh.queue) { req = list_entry(ptr, struct ci13xxx_req, queue); - seq_printf(s, "EP=%02i: TD=%08X %s\n", - i % (ci->hw_ep_max / 2), (u32)req->dma, - ((i < ci->hw_ep_max/2) ? "RX" : "TX")); - - for (j = 0; j < qsize; j++) - seq_printf(s, " %04X: %08X\n", j, - *((u32 *)req->ptr + j)); + list_for_each_entry_safe(node, tmpnode, &req->tds, td) { + seq_printf(s, "EP=%02i: TD=%08X %s\n", + i % (ci->hw_ep_max / 2), + (u32)node->dma, + ((i < ci->hw_ep_max/2) ? + "RX" : "TX")); + + for (j = 0; j < qsize; j++) + seq_printf(s, " %04X: %08X\n", j, + *((u32 *)node->ptr + j)); + } } spin_unlock_irqrestore(&ci->lock, flags); |