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>
This commit is contained in:
parent
d2e27bdf28
commit
ef5ce3b690
|
@ -252,24 +252,27 @@ static int pipe_buffer_setting(struct r8a66597 *r8a66597,
|
||||||
buf_bsize = 0;
|
buf_bsize = 0;
|
||||||
break;
|
break;
|
||||||
case R8A66597_BULK:
|
case R8A66597_BULK:
|
||||||
bufnum = r8a66597->bi_bufnum +
|
/* isochronous pipes may be used as bulk pipes */
|
||||||
(info->pipe - R8A66597_BASE_PIPENUM_BULK) * 16;
|
if (info->pipe > R8A66597_BASE_PIPENUM_BULK)
|
||||||
r8a66597->bi_bufnum += 16;
|
bufnum = info->pipe - R8A66597_BASE_PIPENUM_BULK;
|
||||||
|
else
|
||||||
|
bufnum = info->pipe - R8A66597_BASE_PIPENUM_ISOC;
|
||||||
|
|
||||||
|
bufnum = R8A66597_BASE_BUFNUM + (bufnum * 16);
|
||||||
buf_bsize = 7;
|
buf_bsize = 7;
|
||||||
pipecfg |= R8A66597_DBLB;
|
pipecfg |= R8A66597_DBLB;
|
||||||
if (!info->dir_in)
|
if (!info->dir_in)
|
||||||
pipecfg |= R8A66597_SHTNAK;
|
pipecfg |= R8A66597_SHTNAK;
|
||||||
break;
|
break;
|
||||||
case R8A66597_ISO:
|
case R8A66597_ISO:
|
||||||
bufnum = r8a66597->bi_bufnum +
|
bufnum = R8A66597_BASE_BUFNUM +
|
||||||
(info->pipe - R8A66597_BASE_PIPENUM_ISOC) * 16;
|
(info->pipe - R8A66597_BASE_PIPENUM_ISOC) * 16;
|
||||||
r8a66597->bi_bufnum += 16;
|
|
||||||
buf_bsize = 7;
|
buf_bsize = 7;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (r8a66597->bi_bufnum > R8A66597_MAX_BUFNUM) {
|
|
||||||
printk(KERN_ERR "r8a66597 pipe memory is insufficient(%d)\n",
|
if (buf_bsize && ((bufnum + 16) >= R8A66597_MAX_BUFNUM)) {
|
||||||
r8a66597->bi_bufnum);
|
pr_err(KERN_ERR "r8a66597 pipe memory is insufficient\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -289,17 +292,6 @@ static void pipe_buffer_release(struct r8a66597 *r8a66597,
|
||||||
if (info->pipe == 0)
|
if (info->pipe == 0)
|
||||||
return;
|
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))
|
if (is_bulk_pipe(info->pipe))
|
||||||
r8a66597->bulk--;
|
r8a66597->bulk--;
|
||||||
else if (is_interrupt_pipe(info->pipe))
|
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->timer.data = (unsigned long)r8a66597;
|
||||||
r8a66597->reg = (unsigned long)reg;
|
r8a66597->reg = (unsigned long)reg;
|
||||||
|
|
||||||
r8a66597->bi_bufnum = R8A66597_BASE_BUFNUM;
|
|
||||||
|
|
||||||
#ifdef CONFIG_HAVE_CLK
|
#ifdef CONFIG_HAVE_CLK
|
||||||
if (r8a66597->pdata->on_chip) {
|
if (r8a66597->pdata->on_chip) {
|
||||||
snprintf(clk_name, sizeof(clk_name), "usb%d", pdev->id);
|
snprintf(clk_name, sizeof(clk_name), "usb%d", pdev->id);
|
||||||
|
|
|
@ -112,7 +112,6 @@ struct r8a66597 {
|
||||||
u16 old_dvsq;
|
u16 old_dvsq;
|
||||||
|
|
||||||
/* pipe config */
|
/* pipe config */
|
||||||
unsigned short bi_bufnum; /* bulk and isochronous's bufnum */
|
|
||||||
unsigned char bulk;
|
unsigned char bulk;
|
||||||
unsigned char interrupt;
|
unsigned char interrupt;
|
||||||
unsigned char isochronous;
|
unsigned char isochronous;
|
||||||
|
|
Loading…
Reference in New Issue