Lines Matching refs:sta
61 static void ieee80211_send_addba_request(struct sta_info *sta, u16 tid, in ieee80211_send_addba_request() argument
65 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_send_addba_request()
78 mgmt = ieee80211_mgmt_ba(skb, sta->sta.addr, sdata); in ieee80211_send_addba_request()
97 if (sta->sta.deflink.he_cap.has_he) in ieee80211_send_addba_request()
133 void ieee80211_assign_tid_tx(struct sta_info *sta, int tid, in ieee80211_assign_tid_tx() argument
136 lockdep_assert_wiphy(sta->local->hw.wiphy); in ieee80211_assign_tid_tx()
137 lockdep_assert_held(&sta->lock); in ieee80211_assign_tid_tx()
138 rcu_assign_pointer(sta->ampdu_mlme.tid_tx[tid], tid_tx); in ieee80211_assign_tid_tx()
181 ieee80211_agg_stop_txq(struct sta_info *sta, int tid) in ieee80211_agg_stop_txq() argument
183 struct ieee80211_txq *txq = sta->sta.txq[tid]; in ieee80211_agg_stop_txq()
202 ieee80211_agg_start_txq(struct sta_info *sta, int tid, bool enable) in ieee80211_agg_start_txq() argument
204 struct ieee80211_txq *txq = sta->sta.txq[tid]; in ieee80211_agg_start_txq()
207 lockdep_assert_wiphy(sta->local->hw.wiphy); in ieee80211_agg_start_txq()
222 schedule_and_wake_txq(sta->sdata->local, txqi); in ieee80211_agg_start_txq()
261 static void ieee80211_remove_tid_tx(struct sta_info *sta, int tid) in ieee80211_remove_tid_tx() argument
265 lockdep_assert_wiphy(sta->local->hw.wiphy); in ieee80211_remove_tid_tx()
266 lockdep_assert_held(&sta->lock); in ieee80211_remove_tid_tx()
268 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_remove_tid_tx()
280 ieee80211_agg_splice_packets(sta->sdata, tid_tx, tid); in ieee80211_remove_tid_tx()
283 ieee80211_assign_tid_tx(sta, tid, NULL); in ieee80211_remove_tid_tx()
285 ieee80211_agg_splice_finish(sta->sdata, tid); in ieee80211_remove_tid_tx()
290 int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, in __ieee80211_stop_tx_ba_session() argument
293 struct ieee80211_local *local = sta->local; in __ieee80211_stop_tx_ba_session()
296 .sta = &sta->sta, in __ieee80211_stop_tx_ba_session()
305 lockdep_assert_wiphy(sta->local->hw.wiphy); in __ieee80211_stop_tx_ba_session()
321 spin_lock_bh(&sta->lock); in __ieee80211_stop_tx_ba_session()
324 tid_tx = sta->ampdu_mlme.tid_start_tx[tid]; in __ieee80211_stop_tx_ba_session()
326 sta->ampdu_mlme.tid_start_tx[tid] = NULL; in __ieee80211_stop_tx_ba_session()
328 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in __ieee80211_stop_tx_ba_session()
330 spin_unlock_bh(&sta->lock); in __ieee80211_stop_tx_ba_session()
339 spin_unlock_bh(&sta->lock); in __ieee80211_stop_tx_ba_session()
343 ret = drv_ampdu_action(local, sta->sdata, ¶ms); in __ieee80211_stop_tx_ba_session()
350 ieee80211_assign_tid_tx(sta, tid, NULL); in __ieee80211_stop_tx_ba_session()
351 spin_unlock_bh(&sta->lock); in __ieee80211_stop_tx_ba_session()
358 ieee80211_agg_stop_txq(sta, tid); in __ieee80211_stop_tx_ba_session()
360 spin_unlock_bh(&sta->lock); in __ieee80211_stop_tx_ba_session()
362 ht_dbg(sta->sdata, "Tx BA session stop requested for %pM tid %u\n", in __ieee80211_stop_tx_ba_session()
363 sta->sta.addr, tid); in __ieee80211_stop_tx_ba_session()
395 ret = drv_ampdu_action(local, sta->sdata, ¶ms); in __ieee80211_stop_tx_ba_session()
426 struct sta_info *sta = tid_tx->sta; in sta_addba_resp_timer_expired() local
431 ht_dbg(sta->sdata, in sta_addba_resp_timer_expired()
433 sta->sta.addr, tid); in sta_addba_resp_timer_expired()
437 ht_dbg(sta->sdata, "addBA response timer expired on %pM tid %d\n", in sta_addba_resp_timer_expired()
438 sta->sta.addr, tid); in sta_addba_resp_timer_expired()
440 ieee80211_stop_tx_ba_session(&sta->sta, tid); in sta_addba_resp_timer_expired()
443 static void ieee80211_send_addba_with_timeout(struct sta_info *sta, in ieee80211_send_addba_with_timeout() argument
446 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_send_addba_with_timeout()
447 struct ieee80211_local *local = sta->local; in ieee80211_send_addba_with_timeout()
455 lockdep_assert_wiphy(sta->local->hw.wiphy); in ieee80211_send_addba_with_timeout()
460 sta->sta.addr, tid); in ieee80211_send_addba_with_timeout()
462 spin_lock_bh(&sta->lock); in ieee80211_send_addba_with_timeout()
463 sta->ampdu_mlme.last_addba_req_time[tid] = jiffies; in ieee80211_send_addba_with_timeout()
464 sta->ampdu_mlme.addba_req_num[tid]++; in ieee80211_send_addba_with_timeout()
465 spin_unlock_bh(&sta->lock); in ieee80211_send_addba_with_timeout()
467 if (sta->sta.deflink.eht_cap.has_eht) { in ieee80211_send_addba_with_timeout()
469 } else if (sta->sta.deflink.he_cap.has_he) { in ieee80211_send_addba_with_timeout()
483 ieee80211_send_addba_request(sta, tid, tid_tx->dialog_token, in ieee80211_send_addba_with_timeout()
489 void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid) in ieee80211_tx_ba_session_handle_start() argument
492 struct ieee80211_local *local = sta->local; in ieee80211_tx_ba_session_handle_start()
493 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_tx_ba_session_handle_start()
495 .sta = &sta->sta, in ieee80211_tx_ba_session_handle_start()
504 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_tx_ba_session_handle_start()
521 params.ssn = sta->tid_seq[tid] >> 4; in ieee80211_tx_ba_session_handle_start()
536 sta->sta.addr, tid); in ieee80211_tx_ba_session_handle_start()
537 spin_lock_bh(&sta->lock); in ieee80211_tx_ba_session_handle_start()
539 ieee80211_assign_tid_tx(sta, tid, NULL); in ieee80211_tx_ba_session_handle_start()
541 spin_unlock_bh(&sta->lock); in ieee80211_tx_ba_session_handle_start()
543 ieee80211_agg_start_txq(sta, tid, false); in ieee80211_tx_ba_session_handle_start()
549 ieee80211_send_addba_with_timeout(sta, tid_tx); in ieee80211_tx_ba_session_handle_start()
555 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_refresh_tx_agg_session_timer() local
561 tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]); in ieee80211_refresh_tx_agg_session_timer()
576 struct sta_info *sta = tid_tx->sta; in sta_tx_agg_session_timer_expired() local
590 ht_dbg(sta->sdata, "tx session timer expired on %pM tid %d\n", in sta_tx_agg_session_timer_expired()
591 sta->sta.addr, tid); in sta_tx_agg_session_timer_expired()
593 ieee80211_stop_tx_ba_session(&sta->sta, tid); in sta_tx_agg_session_timer_expired()
599 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_start_tx_ba_session() local
600 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_start_tx_ba_session()
607 if (WARN(sta->reserved_tid == tid, in ieee80211_start_tx_ba_session()
638 if (test_sta_flag(sta, WLAN_STA_BLOCK_BA)) { in ieee80211_start_tx_ba_session()
641 sta->sta.addr, tid); in ieee80211_start_tx_ba_session()
645 if (test_sta_flag(sta, WLAN_STA_MFP) && in ieee80211_start_tx_ba_session()
646 !test_sta_flag(sta, WLAN_STA_AUTHORIZED)) { in ieee80211_start_tx_ba_session()
649 sta->sta.addr, tid); in ieee80211_start_tx_ba_session()
665 if (sta->sdata->vif.type == NL80211_IFTYPE_ADHOC && in ieee80211_start_tx_ba_session()
666 !sta->sta.deflink.ht_cap.ht_supported) { in ieee80211_start_tx_ba_session()
673 spin_lock_bh(&sta->lock); in ieee80211_start_tx_ba_session()
676 if (sta->ampdu_mlme.addba_req_num[tid] > HT_AGG_MAX_RETRIES) { in ieee80211_start_tx_ba_session()
686 if (sta->ampdu_mlme.addba_req_num[tid] > HT_AGG_BURST_RETRIES && in ieee80211_start_tx_ba_session()
687 time_before(jiffies, sta->ampdu_mlme.last_addba_req_time[tid] + in ieee80211_start_tx_ba_session()
691 sta->ampdu_mlme.addba_req_num[tid], sta->sta.addr, tid); in ieee80211_start_tx_ba_session()
696 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_start_tx_ba_session()
698 if (tid_tx || sta->ampdu_mlme.tid_start_tx[tid]) { in ieee80211_start_tx_ba_session()
701 sta->sta.addr, tid); in ieee80211_start_tx_ba_session()
717 tid_tx->sta = sta; in ieee80211_start_tx_ba_session()
728 sta->ampdu_mlme.dialog_token_allocator++; in ieee80211_start_tx_ba_session()
729 tid_tx->dialog_token = sta->ampdu_mlme.dialog_token_allocator; in ieee80211_start_tx_ba_session()
735 sta->ampdu_mlme.tid_start_tx[tid] = tid_tx; in ieee80211_start_tx_ba_session()
737 wiphy_work_queue(local->hw.wiphy, &sta->ampdu_mlme.work); in ieee80211_start_tx_ba_session()
741 spin_unlock_bh(&sta->lock); in ieee80211_start_tx_ba_session()
747 struct sta_info *sta, u16 tid) in ieee80211_agg_tx_operational() argument
751 .sta = &sta->sta, in ieee80211_agg_tx_operational()
758 lockdep_assert_wiphy(sta->local->hw.wiphy); in ieee80211_agg_tx_operational()
760 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_agg_tx_operational()
764 ht_dbg(sta->sdata, "Aggregation is on for %pM tid %d\n", in ieee80211_agg_tx_operational()
765 sta->sta.addr, tid); in ieee80211_agg_tx_operational()
767 drv_ampdu_action(local, sta->sdata, ¶ms); in ieee80211_agg_tx_operational()
773 spin_lock_bh(&sta->lock); in ieee80211_agg_tx_operational()
775 ieee80211_agg_splice_packets(sta->sdata, tid_tx, tid); in ieee80211_agg_tx_operational()
782 ieee80211_agg_splice_finish(sta->sdata, tid); in ieee80211_agg_tx_operational()
784 spin_unlock_bh(&sta->lock); in ieee80211_agg_tx_operational()
786 ieee80211_agg_start_txq(sta, tid, true); in ieee80211_agg_tx_operational()
789 void ieee80211_start_tx_ba_cb(struct sta_info *sta, int tid, in ieee80211_start_tx_ba_cb() argument
792 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_start_tx_ba_cb()
795 lockdep_assert_wiphy(sta->local->hw.wiphy); in ieee80211_start_tx_ba_cb()
805 ieee80211_send_addba_with_timeout(sta, tid_tx); in ieee80211_start_tx_ba_cb()
811 ieee80211_agg_tx_operational(local, sta, tid); in ieee80211_start_tx_ba_cb()
816 const u8 *ra, u16 tid, struct sta_info **sta) in ieee80211_lookup_tid_tx() argument
826 *sta = sta_info_get_bss(sdata, ra); in ieee80211_lookup_tid_tx()
827 if (!*sta) { in ieee80211_lookup_tid_tx()
832 tid_tx = rcu_dereference((*sta)->ampdu_mlme.tid_tx[tid]); in ieee80211_lookup_tid_tx()
845 struct sta_info *sta; in ieee80211_start_tx_ba_cb_irqsafe() local
851 tid_tx = ieee80211_lookup_tid_tx(sdata, ra, tid, &sta); in ieee80211_start_tx_ba_cb_irqsafe()
856 wiphy_work_queue(local->hw.wiphy, &sta->ampdu_mlme.work); in ieee80211_start_tx_ba_cb_irqsafe()
864 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_stop_tx_ba_session() local
865 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_stop_tx_ba_session()
878 spin_lock_bh(&sta->lock); in ieee80211_stop_tx_ba_session()
879 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_stop_tx_ba_session()
886 WARN(sta->reserved_tid == tid, in ieee80211_stop_tx_ba_session()
896 wiphy_work_queue(local->hw.wiphy, &sta->ampdu_mlme.work); in ieee80211_stop_tx_ba_session()
899 spin_unlock_bh(&sta->lock); in ieee80211_stop_tx_ba_session()
904 void ieee80211_stop_tx_ba_cb(struct sta_info *sta, int tid, in ieee80211_stop_tx_ba_cb() argument
907 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_stop_tx_ba_cb()
912 sta->sta.addr, tid); in ieee80211_stop_tx_ba_cb()
914 spin_lock_bh(&sta->lock); in ieee80211_stop_tx_ba_cb()
919 sta->sta.addr, tid); in ieee80211_stop_tx_ba_cb()
926 ieee80211_remove_tid_tx(sta, tid); in ieee80211_stop_tx_ba_cb()
930 spin_unlock_bh(&sta->lock); in ieee80211_stop_tx_ba_cb()
933 ieee80211_agg_start_txq(sta, tid, false); in ieee80211_stop_tx_ba_cb()
936 ieee80211_send_delba(sdata, sta->sta.addr, tid, in ieee80211_stop_tx_ba_cb()
945 struct sta_info *sta; in ieee80211_stop_tx_ba_cb_irqsafe() local
951 tid_tx = ieee80211_lookup_tid_tx(sdata, ra, tid, &sta); in ieee80211_stop_tx_ba_cb_irqsafe()
956 wiphy_work_queue(local->hw.wiphy, &sta->ampdu_mlme.work); in ieee80211_stop_tx_ba_cb_irqsafe()
964 struct sta_info *sta, in ieee80211_process_addba_resp() argument
973 lockdep_assert_wiphy(sta->local->hw.wiphy); in ieee80211_process_addba_resp()
980 ieee80211_retrieve_addba_ext_data(sta, in ieee80211_process_addba_resp()
988 txq = sta->sta.txq[tid]; in ieee80211_process_addba_resp()
992 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_process_addba_resp()
997 ht_dbg(sta->sdata, "wrong addBA response token, %pM tid %d\n", in ieee80211_process_addba_resp()
998 sta->sta.addr, tid); in ieee80211_process_addba_resp()
1004 ht_dbg(sta->sdata, "switched off addBA timer for %pM tid %d\n", in ieee80211_process_addba_resp()
1005 sta->sta.addr, tid); in ieee80211_process_addba_resp()
1014 ht_dbg(sta->sdata, in ieee80211_process_addba_resp()
1016 sta->sta.addr, tid); in ieee80211_process_addba_resp()
1038 ieee80211_agg_tx_operational(local, sta, tid); in ieee80211_process_addba_resp()
1040 sta->ampdu_mlme.addba_req_num[tid] = 0; in ieee80211_process_addba_resp()
1052 __ieee80211_stop_tx_ba_session(sta, tid, AGG_STOP_DECLINED); in ieee80211_process_addba_resp()