Lines Matching refs:sc

22 static void ath9k_reset_beacon_status(struct ath_softc *sc)  in ath9k_reset_beacon_status()  argument
24 sc->beacon.tx_processed = false; in ath9k_reset_beacon_status()
25 sc->beacon.tx_last = false; in ath9k_reset_beacon_status()
33 static void ath9k_beaconq_config(struct ath_softc *sc) in ath9k_beaconq_config() argument
35 struct ath_hw *ah = sc->sc_ah; in ath9k_beaconq_config()
40 ath9k_hw_get_txq_props(ah, sc->beacon.beaconq, &qi); in ath9k_beaconq_config()
42 if (sc->sc_ah->opmode == NL80211_IFTYPE_AP || in ath9k_beaconq_config()
43 sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT) { in ath9k_beaconq_config()
50 txq = sc->tx.txq_map[IEEE80211_AC_BE]; in ath9k_beaconq_config()
60 if (!ath9k_hw_set_txq_props(ah, sc->beacon.beaconq, &qi)) { in ath9k_beaconq_config()
63 ath9k_hw_resettxqueue(ah, sc->beacon.beaconq); in ath9k_beaconq_config()
72 static void ath9k_beacon_setup(struct ath_softc *sc, struct ieee80211_vif *vif, in ath9k_beacon_setup() argument
76 struct ath_hw *ah = sc->sc_ah; in ath9k_beacon_setup()
83 sband = &common->sbands[sc->cur_chandef.chan->band]; in ath9k_beacon_setup()
103 info.qcu = sc->beacon.beaconq; in ath9k_beacon_setup()
107 info.rates[0].ChSel = ath_txchainmask_reduction(sc, chainmask, rate); in ath9k_beacon_setup()
115 struct ath_softc *sc = hw->priv; in ath9k_beacon_generate() local
116 struct ath_common *common = ath9k_hw_common(sc->sc_ah); in ath9k_beacon_generate()
120 struct ath_txq *cabq = sc->beacon.cabq; in ath9k_beacon_generate()
131 dma_unmap_single(sc->dev, bf->bf_buf_addr, in ath9k_beacon_generate()
152 ath9k_beacon_add_noa(sc, avp, skb); in ath9k_beacon_generate()
154 bf->bf_buf_addr = dma_map_single(sc->dev, skb->data, in ath9k_beacon_generate()
156 if (unlikely(dma_mapping_error(sc->dev, bf->bf_buf_addr))) { in ath9k_beacon_generate()
179 if (sc->cur_chan->nvifs > 1) { in ath9k_beacon_generate()
182 ath_draintxq(sc, cabq); in ath9k_beacon_generate()
186 ath9k_beacon_setup(sc, vif, bf, info->control.rates[0].idx); in ath9k_beacon_generate()
194 void ath9k_beacon_assign_slot(struct ath_softc *sc, struct ieee80211_vif *vif) in ath9k_beacon_assign_slot() argument
196 struct ath_common *common = ath9k_hw_common(sc->sc_ah); in ath9k_beacon_assign_slot()
200 avp->av_bcbuf = list_first_entry(&sc->beacon.bbuf, struct ath_buf, list); in ath9k_beacon_assign_slot()
204 if (sc->beacon.bslot[slot] == NULL) { in ath9k_beacon_assign_slot()
210 sc->beacon.bslot[avp->av_bslot] = vif; in ath9k_beacon_assign_slot()
211 sc->nbcnvifs++; in ath9k_beacon_assign_slot()
217 void ath9k_beacon_remove_slot(struct ath_softc *sc, struct ieee80211_vif *vif) in ath9k_beacon_remove_slot() argument
219 struct ath_common *common = ath9k_hw_common(sc->sc_ah); in ath9k_beacon_remove_slot()
222 struct ath_beacon_config *cur_conf = &sc->cur_chan->beacon; in ath9k_beacon_remove_slot()
227 tasklet_disable(&sc->bcon_tasklet); in ath9k_beacon_remove_slot()
233 dma_unmap_single(sc->dev, bf->bf_buf_addr, in ath9k_beacon_remove_slot()
241 sc->beacon.bslot[avp->av_bslot] = NULL; in ath9k_beacon_remove_slot()
242 sc->nbcnvifs--; in ath9k_beacon_remove_slot()
243 list_add_tail(&bf->list, &sc->beacon.bbuf); in ath9k_beacon_remove_slot()
245 tasklet_enable(&sc->bcon_tasklet); in ath9k_beacon_remove_slot()
248 static int ath9k_beacon_choose_slot(struct ath_softc *sc) in ath9k_beacon_choose_slot() argument
250 struct ath_common *common = ath9k_hw_common(sc->sc_ah); in ath9k_beacon_choose_slot()
251 struct ath_beacon_config *cur_conf = &sc->cur_chan->beacon; in ath9k_beacon_choose_slot()
257 if (sc->sc_ah->opmode != NL80211_IFTYPE_AP && in ath9k_beacon_choose_slot()
258 sc->sc_ah->opmode != NL80211_IFTYPE_MESH_POINT) { in ath9k_beacon_choose_slot()
260 ath9k_hw_gettsf64(sc->sc_ah)); in ath9k_beacon_choose_slot()
265 tsf = ath9k_hw_gettsf64(sc->sc_ah); in ath9k_beacon_choose_slot()
266 tsf += TU_TO_USEC(sc->sc_ah->config.sw_beacon_response_time); in ath9k_beacon_choose_slot()
276 static void ath9k_set_tsfadjust(struct ath_softc *sc, struct ieee80211_vif *vif) in ath9k_set_tsfadjust() argument
278 struct ath_common *common = ath9k_hw_common(sc->sc_ah); in ath9k_set_tsfadjust()
294 bool ath9k_csa_is_finished(struct ath_softc *sc, struct ieee80211_vif *vif) in ath9k_csa_is_finished() argument
308 struct ath_softc *sc = data; in ath9k_csa_update_vif() local
309 ath9k_csa_is_finished(sc, vif); in ath9k_csa_update_vif()
312 void ath9k_csa_update(struct ath_softc *sc) in ath9k_csa_update() argument
314 ieee80211_iterate_active_interfaces_atomic(sc->hw, in ath9k_csa_update()
316 ath9k_csa_update_vif, sc); in ath9k_csa_update()
321 struct ath_softc *sc = (struct ath_softc *)data; in ath9k_beacon_tasklet() local
322 struct ath_hw *ah = sc->sc_ah; in ath9k_beacon_tasklet()
342 if (ath9k_hw_numtxpending(ah, sc->beacon.beaconq) != 0) { in ath9k_beacon_tasklet()
343 sc->beacon.bmisscnt++; in ath9k_beacon_tasklet()
353 if (!ath_hw_check(sc)) in ath9k_beacon_tasklet()
356 if (sc->beacon.bmisscnt < BSTUCK_THRESH * sc->nbcnvifs) { in ath9k_beacon_tasklet()
359 sc->beacon.bmisscnt); in ath9k_beacon_tasklet()
360 ath9k_hw_stop_dma_queue(ah, sc->beacon.beaconq); in ath9k_beacon_tasklet()
361 if (sc->beacon.bmisscnt > 3) in ath9k_beacon_tasklet()
363 } else if (sc->beacon.bmisscnt >= BSTUCK_THRESH) { in ath9k_beacon_tasklet()
365 sc->beacon.bmisscnt = 0; in ath9k_beacon_tasklet()
366 ath9k_queue_reset(sc, RESET_TYPE_BEACON_STUCK); in ath9k_beacon_tasklet()
372 slot = ath9k_beacon_choose_slot(sc); in ath9k_beacon_tasklet()
373 vif = sc->beacon.bslot[slot]; in ath9k_beacon_tasklet()
378 ath_chanctx_beacon_sent_ev(sc, in ath9k_beacon_tasklet()
382 if (ath9k_csa_is_finished(sc, vif)) in ath9k_beacon_tasklet()
390 ath_chanctx_event(sc, vif, ATH_CHANCTX_EVENT_BEACON_PREPARE); in ath9k_beacon_tasklet()
393 bf = ath9k_beacon_generate(sc->hw, vif); in ath9k_beacon_tasklet()
395 if (sc->beacon.bmisscnt != 0) { in ath9k_beacon_tasklet()
397 sc->beacon.bmisscnt); in ath9k_beacon_tasklet()
398 sc->beacon.bmisscnt = 0; in ath9k_beacon_tasklet()
417 if (sc->beacon.updateslot == UPDATE) { in ath9k_beacon_tasklet()
418 sc->beacon.updateslot = COMMIT; in ath9k_beacon_tasklet()
419 sc->beacon.slotupdate = slot; in ath9k_beacon_tasklet()
420 } else if (sc->beacon.updateslot == COMMIT && in ath9k_beacon_tasklet()
421 sc->beacon.slotupdate == slot) { in ath9k_beacon_tasklet()
422 ah->slottime = sc->beacon.slottime; in ath9k_beacon_tasklet()
424 sc->beacon.updateslot = OK; in ath9k_beacon_tasklet()
428 ath9k_reset_beacon_status(sc); in ath9k_beacon_tasklet()
434 ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bf->bf_daddr); in ath9k_beacon_tasklet()
437 ath9k_hw_txstart(ah, sc->beacon.beaconq); in ath9k_beacon_tasklet()
444 static void ath9k_beacon_init(struct ath_softc *sc, u32 nexttbtt, in ath9k_beacon_init() argument
447 struct ath_hw *ah = sc->sc_ah; in ath9k_beacon_init()
452 ath9k_beaconq_config(sc); in ath9k_beacon_init()
454 sc->beacon.bmisscnt = 0; in ath9k_beacon_init()
464 static void ath9k_beacon_config_ap(struct ath_softc *sc, in ath9k_beacon_config_ap() argument
467 struct ath_hw *ah = sc->sc_ah; in ath9k_beacon_config_ap()
470 ath9k_beacon_init(sc, conf->nexttbtt, conf->intval, false); in ath9k_beacon_config_ap()
489 static void ath9k_beacon_config_adhoc(struct ath_softc *sc, in ath9k_beacon_config_adhoc() argument
492 struct ath_hw *ah = sc->sc_ah; in ath9k_beacon_config_adhoc()
495 ath9k_reset_beacon_status(sc); in ath9k_beacon_config_adhoc()
499 ath9k_beacon_init(sc, conf->nexttbtt, conf->intval, conf->ibss_creator); in ath9k_beacon_config_adhoc()
509 static bool ath9k_allow_beacon_config(struct ath_softc *sc, in ath9k_allow_beacon_config() argument
512 struct ath_common *common = ath9k_hw_common(sc->sc_ah); in ath9k_allow_beacon_config()
522 if (sc->cur_chan != avp->chanctx) in ath9k_allow_beacon_config()
526 if (sc->sc_ah->opmode == NL80211_IFTYPE_AP) { in ath9k_allow_beacon_config()
534 if (sc->sc_ah->opmode == NL80211_IFTYPE_STATION) { in ath9k_allow_beacon_config()
537 vif != sc->cur_chan->primary_sta) { in ath9k_allow_beacon_config()
547 static void ath9k_cache_beacon_config(struct ath_softc *sc, in ath9k_cache_beacon_config() argument
551 struct ath_common *common = ath9k_hw_common(sc->sc_ah); in ath9k_cache_beacon_config()
584 void ath9k_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif, in ath9k_beacon_config() argument
588 struct ath_hw *ah = sc->sc_ah; in ath9k_beacon_config()
601 ath9k_set_tsfadjust(sc, vif); in ath9k_beacon_config()
603 if (!ath9k_allow_beacon_config(sc, vif)) in ath9k_beacon_config()
607 ath9k_cache_beacon_config(sc, ctx, bss_conf); in ath9k_beacon_config()
608 if (ctx != sc->cur_chan) in ath9k_beacon_config()
611 ath9k_set_beacon(sc); in ath9k_beacon_config()
628 ath9k_cache_beacon_config(sc, ctx, bss_conf); in ath9k_beacon_config()
632 if (ctx != sc->cur_chan) in ath9k_beacon_config()
647 spin_lock_irqsave(&sc->sc_pm_lock, flags); in ath9k_beacon_config()
648 sc->ps_flags |= PS_BEACON_SYNC | PS_WAIT_FOR_BEACON; in ath9k_beacon_config()
649 spin_unlock_irqrestore(&sc->sc_pm_lock, flags); in ath9k_beacon_config()
652 ath9k_set_beacon(sc); in ath9k_beacon_config()
666 void ath9k_set_beacon(struct ath_softc *sc) in ath9k_set_beacon() argument
668 struct ath_common *common = ath9k_hw_common(sc->sc_ah); in ath9k_set_beacon()
669 struct ath_beacon_config *cur_conf = &sc->cur_chan->beacon; in ath9k_set_beacon()
671 switch (sc->sc_ah->opmode) { in ath9k_set_beacon()
674 ath9k_beacon_config_ap(sc, cur_conf); in ath9k_set_beacon()
677 ath9k_beacon_config_adhoc(sc, cur_conf); in ath9k_set_beacon()
680 ath9k_beacon_config_sta(sc->sc_ah, cur_conf); in ath9k_set_beacon()