77
77
if (info->reused) {
78
78
info->preserve = 1;
80
dma_nwl_acknowledge_irq(ctx, PCILIB_DMA_IRQ, dma);
80
dma_nwl_acknowledge_irq((pcilib_dma_context_t*)ctx, PCILIB_DMA_IRQ, dma);
82
82
#ifdef NWL_GENERATE_DMA_IRQ
83
83
dma_nwl_enable_engine_irq(ctx, dma);
126
126
return PCILIB_ERROR_TIMEOUT;
129
dma_nwl_acknowledge_irq(ctx, PCILIB_DMA_IRQ, dma);
129
dma_nwl_acknowledge_irq((pcilib_dma_context_t*)ctx, PCILIB_DMA_IRQ, dma);
131
131
ring_pa = pcilib_kmem_get_pa(ctx->pcilib, info->ring);
132
132
nwl_write_register(ring_pa, ctx, info->base_addr, REG_DMA_ENG_NEXT_BD);
201
dma_nwl_acknowledge_irq(ctx, PCILIB_DMA_IRQ, dma);
201
dma_nwl_acknowledge_irq((pcilib_dma_context_t*)ctx, PCILIB_DMA_IRQ, dma);
203
203
if (info->preserve) {
204
204
flags = PCILIB_KMEM_FLAG_REUSE;
229
229
pcilib_nwl_engine_description_t *info = ctx->engines + dma;
231
err = dma_nwl_start(ctx, dma, PCILIB_DMA_FLAGS_DEFAULT);
231
err = dma_nwl_start(vctx, dma, PCILIB_DMA_FLAGS_DEFAULT);
232
232
if (err) return err;
278
278
pcilib_nwl_engine_description_t *info = ctx->engines + dma;
280
err = dma_nwl_start(ctx, dma, PCILIB_DMA_FLAGS_DEFAULT);
280
err = dma_nwl_start(vctx, dma, PCILIB_DMA_FLAGS_DEFAULT);
281
281
if (err) return err;
284
bufnum = dma_nwl_wait_buffer(ctx, info, &bufsize, &eop, timeout);
285
if (bufnum == PCILIB_DMA_BUFFER_INVALID) return PCILIB_ERROR_TIMEOUT;
285
bufnum = dma_nwl_wait_buffer(ctx, info, &bufsize, &eop, 0);
286
if (bufnum == PCILIB_DMA_BUFFER_INVALID) return 0;
288
bufnum = dma_nwl_wait_buffer(ctx, info, &bufsize, &eop, timeout);
289
if (bufnum == PCILIB_DMA_BUFFER_INVALID) {
290
if (ret == 1) return PCILIB_ERROR_TIMEOUT;
287
#ifdef NWL_FIX_EOP_FOR_BIG_PACKETS
289
// printf("%i %i\n", res + bufsize, size);
290
if ((res+bufsize) < size) eop = 0;
291
else if ((res+bufsize) == size) eop = 1;
293
#endif /* NWL_FIX_EOP_FOR_BIG_PACKETS */
295
// EOP is not respected in IPE Camera
296
if (ctx->dmactx.ignore_eop) eop = 1;
295
298
pcilib_kmem_sync_block(ctx->pcilib, info->pages, PCILIB_KMEM_SYNC_FROMDEVICE, bufnum);
296
299
void *buf = pcilib_kmem_get_block_ua(ctx->pcilib, info->pages, bufnum);
297
ret = cb(cbattr, eop?PCILIB_DMA_FLAG_EOP:0, bufsize, buf);
300
ret = cb(cbattr, (eop?PCILIB_DMA_FLAG_EOP:0), bufsize, buf);
298
301
// DS: Fixme, it looks like we can avoid calling this for the sake of performance
299
302
// pcilib_kmem_sync_block(ctx->pcilib, info->pages, PCILIB_KMEM_SYNC_TODEVICE, bufnum);
303
if (ret < 0) return -ret;
300
304
dma_nwl_return_buffer(ctx, info);
313
int dma_nwl_wait_completion(nwl_dma_t * ctx, pcilib_dma_engine_t dma, pcilib_timeout_t timeout) {
314
if (dma_nwl_get_next_buffer(ctx, ctx->engines + dma, PCILIB_NWL_DMA_PAGES - 1, PCILIB_DMA_TIMEOUT) == (PCILIB_NWL_DMA_PAGES - 1)) return 0;
315
else return PCILIB_ERROR_TIMEOUT;