static dma_addr_t xilly_map_single_pci(struct xilly_cleanup *mem, struct xilly_endpoint *ep, void *ptr, size_t size, int direction ) { dma_addr_t addr = 0; struct xilly_dma *this; int pci_direction; this = kmalloc(sizeof(struct xilly_dma), GFP_KERNEL); if (!this) return 0; pci_direction = xilly_pci_direction(direction); addr = pci_map_single(ep->pdev, ptr, size, pci_direction); this->direction = pci_direction; if (pci_dma_mapping_error(ep->pdev, addr)) { kfree(this); return 0; } this->dma_addr = addr; this->pdev = ep->pdev; this->size = size; list_add_tail(&this->node, &mem->to_unmap); return addr; }
static void xilly_dma_sync_single_for_device_pci(struct xilly_endpoint *ep, dma_addr_t dma_handle, size_t size, int direction) { pci_dma_sync_single_for_device(ep->pdev, dma_handle, size, xilly_pci_direction(direction)); }
static int xilly_map_single_pci(struct xilly_endpoint *ep, void *ptr, size_t size, int direction, dma_addr_t *ret_dma_handle ) { int pci_direction; dma_addr_t addr; struct xilly_mapping *this; int rc = 0; this = kzalloc(sizeof(*this), GFP_KERNEL); if (!this) return -ENOMEM; pci_direction = xilly_pci_direction(direction); addr = pci_map_single(ep->pdev, ptr, size, pci_direction); if (pci_dma_mapping_error(ep->pdev, addr)) { kfree(this); return -ENODEV; } this->device = ep->pdev; this->dma_addr = addr; this->size = size; this->direction = pci_direction; *ret_dma_handle = addr; rc = devm_add_action(ep->dev, xilly_pci_unmap, this); if (rc) { pci_unmap_single(ep->pdev, addr, size, pci_direction); kfree(this); } return rc; }