diff options
| author | Magnus Damm <damm@igel.co.jp> | 2009-08-19 10:19:08 -0400 |
|---|---|---|
| committer | Paul Mundt <lethal@linux-sh.org> | 2009-08-19 21:30:44 -0400 |
| commit | ef5ce3b69028ea32aa87e98c9a3802e7c9f824b6 (patch) | |
| tree | dddda44be0639cb6c49b7d066394c9b41b33a391 /drivers/usb/gadget/r8a66597-udc.c | |
| parent | d2e27bdf2870e507dd4abba1f56ca84ee6ae7232 (diff) | |
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/gadget/r8a66597-udc.c')
| -rw-r--r-- | drivers/usb/gadget/r8a66597-udc.c | 32 |
1 files changed, 11 insertions, 21 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, | |||
| 252 | buf_bsize = 0; | 252 | buf_bsize = 0; |
| 253 | break; | 253 | break; |
| 254 | case R8A66597_BULK: | 254 | case R8A66597_BULK: |
| 255 | bufnum = r8a66597->bi_bufnum + | 255 | /* isochronous pipes may be used as bulk pipes */ |
| 256 | (info->pipe - R8A66597_BASE_PIPENUM_BULK) * 16; | 256 | if (info->pipe > R8A66597_BASE_PIPENUM_BULK) |
| 257 | r8a66597->bi_bufnum += 16; | 257 | bufnum = info->pipe - R8A66597_BASE_PIPENUM_BULK; |
| 258 | else | ||
| 259 | bufnum = info->pipe - R8A66597_BASE_PIPENUM_ISOC; | ||
| 260 | |||
| 261 | bufnum = R8A66597_BASE_BUFNUM + (bufnum * 16); | ||
| 258 | buf_bsize = 7; | 262 | buf_bsize = 7; |
| 259 | pipecfg |= R8A66597_DBLB; | 263 | pipecfg |= R8A66597_DBLB; |
| 260 | if (!info->dir_in) | 264 | if (!info->dir_in) |
| 261 | pipecfg |= R8A66597_SHTNAK; | 265 | pipecfg |= R8A66597_SHTNAK; |
| 262 | break; | 266 | break; |
| 263 | case R8A66597_ISO: | 267 | case R8A66597_ISO: |
| 264 | bufnum = r8a66597->bi_bufnum + | 268 | bufnum = R8A66597_BASE_BUFNUM + |
| 265 | (info->pipe - R8A66597_BASE_PIPENUM_ISOC) * 16; | 269 | (info->pipe - R8A66597_BASE_PIPENUM_ISOC) * 16; |
| 266 | r8a66597->bi_bufnum += 16; | ||
| 267 | buf_bsize = 7; | 270 | buf_bsize = 7; |
| 268 | break; | 271 | break; |
| 269 | } | 272 | } |
| 270 | if (r8a66597->bi_bufnum > R8A66597_MAX_BUFNUM) { | 273 | |
| 271 | printk(KERN_ERR "r8a66597 pipe memory is insufficient(%d)\n", | 274 | if (buf_bsize && ((bufnum + 16) >= R8A66597_MAX_BUFNUM)) { |
| 272 | r8a66597->bi_bufnum); | 275 | pr_err(KERN_ERR "r8a66597 pipe memory is insufficient\n"); |
| 273 | return -ENOMEM; | 276 | return -ENOMEM; |
| 274 | } | 277 | } |
| 275 | 278 | ||
| @@ -289,17 +292,6 @@ static void pipe_buffer_release(struct r8a66597 *r8a66597, | |||
| 289 | if (info->pipe == 0) | 292 | if (info->pipe == 0) |
| 290 | return; | 293 | return; |
| 291 | 294 | ||
| 292 | switch (info->type) { | ||
| 293 | case R8A66597_BULK: | ||
| 294 | if (is_bulk_pipe(info->pipe)) | ||
| 295 | r8a66597->bi_bufnum -= 16; | ||
| 296 | break; | ||
| 297 | case R8A66597_ISO: | ||
| 298 | if (is_isoc_pipe(info->pipe)) | ||
| 299 | r8a66597->bi_bufnum -= 16; | ||
| 300 | break; | ||
| 301 | } | ||
| 302 | |||
| 303 | if (is_bulk_pipe(info->pipe)) | 295 | if (is_bulk_pipe(info->pipe)) |
| 304 | r8a66597->bulk--; | 296 | r8a66597->bulk--; |
| 305 | else if (is_interrupt_pipe(info->pipe)) | 297 | else if (is_interrupt_pipe(info->pipe)) |
| @@ -1553,8 +1545,6 @@ static int __init r8a66597_probe(struct platform_device *pdev) | |||
| 1553 | r8a66597->timer.data = (unsigned long)r8a66597; | 1545 | r8a66597->timer.data = (unsigned long)r8a66597; |
| 1554 | r8a66597->reg = (unsigned long)reg; | 1546 | r8a66597->reg = (unsigned long)reg; |
| 1555 | 1547 | ||
| 1556 | r8a66597->bi_bufnum = R8A66597_BASE_BUFNUM; | ||
| 1557 | |||
| 1558 | #ifdef CONFIG_HAVE_CLK | 1548 | #ifdef CONFIG_HAVE_CLK |
| 1559 | if (r8a66597->pdata->on_chip) { | 1549 | if (r8a66597->pdata->on_chip) { |
| 1560 | snprintf(clk_name, sizeof(clk_name), "usb%d", pdev->id); | 1550 | snprintf(clk_name, sizeof(clk_name), "usb%d", pdev->id); |
