Lines Matching refs:sta

145 void ieee80211_assign_tid_tx(struct sta_info *sta, int tid,  in ieee80211_assign_tid_tx()  argument
148 lockdep_assert_held(&sta->ampdu_mlme.mtx); in ieee80211_assign_tid_tx()
149 lockdep_assert_held(&sta->lock); in ieee80211_assign_tid_tx()
150 rcu_assign_pointer(sta->ampdu_mlme.tid_tx[tid], tid_tx); in ieee80211_assign_tid_tx()
193 ieee80211_agg_stop_txq(struct sta_info *sta, int tid) in ieee80211_agg_stop_txq() argument
195 struct ieee80211_txq *txq = sta->sta.txq[tid]; in ieee80211_agg_stop_txq()
214 ieee80211_agg_start_txq(struct sta_info *sta, int tid, bool enable) in ieee80211_agg_start_txq() argument
216 struct ieee80211_txq *txq = sta->sta.txq[tid]; in ieee80211_agg_start_txq()
232 drv_wake_tx_queue(sta->sdata->local, txqi); in ieee80211_agg_start_txq()
271 static void ieee80211_remove_tid_tx(struct sta_info *sta, int tid) in ieee80211_remove_tid_tx() argument
275 lockdep_assert_held(&sta->ampdu_mlme.mtx); in ieee80211_remove_tid_tx()
276 lockdep_assert_held(&sta->lock); in ieee80211_remove_tid_tx()
278 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_remove_tid_tx()
290 ieee80211_agg_splice_packets(sta->sdata, tid_tx, tid); in ieee80211_remove_tid_tx()
293 ieee80211_assign_tid_tx(sta, tid, NULL); in ieee80211_remove_tid_tx()
295 ieee80211_agg_splice_finish(sta->sdata, tid); in ieee80211_remove_tid_tx()
296 ieee80211_agg_start_txq(sta, tid, false); in ieee80211_remove_tid_tx()
301 int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, in ___ieee80211_stop_tx_ba_session() argument
304 struct ieee80211_local *local = sta->local; in ___ieee80211_stop_tx_ba_session()
307 .sta = &sta->sta, in ___ieee80211_stop_tx_ba_session()
316 lockdep_assert_held(&sta->ampdu_mlme.mtx); in ___ieee80211_stop_tx_ba_session()
332 spin_lock_bh(&sta->lock); in ___ieee80211_stop_tx_ba_session()
335 tid_tx = sta->ampdu_mlme.tid_start_tx[tid]; in ___ieee80211_stop_tx_ba_session()
337 sta->ampdu_mlme.tid_start_tx[tid] = NULL; in ___ieee80211_stop_tx_ba_session()
339 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ___ieee80211_stop_tx_ba_session()
341 spin_unlock_bh(&sta->lock); in ___ieee80211_stop_tx_ba_session()
350 spin_unlock_bh(&sta->lock); in ___ieee80211_stop_tx_ba_session()
354 ret = drv_ampdu_action(local, sta->sdata, &params); in ___ieee80211_stop_tx_ba_session()
361 ieee80211_assign_tid_tx(sta, tid, NULL); in ___ieee80211_stop_tx_ba_session()
362 spin_unlock_bh(&sta->lock); in ___ieee80211_stop_tx_ba_session()
369 spin_unlock_bh(&sta->lock); in ___ieee80211_stop_tx_ba_session()
371 ht_dbg(sta->sdata, "Tx BA session stop requested for %pM tid %u\n", in ___ieee80211_stop_tx_ba_session()
372 sta->sta.addr, tid); in ___ieee80211_stop_tx_ba_session()
404 ret = drv_ampdu_action(local, sta->sdata, &params); in ___ieee80211_stop_tx_ba_session()
435 struct sta_info *sta = tid_tx->sta; in sta_addba_resp_timer_expired() local
440 ht_dbg(sta->sdata, in sta_addba_resp_timer_expired()
442 sta->sta.addr, tid); in sta_addba_resp_timer_expired()
446 ht_dbg(sta->sdata, "addBA response timer expired on %pM tid %d\n", in sta_addba_resp_timer_expired()
447 sta->sta.addr, tid); in sta_addba_resp_timer_expired()
449 ieee80211_stop_tx_ba_session(&sta->sta, tid); in sta_addba_resp_timer_expired()
452 void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid) in ieee80211_tx_ba_session_handle_start() argument
455 struct ieee80211_local *local = sta->local; in ieee80211_tx_ba_session_handle_start()
456 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_tx_ba_session_handle_start()
458 .sta = &sta->sta, in ieee80211_tx_ba_session_handle_start()
468 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_tx_ba_session_handle_start()
477 ieee80211_agg_stop_txq(sta, tid); in ieee80211_tx_ba_session_handle_start()
487 params.ssn = sta->tid_seq[tid] >> 4; in ieee80211_tx_ba_session_handle_start()
492 sta->sta.addr, tid); in ieee80211_tx_ba_session_handle_start()
493 spin_lock_bh(&sta->lock); in ieee80211_tx_ba_session_handle_start()
495 ieee80211_assign_tid_tx(sta, tid, NULL); in ieee80211_tx_ba_session_handle_start()
497 spin_unlock_bh(&sta->lock); in ieee80211_tx_ba_session_handle_start()
499 ieee80211_agg_start_txq(sta, tid, false); in ieee80211_tx_ba_session_handle_start()
508 sta->sta.addr, tid); in ieee80211_tx_ba_session_handle_start()
510 spin_lock_bh(&sta->lock); in ieee80211_tx_ba_session_handle_start()
511 sta->ampdu_mlme.last_addba_req_time[tid] = jiffies; in ieee80211_tx_ba_session_handle_start()
512 sta->ampdu_mlme.addba_req_num[tid]++; in ieee80211_tx_ba_session_handle_start()
513 spin_unlock_bh(&sta->lock); in ieee80211_tx_ba_session_handle_start()
515 if (sta->sta.he_cap.has_he) { in ieee80211_tx_ba_session_handle_start()
528 ieee80211_send_addba_request(sdata, sta->sta.addr, tid, in ieee80211_tx_ba_session_handle_start()
540 struct sta_info *sta = tid_tx->sta; in sta_tx_agg_session_timer_expired() local
554 ht_dbg(sta->sdata, "tx session timer expired on %pM tid %d\n", in sta_tx_agg_session_timer_expired()
555 sta->sta.addr, tid); in sta_tx_agg_session_timer_expired()
557 ieee80211_stop_tx_ba_session(&sta->sta, tid); in sta_tx_agg_session_timer_expired()
563 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_start_tx_ba_session() local
564 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_start_tx_ba_session()
571 if (WARN(sta->reserved_tid == tid, in ieee80211_start_tx_ba_session()
599 if (test_sta_flag(sta, WLAN_STA_BLOCK_BA)) { in ieee80211_start_tx_ba_session()
602 sta->sta.addr, tid); in ieee80211_start_tx_ba_session()
618 if (sta->sdata->vif.type == NL80211_IFTYPE_ADHOC && in ieee80211_start_tx_ba_session()
619 !sta->sta.ht_cap.ht_supported) { in ieee80211_start_tx_ba_session()
626 spin_lock_bh(&sta->lock); in ieee80211_start_tx_ba_session()
629 if (sta->ampdu_mlme.addba_req_num[tid] > HT_AGG_MAX_RETRIES) { in ieee80211_start_tx_ba_session()
639 if (sta->ampdu_mlme.addba_req_num[tid] > HT_AGG_BURST_RETRIES && in ieee80211_start_tx_ba_session()
640 time_before(jiffies, sta->ampdu_mlme.last_addba_req_time[tid] + in ieee80211_start_tx_ba_session()
644 sta->ampdu_mlme.addba_req_num[tid], sta->sta.addr, tid); in ieee80211_start_tx_ba_session()
649 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_start_tx_ba_session()
651 if (tid_tx || sta->ampdu_mlme.tid_start_tx[tid]) { in ieee80211_start_tx_ba_session()
654 sta->sta.addr, tid); in ieee80211_start_tx_ba_session()
670 tid_tx->sta = sta; in ieee80211_start_tx_ba_session()
681 sta->ampdu_mlme.dialog_token_allocator++; in ieee80211_start_tx_ba_session()
682 tid_tx->dialog_token = sta->ampdu_mlme.dialog_token_allocator; in ieee80211_start_tx_ba_session()
688 sta->ampdu_mlme.tid_start_tx[tid] = tid_tx; in ieee80211_start_tx_ba_session()
690 ieee80211_queue_work(&local->hw, &sta->ampdu_mlme.work); in ieee80211_start_tx_ba_session()
694 spin_unlock_bh(&sta->lock); in ieee80211_start_tx_ba_session()
700 struct sta_info *sta, u16 tid) in ieee80211_agg_tx_operational() argument
704 .sta = &sta->sta, in ieee80211_agg_tx_operational()
711 lockdep_assert_held(&sta->ampdu_mlme.mtx); in ieee80211_agg_tx_operational()
713 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_agg_tx_operational()
717 ht_dbg(sta->sdata, "Aggregation is on for %pM tid %d\n", in ieee80211_agg_tx_operational()
718 sta->sta.addr, tid); in ieee80211_agg_tx_operational()
720 drv_ampdu_action(local, sta->sdata, &params); in ieee80211_agg_tx_operational()
726 spin_lock_bh(&sta->lock); in ieee80211_agg_tx_operational()
728 ieee80211_agg_splice_packets(sta->sdata, tid_tx, tid); in ieee80211_agg_tx_operational()
735 ieee80211_agg_splice_finish(sta->sdata, tid); in ieee80211_agg_tx_operational()
737 spin_unlock_bh(&sta->lock); in ieee80211_agg_tx_operational()
739 ieee80211_agg_start_txq(sta, tid, true); in ieee80211_agg_tx_operational()
742 void ieee80211_start_tx_ba_cb(struct sta_info *sta, int tid, in ieee80211_start_tx_ba_cb() argument
745 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_start_tx_ba_cb()
752 ieee80211_agg_tx_operational(local, sta, tid); in ieee80211_start_tx_ba_cb()
757 const u8 *ra, u16 tid, struct sta_info **sta) in ieee80211_lookup_tid_tx() argument
767 *sta = sta_info_get_bss(sdata, ra); in ieee80211_lookup_tid_tx()
768 if (!*sta) { in ieee80211_lookup_tid_tx()
773 tid_tx = rcu_dereference((*sta)->ampdu_mlme.tid_tx[tid]); in ieee80211_lookup_tid_tx()
786 struct sta_info *sta; in ieee80211_start_tx_ba_cb_irqsafe() local
792 tid_tx = ieee80211_lookup_tid_tx(sdata, ra, tid, &sta); in ieee80211_start_tx_ba_cb_irqsafe()
797 ieee80211_queue_work(&local->hw, &sta->ampdu_mlme.work); in ieee80211_start_tx_ba_cb_irqsafe()
803 int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, in __ieee80211_stop_tx_ba_session() argument
808 mutex_lock(&sta->ampdu_mlme.mtx); in __ieee80211_stop_tx_ba_session()
810 ret = ___ieee80211_stop_tx_ba_session(sta, tid, reason); in __ieee80211_stop_tx_ba_session()
812 mutex_unlock(&sta->ampdu_mlme.mtx); in __ieee80211_stop_tx_ba_session()
819 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_stop_tx_ba_session() local
820 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_stop_tx_ba_session()
833 spin_lock_bh(&sta->lock); in ieee80211_stop_tx_ba_session()
834 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_stop_tx_ba_session()
841 WARN(sta->reserved_tid == tid, in ieee80211_stop_tx_ba_session()
851 ieee80211_queue_work(&local->hw, &sta->ampdu_mlme.work); in ieee80211_stop_tx_ba_session()
854 spin_unlock_bh(&sta->lock); in ieee80211_stop_tx_ba_session()
859 void ieee80211_stop_tx_ba_cb(struct sta_info *sta, int tid, in ieee80211_stop_tx_ba_cb() argument
862 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_stop_tx_ba_cb()
866 sta->sta.addr, tid); in ieee80211_stop_tx_ba_cb()
868 spin_lock_bh(&sta->lock); in ieee80211_stop_tx_ba_cb()
873 sta->sta.addr, tid); in ieee80211_stop_tx_ba_cb()
880 ieee80211_remove_tid_tx(sta, tid); in ieee80211_stop_tx_ba_cb()
883 spin_unlock_bh(&sta->lock); in ieee80211_stop_tx_ba_cb()
886 ieee80211_send_delba(sdata, sta->sta.addr, tid, in ieee80211_stop_tx_ba_cb()
895 struct sta_info *sta; in ieee80211_stop_tx_ba_cb_irqsafe() local
901 tid_tx = ieee80211_lookup_tid_tx(sdata, ra, tid, &sta); in ieee80211_stop_tx_ba_cb_irqsafe()
906 ieee80211_queue_work(&local->hw, &sta->ampdu_mlme.work); in ieee80211_stop_tx_ba_cb_irqsafe()
914 struct sta_info *sta, in ieee80211_process_addba_resp() argument
929 txq = sta->sta.txq[tid]; in ieee80211_process_addba_resp()
933 mutex_lock(&sta->ampdu_mlme.mtx); in ieee80211_process_addba_resp()
935 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_process_addba_resp()
940 ht_dbg(sta->sdata, "wrong addBA response token, %pM tid %d\n", in ieee80211_process_addba_resp()
941 sta->sta.addr, tid); in ieee80211_process_addba_resp()
947 ht_dbg(sta->sdata, "switched off addBA timer for %pM tid %d\n", in ieee80211_process_addba_resp()
948 sta->sta.addr, tid); in ieee80211_process_addba_resp()
957 ht_dbg(sta->sdata, in ieee80211_process_addba_resp()
959 sta->sta.addr, tid); in ieee80211_process_addba_resp()
981 ieee80211_agg_tx_operational(local, sta, tid); in ieee80211_process_addba_resp()
983 sta->ampdu_mlme.addba_req_num[tid] = 0; in ieee80211_process_addba_resp()
995 ___ieee80211_stop_tx_ba_session(sta, tid, AGG_STOP_DECLINED); in ieee80211_process_addba_resp()
999 mutex_unlock(&sta->ampdu_mlme.mtx); in ieee80211_process_addba_resp()