svn commit: r302102 - head/sys/dev/iwm
Adrian Chadd
adrian at FreeBSD.org
Thu Jun 23 01:00:14 UTC 2016
Author: adrian
Date: Thu Jun 23 01:00:13 2016
New Revision: 302102
URL: https://svnweb.freebsd.org/changeset/base/302102
Log:
[iwm] Fix iwm_dma_contig_free(). dma->map is always NULL here.
* When bus_dmamem_alloc is used, the bus_dmamap_t is usually set to NULL, so
we were never actually freeing any dma memory allocations done via
iwm_dma_contig_alloc(). So we should check dma->vaddr instead of dma->map here.
* Also, the dmamap is actually supposed to be invalidated as part of
bus_dmamem_free(), so bus_dmamap_destroy() is never needed here.
Submitted by: Imre Vadasz <imre at vdsz.com>
Approved by: re (gjb)
Obtained from: DragonflyBSD git ef2b29a7ba6ca8a9d2c82ab591c0622227ff84cb
Modified:
head/sys/dev/iwm/if_iwm.c
Modified: head/sys/dev/iwm/if_iwm.c
==============================================================================
--- head/sys/dev/iwm/if_iwm.c Thu Jun 23 00:56:54 2016 (r302101)
+++ head/sys/dev/iwm/if_iwm.c Thu Jun 23 01:00:13 2016 (r302102)
@@ -721,6 +721,7 @@ iwm_dma_contig_alloc(bus_dma_tag_t tag,
dma->tag = NULL;
dma->size = size;
+ dma->vaddr = NULL;
error = bus_dma_tag_create(tag, alignment,
0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, size,
@@ -735,8 +736,11 @@ iwm_dma_contig_alloc(bus_dma_tag_t tag,
error = bus_dmamap_load(dma->tag, dma->map, dma->vaddr, size,
iwm_dma_map_addr, &dma->paddr, BUS_DMA_NOWAIT);
- if (error != 0)
+ if (error != 0) {
+ bus_dmamem_free(dma->tag, dma->vaddr, dma->map);
+ dma->vaddr = NULL;
goto fail;
+ }
bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE);
@@ -749,16 +753,12 @@ fail: iwm_dma_contig_free(dma);
static void
iwm_dma_contig_free(struct iwm_dma_info *dma)
{
- 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->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;
}
if (dma->tag != NULL) {
bus_dma_tag_destroy(dma->tag);
More information about the svn-src-all
mailing list