diff options
author | bschmidt <bschmidt@FreeBSD.org> | 2011-04-16 10:35:02 +0000 |
---|---|---|
committer | bschmidt <bschmidt@FreeBSD.org> | 2011-04-16 10:35:02 +0000 |
commit | ebcc30282ef329fde579a7276090b2a4e2fe6e4b (patch) | |
tree | 22142a1c40690a9f1b7e142638626c35f76190b0 | |
parent | 7c20ac5e151fd7bf876c5ae92b96c3da95cd6dcd (diff) | |
download | FreeBSD-src-ebcc30282ef329fde579a7276090b2a4e2fe6e4b.zip FreeBSD-src-ebcc30282ef329fde579a7276090b2a4e2fe6e4b.tar.gz |
Make sure to destroy all DMA tags and maps.
-rw-r--r-- | sys/dev/iwn/if_iwn.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/sys/dev/iwn/if_iwn.c b/sys/dev/iwn/if_iwn.c index 0f35d6c..8d7959a 100644 --- a/sys/dev/iwn/if_iwn.c +++ b/sys/dev/iwn/if_iwn.c @@ -1159,16 +1159,20 @@ fail: static void iwn_dma_contig_free(struct iwn_dma_info *dma) { - if (dma->tag != NULL) { - if (dma->map != NULL) { - if (dma->paddr == 0) { - bus_dmamap_sync(dma->tag, dma->map, - BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE); - bus_dmamap_unload(dma->tag, dma->map); - } + if (dma->map != NULL) { + if (dma->vaddr != NULL) { + bus_dmamap_sync(dma->tag, dma->map, + BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); + bus_dmamap_unload(dma->tag, dma->map); bus_dmamem_free(dma->tag, &dma->vaddr, dma->map); + dma->vaddr = NULL; } + bus_dmamap_destroy(dma->tag, dma->map); + dma->map = NULL; + } + if (dma->tag != NULL) { bus_dma_tag_destroy(dma->tag); + dma->tag = NULL; } } @@ -1360,6 +1364,10 @@ iwn_free_rx_ring(struct iwn_softc *sc, struct iwn_rx_ring *ring) if (data->map != NULL) bus_dmamap_destroy(ring->data_dmat, data->map); } + if (ring->data_dmat != NULL) { + bus_dma_tag_destroy(ring->data_dmat); + ring->data_dmat = NULL; + } } static int @@ -1479,6 +1487,10 @@ iwn_free_tx_ring(struct iwn_softc *sc, struct iwn_tx_ring *ring) if (data->map != NULL) bus_dmamap_destroy(ring->data_dmat, data->map); } + if (ring->data_dmat != NULL) { + bus_dma_tag_destroy(ring->data_dmat); + ring->data_dmat = NULL; + } } static void |