On Sunday 15 July 2007, Yoshihiro Shimoda wrote:
> 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.
It's rather far afield from USB!
>
> > 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
It doesn't fix the probe() path which returns after error
without unregistering the IRQ handler, though ... a leak,
but not a memory leak.
> Should I submit an email to LKML and linux-usb-devel mailing list
> after having made a thing including all-rolled-up patch?
Unfortunately Linus merged a partial fix yesterday ... rather
than the more complete update which predated it. (Sigh).
Greg, do you have a suggestion about how to resolve this mess?
Unfortunately it seems Linus isn't taking patches direct from
me lately...
- Dave
>
> 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/
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel