diff options
author | David Brownell <david-b@pacbell.net> | 2007-07-01 12:21:00 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-07-12 16:34:42 -0700 |
commit | c67ab134ba9f83f9de86e58adfeaa14a9efa6e00 (patch) | |
tree | df9022b4a38e955abbf254d71e00ac1fecce6420 /drivers/usb/gadget/omap_udc.c | |
parent | 9d8bab58b758cd5a96d368a8cc64111c9ab50407 (diff) |
usb gadget stack: remove usb_ep_*_buffer(), part 2
This patch removes controller driver infrastructure which supported
the now-removed usb_ep_{alloc,free}_buffer() calls.
As can be seen, many of the implementations of this were broken to
various degrees. Many didn't properly return dma-coherent mappings;
those which did so were necessarily ugly because of bogosity in the
underlying dma_free_coherent() calls ... which on many platforms
can't be called from the same contexts (notably in_irq) from which
their dma_alloc_coherent() sibling can be called.
The main potential downside of removing this is that gadget drivers
wouldn't have specific knowledge that the controller drivers have:
endpoints that aren't dma-capable don't need any dma mappings at all.
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/gadget/omap_udc.c')
-rw-r--r-- | drivers/usb/gadget/omap_udc.c | 108 |
1 files changed, 0 insertions, 108 deletions
diff --git a/drivers/usb/gadget/omap_udc.c b/drivers/usb/gadget/omap_udc.c index c4975a6cf777..9b0f0925dddf 100644 --- a/drivers/usb/gadget/omap_udc.c +++ b/drivers/usb/gadget/omap_udc.c @@ -296,111 +296,6 @@ omap_free_request(struct usb_ep *ep, struct usb_request *_req) /*-------------------------------------------------------------------------*/ -/* - * dma-coherent memory allocation (for dma-capable endpoints) - * - * NOTE: the dma_*_coherent() API calls suck. Most implementations are - * (a) page-oriented, so small buffers lose big; and (b) asymmetric with - * respect to calls with irqs disabled: alloc is safe, free is not. - * We currently work around (b), but not (a). - */ - -static void * -omap_alloc_buffer( - struct usb_ep *_ep, - unsigned bytes, - dma_addr_t *dma, - gfp_t gfp_flags -) -{ - void *retval; - struct omap_ep *ep; - - if (!_ep) - return NULL; - - ep = container_of(_ep, struct omap_ep, ep); - if (use_dma && ep->has_dma) { - static int warned; - if (!warned && bytes < PAGE_SIZE) { - dev_warn(ep->udc->gadget.dev.parent, - "using dma_alloc_coherent for " - "small allocations wastes memory\n"); - warned++; - } - return dma_alloc_coherent(ep->udc->gadget.dev.parent, - bytes, dma, gfp_flags); - } - - retval = kmalloc(bytes, gfp_flags); - if (retval) - *dma = virt_to_phys(retval); - return retval; -} - -static DEFINE_SPINLOCK(buflock); -static LIST_HEAD(buffers); - -struct free_record { - struct list_head list; - struct device *dev; - unsigned bytes; - dma_addr_t dma; -}; - -static void do_free(unsigned long ignored) -{ - spin_lock_irq(&buflock); - while (!list_empty(&buffers)) { - struct free_record *buf; - - buf = list_entry(buffers.next, struct free_record, list); - list_del(&buf->list); - spin_unlock_irq(&buflock); - - dma_free_coherent(buf->dev, buf->bytes, buf, buf->dma); - - spin_lock_irq(&buflock); - } - spin_unlock_irq(&buflock); -} - -static DECLARE_TASKLET(deferred_free, do_free, 0); - -static void omap_free_buffer( - struct usb_ep *_ep, - void *buf, - dma_addr_t dma, - unsigned bytes -) -{ - if (!_ep) { - WARN_ON(1); - return; - } - - /* free memory into the right allocator */ - if (dma != DMA_ADDR_INVALID) { - struct omap_ep *ep; - struct free_record *rec = buf; - unsigned long flags; - - ep = container_of(_ep, struct omap_ep, ep); - - rec->dev = ep->udc->gadget.dev.parent; - rec->bytes = bytes; - rec->dma = dma; - - spin_lock_irqsave(&buflock, flags); - list_add_tail(&rec->list, &buffers); - tasklet_schedule(&deferred_free); - spin_unlock_irqrestore(&buflock, flags); - } else - kfree(buf); -} - -/*-------------------------------------------------------------------------*/ - static void done(struct omap_ep *ep, struct omap_req *req, int status) { @@ -1271,9 +1166,6 @@ static struct usb_ep_ops omap_ep_ops = { .alloc_request = omap_alloc_request, .free_request = omap_free_request, - .alloc_buffer = omap_alloc_buffer, - .free_buffer = omap_free_buffer, - .queue = omap_ep_queue, .dequeue = omap_ep_dequeue, |