amd5536udc: fixed shared interrupt bug and warning oops
PATCH 1/1 amd5536udc: fixed shared interrupt bug and warning oops
Quoted 1 line
From
9654f85cbeabec4b8652f9785bea317cd7068edbMon Sep 17 00:00:00 2001
From: Thomas <[email protected]>
Date: Tue, 11 Aug 2009 22:09:55 +0200
Subject: [PATCH] amd5536udc: fixed shared interrupt bug and warning oops
- fixed shared interrupt bug reported by Vadim Lobanov
- fixed possible warning oops on driver unload when connected
- prevent interrupt flood in PIO mode ("modprobe amd5536udc use_dma=0") when using gadget ether
- applied patch "Drop NULL test on list_entry result" submitted by Julia Lawall
--- drivers/usb/gadget/amd5536udc.c | 103 ++++++++++++++++++++------------------ 1 files changed, 54 insertions(+), 49 deletions(-)
drivers/usb/gadget/amd5536udc.c +54 -49
@@ -1213,6 +1213,11 @@ udc_queue(struct usb_ep *usbep, struct usb_request *usbreq, gfp_t gfp) tmp &=AMD_UNMASK_BIT (ep->num);writel (tmp, &dev->regs->ep_irqmsk); } + }else if (ep->in) { +/* enable ep irq */ + tmp =readl (&dev->regs->ep_irqmsk); + tmp &=AMD_UNMASK_BIT (ep->num); +writel (tmp, &dev->regs->ep_irqmsk); } }else if (ep->dma) {
@@ -2005,18 +2010,17 @@ __acquires(dev->lock) {int tmp; -/* empty queues and init hardware */ -udc_basic_init (dev); -for (tmp =0 ; tmp <UDC_EP_NUM ; tmp++) { -empty_req_queue (&dev->ep[tmp]); - } -if (dev->gadget.speed !=USB_SPEED_UNKNOWN ) {spin_unlock (&dev->lock); driver->disconnect (&dev->gadget);spin_lock (&dev->lock); } -/* init */ + +/* empty queues and init hardware */ +udc_basic_init (dev); +for (tmp =0 ; tmp <UDC_EP_NUM ; tmp++) +empty_req_queue (&dev->ep[tmp]); +udc_setup_endpoints (dev); }
@@ -2378,40 +2382,34 @@ static irqreturn_t udc_data_in_isr(struct udc *dev, int ep_ix)if (!ep->cancel_transfer && !list_empty (&ep->queue)) { req =list_entry (ep->queue.next, struct udc_request, queue); -if (req) { -/* -* length bytes transfered -* check dma done of last desc. in PPBDU mode -*/ -if (use_dma_ppb_du) { - td =udc_get_last_dma_desc (req); -if (td) { - dma_done = -AMD_GETBITS (td->status, -UDC_DMA_IN_STS_BS ); -/* don't care DMA done */ - req->req.actual = - req->req.length; - } - }else { -/* assume all bytes transferred */ +/* +* length bytes transfered +* check dma done of last desc. in PPBDU mode +*/ +if (use_dma_ppb_du) { + td =udc_get_last_dma_desc (req); +if (td) { + dma_done = +AMD_GETBITS (td->status, +UDC_DMA_IN_STS_BS ); +/* don't care DMA done */ req->req.actual = req->req.length; } + }else { +/* assume all bytes transferred */ + req->req.actual = req->req.length; + } -if (req->req.actual == req->req.length) { -/* complete req */ -complete_req (ep, req,0 ); - req->dma_going =0 ; -/* further request available ? */ -if (list_empty (&ep->queue)) { -/* disable interrupt */ - tmp =readl ( - &dev->regs->ep_irqmsk); - tmp |=AMD_BIT (ep->num); -writel (tmp, - &dev->regs->ep_irqmsk); - } - +if (req->req.actual == req->req.length) { +/* complete req */ +complete_req (ep, req,0 ); + req->dma_going =0 ; +/* further request available ? */ +if (list_empty (&ep->queue)) { +/* disable interrupt */ + tmp =readl (&dev->regs->ep_irqmsk); + tmp |=AMD_BIT (ep->num); +writel (tmp, &dev->regs->ep_irqmsk); } } }
@@ -2478,6 +2476,13 @@ static irqreturn_t udc_data_in_isr(struct udc *dev, int ep_ix) } } + }else if (!use_dma && ep->in) { +/* disable interrupt */ + tmp =readl ( + &dev->regs->ep_irqmsk); + tmp |=AMD_BIT (ep->num); +writel (tmp, + &dev->regs->ep_irqmsk); } }/* clear status bits */
@@ -3285,6 +3290,17 @@ static int udc_pci_probe( goto finished; } +spin_lock_init (&dev->lock); +/* udc csr registers base */ + dev->csr = dev->virt_addr +UDC_CSR_ADDR ; +/* dev registers base */ + dev->regs = dev->virt_addr +UDC_DEVCFG_ADDR ; +/* ep registers base */ + dev->ep_regs = dev->virt_addr +UDC_EPREGS_ADDR ; +/* fifo's base */ + dev->rxfifo = (u32 __iomem *)(dev->virt_addr +UDC_RXFIFO_ADDR ); + dev->txfifo = (u32 __iomem *)(dev->virt_addr +UDC_TXFIFO_ADDR ); +if (request_irq (pdev->irq, udc_irq,IRQF_SHARED , name, dev) !=0 ) {dev_dbg (&dev->pdev->dev,"request_irq(%d) fail\n" , pdev->irq);kfree (dev);
@@ -3337,7 +3353,6 @@ static int udc_probe(struct udc *dev) udc_pollstall_timer.data =0 ;/* device struct setup */ -spin_lock_init (&dev->lock); dev->gadget.ops = &udc_ops;dev_set_name (&dev->gadget.dev,"gadget" );
@@ -3346,16 +3361,6 @@ static int udc_probe(struct udc *dev) dev->gadget.name = name; dev->gadget.is_dualspeed =1 ; -/* udc csr registers base */ - dev->csr = dev->virt_addr +UDC_CSR_ADDR ; -/* dev registers base */ - dev->regs = dev->virt_addr +UDC_DEVCFG_ADDR ; -/* ep registers base */ - dev->ep_regs = dev->virt_addr +UDC_EPREGS_ADDR ; -/* fifo's base */ - dev->rxfifo = (u32 __iomem *)(dev->virt_addr +UDC_RXFIFO_ADDR ); - dev->txfifo = (u32 __iomem *)(dev->virt_addr +UDC_TXFIFO_ADDR ); -/* init registers, interrupts, ... */ startup_registers (dev);
Signature · 1 line
1.5.6.3
Quoted 9 lines · Thomas Dahlmann
Quoted 1 line
From
9654f85cbeabec4b8652f9785bea317cd7068edbMon Sep 17 00:00:00 2001From: Thomas <[email protected]>
Date: Tue, 11 Aug 2009 22:09:55 +0200
Subject: [PATCH] amd5536udc: fixed shared interrupt bug and warning oops
- fixed shared interrupt bug reported by Vadim Lobanov
- fixed possible warning oops on driver unload when connected
- prevent interrupt flood in PIO mode ("modprobe amd5536udc use_dma=0") when using gadget ether
- applied patch "Drop NULL test onlist_entryresult" submitted by Julia Lawall
I'll give this patch a spin on our boxes as soon as I get a chance to do so. Thanks for sending it out. :)
Quoted 11 lines · Thomas Dahlmann
Quoted 1 line
From
9654f85cbeabec4b8652f9785bea317cd7068edbMon Sep 17 00:00:00 2001From: Thomas <[email protected]>
Date: Tue, 11 Aug 2009 22:09:55 +0200
Subject: [PATCH] amd5536udc: fixed shared interrupt bug and warning oops
- fixed shared interrupt bug reported by Vadim Lobanov
- fixed possible warning oops on driver unload when connected
- prevent interrupt flood in PIO mode ("modprobe amd5536udc use_dma=0") when using gadget ether
- applied patch "Drop NULL test onlist_entryresult" submitted by Julia LawallSigned-off-by Thomas <[email protected]>
Looks good.
Quoted 6 lines · On Wed, 12 Aug 2009 00:00:56 +0200 Thomas Dahlmann <[email protected]>…
Subject: [PATCH] amd5536udc: fixed shared interrupt bug and warning oops
- fixed shared interrupt bug reported by Vadim Lobanov
- fixed possible warning oops on driver unload when connected
- prevent interrupt flood in PIO mode ("modprobe amd5536udc use_dma=0") when using gadget ether
- applied patch "Drop NULL test onlist_entryresult" submitted by Julia Lawall
Julia's patch is already in linux-next, so I can't apply this.