Lines 208-213
Link Here
|
208 |
const uint8_t [IEEE80211_ADDR_LEN], |
208 |
const uint8_t [IEEE80211_ADDR_LEN], |
209 |
const uint8_t [IEEE80211_ADDR_LEN]); |
209 |
const uint8_t [IEEE80211_ADDR_LEN]); |
210 |
static void urtwn_vap_delete(struct ieee80211vap *); |
210 |
static void urtwn_vap_delete(struct ieee80211vap *); |
|
|
211 |
static void urtwn_vap_clear_tx(struct urtwn_softc *, |
212 |
struct ieee80211vap *); |
213 |
static void urtwn_vap_clear_tx_queue(struct urtwn_softc *, |
214 |
urtwn_datahead *, struct ieee80211vap *); |
211 |
static struct mbuf * urtwn_rx_copy_to_mbuf(struct urtwn_softc *, |
215 |
static struct mbuf * urtwn_rx_copy_to_mbuf(struct urtwn_softc *, |
212 |
struct r92c_rx_stat *, int); |
216 |
struct r92c_rx_stat *, int); |
213 |
static struct mbuf * urtwn_report_intr(struct usb_xfer *, |
217 |
static struct mbuf * urtwn_report_intr(struct usb_xfer *, |
Lines 824-831
Link Here
|
824 |
struct urtwn_softc *sc = ic->ic_softc; |
828 |
struct urtwn_softc *sc = ic->ic_softc; |
825 |
struct urtwn_vap *uvp = URTWN_VAP(vap); |
829 |
struct urtwn_vap *uvp = URTWN_VAP(vap); |
826 |
|
830 |
|
|
|
831 |
/* Guarantee that nothing will go through this vap. */ |
832 |
ieee80211_new_state(vap, IEEE80211_S_INIT, -1); |
833 |
ieee80211_draintask(ic, &vap->iv_nstate_task); |
834 |
|
835 |
URTWN_LOCK(sc); |
827 |
if (uvp->bcn_mbuf != NULL) |
836 |
if (uvp->bcn_mbuf != NULL) |
828 |
m_freem(uvp->bcn_mbuf); |
837 |
m_freem(uvp->bcn_mbuf); |
|
|
838 |
/* Cancel any unfinished Tx. */ |
839 |
urtwn_vap_clear_tx(sc, vap); |
840 |
URTWN_UNLOCK(sc); |
829 |
if (vap->iv_opmode == IEEE80211_M_IBSS) |
841 |
if (vap->iv_opmode == IEEE80211_M_IBSS) |
830 |
ieee80211_draintask(ic, &uvp->tsf_task_adhoc); |
842 |
ieee80211_draintask(ic, &uvp->tsf_task_adhoc); |
831 |
if (URTWN_CHIP_HAS_RATECTL(sc)) |
843 |
if (URTWN_CHIP_HAS_RATECTL(sc)) |
Lines 834-839
Link Here
|
834 |
free(uvp, M_80211_VAP); |
846 |
free(uvp, M_80211_VAP); |
835 |
} |
847 |
} |
836 |
|
848 |
|
|
|
849 |
static void |
850 |
urtwn_vap_clear_tx(struct urtwn_softc *sc, struct ieee80211vap *vap) |
851 |
{ |
852 |
|
853 |
URTWN_ASSERT_LOCKED(sc); |
854 |
|
855 |
urtwn_vap_clear_tx_queue(sc, &sc->sc_tx_active, vap); |
856 |
urtwn_vap_clear_tx_queue(sc, &sc->sc_tx_pending, vap); |
857 |
} |
858 |
|
859 |
static void |
860 |
urtwn_vap_clear_tx_queue(struct urtwn_softc *sc, urtwn_datahead *head, |
861 |
struct ieee80211vap *vap) |
862 |
{ |
863 |
struct urtwn_data *dp, *tmp; |
864 |
|
865 |
STAILQ_FOREACH_SAFE(dp, head, next, tmp) { |
866 |
if (dp->ni != NULL) { |
867 |
if (dp->ni->ni_vap == vap) { |
868 |
ieee80211_free_node(dp->ni); |
869 |
dp->ni = NULL; |
870 |
|
871 |
if (dp->m != NULL) { |
872 |
m_freem(dp->m); |
873 |
dp->m = NULL; |
874 |
} |
875 |
|
876 |
STAILQ_REMOVE(head, dp, urtwn_data, next); |
877 |
STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, dp, |
878 |
next); |
879 |
} |
880 |
} |
881 |
} |
882 |
} |
883 |
|
837 |
static struct mbuf * |
884 |
static struct mbuf * |
838 |
urtwn_rx_copy_to_mbuf(struct urtwn_softc *sc, struct r92c_rx_stat *stat, |
885 |
urtwn_rx_copy_to_mbuf(struct urtwn_softc *sc, struct r92c_rx_stat *stat, |
839 |
int totlen) |
886 |
int totlen) |