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

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

usb: m66592-udc buffer management update



This patch updates the m66592-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.

With this patch applied it is possible to use m66592-udc for
both Ethernet and Serial using CONFIG_USB_CDC_COMPOSITE.

Signed-off-by: default avatarMagnus Damm <damm@igel.co.jp>
Acked-by: default avatarYoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
Acked-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent 5084f61a
Loading
Loading
Loading
Loading
+12 −22
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ MODULE_LICENSE("GPL");
MODULE_AUTHOR("Yoshihiro Shimoda");
MODULE_ALIAS("platform:m66592_udc");

#define DRIVER_VERSION	"18 Oct 2007"
#define DRIVER_VERSION	"26 Jun 2009"

/* module parameters */
#if defined(CONFIG_SUPERH_BUILT_IN_M66592)
@@ -276,24 +276,27 @@ static int pipe_buffer_setting(struct m66592 *m66592,
		buf_bsize = 0;
		break;
	case M66592_BULK:
		bufnum = m66592->bi_bufnum +
			 (info->pipe - M66592_BASE_PIPENUM_BULK) * 16;
		m66592->bi_bufnum += 16;
		/* isochronous pipes may be used as bulk pipes */
		if (info->pipe > M66592_BASE_PIPENUM_BULK)
			bufnum = info->pipe - M66592_BASE_PIPENUM_BULK;
		else
			bufnum = info->pipe - M66592_BASE_PIPENUM_ISOC;

		bufnum = M66592_BASE_BUFNUM + (bufnum * 16);
		buf_bsize = 7;
		pipecfg |= M66592_DBLB;
		if (!info->dir_in)
			pipecfg |= M66592_SHTNAK;
		break;
	case M66592_ISO:
		bufnum = m66592->bi_bufnum +
		bufnum = M66592_BASE_BUFNUM +
			 (info->pipe - M66592_BASE_PIPENUM_ISOC) * 16;
		m66592->bi_bufnum += 16;
		buf_bsize = 7;
		break;
	}
	if (m66592->bi_bufnum > M66592_MAX_BUFNUM) {
		pr_err("m66592 pipe memory is insufficient(%d)\n",
				m66592->bi_bufnum);

	if (buf_bsize && ((bufnum + 16) >= M66592_MAX_BUFNUM)) {
		pr_err("m66592 pipe memory is insufficient\n");
		return -ENOMEM;
	}

@@ -313,17 +316,6 @@ static void pipe_buffer_release(struct m66592 *m66592,
	if (info->pipe == 0)
		return;

	switch (info->type) {
	case M66592_BULK:
		if (is_bulk_pipe(info->pipe))
			m66592->bi_bufnum -= 16;
		break;
	case M66592_ISO:
		if (is_isoc_pipe(info->pipe))
			m66592->bi_bufnum -= 16;
		break;
	}

	if (is_bulk_pipe(info->pipe)) {
		m66592->bulk--;
	} else if (is_interrupt_pipe(info->pipe))
@@ -1603,8 +1595,6 @@ static int __init m66592_probe(struct platform_device *pdev)
	m66592->timer.data = (unsigned long)m66592;
	m66592->reg = reg;

	m66592->bi_bufnum = M66592_BASE_BUFNUM;

	ret = request_irq(irq, m66592_irq, IRQF_DISABLED | IRQF_SHARED,
			udc_name, m66592);
	if (ret < 0) {
+0 −1
Original line number Diff line number Diff line
@@ -506,7 +506,6 @@ struct m66592 {
	int interrupt;
	int isochronous;
	int num_dma;
	int bi_bufnum;	/* bulk and isochronous's bufnum */
};

#define gadget_to_m66592(_gadget) container_of(_gadget, struct m66592, gadget)