Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ef5ce3b6 authored by Magnus Damm's avatar Magnus Damm Committed by Paul Mundt
Browse files

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: default avatarMagnus Damm <damm@igel.co.jp>
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent d2e27bdf
Loading
Loading
Loading
Loading
+11 −21
Original line number Diff line number Diff line
@@ -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);
+0 −1
Original line number Diff line number Diff line
@@ -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;