summaryrefslogtreecommitdiffstats
path: root/sys/dev/bce
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2014-06-11 20:46:23 +0000
committerjhb <jhb@FreeBSD.org>2014-06-11 20:46:23 +0000
commit796b4715faa83209cd9a7cd419f62aa9faf9d2db (patch)
tree197818da5d73bfa8ba3bc21533d4a55f7efbe60c /sys/dev/bce
parent8e25d6b2c0c5a3165fe286b5d9bee0c16f74ca3f (diff)
downloadFreeBSD-src-796b4715faa83209cd9a7cd419f62aa9faf9d2db.zip
FreeBSD-src-796b4715faa83209cd9a7cd419f62aa9faf9d2db.tar.gz
- Unmap static DMA buffers allocated via bus_dmemem_alloc() before
freeing them instead of after. - Check the bus address of a static DMA buffer to decide if the associated map should be unloaded. - Don't try to destroy bus dma maps for static DMA buffers. Reviewed by: davidcs
Diffstat (limited to 'sys/dev/bce')
-rw-r--r--sys/dev/bce/if_bce.c100
1 files changed, 42 insertions, 58 deletions
diff --git a/sys/dev/bce/if_bce.c b/sys/dev/bce/if_bce.c
index 1605d24..c888b49 100644
--- a/sys/dev/bce/if_bce.c
+++ b/sys/dev/bce/if_bce.c
@@ -3251,6 +3251,13 @@ bce_dma_free(struct bce_softc *sc)
DBENTER(BCE_VERBOSE_RESET | BCE_VERBOSE_UNLOAD | BCE_VERBOSE_CTX);
/* Free, unmap, and destroy the status block. */
+ if (sc->status_block_paddr != 0) {
+ bus_dmamap_unload(
+ sc->status_tag,
+ sc->status_map);
+ sc->status_block_paddr = 0;
+ }
+
if (sc->status_block != NULL) {
bus_dmamem_free(
sc->status_tag,
@@ -3259,15 +3266,6 @@ bce_dma_free(struct bce_softc *sc)
sc->status_block = NULL;
}
- if (sc->status_map != NULL) {
- bus_dmamap_unload(
- sc->status_tag,
- sc->status_map);
- bus_dmamap_destroy(sc->status_tag,
- sc->status_map);
- sc->status_map = NULL;
- }
-
if (sc->status_tag != NULL) {
bus_dma_tag_destroy(sc->status_tag);
sc->status_tag = NULL;
@@ -3275,21 +3273,19 @@ bce_dma_free(struct bce_softc *sc)
/* Free, unmap, and destroy the statistics block. */
- if (sc->stats_block != NULL) {
- bus_dmamem_free(
+ if (sc->stats_block_paddr != 0) {
+ bus_dmamap_unload(
sc->stats_tag,
- sc->stats_block,
sc->stats_map);
- sc->stats_block = NULL;
+ sc->stats_block_paddr = 0;
}
- if (sc->stats_map != NULL) {
- bus_dmamap_unload(
+ if (sc->stats_block != NULL) {
+ bus_dmamem_free(
sc->stats_tag,
+ sc->stats_block,
sc->stats_map);
- bus_dmamap_destroy(sc->stats_tag,
- sc->stats_map);
- sc->stats_map = NULL;
+ sc->stats_block = NULL;
}
if (sc->stats_tag != NULL) {
@@ -3301,22 +3297,19 @@ bce_dma_free(struct bce_softc *sc)
/* Free, unmap and destroy all context memory pages. */
if (BCE_CHIP_NUM(sc) == BCE_CHIP_NUM_5709) {
for (i = 0; i < sc->ctx_pages; i++ ) {
- if (sc->ctx_block[i] != NULL) {
- bus_dmamem_free(
+ if (sc->ctx_paddr[i] != 0) {
+ bus_dmamap_unload(
sc->ctx_tag,
- sc->ctx_block[i],
sc->ctx_map[i]);
- sc->ctx_block[i] = NULL;
+ sc->ctx_paddr[i] = 0;
}
- if (sc->ctx_map[i] != NULL) {
- bus_dmamap_unload(
- sc->ctx_tag,
- sc->ctx_map[i]);
- bus_dmamap_destroy(
+ if (sc->ctx_block[i] != NULL) {
+ bus_dmamem_free(
sc->ctx_tag,
+ sc->ctx_block[i],
sc->ctx_map[i]);
- sc->ctx_map[i] = NULL;
+ sc->ctx_block[i] = NULL;
}
}
@@ -3330,22 +3323,19 @@ bce_dma_free(struct bce_softc *sc)
/* Free, unmap and destroy all TX buffer descriptor chain pages. */
for (i = 0; i < sc->tx_pages; i++ ) {
- if (sc->tx_bd_chain[i] != NULL) {
- bus_dmamem_free(
+ if (sc->tx_bd_chain_paddr[i] != 0) {
+ bus_dmamap_unload(
sc->tx_bd_chain_tag,
- sc->tx_bd_chain[i],
sc->tx_bd_chain_map[i]);
- sc->tx_bd_chain[i] = NULL;
+ sc->tx_bd_chain_paddr[i] = 0;
}
- if (sc->tx_bd_chain_map[i] != NULL) {
- bus_dmamap_unload(
- sc->tx_bd_chain_tag,
- sc->tx_bd_chain_map[i]);
- bus_dmamap_destroy(
+ if (sc->tx_bd_chain[i] != NULL) {
+ bus_dmamem_free(
sc->tx_bd_chain_tag,
+ sc->tx_bd_chain[i],
sc->tx_bd_chain_map[i]);
- sc->tx_bd_chain_map[i] = NULL;
+ sc->tx_bd_chain[i] = NULL;
}
}
@@ -3358,22 +3348,19 @@ bce_dma_free(struct bce_softc *sc)
/* Free, unmap and destroy all RX buffer descriptor chain pages. */
for (i = 0; i < sc->rx_pages; i++ ) {
- if (sc->rx_bd_chain[i] != NULL) {
- bus_dmamem_free(
+ if (sc->rx_bd_chain_paddr[i] != 0) {
+ bus_dmamap_unload(
sc->rx_bd_chain_tag,
- sc->rx_bd_chain[i],
sc->rx_bd_chain_map[i]);
- sc->rx_bd_chain[i] = NULL;
+ sc->rx_bd_chain_paddr[i] = 0;
}
- if (sc->rx_bd_chain_map[i] != NULL) {
- bus_dmamap_unload(
- sc->rx_bd_chain_tag,
- sc->rx_bd_chain_map[i]);
- bus_dmamap_destroy(
+ if (sc->rx_bd_chain[i] != NULL) {
+ bus_dmamem_free(
sc->rx_bd_chain_tag,
+ sc->rx_bd_chain[i],
sc->rx_bd_chain_map[i]);
- sc->rx_bd_chain_map[i] = NULL;
+ sc->rx_bd_chain[i] = NULL;
}
}
@@ -3387,22 +3374,19 @@ bce_dma_free(struct bce_softc *sc)
/* Free, unmap and destroy all page buffer descriptor chain pages. */
if (bce_hdr_split == TRUE) {
for (i = 0; i < sc->pg_pages; i++ ) {
- if (sc->pg_bd_chain[i] != NULL) {
- bus_dmamem_free(
+ if (sc->pg_bd_chain_paddr[i] != 0) {
+ bus_dmamap_unload(
sc->pg_bd_chain_tag,
- sc->pg_bd_chain[i],
sc->pg_bd_chain_map[i]);
- sc->pg_bd_chain[i] = NULL;
+ sc->pg_bd_chain_paddr[i] = 0;
}
- if (sc->pg_bd_chain_map[i] != NULL) {
- bus_dmamap_unload(
- sc->pg_bd_chain_tag,
- sc->pg_bd_chain_map[i]);
- bus_dmamap_destroy(
+ if (sc->pg_bd_chain[i] != NULL) {
+ bus_dmamem_free(
sc->pg_bd_chain_tag,
+ sc->pg_bd_chain[i],
sc->pg_bd_chain_map[i]);
- sc->pg_bd_chain_map[i] = NULL;
+ sc->pg_bd_chain[i] = NULL;
}
}
OpenPOWER on IntegriCloud