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/ _______________________________________________ linux-usb-devel@lists.sourceforge.net To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel