void ath_swba_event(void *Context, void *data, u_int32_t datalen) { struct ath_softc_net80211 *scn = (struct ath_softc_net80211 *)Context; struct ieee80211com *ic = &scn->sc_ic; WMI_SWBA_EVENT *swba_event = (WMI_SWBA_EVENT *)data; /* XXX: need to fix if defer has not run & more events are arriving */ if(atomic_read(&scn->sc_htc_swba_data.flags) == IEEE80211_SWBA_DEFER_PENDING) { /*adf_os_print("SWBA Event processing is pending ignoring event \n");*/ } else if(adf_os_unlikely(ic->ic_flags & IEEE80211_F_CHANSWITCH)){ if (ic->ic_chanchange_cnt) { atomic_set(&scn->sc_htc_swba_data.flags, IEEE80211_SWBA_DEFER_PENDING); scn->sc_ops->ath_wmi_beacon(scn->sc_dev, swba_event->currentTsf, swba_event->beaconPendingCount, 0); atomic_set(&scn->sc_htc_swba_data.flags, IEEE80211_SWBA_DEFER_DONE); } else { scn->sc_htc_swba_data.currentTsf = swba_event->currentTsf; scn->sc_htc_swba_data.beaconPendingCount = swba_event->beaconPendingCount; atomic_set(&scn->sc_htc_swba_data.flags, IEEE80211_SWBA_DEFER_PENDING); OS_PUT_DEFER_ITEM(scn->sc_osdev, ath_swba_event_defer, WORK_ITEM_SET_BEACON_DEFERED, scn, NULL, NULL); } } else { scn->sc_ops->ath_wmi_beacon(scn->sc_dev, swba_event->currentTsf, swba_event->beaconPendingCount, 0); } }
void _ieee80211_node_leave_defer(struct ieee80211_node *ni) { struct ieee80211com *ic = ni->ni_ic; ieee80211_ref_node(ni); TAILQ_INSERT_TAIL(&ic->ic_nodeleave_queue, ni, nodeleave_list); if(atomic_read(&ic->ic_nodeleave_deferflags) != DEFER_PENDING){ { atomic_set(&ic->ic_nodeleave_deferflags, DEFER_PENDING); OS_PUT_DEFER_ITEM(ic->ic_osdev, _ieee80211_node_leave_deferwork, WORK_ITEM_SINGLE_ARG_DEFERED, ic, NULL, NULL); } } }