96
96
pcilib_kmem_reuse_state_t reuse_ring, reuse_pages;
97
97
pcilib_kmem_flags_t flags;
98
pcilib_kmem_type_t type;
99
100
char *base = info->base_addr;
101
102
if (info->pages) return 0;
103
104
// Or bidirectional specified by 0x0|addr, or read 0x0|addr and write 0x80|addr
105
type = (info->desc.direction == PCILIB_DMA_TO_DEVICE)?PCILIB_KMEM_TYPE_DMA_S2C_PAGE:PCILIB_KMEM_TYPE_DMA_C2S_PAGE;
104
106
sub_use = info->desc.addr|((info->desc.direction == PCILIB_DMA_TO_DEVICE)?0x80:0x00);
105
107
flags = PCILIB_KMEM_FLAG_REUSE|PCILIB_KMEM_FLAG_EXCLUSIVE|PCILIB_KMEM_FLAG_HARDWARE|(info->preserve?PCILIB_KMEM_FLAG_PERSISTENT:0);
107
109
pcilib_kmem_handle_t *ring = pcilib_alloc_kernel_memory(ctx->pcilib, PCILIB_KMEM_TYPE_CONSISTENT, 1, PCILIB_NWL_DMA_PAGES * PCILIB_NWL_DMA_DESCRIPTOR_SIZE, PCILIB_NWL_ALIGNMENT, PCILIB_KMEM_USE(PCILIB_KMEM_USE_DMA_RING, sub_use), flags);
108
pcilib_kmem_handle_t *pages = pcilib_alloc_kernel_memory(ctx->pcilib, PCILIB_KMEM_TYPE_PAGE, PCILIB_NWL_DMA_PAGES, 0, 0, PCILIB_KMEM_USE(PCILIB_KMEM_USE_DMA_PAGES, sub_use), flags);
110
pcilib_kmem_handle_t *pages = pcilib_alloc_kernel_memory(ctx->pcilib, type, PCILIB_NWL_DMA_PAGES, 0, 0, PCILIB_KMEM_USE(PCILIB_KMEM_USE_DMA_PAGES, sub_use), flags);
110
if ((ring)&&(pages)) err = dma_nwl_sync_buffers(ctx, info, pages);
111
else err = PCILIB_ERROR_FAILED;
112
// if ((ring)&&(pages)) err = dma_nwl_sync_buffers(ctx, info, pages);
113
// else err = PCILIB_ERROR_FAILED;
114
116
if (pages) pcilib_free_kernel_memory(ctx->pcilib, pages, 0);