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()
427 struct sta_info *sta = tid_tx->sta; in sta_addba_resp_timer_expired() local
432 ht_dbg(sta->sdata, in sta_addba_resp_timer_expired()
434 sta->sta.addr, tid); in sta_addba_resp_timer_expired()
438 ht_dbg(sta->sdata, "addBA response timer expired on %pM tid %d\n", in sta_addba_resp_timer_expired()
439 sta->sta.addr, tid); in sta_addba_resp_timer_expired()
441 ieee80211_stop_tx_ba_session(&sta->sta, tid); in sta_addba_resp_timer_expired()
444 static void ieee80211_send_addba_with_timeout(struct sta_info *sta, in ieee80211_send_addba_with_timeout() argument
447 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_send_addba_with_timeout()
448 struct ieee80211_local *local = sta->local; in ieee80211_send_addba_with_timeout()
456 lockdep_assert_wiphy(sta->local->hw.wiphy); in ieee80211_send_addba_with_timeout()
461 sta->sta.addr, tid); in ieee80211_send_addba_with_timeout()
463 spin_lock_bh(&sta->lock); in ieee80211_send_addba_with_timeout()
464 sta->ampdu_mlme.last_addba_req_time[tid] = jiffies; in ieee80211_send_addba_with_timeout()
465 sta->ampdu_mlme.addba_req_num[tid]++; in ieee80211_send_addba_with_timeout()
466 spin_unlock_bh(&sta->lock); in ieee80211_send_addba_with_timeout()
468 if (sta->sta.valid_links || in ieee80211_send_addba_with_timeout()
469 sta->sta.deflink.eht_cap.has_eht || in ieee80211_send_addba_with_timeout()
472 } else if (sta->sta.deflink.he_cap.has_he) { in ieee80211_send_addba_with_timeout()
486 ieee80211_send_addba_request(sta, tid, tid_tx->dialog_token, in ieee80211_send_addba_with_timeout()
492 void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid) in ieee80211_tx_ba_session_handle_start() argument
495 struct ieee80211_local *local = sta->local; in ieee80211_tx_ba_session_handle_start()
496 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_tx_ba_session_handle_start()
498 .sta = &sta->sta, in ieee80211_tx_ba_session_handle_start()
507 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_tx_ba_session_handle_start()
524 params.ssn = sta->tid_seq[tid] >> 4; in ieee80211_tx_ba_session_handle_start()
539 sta->sta.addr, tid); in ieee80211_tx_ba_session_handle_start()
540 spin_lock_bh(&sta->lock); in ieee80211_tx_ba_session_handle_start()
542 ieee80211_assign_tid_tx(sta, tid, NULL); in ieee80211_tx_ba_session_handle_start()
544 spin_unlock_bh(&sta->lock); in ieee80211_tx_ba_session_handle_start()
546 ieee80211_agg_start_txq(sta, tid, false); in ieee80211_tx_ba_session_handle_start()
552 ieee80211_send_addba_with_timeout(sta, tid_tx); in ieee80211_tx_ba_session_handle_start()
558 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_refresh_tx_agg_session_timer() local
564 tid_tx = rcu_dereference(sta->ampdu_mlme.tid_tx[tid]); in ieee80211_refresh_tx_agg_session_timer()
580 struct sta_info *sta = tid_tx->sta; in sta_tx_agg_session_timer_expired() local
594 ht_dbg(sta->sdata, "tx session timer expired on %pM tid %d\n", in sta_tx_agg_session_timer_expired()
595 sta->sta.addr, tid); in sta_tx_agg_session_timer_expired()
597 ieee80211_stop_tx_ba_session(&sta->sta, tid); in sta_tx_agg_session_timer_expired()
603 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_start_tx_ba_session() local
604 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_start_tx_ba_session()
611 if (WARN(sta->reserved_tid == tid, in ieee80211_start_tx_ba_session()
644 if (test_sta_flag(sta, WLAN_STA_BLOCK_BA)) { in ieee80211_start_tx_ba_session()
647 sta->sta.addr, tid); in ieee80211_start_tx_ba_session()
651 if (test_sta_flag(sta, WLAN_STA_MFP) && in ieee80211_start_tx_ba_session()
652 !test_sta_flag(sta, WLAN_STA_AUTHORIZED)) { in ieee80211_start_tx_ba_session()
655 sta->sta.addr, tid); in ieee80211_start_tx_ba_session()
671 if (sta->sdata->vif.type == NL80211_IFTYPE_ADHOC && in ieee80211_start_tx_ba_session()
672 !sta->sta.deflink.ht_cap.ht_supported) { in ieee80211_start_tx_ba_session()
679 spin_lock_bh(&sta->lock); in ieee80211_start_tx_ba_session()
682 if (sta->ampdu_mlme.addba_req_num[tid] > HT_AGG_MAX_RETRIES) { in ieee80211_start_tx_ba_session()
692 if (sta->ampdu_mlme.addba_req_num[tid] > HT_AGG_BURST_RETRIES && in ieee80211_start_tx_ba_session()
693 time_before(jiffies, sta->ampdu_mlme.last_addba_req_time[tid] + in ieee80211_start_tx_ba_session()
697 sta->ampdu_mlme.addba_req_num[tid], sta->sta.addr, tid); in ieee80211_start_tx_ba_session()
702 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_start_tx_ba_session()
704 if (tid_tx || sta->ampdu_mlme.tid_start_tx[tid]) { in ieee80211_start_tx_ba_session()
707 sta->sta.addr, tid); in ieee80211_start_tx_ba_session()
723 tid_tx->sta = sta; in ieee80211_start_tx_ba_session()
734 sta->ampdu_mlme.dialog_token_allocator++; in ieee80211_start_tx_ba_session()
735 tid_tx->dialog_token = sta->ampdu_mlme.dialog_token_allocator; in ieee80211_start_tx_ba_session()
741 sta->ampdu_mlme.tid_start_tx[tid] = tid_tx; in ieee80211_start_tx_ba_session()
743 wiphy_work_queue(local->hw.wiphy, &sta->ampdu_mlme.work); in ieee80211_start_tx_ba_session()
747 spin_unlock_bh(&sta->lock); in ieee80211_start_tx_ba_session()
753 struct sta_info *sta, u16 tid) in ieee80211_agg_tx_operational() argument
757 .sta = &sta->sta, in ieee80211_agg_tx_operational()
764 lockdep_assert_wiphy(sta->local->hw.wiphy); in ieee80211_agg_tx_operational()
766 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_agg_tx_operational()
770 ht_dbg(sta->sdata, "Aggregation is on for %pM tid %d\n", in ieee80211_agg_tx_operational()
771 sta->sta.addr, tid); in ieee80211_agg_tx_operational()
773 drv_ampdu_action(local, sta->sdata, ¶ms); in ieee80211_agg_tx_operational()
779 spin_lock_bh(&sta->lock); in ieee80211_agg_tx_operational()
781 ieee80211_agg_splice_packets(sta->sdata, tid_tx, tid); in ieee80211_agg_tx_operational()
788 ieee80211_agg_splice_finish(sta->sdata, tid); in ieee80211_agg_tx_operational()
790 spin_unlock_bh(&sta->lock); in ieee80211_agg_tx_operational()
792 ieee80211_agg_start_txq(sta, tid, true); in ieee80211_agg_tx_operational()
795 void ieee80211_start_tx_ba_cb(struct sta_info *sta, int tid, in ieee80211_start_tx_ba_cb() argument
798 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_start_tx_ba_cb()
801 lockdep_assert_wiphy(sta->local->hw.wiphy); in ieee80211_start_tx_ba_cb()
811 ieee80211_send_addba_with_timeout(sta, tid_tx); in ieee80211_start_tx_ba_cb()
817 ieee80211_agg_tx_operational(local, sta, tid); in ieee80211_start_tx_ba_cb()
822 const u8 *ra, u16 tid, struct sta_info **sta) in ieee80211_lookup_tid_tx() argument
832 *sta = sta_info_get_bss(sdata, ra); in ieee80211_lookup_tid_tx()
833 if (!*sta) { in ieee80211_lookup_tid_tx()
838 tid_tx = rcu_dereference((*sta)->ampdu_mlme.tid_tx[tid]); in ieee80211_lookup_tid_tx()
851 struct sta_info *sta; in ieee80211_start_tx_ba_cb_irqsafe() local
857 tid_tx = ieee80211_lookup_tid_tx(sdata, ra, tid, &sta); in ieee80211_start_tx_ba_cb_irqsafe()
862 wiphy_work_queue(local->hw.wiphy, &sta->ampdu_mlme.work); in ieee80211_start_tx_ba_cb_irqsafe()
870 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_stop_tx_ba_session() local
871 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_stop_tx_ba_session()
884 spin_lock_bh(&sta->lock); in ieee80211_stop_tx_ba_session()
885 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_stop_tx_ba_session()
892 WARN(sta->reserved_tid == tid, in ieee80211_stop_tx_ba_session()
902 wiphy_work_queue(local->hw.wiphy, &sta->ampdu_mlme.work); in ieee80211_stop_tx_ba_session()
905 spin_unlock_bh(&sta->lock); in ieee80211_stop_tx_ba_session()
910 void ieee80211_stop_tx_ba_cb(struct sta_info *sta, int tid, in ieee80211_stop_tx_ba_cb() argument
913 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_stop_tx_ba_cb()
918 sta->sta.addr, tid); in ieee80211_stop_tx_ba_cb()
920 spin_lock_bh(&sta->lock); in ieee80211_stop_tx_ba_cb()
925 sta->sta.addr, tid); in ieee80211_stop_tx_ba_cb()
932 ieee80211_remove_tid_tx(sta, tid); in ieee80211_stop_tx_ba_cb()
936 spin_unlock_bh(&sta->lock); in ieee80211_stop_tx_ba_cb()
939 ieee80211_agg_start_txq(sta, tid, false); in ieee80211_stop_tx_ba_cb()
942 ieee80211_send_delba(sdata, sta->sta.addr, tid, in ieee80211_stop_tx_ba_cb()
951 struct sta_info *sta; in ieee80211_stop_tx_ba_cb_irqsafe() local
957 tid_tx = ieee80211_lookup_tid_tx(sdata, ra, tid, &sta); in ieee80211_stop_tx_ba_cb_irqsafe()
962 wiphy_work_queue(local->hw.wiphy, &sta->ampdu_mlme.work); in ieee80211_stop_tx_ba_cb_irqsafe()
970 struct sta_info *sta, in ieee80211_process_addba_resp() argument
979 lockdep_assert_wiphy(sta->local->hw.wiphy); in ieee80211_process_addba_resp()
986 ieee80211_retrieve_addba_ext_data(sta, in ieee80211_process_addba_resp()
994 txq = sta->sta.txq[tid]; in ieee80211_process_addba_resp()
998 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_process_addba_resp()
1003 ht_dbg(sta->sdata, "wrong addBA response token, %pM tid %d\n", in ieee80211_process_addba_resp()
1004 sta->sta.addr, tid); in ieee80211_process_addba_resp()
1010 ht_dbg(sta->sdata, "switched off addBA timer for %pM tid %d\n", in ieee80211_process_addba_resp()
1011 sta->sta.addr, tid); in ieee80211_process_addba_resp()
1020 ht_dbg(sta->sdata, in ieee80211_process_addba_resp()
1022 sta->sta.addr, tid); in ieee80211_process_addba_resp()
1044 ieee80211_agg_tx_operational(local, sta, tid); in ieee80211_process_addba_resp()
1046 sta->ampdu_mlme.addba_req_num[tid] = 0; in ieee80211_process_addba_resp()
1058 __ieee80211_stop_tx_ba_session(sta, tid, AGG_STOP_DECLINED); in ieee80211_process_addba_resp()