Changeset View
Changeset View
Standalone View
Standalone View
sys/net80211/ieee80211_freebsd.c
Show First 20 Lines • Show All 313 Lines • ▼ Show 20 Lines | ieee80211_sysctl_vdetach(struct ieee80211vap *vap) | ||||
if (vap->iv_sysctl != NULL) { | if (vap->iv_sysctl != NULL) { | ||||
sysctl_ctx_free(vap->iv_sysctl); | sysctl_ctx_free(vap->iv_sysctl); | ||||
IEEE80211_FREE(vap->iv_sysctl, M_DEVBUF); | IEEE80211_FREE(vap->iv_sysctl, M_DEVBUF); | ||||
vap->iv_sysctl = NULL; | vap->iv_sysctl = NULL; | ||||
} | } | ||||
} | } | ||||
#define MS(_v, _f) (((_v) & _f##_M) >> _f##_S) | |||||
int | int | ||||
ieee80211_com_vincref(struct ieee80211vap *vap) | ieee80211_com_vincref(struct ieee80211vap *vap) | ||||
{ | { | ||||
uint32_t ostate; | uint32_t ostate; | ||||
ostate = atomic_fetchadd_32(&vap->iv_com_state, IEEE80211_COM_REF_ADD); | ostate = atomic_fetchadd_32(&vap->iv_com_state, IEEE80211_COM_REF_ADD); | ||||
if (ostate & IEEE80211_COM_DETACHED) { | if (ostate & IEEE80211_COM_DETACHED) { | ||||
atomic_subtract_32(&vap->iv_com_state, IEEE80211_COM_REF_ADD); | atomic_subtract_32(&vap->iv_com_state, IEEE80211_COM_REF_ADD); | ||||
return (ENETDOWN); | return (ENETDOWN); | ||||
} | } | ||||
if (MS(ostate, IEEE80211_COM_REF) == IEEE80211_COM_REF_MAX) { | if (_IEEE80211_MASKSHIFT(ostate, IEEE80211_COM_REF) == IEEE80211_COM_REF_MAX) { | ||||
atomic_subtract_32(&vap->iv_com_state, IEEE80211_COM_REF_ADD); | atomic_subtract_32(&vap->iv_com_state, IEEE80211_COM_REF_ADD); | ||||
return (EOVERFLOW); | return (EOVERFLOW); | ||||
} | } | ||||
return (0); | return (0); | ||||
} | } | ||||
void | void | ||||
ieee80211_com_vdecref(struct ieee80211vap *vap) | ieee80211_com_vdecref(struct ieee80211vap *vap) | ||||
{ | { | ||||
uint32_t ostate; | uint32_t ostate; | ||||
ostate = atomic_fetchadd_32(&vap->iv_com_state, -IEEE80211_COM_REF_ADD); | ostate = atomic_fetchadd_32(&vap->iv_com_state, -IEEE80211_COM_REF_ADD); | ||||
KASSERT(MS(ostate, IEEE80211_COM_REF) != 0, | KASSERT(_IEEE80211_MASKSHIFT(ostate, IEEE80211_COM_REF) != 0, | ||||
("com reference counter underflow")); | ("com reference counter underflow")); | ||||
(void) ostate; | (void) ostate; | ||||
} | } | ||||
void | void | ||||
ieee80211_com_vdetach(struct ieee80211vap *vap) | ieee80211_com_vdetach(struct ieee80211vap *vap) | ||||
{ | { | ||||
int sleep_time; | int sleep_time; | ||||
sleep_time = msecs_to_ticks(250); | sleep_time = msecs_to_ticks(250); | ||||
atomic_set_32(&vap->iv_com_state, IEEE80211_COM_DETACHED); | atomic_set_32(&vap->iv_com_state, IEEE80211_COM_DETACHED); | ||||
while (MS(atomic_load_32(&vap->iv_com_state), IEEE80211_COM_REF) != 0) | while (_IEEE80211_MASKSHIFT(atomic_load_32(&vap->iv_com_state), IEEE80211_COM_REF) != 0) | ||||
pause("comref", sleep_time); | pause("comref", sleep_time); | ||||
} | } | ||||
#undef MS | |||||
int | int | ||||
ieee80211_node_dectestref(struct ieee80211_node *ni) | ieee80211_node_dectestref(struct ieee80211_node *ni) | ||||
{ | { | ||||
/* XXX need equivalent of atomic_dec_and_test */ | /* XXX need equivalent of atomic_dec_and_test */ | ||||
atomic_subtract_int(&ni->ni_refcnt, 1); | atomic_subtract_int(&ni->ni_refcnt, 1); | ||||
return atomic_cmpset_int(&ni->ni_refcnt, 0, 1); | return atomic_cmpset_int(&ni->ni_refcnt, 0, 1); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 775 Lines • Show Last 20 Lines |