From 4fe2032eca29d7f7a0fdf23ef0f3d2c324aeeba2 Mon Sep 17 00:00:00 2001 From: "Suren A. Chilingaryan" Date: Sun, 17 Jul 2011 14:54:21 +0200 Subject: Stop only started engines --- dma/nwl_engine.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'dma/nwl_engine.c') diff --git a/dma/nwl_engine.c b/dma/nwl_engine.c index f5ca30e..2e7ae7e 100644 --- a/dma/nwl_engine.c +++ b/dma/nwl_engine.c @@ -65,10 +65,13 @@ int dma_nwl_start_engine(nwl_dma_t *ctx, pcilib_dma_engine_t dma) { if (info->started) return 0; - // This will only successed if there are no parallel access to DMA engine err = dma_nwl_allocate_engine_buffers(ctx, info); - if (err) return err; + if (err) { + info->started = 1; + dma_nwl_stop_engine(ctx, dma); + return err; + } if (info->reused) { info->preserve = 1; @@ -85,7 +88,11 @@ int dma_nwl_start_engine(nwl_dma_t *ctx, pcilib_dma_engine_t dma) { } else { // Disable IRQs err = dma_nwl_disable_engine_irq(ctx, dma); - if (err) return err; + if (err) { + info->started = 1; + dma_nwl_stop_engine(ctx, dma); + return err; + } // Disable Engine & Reseting val = DMA_ENG_DISABLE|DMA_ENG_USER_RESET; @@ -99,6 +106,9 @@ int dma_nwl_start_engine(nwl_dma_t *ctx, pcilib_dma_engine_t dma) { if (val & (DMA_ENG_STATE_MASK|DMA_ENG_USER_RESET)) { pcilib_error("Timeout during reset of DMA engine %i", info->desc.addr); + + info->started = 1; + dma_nwl_stop_engine(ctx, dma); return PCILIB_ERROR_TIMEOUT; } @@ -113,6 +123,9 @@ int dma_nwl_start_engine(nwl_dma_t *ctx, pcilib_dma_engine_t dma) { if (val & DMA_ENG_RESET) { pcilib_error("Timeout during reset of DMA engine %i", info->desc.addr); + + info->started = 1; + dma_nwl_stop_engine(ctx, dma); return PCILIB_ERROR_TIMEOUT; } @@ -167,6 +180,8 @@ int dma_nwl_stop_engine(nwl_dma_t *ctx, pcilib_dma_engine_t dma) { pcilib_nwl_engine_description_t *info = ctx->engines + dma; char *base = ctx->engines[dma].base_addr; + if (!info->started) return 0; + info->started = 0; err = dma_nwl_disable_engine_irq(ctx, dma); -- cgit v1.2.3