Lines Matching refs:sta
79 struct sta_info *sta) in sta_info_hash_del() argument
81 return rhashtable_remove_fast(&local->sta_hash, &sta->hash_node, in sta_info_hash_del()
85 static void __cleanup_single_sta(struct sta_info *sta) in __cleanup_single_sta() argument
89 struct ieee80211_sub_if_data *sdata = sta->sdata; in __cleanup_single_sta()
93 if (test_sta_flag(sta, WLAN_STA_PS_STA) || in __cleanup_single_sta()
94 test_sta_flag(sta, WLAN_STA_PS_DRIVER) || in __cleanup_single_sta()
95 test_sta_flag(sta, WLAN_STA_PS_DELIVER)) { in __cleanup_single_sta()
96 if (sta->sdata->vif.type == NL80211_IFTYPE_AP || in __cleanup_single_sta()
97 sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) in __cleanup_single_sta()
104 clear_sta_flag(sta, WLAN_STA_PS_STA); in __cleanup_single_sta()
105 clear_sta_flag(sta, WLAN_STA_PS_DRIVER); in __cleanup_single_sta()
106 clear_sta_flag(sta, WLAN_STA_PS_DELIVER); in __cleanup_single_sta()
111 if (sta->sta.txq[0]) { in __cleanup_single_sta()
112 for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) { in __cleanup_single_sta()
113 struct txq_info *txqi = to_txq_info(sta->sta.txq[i]); in __cleanup_single_sta()
122 local->total_ps_buffered -= skb_queue_len(&sta->ps_tx_buf[ac]); in __cleanup_single_sta()
123 ieee80211_purge_tx_queue(&local->hw, &sta->ps_tx_buf[ac]); in __cleanup_single_sta()
124 ieee80211_purge_tx_queue(&local->hw, &sta->tx_filtered[ac]); in __cleanup_single_sta()
128 mesh_sta_cleanup(sta); in __cleanup_single_sta()
130 cancel_work_sync(&sta->drv_deliver_wk); in __cleanup_single_sta()
139 kfree(sta->ampdu_mlme.tid_start_tx[i]); in __cleanup_single_sta()
140 tid_tx = rcu_dereference_raw(sta->ampdu_mlme.tid_tx[i]); in __cleanup_single_sta()
148 static void cleanup_single_sta(struct sta_info *sta) in cleanup_single_sta() argument
150 struct ieee80211_sub_if_data *sdata = sta->sdata; in cleanup_single_sta()
153 __cleanup_single_sta(sta); in cleanup_single_sta()
154 sta_info_free(local, sta); in cleanup_single_sta()
162 struct sta_info *sta; in sta_info_get() local
169 for_each_sta_info(local, tbl, addr, sta, tmp) { in sta_info_get()
170 if (sta->sdata == sdata) { in sta_info_get()
175 return sta; in sta_info_get()
190 struct sta_info *sta; in sta_info_get_bss() local
197 for_each_sta_info(local, tbl, addr, sta, tmp) { in sta_info_get_bss()
198 if (sta->sdata == sdata || in sta_info_get_bss()
199 (sta->sdata->bss && sta->sdata->bss == sdata->bss)) { in sta_info_get_bss()
204 return sta; in sta_info_get_bss()
215 struct sta_info *sta; in sta_info_get_by_idx() local
218 list_for_each_entry_rcu(sta, &local->sta_list, list) { in sta_info_get_by_idx()
219 if (sdata != sta->sdata) in sta_info_get_by_idx()
225 return sta; in sta_info_get_by_idx()
242 void sta_info_free(struct ieee80211_local *local, struct sta_info *sta) in sta_info_free() argument
244 if (sta->rate_ctrl) in sta_info_free()
245 rate_control_free_sta(sta); in sta_info_free()
247 sta_dbg(sta->sdata, "Destroyed STA %pM\n", sta->sta.addr); in sta_info_free()
249 if (sta->sta.txq[0]) in sta_info_free()
250 kfree(to_txq_info(sta->sta.txq[0])); in sta_info_free()
251 kfree(rcu_dereference_raw(sta->sta.rates)); in sta_info_free()
253 kfree(sta->mesh); in sta_info_free()
255 kfree(sta); in sta_info_free()
260 struct sta_info *sta) in sta_info_hash_add() argument
262 return rhashtable_insert_fast(&local->sta_hash, &sta->hash_node, in sta_info_hash_add()
268 struct sta_info *sta; in sta_deliver_ps_frames() local
270 sta = container_of(wk, struct sta_info, drv_deliver_wk); in sta_deliver_ps_frames()
272 if (sta->dead) in sta_deliver_ps_frames()
276 if (!test_sta_flag(sta, WLAN_STA_PS_STA)) in sta_deliver_ps_frames()
277 ieee80211_sta_ps_deliver_wakeup(sta); in sta_deliver_ps_frames()
278 else if (test_and_clear_sta_flag(sta, WLAN_STA_PSPOLL)) in sta_deliver_ps_frames()
279 ieee80211_sta_ps_deliver_poll_response(sta); in sta_deliver_ps_frames()
280 else if (test_and_clear_sta_flag(sta, WLAN_STA_UAPSD)) in sta_deliver_ps_frames()
281 ieee80211_sta_ps_deliver_uapsd(sta); in sta_deliver_ps_frames()
286 struct sta_info *sta, gfp_t gfp) in sta_prepare_rate_control() argument
291 sta->rate_ctrl = local->rate_ctrl; in sta_prepare_rate_control()
292 sta->rate_ctrl_priv = rate_control_alloc_sta(sta->rate_ctrl, in sta_prepare_rate_control()
293 sta, gfp); in sta_prepare_rate_control()
294 if (!sta->rate_ctrl_priv) in sta_prepare_rate_control()
305 struct sta_info *sta; in sta_info_alloc() local
308 sta = kzalloc(sizeof(*sta) + hw->sta_data_size, gfp); in sta_info_alloc()
309 if (!sta) in sta_info_alloc()
312 spin_lock_init(&sta->lock); in sta_info_alloc()
313 spin_lock_init(&sta->ps_lock); in sta_info_alloc()
314 INIT_WORK(&sta->drv_deliver_wk, sta_deliver_ps_frames); in sta_info_alloc()
315 INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work); in sta_info_alloc()
316 mutex_init(&sta->ampdu_mlme.mtx); in sta_info_alloc()
319 sta->mesh = kzalloc(sizeof(*sta->mesh), gfp); in sta_info_alloc()
320 if (!sta->mesh) in sta_info_alloc()
322 spin_lock_init(&sta->mesh->plink_lock); in sta_info_alloc()
325 init_timer(&sta->mesh->plink_timer); in sta_info_alloc()
326 sta->mesh->nonpeer_pm = NL80211_MESH_POWER_ACTIVE; in sta_info_alloc()
330 memcpy(sta->addr, addr, ETH_ALEN); in sta_info_alloc()
331 memcpy(sta->sta.addr, addr, ETH_ALEN); in sta_info_alloc()
332 sta->local = local; in sta_info_alloc()
333 sta->sdata = sdata; in sta_info_alloc()
334 sta->rx_stats.last_rx = jiffies; in sta_info_alloc()
336 sta->sta_state = IEEE80211_STA_NONE; in sta_info_alloc()
339 sta->reserved_tid = IEEE80211_TID_UNRESERVED; in sta_info_alloc()
341 sta->last_connected = ktime_get_seconds(); in sta_info_alloc()
342 ewma_signal_init(&sta->rx_stats.avg_signal); in sta_info_alloc()
343 for (i = 0; i < ARRAY_SIZE(sta->rx_stats.chain_signal_avg); i++) in sta_info_alloc()
344 ewma_signal_init(&sta->rx_stats.chain_signal_avg[i]); in sta_info_alloc()
351 txq_data = kcalloc(ARRAY_SIZE(sta->sta.txq), size, gfp); in sta_info_alloc()
355 for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) { in sta_info_alloc()
358 ieee80211_init_tx_queue(sdata, sta, txq, i); in sta_info_alloc()
362 if (sta_prepare_rate_control(local, sta, gfp)) in sta_info_alloc()
371 sta->timer_to_tid[i] = i; in sta_info_alloc()
374 skb_queue_head_init(&sta->ps_tx_buf[i]); in sta_info_alloc()
375 skb_queue_head_init(&sta->tx_filtered[i]); in sta_info_alloc()
379 sta->last_seq_ctrl[i] = cpu_to_le16(USHRT_MAX); in sta_info_alloc()
381 sta->sta.smps_mode = IEEE80211_SMPS_OFF; in sta_info_alloc()
394 sta->known_smps_mode = IEEE80211_SMPS_OFF; in sta_info_alloc()
397 sta->known_smps_mode = IEEE80211_SMPS_STATIC; in sta_info_alloc()
400 sta->known_smps_mode = IEEE80211_SMPS_DYNAMIC; in sta_info_alloc()
407 sta_dbg(sdata, "Allocated STA %pM\n", sta->sta.addr); in sta_info_alloc()
409 return sta; in sta_info_alloc()
412 if (sta->sta.txq[0]) in sta_info_alloc()
413 kfree(to_txq_info(sta->sta.txq[0])); in sta_info_alloc()
416 kfree(sta->mesh); in sta_info_alloc()
418 kfree(sta); in sta_info_alloc()
422 static int sta_info_insert_check(struct sta_info *sta) in sta_info_insert_check() argument
424 struct ieee80211_sub_if_data *sdata = sta->sdata; in sta_info_insert_check()
434 if (WARN_ON(ether_addr_equal(sta->sta.addr, sdata->vif.addr) || in sta_info_insert_check()
435 is_multicast_ether_addr(sta->sta.addr))) in sta_info_insert_check()
443 struct sta_info *sta) in sta_info_insert_drv_state() argument
448 for (state = IEEE80211_STA_NOTEXIST; state < sta->sta_state; state++) { in sta_info_insert_drv_state()
449 err = drv_sta_state(local, sdata, sta, state, state + 1); in sta_info_insert_drv_state()
460 sta->uploaded = true; in sta_info_insert_drv_state()
467 sta->sta.addr, state + 1, err); in sta_info_insert_drv_state()
473 WARN_ON(drv_sta_state(local, sdata, sta, state, state - 1)); in sta_info_insert_drv_state()
483 static int sta_info_insert_finish(struct sta_info *sta) __acquires(RCU) in sta_info_insert_finish() argument
485 struct ieee80211_local *local = sta->local; in sta_info_insert_finish()
486 struct ieee80211_sub_if_data *sdata = sta->sdata; in sta_info_insert_finish()
499 if (sta_info_get_bss(sdata, sta->sta.addr)) { in sta_info_insert_finish()
509 set_sta_flag(sta, WLAN_STA_BLOCK_BA); in sta_info_insert_finish()
512 err = sta_info_hash_add(local, sta); in sta_info_insert_finish()
516 list_add_tail_rcu(&sta->list, &local->sta_list); in sta_info_insert_finish()
519 err = sta_info_insert_drv_state(local, sdata, sta); in sta_info_insert_finish()
523 set_sta_flag(sta, WLAN_STA_INSERTED); in sta_info_insert_finish()
525 clear_sta_flag(sta, WLAN_STA_BLOCK_BA); in sta_info_insert_finish()
528 ieee80211_sta_debugfs_add(sta); in sta_info_insert_finish()
529 rate_control_add_sta_debugfs(sta); in sta_info_insert_finish()
532 cfg80211_new_sta(sdata->dev, sta->sta.addr, sinfo, GFP_KERNEL); in sta_info_insert_finish()
535 sta_dbg(sdata, "Inserted STA %pM\n", sta->sta.addr); in sta_info_insert_finish()
546 sta_info_hash_del(local, sta); in sta_info_insert_finish()
547 list_del_rcu(&sta->list); in sta_info_insert_finish()
551 __cleanup_single_sta(sta); in sta_info_insert_finish()
558 int sta_info_insert_rcu(struct sta_info *sta) __acquires(RCU) in sta_info_insert_rcu() argument
560 struct ieee80211_local *local = sta->local; in sta_info_insert_rcu()
565 err = sta_info_insert_check(sta); in sta_info_insert_rcu()
573 err = sta_info_insert_finish(sta); in sta_info_insert_rcu()
579 sta_info_free(local, sta); in sta_info_insert_rcu()
583 int sta_info_insert(struct sta_info *sta) in sta_info_insert() argument
585 int err = sta_info_insert_rcu(sta); in sta_info_insert()
637 static void __sta_info_recalc_tim(struct sta_info *sta, bool ignore_pending) in __sta_info_recalc_tim() argument
639 struct ieee80211_local *local = sta->local; in __sta_info_recalc_tim()
642 u8 ignore_for_tim = sta->sta.uapsd_queues; in __sta_info_recalc_tim()
644 u16 id = sta->sta.aid; in __sta_info_recalc_tim()
646 if (sta->sdata->vif.type == NL80211_IFTYPE_AP || in __sta_info_recalc_tim()
647 sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) { in __sta_info_recalc_tim()
648 if (WARN_ON_ONCE(!sta->sdata->bss)) in __sta_info_recalc_tim()
651 ps = &sta->sdata->bss->ps; in __sta_info_recalc_tim()
653 } else if (ieee80211_vif_is_mesh(&sta->sdata->vif)) { in __sta_info_recalc_tim()
654 ps = &sta->sdata->u.mesh.ps; in __sta_info_recalc_tim()
664 if (sta->dead) in __sta_info_recalc_tim()
685 indicate_tim |= !skb_queue_empty(&sta->tx_filtered[ac]) || in __sta_info_recalc_tim()
686 !skb_queue_empty(&sta->ps_tx_buf[ac]); in __sta_info_recalc_tim()
693 sta->driver_buffered_tids & tids; in __sta_info_recalc_tim()
695 sta->txq_buffered_tids & tids; in __sta_info_recalc_tim()
709 if (local->ops->set_tim && !WARN_ON(sta->dead)) { in __sta_info_recalc_tim()
711 drv_set_tim(local, &sta->sta, indicate_tim); in __sta_info_recalc_tim()
719 void sta_info_recalc_tim(struct sta_info *sta) in sta_info_recalc_tim() argument
721 __sta_info_recalc_tim(sta, false); in sta_info_recalc_tim()
724 static bool sta_info_buffer_expired(struct sta_info *sta, struct sk_buff *skb) in sta_info_buffer_expired() argument
735 timeout = (sta->listen_interval * in sta_info_buffer_expired()
736 sta->sdata->vif.bss_conf.beacon_int * in sta_info_buffer_expired()
745 struct sta_info *sta, int ac) in sta_info_cleanup_expire_buffered_ac() argument
758 spin_lock_irqsave(&sta->tx_filtered[ac].lock, flags); in sta_info_cleanup_expire_buffered_ac()
759 skb = skb_peek(&sta->tx_filtered[ac]); in sta_info_cleanup_expire_buffered_ac()
760 if (sta_info_buffer_expired(sta, skb)) in sta_info_cleanup_expire_buffered_ac()
761 skb = __skb_dequeue(&sta->tx_filtered[ac]); in sta_info_cleanup_expire_buffered_ac()
764 spin_unlock_irqrestore(&sta->tx_filtered[ac].lock, flags); in sta_info_cleanup_expire_buffered_ac()
784 spin_lock_irqsave(&sta->ps_tx_buf[ac].lock, flags); in sta_info_cleanup_expire_buffered_ac()
785 skb = skb_peek(&sta->ps_tx_buf[ac]); in sta_info_cleanup_expire_buffered_ac()
786 if (sta_info_buffer_expired(sta, skb)) in sta_info_cleanup_expire_buffered_ac()
787 skb = __skb_dequeue(&sta->ps_tx_buf[ac]); in sta_info_cleanup_expire_buffered_ac()
790 spin_unlock_irqrestore(&sta->ps_tx_buf[ac].lock, flags); in sta_info_cleanup_expire_buffered_ac()
801 ps_dbg(sta->sdata, "Buffered frame expired (STA %pM)\n", in sta_info_cleanup_expire_buffered_ac()
802 sta->sta.addr); in sta_info_cleanup_expire_buffered_ac()
811 sta_info_recalc_tim(sta); in sta_info_cleanup_expire_buffered_ac()
818 return !(skb_queue_empty(&sta->ps_tx_buf[ac]) && in sta_info_cleanup_expire_buffered_ac()
819 skb_queue_empty(&sta->tx_filtered[ac])); in sta_info_cleanup_expire_buffered_ac()
823 struct sta_info *sta) in sta_info_cleanup_expire_buffered() argument
829 if (!sta->sdata->bss && in sta_info_cleanup_expire_buffered()
830 !ieee80211_vif_is_mesh(&sta->sdata->vif)) in sta_info_cleanup_expire_buffered()
835 sta_info_cleanup_expire_buffered_ac(local, sta, ac); in sta_info_cleanup_expire_buffered()
840 static int __must_check __sta_info_destroy_part1(struct sta_info *sta) in __sta_info_destroy_part1() argument
848 if (!sta) in __sta_info_destroy_part1()
851 local = sta->local; in __sta_info_destroy_part1()
852 sdata = sta->sdata; in __sta_info_destroy_part1()
862 set_sta_flag(sta, WLAN_STA_BLOCK_BA); in __sta_info_destroy_part1()
863 ieee80211_sta_tear_down_BA_sessions(sta, AGG_STOP_DESTROY_STA); in __sta_info_destroy_part1()
865 ret = sta_info_hash_del(local, sta); in __sta_info_destroy_part1()
873 if (test_sta_flag(sta, WLAN_STA_TDLS_OFF_CHANNEL)) { in __sta_info_destroy_part1()
874 drv_tdls_cancel_channel_switch(local, sdata, &sta->sta); in __sta_info_destroy_part1()
875 clear_sta_flag(sta, WLAN_STA_TDLS_OFF_CHANNEL); in __sta_info_destroy_part1()
878 list_del_rcu(&sta->list); in __sta_info_destroy_part1()
880 drv_sta_pre_rcu_remove(local, sta->sdata, sta); in __sta_info_destroy_part1()
883 rcu_access_pointer(sdata->u.vlan.sta) == sta) in __sta_info_destroy_part1()
884 RCU_INIT_POINTER(sdata->u.vlan.sta, NULL); in __sta_info_destroy_part1()
889 static void __sta_info_destroy_part2(struct sta_info *sta) in __sta_info_destroy_part2() argument
891 struct ieee80211_local *local = sta->local; in __sta_info_destroy_part2()
892 struct ieee80211_sub_if_data *sdata = sta->sdata; in __sta_info_destroy_part2()
905 ieee80211_free_sta_keys(local, sta); in __sta_info_destroy_part2()
908 __sta_info_recalc_tim(sta, true); in __sta_info_destroy_part2()
910 sta->dead = true; in __sta_info_destroy_part2()
915 while (sta->sta_state > IEEE80211_STA_NONE) { in __sta_info_destroy_part2()
916 ret = sta_info_move_state(sta, sta->sta_state - 1); in __sta_info_destroy_part2()
923 if (sta->uploaded) { in __sta_info_destroy_part2()
924 ret = drv_sta_state(local, sdata, sta, IEEE80211_STA_NONE, in __sta_info_destroy_part2()
929 sta_dbg(sdata, "Removed STA %pM\n", sta->sta.addr); in __sta_info_destroy_part2()
933 sta_set_sinfo(sta, sinfo); in __sta_info_destroy_part2()
934 cfg80211_del_sta_sinfo(sdata->dev, sta->sta.addr, sinfo, GFP_KERNEL); in __sta_info_destroy_part2()
937 rate_control_remove_sta_debugfs(sta); in __sta_info_destroy_part2()
938 ieee80211_sta_debugfs_remove(sta); in __sta_info_destroy_part2()
941 cleanup_single_sta(sta); in __sta_info_destroy_part2()
944 int __must_check __sta_info_destroy(struct sta_info *sta) in __sta_info_destroy() argument
946 int err = __sta_info_destroy_part1(sta); in __sta_info_destroy()
953 __sta_info_destroy_part2(sta); in __sta_info_destroy()
960 struct sta_info *sta; in sta_info_destroy_addr() local
964 sta = sta_info_get(sdata, addr); in sta_info_destroy_addr()
965 ret = __sta_info_destroy(sta); in sta_info_destroy_addr()
974 struct sta_info *sta; in sta_info_destroy_addr_bss() local
978 sta = sta_info_get_bss(sdata, addr); in sta_info_destroy_addr_bss()
979 ret = __sta_info_destroy(sta); in sta_info_destroy_addr_bss()
988 struct sta_info *sta; in sta_info_cleanup() local
992 list_for_each_entry_rcu(sta, &local->sta_list, list) in sta_info_cleanup()
993 if (sta_info_cleanup_expire_buffered(local, sta)) in sta_info_cleanup()
1039 struct sta_info *sta, *tmp; in __sta_info_flush() local
1049 list_for_each_entry_safe(sta, tmp, &local->sta_list, list) { in __sta_info_flush()
1050 if (sdata == sta->sdata || in __sta_info_flush()
1051 (vlans && sdata->bss == sta->sdata->bss)) { in __sta_info_flush()
1052 if (!WARN_ON(__sta_info_destroy_part1(sta))) in __sta_info_flush()
1053 list_add(&sta->free_list, &free_list); in __sta_info_flush()
1060 list_for_each_entry_safe(sta, tmp, &free_list, free_list) in __sta_info_flush()
1061 __sta_info_destroy_part2(sta); in __sta_info_flush()
1072 struct sta_info *sta, *tmp; in ieee80211_sta_expire() local
1076 list_for_each_entry_safe(sta, tmp, &local->sta_list, list) { in ieee80211_sta_expire()
1077 if (sdata != sta->sdata) in ieee80211_sta_expire()
1080 if (time_after(jiffies, sta->rx_stats.last_rx + exp_time)) { in ieee80211_sta_expire()
1081 sta_dbg(sta->sdata, "expiring inactive STA %pM\n", in ieee80211_sta_expire()
1082 sta->sta.addr); in ieee80211_sta_expire()
1085 test_sta_flag(sta, WLAN_STA_PS_STA)) in ieee80211_sta_expire()
1088 WARN_ON(__sta_info_destroy(sta)); in ieee80211_sta_expire()
1100 struct sta_info *sta; in ieee80211_find_sta_by_ifaddr() local
1110 for_each_sta_info(local, tbl, addr, sta, tmp) { in ieee80211_find_sta_by_ifaddr()
1112 !ether_addr_equal(sta->sdata->vif.addr, localaddr)) in ieee80211_find_sta_by_ifaddr()
1114 if (!sta->uploaded) in ieee80211_find_sta_by_ifaddr()
1116 return &sta->sta; in ieee80211_find_sta_by_ifaddr()
1126 struct sta_info *sta; in ieee80211_find_sta() local
1131 sta = sta_info_get_bss(vif_to_sdata(vif), addr); in ieee80211_find_sta()
1132 if (!sta) in ieee80211_find_sta()
1135 if (!sta->uploaded) in ieee80211_find_sta()
1138 return &sta->sta; in ieee80211_find_sta()
1143 void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta) in ieee80211_sta_ps_deliver_wakeup() argument
1145 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_sta_ps_deliver_wakeup()
1163 clear_sta_flag(sta, WLAN_STA_SP); in ieee80211_sta_ps_deliver_wakeup()
1166 sta->driver_buffered_tids = 0; in ieee80211_sta_ps_deliver_wakeup()
1167 sta->txq_buffered_tids = 0; in ieee80211_sta_ps_deliver_wakeup()
1170 drv_sta_notify(local, sdata, STA_NOTIFY_AWAKE, &sta->sta); in ieee80211_sta_ps_deliver_wakeup()
1172 if (sta->sta.txq[0]) { in ieee80211_sta_ps_deliver_wakeup()
1173 for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) { in ieee80211_sta_ps_deliver_wakeup()
1174 struct txq_info *txqi = to_txq_info(sta->sta.txq[i]); in ieee80211_sta_ps_deliver_wakeup()
1186 spin_lock(&sta->ps_lock); in ieee80211_sta_ps_deliver_wakeup()
1191 spin_lock_irqsave(&sta->tx_filtered[ac].lock, flags); in ieee80211_sta_ps_deliver_wakeup()
1192 skb_queue_splice_tail_init(&sta->tx_filtered[ac], &pending); in ieee80211_sta_ps_deliver_wakeup()
1193 spin_unlock_irqrestore(&sta->tx_filtered[ac].lock, flags); in ieee80211_sta_ps_deliver_wakeup()
1198 spin_lock_irqsave(&sta->ps_tx_buf[ac].lock, flags); in ieee80211_sta_ps_deliver_wakeup()
1199 skb_queue_splice_tail_init(&sta->ps_tx_buf[ac], &pending); in ieee80211_sta_ps_deliver_wakeup()
1200 spin_unlock_irqrestore(&sta->ps_tx_buf[ac].lock, flags); in ieee80211_sta_ps_deliver_wakeup()
1208 clear_sta_flag(sta, WLAN_STA_PS_DELIVER); in ieee80211_sta_ps_deliver_wakeup()
1213 clear_sta_flag(sta, WLAN_STA_PSPOLL); in ieee80211_sta_ps_deliver_wakeup()
1214 clear_sta_flag(sta, WLAN_STA_UAPSD); in ieee80211_sta_ps_deliver_wakeup()
1215 spin_unlock(&sta->ps_lock); in ieee80211_sta_ps_deliver_wakeup()
1221 !ieee80211_smps_is_restrictive(sta->known_smps_mode, in ieee80211_sta_ps_deliver_wakeup()
1223 sta->known_smps_mode != sdata->bss->req_smps && in ieee80211_sta_ps_deliver_wakeup()
1224 sta_info_tx_streams(sta) != 1) { in ieee80211_sta_ps_deliver_wakeup()
1227 sta->sta.addr); in ieee80211_sta_ps_deliver_wakeup()
1229 sta->sta.addr, in ieee80211_sta_ps_deliver_wakeup()
1235 sta_info_recalc_tim(sta); in ieee80211_sta_ps_deliver_wakeup()
1239 sta->sta.addr, sta->sta.aid, filtered, buffered); in ieee80211_sta_ps_deliver_wakeup()
1241 ieee80211_check_fast_xmit(sta); in ieee80211_sta_ps_deliver_wakeup()
1245 struct sta_info *sta, int tid, in ieee80211_send_null_response() argument
1254 bool qos = sta->sta.wme; in ieee80211_send_null_response()
1278 memcpy(nullfunc->addr1, sta->sta.addr, ETH_ALEN); in ieee80211_send_null_response()
1308 drv_allow_buffered_frames(local, sta, BIT(tid), 1, in ieee80211_send_null_response()
1322 ieee80211_xmit(sdata, sta, skb); in ieee80211_send_null_response()
1338 ieee80211_sta_ps_deliver_response(struct sta_info *sta, in ieee80211_sta_ps_deliver_response() argument
1342 struct ieee80211_sub_if_data *sdata = sta->sdata; in ieee80211_sta_ps_deliver_response()
1350 set_sta_flag(sta, WLAN_STA_SP); in ieee80211_sta_ps_deliver_response()
1367 driver_release_tids |= sta->driver_buffered_tids & tids; in ieee80211_sta_ps_deliver_response()
1368 driver_release_tids |= sta->txq_buffered_tids & tids; in ieee80211_sta_ps_deliver_response()
1389 skb = skb_dequeue(&sta->tx_filtered[ac]); in ieee80211_sta_ps_deliver_response()
1392 &sta->ps_tx_buf[ac]); in ieee80211_sta_ps_deliver_response()
1407 if (!skb_queue_empty(&sta->tx_filtered[ac]) || in ieee80211_sta_ps_deliver_response()
1408 !skb_queue_empty(&sta->ps_tx_buf[ac])) { in ieee80211_sta_ps_deliver_response()
1435 ieee80211_send_null_response(sdata, sta, tid, reason, true); in ieee80211_sta_ps_deliver_response()
1528 drv_allow_buffered_frames(local, sta, tids, num, in ieee80211_sta_ps_deliver_response()
1535 sdata, sta, find_highest_prio_tid(tids), in ieee80211_sta_ps_deliver_response()
1538 sta_info_recalc_tim(sta); in ieee80211_sta_ps_deliver_response()
1540 unsigned long tids = sta->txq_buffered_tids & driver_release_tids; in ieee80211_sta_ps_deliver_response()
1553 drv_release_buffered_frames(local, sta, driver_release_tids, in ieee80211_sta_ps_deliver_response()
1566 if (!sta->sta.txq[0]) in ieee80211_sta_ps_deliver_response()
1569 for (tid = 0; tid < ARRAY_SIZE(sta->sta.txq); tid++) { in ieee80211_sta_ps_deliver_response()
1570 struct txq_info *txqi = to_txq_info(sta->sta.txq[tid]); in ieee80211_sta_ps_deliver_response()
1575 sta_info_recalc_tim(sta); in ieee80211_sta_ps_deliver_response()
1581 void ieee80211_sta_ps_deliver_poll_response(struct sta_info *sta) in ieee80211_sta_ps_deliver_poll_response() argument
1583 u8 ignore_for_response = sta->sta.uapsd_queues; in ieee80211_sta_ps_deliver_poll_response()
1593 ieee80211_sta_ps_deliver_response(sta, 1, ignore_for_response, in ieee80211_sta_ps_deliver_poll_response()
1597 void ieee80211_sta_ps_deliver_uapsd(struct sta_info *sta) in ieee80211_sta_ps_deliver_uapsd() argument
1599 int n_frames = sta->sta.max_sp; in ieee80211_sta_ps_deliver_uapsd()
1600 u8 delivery_enabled = sta->sta.uapsd_queues; in ieee80211_sta_ps_deliver_uapsd()
1611 switch (sta->sta.max_sp) { in ieee80211_sta_ps_deliver_uapsd()
1627 ieee80211_sta_ps_deliver_response(sta, n_frames, ~delivery_enabled, in ieee80211_sta_ps_deliver_uapsd()
1634 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_sta_block_awake() local
1636 trace_api_sta_block_awake(sta->local, pubsta, block); in ieee80211_sta_block_awake()
1639 set_sta_flag(sta, WLAN_STA_PS_DRIVER); in ieee80211_sta_block_awake()
1640 ieee80211_clear_fast_xmit(sta); in ieee80211_sta_block_awake()
1644 if (!test_sta_flag(sta, WLAN_STA_PS_DRIVER)) in ieee80211_sta_block_awake()
1647 if (!test_sta_flag(sta, WLAN_STA_PS_STA)) { in ieee80211_sta_block_awake()
1648 set_sta_flag(sta, WLAN_STA_PS_DELIVER); in ieee80211_sta_block_awake()
1649 clear_sta_flag(sta, WLAN_STA_PS_DRIVER); in ieee80211_sta_block_awake()
1650 ieee80211_queue_work(hw, &sta->drv_deliver_wk); in ieee80211_sta_block_awake()
1651 } else if (test_sta_flag(sta, WLAN_STA_PSPOLL) || in ieee80211_sta_block_awake()
1652 test_sta_flag(sta, WLAN_STA_UAPSD)) { in ieee80211_sta_block_awake()
1654 clear_sta_flag(sta, WLAN_STA_PS_DRIVER); in ieee80211_sta_block_awake()
1655 ieee80211_queue_work(hw, &sta->drv_deliver_wk); in ieee80211_sta_block_awake()
1657 clear_sta_flag(sta, WLAN_STA_PS_DRIVER); in ieee80211_sta_block_awake()
1658 ieee80211_check_fast_xmit(sta); in ieee80211_sta_block_awake()
1665 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_sta_eosp() local
1666 struct ieee80211_local *local = sta->local; in ieee80211_sta_eosp()
1670 clear_sta_flag(sta, WLAN_STA_SP); in ieee80211_sta_eosp()
1677 struct sta_info *sta = container_of(pubsta, struct sta_info, sta); in ieee80211_sta_set_buffered() local
1682 trace_api_sta_set_buffered(sta->local, pubsta, tid, buffered); in ieee80211_sta_set_buffered()
1685 set_bit(tid, &sta->driver_buffered_tids); in ieee80211_sta_set_buffered()
1687 clear_bit(tid, &sta->driver_buffered_tids); in ieee80211_sta_set_buffered()
1689 sta_info_recalc_tim(sta); in ieee80211_sta_set_buffered()
1693 int sta_info_move_state(struct sta_info *sta, in sta_info_move_state() argument
1698 if (sta->sta_state == new_state) in sta_info_move_state()
1705 if (sta->sta_state != IEEE80211_STA_AUTH) in sta_info_move_state()
1709 if (sta->sta_state != IEEE80211_STA_NONE && in sta_info_move_state()
1710 sta->sta_state != IEEE80211_STA_ASSOC) in sta_info_move_state()
1714 if (sta->sta_state != IEEE80211_STA_AUTH && in sta_info_move_state()
1715 sta->sta_state != IEEE80211_STA_AUTHORIZED) in sta_info_move_state()
1719 if (sta->sta_state != IEEE80211_STA_ASSOC) in sta_info_move_state()
1727 sta_dbg(sta->sdata, "moving STA %pM to state %d\n", in sta_info_move_state()
1728 sta->sta.addr, new_state); in sta_info_move_state()
1734 if (test_sta_flag(sta, WLAN_STA_INSERTED)) { in sta_info_move_state()
1735 int err = drv_sta_state(sta->local, sta->sdata, sta, in sta_info_move_state()
1736 sta->sta_state, new_state); in sta_info_move_state()
1745 if (sta->sta_state == IEEE80211_STA_AUTH) in sta_info_move_state()
1746 clear_bit(WLAN_STA_AUTH, &sta->_flags); in sta_info_move_state()
1749 if (sta->sta_state == IEEE80211_STA_NONE) in sta_info_move_state()
1750 set_bit(WLAN_STA_AUTH, &sta->_flags); in sta_info_move_state()
1751 else if (sta->sta_state == IEEE80211_STA_ASSOC) in sta_info_move_state()
1752 clear_bit(WLAN_STA_ASSOC, &sta->_flags); in sta_info_move_state()
1755 if (sta->sta_state == IEEE80211_STA_AUTH) { in sta_info_move_state()
1756 set_bit(WLAN_STA_ASSOC, &sta->_flags); in sta_info_move_state()
1757 } else if (sta->sta_state == IEEE80211_STA_AUTHORIZED) { in sta_info_move_state()
1758 if (sta->sdata->vif.type == NL80211_IFTYPE_AP || in sta_info_move_state()
1759 (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN && in sta_info_move_state()
1760 !sta->sdata->u.vlan.sta)) in sta_info_move_state()
1761 atomic_dec(&sta->sdata->bss->num_mcast_sta); in sta_info_move_state()
1762 clear_bit(WLAN_STA_AUTHORIZED, &sta->_flags); in sta_info_move_state()
1763 ieee80211_clear_fast_xmit(sta); in sta_info_move_state()
1767 if (sta->sta_state == IEEE80211_STA_ASSOC) { in sta_info_move_state()
1768 if (sta->sdata->vif.type == NL80211_IFTYPE_AP || in sta_info_move_state()
1769 (sta->sdata->vif.type == NL80211_IFTYPE_AP_VLAN && in sta_info_move_state()
1770 !sta->sdata->u.vlan.sta)) in sta_info_move_state()
1771 atomic_inc(&sta->sdata->bss->num_mcast_sta); in sta_info_move_state()
1772 set_bit(WLAN_STA_AUTHORIZED, &sta->_flags); in sta_info_move_state()
1773 ieee80211_check_fast_xmit(sta); in sta_info_move_state()
1780 sta->sta_state = new_state; in sta_info_move_state()
1785 u8 sta_info_tx_streams(struct sta_info *sta) in sta_info_tx_streams() argument
1787 struct ieee80211_sta_ht_cap *ht_cap = &sta->sta.ht_cap; in sta_info_tx_streams()
1790 if (!sta->sta.ht_cap.ht_supported) in sta_info_tx_streams()
1793 if (sta->sta.vht_cap.vht_supported) { in sta_info_tx_streams()
1796 le16_to_cpu(sta->sta.vht_cap.vht_mcs.tx_mcs_map); in sta_info_tx_streams()
1820 static void sta_set_rate_info_rx(struct sta_info *sta, struct rate_info *rinfo) in sta_set_rate_info_rx() argument
1824 if (sta->rx_stats.last_rate_flag & RX_FLAG_HT) { in sta_set_rate_info_rx()
1826 rinfo->mcs = sta->rx_stats.last_rate_idx; in sta_set_rate_info_rx()
1827 } else if (sta->rx_stats.last_rate_flag & RX_FLAG_VHT) { in sta_set_rate_info_rx()
1829 rinfo->nss = sta->rx_stats.last_rate_vht_nss; in sta_set_rate_info_rx()
1830 rinfo->mcs = sta->rx_stats.last_rate_idx; in sta_set_rate_info_rx()
1833 int shift = ieee80211_vif_get_shift(&sta->sdata->vif); in sta_set_rate_info_rx()
1836 sband = sta->local->hw.wiphy->bands[ in sta_set_rate_info_rx()
1837 ieee80211_get_sdata_band(sta->sdata)]; in sta_set_rate_info_rx()
1838 brate = sband->bitrates[sta->rx_stats.last_rate_idx].bitrate; in sta_set_rate_info_rx()
1842 if (sta->rx_stats.last_rate_flag & RX_FLAG_SHORT_GI) in sta_set_rate_info_rx()
1845 if (sta->rx_stats.last_rate_flag & RX_FLAG_5MHZ) in sta_set_rate_info_rx()
1847 else if (sta->rx_stats.last_rate_flag & RX_FLAG_10MHZ) in sta_set_rate_info_rx()
1849 else if (sta->rx_stats.last_rate_flag & RX_FLAG_40MHZ) in sta_set_rate_info_rx()
1851 else if (sta->rx_stats.last_rate_vht_flag & RX_VHT_FLAG_80MHZ) in sta_set_rate_info_rx()
1853 else if (sta->rx_stats.last_rate_vht_flag & RX_VHT_FLAG_160MHZ) in sta_set_rate_info_rx()
1859 void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo) in sta_set_sinfo() argument
1861 struct ieee80211_sub_if_data *sdata = sta->sdata; in sta_set_sinfo()
1867 if (test_sta_flag(sta, WLAN_STA_RATE_CONTROL)) in sta_set_sinfo()
1879 drv_sta_statistics(local, sdata, &sta->sta, sinfo); in sta_set_sinfo()
1892 sinfo->connected_time = ktime_get_seconds() - sta->last_connected; in sta_set_sinfo()
1894 jiffies_to_msecs(jiffies - sta->rx_stats.last_rx); in sta_set_sinfo()
1900 sinfo->tx_bytes += sta->tx_stats.bytes[ac]; in sta_set_sinfo()
1907 sinfo->tx_packets += sta->tx_stats.packets[ac]; in sta_set_sinfo()
1913 sinfo->rx_bytes = sta->rx_stats.bytes; in sta_set_sinfo()
1918 sinfo->rx_packets = sta->rx_stats.packets; in sta_set_sinfo()
1923 sinfo->tx_retries = sta->status_stats.retry_count; in sta_set_sinfo()
1928 sinfo->tx_failed = sta->status_stats.retry_failed; in sta_set_sinfo()
1932 sinfo->rx_dropped_misc = sta->rx_stats.dropped; in sta_set_sinfo()
1941 if (ieee80211_hw_check(&sta->local->hw, SIGNAL_DBM) || in sta_set_sinfo()
1942 ieee80211_hw_check(&sta->local->hw, SIGNAL_UNSPEC)) { in sta_set_sinfo()
1944 sinfo->signal = (s8)sta->rx_stats.last_signal; in sta_set_sinfo()
1950 -ewma_signal_read(&sta->rx_stats.avg_signal); in sta_set_sinfo()
1955 if (sta->rx_stats.chains && in sta_set_sinfo()
1961 sinfo->chains = sta->rx_stats.chains; in sta_set_sinfo()
1964 sta->rx_stats.chain_signal_last[i]; in sta_set_sinfo()
1966 -ewma_signal_read(&sta->rx_stats.chain_signal_avg[i]); in sta_set_sinfo()
1971 sta_set_rate_info_tx(sta, &sta->tx_stats.last_rate, in sta_set_sinfo()
1977 sta_set_rate_info_rx(sta, &sinfo->rxrate); in sta_set_sinfo()
1987 tidstats->rx_msdu = sta->rx_stats.msdu[i]; in sta_set_sinfo()
1992 tidstats->tx_msdu = sta->tx_stats.msdu[i]; in sta_set_sinfo()
2001 sta->status_stats.msdu_retries[i]; in sta_set_sinfo()
2010 sta->status_stats.msdu_failed[i]; in sta_set_sinfo()
2023 sinfo->llid = sta->mesh->llid; in sta_set_sinfo()
2024 sinfo->plid = sta->mesh->plid; in sta_set_sinfo()
2025 sinfo->plink_state = sta->mesh->plink_state; in sta_set_sinfo()
2026 if (test_sta_flag(sta, WLAN_STA_TOFFSET_KNOWN)) { in sta_set_sinfo()
2028 sinfo->t_offset = sta->mesh->t_offset; in sta_set_sinfo()
2030 sinfo->local_pm = sta->mesh->local_pm; in sta_set_sinfo()
2031 sinfo->peer_pm = sta->mesh->peer_pm; in sta_set_sinfo()
2032 sinfo->nonpeer_pm = sta->mesh->nonpeer_pm; in sta_set_sinfo()
2054 if (test_sta_flag(sta, WLAN_STA_AUTHORIZED)) in sta_set_sinfo()
2056 if (test_sta_flag(sta, WLAN_STA_SHORT_PREAMBLE)) in sta_set_sinfo()
2058 if (sta->sta.wme) in sta_set_sinfo()
2060 if (test_sta_flag(sta, WLAN_STA_MFP)) in sta_set_sinfo()
2062 if (test_sta_flag(sta, WLAN_STA_AUTH)) in sta_set_sinfo()
2064 if (test_sta_flag(sta, WLAN_STA_ASSOC)) in sta_set_sinfo()
2066 if (test_sta_flag(sta, WLAN_STA_TDLS_PEER)) in sta_set_sinfo()
2071 thr = ref->ops->get_expected_throughput(sta->rate_ctrl_priv); in sta_set_sinfo()
2073 thr = drv_get_expected_throughput(local, &sta->sta); in sta_set_sinfo()