summaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorMagnus Damm2009-08-19 16:19:08 +0200
committerPaul Mundt2009-08-20 03:30:44 +0200
commitef5ce3b69028ea32aa87e98c9a3802e7c9f824b6 (patch)
treedddda44be0639cb6c49b7d066394c9b41b33a391 /drivers/usb
parentusb: add clock support to r8a66597 gadget driver (diff)
downloadkernel-qcow2-linux-ef5ce3b69028ea32aa87e98c9a3802e7c9f824b6.tar.gz
kernel-qcow2-linux-ef5ce3b69028ea32aa87e98c9a3802e7c9f824b6.tar.xz
kernel-qcow2-linux-ef5ce3b69028ea32aa87e98c9a3802e7c9f824b6.zip
usb: r8a66597-udc buffer management update
This patch updates the r8a66597-udc buffer management code. Use fixed buffers for bulk and isochronous pipes, also make sure to handle the isochronous-as-bulk case. With fixed buffers there is no need to keep track of used buffers with bi_bufnum. Also, this fixes a potential buffer offset problem where the base offset incorrectly varies with the number of pipes used. The m66592 driver recently got fixed in a similar way. Signed-off-by: Magnus Damm <damm@igel.co.jp> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/gadget/r8a66597-udc.c32
-rw-r--r--drivers/usb/gadget/r8a66597-udc.h1
2 files changed, 11 insertions, 22 deletions
diff --git a/drivers/usb/gadget/r8a66597-udc.c b/drivers/usb/gadget/r8a66597-udc.c
index c65753ffe0f0..956618400a7c 100644
--- a/drivers/usb/gadget/r8a66597-udc.c
+++ b/drivers/usb/gadget/r8a66597-udc.c
@@ -252,24 +252,27 @@ static int pipe_buffer_setting(struct r8a66597 *r8a66597,
buf_bsize = 0;
break;
case R8A66597_BULK:
- bufnum = r8a66597->bi_bufnum +
- (info->pipe - R8A66597_BASE_PIPENUM_BULK) * 16;
- r8a66597->bi_bufnum += 16;
+ /* isochronous pipes may be used as bulk pipes */
+ if (info->pipe > R8A66597_BASE_PIPENUM_BULK)
+ bufnum = info->pipe - R8A66597_BASE_PIPENUM_BULK;
+ else
+ bufnum = info->pipe - R8A66597_BASE_PIPENUM_ISOC;
+
+ bufnum = R8A66597_BASE_BUFNUM + (bufnum * 16);
buf_bsize = 7;
pipecfg |= R8A66597_DBLB;
if (!info->dir_in)
pipecfg |= R8A66597_SHTNAK;
break;
case R8A66597_ISO:
- bufnum = r8a66597->bi_bufnum +
+ bufnum = R8A66597_BASE_BUFNUM +
(info->pipe - R8A66597_BASE_PIPENUM_ISOC) * 16;
- r8a66597->bi_bufnum += 16;
buf_bsize = 7;
break;
}
- if (r8a66597->bi_bufnum > R8A66597_MAX_BUFNUM) {
- printk(KERN_ERR "r8a66597 pipe memory is insufficient(%d)\n",
- r8a66597->bi_bufnum);
+
+ if (buf_bsize && ((bufnum + 16) >= R8A66597_MAX_BUFNUM)) {
+ pr_err(KERN_ERR "r8a66597 pipe memory is insufficient\n");
return -ENOMEM;
}
@@ -289,17 +292,6 @@ static void pipe_buffer_release(struct r8a66597 *r8a66597,
if (info->pipe == 0)
return;
- switch (info->type) {
- case R8A66597_BULK:
- if (is_bulk_pipe(info->pipe))
- r8a66597->bi_bufnum -= 16;
- break;
- case R8A66597_ISO:
- if (is_isoc_pipe(info->pipe))
- r8a66597->bi_bufnum -= 16;
- break;
- }
-
if (is_bulk_pipe(info->pipe))
r8a66597->bulk--;
else if (is_interrupt_pipe(info->pipe))
@@ -1553,8 +1545,6 @@ static int __init r8a66597_probe(struct platform_device *pdev)
r8a66597->timer.data = (unsigned long)r8a66597;
r8a66597->reg = (unsigned long)reg;
- r8a66597->bi_bufnum = R8A66597_BASE_BUFNUM;
-
#ifdef CONFIG_HAVE_CLK
if (r8a66597->pdata->on_chip) {
snprintf(clk_name, sizeof(clk_name), "usb%d", pdev->id);
diff --git a/drivers/usb/gadget/r8a66597-udc.h b/drivers/usb/gadget/r8a66597-udc.h
index 7d9a325e7b6d..e653575d4ceb 100644
--- a/drivers/usb/gadget/r8a66597-udc.h
+++ b/drivers/usb/gadget/r8a66597-udc.h
@@ -112,7 +112,6 @@ struct r8a66597 {
u16 old_dvsq;
/* pipe config */
- unsigned short bi_bufnum; /* bulk and isochronous's bufnum */
unsigned char bulk;
unsigned char interrupt;
unsigned char isochronous;