David Brownell wrote:
> On Saturday 14 July 2007, Yoshihiro Shimoda wrote:
> > > Does the following patch behave, with all the locking test
> > > options in the kernel debug menu enabled?
> >
> > I applied this patch and I tested on following kernel debug
> > menu enabled.
> >  - CONFIG_DEBUG_MUTEXES
> >  - CONFIG_DEBUG_SPINLOCK
> >  - CONFIG_DEBUG_LOCK_ALLOC
> >  - CONFIG_DEBUG_SPINLOCK_SLEEP
> >  - CONFIG_PROVE_LOCKING
> > When I tested CONFIG_DEBUG_LOCKDEP enabled, A kernel did not
> > boot at all in my development environment...
>
> Whoops!  That needs fixing.  :(

I try fixing this problem.

> > -   spin_unlock(&ep->m66592->lock);
> > +   spin_unlock(&m66592->lock);
> >     m66592_queue(m66592->gadget.ep0, m66592->ep0_req, GFP_KERNEL);
> > -   spin_lock(&ep->m66592->lock);
> > +   spin_lock(&m66592->lock);
>
> Right; simpler *and* more correct.
>
> Here's the all-rolled-up patch ... if you sign off on the whole
> thing, then I expect it should go upstream ASAP.

I made the patch which fixed a problem pointed out in LKML.
 - fixed memory leak
 - change ep0_buf
 - fixed byteswapping

Should I submit an email to LKML and linux-usb-devel mailing list
after having made a thing including all-rolled-up patch?

Thanks,
Y.Shimoda

---
 drivers/usb/gadget/m66592-udc.c |   21 +++++++++++----------
 drivers/usb/gadget/m66592-udc.h |    2 +-
 2 files changed, 12 insertions(+), 11 deletions(-)

--- linux-2.6.org/drivers/usb/gadget/m66592-udc.c       2007-07-16 
11:44:00.000000000 +0900
+++ linux-2.6/drivers/usb/gadget/m66592-udc.c   2007-07-16 12:36:41.000000000 
+0900
@@ -384,7 +384,7 @@ static void m66592_ep_setting(struct m66

        ep->pipectr = get_pipectr_addr(pipenum);
        ep->pipenum = pipenum;
-       ep->ep.maxpacket = desc->wMaxPacketSize;
+       ep->ep.maxpacket = le16_to_cpu(desc->wMaxPacketSize);
        m66592->pipenum2ep[pipenum] = ep;
        m66592->epaddr2ep[desc->bEndpointAddress&USB_ENDPOINT_NUMBER_MASK] = ep;
        INIT_LIST_HEAD(&ep->queue);
@@ -461,7 +461,7 @@ static int alloc_pipe_config(struct m665
        ep->type = info.type;

        info.epnum = desc->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
-       info.maxpacket = desc->wMaxPacketSize;
+       info.maxpacket = le16_to_cpu(desc->wMaxPacketSize);
        info.interval = desc->bInterval;
        if (desc->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
                info.dir_in = 1;
@@ -922,6 +922,7 @@ __acquires(m66592->lock)
        struct m66592_ep *ep;
        u16 pid;
        u16 status = 0;
+       u16 w_index = le16_to_cpu(ctrl->wIndex);

        switch (ctrl->bRequestType & USB_RECIP_MASK) {
        case USB_RECIP_DEVICE:
@@ -931,7 +932,7 @@ __acquires(m66592->lock)
                status = 0;
                break;
        case USB_RECIP_ENDPOINT:
-               ep = m66592->epaddr2ep[ctrl->wIndex&USB_ENDPOINT_NUMBER_MASK];
+               ep = m66592->epaddr2ep[w_index & USB_ENDPOINT_NUMBER_MASK];
                pid = control_reg_get_pid(m66592, ep->pipenum);
                if (pid == M66592_PID_STALL)
                        status = 1 << USB_ENDPOINT_HALT;
@@ -943,8 +944,8 @@ __acquires(m66592->lock)
                return;         /* exit */
        }

-       *m66592->ep0_buf = status;
-       m66592->ep0_req->buf = m66592->ep0_buf;
+       m66592->ep0_data = cpu_to_le16(status);
+       m66592->ep0_req->buf = &m66592->ep0_data;
        m66592->ep0_req->length = 2;
        spin_unlock(&m66592->lock);
        m66592_queue(m66592->gadget.ep0, m66592->ep0_req, GFP_KERNEL);
@@ -963,8 +964,9 @@ static void clear_feature(struct m66592
        case USB_RECIP_ENDPOINT: {
                struct m66592_ep *ep;
                struct m66592_request *req;
+               u16 w_index = le16_to_cpu(ctrl->wIndex);

-               ep = m66592->epaddr2ep[ctrl->wIndex&USB_ENDPOINT_NUMBER_MASK];
+               ep = m66592->epaddr2ep[w_index & USB_ENDPOINT_NUMBER_MASK];
                pipe_stop(m66592, ep->pipenum);
                control_reg_sqclr(m66592, ep->pipenum);

@@ -999,8 +1001,9 @@ static void set_feature(struct m66592 *m
                break;
        case USB_RECIP_ENDPOINT: {
                struct m66592_ep *ep;
+               u16 w_index = le16_to_cpu(ctrl->wIndex);

-               ep = m66592->epaddr2ep[ctrl->wIndex&USB_ENDPOINT_NUMBER_MASK];
+               ep = m66592->epaddr2ep[w_index & USB_ENDPOINT_NUMBER_MASK];
                pipe_stall(m66592, ep->pipenum);

                control_end(m66592, 1);
@@ -1480,6 +1483,7 @@ static int __exit m66592_remove(struct p
        del_timer_sync(&m66592->timer);
        iounmap(m66592->reg);
        free_irq(platform_get_irq(pdev, 0), m66592);
+       m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req);
        kfree(m66592);
        return 0;
 }
@@ -1587,9 +1591,6 @@ static int __init m66592_probe(struct pl
        if (m66592->ep0_req == NULL)
                goto clean_up;
        m66592->ep0_req->complete = nop_completion;
-       m66592->ep0_buf = kmalloc(2, GFP_KERNEL);
-       if (m66592->ep0_buf == NULL)
-               goto clean_up;

        init_controller(m66592);

--- linux-2.6.org/drivers/usb/gadget/m66592-udc.h       2007-07-16 
11:44:01.000000000 +0900
+++ linux-2.6/drivers/usb/gadget/m66592-udc.h   2007-07-16 11:46:33.000000000 
+0900
@@ -475,7 +475,7 @@ struct m66592 {
        struct m66592_ep        *epaddr2ep[16];

        struct usb_request      *ep0_req;       /* for internal request */
-       u16                     *ep0_buf;       /* for internal request */
+       u16                     ep0_data;       /* for internal request */

        struct timer_list       timer;


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to