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