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
66
67
68#ifndef __IWL_MVM_H__
69#define __IWL_MVM_H__
70
71#include <linux/list.h>
72#include <linux/spinlock.h>
73#include <linux/leds.h>
74#include <linux/in6.h>
75
76#ifdef CONFIG_THERMAL
77#include <linux/thermal.h>
78#endif
79
80#include "iwl-op-mode.h"
81#include "iwl-trans.h"
82#include "fw/notif-wait.h"
83#include "iwl-eeprom-parse.h"
84#include "fw/file.h"
85#include "iwl-config.h"
86#include "sta.h"
87#include "fw-api.h"
88#include "constants.h"
89#include "tof.h"
90#include "fw/runtime.h"
91#include "fw/dbg.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
98#define MSEC_TO_TU(_msec) (_msec*1000/1024)
99
100
101
102
103
104#define IWL_MVM_CHANNEL_SWITCH_TIME_GO 40
105
106
107
108
109
110#define IWL_MVM_CHANNEL_SWITCH_TIME_CLIENT 10
111
112
113
114
115
116#define IWL_MVM_CHANNEL_SWITCH_MARGIN 4
117
118
119
120
121
122#define IWL_MVM_CS_UNBLOCK_TX_TIMEOUT 3
123
124
125#define IWL_MVM_OFFCHANNEL_QUEUE 0
126
127extern const struct ieee80211_ops iwl_mvm_hw_ops;
128
129
130
131
132
133
134
135
136
137
138struct iwl_mvm_mod_params {
139 bool init_dbg;
140 bool tfd_q_hang_detect;
141 int power_scheme;
142};
143extern struct iwl_mvm_mod_params iwlmvm_mod_params;
144
145struct iwl_mvm_phy_ctxt {
146 u16 id;
147 u16 color;
148 u32 ref;
149
150
151
152
153
154 struct ieee80211_channel *channel;
155};
156
157struct iwl_mvm_time_event_data {
158 struct ieee80211_vif *vif;
159 struct list_head list;
160 unsigned long end_jiffies;
161 u32 duration;
162 bool running;
163 u32 uid;
164
165
166
167
168
169
170 u32 id;
171};
172
173
174
175
176
177
178
179
180
181enum iwl_power_scheme {
182 IWL_POWER_SCHEME_CAM = 1,
183 IWL_POWER_SCHEME_BPS,
184 IWL_POWER_SCHEME_LP
185};
186
187#define IWL_CONN_MAX_LISTEN_INTERVAL 10
188#define IWL_UAPSD_MAX_SP IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL
189
190#ifdef CONFIG_IWLWIFI_DEBUGFS
191enum iwl_dbgfs_pm_mask {
192 MVM_DEBUGFS_PM_KEEP_ALIVE = BIT(0),
193 MVM_DEBUGFS_PM_SKIP_OVER_DTIM = BIT(1),
194 MVM_DEBUGFS_PM_SKIP_DTIM_PERIODS = BIT(2),
195 MVM_DEBUGFS_PM_RX_DATA_TIMEOUT = BIT(3),
196 MVM_DEBUGFS_PM_TX_DATA_TIMEOUT = BIT(4),
197 MVM_DEBUGFS_PM_LPRX_ENA = BIT(6),
198 MVM_DEBUGFS_PM_LPRX_RSSI_THRESHOLD = BIT(7),
199 MVM_DEBUGFS_PM_SNOOZE_ENABLE = BIT(8),
200 MVM_DEBUGFS_PM_UAPSD_MISBEHAVING = BIT(9),
201 MVM_DEBUGFS_PM_USE_PS_POLL = BIT(10),
202};
203
204struct iwl_dbgfs_pm {
205 u16 keep_alive_seconds;
206 u32 rx_data_timeout;
207 u32 tx_data_timeout;
208 bool skip_over_dtim;
209 u8 skip_dtim_periods;
210 bool lprx_ena;
211 u32 lprx_rssi_threshold;
212 bool snooze_ena;
213 bool uapsd_misbehaving;
214 bool use_ps_poll;
215 int mask;
216};
217
218
219
220enum iwl_dbgfs_bf_mask {
221 MVM_DEBUGFS_BF_ENERGY_DELTA = BIT(0),
222 MVM_DEBUGFS_BF_ROAMING_ENERGY_DELTA = BIT(1),
223 MVM_DEBUGFS_BF_ROAMING_STATE = BIT(2),
224 MVM_DEBUGFS_BF_TEMP_THRESHOLD = BIT(3),
225 MVM_DEBUGFS_BF_TEMP_FAST_FILTER = BIT(4),
226 MVM_DEBUGFS_BF_TEMP_SLOW_FILTER = BIT(5),
227 MVM_DEBUGFS_BF_ENABLE_BEACON_FILTER = BIT(6),
228 MVM_DEBUGFS_BF_DEBUG_FLAG = BIT(7),
229 MVM_DEBUGFS_BF_ESCAPE_TIMER = BIT(8),
230 MVM_DEBUGFS_BA_ESCAPE_TIMER = BIT(9),
231 MVM_DEBUGFS_BA_ENABLE_BEACON_ABORT = BIT(10),
232};
233
234struct iwl_dbgfs_bf {
235 u32 bf_energy_delta;
236 u32 bf_roaming_energy_delta;
237 u32 bf_roaming_state;
238 u32 bf_temp_threshold;
239 u32 bf_temp_fast_filter;
240 u32 bf_temp_slow_filter;
241 u32 bf_enable_beacon_filter;
242 u32 bf_debug_flag;
243 u32 bf_escape_timer;
244 u32 ba_escape_timer;
245 u32 ba_enable_beacon_abort;
246 int mask;
247};
248#endif
249
250enum iwl_mvm_smps_type_request {
251 IWL_MVM_SMPS_REQ_BT_COEX,
252 IWL_MVM_SMPS_REQ_TT,
253 IWL_MVM_SMPS_REQ_PROT,
254 NUM_IWL_MVM_SMPS_REQ,
255};
256
257enum iwl_mvm_ref_type {
258 IWL_MVM_REF_UCODE_DOWN,
259 IWL_MVM_REF_SCAN,
260 IWL_MVM_REF_ROC,
261 IWL_MVM_REF_ROC_AUX,
262 IWL_MVM_REF_P2P_CLIENT,
263 IWL_MVM_REF_AP_IBSS,
264 IWL_MVM_REF_USER,
265 IWL_MVM_REF_TX,
266 IWL_MVM_REF_TX_AGG,
267 IWL_MVM_REF_ADD_IF,
268 IWL_MVM_REF_START_AP,
269 IWL_MVM_REF_BSS_CHANGED,
270 IWL_MVM_REF_PREPARE_TX,
271 IWL_MVM_REF_PROTECT_TDLS,
272 IWL_MVM_REF_CHECK_CTKILL,
273 IWL_MVM_REF_PRPH_READ,
274 IWL_MVM_REF_PRPH_WRITE,
275 IWL_MVM_REF_NMI,
276 IWL_MVM_REF_TM_CMD,
277 IWL_MVM_REF_EXIT_WORK,
278 IWL_MVM_REF_PROTECT_CSA,
279 IWL_MVM_REF_FW_DBG_COLLECT,
280 IWL_MVM_REF_INIT_UCODE,
281 IWL_MVM_REF_SENDING_CMD,
282 IWL_MVM_REF_RX,
283
284
285
286 IWL_MVM_REF_COUNT,
287};
288
289enum iwl_bt_force_ant_mode {
290 BT_FORCE_ANT_DIS = 0,
291 BT_FORCE_ANT_AUTO,
292 BT_FORCE_ANT_BT,
293 BT_FORCE_ANT_WIFI,
294
295 BT_FORCE_ANT_MAX,
296};
297
298
299
300
301
302
303
304
305
306
307
308struct iwl_mvm_vif_bf_data {
309 bool bf_enabled;
310 bool ba_enabled;
311 int ave_beacon_signal;
312 int last_cqm_event;
313 int bt_coex_min_thold;
314 int bt_coex_max_thold;
315 int last_bt_coex_event;
316};
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350struct iwl_mvm_vif {
351 struct iwl_mvm *mvm;
352 u16 id;
353 u16 color;
354 u8 ap_sta_id;
355
356 u8 bssid[ETH_ALEN];
357 bool associated;
358 u8 ap_assoc_sta_count;
359
360 u16 cab_queue;
361
362 bool uploaded;
363 bool ap_ibss_active;
364 bool pm_enabled;
365 bool monitor_active;
366 bool low_latency_traffic, low_latency_dbgfs, low_latency_vcmd;
367 bool ps_disabled;
368 struct iwl_mvm_vif_bf_data bf_data;
369
370 struct {
371 u32 num_beacons, accu_num_beacons;
372 u8 avg_signal;
373 } beacon_stats;
374
375 u32 ap_beacon_time;
376
377 enum iwl_tsf_id tsf_id;
378
379
380
381
382
383
384 struct ieee80211_tx_queue_params queue_params[IEEE80211_NUM_ACS];
385 struct iwl_mvm_time_event_data time_event_data;
386 struct iwl_mvm_time_event_data hs_time_event_data;
387
388 struct iwl_mvm_int_sta bcast_sta;
389 struct iwl_mvm_int_sta mcast_sta;
390
391
392
393
394
395 struct iwl_mvm_phy_ctxt *phy_ctxt;
396
397#ifdef CONFIG_PM
398
399 struct {
400 u8 kck[NL80211_KCK_LEN], kek[NL80211_KEK_LEN];
401 __le64 replay_ctr;
402 bool valid;
403 } rekey_data;
404
405 int tx_key_idx;
406
407 bool seqno_valid;
408 u16 seqno;
409#endif
410
411#if IS_ENABLED(CONFIG_IPV6)
412
413 struct in6_addr target_ipv6_addrs[IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_MAX];
414 unsigned long tentative_addrs[BITS_TO_LONGS(IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_MAX)];
415 int num_target_ipv6_addrs;
416#endif
417
418#ifdef CONFIG_IWLWIFI_DEBUGFS
419 struct dentry *dbgfs_dir;
420 struct dentry *dbgfs_slink;
421 struct iwl_dbgfs_pm dbgfs_pm;
422 struct iwl_dbgfs_bf dbgfs_bf;
423 struct iwl_mac_power_cmd mac_pwr_cmd;
424 int dbgfs_quota_min;
425#endif
426
427 enum ieee80211_smps_mode smps_requests[NUM_IWL_MVM_SMPS_REQ];
428
429
430 u8 uapsd_misbehaving_bssid[ETH_ALEN];
431
432
433 bool csa_countdown;
434 bool csa_failed;
435 u16 csa_target_freq;
436
437
438 netdev_features_t features;
439
440
441
442
443
444 bool lqm_active;
445};
446
447static inline struct iwl_mvm_vif *
448iwl_mvm_vif_from_mac80211(struct ieee80211_vif *vif)
449{
450 if (!vif)
451 return NULL;
452 return (void *)vif->drv_priv;
453}
454
455extern const u8 tid_to_mac80211_ac[];
456
457#define IWL_MVM_SCAN_STOPPING_SHIFT 8
458
459enum iwl_scan_status {
460 IWL_MVM_SCAN_REGULAR = BIT(0),
461 IWL_MVM_SCAN_SCHED = BIT(1),
462 IWL_MVM_SCAN_NETDETECT = BIT(2),
463
464 IWL_MVM_SCAN_STOPPING_REGULAR = BIT(8),
465 IWL_MVM_SCAN_STOPPING_SCHED = BIT(9),
466 IWL_MVM_SCAN_STOPPING_NETDETECT = BIT(10),
467
468 IWL_MVM_SCAN_REGULAR_MASK = IWL_MVM_SCAN_REGULAR |
469 IWL_MVM_SCAN_STOPPING_REGULAR,
470 IWL_MVM_SCAN_SCHED_MASK = IWL_MVM_SCAN_SCHED |
471 IWL_MVM_SCAN_STOPPING_SCHED,
472 IWL_MVM_SCAN_NETDETECT_MASK = IWL_MVM_SCAN_NETDETECT |
473 IWL_MVM_SCAN_STOPPING_NETDETECT,
474
475 IWL_MVM_SCAN_STOPPING_MASK = 0xff << IWL_MVM_SCAN_STOPPING_SHIFT,
476 IWL_MVM_SCAN_MASK = 0xff,
477};
478
479enum iwl_mvm_scan_type {
480 IWL_SCAN_TYPE_NOT_SET,
481 IWL_SCAN_TYPE_UNASSOC,
482 IWL_SCAN_TYPE_WILD,
483 IWL_SCAN_TYPE_MILD,
484 IWL_SCAN_TYPE_FRAGMENTED,
485};
486
487enum iwl_mvm_sched_scan_pass_all_states {
488 SCHED_SCAN_PASS_ALL_DISABLED,
489 SCHED_SCAN_PASS_ALL_ENABLED,
490 SCHED_SCAN_PASS_ALL_FOUND,
491};
492
493
494
495
496
497
498
499
500struct iwl_nvm_section {
501 u16 length;
502 const u8 *data;
503};
504
505
506
507
508
509
510
511
512
513
514struct iwl_mvm_tt_mgmt {
515 struct delayed_work ct_kill_exit;
516 bool dynamic_smps;
517 u32 tx_backoff;
518 u32 min_backoff;
519 struct iwl_tt_params params;
520 bool throttle;
521};
522
523#ifdef CONFIG_THERMAL
524
525
526
527
528
529
530struct iwl_mvm_thermal_device {
531 s16 temp_trips[IWL_MAX_DTS_TRIPS];
532 u8 fw_trips_index[IWL_MAX_DTS_TRIPS];
533 struct thermal_zone_device *tzone;
534};
535
536
537
538
539
540
541struct iwl_mvm_cooling_device {
542 u32 cur_state;
543 struct thermal_cooling_device *cdev;
544};
545#endif
546
547#define IWL_MVM_NUM_LAST_FRAMES_UCODE_RATES 8
548
549struct iwl_mvm_frame_stats {
550 u32 legacy_frames;
551 u32 ht_frames;
552 u32 vht_frames;
553 u32 bw_20_frames;
554 u32 bw_40_frames;
555 u32 bw_80_frames;
556 u32 bw_160_frames;
557 u32 sgi_frames;
558 u32 ngi_frames;
559 u32 siso_frames;
560 u32 mimo2_frames;
561 u32 agg_frames;
562 u32 ampdu_count;
563 u32 success_frames;
564 u32 fail_frames;
565 u32 last_rates[IWL_MVM_NUM_LAST_FRAMES_UCODE_RATES];
566 int last_frame_idx;
567};
568
569enum {
570 D0I3_DEFER_WAKEUP,
571 D0I3_PENDING_WAKEUP,
572};
573
574#define IWL_MVM_DEBUG_SET_TEMPERATURE_DISABLE 0xff
575#define IWL_MVM_DEBUG_SET_TEMPERATURE_MIN -100
576#define IWL_MVM_DEBUG_SET_TEMPERATURE_MAX 200
577
578enum iwl_mvm_tdls_cs_state {
579 IWL_MVM_TDLS_SW_IDLE = 0,
580 IWL_MVM_TDLS_SW_REQ_SENT,
581 IWL_MVM_TDLS_SW_RESP_RCVD,
582 IWL_MVM_TDLS_SW_REQ_RCVD,
583 IWL_MVM_TDLS_SW_ACTIVE,
584};
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604struct iwl_mvm_reorder_buffer {
605 u16 head_sn;
606 u16 num_stored;
607 u8 buf_size;
608 u8 sta_id;
609 int queue;
610 u16 last_amsdu;
611 u8 last_sub_index;
612 struct sk_buff_head entries[IEEE80211_MAX_AMPDU_BUF];
613 unsigned long reorder_time[IEEE80211_MAX_AMPDU_BUF];
614 struct timer_list reorder_timer;
615 bool removed;
616 bool valid;
617 spinlock_t lock;
618 struct iwl_mvm *mvm;
619} ____cacheline_aligned_in_smp;
620
621
622
623
624
625
626
627
628
629
630
631
632struct iwl_mvm_baid_data {
633 struct rcu_head rcu_head;
634 u8 sta_id;
635 u8 tid;
636 u8 baid;
637 u16 timeout;
638 unsigned long last_rx;
639 struct timer_list session_timer;
640 struct iwl_mvm *mvm;
641 struct iwl_mvm_reorder_buffer reorder_buf[];
642};
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674enum iwl_mvm_queue_status {
675 IWL_MVM_QUEUE_FREE,
676 IWL_MVM_QUEUE_RESERVED,
677 IWL_MVM_QUEUE_READY,
678 IWL_MVM_QUEUE_SHARED,
679 IWL_MVM_QUEUE_INACTIVE,
680 IWL_MVM_QUEUE_RECONFIGURING,
681};
682
683#define IWL_MVM_DQA_QUEUE_TIMEOUT (5 * HZ)
684#define IWL_MVM_INVALID_QUEUE 0xFFFF
685
686#define IWL_MVM_NUM_CIPHERS 10
687
688#ifdef CONFIG_ACPI
689#define IWL_MVM_SAR_TABLE_SIZE 10
690#define IWL_MVM_SAR_PROFILE_NUM 4
691#define IWL_MVM_GEO_TABLE_SIZE 6
692
693struct iwl_mvm_sar_profile {
694 bool enabled;
695 u8 table[IWL_MVM_SAR_TABLE_SIZE];
696};
697
698struct iwl_mvm_geo_profile {
699 u8 values[IWL_MVM_GEO_TABLE_SIZE];
700};
701#endif
702
703struct iwl_mvm {
704
705 struct device *dev;
706
707 struct iwl_trans *trans;
708 const struct iwl_fw *fw;
709 const struct iwl_cfg *cfg;
710 struct iwl_phy_db *phy_db;
711 struct ieee80211_hw *hw;
712
713
714 struct mutex mutex;
715 struct list_head async_handlers_list;
716 spinlock_t async_handlers_lock;
717 struct work_struct async_handlers_wk;
718
719 struct work_struct roc_done_wk;
720
721 unsigned long init_status;
722
723 unsigned long status;
724
725 u32 queue_sync_cookie;
726 atomic_t queue_sync_counter;
727
728
729
730
731 struct iwl_mvm_vif *bf_allowed_vif;
732
733 bool hw_registered;
734 bool calibrating;
735 u32 error_event_table[2];
736 u32 log_event_table;
737 u32 umac_error_event_table;
738 bool support_umac_log;
739 struct iwl_sf_region sf_space;
740
741 u32 ampdu_ref;
742 bool ampdu_toggle;
743
744 struct iwl_notif_wait_data notif_wait;
745
746 union {
747 struct mvm_statistics_rx_v3 rx_stats_v3;
748 struct mvm_statistics_rx rx_stats;
749 };
750
751 struct {
752 u64 rx_time;
753 u64 tx_time;
754 u64 on_time_rf;
755 u64 on_time_scan;
756 } radio_stats, accu_radio_stats;
757
758 u16 hw_queue_to_mac80211[IWL_MAX_TVQM_QUEUES];
759
760 struct {
761 u8 hw_queue_refcount;
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 } queue_info[IWL_MAX_HW_QUEUES];
771 spinlock_t queue_info_lock;
772 struct work_struct add_stream_wk;
773
774 atomic_t mac80211_queue_stop_count[IEEE80211_MAX_QUEUES];
775
776 const char *nvm_file_name;
777 struct iwl_nvm_data *nvm_data;
778
779 struct iwl_nvm_section nvm_sections[NVM_MAX_NUM_SECTIONS];
780
781 struct iwl_fw_runtime fwrt;
782
783
784 struct mac_address addresses[IWL_MVM_MAX_ADDRESSES];
785
786
787 struct iwl_rx_phy_info last_phy_info;
788 struct ieee80211_sta __rcu *fw_id_to_mac_id[IWL_MVM_STATION_COUNT];
789 unsigned long sta_deferred_frames[BITS_TO_LONGS(IWL_MVM_STATION_COUNT)];
790 u8 rx_ba_sessions;
791
792
793 u32 rts_threshold;
794
795
796 unsigned int scan_status;
797 void *scan_cmd;
798 struct iwl_mcast_filter_cmd *mcast_filter_cmd;
799 enum iwl_mvm_scan_type scan_type;
800 enum iwl_mvm_sched_scan_pass_all_states sched_scan_pass_all;
801 struct delayed_work scan_timeout_dwork;
802
803
804 unsigned int max_scans;
805
806
807 u32 scan_uid_status[IWL_MVM_MAX_UMAC_SCANS];
808
809
810 u64 scan_start;
811
812
813 struct iwl_mvm_vif *scan_vif;
814
815
816 u8 scan_rx_ant;
817
818#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
819
820 const struct iwl_fw_bcast_filter *bcast_filters;
821#ifdef CONFIG_IWLWIFI_DEBUGFS
822 struct {
823 bool override;
824 struct iwl_bcast_filter_cmd cmd;
825 } dbgfs_bcast_filtering;
826#endif
827#endif
828
829
830 struct iwl_mvm_int_sta aux_sta;
831 struct iwl_mvm_int_sta snif_sta;
832
833 bool last_ebs_successful;
834
835 u8 scan_last_antenna_idx;
836 u8 mgmt_last_antenna_idx;
837
838
839 enum iwl_sf_state sf_state;
840
841#ifdef CONFIG_IWLWIFI_DEBUGFS
842 struct dentry *debugfs_dir;
843 u32 dbgfs_sram_offset, dbgfs_sram_len;
844 u32 dbgfs_prph_reg_addr;
845 bool disable_power_off;
846 bool disable_power_off_d3;
847
848 bool scan_iter_notif_enabled;
849
850 struct debugfs_blob_wrapper nvm_hw_blob;
851 struct debugfs_blob_wrapper nvm_sw_blob;
852 struct debugfs_blob_wrapper nvm_calib_blob;
853 struct debugfs_blob_wrapper nvm_prod_blob;
854 struct debugfs_blob_wrapper nvm_phy_sku_blob;
855
856 struct iwl_mvm_frame_stats drv_rx_stats;
857 spinlock_t drv_stats_lock;
858 u16 dbgfs_rx_phyinfo;
859#endif
860
861 struct iwl_mvm_phy_ctxt phy_ctxts[NUM_PHY_CTX];
862
863 struct list_head time_event_list;
864 spinlock_t time_event_lock;
865
866
867
868
869
870 unsigned long fw_key_table[BITS_TO_LONGS(STA_KEY_MAX_NUM)];
871 u8 fw_key_deleted[STA_KEY_MAX_NUM];
872
873
874 spinlock_t refs_lock;
875 u8 refs[IWL_MVM_REF_COUNT];
876
877 u8 vif_count;
878
879
880 s8 fw_restart;
881
882#ifdef CONFIG_IWLWIFI_LEDS
883 struct led_classdev led;
884#endif
885
886 struct ieee80211_vif *p2p_device_vif;
887
888#ifdef CONFIG_PM
889 struct wiphy_wowlan_support wowlan;
890 int gtk_ivlen, gtk_icvlen, ptk_ivlen, ptk_icvlen;
891
892
893 struct ieee80211_scan_ies nd_ies;
894 struct cfg80211_match_set *nd_match_sets;
895 int n_nd_match_sets;
896 struct ieee80211_channel **nd_channels;
897 int n_nd_channels;
898 bool net_detect;
899#ifdef CONFIG_IWLWIFI_DEBUGFS
900 bool d3_wake_sysassert;
901 bool d3_test_active;
902 bool store_d3_resume_sram;
903 void *d3_resume_sram;
904 u32 d3_test_pme_ptr;
905 struct ieee80211_vif *keep_vif;
906 u32 last_netdetect_scans;
907#endif
908#endif
909
910
911 u8 d0i3_ap_sta_id;
912 bool d0i3_offloading;
913 struct work_struct d0i3_exit_work;
914 struct sk_buff_head d0i3_tx;
915
916 struct mutex d0i3_suspend_mutex;
917 unsigned long d0i3_suspend_flags;
918
919 spinlock_t d0i3_tx_lock;
920 wait_queue_head_t d0i3_exit_waitq;
921 wait_queue_head_t rx_sync_waitq;
922
923
924 struct iwl_bt_coex_profile_notif last_bt_notif;
925 struct iwl_bt_coex_ci_cmd last_bt_ci_cmd;
926
927 u8 bt_tx_prio;
928 enum iwl_bt_force_ant_mode bt_force_ant_mode;
929
930
931 struct list_head aux_roc_te_list;
932
933
934 struct iwl_mvm_tt_mgmt thermal_throttle;
935#ifdef CONFIG_THERMAL
936 struct iwl_mvm_thermal_device tz_device;
937 struct iwl_mvm_cooling_device cooling_dev;
938#endif
939
940 s32 temperature;
941
942
943
944
945
946 bool temperature_test;
947
948 struct iwl_time_quota_cmd last_quota_cmd;
949
950#ifdef CONFIG_NL80211_TESTMODE
951 u32 noa_duration;
952 struct ieee80211_vif *noa_vif;
953#endif
954
955
956 u16 aux_queue;
957 u16 probe_queue;
958 u16 p2p_dev_queue;
959
960
961 u8 ps_disabled;
962 unsigned int max_amsdu_len;
963
964 struct ieee80211_vif __rcu *csa_vif;
965 struct ieee80211_vif __rcu *csa_tx_blocked_vif;
966 u8 csa_tx_block_bcn_timeout;
967
968
969 u32 ap_last_beacon_gp2;
970
971
972 bool ibss_manager;
973
974 bool lar_regdom_set;
975 enum iwl_mcc_source mcc_src;
976
977
978 struct {
979 struct delayed_work dwork;
980 enum iwl_mvm_tdls_cs_state state;
981
982
983
984
985
986 u8 cur_sta_id;
987
988
989 struct {
990 u8 sta_id;
991 u8 op_class;
992 bool initiator;
993 struct cfg80211_chan_def chandef;
994 struct sk_buff *skb;
995 u32 ch_sw_tm_ie;
996
997
998 u32 sent_timestamp;
999 } peer;
1000 } tdls_cs;
1001
1002
1003 u32 ciphers[IWL_MVM_NUM_CIPHERS];
1004 struct ieee80211_cipher_scheme cs[IWL_UCODE_MAX_CS];
1005 struct iwl_mvm_tof_data tof_data;
1006
1007 struct ieee80211_vif *nan_vif;
1008#define IWL_MAX_BAID 32
1009 struct iwl_mvm_baid_data __rcu *baid_map[IWL_MAX_BAID];
1010
1011
1012
1013
1014
1015 bool drop_bcn_ap_mode;
1016
1017 struct delayed_work cs_tx_unblock_dwork;
1018
1019
1020 bool monitor_on;
1021#ifdef CONFIG_ACPI
1022 struct iwl_mvm_sar_profile sar_profiles[IWL_MVM_SAR_PROFILE_NUM];
1023 struct iwl_mvm_geo_profile geo_profiles[IWL_NUM_GEO_PROFILES];
1024#endif
1025};
1026
1027
1028#define IWL_OP_MODE_GET_MVM(_iwl_op_mode) \
1029 ((struct iwl_mvm *)(_iwl_op_mode)->op_mode_specific)
1030
1031#define IWL_MAC80211_GET_MVM(_hw) \
1032 IWL_OP_MODE_GET_MVM((struct iwl_op_mode *)((_hw)->priv))
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046enum iwl_mvm_status {
1047 IWL_MVM_STATUS_HW_RFKILL,
1048 IWL_MVM_STATUS_HW_CTKILL,
1049 IWL_MVM_STATUS_ROC_RUNNING,
1050 IWL_MVM_STATUS_HW_RESTART_REQUESTED,
1051 IWL_MVM_STATUS_IN_HW_RESTART,
1052 IWL_MVM_STATUS_IN_D0I3,
1053 IWL_MVM_STATUS_ROC_AUX_RUNNING,
1054 IWL_MVM_STATUS_D3_RECONFIG,
1055 IWL_MVM_STATUS_FIRMWARE_RUNNING,
1056};
1057
1058
1059enum iwl_mvm_init_status {
1060 IWL_MVM_INIT_STATUS_THERMAL_INIT_COMPLETE = BIT(0),
1061 IWL_MVM_INIT_STATUS_LEDS_INIT_COMPLETE = BIT(1),
1062 IWL_MVM_INIT_STATUS_REG_HW_INIT_COMPLETE = BIT(2),
1063 IWL_MVM_INIT_STATUS_TOF_INIT_COMPLETE = BIT(3),
1064};
1065
1066static inline bool iwl_mvm_is_radio_killed(struct iwl_mvm *mvm)
1067{
1068 return test_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status) ||
1069 test_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status);
1070}
1071
1072static inline bool iwl_mvm_is_radio_hw_killed(struct iwl_mvm *mvm)
1073{
1074 return test_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status);
1075}
1076
1077static inline bool iwl_mvm_firmware_running(struct iwl_mvm *mvm)
1078{
1079 return test_bit(IWL_MVM_STATUS_FIRMWARE_RUNNING, &mvm->status);
1080}
1081
1082
1083
1084
1085static inline struct iwl_mvm_sta *
1086iwl_mvm_sta_from_staid_rcu(struct iwl_mvm *mvm, u8 sta_id)
1087{
1088 struct ieee80211_sta *sta;
1089
1090 if (sta_id >= ARRAY_SIZE(mvm->fw_id_to_mac_id))
1091 return NULL;
1092
1093 sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
1094
1095
1096 if (IS_ERR_OR_NULL(sta))
1097 return NULL;
1098
1099 return iwl_mvm_sta_from_mac80211(sta);
1100}
1101
1102static inline struct iwl_mvm_sta *
1103iwl_mvm_sta_from_staid_protected(struct iwl_mvm *mvm, u8 sta_id)
1104{
1105 struct ieee80211_sta *sta;
1106
1107 if (sta_id >= ARRAY_SIZE(mvm->fw_id_to_mac_id))
1108 return NULL;
1109
1110 sta = rcu_dereference_protected(mvm->fw_id_to_mac_id[sta_id],
1111 lockdep_is_held(&mvm->mutex));
1112
1113
1114 if (IS_ERR_OR_NULL(sta))
1115 return NULL;
1116
1117 return iwl_mvm_sta_from_mac80211(sta);
1118}
1119
1120static inline bool iwl_mvm_is_d0i3_supported(struct iwl_mvm *mvm)
1121{
1122 return !iwlwifi_mod_params.d0i3_disable &&
1123 fw_has_capa(&mvm->fw->ucode_capa,
1124 IWL_UCODE_TLV_CAPA_D0I3_SUPPORT);
1125}
1126
1127static inline bool iwl_mvm_enter_d0i3_on_suspend(struct iwl_mvm *mvm)
1128{
1129
1130
1131
1132
1133
1134
1135
1136 return (mvm->trans->system_pm_mode == IWL_PLAT_PM_MODE_D0I3) &&
1137 (mvm->trans->runtime_pm_mode != IWL_PLAT_PM_MODE_D0I3);
1138}
1139
1140static inline bool iwl_mvm_is_dqa_data_queue(struct iwl_mvm *mvm, u8 queue)
1141{
1142 return (queue >= IWL_MVM_DQA_MIN_DATA_QUEUE) &&
1143 (queue <= IWL_MVM_DQA_MAX_DATA_QUEUE);
1144}
1145
1146static inline bool iwl_mvm_is_dqa_mgmt_queue(struct iwl_mvm *mvm, u8 queue)
1147{
1148 return (queue >= IWL_MVM_DQA_MIN_MGMT_QUEUE) &&
1149 (queue <= IWL_MVM_DQA_MAX_MGMT_QUEUE);
1150}
1151
1152static inline bool iwl_mvm_is_lar_supported(struct iwl_mvm *mvm)
1153{
1154 bool nvm_lar = mvm->nvm_data->lar_enabled;
1155 bool tlv_lar = fw_has_capa(&mvm->fw->ucode_capa,
1156 IWL_UCODE_TLV_CAPA_LAR_SUPPORT);
1157
1158 if (iwlwifi_mod_params.lar_disable)
1159 return false;
1160
1161
1162
1163
1164
1165 if (mvm->cfg->nvm_type == IWL_NVM_EXT)
1166 return nvm_lar && tlv_lar;
1167 else
1168 return tlv_lar;
1169}
1170
1171static inline bool iwl_mvm_is_wifi_mcc_supported(struct iwl_mvm *mvm)
1172{
1173 return fw_has_api(&mvm->fw->ucode_capa,
1174 IWL_UCODE_TLV_API_WIFI_MCC_UPDATE) ||
1175 fw_has_capa(&mvm->fw->ucode_capa,
1176 IWL_UCODE_TLV_CAPA_LAR_MULTI_MCC);
1177}
1178
1179static inline bool iwl_mvm_bt_is_rrc_supported(struct iwl_mvm *mvm)
1180{
1181 return fw_has_capa(&mvm->fw->ucode_capa,
1182 IWL_UCODE_TLV_CAPA_BT_COEX_RRC) &&
1183 IWL_MVM_BT_COEX_RRC;
1184}
1185
1186static inline bool iwl_mvm_is_csum_supported(struct iwl_mvm *mvm)
1187{
1188 return fw_has_capa(&mvm->fw->ucode_capa,
1189 IWL_UCODE_TLV_CAPA_CSUM_SUPPORT) &&
1190 !IWL_MVM_HW_CSUM_DISABLE;
1191}
1192
1193static inline bool iwl_mvm_is_mplut_supported(struct iwl_mvm *mvm)
1194{
1195 return fw_has_capa(&mvm->fw->ucode_capa,
1196 IWL_UCODE_TLV_CAPA_BT_MPLUT_SUPPORT) &&
1197 IWL_MVM_BT_COEX_MPLUT;
1198}
1199
1200static inline
1201bool iwl_mvm_is_p2p_scm_uapsd_supported(struct iwl_mvm *mvm)
1202{
1203 return fw_has_capa(&mvm->fw->ucode_capa,
1204 IWL_UCODE_TLV_CAPA_P2P_SCM_UAPSD) &&
1205 !(iwlwifi_mod_params.uapsd_disable &
1206 IWL_DISABLE_UAPSD_P2P_CLIENT);
1207}
1208
1209static inline bool iwl_mvm_has_new_rx_api(struct iwl_mvm *mvm)
1210{
1211 return fw_has_capa(&mvm->fw->ucode_capa,
1212 IWL_UCODE_TLV_CAPA_MULTI_QUEUE_RX_SUPPORT);
1213}
1214
1215static inline bool iwl_mvm_has_new_tx_api(struct iwl_mvm *mvm)
1216{
1217
1218 return mvm->trans->cfg->use_tfh;
1219}
1220
1221static inline bool iwl_mvm_has_unified_ucode(struct iwl_mvm *mvm)
1222{
1223
1224 return mvm->trans->cfg->device_family >= IWL_DEVICE_FAMILY_A000;
1225}
1226
1227static inline bool iwl_mvm_is_cdb_supported(struct iwl_mvm *mvm)
1228{
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238 return fw_has_capa(&mvm->fw->ucode_capa,
1239 IWL_UCODE_TLV_CAPA_CDB_SUPPORT);
1240}
1241
1242static inline bool iwl_mvm_has_new_rx_stats_api(struct iwl_mvm *mvm)
1243{
1244 return fw_has_api(&mvm->fw->ucode_capa,
1245 IWL_UCODE_TLV_API_NEW_RX_STATS);
1246}
1247
1248static inline bool iwl_mvm_has_new_ats_coex_api(struct iwl_mvm *mvm)
1249{
1250 return fw_has_api(&mvm->fw->ucode_capa,
1251 IWL_UCODE_TLV_API_COEX_ATS_EXTERNAL);
1252}
1253
1254static inline struct agg_tx_status *
1255iwl_mvm_get_agg_status(struct iwl_mvm *mvm, void *tx_resp)
1256{
1257 if (iwl_mvm_has_new_tx_api(mvm))
1258 return &((struct iwl_mvm_tx_resp *)tx_resp)->status;
1259 else
1260 return ((struct iwl_mvm_tx_resp_v3 *)tx_resp)->status;
1261}
1262
1263static inline bool iwl_mvm_is_tt_in_fw(struct iwl_mvm *mvm)
1264{
1265#ifdef CONFIG_THERMAL
1266
1267
1268
1269
1270 return fw_has_capa(&mvm->fw->ucode_capa,
1271 IWL_UCODE_TLV_CAPA_CT_KILL_BY_FW) &&
1272 fw_has_capa(&mvm->fw->ucode_capa,
1273 IWL_UCODE_TLV_CAPA_TEMP_THS_REPORT_SUPPORT);
1274#else
1275 return false;
1276#endif
1277}
1278
1279static inline bool iwl_mvm_is_ctdp_supported(struct iwl_mvm *mvm)
1280{
1281 return fw_has_capa(&mvm->fw->ucode_capa,
1282 IWL_UCODE_TLV_CAPA_CTDP_SUPPORT);
1283}
1284
1285extern const u8 iwl_mvm_ac_to_tx_fifo[];
1286extern const u8 iwl_mvm_ac_to_gen2_tx_fifo[];
1287
1288static inline u8 iwl_mvm_mac_ac_to_tx_fifo(struct iwl_mvm *mvm,
1289 enum ieee80211_ac_numbers ac)
1290{
1291 return iwl_mvm_has_new_tx_api(mvm) ?
1292 iwl_mvm_ac_to_gen2_tx_fifo[ac] : iwl_mvm_ac_to_tx_fifo[ac];
1293}
1294
1295struct iwl_rate_info {
1296 u8 plcp;
1297 u8 plcp_siso;
1298 u8 plcp_mimo2;
1299 u8 plcp_mimo3;
1300 u8 ieee;
1301};
1302
1303void __iwl_mvm_mac_stop(struct iwl_mvm *mvm);
1304int __iwl_mvm_mac_start(struct iwl_mvm *mvm);
1305
1306
1307
1308
1309
1310int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm);
1311
1312
1313int iwl_mvm_legacy_rate_to_mac80211_idx(u32 rate_n_flags,
1314 enum nl80211_band band);
1315void iwl_mvm_hwrate_to_tx_rate(u32 rate_n_flags,
1316 enum nl80211_band band,
1317 struct ieee80211_tx_rate *r);
1318u8 iwl_mvm_mac80211_idx_to_hwrate(int rate_idx);
1319void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm);
1320u8 first_antenna(u8 mask);
1321u8 iwl_mvm_next_antenna(struct iwl_mvm *mvm, u8 valid, u8 last_idx);
1322void iwl_mvm_get_sync_time(struct iwl_mvm *mvm, u32 *gp2, u64 *boottime);
1323
1324
1325int __must_check iwl_mvm_send_cmd(struct iwl_mvm *mvm,
1326 struct iwl_host_cmd *cmd);
1327int __must_check iwl_mvm_send_cmd_pdu(struct iwl_mvm *mvm, u32 id,
1328 u32 flags, u16 len, const void *data);
1329int __must_check iwl_mvm_send_cmd_status(struct iwl_mvm *mvm,
1330 struct iwl_host_cmd *cmd,
1331 u32 *status);
1332int __must_check iwl_mvm_send_cmd_pdu_status(struct iwl_mvm *mvm, u32 id,
1333 u16 len, const void *data,
1334 u32 *status);
1335int iwl_mvm_tx_skb(struct iwl_mvm *mvm, struct sk_buff *skb,
1336 struct ieee80211_sta *sta);
1337int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb);
1338void iwl_mvm_set_tx_cmd(struct iwl_mvm *mvm, struct sk_buff *skb,
1339 struct iwl_tx_cmd *tx_cmd,
1340 struct ieee80211_tx_info *info, u8 sta_id);
1341void iwl_mvm_set_tx_cmd_rate(struct iwl_mvm *mvm, struct iwl_tx_cmd *tx_cmd,
1342 struct ieee80211_tx_info *info,
1343 struct ieee80211_sta *sta, __le16 fc);
1344#ifdef CONFIG_IWLWIFI_DEBUG
1345const char *iwl_mvm_get_tx_fail_reason(u32 status);
1346#else
1347static inline const char *iwl_mvm_get_tx_fail_reason(u32 status) { return ""; }
1348#endif
1349int iwl_mvm_flush_tx_path(struct iwl_mvm *mvm, u32 tfd_msk, u32 flags);
1350int iwl_mvm_flush_sta(struct iwl_mvm *mvm, void *sta, bool internal, u32 flags);
1351int iwl_mvm_flush_sta_tids(struct iwl_mvm *mvm, u32 sta_id,
1352 u16 tids, u32 flags);
1353
1354void iwl_mvm_async_handlers_purge(struct iwl_mvm *mvm);
1355
1356static inline void iwl_mvm_set_tx_cmd_ccmp(struct ieee80211_tx_info *info,
1357 struct iwl_tx_cmd *tx_cmd)
1358{
1359 struct ieee80211_key_conf *keyconf = info->control.hw_key;
1360
1361 tx_cmd->sec_ctl = TX_CMD_SEC_CCM;
1362 memcpy(tx_cmd->key, keyconf->key, keyconf->keylen);
1363}
1364
1365static inline void iwl_mvm_wait_for_async_handlers(struct iwl_mvm *mvm)
1366{
1367 flush_work(&mvm->async_handlers_wk);
1368}
1369
1370
1371void iwl_mvm_handle_rx_statistics(struct iwl_mvm *mvm,
1372 struct iwl_rx_packet *pkt);
1373void iwl_mvm_rx_statistics(struct iwl_mvm *mvm,
1374 struct iwl_rx_cmd_buffer *rxb);
1375int iwl_mvm_request_statistics(struct iwl_mvm *mvm, bool clear);
1376void iwl_mvm_accu_radio_stats(struct iwl_mvm *mvm);
1377
1378
1379int iwl_nvm_init(struct iwl_mvm *mvm);
1380int iwl_mvm_load_nvm_to_nic(struct iwl_mvm *mvm);
1381int iwl_mvm_read_external_nvm(struct iwl_mvm *mvm);
1382
1383static inline u8 iwl_mvm_get_valid_tx_ant(struct iwl_mvm *mvm)
1384{
1385 return mvm->nvm_data && mvm->nvm_data->valid_tx_ant ?
1386 mvm->fw->valid_tx_ant & mvm->nvm_data->valid_tx_ant :
1387 mvm->fw->valid_tx_ant;
1388}
1389
1390static inline u8 iwl_mvm_get_valid_rx_ant(struct iwl_mvm *mvm)
1391{
1392 return mvm->nvm_data && mvm->nvm_data->valid_rx_ant ?
1393 mvm->fw->valid_rx_ant & mvm->nvm_data->valid_rx_ant :
1394 mvm->fw->valid_rx_ant;
1395}
1396
1397static inline u32 iwl_mvm_get_phy_config(struct iwl_mvm *mvm)
1398{
1399 u32 phy_config = ~(FW_PHY_CFG_TX_CHAIN |
1400 FW_PHY_CFG_RX_CHAIN);
1401 u32 valid_rx_ant = iwl_mvm_get_valid_rx_ant(mvm);
1402 u32 valid_tx_ant = iwl_mvm_get_valid_tx_ant(mvm);
1403
1404 phy_config |= valid_tx_ant << FW_PHY_CFG_TX_CHAIN_POS |
1405 valid_rx_ant << FW_PHY_CFG_RX_CHAIN_POS;
1406
1407 return mvm->fw->phy_config & phy_config;
1408}
1409
1410int iwl_mvm_up(struct iwl_mvm *mvm);
1411int iwl_mvm_load_d3_fw(struct iwl_mvm *mvm);
1412
1413int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm);
1414bool iwl_mvm_bcast_filter_build_cmd(struct iwl_mvm *mvm,
1415 struct iwl_bcast_filter_cmd *cmd);
1416
1417
1418
1419
1420
1421void iwl_mvm_rx_rx_phy_cmd(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
1422void iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct napi_struct *napi,
1423 struct iwl_rx_cmd_buffer *rxb);
1424void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
1425 struct iwl_rx_cmd_buffer *rxb, int queue);
1426void iwl_mvm_rx_frame_release(struct iwl_mvm *mvm, struct napi_struct *napi,
1427 struct iwl_rx_cmd_buffer *rxb, int queue);
1428int iwl_mvm_notify_rx_queue(struct iwl_mvm *mvm, u32 rxq_mask,
1429 const u8 *data, u32 count);
1430void iwl_mvm_rx_queue_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
1431 int queue);
1432void iwl_mvm_rx_tx_cmd(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
1433void iwl_mvm_mfu_assert_dump_notif(struct iwl_mvm *mvm,
1434 struct iwl_rx_cmd_buffer *rxb);
1435void iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
1436void iwl_mvm_rx_ant_coupling_notif(struct iwl_mvm *mvm,
1437 struct iwl_rx_cmd_buffer *rxb);
1438void iwl_mvm_rx_fw_error(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
1439void iwl_mvm_rx_card_state_notif(struct iwl_mvm *mvm,
1440 struct iwl_rx_cmd_buffer *rxb);
1441void iwl_mvm_rx_mfuart_notif(struct iwl_mvm *mvm,
1442 struct iwl_rx_cmd_buffer *rxb);
1443void iwl_mvm_rx_shared_mem_cfg_notif(struct iwl_mvm *mvm,
1444 struct iwl_rx_cmd_buffer *rxb);
1445
1446
1447int iwl_mvm_phy_ctxt_add(struct iwl_mvm *mvm, struct iwl_mvm_phy_ctxt *ctxt,
1448 struct cfg80211_chan_def *chandef,
1449 u8 chains_static, u8 chains_dynamic);
1450int iwl_mvm_phy_ctxt_changed(struct iwl_mvm *mvm, struct iwl_mvm_phy_ctxt *ctxt,
1451 struct cfg80211_chan_def *chandef,
1452 u8 chains_static, u8 chains_dynamic);
1453void iwl_mvm_phy_ctxt_ref(struct iwl_mvm *mvm,
1454 struct iwl_mvm_phy_ctxt *ctxt);
1455void iwl_mvm_phy_ctxt_unref(struct iwl_mvm *mvm,
1456 struct iwl_mvm_phy_ctxt *ctxt);
1457int iwl_mvm_phy_ctx_count(struct iwl_mvm *mvm);
1458u8 iwl_mvm_get_channel_width(struct cfg80211_chan_def *chandef);
1459u8 iwl_mvm_get_ctrl_pos(struct cfg80211_chan_def *chandef);
1460
1461
1462int iwl_mvm_mac_ctxt_init(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1463int iwl_mvm_mac_ctxt_add(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1464int iwl_mvm_mac_ctxt_changed(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1465 bool force_assoc_off, const u8 *bssid_override);
1466int iwl_mvm_mac_ctxt_remove(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1467u32 iwl_mvm_mac_get_queues_mask(struct ieee80211_vif *vif);
1468int iwl_mvm_mac_ctxt_beacon_changed(struct iwl_mvm *mvm,
1469 struct ieee80211_vif *vif);
1470void iwl_mvm_rx_beacon_notif(struct iwl_mvm *mvm,
1471 struct iwl_rx_cmd_buffer *rxb);
1472void iwl_mvm_rx_missed_beacons_notif(struct iwl_mvm *mvm,
1473 struct iwl_rx_cmd_buffer *rxb);
1474void iwl_mvm_rx_stored_beacon_notif(struct iwl_mvm *mvm,
1475 struct iwl_rx_cmd_buffer *rxb);
1476void iwl_mvm_mu_mimo_grp_notif(struct iwl_mvm *mvm,
1477 struct iwl_rx_cmd_buffer *rxb);
1478void iwl_mvm_sta_pm_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
1479void iwl_mvm_window_status_notif(struct iwl_mvm *mvm,
1480 struct iwl_rx_cmd_buffer *rxb);
1481void iwl_mvm_mac_ctxt_recalc_tsf_id(struct iwl_mvm *mvm,
1482 struct ieee80211_vif *vif);
1483unsigned long iwl_mvm_get_used_hw_queues(struct iwl_mvm *mvm,
1484 struct ieee80211_vif *exclude_vif);
1485void iwl_mvm_channel_switch_noa_notif(struct iwl_mvm *mvm,
1486 struct iwl_rx_cmd_buffer *rxb);
1487
1488int iwl_mvm_binding_add_vif(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1489int iwl_mvm_binding_remove_vif(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1490
1491
1492int iwl_mvm_update_quotas(struct iwl_mvm *mvm, bool force_upload,
1493 struct ieee80211_vif *disabled_vif);
1494
1495
1496int iwl_mvm_reg_scan_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1497 struct cfg80211_scan_request *req,
1498 struct ieee80211_scan_ies *ies);
1499int iwl_mvm_scan_size(struct iwl_mvm *mvm);
1500int iwl_mvm_scan_stop(struct iwl_mvm *mvm, int type, bool notify);
1501int iwl_mvm_max_scan_ie_len(struct iwl_mvm *mvm);
1502void iwl_mvm_report_scan_aborted(struct iwl_mvm *mvm);
1503void iwl_mvm_scan_timeout_wk(struct work_struct *work);
1504
1505
1506void iwl_mvm_rx_lmac_scan_complete_notif(struct iwl_mvm *mvm,
1507 struct iwl_rx_cmd_buffer *rxb);
1508void iwl_mvm_rx_lmac_scan_iter_complete_notif(struct iwl_mvm *mvm,
1509 struct iwl_rx_cmd_buffer *rxb);
1510int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm,
1511 struct ieee80211_vif *vif,
1512 struct cfg80211_sched_scan_request *req,
1513 struct ieee80211_scan_ies *ies,
1514 int type);
1515void iwl_mvm_rx_scan_match_found(struct iwl_mvm *mvm,
1516 struct iwl_rx_cmd_buffer *rxb);
1517
1518
1519int iwl_mvm_config_scan(struct iwl_mvm *mvm);
1520void iwl_mvm_rx_umac_scan_complete_notif(struct iwl_mvm *mvm,
1521 struct iwl_rx_cmd_buffer *rxb);
1522void iwl_mvm_rx_umac_scan_iter_complete_notif(struct iwl_mvm *mvm,
1523 struct iwl_rx_cmd_buffer *rxb);
1524
1525
1526#ifdef CONFIG_IWLWIFI_DEBUGFS
1527int iwl_mvm_dbgfs_register(struct iwl_mvm *mvm, struct dentry *dbgfs_dir);
1528void iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1529void iwl_mvm_vif_dbgfs_clean(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1530#else
1531static inline int iwl_mvm_dbgfs_register(struct iwl_mvm *mvm,
1532 struct dentry *dbgfs_dir)
1533{
1534 return 0;
1535}
1536static inline void
1537iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
1538{
1539}
1540static inline void
1541iwl_mvm_vif_dbgfs_clean(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
1542{
1543}
1544#endif
1545
1546
1547int iwl_mvm_send_lq_cmd(struct iwl_mvm *mvm, struct iwl_lq_cmd *lq, bool init);
1548void iwl_mvm_update_frame_stats(struct iwl_mvm *mvm, u32 rate, bool agg);
1549int rs_pretty_print_rate(char *buf, const u32 rate);
1550void rs_update_last_rssi(struct iwl_mvm *mvm,
1551 struct iwl_lq_sta *lq_sta,
1552 struct ieee80211_rx_status *rx_status);
1553
1554
1555int iwl_mvm_power_update_device(struct iwl_mvm *mvm);
1556int iwl_mvm_power_update_mac(struct iwl_mvm *mvm);
1557int iwl_mvm_power_update_ps(struct iwl_mvm *mvm);
1558int iwl_mvm_power_mac_dbgfs_read(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1559 char *buf, int bufsz);
1560
1561void iwl_mvm_power_vif_assoc(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1562void iwl_mvm_power_uapsd_misbehaving_ap_notif(struct iwl_mvm *mvm,
1563 struct iwl_rx_cmd_buffer *rxb);
1564
1565#ifdef CONFIG_IWLWIFI_LEDS
1566int iwl_mvm_leds_init(struct iwl_mvm *mvm);
1567void iwl_mvm_leds_exit(struct iwl_mvm *mvm);
1568void iwl_mvm_leds_sync(struct iwl_mvm *mvm);
1569#else
1570static inline int iwl_mvm_leds_init(struct iwl_mvm *mvm)
1571{
1572 return 0;
1573}
1574static inline void iwl_mvm_leds_exit(struct iwl_mvm *mvm)
1575{
1576}
1577static inline void iwl_mvm_leds_sync(struct iwl_mvm *mvm)
1578{
1579}
1580#endif
1581
1582
1583int iwl_mvm_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan);
1584int iwl_mvm_resume(struct ieee80211_hw *hw);
1585void iwl_mvm_set_wakeup(struct ieee80211_hw *hw, bool enabled);
1586void iwl_mvm_set_rekey_data(struct ieee80211_hw *hw,
1587 struct ieee80211_vif *vif,
1588 struct cfg80211_gtk_rekey_data *data);
1589void iwl_mvm_ipv6_addr_change(struct ieee80211_hw *hw,
1590 struct ieee80211_vif *vif,
1591 struct inet6_dev *idev);
1592void iwl_mvm_set_default_unicast_key(struct ieee80211_hw *hw,
1593 struct ieee80211_vif *vif, int idx);
1594extern const struct file_operations iwl_dbgfs_d3_test_ops;
1595#ifdef CONFIG_PM
1596int iwl_mvm_wowlan_config_key_params(struct iwl_mvm *mvm,
1597 struct ieee80211_vif *vif,
1598 bool host_awake,
1599 u32 cmd_flags);
1600void iwl_mvm_d0i3_update_keys(struct iwl_mvm *mvm,
1601 struct ieee80211_vif *vif,
1602 struct iwl_wowlan_status *status);
1603void iwl_mvm_set_last_nonqos_seq(struct iwl_mvm *mvm,
1604 struct ieee80211_vif *vif);
1605#else
1606static inline int iwl_mvm_wowlan_config_key_params(struct iwl_mvm *mvm,
1607 struct ieee80211_vif *vif,
1608 bool host_awake,
1609 u32 cmd_flags)
1610{
1611 return 0;
1612}
1613
1614static inline void iwl_mvm_d0i3_update_keys(struct iwl_mvm *mvm,
1615 struct ieee80211_vif *vif,
1616 struct iwl_wowlan_status *status)
1617{
1618}
1619
1620static inline void
1621iwl_mvm_set_last_nonqos_seq(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
1622{
1623}
1624#endif
1625void iwl_mvm_set_wowlan_qos_seq(struct iwl_mvm_sta *mvm_ap_sta,
1626 struct iwl_wowlan_config_cmd *cmd);
1627int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
1628 struct ieee80211_vif *vif,
1629 bool disable_offloading,
1630 bool offload_ns,
1631 u32 cmd_flags);
1632
1633
1634void iwl_mvm_ref(struct iwl_mvm *mvm, enum iwl_mvm_ref_type ref_type);
1635void iwl_mvm_unref(struct iwl_mvm *mvm, enum iwl_mvm_ref_type ref_type);
1636int iwl_mvm_ref_sync(struct iwl_mvm *mvm, enum iwl_mvm_ref_type ref_type);
1637bool iwl_mvm_ref_taken(struct iwl_mvm *mvm);
1638void iwl_mvm_d0i3_enable_tx(struct iwl_mvm *mvm, __le16 *qos_seq);
1639int iwl_mvm_enter_d0i3(struct iwl_op_mode *op_mode);
1640int iwl_mvm_exit_d0i3(struct iwl_op_mode *op_mode);
1641int _iwl_mvm_exit_d0i3(struct iwl_mvm *mvm);
1642
1643
1644int iwl_mvm_send_bt_init_conf(struct iwl_mvm *mvm);
1645void iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm,
1646 struct iwl_rx_cmd_buffer *rxb);
1647void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1648 enum ieee80211_rssi_event_data);
1649void iwl_mvm_bt_coex_vif_change(struct iwl_mvm *mvm);
1650u16 iwl_mvm_coex_agg_time_limit(struct iwl_mvm *mvm,
1651 struct ieee80211_sta *sta);
1652bool iwl_mvm_bt_coex_is_mimo_allowed(struct iwl_mvm *mvm,
1653 struct ieee80211_sta *sta);
1654bool iwl_mvm_bt_coex_is_ant_avail(struct iwl_mvm *mvm, u8 ant);
1655bool iwl_mvm_bt_coex_is_shared_ant_avail(struct iwl_mvm *mvm);
1656bool iwl_mvm_bt_coex_is_tpc_allowed(struct iwl_mvm *mvm,
1657 enum nl80211_band band);
1658u8 iwl_mvm_bt_coex_tx_prio(struct iwl_mvm *mvm, struct ieee80211_hdr *hdr,
1659 struct ieee80211_tx_info *info, u8 ac);
1660
1661
1662#ifdef CONFIG_IWLWIFI_DEBUGFS
1663void
1664iwl_mvm_beacon_filter_debugfs_parameters(struct ieee80211_vif *vif,
1665 struct iwl_beacon_filter_cmd *cmd);
1666#else
1667static inline void
1668iwl_mvm_beacon_filter_debugfs_parameters(struct ieee80211_vif *vif,
1669 struct iwl_beacon_filter_cmd *cmd)
1670{}
1671#endif
1672int iwl_mvm_update_d0i3_power_mode(struct iwl_mvm *mvm,
1673 struct ieee80211_vif *vif,
1674 bool enable, u32 flags);
1675int iwl_mvm_enable_beacon_filter(struct iwl_mvm *mvm,
1676 struct ieee80211_vif *vif,
1677 u32 flags);
1678int iwl_mvm_disable_beacon_filter(struct iwl_mvm *mvm,
1679 struct ieee80211_vif *vif,
1680 u32 flags);
1681
1682void iwl_mvm_update_smps(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1683 enum iwl_mvm_smps_type_request req_type,
1684 enum ieee80211_smps_mode smps_request);
1685bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm);
1686
1687
1688int iwl_mvm_update_low_latency(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1689 bool value);
1690
1691bool iwl_mvm_low_latency(struct iwl_mvm *mvm);
1692
1693static inline bool iwl_mvm_vif_low_latency(struct iwl_mvm_vif *mvmvif)
1694{
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705 return mvmvif->low_latency_dbgfs ||
1706 mvmvif->low_latency_traffic ||
1707 mvmvif->low_latency_vcmd;
1708}
1709
1710
1711bool iwl_mvm_enable_txq(struct iwl_mvm *mvm, int queue, int mac80211_queue,
1712 u16 ssn, const struct iwl_trans_txq_scd_cfg *cfg,
1713 unsigned int wdg_timeout);
1714int iwl_mvm_tvqm_enable_txq(struct iwl_mvm *mvm, int mac80211_queue,
1715 u8 sta_id, u8 tid, unsigned int timeout);
1716
1717int iwl_mvm_disable_txq(struct iwl_mvm *mvm, int queue, int mac80211_queue,
1718 u8 tid, u8 flags);
1719int iwl_mvm_find_free_queue(struct iwl_mvm *mvm, u8 sta_id, u8 minq, u8 maxq);
1720
1721
1722
1723
1724static inline u32 iwl_mvm_flushable_queues(struct iwl_mvm *mvm)
1725{
1726 return ((BIT(mvm->cfg->base_params->num_of_queues) - 1) &
1727 ~BIT(IWL_MVM_DQA_CMD_QUEUE));
1728}
1729
1730static inline void iwl_mvm_stop_device(struct iwl_mvm *mvm)
1731{
1732 iwl_free_fw_paging(&mvm->fwrt);
1733 clear_bit(IWL_MVM_STATUS_FIRMWARE_RUNNING, &mvm->status);
1734 iwl_fw_dump_conf_clear(&mvm->fwrt);
1735 iwl_trans_stop_device(mvm->trans);
1736}
1737
1738
1739void iwl_mvm_start_mac_queues(struct iwl_mvm *mvm, unsigned long mq);
1740void iwl_mvm_stop_mac_queues(struct iwl_mvm *mvm, unsigned long mq);
1741
1742
1743int iwl_mvm_reconfig_scd(struct iwl_mvm *mvm, int queue, int fifo, int sta_id,
1744 int tid, int frame_limit, u16 ssn);
1745
1746
1747void iwl_mvm_tt_tx_backoff(struct iwl_mvm *mvm, u32 backoff);
1748void iwl_mvm_tt_temp_changed(struct iwl_mvm *mvm, u32 temp);
1749void iwl_mvm_temp_notif(struct iwl_mvm *mvm,
1750 struct iwl_rx_cmd_buffer *rxb);
1751void iwl_mvm_tt_handler(struct iwl_mvm *mvm);
1752void iwl_mvm_thermal_initialize(struct iwl_mvm *mvm, u32 min_backoff);
1753void iwl_mvm_thermal_exit(struct iwl_mvm *mvm);
1754void iwl_mvm_set_hw_ctkill_state(struct iwl_mvm *mvm, bool state);
1755int iwl_mvm_get_temp(struct iwl_mvm *mvm, s32 *temp);
1756void iwl_mvm_ct_kill_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
1757void iwl_mvm_enter_ctkill(struct iwl_mvm *mvm);
1758int iwl_mvm_send_temp_report_ths_cmd(struct iwl_mvm *mvm);
1759int iwl_mvm_ctdp_command(struct iwl_mvm *mvm, u32 op, u32 budget);
1760
1761
1762struct iwl_mcc_update_resp *
1763iwl_mvm_update_mcc(struct iwl_mvm *mvm, const char *alpha2,
1764 enum iwl_mcc_source src_id);
1765int iwl_mvm_init_mcc(struct iwl_mvm *mvm);
1766void iwl_mvm_rx_chub_update_mcc(struct iwl_mvm *mvm,
1767 struct iwl_rx_cmd_buffer *rxb);
1768struct ieee80211_regdomain *iwl_mvm_get_regdomain(struct wiphy *wiphy,
1769 const char *alpha2,
1770 enum iwl_mcc_source src_id,
1771 bool *changed);
1772struct ieee80211_regdomain *iwl_mvm_get_current_regdomain(struct iwl_mvm *mvm,
1773 bool *changed);
1774int iwl_mvm_init_fw_regd(struct iwl_mvm *mvm);
1775void iwl_mvm_update_changed_regdom(struct iwl_mvm *mvm);
1776
1777
1778int iwl_mvm_sf_update(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1779 bool added_vif);
1780
1781
1782
1783
1784
1785
1786
1787#define IWL_MVM_TDLS_FW_TID 4
1788
1789int iwl_mvm_tdls_sta_count(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1790void iwl_mvm_teardown_tdls_peers(struct iwl_mvm *mvm);
1791void iwl_mvm_recalc_tdls_state(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1792 bool sta_added);
1793void iwl_mvm_mac_mgd_protect_tdls_discover(struct ieee80211_hw *hw,
1794 struct ieee80211_vif *vif);
1795int iwl_mvm_tdls_channel_switch(struct ieee80211_hw *hw,
1796 struct ieee80211_vif *vif,
1797 struct ieee80211_sta *sta, u8 oper_class,
1798 struct cfg80211_chan_def *chandef,
1799 struct sk_buff *tmpl_skb, u32 ch_sw_tm_ie);
1800void iwl_mvm_tdls_recv_channel_switch(struct ieee80211_hw *hw,
1801 struct ieee80211_vif *vif,
1802 struct ieee80211_tdls_ch_sw_params *params);
1803void iwl_mvm_tdls_cancel_channel_switch(struct ieee80211_hw *hw,
1804 struct ieee80211_vif *vif,
1805 struct ieee80211_sta *sta);
1806void iwl_mvm_rx_tdls_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
1807void iwl_mvm_tdls_ch_switch_work(struct work_struct *work);
1808
1809void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm,
1810 struct iwl_mvm_internal_rxq_notif *notif,
1811 u32 size);
1812void iwl_mvm_reorder_timer_expired(unsigned long data);
1813struct ieee80211_vif *iwl_mvm_get_bss_vif(struct iwl_mvm *mvm);
1814bool iwl_mvm_is_vif_assoc(struct iwl_mvm *mvm);
1815
1816void iwl_mvm_inactivity_check(struct iwl_mvm *mvm);
1817
1818void iwl_mvm_nic_restart(struct iwl_mvm *mvm, bool fw_error);
1819unsigned int iwl_mvm_get_wd_timeout(struct iwl_mvm *mvm,
1820 struct ieee80211_vif *vif,
1821 bool tdls, bool cmd_q);
1822void iwl_mvm_connection_loss(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1823 const char *errmsg);
1824
1825
1826int iwl_mvm_send_lqm_cmd(struct ieee80211_vif *vif,
1827 enum iwl_lqm_cmd_operatrions operation,
1828 u32 duration, u32 timeout);
1829bool iwl_mvm_lqm_active(struct iwl_mvm *mvm);
1830
1831int iwl_mvm_sar_select_profile(struct iwl_mvm *mvm, int prof_a, int prof_b);
1832int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm);
1833
1834#endif
1835