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