Lines Matching refs:sta

142 void ieee80211_assign_tid_tx(struct sta_info *sta, int tid,  in ieee80211_assign_tid_tx()  argument
145 lockdep_assert_held(&sta->ampdu_mlme.mtx); in ieee80211_assign_tid_tx()
146 lockdep_assert_held(&sta->lock); in ieee80211_assign_tid_tx()
147 rcu_assign_pointer(sta->ampdu_mlme.tid_tx[tid], tid_tx); in ieee80211_assign_tid_tx()
190 ieee80211_agg_stop_txq(struct sta_info *sta, int tid) in ieee80211_agg_stop_txq() argument
192 struct ieee80211_txq *txq = sta->sta.txq[tid]; in ieee80211_agg_stop_txq()
211 ieee80211_agg_start_txq(struct sta_info *sta, int tid, bool enable) in ieee80211_agg_start_txq() argument
213 struct ieee80211_txq *txq = sta->sta.txq[tid]; in ieee80211_agg_start_txq()
229 schedule_and_wake_txq(sta->sdata->local, txqi); in ieee80211_agg_start_txq()
268 static void ieee80211_remove_tid_tx(struct sta_info *sta, int tid) in ieee80211_remove_tid_tx() argument
272 lockdep_assert_held(&sta->ampdu_mlme.mtx); in ieee80211_remove_tid_tx()
273 lockdep_assert_held(&sta->lock); in ieee80211_remove_tid_tx()
275 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_remove_tid_tx()
287 ieee80211_agg_splice_packets(sta->sdata, tid_tx, tid); in ieee80211_remove_tid_tx()
290 ieee80211_assign_tid_tx(sta, tid, NULL); in ieee80211_remove_tid_tx()
292 ieee80211_agg_splice_finish(sta->sdata, tid); in ieee80211_remove_tid_tx()
293 ieee80211_agg_start_txq(sta, tid, false); in ieee80211_remove_tid_tx()
298 int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, in ___ieee80211_stop_tx_ba_session() argument
301 struct ieee80211_local *local = sta->local; in ___ieee80211_stop_tx_ba_session()
304 .sta = &sta->sta, in ___ieee80211_stop_tx_ba_session()
313 lockdep_assert_held(&sta->ampdu_mlme.mtx); in ___ieee80211_stop_tx_ba_session()
329 spin_lock_bh(&sta->lock); in ___ieee80211_stop_tx_ba_session()
332 tid_tx = sta->ampdu_mlme.tid_start_tx[tid]; in ___ieee80211_stop_tx_ba_session()
334 sta->ampdu_mlme.tid_start_tx[tid] = NULL; in ___ieee80211_stop_tx_ba_session()
336 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ___ieee80211_stop_tx_ba_session()
338 spin_unlock_bh(&sta->lock); in ___ieee80211_stop_tx_ba_session()
347 spin_unlock_bh(&sta->lock); in ___ieee80211_stop_tx_ba_session()
351 ret = drv_ampdu_action(local, sta->sdata, &params); in ___ieee80211_stop_tx_ba_session()
358 ieee80211_assign_tid_tx(sta, tid, NULL); in ___ieee80211_stop_tx_ba_session()
359 spin_unlock_bh(&sta->lock); in ___ieee80211_stop_tx_ba_session()
366 ieee80211_agg_stop_txq(sta, tid); in ___ieee80211_stop_tx_ba_session()
368 spin_unlock_bh(&sta->lock); in ___ieee80211_stop_tx_ba_session()
370 ht_dbg(sta->sdata, "Tx BA session stop requested for %pM tid %u\n", in ___ieee80211_stop_tx_ba_session()
371 sta->sta.addr, tid); in ___ieee80211_stop_tx_ba_session()
403 ret = drv_ampdu_action(local, sta->sdata, &params); in ___ieee80211_stop_tx_ba_session()
434 struct sta_info *sta = tid_tx->sta; in sta_addba_resp_timer_expired() local
439 ht_dbg(sta->sdata, in sta_addba_resp_timer_expired()
441 sta->sta.addr, tid); in sta_addba_resp_timer_expired()
445 ht_dbg(sta->sdata, "addBA response timer expired on %pM tid %d\n", in sta_addba_resp_timer_expired()
446 sta->sta.addr, tid); in sta_addba_resp_timer_expired()
448 ieee80211_stop_tx_ba_session(&sta->sta, tid); in sta_addba_resp_timer_expired()
451 void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid) in ieee80211_tx_ba_session_handle_start() argument
454 struct ieee80211_local *local = sta->local; in ieee80211_tx_ba_session_handle_start()
455 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_tx_ba_session_handle_start()
457 .sta = &sta->sta, in ieee80211_tx_ba_session_handle_start()
467 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_tx_ba_session_handle_start()
476 ieee80211_agg_stop_txq(sta, tid); in ieee80211_tx_ba_session_handle_start()
486 params.ssn = sta->tid_seq[tid] >> 4; in ieee80211_tx_ba_session_handle_start()
491 sta->sta.addr, tid); in ieee80211_tx_ba_session_handle_start()
492 spin_lock_bh(&sta->lock); in ieee80211_tx_ba_session_handle_start()
494 ieee80211_assign_tid_tx(sta, tid, NULL); in ieee80211_tx_ba_session_handle_start()
496 spin_unlock_bh(&sta->lock); in ieee80211_tx_ba_session_handle_start()
498 ieee80211_agg_start_txq(sta, tid, false); in ieee80211_tx_ba_session_handle_start()
507 sta->sta.addr, tid); in ieee80211_tx_ba_session_handle_start()
509 spin_lock_bh(&sta->lock); in ieee80211_tx_ba_session_handle_start()
510 sta->ampdu_mlme.last_addba_req_time[tid] = jiffies; in ieee80211_tx_ba_session_handle_start()
511 sta->ampdu_mlme.addba_req_num[tid]++; in ieee80211_tx_ba_session_handle_start()
512 spin_unlock_bh(&sta->lock); in ieee80211_tx_ba_session_handle_start()
514 if (sta->sta.he_cap.has_he) { in ieee80211_tx_ba_session_handle_start()
527 ieee80211_send_addba_request(sdata, sta->sta.addr, tid, in ieee80211_tx_ba_session_handle_start()
539 struct sta_info *sta = tid_tx->sta; in sta_tx_agg_session_timer_expired() local
553 ht_dbg(sta->sdata, "tx session timer expired on %pM tid %d\n", in sta_tx_agg_session_timer_expired()
554 sta->sta.addr, tid); in sta_tx_agg_session_timer_expired()
556 ieee80211_stop_tx_ba_session(&sta->sta, tid); in sta_tx_agg_session_timer_expired()
562 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_start_tx_ba_session() local
563 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_start_tx_ba_session()
570 if (WARN(sta->reserved_tid == tid, in ieee80211_start_tx_ba_session()
598 if (test_sta_flag(sta, WLAN_STA_BLOCK_BA)) { in ieee80211_start_tx_ba_session()
601 sta->sta.addr, tid); in ieee80211_start_tx_ba_session()
617 if (sta->sdata->vif.type == NL80211_IFTYPE_ADHOC && in ieee80211_start_tx_ba_session()
618 !sta->sta.ht_cap.ht_supported) { in ieee80211_start_tx_ba_session()
625 spin_lock_bh(&sta->lock); in ieee80211_start_tx_ba_session()
628 if (sta->ampdu_mlme.addba_req_num[tid] > HT_AGG_MAX_RETRIES) { in ieee80211_start_tx_ba_session()
638 if (sta->ampdu_mlme.addba_req_num[tid] > HT_AGG_BURST_RETRIES && in ieee80211_start_tx_ba_session()
639 time_before(jiffies, sta->ampdu_mlme.last_addba_req_time[tid] + in ieee80211_start_tx_ba_session()
643 sta->ampdu_mlme.addba_req_num[tid], sta->sta.addr, tid); in ieee80211_start_tx_ba_session()
648 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_start_tx_ba_session()
650 if (tid_tx || sta->ampdu_mlme.tid_start_tx[tid]) { in ieee80211_start_tx_ba_session()
653 sta->sta.addr, tid); in ieee80211_start_tx_ba_session()
669 tid_tx->sta = sta; in ieee80211_start_tx_ba_session()
680 sta->ampdu_mlme.dialog_token_allocator++; in ieee80211_start_tx_ba_session()
681 tid_tx->dialog_token = sta->ampdu_mlme.dialog_token_allocator; in ieee80211_start_tx_ba_session()
687 sta->ampdu_mlme.tid_start_tx[tid] = tid_tx; in ieee80211_start_tx_ba_session()
689 ieee80211_queue_work(&local->hw, &sta->ampdu_mlme.work); in ieee80211_start_tx_ba_session()
693 spin_unlock_bh(&sta->lock); in ieee80211_start_tx_ba_session()
699 struct sta_info *sta, u16 tid) in ieee80211_agg_tx_operational() argument
703 .sta = &sta->sta, in ieee80211_agg_tx_operational()
710 lockdep_assert_held(&sta->ampdu_mlme.mtx); in ieee80211_agg_tx_operational()
712 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_agg_tx_operational()
716 ht_dbg(sta->sdata, "Aggregation is on for %pM tid %d\n", in ieee80211_agg_tx_operational()
717 sta->sta.addr, tid); in ieee80211_agg_tx_operational()
719 drv_ampdu_action(local, sta->sdata, &params); in ieee80211_agg_tx_operational()
725 spin_lock_bh(&sta->lock); in ieee80211_agg_tx_operational()
727 ieee80211_agg_splice_packets(sta->sdata, tid_tx, tid); in ieee80211_agg_tx_operational()
734 ieee80211_agg_splice_finish(sta->sdata, tid); in ieee80211_agg_tx_operational()
736 spin_unlock_bh(&sta->lock); in ieee80211_agg_tx_operational()
738 ieee80211_agg_start_txq(sta, tid, true); in ieee80211_agg_tx_operational()
741 void ieee80211_start_tx_ba_cb(struct sta_info *sta, int tid, in ieee80211_start_tx_ba_cb() argument
744 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_start_tx_ba_cb()
751 ieee80211_agg_tx_operational(local, sta, tid); in ieee80211_start_tx_ba_cb()
756 const u8 *ra, u16 tid, struct sta_info **sta) in ieee80211_lookup_tid_tx() argument
766 *sta = sta_info_get_bss(sdata, ra); in ieee80211_lookup_tid_tx()
767 if (!*sta) { in ieee80211_lookup_tid_tx()
772 tid_tx = rcu_dereference((*sta)->ampdu_mlme.tid_tx[tid]); in ieee80211_lookup_tid_tx()
785 struct sta_info *sta; in ieee80211_start_tx_ba_cb_irqsafe() local
791 tid_tx = ieee80211_lookup_tid_tx(sdata, ra, tid, &sta); in ieee80211_start_tx_ba_cb_irqsafe()
796 ieee80211_queue_work(&local->hw, &sta->ampdu_mlme.work); in ieee80211_start_tx_ba_cb_irqsafe()
802 int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, in __ieee80211_stop_tx_ba_session() argument
807 mutex_lock(&sta->ampdu_mlme.mtx); in __ieee80211_stop_tx_ba_session()
809 ret = ___ieee80211_stop_tx_ba_session(sta, tid, reason); in __ieee80211_stop_tx_ba_session()
811 mutex_unlock(&sta->ampdu_mlme.mtx); in __ieee80211_stop_tx_ba_session()
818 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_stop_tx_ba_session() local
819 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_stop_tx_ba_session()
832 spin_lock_bh(&sta->lock); in ieee80211_stop_tx_ba_session()
833 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_stop_tx_ba_session()
840 WARN(sta->reserved_tid == tid, in ieee80211_stop_tx_ba_session()
850 ieee80211_queue_work(&local->hw, &sta->ampdu_mlme.work); in ieee80211_stop_tx_ba_session()
853 spin_unlock_bh(&sta->lock); in ieee80211_stop_tx_ba_session()
858 void ieee80211_stop_tx_ba_cb(struct sta_info *sta, int tid, in ieee80211_stop_tx_ba_cb() argument
861 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_stop_tx_ba_cb()
865 sta->sta.addr, tid); in ieee80211_stop_tx_ba_cb()
867 spin_lock_bh(&sta->lock); in ieee80211_stop_tx_ba_cb()
872 sta->sta.addr, tid); in ieee80211_stop_tx_ba_cb()
879 ieee80211_remove_tid_tx(sta, tid); in ieee80211_stop_tx_ba_cb()
882 spin_unlock_bh(&sta->lock); in ieee80211_stop_tx_ba_cb()
885 ieee80211_send_delba(sdata, sta->sta.addr, tid, in ieee80211_stop_tx_ba_cb()
894 struct sta_info *sta; in ieee80211_stop_tx_ba_cb_irqsafe() local
900 tid_tx = ieee80211_lookup_tid_tx(sdata, ra, tid, &sta); in ieee80211_stop_tx_ba_cb_irqsafe()
905 ieee80211_queue_work(&local->hw, &sta->ampdu_mlme.work); in ieee80211_stop_tx_ba_cb_irqsafe()
913 struct sta_info *sta, in ieee80211_process_addba_resp() argument
928 txq = sta->sta.txq[tid]; in ieee80211_process_addba_resp()
932 mutex_lock(&sta->ampdu_mlme.mtx); in ieee80211_process_addba_resp()
934 tid_tx = rcu_dereference_protected_tid_tx(sta, tid); in ieee80211_process_addba_resp()
939 ht_dbg(sta->sdata, "wrong addBA response token, %pM tid %d\n", in ieee80211_process_addba_resp()
940 sta->sta.addr, tid); in ieee80211_process_addba_resp()
946 ht_dbg(sta->sdata, "switched off addBA timer for %pM tid %d\n", in ieee80211_process_addba_resp()
947 sta->sta.addr, tid); in ieee80211_process_addba_resp()
956 ht_dbg(sta->sdata, in ieee80211_process_addba_resp()
958 sta->sta.addr, tid); in ieee80211_process_addba_resp()
980 ieee80211_agg_tx_operational(local, sta, tid); in ieee80211_process_addba_resp()
982 sta->ampdu_mlme.addba_req_num[tid] = 0; in ieee80211_process_addba_resp()
994 ___ieee80211_stop_tx_ba_session(sta, tid, AGG_STOP_DECLINED); in ieee80211_process_addba_resp()
998 mutex_unlock(&sta->ampdu_mlme.mtx); in ieee80211_process_addba_resp()