Advertisement
Guest User

DFBSD usb_alloc

a guest
May 29th, 2012
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.63 KB | None | 0 0
  1. static usbd_status
  2. usb_block_allocmem(bus_dma_tag_t tag, size_t size, size_t align,
  3.            usb_dma_block_t **dmap)
  4. {
  5.         usb_dma_block_t *p;
  6.  
  7.     DPRINTFN(5, ("usb_block_allocmem: size=%lu align=%lu\n",
  8.              (u_long)size, (u_long)align));
  9.  
  10.     crit_enter();
  11.     /* First check the free list. */
  12.     for (p = LIST_FIRST(&usb_blk_freelist); p; p = LIST_NEXT(p, next)) {
  13.         if (p->tag == tag && p->size >= size && p->align >= align) {
  14.             LIST_REMOVE(p, next);
  15.             usb_blk_nfree--;
  16.             crit_exit();
  17.             *dmap = p;
  18.             DPRINTFN(6,("usb_block_allocmem: free list size=%lu\n",
  19.                     (u_long)p->size));
  20.             logmemory(blkalloc2, p, NULL, size, align);
  21.             return (USBD_NORMAL_COMPLETION);
  22.         }
  23.     }
  24.     crit_exit();
  25.  
  26.     DPRINTFN(6, ("usb_block_allocmem: no free\n"));
  27.     p = kmalloc(sizeof *p, M_USB, M_INTWAIT);
  28.     logmemory(blkalloc, p, NULL, size, align);
  29.  
  30.     if (bus_dma_tag_create(tag, align, 0,
  31.         BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
  32.         size, NELEM(p->segs), size, BUS_DMA_ALLOCNOW, &p->tag) == ENOMEM) {
  33.         goto free;
  34.     }
  35.  
  36.     p->size = size;
  37.     p->align = align;
  38.     if (bus_dmamem_alloc(p->tag, &p->kaddr,
  39.         BUS_DMA_NOWAIT|BUS_DMA_COHERENT, &p->map))
  40.         goto tagfree;
  41.  
  42.     if (bus_dmamap_load(p->tag, p->map, p->kaddr, p->size,
  43.         usbmem_callback, p, 0))
  44.         goto memfree;
  45.  
  46.     /* XXX - override the tag, ok since we never free it */
  47.     p->tag = tag;
  48.     *dmap = p;
  49.     return (USBD_NORMAL_COMPLETION);
  50.  
  51.     /*
  52.      * XXX - do we need to _unload? is the order of _free and _destroy
  53.      * correct?
  54.      */
  55. memfree:
  56.     bus_dmamem_free(p->tag, p->kaddr, p->map);
  57. tagfree:
  58.     bus_dma_tag_destroy(p->tag);
  59. free:
  60.     kfree(p, M_USB);
  61.     return (USBD_NOMEM);
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement