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