diff options
-rw-r--r-- | sys/alpha/alpha/busdma_machdep.c | 5 | ||||
-rw-r--r-- | sys/i386/i386/busdma_machdep.c | 5 | ||||
-rw-r--r-- | sys/ia64/ia64/busdma_machdep.c | 5 | ||||
-rw-r--r-- | sys/powerpc/powerpc/busdma_machdep.c | 1 |
4 files changed, 16 insertions, 0 deletions
diff --git a/sys/alpha/alpha/busdma_machdep.c b/sys/alpha/alpha/busdma_machdep.c index 12f57cd..7e50116 100644 --- a/sys/alpha/alpha/busdma_machdep.c +++ b/sys/alpha/alpha/busdma_machdep.c @@ -94,6 +94,7 @@ struct bus_dmamap { vm_offset_t busaddress; /* address in bus space */ bus_dmamap_callback_t *callback; void *callback_arg; + struct mtx *callback_mtx; void *sgmaphandle; /* handle into sgmap */ STAILQ_ENTRY(bus_dmamap) links; }; @@ -931,8 +932,12 @@ busdma_swi(void) while ((map = STAILQ_FIRST(&bounce_map_callbacklist)) != NULL) { STAILQ_REMOVE_HEAD(&bounce_map_callbacklist, links); mtx_unlock(&bounce_lock); + if (map->callback_mtx != NULL) + mtx_lock(map->callback_mtx); bus_dmamap_load(map->dmat, map, map->buf, map->buflen, map->callback, map->callback_arg, /*flags*/0); + if (map->callback_mtx != NULL) + mtx_unlock(map->callback_mtx); mtx_lock(&bounce_lock); } mtx_unlock(&bounce_lock); diff --git a/sys/i386/i386/busdma_machdep.c b/sys/i386/i386/busdma_machdep.c index a2609ee..183b0f7 100644 --- a/sys/i386/i386/busdma_machdep.c +++ b/sys/i386/i386/busdma_machdep.c @@ -92,6 +92,7 @@ struct bus_dmamap { bus_size_t buflen; /* unmapped buffer length */ bus_dmamap_callback_t *callback; void *callback_arg; + struct mtx *callback_mtx; STAILQ_ENTRY(bus_dmamap) links; }; @@ -869,8 +870,12 @@ busdma_swi(void) while ((map = STAILQ_FIRST(&bounce_map_callbacklist)) != NULL) { STAILQ_REMOVE_HEAD(&bounce_map_callbacklist, links); mtx_unlock(&bounce_lock); + if (map->callback_mtx != NULL) + mtx_lock(map->callback_mtx); bus_dmamap_load(map->dmat, map, map->buf, map->buflen, map->callback, map->callback_arg, /*flags*/0); + if (map->callback_mtx != NULL) + mtx_unlock(map->callback_mtx); mtx_lock(&bounce_lock); } mtx_unlock(&bounce_lock); diff --git a/sys/ia64/ia64/busdma_machdep.c b/sys/ia64/ia64/busdma_machdep.c index 33cece4..466e995 100644 --- a/sys/ia64/ia64/busdma_machdep.c +++ b/sys/ia64/ia64/busdma_machdep.c @@ -90,6 +90,7 @@ struct bus_dmamap { vm_offset_t busaddress; /* address in bus space */ bus_dmamap_callback_t *callback; void *callback_arg; + struct mtx *callback_mtx; void *sgmaphandle; /* handle into sgmap */ STAILQ_ENTRY(bus_dmamap) links; }; @@ -920,8 +921,12 @@ busdma_swi(void) while ((map = STAILQ_FIRST(&bounce_map_callbacklist)) != NULL) { STAILQ_REMOVE_HEAD(&bounce_map_callbacklist, links); splx(s); + if (map->callback_mtx != NULL) + mtx_lock(map->callback_mtx); bus_dmamap_load(map->dmat, map, map->buf, map->buflen, map->callback, map->callback_arg, /*flags*/0); + if (map->callback_mtx != NULL) + mtx_unlock(map->callback_mtx); s = splhigh(); } splx(s); diff --git a/sys/powerpc/powerpc/busdma_machdep.c b/sys/powerpc/powerpc/busdma_machdep.c index 34c737f..3d6d402 100644 --- a/sys/powerpc/powerpc/busdma_machdep.c +++ b/sys/powerpc/powerpc/busdma_machdep.c @@ -75,6 +75,7 @@ struct bus_dmamap { bus_size_t buflen; /* unmapped buffer length */ bus_dmamap_callback_t *callback; void *callback_arg; + struct mtx *callback_mtx; }; /* |