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