Fix the RX free list locking creation and destruction to be consistent
even in the face of errors. If the RX descriptor list fails, the RX lock won't be initialised, but then the DMA free path wil try freeing it. This commit is brought to you by a working mwl(4).
This commit is contained in:
parent
865a6f735d
commit
baf94755c0
@ -310,6 +310,12 @@ mwl_attach(uint16_t devid, struct mwl_softc *sc)
|
|||||||
}
|
}
|
||||||
ic = ifp->if_l2com;
|
ic = ifp->if_l2com;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Setup the RX free list lock early, so it can be consistently
|
||||||
|
* removed.
|
||||||
|
*/
|
||||||
|
MWL_RXFREE_INIT(sc);
|
||||||
|
|
||||||
/* set these up early for if_printf use */
|
/* set these up early for if_printf use */
|
||||||
if_initname(ifp, device_get_name(sc->sc_dev),
|
if_initname(ifp, device_get_name(sc->sc_dev),
|
||||||
device_get_unit(sc->sc_dev));
|
device_get_unit(sc->sc_dev));
|
||||||
@ -531,6 +537,7 @@ mwl_attach(uint16_t devid, struct mwl_softc *sc)
|
|||||||
bad1:
|
bad1:
|
||||||
mwl_hal_detach(mh);
|
mwl_hal_detach(mh);
|
||||||
bad:
|
bad:
|
||||||
|
MWL_RXFREE_DESTROY(sc);
|
||||||
if_free(ifp);
|
if_free(ifp);
|
||||||
sc->sc_invalid = 1;
|
sc->sc_invalid = 1;
|
||||||
return error;
|
return error;
|
||||||
@ -561,6 +568,7 @@ mwl_detach(struct mwl_softc *sc)
|
|||||||
ieee80211_ifdetach(ic);
|
ieee80211_ifdetach(ic);
|
||||||
callout_drain(&sc->sc_watchdog);
|
callout_drain(&sc->sc_watchdog);
|
||||||
mwl_dma_cleanup(sc);
|
mwl_dma_cleanup(sc);
|
||||||
|
MWL_RXFREE_DESTROY(sc);
|
||||||
mwl_tx_cleanup(sc);
|
mwl_tx_cleanup(sc);
|
||||||
mwl_hal_detach(sc->sc_mh);
|
mwl_hal_detach(sc->sc_mh);
|
||||||
if_free(ifp);
|
if_free(ifp);
|
||||||
@ -2274,7 +2282,6 @@ mwl_rxdma_setup(struct mwl_softc *sc)
|
|||||||
SLIST_INSERT_HEAD(&sc->sc_rxfree, rbuf, next);
|
SLIST_INSERT_HEAD(&sc->sc_rxfree, rbuf, next);
|
||||||
sc->sc_nrxfree++;
|
sc->sc_nrxfree++;
|
||||||
}
|
}
|
||||||
MWL_RXFREE_INIT(sc);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#undef DS2PHYS
|
#undef DS2PHYS
|
||||||
@ -2298,7 +2305,6 @@ mwl_rxdma_cleanup(struct mwl_softc *sc)
|
|||||||
}
|
}
|
||||||
if (sc->sc_rxdma.dd_desc_len != 0)
|
if (sc->sc_rxdma.dd_desc_len != 0)
|
||||||
mwl_desc_cleanup(sc, &sc->sc_rxdma);
|
mwl_desc_cleanup(sc, &sc->sc_rxdma);
|
||||||
MWL_RXFREE_DESTROY(sc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
Loading…
Reference in New Issue
Block a user