Index: sys/dev/iwm/if_iwm.c =================================================================== --- sys/dev/iwm/if_iwm.c +++ sys/dev/iwm/if_iwm.c @@ -2119,6 +2119,7 @@ struct iwm_rx_ring *ring = &sc->rxq; struct iwm_rx_data *data = &ring->data[idx]; struct mbuf *m; + bus_dmamap_t oldmap = NULL; int error; bus_addr_t paddr; @@ -2127,7 +2128,7 @@ return ENOBUFS; if (data->m != NULL) - bus_dmamap_unload(ring->data_dmat, data->map); + oldmap = data->map; m->m_len = m->m_pkthdr.len = m->m_ext.ext_size; error = bus_dmamap_create(ring->data_dmat, 0, &data->map); @@ -2137,17 +2138,23 @@ __func__, error); goto fail; } - data->m = m; error = bus_dmamap_load(ring->data_dmat, data->map, - mtod(data->m, void *), IWM_RBUF_SIZE, iwm_dma_map_addr, + mtod(m, void *), IWM_RBUF_SIZE, iwm_dma_map_addr, &paddr, BUS_DMA_NOWAIT); if (error != 0 && error != EFBIG) { device_printf(sc->sc_dev, "%s: can't not map mbuf, error %d\n", __func__, error); + bus_dmamap_destroy(ring->data_dmat, data->map); goto fail; } bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREREAD); + data->m = m; + + if (oldmap != NULL) { + bus_dmamap_unload(ring->data_dmat, oldmap); + bus_dmamap_destroy(ring->data_dmat, oldmap); + } /* Update RX descriptor. */ ring->desc[idx] = htole32(paddr >> 8); @@ -2156,6 +2163,9 @@ return 0; fail: + m_free(m); + if (oldmap != NULL) + data->map = oldmap; return error; }