usb: m66592-udc buffer management update
authorMagnus Damm <damm@igel.co.jp>
Fri, 26 Jun 2009 06:59:17 +0000 (06:59 +0000)
committerPaul Mundt <lethal@linux-sh.org>
Sat, 4 Jul 2009 15:32:19 +0000 (00:32 +0900)
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: Magnus Damm <damm@igel.co.jp>
Acked-by: Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
Acked-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
drivers/usb/gadget/m66592-udc.c
drivers/usb/gadget/m66592-udc.h

index 43dcf9e1af6b06bc46379ccfe1bcfb05aa25f524..0dddd2f8ff359a7ae984c6a9f900bca2d3b21a54 100644 (file)
@@ -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) {
index 286ce07e7960423ac2a18f4b2075c440fab1b010..9a9c2bf9fbd5a87ce017bb92c6b3d954f9a57a83 100644 (file)
@@ -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)