1
2
3
4
5
6
7#ifndef __IWL_MVM_H__
8#define __IWL_MVM_H__
9
10#include <linux/list.h>
11#include <linux/spinlock.h>
12#include <linux/leds.h>
13#include <linux/in6.h>
14
15#ifdef CONFIG_THERMAL
16#include <linux/thermal.h>
17#endif
18
19#include <linux/ktime.h>
20
21#include "iwl-op-mode.h"
22#include "iwl-trans.h"
23#include "fw/notif-wait.h"
24#include "iwl-eeprom-parse.h"
25#include "fw/file.h"
26#include "iwl-config.h"
27#include "sta.h"
28#include "fw-api.h"
29#include "constants.h"
30#include "fw/runtime.h"
31#include "fw/dbg.h"
32#include "fw/acpi.h"
33#include "iwl-nvm-parse.h"
34
35#include <linux/average.h>
36
37#define IWL_MVM_MAX_ADDRESSES 5
38
39#define IWL_RSSI_OFFSET 50
40#define IWL_MVM_MISSED_BEACONS_THRESHOLD 8
41#define IWL_MVM_MISSED_BEACONS_THRESHOLD_LONG 16
42
43
44#define MSEC_TO_TU(_msec) (_msec*1000/1024)
45
46
47
48
49
50#define IWL_MVM_CHANNEL_SWITCH_TIME_GO 40
51
52
53
54
55
56#define IWL_MVM_CHANNEL_SWITCH_TIME_CLIENT 10
57
58
59
60
61
62#define IWL_MVM_CHANNEL_SWITCH_MARGIN 4
63
64
65
66
67
68#define IWL_MVM_CS_UNBLOCK_TX_TIMEOUT 3
69
70
71#define IWL_MVM_OFFCHANNEL_QUEUE 0
72
73extern const struct ieee80211_ops iwl_mvm_hw_ops;
74
75
76
77
78
79
80
81
82
83struct iwl_mvm_mod_params {
84 bool init_dbg;
85 int power_scheme;
86};
87extern struct iwl_mvm_mod_params iwlmvm_mod_params;
88
89struct iwl_mvm_phy_ctxt {
90 u16 id;
91 u16 color;
92 u32 ref;
93
94 enum nl80211_chan_width width;
95
96
97
98
99
100 struct ieee80211_channel *channel;
101};
102
103struct iwl_mvm_time_event_data {
104 struct ieee80211_vif *vif;
105 struct list_head list;
106 unsigned long end_jiffies;
107 u32 duration;
108 bool running;
109 u32 uid;
110
111
112
113
114
115
116 u32 id;
117};
118
119
120
121
122
123
124
125
126
127enum iwl_power_scheme {
128 IWL_POWER_SCHEME_CAM = 1,
129 IWL_POWER_SCHEME_BPS,
130 IWL_POWER_SCHEME_LP
131};
132
133#define IWL_CONN_MAX_LISTEN_INTERVAL 10
134#define IWL_UAPSD_MAX_SP IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL
135
136#ifdef CONFIG_IWLWIFI_DEBUGFS
137enum iwl_dbgfs_pm_mask {
138 MVM_DEBUGFS_PM_KEEP_ALIVE = BIT(0),
139 MVM_DEBUGFS_PM_SKIP_OVER_DTIM = BIT(1),
140 MVM_DEBUGFS_PM_SKIP_DTIM_PERIODS = BIT(2),
141 MVM_DEBUGFS_PM_RX_DATA_TIMEOUT = BIT(3),
142 MVM_DEBUGFS_PM_TX_DATA_TIMEOUT = BIT(4),
143 MVM_DEBUGFS_PM_LPRX_ENA = BIT(6),
144 MVM_DEBUGFS_PM_LPRX_RSSI_THRESHOLD = BIT(7),
145 MVM_DEBUGFS_PM_SNOOZE_ENABLE = BIT(8),
146 MVM_DEBUGFS_PM_UAPSD_MISBEHAVING = BIT(9),
147 MVM_DEBUGFS_PM_USE_PS_POLL = BIT(10),
148};
149
150struct iwl_dbgfs_pm {
151 u16 keep_alive_seconds;
152 u32 rx_data_timeout;
153 u32 tx_data_timeout;
154 bool skip_over_dtim;
155 u8 skip_dtim_periods;
156 bool lprx_ena;
157 u32 lprx_rssi_threshold;
158 bool snooze_ena;
159 bool uapsd_misbehaving;
160 bool use_ps_poll;
161 int mask;
162};
163
164
165
166enum iwl_dbgfs_bf_mask {
167 MVM_DEBUGFS_BF_ENERGY_DELTA = BIT(0),
168 MVM_DEBUGFS_BF_ROAMING_ENERGY_DELTA = BIT(1),
169 MVM_DEBUGFS_BF_ROAMING_STATE = BIT(2),
170 MVM_DEBUGFS_BF_TEMP_THRESHOLD = BIT(3),
171 MVM_DEBUGFS_BF_TEMP_FAST_FILTER = BIT(4),
172 MVM_DEBUGFS_BF_TEMP_SLOW_FILTER = BIT(5),
173 MVM_DEBUGFS_BF_ENABLE_BEACON_FILTER = BIT(6),
174 MVM_DEBUGFS_BF_DEBUG_FLAG = BIT(7),
175 MVM_DEBUGFS_BF_ESCAPE_TIMER = BIT(8),
176 MVM_DEBUGFS_BA_ESCAPE_TIMER = BIT(9),
177 MVM_DEBUGFS_BA_ENABLE_BEACON_ABORT = BIT(10),
178};
179
180struct iwl_dbgfs_bf {
181 u32 bf_energy_delta;
182 u32 bf_roaming_energy_delta;
183 u32 bf_roaming_state;
184 u32 bf_temp_threshold;
185 u32 bf_temp_fast_filter;
186 u32 bf_temp_slow_filter;
187 u32 bf_enable_beacon_filter;
188 u32 bf_debug_flag;
189 u32 bf_escape_timer;
190 u32 ba_escape_timer;
191 u32 ba_enable_beacon_abort;
192 int mask;
193};
194#endif
195
196enum iwl_mvm_smps_type_request {
197 IWL_MVM_SMPS_REQ_BT_COEX,
198 IWL_MVM_SMPS_REQ_TT,
199 IWL_MVM_SMPS_REQ_PROT,
200 IWL_MVM_SMPS_REQ_FW,
201 NUM_IWL_MVM_SMPS_REQ,
202};
203
204enum iwl_bt_force_ant_mode {
205 BT_FORCE_ANT_DIS = 0,
206 BT_FORCE_ANT_AUTO,
207 BT_FORCE_ANT_BT,
208 BT_FORCE_ANT_WIFI,
209
210 BT_FORCE_ANT_MAX,
211};
212
213
214
215
216
217
218
219
220enum iwl_mvm_low_latency_force {
221 LOW_LATENCY_FORCE_UNSET,
222 LOW_LATENCY_FORCE_ON,
223 LOW_LATENCY_FORCE_OFF,
224 NUM_LOW_LATENCY_FORCE
225};
226
227
228
229
230
231
232
233
234
235
236
237
238
239enum iwl_mvm_low_latency_cause {
240 LOW_LATENCY_TRAFFIC = BIT(0),
241 LOW_LATENCY_DEBUGFS = BIT(1),
242 LOW_LATENCY_VCMD = BIT(2),
243 LOW_LATENCY_VIF_TYPE = BIT(3),
244 LOW_LATENCY_DEBUGFS_FORCE_ENABLE = BIT(4),
245 LOW_LATENCY_DEBUGFS_FORCE = BIT(5),
246};
247
248
249
250
251
252
253
254
255
256
257
258struct iwl_mvm_vif_bf_data {
259 bool bf_enabled;
260 bool ba_enabled;
261 int ave_beacon_signal;
262 int last_cqm_event;
263 int bt_coex_min_thold;
264 int bt_coex_max_thold;
265 int last_bt_coex_event;
266};
267
268
269
270
271
272
273
274struct iwl_probe_resp_data {
275 struct rcu_head rcu_head;
276 struct iwl_probe_resp_data_notif notif;
277 int noa_len;
278};
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315struct iwl_mvm_vif {
316 struct iwl_mvm *mvm;
317 u16 id;
318 u16 color;
319 u8 ap_sta_id;
320
321 u8 bssid[ETH_ALEN];
322 bool associated;
323 u8 ap_assoc_sta_count;
324
325 u16 cab_queue;
326
327 bool uploaded;
328 bool ap_ibss_active;
329 bool pm_enabled;
330 bool monitor_active;
331 u8 low_latency: 6;
332 u8 low_latency_actual: 1;
333 bool ps_disabled;
334 struct iwl_mvm_vif_bf_data bf_data;
335
336 struct {
337 u32 num_beacons, accu_num_beacons;
338 u8 avg_signal;
339 } beacon_stats;
340
341 u32 ap_beacon_time;
342
343 enum iwl_tsf_id tsf_id;
344
345
346
347
348
349
350 struct ieee80211_tx_queue_params queue_params[IEEE80211_NUM_ACS];
351 struct iwl_mvm_time_event_data time_event_data;
352 struct iwl_mvm_time_event_data hs_time_event_data;
353
354 struct iwl_mvm_int_sta bcast_sta;
355 struct iwl_mvm_int_sta mcast_sta;
356
357
358
359
360
361 struct iwl_mvm_phy_ctxt *phy_ctxt;
362
363#ifdef CONFIG_PM
364
365 struct {
366 u8 kck[NL80211_KCK_EXT_LEN];
367 u8 kek[NL80211_KEK_EXT_LEN];
368 size_t kek_len;
369 size_t kck_len;
370 u32 akm;
371 __le64 replay_ctr;
372 bool valid;
373 } rekey_data;
374
375 int tx_key_idx;
376
377 bool seqno_valid;
378 u16 seqno;
379#endif
380
381#if IS_ENABLED(CONFIG_IPV6)
382
383 struct in6_addr target_ipv6_addrs[IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_MAX];
384 unsigned long tentative_addrs[BITS_TO_LONGS(IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_MAX)];
385 int num_target_ipv6_addrs;
386#endif
387
388#ifdef CONFIG_IWLWIFI_DEBUGFS
389 struct dentry *dbgfs_dir;
390 struct dentry *dbgfs_slink;
391 struct iwl_dbgfs_pm dbgfs_pm;
392 struct iwl_dbgfs_bf dbgfs_bf;
393 struct iwl_mac_power_cmd mac_pwr_cmd;
394 int dbgfs_quota_min;
395#endif
396
397 enum ieee80211_smps_mode smps_requests[NUM_IWL_MVM_SMPS_REQ];
398
399
400 u8 uapsd_misbehaving_bssid[ETH_ALEN];
401
402 struct delayed_work uapsd_nonagg_detected_wk;
403
404
405 bool csa_countdown;
406 bool csa_failed;
407 u16 csa_target_freq;
408 u16 csa_count;
409 u16 csa_misbehave;
410 struct delayed_work csa_work;
411
412
413 bool csa_bcn_pending;
414
415
416 netdev_features_t features;
417
418 struct iwl_probe_resp_data __rcu *probe_resp_data;
419
420
421 struct ieee80211_key_conf *ap_early_keys[4];
422
423
424 bool he_ru_2mhz_block;
425
426 struct {
427 struct ieee80211_key_conf __rcu *keys[2];
428 } bcn_prot;
429};
430
431static inline struct iwl_mvm_vif *
432iwl_mvm_vif_from_mac80211(struct ieee80211_vif *vif)
433{
434 if (!vif)
435 return NULL;
436 return (void *)vif->drv_priv;
437}
438
439extern const u8 tid_to_mac80211_ac[];
440
441#define IWL_MVM_SCAN_STOPPING_SHIFT 8
442
443enum iwl_scan_status {
444 IWL_MVM_SCAN_REGULAR = BIT(0),
445 IWL_MVM_SCAN_SCHED = BIT(1),
446 IWL_MVM_SCAN_NETDETECT = BIT(2),
447
448 IWL_MVM_SCAN_STOPPING_REGULAR = BIT(8),
449 IWL_MVM_SCAN_STOPPING_SCHED = BIT(9),
450 IWL_MVM_SCAN_STOPPING_NETDETECT = BIT(10),
451
452 IWL_MVM_SCAN_REGULAR_MASK = IWL_MVM_SCAN_REGULAR |
453 IWL_MVM_SCAN_STOPPING_REGULAR,
454 IWL_MVM_SCAN_SCHED_MASK = IWL_MVM_SCAN_SCHED |
455 IWL_MVM_SCAN_STOPPING_SCHED,
456 IWL_MVM_SCAN_NETDETECT_MASK = IWL_MVM_SCAN_NETDETECT |
457 IWL_MVM_SCAN_STOPPING_NETDETECT,
458
459 IWL_MVM_SCAN_STOPPING_MASK = 0xff << IWL_MVM_SCAN_STOPPING_SHIFT,
460 IWL_MVM_SCAN_MASK = 0xff,
461};
462
463enum iwl_mvm_scan_type {
464 IWL_SCAN_TYPE_NOT_SET,
465 IWL_SCAN_TYPE_UNASSOC,
466 IWL_SCAN_TYPE_WILD,
467 IWL_SCAN_TYPE_MILD,
468 IWL_SCAN_TYPE_FRAGMENTED,
469 IWL_SCAN_TYPE_FAST_BALANCE,
470};
471
472enum iwl_mvm_sched_scan_pass_all_states {
473 SCHED_SCAN_PASS_ALL_DISABLED,
474 SCHED_SCAN_PASS_ALL_ENABLED,
475 SCHED_SCAN_PASS_ALL_FOUND,
476};
477
478
479
480
481
482
483
484
485
486
487struct iwl_mvm_tt_mgmt {
488 struct delayed_work ct_kill_exit;
489 bool dynamic_smps;
490 u32 tx_backoff;
491 u32 min_backoff;
492 struct iwl_tt_params params;
493 bool throttle;
494};
495
496#ifdef CONFIG_THERMAL
497
498
499
500
501
502
503struct iwl_mvm_thermal_device {
504 s16 temp_trips[IWL_MAX_DTS_TRIPS];
505 u8 fw_trips_index[IWL_MAX_DTS_TRIPS];
506 struct thermal_zone_device *tzone;
507};
508
509
510
511
512
513
514struct iwl_mvm_cooling_device {
515 u32 cur_state;
516 struct thermal_cooling_device *cdev;
517};
518#endif
519
520#define IWL_MVM_NUM_LAST_FRAMES_UCODE_RATES 8
521
522struct iwl_mvm_frame_stats {
523 u32 legacy_frames;
524 u32 ht_frames;
525 u32 vht_frames;
526 u32 bw_20_frames;
527 u32 bw_40_frames;
528 u32 bw_80_frames;
529 u32 bw_160_frames;
530 u32 sgi_frames;
531 u32 ngi_frames;
532 u32 siso_frames;
533 u32 mimo2_frames;
534 u32 agg_frames;
535 u32 ampdu_count;
536 u32 success_frames;
537 u32 fail_frames;
538 u32 last_rates[IWL_MVM_NUM_LAST_FRAMES_UCODE_RATES];
539 int last_frame_idx;
540};
541
542#define IWL_MVM_DEBUG_SET_TEMPERATURE_DISABLE 0xff
543#define IWL_MVM_DEBUG_SET_TEMPERATURE_MIN -100
544#define IWL_MVM_DEBUG_SET_TEMPERATURE_MAX 200
545
546enum iwl_mvm_tdls_cs_state {
547 IWL_MVM_TDLS_SW_IDLE = 0,
548 IWL_MVM_TDLS_SW_REQ_SENT,
549 IWL_MVM_TDLS_SW_RESP_RCVD,
550 IWL_MVM_TDLS_SW_REQ_RCVD,
551 IWL_MVM_TDLS_SW_ACTIVE,
552};
553
554enum iwl_mvm_traffic_load {
555 IWL_MVM_TRAFFIC_LOW,
556 IWL_MVM_TRAFFIC_MEDIUM,
557 IWL_MVM_TRAFFIC_HIGH,
558};
559
560DECLARE_EWMA(rate, 16, 16)
561
562struct iwl_mvm_tcm_mac {
563 struct {
564 u32 pkts[IEEE80211_NUM_ACS];
565 u32 airtime;
566 } tx;
567 struct {
568 u32 pkts[IEEE80211_NUM_ACS];
569 u32 airtime;
570 u32 last_ampdu_ref;
571 } rx;
572 struct {
573
574 u64 rx_bytes;
575 struct ewma_rate rate;
576 bool detected;
577 } uapsd_nonagg_detect;
578 bool opened_rx_ba_sessions;
579};
580
581struct iwl_mvm_tcm {
582 struct delayed_work work;
583 spinlock_t lock;
584 unsigned long ts;
585 unsigned long ll_ts;
586 unsigned long uapsd_nonagg_ts;
587 bool paused;
588 struct iwl_mvm_tcm_mac data[NUM_MAC_INDEX_DRIVER];
589 struct {
590 u32 elapsed;
591 u32 airtime[NUM_MAC_INDEX_DRIVER];
592 enum iwl_mvm_traffic_load load[NUM_MAC_INDEX_DRIVER];
593 enum iwl_mvm_traffic_load band_load[NUM_NL80211_BANDS];
594 enum iwl_mvm_traffic_load global_load;
595 bool low_latency[NUM_MAC_INDEX_DRIVER];
596 bool change[NUM_MAC_INDEX_DRIVER];
597 } result;
598};
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621struct iwl_mvm_reorder_buffer {
622 u16 head_sn;
623 u16 num_stored;
624 u16 buf_size;
625 int queue;
626 u16 last_amsdu;
627 u8 last_sub_index;
628 struct timer_list reorder_timer;
629 bool removed;
630 bool valid;
631 spinlock_t lock;
632 struct iwl_mvm *mvm;
633 unsigned int consec_oldsn_drops;
634 u32 consec_oldsn_ampdu_gp2;
635 unsigned int consec_oldsn_prev_drop:1;
636} ____cacheline_aligned_in_smp;
637
638
639
640
641
642
643struct _iwl_mvm_reorder_buf_entry {
644 struct sk_buff_head frames;
645 unsigned long reorder_time;
646};
647
648
649struct iwl_mvm_reorder_buf_entry {
650 struct _iwl_mvm_reorder_buf_entry e;
651}
652#ifndef __CHECKER__
653
654__aligned(roundup_pow_of_two(sizeof(struct _iwl_mvm_reorder_buf_entry)))
655#endif
656;
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672struct iwl_mvm_baid_data {
673 struct rcu_head rcu_head;
674 u8 sta_id;
675 u8 tid;
676 u8 baid;
677 u16 timeout;
678 u16 entries_per_queue;
679 unsigned long last_rx;
680 struct timer_list session_timer;
681 struct iwl_mvm_baid_data __rcu **rcu_ptr;
682 struct iwl_mvm *mvm;
683 struct iwl_mvm_reorder_buffer reorder_buf[IWL_MAX_RX_HW_QUEUES];
684 struct iwl_mvm_reorder_buf_entry entries[];
685};
686
687static inline struct iwl_mvm_baid_data *
688iwl_mvm_baid_data_from_reorder_buf(struct iwl_mvm_reorder_buffer *buf)
689{
690 return (void *)((u8 *)buf -
691 offsetof(struct iwl_mvm_baid_data, reorder_buf) -
692 sizeof(*buf) * buf->queue);
693}
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715enum iwl_mvm_queue_status {
716 IWL_MVM_QUEUE_FREE,
717 IWL_MVM_QUEUE_RESERVED,
718 IWL_MVM_QUEUE_READY,
719 IWL_MVM_QUEUE_SHARED,
720};
721
722#define IWL_MVM_DQA_QUEUE_TIMEOUT (5 * HZ)
723#define IWL_MVM_INVALID_QUEUE 0xFFFF
724
725#define IWL_MVM_NUM_CIPHERS 10
726
727
728struct iwl_mvm_txq {
729 struct list_head list;
730 u16 txq_id;
731 atomic_t tx_request;
732 bool stopped;
733};
734
735static inline struct iwl_mvm_txq *
736iwl_mvm_txq_from_mac80211(struct ieee80211_txq *txq)
737{
738 return (void *)txq->drv_priv;
739}
740
741static inline struct iwl_mvm_txq *
742iwl_mvm_txq_from_tid(struct ieee80211_sta *sta, u8 tid)
743{
744 if (tid == IWL_MAX_TID_COUNT)
745 tid = IEEE80211_NUM_TIDS;
746
747 return (void *)sta->txq[tid]->drv_priv;
748}
749
750
751
752
753
754
755
756struct iwl_mvm_tvqm_txq_info {
757 u8 sta_id;
758 u8 txq_tid;
759};
760
761struct iwl_mvm_dqa_txq_info {
762 u8 ra_sta_id;
763 bool reserved;
764 u8 mac80211_ac;
765 u8 txq_tid;
766 u16 tid_bitmap;
767
768 unsigned long last_frame_time[IWL_MAX_TID_COUNT + 1];
769 enum iwl_mvm_queue_status status;
770};
771
772struct iwl_mvm {
773
774 struct device *dev;
775
776 struct iwl_trans *trans;
777 const struct iwl_fw *fw;
778 const struct iwl_cfg *cfg;
779 struct iwl_phy_db *phy_db;
780 struct ieee80211_hw *hw;
781
782
783 struct mutex mutex;
784 struct list_head async_handlers_list;
785 spinlock_t async_handlers_lock;
786 struct work_struct async_handlers_wk;
787
788 struct work_struct roc_done_wk;
789
790 unsigned long init_status;
791
792 unsigned long status;
793
794 u32 queue_sync_cookie;
795 unsigned long queue_sync_state;
796
797
798
799
800 struct iwl_mvm_vif *bf_allowed_vif;
801
802 bool hw_registered;
803 bool rfkill_safe_init_done;
804
805 u8 cca_40mhz_workaround;
806
807 u32 ampdu_ref;
808 bool ampdu_toggle;
809
810 struct iwl_notif_wait_data notif_wait;
811
812 union {
813 struct mvm_statistics_rx_v3 rx_stats_v3;
814 struct mvm_statistics_rx rx_stats;
815 };
816
817 struct {
818 u64 rx_time;
819 u64 tx_time;
820 u64 on_time_rf;
821 u64 on_time_scan;
822 } radio_stats, accu_radio_stats;
823
824 struct list_head add_stream_txqs;
825 union {
826 struct iwl_mvm_dqa_txq_info queue_info[IWL_MAX_HW_QUEUES];
827 struct iwl_mvm_tvqm_txq_info tvqm_info[IWL_MAX_TVQM_QUEUES];
828 };
829 struct work_struct add_stream_wk;
830
831 const char *nvm_file_name;
832 struct iwl_nvm_data *nvm_data;
833
834 struct iwl_nvm_section nvm_sections[NVM_MAX_NUM_SECTIONS];
835
836 struct iwl_fw_runtime fwrt;
837
838
839 struct mac_address addresses[IWL_MVM_MAX_ADDRESSES];
840
841
842 struct iwl_rx_phy_info last_phy_info;
843 struct ieee80211_sta __rcu *fw_id_to_mac_id[IWL_MVM_STATION_COUNT_MAX];
844 u8 rx_ba_sessions;
845
846
847 u32 rts_threshold;
848
849
850 unsigned int scan_status;
851 void *scan_cmd;
852 struct iwl_mcast_filter_cmd *mcast_filter_cmd;
853
854 enum iwl_mvm_scan_type scan_type;
855 enum iwl_mvm_scan_type hb_scan_type;
856
857 enum iwl_mvm_sched_scan_pass_all_states sched_scan_pass_all;
858 struct delayed_work scan_timeout_dwork;
859
860
861 unsigned int max_scans;
862
863
864 u32 scan_uid_status[IWL_MVM_MAX_UMAC_SCANS];
865
866
867 u64 scan_start;
868
869
870 struct iwl_mvm_vif *scan_vif;
871
872
873 u8 scan_rx_ant;
874
875#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
876
877 const struct iwl_fw_bcast_filter *bcast_filters;
878#ifdef CONFIG_IWLWIFI_DEBUGFS
879 struct {
880 bool override;
881 struct iwl_bcast_filter_cmd cmd;
882 } dbgfs_bcast_filtering;
883#endif
884#endif
885
886
887 struct iwl_mvm_int_sta aux_sta;
888 struct iwl_mvm_int_sta snif_sta;
889
890 bool last_ebs_successful;
891
892 u8 scan_last_antenna_idx;
893 u8 mgmt_last_antenna_idx;
894
895
896 enum iwl_sf_state sf_state;
897
898
899
900
901
902 struct dentry *debugfs_dir;
903#ifdef CONFIG_IWLWIFI_DEBUGFS
904 u32 dbgfs_sram_offset, dbgfs_sram_len;
905 u32 dbgfs_prph_reg_addr;
906 bool disable_power_off;
907 bool disable_power_off_d3;
908 bool beacon_inject_active;
909
910 bool scan_iter_notif_enabled;
911
912 struct debugfs_blob_wrapper nvm_hw_blob;
913 struct debugfs_blob_wrapper nvm_sw_blob;
914 struct debugfs_blob_wrapper nvm_calib_blob;
915 struct debugfs_blob_wrapper nvm_prod_blob;
916 struct debugfs_blob_wrapper nvm_phy_sku_blob;
917 struct debugfs_blob_wrapper nvm_reg_blob;
918
919 struct iwl_mvm_frame_stats drv_rx_stats;
920 spinlock_t drv_stats_lock;
921 u16 dbgfs_rx_phyinfo;
922#endif
923
924 struct iwl_mvm_phy_ctxt phy_ctxts[NUM_PHY_CTX];
925
926 struct list_head time_event_list;
927 spinlock_t time_event_lock;
928
929
930
931
932
933 unsigned long fw_key_table[BITS_TO_LONGS(STA_KEY_MAX_NUM)];
934 u8 fw_key_deleted[STA_KEY_MAX_NUM];
935
936 u8 vif_count;
937 struct ieee80211_vif __rcu *vif_id_to_mac[NUM_MAC_INDEX_DRIVER];
938
939
940 s8 fw_restart;
941 u8 *error_recovery_buf;
942
943#ifdef CONFIG_IWLWIFI_LEDS
944 struct led_classdev led;
945#endif
946
947 struct ieee80211_vif *p2p_device_vif;
948
949#ifdef CONFIG_PM
950 struct wiphy_wowlan_support wowlan;
951 int gtk_ivlen, gtk_icvlen, ptk_ivlen, ptk_icvlen;
952
953
954 struct ieee80211_scan_ies nd_ies;
955 struct cfg80211_match_set *nd_match_sets;
956 int n_nd_match_sets;
957 struct ieee80211_channel **nd_channels;
958 int n_nd_channels;
959 bool net_detect;
960 u8 offload_tid;
961#ifdef CONFIG_IWLWIFI_DEBUGFS
962 bool d3_wake_sysassert;
963 bool d3_test_active;
964 u32 d3_test_pme_ptr;
965 struct ieee80211_vif *keep_vif;
966 u32 last_netdetect_scans;
967#endif
968#endif
969
970 wait_queue_head_t rx_sync_waitq;
971
972
973 struct iwl_bt_coex_profile_notif last_bt_notif;
974 struct iwl_bt_coex_ci_cmd last_bt_ci_cmd;
975
976 u8 bt_tx_prio;
977 enum iwl_bt_force_ant_mode bt_force_ant_mode;
978
979
980 struct list_head aux_roc_te_list;
981
982
983 struct iwl_mvm_tt_mgmt thermal_throttle;
984#ifdef CONFIG_THERMAL
985 struct iwl_mvm_thermal_device tz_device;
986 struct iwl_mvm_cooling_device cooling_dev;
987#endif
988
989 s32 temperature;
990
991
992
993
994
995 bool temperature_test;
996
997 bool fw_static_smps_request;
998
999 unsigned long bt_coex_last_tcm_ts;
1000 struct iwl_mvm_tcm tcm;
1001
1002 u8 uapsd_noagg_bssid_write_idx;
1003 struct mac_address uapsd_noagg_bssids[IWL_MVM_UAPSD_NOAGG_BSSIDS_NUM]
1004 __aligned(2);
1005
1006 struct iwl_time_quota_cmd last_quota_cmd;
1007
1008#ifdef CONFIG_NL80211_TESTMODE
1009 u32 noa_duration;
1010 struct ieee80211_vif *noa_vif;
1011#endif
1012
1013
1014 u16 aux_queue;
1015 u16 snif_queue;
1016 u16 probe_queue;
1017 u16 p2p_dev_queue;
1018
1019
1020 u8 ps_disabled;
1021
1022 u32 ext_clock_valid;
1023
1024 struct ieee80211_vif __rcu *csa_vif;
1025 struct ieee80211_vif __rcu *csa_tx_blocked_vif;
1026 u8 csa_tx_block_bcn_timeout;
1027
1028
1029 u32 ap_last_beacon_gp2;
1030
1031
1032 bool ibss_manager;
1033
1034 bool lar_regdom_set;
1035 enum iwl_mcc_source mcc_src;
1036
1037
1038 struct {
1039 struct delayed_work dwork;
1040 enum iwl_mvm_tdls_cs_state state;
1041
1042
1043
1044
1045
1046 u8 cur_sta_id;
1047
1048
1049 struct {
1050 u8 sta_id;
1051 u8 op_class;
1052 bool initiator;
1053 struct cfg80211_chan_def chandef;
1054 struct sk_buff *skb;
1055 u32 ch_sw_tm_ie;
1056
1057
1058 u32 sent_timestamp;
1059 } peer;
1060 } tdls_cs;
1061
1062
1063 u32 ciphers[IWL_MVM_NUM_CIPHERS];
1064 struct ieee80211_cipher_scheme cs[IWL_UCODE_MAX_CS];
1065
1066 struct cfg80211_ftm_responder_stats ftm_resp_stats;
1067 struct {
1068 struct cfg80211_pmsr_request *req;
1069 struct wireless_dev *req_wdev;
1070 struct list_head loc_list;
1071 int responses[IWL_MVM_TOF_MAX_APS];
1072 struct {
1073 struct list_head resp;
1074 } smooth;
1075 struct list_head pasn_list;
1076 } ftm_initiator;
1077
1078 struct list_head resp_pasn_list;
1079
1080 struct {
1081 u8 d0i3_resp;
1082 u8 range_resp;
1083 } cmd_ver;
1084
1085 struct ieee80211_vif *nan_vif;
1086#define IWL_MAX_BAID 32
1087 struct iwl_mvm_baid_data __rcu *baid_map[IWL_MAX_BAID];
1088
1089
1090
1091
1092
1093 bool drop_bcn_ap_mode;
1094
1095 struct delayed_work cs_tx_unblock_dwork;
1096
1097
1098 bool monitor_on;
1099
1100
1101 __le16 cur_aid;
1102 u8 cur_bssid[ETH_ALEN];
1103
1104 unsigned long last_6ghz_passive_scan_jiffies;
1105 unsigned long last_reset_or_resume_time_jiffies;
1106};
1107
1108
1109#define IWL_OP_MODE_GET_MVM(_iwl_op_mode) \
1110 ((struct iwl_mvm *)(_iwl_op_mode)->op_mode_specific)
1111
1112#define IWL_MAC80211_GET_MVM(_hw) \
1113 IWL_OP_MODE_GET_MVM((struct iwl_op_mode *)((_hw)->priv))
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127enum iwl_mvm_status {
1128 IWL_MVM_STATUS_HW_RFKILL,
1129 IWL_MVM_STATUS_HW_CTKILL,
1130 IWL_MVM_STATUS_ROC_RUNNING,
1131 IWL_MVM_STATUS_HW_RESTART_REQUESTED,
1132 IWL_MVM_STATUS_IN_HW_RESTART,
1133 IWL_MVM_STATUS_ROC_AUX_RUNNING,
1134 IWL_MVM_STATUS_FIRMWARE_RUNNING,
1135 IWL_MVM_STATUS_NEED_FLUSH_P2P,
1136 IWL_MVM_STATUS_IN_D3,
1137};
1138
1139
1140enum iwl_mvm_init_status {
1141 IWL_MVM_INIT_STATUS_THERMAL_INIT_COMPLETE = BIT(0),
1142 IWL_MVM_INIT_STATUS_LEDS_INIT_COMPLETE = BIT(1),
1143};
1144
1145static inline bool iwl_mvm_is_radio_killed(struct iwl_mvm *mvm)
1146{
1147 return test_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status) ||
1148 test_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status);
1149}
1150
1151static inline bool iwl_mvm_is_radio_hw_killed(struct iwl_mvm *mvm)
1152{
1153 return test_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status);
1154}
1155
1156static inline bool iwl_mvm_firmware_running(struct iwl_mvm *mvm)
1157{
1158 return test_bit(IWL_MVM_STATUS_FIRMWARE_RUNNING, &mvm->status);
1159}
1160
1161
1162
1163
1164static inline struct iwl_mvm_sta *
1165iwl_mvm_sta_from_staid_rcu(struct iwl_mvm *mvm, u8 sta_id)
1166{
1167 struct ieee80211_sta *sta;
1168
1169 if (sta_id >= mvm->fw->ucode_capa.num_stations)
1170 return NULL;
1171
1172 sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
1173
1174
1175 if (IS_ERR_OR_NULL(sta))
1176 return NULL;
1177
1178 return iwl_mvm_sta_from_mac80211(sta);
1179}
1180
1181static inline struct iwl_mvm_sta *
1182iwl_mvm_sta_from_staid_protected(struct iwl_mvm *mvm, u8 sta_id)
1183{
1184 struct ieee80211_sta *sta;
1185
1186 if (sta_id >= mvm->fw->ucode_capa.num_stations)
1187 return NULL;
1188
1189 sta = rcu_dereference_protected(mvm->fw_id_to_mac_id[sta_id],
1190 lockdep_is_held(&mvm->mutex));
1191
1192
1193 if (IS_ERR_OR_NULL(sta))
1194 return NULL;
1195
1196 return iwl_mvm_sta_from_mac80211(sta);
1197}
1198
1199static inline struct ieee80211_vif *
1200iwl_mvm_rcu_dereference_vif_id(struct iwl_mvm *mvm, u8 vif_id, bool rcu)
1201{
1202 if (WARN_ON(vif_id >= ARRAY_SIZE(mvm->vif_id_to_mac)))
1203 return NULL;
1204
1205 if (rcu)
1206 return rcu_dereference(mvm->vif_id_to_mac[vif_id]);
1207
1208 return rcu_dereference_protected(mvm->vif_id_to_mac[vif_id],
1209 lockdep_is_held(&mvm->mutex));
1210}
1211
1212static inline bool iwl_mvm_is_adaptive_dwell_supported(struct iwl_mvm *mvm)
1213{
1214 return fw_has_api(&mvm->fw->ucode_capa,
1215 IWL_UCODE_TLV_API_ADAPTIVE_DWELL);
1216}
1217
1218static inline bool iwl_mvm_is_adaptive_dwell_v2_supported(struct iwl_mvm *mvm)
1219{
1220 return fw_has_api(&mvm->fw->ucode_capa,
1221 IWL_UCODE_TLV_API_ADAPTIVE_DWELL_V2);
1222}
1223
1224static inline bool iwl_mvm_is_adwell_hb_ap_num_supported(struct iwl_mvm *mvm)
1225{
1226 return fw_has_api(&mvm->fw->ucode_capa,
1227 IWL_UCODE_TLV_API_ADWELL_HB_DEF_N_AP);
1228}
1229
1230static inline bool iwl_mvm_is_oce_supported(struct iwl_mvm *mvm)
1231{
1232
1233 return fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_OCE);
1234}
1235
1236static inline bool iwl_mvm_is_frag_ebs_supported(struct iwl_mvm *mvm)
1237{
1238 return fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_FRAG_EBS);
1239}
1240
1241static inline bool iwl_mvm_is_short_beacon_notif_supported(struct iwl_mvm *mvm)
1242{
1243 return fw_has_api(&mvm->fw->ucode_capa,
1244 IWL_UCODE_TLV_API_SHORT_BEACON_NOTIF);
1245}
1246
1247static inline bool iwl_mvm_is_dqa_data_queue(struct iwl_mvm *mvm, u8 queue)
1248{
1249 return (queue >= IWL_MVM_DQA_MIN_DATA_QUEUE) &&
1250 (queue <= IWL_MVM_DQA_MAX_DATA_QUEUE);
1251}
1252
1253static inline bool iwl_mvm_is_dqa_mgmt_queue(struct iwl_mvm *mvm, u8 queue)
1254{
1255 return (queue >= IWL_MVM_DQA_MIN_MGMT_QUEUE) &&
1256 (queue <= IWL_MVM_DQA_MAX_MGMT_QUEUE);
1257}
1258
1259static inline bool iwl_mvm_is_lar_supported(struct iwl_mvm *mvm)
1260{
1261 bool nvm_lar = mvm->nvm_data->lar_enabled;
1262 bool tlv_lar = fw_has_capa(&mvm->fw->ucode_capa,
1263 IWL_UCODE_TLV_CAPA_LAR_SUPPORT);
1264
1265
1266
1267
1268
1269 if (mvm->cfg->nvm_type == IWL_NVM_EXT)
1270 return nvm_lar && tlv_lar;
1271 else
1272 return tlv_lar;
1273}
1274
1275static inline bool iwl_mvm_is_wifi_mcc_supported(struct iwl_mvm *mvm)
1276{
1277 return fw_has_api(&mvm->fw->ucode_capa,
1278 IWL_UCODE_TLV_API_WIFI_MCC_UPDATE) ||
1279 fw_has_capa(&mvm->fw->ucode_capa,
1280 IWL_UCODE_TLV_CAPA_LAR_MULTI_MCC);
1281}
1282
1283static inline bool iwl_mvm_bt_is_rrc_supported(struct iwl_mvm *mvm)
1284{
1285 return fw_has_capa(&mvm->fw->ucode_capa,
1286 IWL_UCODE_TLV_CAPA_BT_COEX_RRC) &&
1287 IWL_MVM_BT_COEX_RRC;
1288}
1289
1290static inline bool iwl_mvm_is_csum_supported(struct iwl_mvm *mvm)
1291{
1292 return fw_has_capa(&mvm->fw->ucode_capa,
1293 IWL_UCODE_TLV_CAPA_CSUM_SUPPORT) &&
1294 !IWL_MVM_HW_CSUM_DISABLE;
1295}
1296
1297static inline bool iwl_mvm_is_mplut_supported(struct iwl_mvm *mvm)
1298{
1299 return fw_has_capa(&mvm->fw->ucode_capa,
1300 IWL_UCODE_TLV_CAPA_BT_MPLUT_SUPPORT) &&
1301 IWL_MVM_BT_COEX_MPLUT;
1302}
1303
1304static inline
1305bool iwl_mvm_is_p2p_scm_uapsd_supported(struct iwl_mvm *mvm)
1306{
1307 return fw_has_capa(&mvm->fw->ucode_capa,
1308 IWL_UCODE_TLV_CAPA_P2P_SCM_UAPSD) &&
1309 !(iwlwifi_mod_params.uapsd_disable &
1310 IWL_DISABLE_UAPSD_P2P_CLIENT);
1311}
1312
1313static inline bool iwl_mvm_has_new_rx_api(struct iwl_mvm *mvm)
1314{
1315 return fw_has_capa(&mvm->fw->ucode_capa,
1316 IWL_UCODE_TLV_CAPA_MULTI_QUEUE_RX_SUPPORT);
1317}
1318
1319static inline bool iwl_mvm_has_new_tx_api(struct iwl_mvm *mvm)
1320{
1321
1322 return mvm->trans->trans_cfg->use_tfh;
1323}
1324
1325static inline bool iwl_mvm_has_unified_ucode(struct iwl_mvm *mvm)
1326{
1327
1328 return mvm->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_22000;
1329}
1330
1331static inline bool iwl_mvm_is_cdb_supported(struct iwl_mvm *mvm)
1332{
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342 return fw_has_capa(&mvm->fw->ucode_capa,
1343 IWL_UCODE_TLV_CAPA_CDB_SUPPORT);
1344}
1345
1346static inline bool iwl_mvm_cdb_scan_api(struct iwl_mvm *mvm)
1347{
1348
1349
1350
1351
1352
1353 return mvm->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_22000;
1354}
1355
1356static inline bool iwl_mvm_is_scan_ext_chan_supported(struct iwl_mvm *mvm)
1357{
1358 return fw_has_api(&mvm->fw->ucode_capa,
1359 IWL_UCODE_TLV_API_SCAN_EXT_CHAN_VER);
1360}
1361
1362
1363static inline bool iwl_mvm_is_reduced_config_scan_supported(struct iwl_mvm *mvm)
1364{
1365 return fw_has_api(&mvm->fw->ucode_capa,
1366 IWL_UCODE_TLV_API_REDUCED_SCAN_CONFIG);
1367}
1368
1369static inline bool iwl_mvm_is_band_in_rx_supported(struct iwl_mvm *mvm)
1370{
1371 return fw_has_api(&mvm->fw->ucode_capa,
1372 IWL_UCODE_TLV_API_BAND_IN_RX_DATA);
1373}
1374
1375static inline bool iwl_mvm_has_new_rx_stats_api(struct iwl_mvm *mvm)
1376{
1377 return fw_has_api(&mvm->fw->ucode_capa,
1378 IWL_UCODE_TLV_API_NEW_RX_STATS);
1379}
1380
1381static inline bool iwl_mvm_has_quota_low_latency(struct iwl_mvm *mvm)
1382{
1383 return fw_has_api(&mvm->fw->ucode_capa,
1384 IWL_UCODE_TLV_API_QUOTA_LOW_LATENCY);
1385}
1386
1387static inline bool iwl_mvm_has_tlc_offload(const struct iwl_mvm *mvm)
1388{
1389 return fw_has_capa(&mvm->fw->ucode_capa,
1390 IWL_UCODE_TLV_CAPA_TLC_OFFLOAD);
1391}
1392
1393static inline struct agg_tx_status *
1394iwl_mvm_get_agg_status(struct iwl_mvm *mvm, void *tx_resp)
1395{
1396 if (iwl_mvm_has_new_tx_api(mvm))
1397 return &((struct iwl_mvm_tx_resp *)tx_resp)->status;
1398 else
1399 return ((struct iwl_mvm_tx_resp_v3 *)tx_resp)->status;
1400}
1401
1402static inline bool iwl_mvm_is_tt_in_fw(struct iwl_mvm *mvm)
1403{
1404
1405
1406
1407
1408 return fw_has_capa(&mvm->fw->ucode_capa,
1409 IWL_UCODE_TLV_CAPA_CT_KILL_BY_FW) &&
1410 fw_has_capa(&mvm->fw->ucode_capa,
1411 IWL_UCODE_TLV_CAPA_TEMP_THS_REPORT_SUPPORT);
1412}
1413
1414static inline bool iwl_mvm_is_ctdp_supported(struct iwl_mvm *mvm)
1415{
1416 return fw_has_capa(&mvm->fw->ucode_capa,
1417 IWL_UCODE_TLV_CAPA_CTDP_SUPPORT);
1418}
1419
1420extern const u8 iwl_mvm_ac_to_tx_fifo[];
1421extern const u8 iwl_mvm_ac_to_gen2_tx_fifo[];
1422
1423static inline u8 iwl_mvm_mac_ac_to_tx_fifo(struct iwl_mvm *mvm,
1424 enum ieee80211_ac_numbers ac)
1425{
1426 return iwl_mvm_has_new_tx_api(mvm) ?
1427 iwl_mvm_ac_to_gen2_tx_fifo[ac] : iwl_mvm_ac_to_tx_fifo[ac];
1428}
1429
1430struct iwl_rate_info {
1431 u8 plcp;
1432 u8 plcp_siso;
1433 u8 plcp_mimo2;
1434 u8 plcp_mimo3;
1435 u8 ieee;
1436};
1437
1438void __iwl_mvm_mac_stop(struct iwl_mvm *mvm);
1439int __iwl_mvm_mac_start(struct iwl_mvm *mvm);
1440
1441
1442
1443
1444
1445int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm);
1446
1447
1448int iwl_mvm_legacy_rate_to_mac80211_idx(u32 rate_n_flags,
1449 enum nl80211_band band);
1450void iwl_mvm_hwrate_to_tx_rate(u32 rate_n_flags,
1451 enum nl80211_band band,
1452 struct ieee80211_tx_rate *r);
1453u8 iwl_mvm_mac80211_idx_to_hwrate(int rate_idx);
1454u8 iwl_mvm_mac80211_ac_to_ucode_ac(enum ieee80211_ac_numbers ac);
1455
1456static inline void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm)
1457{
1458 iwl_fwrt_dump_error_logs(&mvm->fwrt);
1459}
1460
1461u8 first_antenna(u8 mask);
1462u8 iwl_mvm_next_antenna(struct iwl_mvm *mvm, u8 valid, u8 last_idx);
1463void iwl_mvm_get_sync_time(struct iwl_mvm *mvm, int clock_type, u32 *gp2,
1464 u64 *boottime, ktime_t *realtime);
1465u32 iwl_mvm_get_systime(struct iwl_mvm *mvm);
1466
1467
1468int __must_check iwl_mvm_send_cmd(struct iwl_mvm *mvm,
1469 struct iwl_host_cmd *cmd);
1470int __must_check iwl_mvm_send_cmd_pdu(struct iwl_mvm *mvm, u32 id,
1471 u32 flags, u16 len, const void *data);
1472int __must_check iwl_mvm_send_cmd_status(struct iwl_mvm *mvm,
1473 struct iwl_host_cmd *cmd,
1474 u32 *status);
1475int __must_check iwl_mvm_send_cmd_pdu_status(struct iwl_mvm *mvm, u32 id,
1476 u16 len, const void *data,
1477 u32 *status);
1478int iwl_mvm_tx_skb_sta(struct iwl_mvm *mvm, struct sk_buff *skb,
1479 struct ieee80211_sta *sta);
1480int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb);
1481void iwl_mvm_set_tx_cmd(struct iwl_mvm *mvm, struct sk_buff *skb,
1482 struct iwl_tx_cmd *tx_cmd,
1483 struct ieee80211_tx_info *info, u8 sta_id);
1484void iwl_mvm_set_tx_cmd_rate(struct iwl_mvm *mvm, struct iwl_tx_cmd *tx_cmd,
1485 struct ieee80211_tx_info *info,
1486 struct ieee80211_sta *sta, __le16 fc);
1487void iwl_mvm_mac_itxq_xmit(struct ieee80211_hw *hw, struct ieee80211_txq *txq);
1488unsigned int iwl_mvm_max_amsdu_size(struct iwl_mvm *mvm,
1489 struct ieee80211_sta *sta,
1490 unsigned int tid);
1491
1492#ifdef CONFIG_IWLWIFI_DEBUG
1493const char *iwl_mvm_get_tx_fail_reason(u32 status);
1494#else
1495static inline const char *iwl_mvm_get_tx_fail_reason(u32 status) { return ""; }
1496#endif
1497int iwl_mvm_flush_tx_path(struct iwl_mvm *mvm, u32 tfd_msk);
1498int iwl_mvm_flush_sta(struct iwl_mvm *mvm, void *sta, bool internal);
1499int iwl_mvm_flush_sta_tids(struct iwl_mvm *mvm, u32 sta_id, u16 tids);
1500
1501void iwl_mvm_async_handlers_purge(struct iwl_mvm *mvm);
1502
1503static inline void iwl_mvm_set_tx_cmd_ccmp(struct ieee80211_tx_info *info,
1504 struct iwl_tx_cmd *tx_cmd)
1505{
1506 struct ieee80211_key_conf *keyconf = info->control.hw_key;
1507
1508 tx_cmd->sec_ctl = TX_CMD_SEC_CCM;
1509 memcpy(tx_cmd->key, keyconf->key, keyconf->keylen);
1510}
1511
1512static inline void iwl_mvm_wait_for_async_handlers(struct iwl_mvm *mvm)
1513{
1514 flush_work(&mvm->async_handlers_wk);
1515}
1516
1517
1518void iwl_mvm_handle_rx_statistics(struct iwl_mvm *mvm,
1519 struct iwl_rx_packet *pkt);
1520void iwl_mvm_rx_statistics(struct iwl_mvm *mvm,
1521 struct iwl_rx_cmd_buffer *rxb);
1522int iwl_mvm_request_statistics(struct iwl_mvm *mvm, bool clear);
1523void iwl_mvm_accu_radio_stats(struct iwl_mvm *mvm);
1524
1525
1526int iwl_nvm_init(struct iwl_mvm *mvm);
1527int iwl_mvm_load_nvm_to_nic(struct iwl_mvm *mvm);
1528
1529static inline u8 iwl_mvm_get_valid_tx_ant(struct iwl_mvm *mvm)
1530{
1531 return mvm->nvm_data && mvm->nvm_data->valid_tx_ant ?
1532 mvm->fw->valid_tx_ant & mvm->nvm_data->valid_tx_ant :
1533 mvm->fw->valid_tx_ant;
1534}
1535
1536static inline u8 iwl_mvm_get_valid_rx_ant(struct iwl_mvm *mvm)
1537{
1538 return mvm->nvm_data && mvm->nvm_data->valid_rx_ant ?
1539 mvm->fw->valid_rx_ant & mvm->nvm_data->valid_rx_ant :
1540 mvm->fw->valid_rx_ant;
1541}
1542
1543static inline void iwl_mvm_toggle_tx_ant(struct iwl_mvm *mvm, u8 *ant)
1544{
1545 *ant = iwl_mvm_next_antenna(mvm, iwl_mvm_get_valid_tx_ant(mvm), *ant);
1546}
1547
1548static inline u32 iwl_mvm_get_phy_config(struct iwl_mvm *mvm)
1549{
1550 u32 phy_config = ~(FW_PHY_CFG_TX_CHAIN |
1551 FW_PHY_CFG_RX_CHAIN);
1552 u32 valid_rx_ant = iwl_mvm_get_valid_rx_ant(mvm);
1553 u32 valid_tx_ant = iwl_mvm_get_valid_tx_ant(mvm);
1554
1555 phy_config |= valid_tx_ant << FW_PHY_CFG_TX_CHAIN_POS |
1556 valid_rx_ant << FW_PHY_CFG_RX_CHAIN_POS;
1557
1558 return mvm->fw->phy_config & phy_config;
1559}
1560
1561int iwl_mvm_up(struct iwl_mvm *mvm);
1562int iwl_mvm_load_d3_fw(struct iwl_mvm *mvm);
1563
1564int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm);
1565bool iwl_mvm_bcast_filter_build_cmd(struct iwl_mvm *mvm,
1566 struct iwl_bcast_filter_cmd *cmd);
1567
1568
1569
1570
1571
1572void iwl_mvm_rx_mq(struct iwl_op_mode *op_mode,
1573 struct napi_struct *napi,
1574 struct iwl_rx_cmd_buffer *rxb);
1575void iwl_mvm_rx_rx_phy_cmd(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
1576void iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct napi_struct *napi,
1577 struct iwl_rx_cmd_buffer *rxb);
1578void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
1579 struct iwl_rx_cmd_buffer *rxb, int queue);
1580void iwl_mvm_rx_monitor_no_data(struct iwl_mvm *mvm, struct napi_struct *napi,
1581 struct iwl_rx_cmd_buffer *rxb, int queue);
1582void iwl_mvm_rx_frame_release(struct iwl_mvm *mvm, struct napi_struct *napi,
1583 struct iwl_rx_cmd_buffer *rxb, int queue);
1584void iwl_mvm_rx_bar_frame_release(struct iwl_mvm *mvm, struct napi_struct *napi,
1585 struct iwl_rx_cmd_buffer *rxb, int queue);
1586void iwl_mvm_rx_queue_notif(struct iwl_mvm *mvm, struct napi_struct *napi,
1587 struct iwl_rx_cmd_buffer *rxb, int queue);
1588void iwl_mvm_rx_tx_cmd(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
1589void iwl_mvm_mfu_assert_dump_notif(struct iwl_mvm *mvm,
1590 struct iwl_rx_cmd_buffer *rxb);
1591void iwl_mvm_send_recovery_cmd(struct iwl_mvm *mvm, u32 flags);
1592void iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
1593void iwl_mvm_rx_ant_coupling_notif(struct iwl_mvm *mvm,
1594 struct iwl_rx_cmd_buffer *rxb);
1595void iwl_mvm_rx_fw_error(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
1596void iwl_mvm_rx_card_state_notif(struct iwl_mvm *mvm,
1597 struct iwl_rx_cmd_buffer *rxb);
1598void iwl_mvm_rx_mfuart_notif(struct iwl_mvm *mvm,
1599 struct iwl_rx_cmd_buffer *rxb);
1600void iwl_mvm_rx_shared_mem_cfg_notif(struct iwl_mvm *mvm,
1601 struct iwl_rx_cmd_buffer *rxb);
1602
1603
1604int iwl_mvm_phy_ctxt_add(struct iwl_mvm *mvm, struct iwl_mvm_phy_ctxt *ctxt,
1605 struct cfg80211_chan_def *chandef,
1606 u8 chains_static, u8 chains_dynamic);
1607int iwl_mvm_phy_ctxt_changed(struct iwl_mvm *mvm, struct iwl_mvm_phy_ctxt *ctxt,
1608 struct cfg80211_chan_def *chandef,
1609 u8 chains_static, u8 chains_dynamic);
1610void iwl_mvm_phy_ctxt_ref(struct iwl_mvm *mvm,
1611 struct iwl_mvm_phy_ctxt *ctxt);
1612void iwl_mvm_phy_ctxt_unref(struct iwl_mvm *mvm,
1613 struct iwl_mvm_phy_ctxt *ctxt);
1614int iwl_mvm_phy_ctx_count(struct iwl_mvm *mvm);
1615u8 iwl_mvm_get_channel_width(struct cfg80211_chan_def *chandef);
1616u8 iwl_mvm_get_ctrl_pos(struct cfg80211_chan_def *chandef);
1617
1618
1619int iwl_mvm_mac_ctxt_init(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1620int iwl_mvm_mac_ctxt_add(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1621int iwl_mvm_mac_ctxt_changed(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1622 bool force_assoc_off, const u8 *bssid_override);
1623int iwl_mvm_mac_ctxt_remove(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1624int iwl_mvm_mac_ctxt_beacon_changed(struct iwl_mvm *mvm,
1625 struct ieee80211_vif *vif);
1626int iwl_mvm_mac_ctxt_send_beacon(struct iwl_mvm *mvm,
1627 struct ieee80211_vif *vif,
1628 struct sk_buff *beacon);
1629int iwl_mvm_mac_ctxt_send_beacon_cmd(struct iwl_mvm *mvm,
1630 struct sk_buff *beacon,
1631 void *data, int len);
1632u8 iwl_mvm_mac_ctxt_get_lowest_rate(struct ieee80211_tx_info *info,
1633 struct ieee80211_vif *vif);
1634void iwl_mvm_mac_ctxt_set_tim(struct iwl_mvm *mvm,
1635 __le32 *tim_index, __le32 *tim_size,
1636 u8 *beacon, u32 frame_size);
1637void iwl_mvm_rx_beacon_notif(struct iwl_mvm *mvm,
1638 struct iwl_rx_cmd_buffer *rxb);
1639void iwl_mvm_rx_missed_beacons_notif(struct iwl_mvm *mvm,
1640 struct iwl_rx_cmd_buffer *rxb);
1641void iwl_mvm_rx_stored_beacon_notif(struct iwl_mvm *mvm,
1642 struct iwl_rx_cmd_buffer *rxb);
1643void iwl_mvm_mu_mimo_grp_notif(struct iwl_mvm *mvm,
1644 struct iwl_rx_cmd_buffer *rxb);
1645void iwl_mvm_sta_pm_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
1646void iwl_mvm_window_status_notif(struct iwl_mvm *mvm,
1647 struct iwl_rx_cmd_buffer *rxb);
1648void iwl_mvm_mac_ctxt_recalc_tsf_id(struct iwl_mvm *mvm,
1649 struct ieee80211_vif *vif);
1650void iwl_mvm_probe_resp_data_notif(struct iwl_mvm *mvm,
1651 struct iwl_rx_cmd_buffer *rxb);
1652void iwl_mvm_rx_missed_vap_notif(struct iwl_mvm *mvm,
1653 struct iwl_rx_cmd_buffer *rxb);
1654void iwl_mvm_channel_switch_noa_notif(struct iwl_mvm *mvm,
1655 struct iwl_rx_cmd_buffer *rxb);
1656
1657int iwl_mvm_binding_add_vif(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1658int iwl_mvm_binding_remove_vif(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1659
1660
1661static inline size_t iwl_mvm_quota_cmd_size(struct iwl_mvm *mvm)
1662{
1663 return iwl_mvm_has_quota_low_latency(mvm) ?
1664 sizeof(struct iwl_time_quota_cmd) :
1665 sizeof(struct iwl_time_quota_cmd_v1);
1666}
1667
1668static inline struct iwl_time_quota_data
1669*iwl_mvm_quota_cmd_get_quota(struct iwl_mvm *mvm,
1670 struct iwl_time_quota_cmd *cmd,
1671 int i)
1672{
1673 struct iwl_time_quota_data_v1 *quotas;
1674
1675 if (iwl_mvm_has_quota_low_latency(mvm))
1676 return &cmd->quotas[i];
1677
1678 quotas = (struct iwl_time_quota_data_v1 *)cmd->quotas;
1679 return (struct iwl_time_quota_data *)"as[i];
1680}
1681
1682int iwl_mvm_update_quotas(struct iwl_mvm *mvm, bool force_upload,
1683 struct ieee80211_vif *disabled_vif);
1684
1685
1686int iwl_mvm_reg_scan_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1687 struct cfg80211_scan_request *req,
1688 struct ieee80211_scan_ies *ies);
1689int iwl_mvm_scan_size(struct iwl_mvm *mvm);
1690int iwl_mvm_scan_stop(struct iwl_mvm *mvm, int type, bool notify);
1691int iwl_mvm_max_scan_ie_len(struct iwl_mvm *mvm);
1692void iwl_mvm_report_scan_aborted(struct iwl_mvm *mvm);
1693void iwl_mvm_scan_timeout_wk(struct work_struct *work);
1694
1695
1696void iwl_mvm_rx_lmac_scan_complete_notif(struct iwl_mvm *mvm,
1697 struct iwl_rx_cmd_buffer *rxb);
1698void iwl_mvm_rx_lmac_scan_iter_complete_notif(struct iwl_mvm *mvm,
1699 struct iwl_rx_cmd_buffer *rxb);
1700int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm,
1701 struct ieee80211_vif *vif,
1702 struct cfg80211_sched_scan_request *req,
1703 struct ieee80211_scan_ies *ies,
1704 int type);
1705void iwl_mvm_rx_scan_match_found(struct iwl_mvm *mvm,
1706 struct iwl_rx_cmd_buffer *rxb);
1707
1708
1709int iwl_mvm_config_scan(struct iwl_mvm *mvm);
1710void iwl_mvm_rx_umac_scan_complete_notif(struct iwl_mvm *mvm,
1711 struct iwl_rx_cmd_buffer *rxb);
1712void iwl_mvm_rx_umac_scan_iter_complete_notif(struct iwl_mvm *mvm,
1713 struct iwl_rx_cmd_buffer *rxb);
1714
1715
1716#ifdef CONFIG_IWLWIFI_DEBUGFS
1717void iwl_mvm_dbgfs_register(struct iwl_mvm *mvm);
1718void iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1719void iwl_mvm_vif_dbgfs_clean(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1720#else
1721static inline void iwl_mvm_dbgfs_register(struct iwl_mvm *mvm)
1722{
1723}
1724static inline void
1725iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
1726{
1727}
1728static inline void
1729iwl_mvm_vif_dbgfs_clean(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
1730{
1731}
1732#endif
1733
1734
1735int iwl_mvm_send_lq_cmd(struct iwl_mvm *mvm, struct iwl_lq_cmd *lq);
1736void iwl_mvm_update_frame_stats(struct iwl_mvm *mvm, u32 rate, bool agg);
1737int rs_pretty_print_rate(char *buf, int bufsz, const u32 rate);
1738void rs_update_last_rssi(struct iwl_mvm *mvm,
1739 struct iwl_mvm_sta *mvmsta,
1740 struct ieee80211_rx_status *rx_status);
1741
1742
1743int iwl_mvm_power_update_device(struct iwl_mvm *mvm);
1744int iwl_mvm_power_update_mac(struct iwl_mvm *mvm);
1745int iwl_mvm_power_update_ps(struct iwl_mvm *mvm);
1746int iwl_mvm_power_mac_dbgfs_read(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1747 char *buf, int bufsz);
1748
1749void iwl_mvm_power_vif_assoc(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1750void iwl_mvm_power_uapsd_misbehaving_ap_notif(struct iwl_mvm *mvm,
1751 struct iwl_rx_cmd_buffer *rxb);
1752
1753#ifdef CONFIG_IWLWIFI_LEDS
1754int iwl_mvm_leds_init(struct iwl_mvm *mvm);
1755void iwl_mvm_leds_exit(struct iwl_mvm *mvm);
1756void iwl_mvm_leds_sync(struct iwl_mvm *mvm);
1757#else
1758static inline int iwl_mvm_leds_init(struct iwl_mvm *mvm)
1759{
1760 return 0;
1761}
1762static inline void iwl_mvm_leds_exit(struct iwl_mvm *mvm)
1763{
1764}
1765static inline void iwl_mvm_leds_sync(struct iwl_mvm *mvm)
1766{
1767}
1768#endif
1769
1770
1771int iwl_mvm_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan);
1772int iwl_mvm_resume(struct ieee80211_hw *hw);
1773void iwl_mvm_set_wakeup(struct ieee80211_hw *hw, bool enabled);
1774void iwl_mvm_set_rekey_data(struct ieee80211_hw *hw,
1775 struct ieee80211_vif *vif,
1776 struct cfg80211_gtk_rekey_data *data);
1777void iwl_mvm_ipv6_addr_change(struct ieee80211_hw *hw,
1778 struct ieee80211_vif *vif,
1779 struct inet6_dev *idev);
1780void iwl_mvm_set_default_unicast_key(struct ieee80211_hw *hw,
1781 struct ieee80211_vif *vif, int idx);
1782extern const struct file_operations iwl_dbgfs_d3_test_ops;
1783#ifdef CONFIG_PM
1784void iwl_mvm_set_last_nonqos_seq(struct iwl_mvm *mvm,
1785 struct ieee80211_vif *vif);
1786#else
1787static inline void
1788iwl_mvm_set_last_nonqos_seq(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
1789{
1790}
1791#endif
1792void iwl_mvm_set_wowlan_qos_seq(struct iwl_mvm_sta *mvm_ap_sta,
1793 struct iwl_wowlan_config_cmd *cmd);
1794int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
1795 struct ieee80211_vif *vif,
1796 bool disable_offloading,
1797 bool offload_ns,
1798 u32 cmd_flags);
1799
1800
1801int iwl_mvm_send_bt_init_conf(struct iwl_mvm *mvm);
1802void iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm,
1803 struct iwl_rx_cmd_buffer *rxb);
1804void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1805 enum ieee80211_rssi_event_data);
1806void iwl_mvm_bt_coex_vif_change(struct iwl_mvm *mvm);
1807u16 iwl_mvm_coex_agg_time_limit(struct iwl_mvm *mvm,
1808 struct ieee80211_sta *sta);
1809bool iwl_mvm_bt_coex_is_mimo_allowed(struct iwl_mvm *mvm,
1810 struct ieee80211_sta *sta);
1811bool iwl_mvm_bt_coex_is_ant_avail(struct iwl_mvm *mvm, u8 ant);
1812bool iwl_mvm_bt_coex_is_shared_ant_avail(struct iwl_mvm *mvm);
1813bool iwl_mvm_bt_coex_is_tpc_allowed(struct iwl_mvm *mvm,
1814 enum nl80211_band band);
1815u8 iwl_mvm_bt_coex_get_single_ant_msk(struct iwl_mvm *mvm, u8 enabled_ants);
1816u8 iwl_mvm_bt_coex_tx_prio(struct iwl_mvm *mvm, struct ieee80211_hdr *hdr,
1817 struct ieee80211_tx_info *info, u8 ac);
1818
1819
1820#ifdef CONFIG_IWLWIFI_DEBUGFS
1821void
1822iwl_mvm_beacon_filter_debugfs_parameters(struct ieee80211_vif *vif,
1823 struct iwl_beacon_filter_cmd *cmd);
1824#else
1825static inline void
1826iwl_mvm_beacon_filter_debugfs_parameters(struct ieee80211_vif *vif,
1827 struct iwl_beacon_filter_cmd *cmd)
1828{}
1829#endif
1830int iwl_mvm_enable_beacon_filter(struct iwl_mvm *mvm,
1831 struct ieee80211_vif *vif,
1832 u32 flags);
1833int iwl_mvm_disable_beacon_filter(struct iwl_mvm *mvm,
1834 struct ieee80211_vif *vif,
1835 u32 flags);
1836
1837void iwl_mvm_update_smps(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1838 enum iwl_mvm_smps_type_request req_type,
1839 enum ieee80211_smps_mode smps_request);
1840bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm,
1841 struct iwl_mvm_phy_ctxt *ctxt);
1842void iwl_mvm_apply_fw_smps_request(struct ieee80211_vif *vif);
1843
1844
1845int iwl_mvm_update_low_latency(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1846 bool low_latency,
1847 enum iwl_mvm_low_latency_cause cause);
1848
1849bool iwl_mvm_low_latency(struct iwl_mvm *mvm);
1850bool iwl_mvm_low_latency_band(struct iwl_mvm *mvm, enum nl80211_band band);
1851void iwl_mvm_send_low_latency_cmd(struct iwl_mvm *mvm, bool low_latency,
1852 u16 mac_id);
1853
1854
1855static inline bool iwl_mvm_vif_low_latency(struct iwl_mvm_vif *mvmvif)
1856{
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867 return mvmvif->low_latency_actual;
1868}
1869
1870static inline
1871void iwl_mvm_vif_set_low_latency(struct iwl_mvm_vif *mvmvif, bool set,
1872 enum iwl_mvm_low_latency_cause cause)
1873{
1874 u8 new_state;
1875
1876 if (set)
1877 mvmvif->low_latency |= cause;
1878 else
1879 mvmvif->low_latency &= ~cause;
1880
1881
1882
1883
1884
1885 if (mvmvif->low_latency & LOW_LATENCY_DEBUGFS_FORCE_ENABLE &&
1886 cause != LOW_LATENCY_DEBUGFS_FORCE_ENABLE)
1887 return;
1888
1889 if (cause == LOW_LATENCY_DEBUGFS_FORCE_ENABLE && set)
1890
1891
1892
1893 new_state = !!(mvmvif->low_latency &
1894 LOW_LATENCY_DEBUGFS_FORCE);
1895 else
1896
1897
1898
1899 new_state = !!(mvmvif->low_latency &
1900 ~(LOW_LATENCY_DEBUGFS_FORCE_ENABLE |
1901 LOW_LATENCY_DEBUGFS_FORCE));
1902
1903 mvmvif->low_latency_actual = new_state;
1904}
1905
1906
1907
1908
1909static inline u32 iwl_mvm_flushable_queues(struct iwl_mvm *mvm)
1910{
1911 return ((BIT(mvm->trans->trans_cfg->base_params->num_of_queues) - 1) &
1912 ~BIT(IWL_MVM_DQA_CMD_QUEUE));
1913}
1914
1915void iwl_mvm_stop_device(struct iwl_mvm *mvm);
1916
1917
1918int iwl_mvm_reconfig_scd(struct iwl_mvm *mvm, int queue, int fifo, int sta_id,
1919 int tid, int frame_limit, u16 ssn);
1920
1921
1922void iwl_mvm_tt_tx_backoff(struct iwl_mvm *mvm, u32 backoff);
1923void iwl_mvm_temp_notif(struct iwl_mvm *mvm,
1924 struct iwl_rx_cmd_buffer *rxb);
1925void iwl_mvm_tt_handler(struct iwl_mvm *mvm);
1926void iwl_mvm_thermal_initialize(struct iwl_mvm *mvm, u32 min_backoff);
1927void iwl_mvm_thermal_exit(struct iwl_mvm *mvm);
1928void iwl_mvm_set_hw_ctkill_state(struct iwl_mvm *mvm, bool state);
1929int iwl_mvm_get_temp(struct iwl_mvm *mvm, s32 *temp);
1930void iwl_mvm_ct_kill_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
1931void iwl_mvm_enter_ctkill(struct iwl_mvm *mvm);
1932int iwl_mvm_send_temp_report_ths_cmd(struct iwl_mvm *mvm);
1933int iwl_mvm_ctdp_command(struct iwl_mvm *mvm, u32 op, u32 budget);
1934
1935
1936struct iwl_mcc_update_resp *
1937iwl_mvm_update_mcc(struct iwl_mvm *mvm, const char *alpha2,
1938 enum iwl_mcc_source src_id);
1939int iwl_mvm_init_mcc(struct iwl_mvm *mvm);
1940void iwl_mvm_rx_chub_update_mcc(struct iwl_mvm *mvm,
1941 struct iwl_rx_cmd_buffer *rxb);
1942struct ieee80211_regdomain *iwl_mvm_get_regdomain(struct wiphy *wiphy,
1943 const char *alpha2,
1944 enum iwl_mcc_source src_id,
1945 bool *changed);
1946struct ieee80211_regdomain *iwl_mvm_get_current_regdomain(struct iwl_mvm *mvm,
1947 bool *changed);
1948int iwl_mvm_init_fw_regd(struct iwl_mvm *mvm);
1949void iwl_mvm_update_changed_regdom(struct iwl_mvm *mvm);
1950
1951
1952int iwl_mvm_sf_update(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1953 bool added_vif);
1954
1955
1956int iwl_mvm_ftm_start_responder(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1957void iwl_mvm_ftm_restart_responder(struct iwl_mvm *mvm,
1958 struct ieee80211_vif *vif);
1959void iwl_mvm_ftm_responder_stats(struct iwl_mvm *mvm,
1960 struct iwl_rx_cmd_buffer *rxb);
1961int iwl_mvm_ftm_resp_remove_pasn_sta(struct iwl_mvm *mvm,
1962 struct ieee80211_vif *vif, u8 *addr);
1963int iwl_mvm_ftm_respoder_add_pasn_sta(struct iwl_mvm *mvm,
1964 struct ieee80211_vif *vif,
1965 u8 *addr, u32 cipher, u8 *tk, u32 tk_len,
1966 u8 *hltk, u32 hltk_len);
1967void iwl_mvm_ftm_responder_clear(struct iwl_mvm *mvm,
1968 struct ieee80211_vif *vif);
1969
1970
1971void iwl_mvm_ftm_restart(struct iwl_mvm *mvm);
1972void iwl_mvm_ftm_range_resp(struct iwl_mvm *mvm,
1973 struct iwl_rx_cmd_buffer *rxb);
1974void iwl_mvm_ftm_lc_notif(struct iwl_mvm *mvm,
1975 struct iwl_rx_cmd_buffer *rxb);
1976int iwl_mvm_ftm_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1977 struct cfg80211_pmsr_request *request);
1978void iwl_mvm_ftm_abort(struct iwl_mvm *mvm, struct cfg80211_pmsr_request *req);
1979void iwl_mvm_ftm_initiator_smooth_config(struct iwl_mvm *mvm);
1980void iwl_mvm_ftm_initiator_smooth_stop(struct iwl_mvm *mvm);
1981int iwl_mvm_ftm_add_pasn_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1982 u8 *addr, u32 cipher, u8 *tk, u32 tk_len,
1983 u8 *hltk, u32 hltk_len);
1984void iwl_mvm_ftm_remove_pasn_sta(struct iwl_mvm *mvm, u8 *addr);
1985
1986
1987
1988
1989
1990
1991
1992#define IWL_MVM_TDLS_FW_TID 4
1993
1994int iwl_mvm_tdls_sta_count(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1995void iwl_mvm_teardown_tdls_peers(struct iwl_mvm *mvm);
1996void iwl_mvm_recalc_tdls_state(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1997 bool sta_added);
1998void iwl_mvm_mac_mgd_protect_tdls_discover(struct ieee80211_hw *hw,
1999 struct ieee80211_vif *vif);
2000int iwl_mvm_tdls_channel_switch(struct ieee80211_hw *hw,
2001 struct ieee80211_vif *vif,
2002 struct ieee80211_sta *sta, u8 oper_class,
2003 struct cfg80211_chan_def *chandef,
2004 struct sk_buff *tmpl_skb, u32 ch_sw_tm_ie);
2005void iwl_mvm_tdls_recv_channel_switch(struct ieee80211_hw *hw,
2006 struct ieee80211_vif *vif,
2007 struct ieee80211_tdls_ch_sw_params *params);
2008void iwl_mvm_tdls_cancel_channel_switch(struct ieee80211_hw *hw,
2009 struct ieee80211_vif *vif,
2010 struct ieee80211_sta *sta);
2011void iwl_mvm_rx_tdls_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
2012void iwl_mvm_tdls_ch_switch_work(struct work_struct *work);
2013
2014void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm,
2015 enum iwl_mvm_rxq_notif_type type,
2016 bool sync,
2017 const void *data, u32 size);
2018void iwl_mvm_reorder_timer_expired(struct timer_list *t);
2019struct ieee80211_vif *iwl_mvm_get_bss_vif(struct iwl_mvm *mvm);
2020struct ieee80211_vif *iwl_mvm_get_vif_by_macid(struct iwl_mvm *mvm, u32 macid);
2021bool iwl_mvm_is_vif_assoc(struct iwl_mvm *mvm);
2022
2023#define MVM_TCM_PERIOD_MSEC 500
2024#define MVM_TCM_PERIOD (HZ * MVM_TCM_PERIOD_MSEC / 1000)
2025#define MVM_LL_PERIOD (10 * HZ)
2026void iwl_mvm_tcm_work(struct work_struct *work);
2027void iwl_mvm_recalc_tcm(struct iwl_mvm *mvm);
2028void iwl_mvm_pause_tcm(struct iwl_mvm *mvm, bool with_cancel);
2029void iwl_mvm_resume_tcm(struct iwl_mvm *mvm);
2030void iwl_mvm_tcm_add_vif(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
2031void iwl_mvm_tcm_rm_vif(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
2032u8 iwl_mvm_tcm_load_percentage(u32 airtime, u32 elapsed);
2033
2034void iwl_mvm_nic_restart(struct iwl_mvm *mvm, bool fw_error);
2035unsigned int iwl_mvm_get_wd_timeout(struct iwl_mvm *mvm,
2036 struct ieee80211_vif *vif,
2037 bool tdls, bool cmd_q);
2038void iwl_mvm_connection_loss(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
2039 const char *errmsg);
2040void iwl_mvm_event_frame_timeout_callback(struct iwl_mvm *mvm,
2041 struct ieee80211_vif *vif,
2042 const struct ieee80211_sta *sta,
2043 u16 tid);
2044
2045int iwl_mvm_sar_select_profile(struct iwl_mvm *mvm, int prof_a, int prof_b);
2046int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm);
2047int iwl_mvm_ppag_send_cmd(struct iwl_mvm *mvm);
2048#ifdef CONFIG_IWLWIFI_DEBUGFS
2049void iwl_mvm_sta_add_debugfs(struct ieee80211_hw *hw,
2050 struct ieee80211_vif *vif,
2051 struct ieee80211_sta *sta,
2052 struct dentry *dir);
2053#endif
2054
2055int iwl_rfi_send_config_cmd(struct iwl_mvm *mvm,
2056 struct iwl_rfi_lut_entry *rfi_table);
2057struct iwl_rfi_freq_table_resp_cmd *iwl_rfi_get_freq_table(struct iwl_mvm *mvm);
2058
2059static inline u8 iwl_mvm_phy_band_from_nl80211(enum nl80211_band band)
2060{
2061 switch (band) {
2062 case NL80211_BAND_2GHZ:
2063 return PHY_BAND_24;
2064 case NL80211_BAND_5GHZ:
2065 return PHY_BAND_5;
2066 case NL80211_BAND_6GHZ:
2067 return PHY_BAND_6;
2068 default:
2069 WARN_ONCE(1, "Unsupported band (%u)\n", band);
2070 return PHY_BAND_5;
2071 }
2072}
2073
2074
2075static inline bool iwl_mvm_has_ultra_hb_channel(struct iwl_mvm *mvm)
2076{
2077 return fw_has_capa(&mvm->fw->ucode_capa,
2078 IWL_UCODE_TLV_CAPA_ULTRA_HB_CHANNELS);
2079}
2080
2081static inline void *iwl_mvm_chan_info_cmd_tail(struct iwl_mvm *mvm,
2082 struct iwl_fw_channel_info *ci)
2083{
2084 return (u8 *)ci + (iwl_mvm_has_ultra_hb_channel(mvm) ?
2085 sizeof(struct iwl_fw_channel_info) :
2086 sizeof(struct iwl_fw_channel_info_v1));
2087}
2088
2089static inline size_t iwl_mvm_chan_info_padding(struct iwl_mvm *mvm)
2090{
2091 return iwl_mvm_has_ultra_hb_channel(mvm) ? 0 :
2092 sizeof(struct iwl_fw_channel_info) -
2093 sizeof(struct iwl_fw_channel_info_v1);
2094}
2095
2096static inline void iwl_mvm_set_chan_info(struct iwl_mvm *mvm,
2097 struct iwl_fw_channel_info *ci,
2098 u32 chan, u8 band, u8 width,
2099 u8 ctrl_pos)
2100{
2101 if (iwl_mvm_has_ultra_hb_channel(mvm)) {
2102 ci->channel = cpu_to_le32(chan);
2103 ci->band = band;
2104 ci->width = width;
2105 ci->ctrl_pos = ctrl_pos;
2106 } else {
2107 struct iwl_fw_channel_info_v1 *ci_v1 =
2108 (struct iwl_fw_channel_info_v1 *)ci;
2109
2110 ci_v1->channel = chan;
2111 ci_v1->band = band;
2112 ci_v1->width = width;
2113 ci_v1->ctrl_pos = ctrl_pos;
2114 }
2115}
2116
2117static inline void
2118iwl_mvm_set_chan_info_chandef(struct iwl_mvm *mvm,
2119 struct iwl_fw_channel_info *ci,
2120 struct cfg80211_chan_def *chandef)
2121{
2122 enum nl80211_band band = chandef->chan->band;
2123
2124 iwl_mvm_set_chan_info(mvm, ci, chandef->chan->hw_value,
2125 iwl_mvm_phy_band_from_nl80211(band),
2126 iwl_mvm_get_channel_width(chandef),
2127 iwl_mvm_get_ctrl_pos(chandef));
2128}
2129
2130static inline int iwl_umac_scan_get_max_profiles(const struct iwl_fw *fw)
2131{
2132 u8 ver = iwl_fw_lookup_cmd_ver(fw, IWL_ALWAYS_LONG_GROUP,
2133 SCAN_OFFLOAD_UPDATE_PROFILES_CMD,
2134 IWL_FW_CMD_VER_UNKNOWN);
2135 return (ver == IWL_FW_CMD_VER_UNKNOWN || ver < 3) ?
2136 IWL_SCAN_MAX_PROFILES : IWL_SCAN_MAX_PROFILES_V2;
2137}
2138
2139static inline
2140enum iwl_location_cipher iwl_mvm_cipher_to_location_cipher(u32 cipher)
2141{
2142 switch (cipher) {
2143 case WLAN_CIPHER_SUITE_CCMP:
2144 return IWL_LOCATION_CIPHER_CCMP_128;
2145 case WLAN_CIPHER_SUITE_GCMP:
2146 return IWL_LOCATION_CIPHER_GCMP_128;
2147 case WLAN_CIPHER_SUITE_GCMP_256:
2148 return IWL_LOCATION_CIPHER_GCMP_256;
2149 default:
2150 return IWL_LOCATION_CIPHER_INVALID;
2151 }
2152}
2153#endif
2154