0001
0002
0003
0004
0005
0006
0007 #ifndef __IWL_MVM_H__
0008 #define __IWL_MVM_H__
0009
0010 #include <linux/list.h>
0011 #include <linux/spinlock.h>
0012 #include <linux/leds.h>
0013 #include <linux/in6.h>
0014
0015 #ifdef CONFIG_THERMAL
0016 #include <linux/thermal.h>
0017 #endif
0018
0019 #include <linux/ktime.h>
0020
0021 #include "iwl-op-mode.h"
0022 #include "iwl-trans.h"
0023 #include "fw/notif-wait.h"
0024 #include "iwl-eeprom-parse.h"
0025 #include "fw/file.h"
0026 #include "iwl-config.h"
0027 #include "sta.h"
0028 #include "fw-api.h"
0029 #include "constants.h"
0030 #include "fw/runtime.h"
0031 #include "fw/dbg.h"
0032 #include "fw/acpi.h"
0033 #include "mei/iwl-mei.h"
0034 #include "iwl-nvm-parse.h"
0035
0036 #include <linux/average.h>
0037
0038 #define IWL_MVM_MAX_ADDRESSES 5
0039
0040 #define IWL_RSSI_OFFSET 50
0041 #define IWL_MVM_MISSED_BEACONS_THRESHOLD 8
0042 #define IWL_MVM_MISSED_BEACONS_THRESHOLD_LONG 16
0043
0044
0045 #define MSEC_TO_TU(_msec) (_msec*1000/1024)
0046
0047
0048
0049
0050
0051 #define IWL_MVM_CHANNEL_SWITCH_TIME_GO 40
0052
0053
0054
0055
0056
0057 #define IWL_MVM_CHANNEL_SWITCH_TIME_CLIENT 10
0058
0059
0060
0061
0062
0063 #define IWL_MVM_CHANNEL_SWITCH_MARGIN 4
0064
0065
0066
0067
0068
0069 #define IWL_MVM_CS_UNBLOCK_TX_TIMEOUT 3
0070
0071
0072 #define IWL_MVM_OFFCHANNEL_QUEUE 0
0073
0074 extern const struct ieee80211_ops iwl_mvm_hw_ops;
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084 struct iwl_mvm_mod_params {
0085 bool init_dbg;
0086 int power_scheme;
0087 };
0088 extern struct iwl_mvm_mod_params iwlmvm_mod_params;
0089
0090 struct iwl_mvm_phy_ctxt {
0091 u16 id;
0092 u16 color;
0093 u32 ref;
0094
0095 enum nl80211_chan_width width;
0096
0097 struct ieee80211_channel *channel;
0098
0099
0100 u32 center_freq1;
0101 };
0102
0103 struct iwl_mvm_time_event_data {
0104 struct ieee80211_vif *vif;
0105 struct list_head list;
0106 unsigned long end_jiffies;
0107 u32 duration;
0108 bool running;
0109 u32 uid;
0110
0111
0112
0113
0114
0115
0116 u32 id;
0117 };
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127 enum iwl_power_scheme {
0128 IWL_POWER_SCHEME_CAM = 1,
0129 IWL_POWER_SCHEME_BPS,
0130 IWL_POWER_SCHEME_LP
0131 };
0132
0133 #define IWL_CONN_MAX_LISTEN_INTERVAL 10
0134 #define IWL_UAPSD_MAX_SP IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL
0135
0136 #ifdef CONFIG_IWLWIFI_DEBUGFS
0137 enum iwl_dbgfs_pm_mask {
0138 MVM_DEBUGFS_PM_KEEP_ALIVE = BIT(0),
0139 MVM_DEBUGFS_PM_SKIP_OVER_DTIM = BIT(1),
0140 MVM_DEBUGFS_PM_SKIP_DTIM_PERIODS = BIT(2),
0141 MVM_DEBUGFS_PM_RX_DATA_TIMEOUT = BIT(3),
0142 MVM_DEBUGFS_PM_TX_DATA_TIMEOUT = BIT(4),
0143 MVM_DEBUGFS_PM_LPRX_ENA = BIT(6),
0144 MVM_DEBUGFS_PM_LPRX_RSSI_THRESHOLD = BIT(7),
0145 MVM_DEBUGFS_PM_SNOOZE_ENABLE = BIT(8),
0146 MVM_DEBUGFS_PM_UAPSD_MISBEHAVING = BIT(9),
0147 MVM_DEBUGFS_PM_USE_PS_POLL = BIT(10),
0148 };
0149
0150 struct iwl_dbgfs_pm {
0151 u16 keep_alive_seconds;
0152 u32 rx_data_timeout;
0153 u32 tx_data_timeout;
0154 bool skip_over_dtim;
0155 u8 skip_dtim_periods;
0156 bool lprx_ena;
0157 u32 lprx_rssi_threshold;
0158 bool snooze_ena;
0159 bool uapsd_misbehaving;
0160 bool use_ps_poll;
0161 int mask;
0162 };
0163
0164
0165
0166 enum iwl_dbgfs_bf_mask {
0167 MVM_DEBUGFS_BF_ENERGY_DELTA = BIT(0),
0168 MVM_DEBUGFS_BF_ROAMING_ENERGY_DELTA = BIT(1),
0169 MVM_DEBUGFS_BF_ROAMING_STATE = BIT(2),
0170 MVM_DEBUGFS_BF_TEMP_THRESHOLD = BIT(3),
0171 MVM_DEBUGFS_BF_TEMP_FAST_FILTER = BIT(4),
0172 MVM_DEBUGFS_BF_TEMP_SLOW_FILTER = BIT(5),
0173 MVM_DEBUGFS_BF_ENABLE_BEACON_FILTER = BIT(6),
0174 MVM_DEBUGFS_BF_DEBUG_FLAG = BIT(7),
0175 MVM_DEBUGFS_BF_ESCAPE_TIMER = BIT(8),
0176 MVM_DEBUGFS_BA_ESCAPE_TIMER = BIT(9),
0177 MVM_DEBUGFS_BA_ENABLE_BEACON_ABORT = BIT(10),
0178 };
0179
0180 struct iwl_dbgfs_bf {
0181 u32 bf_energy_delta;
0182 u32 bf_roaming_energy_delta;
0183 u32 bf_roaming_state;
0184 u32 bf_temp_threshold;
0185 u32 bf_temp_fast_filter;
0186 u32 bf_temp_slow_filter;
0187 u32 bf_enable_beacon_filter;
0188 u32 bf_debug_flag;
0189 u32 bf_escape_timer;
0190 u32 ba_escape_timer;
0191 u32 ba_enable_beacon_abort;
0192 int mask;
0193 };
0194 #endif
0195
0196 enum iwl_mvm_smps_type_request {
0197 IWL_MVM_SMPS_REQ_BT_COEX,
0198 IWL_MVM_SMPS_REQ_TT,
0199 IWL_MVM_SMPS_REQ_PROT,
0200 IWL_MVM_SMPS_REQ_FW,
0201 NUM_IWL_MVM_SMPS_REQ,
0202 };
0203
0204 enum iwl_bt_force_ant_mode {
0205 BT_FORCE_ANT_DIS = 0,
0206 BT_FORCE_ANT_AUTO,
0207 BT_FORCE_ANT_BT,
0208 BT_FORCE_ANT_WIFI,
0209
0210 BT_FORCE_ANT_MAX,
0211 };
0212
0213
0214
0215
0216
0217
0218
0219
0220 enum iwl_mvm_low_latency_force {
0221 LOW_LATENCY_FORCE_UNSET,
0222 LOW_LATENCY_FORCE_ON,
0223 LOW_LATENCY_FORCE_OFF,
0224 NUM_LOW_LATENCY_FORCE
0225 };
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239 enum iwl_mvm_low_latency_cause {
0240 LOW_LATENCY_TRAFFIC = BIT(0),
0241 LOW_LATENCY_DEBUGFS = BIT(1),
0242 LOW_LATENCY_VCMD = BIT(2),
0243 LOW_LATENCY_VIF_TYPE = BIT(3),
0244 LOW_LATENCY_DEBUGFS_FORCE_ENABLE = BIT(4),
0245 LOW_LATENCY_DEBUGFS_FORCE = BIT(5),
0246 };
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258 struct iwl_mvm_vif_bf_data {
0259 bool bf_enabled;
0260 bool ba_enabled;
0261 int ave_beacon_signal;
0262 int last_cqm_event;
0263 int bt_coex_min_thold;
0264 int bt_coex_max_thold;
0265 int last_bt_coex_event;
0266 };
0267
0268
0269
0270
0271
0272
0273
0274 struct iwl_probe_resp_data {
0275 struct rcu_head rcu_head;
0276 struct iwl_probe_resp_data_notif notif;
0277 int noa_len;
0278 };
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316 struct iwl_mvm_vif {
0317 struct iwl_mvm *mvm;
0318 u16 id;
0319 u16 color;
0320 u8 ap_sta_id;
0321
0322 u8 bssid[ETH_ALEN];
0323 bool associated;
0324 u8 ap_assoc_sta_count;
0325
0326 u16 cab_queue;
0327
0328 bool uploaded;
0329 bool ap_ibss_active;
0330 bool pm_enabled;
0331 bool monitor_active;
0332 u8 low_latency: 6;
0333 u8 low_latency_actual: 1;
0334 u8 authorized:1;
0335 bool ps_disabled;
0336 struct iwl_mvm_vif_bf_data bf_data;
0337
0338 struct {
0339 u32 num_beacons, accu_num_beacons;
0340 u8 avg_signal;
0341 } beacon_stats;
0342
0343 u32 ap_beacon_time;
0344
0345 enum iwl_tsf_id tsf_id;
0346
0347
0348
0349
0350
0351
0352 struct ieee80211_tx_queue_params queue_params[IEEE80211_NUM_ACS];
0353 struct iwl_mvm_time_event_data time_event_data;
0354 struct iwl_mvm_time_event_data hs_time_event_data;
0355
0356 struct iwl_mvm_int_sta bcast_sta;
0357 struct iwl_mvm_int_sta mcast_sta;
0358
0359
0360
0361
0362
0363 struct iwl_mvm_phy_ctxt *phy_ctxt;
0364
0365 #ifdef CONFIG_PM
0366
0367 struct {
0368 u8 kck[NL80211_KCK_EXT_LEN];
0369 u8 kek[NL80211_KEK_EXT_LEN];
0370 size_t kek_len;
0371 size_t kck_len;
0372 u32 akm;
0373 __le64 replay_ctr;
0374 bool valid;
0375 } rekey_data;
0376
0377 int tx_key_idx;
0378
0379 bool seqno_valid;
0380 u16 seqno;
0381 #endif
0382
0383 #if IS_ENABLED(CONFIG_IPV6)
0384
0385 struct in6_addr target_ipv6_addrs[IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_MAX];
0386 unsigned long tentative_addrs[BITS_TO_LONGS(IWL_PROTO_OFFLOAD_NUM_IPV6_ADDRS_MAX)];
0387 int num_target_ipv6_addrs;
0388 #endif
0389
0390 #ifdef CONFIG_IWLWIFI_DEBUGFS
0391 struct dentry *dbgfs_dir;
0392 struct dentry *dbgfs_slink;
0393 struct iwl_dbgfs_pm dbgfs_pm;
0394 struct iwl_dbgfs_bf dbgfs_bf;
0395 struct iwl_mac_power_cmd mac_pwr_cmd;
0396 int dbgfs_quota_min;
0397 #endif
0398
0399 enum ieee80211_smps_mode smps_requests[NUM_IWL_MVM_SMPS_REQ];
0400
0401
0402 u8 uapsd_misbehaving_bssid[ETH_ALEN];
0403
0404 struct delayed_work uapsd_nonagg_detected_wk;
0405
0406
0407 bool csa_countdown;
0408 bool csa_failed;
0409 u16 csa_target_freq;
0410 u16 csa_count;
0411 u16 csa_misbehave;
0412 struct delayed_work csa_work;
0413
0414
0415 bool csa_bcn_pending;
0416
0417
0418 netdev_features_t features;
0419
0420 struct iwl_probe_resp_data __rcu *probe_resp_data;
0421
0422
0423 struct ieee80211_key_conf *ap_early_keys[4];
0424
0425
0426 bool he_ru_2mhz_block;
0427
0428 struct {
0429 struct ieee80211_key_conf __rcu *keys[2];
0430 } bcn_prot;
0431 };
0432
0433 static inline struct iwl_mvm_vif *
0434 iwl_mvm_vif_from_mac80211(struct ieee80211_vif *vif)
0435 {
0436 return (void *)vif->drv_priv;
0437 }
0438
0439 extern const u8 tid_to_mac80211_ac[];
0440
0441 #define IWL_MVM_SCAN_STOPPING_SHIFT 8
0442
0443 enum iwl_scan_status {
0444 IWL_MVM_SCAN_REGULAR = BIT(0),
0445 IWL_MVM_SCAN_SCHED = BIT(1),
0446 IWL_MVM_SCAN_NETDETECT = BIT(2),
0447
0448 IWL_MVM_SCAN_STOPPING_REGULAR = BIT(8),
0449 IWL_MVM_SCAN_STOPPING_SCHED = BIT(9),
0450 IWL_MVM_SCAN_STOPPING_NETDETECT = BIT(10),
0451
0452 IWL_MVM_SCAN_REGULAR_MASK = IWL_MVM_SCAN_REGULAR |
0453 IWL_MVM_SCAN_STOPPING_REGULAR,
0454 IWL_MVM_SCAN_SCHED_MASK = IWL_MVM_SCAN_SCHED |
0455 IWL_MVM_SCAN_STOPPING_SCHED,
0456 IWL_MVM_SCAN_NETDETECT_MASK = IWL_MVM_SCAN_NETDETECT |
0457 IWL_MVM_SCAN_STOPPING_NETDETECT,
0458
0459 IWL_MVM_SCAN_STOPPING_MASK = 0xff << IWL_MVM_SCAN_STOPPING_SHIFT,
0460 IWL_MVM_SCAN_MASK = 0xff,
0461 };
0462
0463 enum iwl_mvm_scan_type {
0464 IWL_SCAN_TYPE_NOT_SET,
0465 IWL_SCAN_TYPE_UNASSOC,
0466 IWL_SCAN_TYPE_WILD,
0467 IWL_SCAN_TYPE_MILD,
0468 IWL_SCAN_TYPE_FRAGMENTED,
0469 IWL_SCAN_TYPE_FAST_BALANCE,
0470 };
0471
0472 enum iwl_mvm_sched_scan_pass_all_states {
0473 SCHED_SCAN_PASS_ALL_DISABLED,
0474 SCHED_SCAN_PASS_ALL_ENABLED,
0475 SCHED_SCAN_PASS_ALL_FOUND,
0476 };
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486
0487 struct iwl_mvm_tt_mgmt {
0488 struct delayed_work ct_kill_exit;
0489 bool dynamic_smps;
0490 u32 tx_backoff;
0491 u32 min_backoff;
0492 struct iwl_tt_params params;
0493 bool throttle;
0494 };
0495
0496 #ifdef CONFIG_THERMAL
0497
0498
0499
0500
0501
0502
0503 struct iwl_mvm_thermal_device {
0504 s16 temp_trips[IWL_MAX_DTS_TRIPS];
0505 u8 fw_trips_index[IWL_MAX_DTS_TRIPS];
0506 struct thermal_zone_device *tzone;
0507 };
0508
0509
0510
0511
0512
0513
0514 struct iwl_mvm_cooling_device {
0515 u32 cur_state;
0516 struct thermal_cooling_device *cdev;
0517 };
0518 #endif
0519
0520 #define IWL_MVM_NUM_LAST_FRAMES_UCODE_RATES 8
0521
0522 struct iwl_mvm_frame_stats {
0523 u32 legacy_frames;
0524 u32 ht_frames;
0525 u32 vht_frames;
0526 u32 bw_20_frames;
0527 u32 bw_40_frames;
0528 u32 bw_80_frames;
0529 u32 bw_160_frames;
0530 u32 sgi_frames;
0531 u32 ngi_frames;
0532 u32 siso_frames;
0533 u32 mimo2_frames;
0534 u32 agg_frames;
0535 u32 ampdu_count;
0536 u32 success_frames;
0537 u32 fail_frames;
0538 u32 last_rates[IWL_MVM_NUM_LAST_FRAMES_UCODE_RATES];
0539 int last_frame_idx;
0540 };
0541
0542 #define IWL_MVM_DEBUG_SET_TEMPERATURE_DISABLE 0xff
0543 #define IWL_MVM_DEBUG_SET_TEMPERATURE_MIN -100
0544 #define IWL_MVM_DEBUG_SET_TEMPERATURE_MAX 200
0545
0546 enum iwl_mvm_tdls_cs_state {
0547 IWL_MVM_TDLS_SW_IDLE = 0,
0548 IWL_MVM_TDLS_SW_REQ_SENT,
0549 IWL_MVM_TDLS_SW_RESP_RCVD,
0550 IWL_MVM_TDLS_SW_REQ_RCVD,
0551 IWL_MVM_TDLS_SW_ACTIVE,
0552 };
0553
0554 enum iwl_mvm_traffic_load {
0555 IWL_MVM_TRAFFIC_LOW,
0556 IWL_MVM_TRAFFIC_MEDIUM,
0557 IWL_MVM_TRAFFIC_HIGH,
0558 };
0559
0560 DECLARE_EWMA(rate, 16, 16)
0561
0562 struct iwl_mvm_tcm_mac {
0563 struct {
0564 u32 pkts[IEEE80211_NUM_ACS];
0565 u32 airtime;
0566 } tx;
0567 struct {
0568 u32 pkts[IEEE80211_NUM_ACS];
0569 u32 airtime;
0570 u32 last_ampdu_ref;
0571 } rx;
0572 struct {
0573
0574 u64 rx_bytes;
0575 struct ewma_rate rate;
0576 bool detected;
0577 } uapsd_nonagg_detect;
0578 bool opened_rx_ba_sessions;
0579 };
0580
0581 struct iwl_mvm_tcm {
0582 struct delayed_work work;
0583 spinlock_t lock;
0584 unsigned long ts;
0585 unsigned long ll_ts;
0586 unsigned long uapsd_nonagg_ts;
0587 bool paused;
0588 struct iwl_mvm_tcm_mac data[NUM_MAC_INDEX_DRIVER];
0589 struct {
0590 u32 elapsed;
0591 u32 airtime[NUM_MAC_INDEX_DRIVER];
0592 enum iwl_mvm_traffic_load load[NUM_MAC_INDEX_DRIVER];
0593 enum iwl_mvm_traffic_load band_load[NUM_NL80211_BANDS];
0594 enum iwl_mvm_traffic_load global_load;
0595 bool low_latency[NUM_MAC_INDEX_DRIVER];
0596 bool change[NUM_MAC_INDEX_DRIVER];
0597 } result;
0598 };
0599
0600
0601
0602
0603
0604
0605
0606
0607
0608
0609
0610
0611
0612
0613
0614
0615
0616
0617
0618
0619
0620
0621 struct iwl_mvm_reorder_buffer {
0622 u16 head_sn;
0623 u16 num_stored;
0624 u16 buf_size;
0625 int queue;
0626 u16 last_amsdu;
0627 u8 last_sub_index;
0628 struct timer_list reorder_timer;
0629 bool removed;
0630 bool valid;
0631 spinlock_t lock;
0632 struct iwl_mvm *mvm;
0633 unsigned int consec_oldsn_drops;
0634 u32 consec_oldsn_ampdu_gp2;
0635 unsigned int consec_oldsn_prev_drop:1;
0636 } ____cacheline_aligned_in_smp;
0637
0638
0639
0640
0641
0642
0643 struct _iwl_mvm_reorder_buf_entry {
0644 struct sk_buff_head frames;
0645 unsigned long reorder_time;
0646 };
0647
0648
0649 struct iwl_mvm_reorder_buf_entry {
0650 struct _iwl_mvm_reorder_buf_entry e;
0651 }
0652 #ifndef __CHECKER__
0653
0654 __aligned(roundup_pow_of_two(sizeof(struct _iwl_mvm_reorder_buf_entry)))
0655 #endif
0656 ;
0657
0658
0659
0660
0661
0662
0663
0664
0665
0666
0667
0668
0669
0670
0671
0672 struct iwl_mvm_baid_data {
0673 struct rcu_head rcu_head;
0674 u8 sta_id;
0675 u8 tid;
0676 u8 baid;
0677 u16 timeout;
0678 u16 entries_per_queue;
0679 unsigned long last_rx;
0680 struct timer_list session_timer;
0681 struct iwl_mvm_baid_data __rcu **rcu_ptr;
0682 struct iwl_mvm *mvm;
0683 struct iwl_mvm_reorder_buffer reorder_buf[IWL_MAX_RX_HW_QUEUES];
0684 struct iwl_mvm_reorder_buf_entry entries[];
0685 };
0686
0687 static inline struct iwl_mvm_baid_data *
0688 iwl_mvm_baid_data_from_reorder_buf(struct iwl_mvm_reorder_buffer *buf)
0689 {
0690 return (void *)((u8 *)buf -
0691 offsetof(struct iwl_mvm_baid_data, reorder_buf) -
0692 sizeof(*buf) * buf->queue);
0693 }
0694
0695
0696
0697
0698
0699
0700
0701
0702
0703
0704
0705
0706
0707
0708
0709
0710
0711
0712
0713
0714
0715 enum iwl_mvm_queue_status {
0716 IWL_MVM_QUEUE_FREE,
0717 IWL_MVM_QUEUE_RESERVED,
0718 IWL_MVM_QUEUE_READY,
0719 IWL_MVM_QUEUE_SHARED,
0720 };
0721
0722 #define IWL_MVM_DQA_QUEUE_TIMEOUT (5 * HZ)
0723 #define IWL_MVM_INVALID_QUEUE 0xFFFF
0724
0725 #define IWL_MVM_NUM_CIPHERS 10
0726
0727
0728 struct iwl_mvm_txq {
0729 struct list_head list;
0730 u16 txq_id;
0731 atomic_t tx_request;
0732 bool stopped;
0733 };
0734
0735 static inline struct iwl_mvm_txq *
0736 iwl_mvm_txq_from_mac80211(struct ieee80211_txq *txq)
0737 {
0738 return (void *)txq->drv_priv;
0739 }
0740
0741 static inline struct iwl_mvm_txq *
0742 iwl_mvm_txq_from_tid(struct ieee80211_sta *sta, u8 tid)
0743 {
0744 if (tid == IWL_MAX_TID_COUNT)
0745 tid = IEEE80211_NUM_TIDS;
0746
0747 return (void *)sta->txq[tid]->drv_priv;
0748 }
0749
0750
0751
0752
0753
0754
0755
0756 struct iwl_mvm_tvqm_txq_info {
0757 u8 sta_id;
0758 u8 txq_tid;
0759 };
0760
0761 struct iwl_mvm_dqa_txq_info {
0762 u8 ra_sta_id;
0763 bool reserved;
0764 u8 mac80211_ac;
0765 u8 txq_tid;
0766 u16 tid_bitmap;
0767
0768 unsigned long last_frame_time[IWL_MAX_TID_COUNT + 1];
0769 enum iwl_mvm_queue_status status;
0770 };
0771
0772 struct iwl_mvm {
0773
0774 struct device *dev;
0775
0776 struct iwl_trans *trans;
0777 const struct iwl_fw *fw;
0778 const struct iwl_cfg *cfg;
0779 struct iwl_phy_db *phy_db;
0780 struct ieee80211_hw *hw;
0781
0782
0783 struct mutex mutex;
0784 struct list_head async_handlers_list;
0785 spinlock_t async_handlers_lock;
0786 struct work_struct async_handlers_wk;
0787
0788 struct work_struct roc_done_wk;
0789
0790 unsigned long init_status;
0791
0792 unsigned long status;
0793
0794 u32 queue_sync_cookie;
0795 unsigned long queue_sync_state;
0796
0797
0798
0799
0800 struct iwl_mvm_vif *bf_allowed_vif;
0801
0802 bool hw_registered;
0803 bool rfkill_safe_init_done;
0804
0805 u8 cca_40mhz_workaround;
0806
0807 u32 ampdu_ref;
0808 bool ampdu_toggle;
0809
0810 struct iwl_notif_wait_data notif_wait;
0811
0812 union {
0813 struct mvm_statistics_rx_v3 rx_stats_v3;
0814 struct mvm_statistics_rx rx_stats;
0815 };
0816
0817 struct {
0818 u64 rx_time;
0819 u64 tx_time;
0820 u64 on_time_rf;
0821 u64 on_time_scan;
0822 } radio_stats, accu_radio_stats;
0823
0824 struct list_head add_stream_txqs;
0825 union {
0826 struct iwl_mvm_dqa_txq_info queue_info[IWL_MAX_HW_QUEUES];
0827 struct iwl_mvm_tvqm_txq_info tvqm_info[IWL_MAX_TVQM_QUEUES];
0828 };
0829 struct work_struct add_stream_wk;
0830
0831 const char *nvm_file_name;
0832 struct iwl_nvm_data *nvm_data;
0833 struct iwl_mei_nvm *mei_nvm_data;
0834 struct iwl_mvm_csme_conn_info __rcu *csme_conn_info;
0835 bool mei_rfkill_blocked;
0836 bool mei_registered;
0837 struct work_struct sap_connected_wk;
0838
0839
0840
0841
0842
0843 struct iwl_nvm_data *temp_nvm_data;
0844
0845
0846 struct iwl_nvm_section nvm_sections[NVM_MAX_NUM_SECTIONS];
0847
0848 struct iwl_fw_runtime fwrt;
0849
0850
0851 struct mac_address addresses[IWL_MVM_MAX_ADDRESSES];
0852
0853
0854 struct iwl_rx_phy_info last_phy_info;
0855 struct ieee80211_sta __rcu *fw_id_to_mac_id[IWL_MVM_STATION_COUNT_MAX];
0856 u8 rx_ba_sessions;
0857
0858
0859 u32 rts_threshold;
0860
0861
0862 unsigned int scan_status;
0863 void *scan_cmd;
0864 struct iwl_mcast_filter_cmd *mcast_filter_cmd;
0865
0866 enum iwl_mvm_scan_type scan_type;
0867 enum iwl_mvm_scan_type hb_scan_type;
0868
0869 enum iwl_mvm_sched_scan_pass_all_states sched_scan_pass_all;
0870 struct delayed_work scan_timeout_dwork;
0871
0872
0873 unsigned int max_scans;
0874
0875
0876 u32 scan_uid_status[IWL_MVM_MAX_UMAC_SCANS];
0877
0878
0879 u64 scan_start;
0880
0881
0882 struct iwl_mvm_vif *scan_vif;
0883
0884
0885 u8 scan_rx_ant;
0886
0887
0888 struct iwl_mvm_int_sta aux_sta;
0889 struct iwl_mvm_int_sta snif_sta;
0890
0891 bool last_ebs_successful;
0892
0893 u8 scan_last_antenna_idx;
0894 u8 mgmt_last_antenna_idx;
0895
0896
0897 enum iwl_sf_state sf_state;
0898
0899
0900
0901
0902
0903 struct dentry *debugfs_dir;
0904 #ifdef CONFIG_IWLWIFI_DEBUGFS
0905 u32 dbgfs_sram_offset, dbgfs_sram_len;
0906 u32 dbgfs_prph_reg_addr;
0907 bool disable_power_off;
0908 bool disable_power_off_d3;
0909 bool beacon_inject_active;
0910
0911 bool scan_iter_notif_enabled;
0912
0913 struct debugfs_blob_wrapper nvm_hw_blob;
0914 struct debugfs_blob_wrapper nvm_sw_blob;
0915 struct debugfs_blob_wrapper nvm_calib_blob;
0916 struct debugfs_blob_wrapper nvm_prod_blob;
0917 struct debugfs_blob_wrapper nvm_phy_sku_blob;
0918 struct debugfs_blob_wrapper nvm_reg_blob;
0919
0920 struct iwl_mvm_frame_stats drv_rx_stats;
0921 spinlock_t drv_stats_lock;
0922 u16 dbgfs_rx_phyinfo;
0923 #endif
0924
0925 struct iwl_mvm_phy_ctxt phy_ctxts[NUM_PHY_CTX];
0926
0927 struct list_head time_event_list;
0928 spinlock_t time_event_lock;
0929
0930
0931
0932
0933
0934 unsigned long fw_key_table[BITS_TO_LONGS(STA_KEY_MAX_NUM)];
0935 u8 fw_key_deleted[STA_KEY_MAX_NUM];
0936
0937 struct ieee80211_vif __rcu *vif_id_to_mac[NUM_MAC_INDEX_DRIVER];
0938
0939
0940 s8 fw_restart;
0941 u8 *error_recovery_buf;
0942
0943 #ifdef CONFIG_IWLWIFI_LEDS
0944 struct led_classdev led;
0945 #endif
0946
0947 struct ieee80211_vif *p2p_device_vif;
0948
0949 #ifdef CONFIG_PM
0950 struct wiphy_wowlan_support wowlan;
0951 int gtk_ivlen, gtk_icvlen, ptk_ivlen, ptk_icvlen;
0952
0953
0954 struct ieee80211_scan_ies nd_ies;
0955 struct cfg80211_match_set *nd_match_sets;
0956 int n_nd_match_sets;
0957 struct ieee80211_channel **nd_channels;
0958 int n_nd_channels;
0959 bool net_detect;
0960 u8 offload_tid;
0961 #ifdef CONFIG_IWLWIFI_DEBUGFS
0962 bool d3_wake_sysassert;
0963 bool d3_test_active;
0964 u32 d3_test_pme_ptr;
0965 struct ieee80211_vif *keep_vif;
0966 u32 last_netdetect_scans;
0967 #endif
0968 #endif
0969
0970 wait_queue_head_t rx_sync_waitq;
0971
0972
0973 struct iwl_bt_coex_profile_notif last_bt_notif;
0974 struct iwl_bt_coex_ci_cmd last_bt_ci_cmd;
0975
0976 u8 bt_tx_prio;
0977 enum iwl_bt_force_ant_mode bt_force_ant_mode;
0978
0979
0980 struct list_head aux_roc_te_list;
0981
0982
0983 struct iwl_mvm_tt_mgmt thermal_throttle;
0984 #ifdef CONFIG_THERMAL
0985 struct iwl_mvm_thermal_device tz_device;
0986 struct iwl_mvm_cooling_device cooling_dev;
0987 #endif
0988
0989 s32 temperature;
0990
0991
0992
0993
0994
0995 bool temperature_test;
0996
0997 bool fw_static_smps_request;
0998
0999 unsigned long bt_coex_last_tcm_ts;
1000 struct iwl_mvm_tcm tcm;
1001
1002 u8 uapsd_noagg_bssid_write_idx;
1003 struct mac_address uapsd_noagg_bssids[IWL_MVM_UAPSD_NOAGG_BSSIDS_NUM]
1004 __aligned(2);
1005
1006 struct iwl_time_quota_cmd last_quota_cmd;
1007
1008 #ifdef CONFIG_NL80211_TESTMODE
1009 u32 noa_duration;
1010 struct ieee80211_vif *noa_vif;
1011 #endif
1012
1013
1014 u16 aux_queue;
1015 u16 snif_queue;
1016 u16 probe_queue;
1017 u16 p2p_dev_queue;
1018
1019
1020 u8 ps_disabled;
1021
1022 u32 ext_clock_valid;
1023
1024
1025 struct ieee80211_vif *csme_vif;
1026 struct ieee80211_vif __rcu *csa_vif;
1027 struct ieee80211_vif __rcu *csa_tx_blocked_vif;
1028 u8 csa_tx_block_bcn_timeout;
1029
1030
1031 u32 ap_last_beacon_gp2;
1032
1033
1034 bool ibss_manager;
1035
1036 bool lar_regdom_set;
1037 enum iwl_mcc_source mcc_src;
1038
1039
1040 struct {
1041 struct delayed_work dwork;
1042 enum iwl_mvm_tdls_cs_state state;
1043
1044
1045
1046
1047
1048 u8 cur_sta_id;
1049
1050
1051 struct {
1052 u8 sta_id;
1053 u8 op_class;
1054 bool initiator;
1055 struct cfg80211_chan_def chandef;
1056 struct sk_buff *skb;
1057 u32 ch_sw_tm_ie;
1058
1059
1060 u32 sent_timestamp;
1061 } peer;
1062 } tdls_cs;
1063
1064
1065 u32 ciphers[IWL_MVM_NUM_CIPHERS];
1066
1067 struct cfg80211_ftm_responder_stats ftm_resp_stats;
1068 struct {
1069 struct cfg80211_pmsr_request *req;
1070 struct wireless_dev *req_wdev;
1071 struct list_head loc_list;
1072 int responses[IWL_MVM_TOF_MAX_APS];
1073 struct {
1074 struct list_head resp;
1075 } smooth;
1076 struct list_head pasn_list;
1077 } ftm_initiator;
1078
1079 struct list_head resp_pasn_list;
1080
1081 struct {
1082 u8 d0i3_resp;
1083 u8 range_resp;
1084 } cmd_ver;
1085
1086 struct ieee80211_vif *nan_vif;
1087 struct iwl_mvm_baid_data __rcu *baid_map[IWL_MAX_BAID];
1088
1089
1090
1091
1092
1093 bool drop_bcn_ap_mode;
1094
1095 struct delayed_work cs_tx_unblock_dwork;
1096
1097
1098 bool monitor_on;
1099
1100
1101 __le16 cur_aid;
1102 u8 cur_bssid[ETH_ALEN];
1103
1104 unsigned long last_6ghz_passive_scan_jiffies;
1105 unsigned long last_reset_or_resume_time_jiffies;
1106
1107 bool sta_remove_requires_queue_remove;
1108 };
1109
1110
1111 #define IWL_OP_MODE_GET_MVM(_iwl_op_mode) \
1112 ((struct iwl_mvm *)(_iwl_op_mode)->op_mode_specific)
1113
1114 #define IWL_MAC80211_GET_MVM(_hw) \
1115 IWL_OP_MODE_GET_MVM((struct iwl_op_mode *)((_hw)->priv))
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133 enum iwl_mvm_status {
1134 IWL_MVM_STATUS_HW_RFKILL,
1135 IWL_MVM_STATUS_HW_CTKILL,
1136 IWL_MVM_STATUS_ROC_RUNNING,
1137 IWL_MVM_STATUS_HW_RESTART_REQUESTED,
1138 IWL_MVM_STATUS_IN_HW_RESTART,
1139 IWL_MVM_STATUS_ROC_AUX_RUNNING,
1140 IWL_MVM_STATUS_FIRMWARE_RUNNING,
1141 IWL_MVM_STATUS_NEED_FLUSH_P2P,
1142 IWL_MVM_STATUS_IN_D3,
1143 IWL_MVM_STATUS_SUPPRESS_ERROR_LOG_ONCE,
1144 IWL_MVM_STATUS_STARTING,
1145 };
1146
1147 struct iwl_mvm_csme_conn_info {
1148 struct rcu_head rcu_head;
1149 struct iwl_mei_conn_info conn_info;
1150 };
1151
1152
1153 enum iwl_mvm_init_status {
1154 IWL_MVM_INIT_STATUS_THERMAL_INIT_COMPLETE = BIT(0),
1155 IWL_MVM_INIT_STATUS_LEDS_INIT_COMPLETE = BIT(1),
1156 };
1157
1158 static inline bool iwl_mvm_is_radio_killed(struct iwl_mvm *mvm)
1159 {
1160 return test_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status) ||
1161 test_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status);
1162 }
1163
1164 static inline bool iwl_mvm_is_radio_hw_killed(struct iwl_mvm *mvm)
1165 {
1166 return test_bit(IWL_MVM_STATUS_HW_RFKILL, &mvm->status);
1167 }
1168
1169 static inline bool iwl_mvm_firmware_running(struct iwl_mvm *mvm)
1170 {
1171 return test_bit(IWL_MVM_STATUS_FIRMWARE_RUNNING, &mvm->status);
1172 }
1173
1174
1175
1176
1177 static inline struct iwl_mvm_sta *
1178 iwl_mvm_sta_from_staid_rcu(struct iwl_mvm *mvm, u8 sta_id)
1179 {
1180 struct ieee80211_sta *sta;
1181
1182 if (sta_id >= mvm->fw->ucode_capa.num_stations)
1183 return NULL;
1184
1185 sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
1186
1187
1188 if (IS_ERR_OR_NULL(sta))
1189 return NULL;
1190
1191 return iwl_mvm_sta_from_mac80211(sta);
1192 }
1193
1194 static inline struct iwl_mvm_sta *
1195 iwl_mvm_sta_from_staid_protected(struct iwl_mvm *mvm, u8 sta_id)
1196 {
1197 struct ieee80211_sta *sta;
1198
1199 if (sta_id >= mvm->fw->ucode_capa.num_stations)
1200 return NULL;
1201
1202 sta = rcu_dereference_protected(mvm->fw_id_to_mac_id[sta_id],
1203 lockdep_is_held(&mvm->mutex));
1204
1205
1206 if (IS_ERR_OR_NULL(sta))
1207 return NULL;
1208
1209 return iwl_mvm_sta_from_mac80211(sta);
1210 }
1211
1212 static inline struct ieee80211_vif *
1213 iwl_mvm_rcu_dereference_vif_id(struct iwl_mvm *mvm, u8 vif_id, bool rcu)
1214 {
1215 if (WARN_ON(vif_id >= ARRAY_SIZE(mvm->vif_id_to_mac)))
1216 return NULL;
1217
1218 if (rcu)
1219 return rcu_dereference(mvm->vif_id_to_mac[vif_id]);
1220
1221 return rcu_dereference_protected(mvm->vif_id_to_mac[vif_id],
1222 lockdep_is_held(&mvm->mutex));
1223 }
1224
1225 static inline bool iwl_mvm_is_adaptive_dwell_supported(struct iwl_mvm *mvm)
1226 {
1227 return fw_has_api(&mvm->fw->ucode_capa,
1228 IWL_UCODE_TLV_API_ADAPTIVE_DWELL);
1229 }
1230
1231 static inline bool iwl_mvm_is_adaptive_dwell_v2_supported(struct iwl_mvm *mvm)
1232 {
1233 return fw_has_api(&mvm->fw->ucode_capa,
1234 IWL_UCODE_TLV_API_ADAPTIVE_DWELL_V2);
1235 }
1236
1237 static inline bool iwl_mvm_is_adwell_hb_ap_num_supported(struct iwl_mvm *mvm)
1238 {
1239 return fw_has_api(&mvm->fw->ucode_capa,
1240 IWL_UCODE_TLV_API_ADWELL_HB_DEF_N_AP);
1241 }
1242
1243 static inline bool iwl_mvm_is_oce_supported(struct iwl_mvm *mvm)
1244 {
1245
1246 return fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_OCE);
1247 }
1248
1249 static inline bool iwl_mvm_is_frag_ebs_supported(struct iwl_mvm *mvm)
1250 {
1251 return fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_FRAG_EBS);
1252 }
1253
1254 static inline bool iwl_mvm_is_short_beacon_notif_supported(struct iwl_mvm *mvm)
1255 {
1256 return fw_has_api(&mvm->fw->ucode_capa,
1257 IWL_UCODE_TLV_API_SHORT_BEACON_NOTIF);
1258 }
1259
1260 static inline bool iwl_mvm_is_dqa_data_queue(struct iwl_mvm *mvm, u8 queue)
1261 {
1262 return (queue >= IWL_MVM_DQA_MIN_DATA_QUEUE) &&
1263 (queue <= IWL_MVM_DQA_MAX_DATA_QUEUE);
1264 }
1265
1266 static inline bool iwl_mvm_is_dqa_mgmt_queue(struct iwl_mvm *mvm, u8 queue)
1267 {
1268 return (queue >= IWL_MVM_DQA_MIN_MGMT_QUEUE) &&
1269 (queue <= IWL_MVM_DQA_MAX_MGMT_QUEUE);
1270 }
1271
1272 static inline bool iwl_mvm_is_lar_supported(struct iwl_mvm *mvm)
1273 {
1274 bool nvm_lar = mvm->nvm_data->lar_enabled;
1275 bool tlv_lar = fw_has_capa(&mvm->fw->ucode_capa,
1276 IWL_UCODE_TLV_CAPA_LAR_SUPPORT);
1277
1278
1279
1280
1281
1282 if (mvm->cfg->nvm_type == IWL_NVM_EXT)
1283 return nvm_lar && tlv_lar;
1284 else
1285 return tlv_lar;
1286 }
1287
1288 static inline bool iwl_mvm_is_wifi_mcc_supported(struct iwl_mvm *mvm)
1289 {
1290 return fw_has_api(&mvm->fw->ucode_capa,
1291 IWL_UCODE_TLV_API_WIFI_MCC_UPDATE) ||
1292 fw_has_capa(&mvm->fw->ucode_capa,
1293 IWL_UCODE_TLV_CAPA_LAR_MULTI_MCC);
1294 }
1295
1296 static inline bool iwl_mvm_bt_is_rrc_supported(struct iwl_mvm *mvm)
1297 {
1298 return fw_has_capa(&mvm->fw->ucode_capa,
1299 IWL_UCODE_TLV_CAPA_BT_COEX_RRC) &&
1300 IWL_MVM_BT_COEX_RRC;
1301 }
1302
1303 static inline bool iwl_mvm_is_csum_supported(struct iwl_mvm *mvm)
1304 {
1305 return fw_has_capa(&mvm->fw->ucode_capa,
1306 IWL_UCODE_TLV_CAPA_CSUM_SUPPORT) &&
1307 !IWL_MVM_HW_CSUM_DISABLE;
1308 }
1309
1310 static inline bool iwl_mvm_is_mplut_supported(struct iwl_mvm *mvm)
1311 {
1312 return fw_has_capa(&mvm->fw->ucode_capa,
1313 IWL_UCODE_TLV_CAPA_BT_MPLUT_SUPPORT) &&
1314 IWL_MVM_BT_COEX_MPLUT;
1315 }
1316
1317 static inline
1318 bool iwl_mvm_is_p2p_scm_uapsd_supported(struct iwl_mvm *mvm)
1319 {
1320 return fw_has_capa(&mvm->fw->ucode_capa,
1321 IWL_UCODE_TLV_CAPA_P2P_SCM_UAPSD) &&
1322 !(iwlwifi_mod_params.uapsd_disable &
1323 IWL_DISABLE_UAPSD_P2P_CLIENT);
1324 }
1325
1326 static inline bool iwl_mvm_has_new_rx_api(struct iwl_mvm *mvm)
1327 {
1328 return fw_has_capa(&mvm->fw->ucode_capa,
1329 IWL_UCODE_TLV_CAPA_MULTI_QUEUE_RX_SUPPORT);
1330 }
1331
1332 static inline bool iwl_mvm_has_new_tx_api(struct iwl_mvm *mvm)
1333 {
1334
1335 return mvm->trans->trans_cfg->use_tfh;
1336 }
1337
1338 static inline bool iwl_mvm_has_unified_ucode(struct iwl_mvm *mvm)
1339 {
1340
1341 return mvm->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_22000;
1342 }
1343
1344 static inline bool iwl_mvm_is_cdb_supported(struct iwl_mvm *mvm)
1345 {
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355 return fw_has_capa(&mvm->fw->ucode_capa,
1356 IWL_UCODE_TLV_CAPA_CDB_SUPPORT);
1357 }
1358
1359 static inline bool iwl_mvm_cdb_scan_api(struct iwl_mvm *mvm)
1360 {
1361
1362
1363
1364
1365
1366 return mvm->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_22000;
1367 }
1368
1369 static inline bool iwl_mvm_is_scan_ext_chan_supported(struct iwl_mvm *mvm)
1370 {
1371 return fw_has_api(&mvm->fw->ucode_capa,
1372 IWL_UCODE_TLV_API_SCAN_EXT_CHAN_VER);
1373 }
1374
1375
1376 static inline bool iwl_mvm_is_reduced_config_scan_supported(struct iwl_mvm *mvm)
1377 {
1378 return fw_has_api(&mvm->fw->ucode_capa,
1379 IWL_UCODE_TLV_API_REDUCED_SCAN_CONFIG);
1380 }
1381
1382 static inline bool iwl_mvm_is_band_in_rx_supported(struct iwl_mvm *mvm)
1383 {
1384 return fw_has_api(&mvm->fw->ucode_capa,
1385 IWL_UCODE_TLV_API_BAND_IN_RX_DATA);
1386 }
1387
1388 static inline bool iwl_mvm_has_new_rx_stats_api(struct iwl_mvm *mvm)
1389 {
1390 return fw_has_api(&mvm->fw->ucode_capa,
1391 IWL_UCODE_TLV_API_NEW_RX_STATS);
1392 }
1393
1394 static inline bool iwl_mvm_has_quota_low_latency(struct iwl_mvm *mvm)
1395 {
1396 return fw_has_api(&mvm->fw->ucode_capa,
1397 IWL_UCODE_TLV_API_QUOTA_LOW_LATENCY);
1398 }
1399
1400 static inline bool iwl_mvm_has_tlc_offload(const struct iwl_mvm *mvm)
1401 {
1402 return fw_has_capa(&mvm->fw->ucode_capa,
1403 IWL_UCODE_TLV_CAPA_TLC_OFFLOAD);
1404 }
1405
1406 static inline struct agg_tx_status *
1407 iwl_mvm_get_agg_status(struct iwl_mvm *mvm, void *tx_resp)
1408 {
1409 if (iwl_mvm_has_new_tx_api(mvm))
1410 return &((struct iwl_mvm_tx_resp *)tx_resp)->status;
1411 else
1412 return ((struct iwl_mvm_tx_resp_v3 *)tx_resp)->status;
1413 }
1414
1415 static inline bool iwl_mvm_is_tt_in_fw(struct iwl_mvm *mvm)
1416 {
1417
1418
1419
1420
1421 return fw_has_capa(&mvm->fw->ucode_capa,
1422 IWL_UCODE_TLV_CAPA_CT_KILL_BY_FW) &&
1423 fw_has_capa(&mvm->fw->ucode_capa,
1424 IWL_UCODE_TLV_CAPA_TEMP_THS_REPORT_SUPPORT);
1425 }
1426
1427 static inline bool iwl_mvm_is_ctdp_supported(struct iwl_mvm *mvm)
1428 {
1429 return fw_has_capa(&mvm->fw->ucode_capa,
1430 IWL_UCODE_TLV_CAPA_CTDP_SUPPORT);
1431 }
1432
1433 extern const u8 iwl_mvm_ac_to_tx_fifo[];
1434 extern const u8 iwl_mvm_ac_to_gen2_tx_fifo[];
1435
1436 static inline u8 iwl_mvm_mac_ac_to_tx_fifo(struct iwl_mvm *mvm,
1437 enum ieee80211_ac_numbers ac)
1438 {
1439 return iwl_mvm_has_new_tx_api(mvm) ?
1440 iwl_mvm_ac_to_gen2_tx_fifo[ac] : iwl_mvm_ac_to_tx_fifo[ac];
1441 }
1442
1443 struct iwl_rate_info {
1444 u8 plcp;
1445 u8 plcp_siso;
1446 u8 plcp_mimo2;
1447 u8 plcp_mimo3;
1448 u8 ieee;
1449 };
1450
1451 void __iwl_mvm_mac_stop(struct iwl_mvm *mvm);
1452 int __iwl_mvm_mac_start(struct iwl_mvm *mvm);
1453
1454
1455
1456
1457
1458 int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm);
1459
1460
1461 int iwl_mvm_legacy_hw_idx_to_mac80211_idx(u32 rate_n_flags,
1462 enum nl80211_band band);
1463 int iwl_mvm_legacy_rate_to_mac80211_idx(u32 rate_n_flags,
1464 enum nl80211_band band);
1465 void iwl_mvm_hwrate_to_tx_rate(u32 rate_n_flags,
1466 enum nl80211_band band,
1467 struct ieee80211_tx_rate *r);
1468 void iwl_mvm_hwrate_to_tx_rate_v1(u32 rate_n_flags,
1469 enum nl80211_band band,
1470 struct ieee80211_tx_rate *r);
1471 u8 iwl_mvm_mac80211_idx_to_hwrate(const struct iwl_fw *fw, int rate_idx);
1472 u8 iwl_mvm_mac80211_ac_to_ucode_ac(enum ieee80211_ac_numbers ac);
1473
1474 static inline void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm)
1475 {
1476 iwl_fwrt_dump_error_logs(&mvm->fwrt);
1477 }
1478
1479 u8 first_antenna(u8 mask);
1480 u8 iwl_mvm_next_antenna(struct iwl_mvm *mvm, u8 valid, u8 last_idx);
1481 void iwl_mvm_get_sync_time(struct iwl_mvm *mvm, int clock_type, u32 *gp2,
1482 u64 *boottime, ktime_t *realtime);
1483 u32 iwl_mvm_get_systime(struct iwl_mvm *mvm);
1484
1485
1486 int __must_check iwl_mvm_send_cmd(struct iwl_mvm *mvm,
1487 struct iwl_host_cmd *cmd);
1488 int __must_check iwl_mvm_send_cmd_pdu(struct iwl_mvm *mvm, u32 id,
1489 u32 flags, u16 len, const void *data);
1490 int __must_check iwl_mvm_send_cmd_status(struct iwl_mvm *mvm,
1491 struct iwl_host_cmd *cmd,
1492 u32 *status);
1493 int __must_check iwl_mvm_send_cmd_pdu_status(struct iwl_mvm *mvm, u32 id,
1494 u16 len, const void *data,
1495 u32 *status);
1496 int iwl_mvm_tx_skb_sta(struct iwl_mvm *mvm, struct sk_buff *skb,
1497 struct ieee80211_sta *sta);
1498 int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb);
1499 void iwl_mvm_set_tx_cmd(struct iwl_mvm *mvm, struct sk_buff *skb,
1500 struct iwl_tx_cmd *tx_cmd,
1501 struct ieee80211_tx_info *info, u8 sta_id);
1502 void iwl_mvm_set_tx_cmd_rate(struct iwl_mvm *mvm, struct iwl_tx_cmd *tx_cmd,
1503 struct ieee80211_tx_info *info,
1504 struct ieee80211_sta *sta, __le16 fc);
1505 void iwl_mvm_mac_itxq_xmit(struct ieee80211_hw *hw, struct ieee80211_txq *txq);
1506 unsigned int iwl_mvm_max_amsdu_size(struct iwl_mvm *mvm,
1507 struct ieee80211_sta *sta,
1508 unsigned int tid);
1509 u32 iwl_mvm_tx_csum_bz(struct iwl_mvm *mvm, struct sk_buff *skb, bool amsdu);
1510
1511 #ifdef CONFIG_IWLWIFI_DEBUG
1512 const char *iwl_mvm_get_tx_fail_reason(u32 status);
1513 #else
1514 static inline const char *iwl_mvm_get_tx_fail_reason(u32 status) { return ""; }
1515 #endif
1516 int iwl_mvm_flush_tx_path(struct iwl_mvm *mvm, u32 tfd_msk);
1517 int iwl_mvm_flush_sta(struct iwl_mvm *mvm, void *sta, bool internal);
1518 int iwl_mvm_flush_sta_tids(struct iwl_mvm *mvm, u32 sta_id, u16 tids);
1519
1520 void iwl_mvm_async_handlers_purge(struct iwl_mvm *mvm);
1521
1522 static inline void iwl_mvm_set_tx_cmd_ccmp(struct ieee80211_tx_info *info,
1523 struct iwl_tx_cmd *tx_cmd)
1524 {
1525 struct ieee80211_key_conf *keyconf = info->control.hw_key;
1526
1527 tx_cmd->sec_ctl = TX_CMD_SEC_CCM;
1528 memcpy(tx_cmd->key, keyconf->key, keyconf->keylen);
1529 }
1530
1531 static inline void iwl_mvm_wait_for_async_handlers(struct iwl_mvm *mvm)
1532 {
1533 flush_work(&mvm->async_handlers_wk);
1534 }
1535
1536
1537 void iwl_mvm_handle_rx_statistics(struct iwl_mvm *mvm,
1538 struct iwl_rx_packet *pkt);
1539 void iwl_mvm_rx_statistics(struct iwl_mvm *mvm,
1540 struct iwl_rx_cmd_buffer *rxb);
1541 int iwl_mvm_request_statistics(struct iwl_mvm *mvm, bool clear);
1542 void iwl_mvm_accu_radio_stats(struct iwl_mvm *mvm);
1543
1544
1545 int iwl_nvm_init(struct iwl_mvm *mvm);
1546 int iwl_mvm_load_nvm_to_nic(struct iwl_mvm *mvm);
1547
1548 static inline u8 iwl_mvm_get_valid_tx_ant(struct iwl_mvm *mvm)
1549 {
1550 return mvm->nvm_data && mvm->nvm_data->valid_tx_ant ?
1551 mvm->fw->valid_tx_ant & mvm->nvm_data->valid_tx_ant :
1552 mvm->fw->valid_tx_ant;
1553 }
1554
1555 static inline u8 iwl_mvm_get_valid_rx_ant(struct iwl_mvm *mvm)
1556 {
1557 return mvm->nvm_data && mvm->nvm_data->valid_rx_ant ?
1558 mvm->fw->valid_rx_ant & mvm->nvm_data->valid_rx_ant :
1559 mvm->fw->valid_rx_ant;
1560 }
1561
1562 static inline void iwl_mvm_toggle_tx_ant(struct iwl_mvm *mvm, u8 *ant)
1563 {
1564 *ant = iwl_mvm_next_antenna(mvm, iwl_mvm_get_valid_tx_ant(mvm), *ant);
1565 }
1566
1567 static inline u32 iwl_mvm_get_phy_config(struct iwl_mvm *mvm)
1568 {
1569 u32 phy_config = ~(FW_PHY_CFG_TX_CHAIN |
1570 FW_PHY_CFG_RX_CHAIN);
1571 u32 valid_rx_ant = iwl_mvm_get_valid_rx_ant(mvm);
1572 u32 valid_tx_ant = iwl_mvm_get_valid_tx_ant(mvm);
1573
1574 phy_config |= valid_tx_ant << FW_PHY_CFG_TX_CHAIN_POS |
1575 valid_rx_ant << FW_PHY_CFG_RX_CHAIN_POS;
1576
1577 return mvm->fw->phy_config & phy_config;
1578 }
1579
1580 int iwl_mvm_up(struct iwl_mvm *mvm);
1581 int iwl_mvm_load_d3_fw(struct iwl_mvm *mvm);
1582
1583 int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm);
1584
1585
1586
1587
1588
1589 void iwl_mvm_rx_mq(struct iwl_op_mode *op_mode,
1590 struct napi_struct *napi,
1591 struct iwl_rx_cmd_buffer *rxb);
1592 void iwl_mvm_rx_rx_phy_cmd(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
1593 void iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct napi_struct *napi,
1594 struct iwl_rx_cmd_buffer *rxb);
1595 void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
1596 struct iwl_rx_cmd_buffer *rxb, int queue);
1597 void iwl_mvm_rx_monitor_no_data(struct iwl_mvm *mvm, struct napi_struct *napi,
1598 struct iwl_rx_cmd_buffer *rxb, int queue);
1599 void iwl_mvm_rx_frame_release(struct iwl_mvm *mvm, struct napi_struct *napi,
1600 struct iwl_rx_cmd_buffer *rxb, int queue);
1601 void iwl_mvm_rx_bar_frame_release(struct iwl_mvm *mvm, struct napi_struct *napi,
1602 struct iwl_rx_cmd_buffer *rxb, int queue);
1603 void iwl_mvm_rx_queue_notif(struct iwl_mvm *mvm, struct napi_struct *napi,
1604 struct iwl_rx_cmd_buffer *rxb, int queue);
1605 void iwl_mvm_rx_tx_cmd(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
1606 void iwl_mvm_mfu_assert_dump_notif(struct iwl_mvm *mvm,
1607 struct iwl_rx_cmd_buffer *rxb);
1608 void iwl_mvm_send_recovery_cmd(struct iwl_mvm *mvm, u32 flags);
1609 void iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
1610 void iwl_mvm_rx_ant_coupling_notif(struct iwl_mvm *mvm,
1611 struct iwl_rx_cmd_buffer *rxb);
1612 void iwl_mvm_rx_fw_error(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
1613 void iwl_mvm_rx_mfuart_notif(struct iwl_mvm *mvm,
1614 struct iwl_rx_cmd_buffer *rxb);
1615 void iwl_mvm_rx_shared_mem_cfg_notif(struct iwl_mvm *mvm,
1616 struct iwl_rx_cmd_buffer *rxb);
1617
1618
1619 int iwl_mvm_phy_ctxt_add(struct iwl_mvm *mvm, struct iwl_mvm_phy_ctxt *ctxt,
1620 struct cfg80211_chan_def *chandef,
1621 u8 chains_static, u8 chains_dynamic);
1622 int iwl_mvm_phy_ctxt_changed(struct iwl_mvm *mvm, struct iwl_mvm_phy_ctxt *ctxt,
1623 struct cfg80211_chan_def *chandef,
1624 u8 chains_static, u8 chains_dynamic);
1625 void iwl_mvm_phy_ctxt_ref(struct iwl_mvm *mvm,
1626 struct iwl_mvm_phy_ctxt *ctxt);
1627 void iwl_mvm_phy_ctxt_unref(struct iwl_mvm *mvm,
1628 struct iwl_mvm_phy_ctxt *ctxt);
1629 int iwl_mvm_phy_ctx_count(struct iwl_mvm *mvm);
1630 u8 iwl_mvm_get_channel_width(struct cfg80211_chan_def *chandef);
1631 u8 iwl_mvm_get_ctrl_pos(struct cfg80211_chan_def *chandef);
1632
1633
1634 int iwl_mvm_mac_ctxt_init(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1635 int iwl_mvm_mac_ctxt_add(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1636 int iwl_mvm_mac_ctxt_changed(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1637 bool force_assoc_off, const u8 *bssid_override);
1638 int iwl_mvm_mac_ctxt_remove(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1639 int iwl_mvm_mac_ctxt_beacon_changed(struct iwl_mvm *mvm,
1640 struct ieee80211_vif *vif);
1641 int iwl_mvm_mac_ctxt_send_beacon(struct iwl_mvm *mvm,
1642 struct ieee80211_vif *vif,
1643 struct sk_buff *beacon);
1644 int iwl_mvm_mac_ctxt_send_beacon_cmd(struct iwl_mvm *mvm,
1645 struct sk_buff *beacon,
1646 void *data, int len);
1647 u8 iwl_mvm_mac_ctxt_get_lowest_rate(struct ieee80211_tx_info *info,
1648 struct ieee80211_vif *vif);
1649 u16 iwl_mvm_mac_ctxt_get_beacon_flags(const struct iwl_fw *fw,
1650 u8 rate_idx);
1651 void iwl_mvm_mac_ctxt_set_tim(struct iwl_mvm *mvm,
1652 __le32 *tim_index, __le32 *tim_size,
1653 u8 *beacon, u32 frame_size);
1654 void iwl_mvm_rx_beacon_notif(struct iwl_mvm *mvm,
1655 struct iwl_rx_cmd_buffer *rxb);
1656 void iwl_mvm_rx_missed_beacons_notif(struct iwl_mvm *mvm,
1657 struct iwl_rx_cmd_buffer *rxb);
1658 void iwl_mvm_rx_stored_beacon_notif(struct iwl_mvm *mvm,
1659 struct iwl_rx_cmd_buffer *rxb);
1660 void iwl_mvm_mu_mimo_grp_notif(struct iwl_mvm *mvm,
1661 struct iwl_rx_cmd_buffer *rxb);
1662 void iwl_mvm_sta_pm_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
1663 void iwl_mvm_window_status_notif(struct iwl_mvm *mvm,
1664 struct iwl_rx_cmd_buffer *rxb);
1665 void iwl_mvm_mac_ctxt_recalc_tsf_id(struct iwl_mvm *mvm,
1666 struct ieee80211_vif *vif);
1667 void iwl_mvm_probe_resp_data_notif(struct iwl_mvm *mvm,
1668 struct iwl_rx_cmd_buffer *rxb);
1669 void iwl_mvm_rx_missed_vap_notif(struct iwl_mvm *mvm,
1670 struct iwl_rx_cmd_buffer *rxb);
1671 void iwl_mvm_channel_switch_start_notif(struct iwl_mvm *mvm,
1672 struct iwl_rx_cmd_buffer *rxb);
1673 void iwl_mvm_channel_switch_error_notif(struct iwl_mvm *mvm,
1674 struct iwl_rx_cmd_buffer *rxb);
1675
1676 int iwl_mvm_binding_add_vif(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1677 int iwl_mvm_binding_remove_vif(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1678
1679
1680 static inline size_t iwl_mvm_quota_cmd_size(struct iwl_mvm *mvm)
1681 {
1682 return iwl_mvm_has_quota_low_latency(mvm) ?
1683 sizeof(struct iwl_time_quota_cmd) :
1684 sizeof(struct iwl_time_quota_cmd_v1);
1685 }
1686
1687 static inline struct iwl_time_quota_data
1688 *iwl_mvm_quota_cmd_get_quota(struct iwl_mvm *mvm,
1689 struct iwl_time_quota_cmd *cmd,
1690 int i)
1691 {
1692 struct iwl_time_quota_data_v1 *quotas;
1693
1694 if (iwl_mvm_has_quota_low_latency(mvm))
1695 return &cmd->quotas[i];
1696
1697 quotas = (struct iwl_time_quota_data_v1 *)cmd->quotas;
1698 return (struct iwl_time_quota_data *)"as[i];
1699 }
1700
1701 int iwl_mvm_update_quotas(struct iwl_mvm *mvm, bool force_upload,
1702 struct ieee80211_vif *disabled_vif);
1703
1704
1705 int iwl_mvm_reg_scan_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1706 struct cfg80211_scan_request *req,
1707 struct ieee80211_scan_ies *ies);
1708 int iwl_mvm_scan_size(struct iwl_mvm *mvm);
1709 int iwl_mvm_scan_stop(struct iwl_mvm *mvm, int type, bool notify);
1710 int iwl_mvm_max_scan_ie_len(struct iwl_mvm *mvm);
1711 void iwl_mvm_report_scan_aborted(struct iwl_mvm *mvm);
1712 void iwl_mvm_scan_timeout_wk(struct work_struct *work);
1713
1714
1715 void iwl_mvm_rx_lmac_scan_complete_notif(struct iwl_mvm *mvm,
1716 struct iwl_rx_cmd_buffer *rxb);
1717 void iwl_mvm_rx_lmac_scan_iter_complete_notif(struct iwl_mvm *mvm,
1718 struct iwl_rx_cmd_buffer *rxb);
1719 int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm,
1720 struct ieee80211_vif *vif,
1721 struct cfg80211_sched_scan_request *req,
1722 struct ieee80211_scan_ies *ies,
1723 int type);
1724 void iwl_mvm_rx_scan_match_found(struct iwl_mvm *mvm,
1725 struct iwl_rx_cmd_buffer *rxb);
1726
1727
1728 int iwl_mvm_config_scan(struct iwl_mvm *mvm);
1729 void iwl_mvm_rx_umac_scan_complete_notif(struct iwl_mvm *mvm,
1730 struct iwl_rx_cmd_buffer *rxb);
1731 void iwl_mvm_rx_umac_scan_iter_complete_notif(struct iwl_mvm *mvm,
1732 struct iwl_rx_cmd_buffer *rxb);
1733
1734
1735 #ifdef CONFIG_IWLWIFI_DEBUGFS
1736 void iwl_mvm_dbgfs_register(struct iwl_mvm *mvm);
1737 void iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1738 void iwl_mvm_vif_dbgfs_clean(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1739 #else
1740 static inline void iwl_mvm_dbgfs_register(struct iwl_mvm *mvm)
1741 {
1742 }
1743 static inline void
1744 iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
1745 {
1746 }
1747 static inline void
1748 iwl_mvm_vif_dbgfs_clean(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
1749 {
1750 }
1751 #endif
1752
1753
1754 int iwl_mvm_send_lq_cmd(struct iwl_mvm *mvm, struct iwl_lq_cmd *lq);
1755 void iwl_mvm_update_frame_stats(struct iwl_mvm *mvm, u32 rate, bool agg);
1756 int rs_pretty_print_rate_v1(char *buf, int bufsz, const u32 rate);
1757 void rs_update_last_rssi(struct iwl_mvm *mvm,
1758 struct iwl_mvm_sta *mvmsta,
1759 struct ieee80211_rx_status *rx_status);
1760
1761
1762 int iwl_mvm_power_update_device(struct iwl_mvm *mvm);
1763 int iwl_mvm_power_update_mac(struct iwl_mvm *mvm);
1764 int iwl_mvm_power_update_ps(struct iwl_mvm *mvm);
1765 int iwl_mvm_power_mac_dbgfs_read(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1766 char *buf, int bufsz);
1767
1768 void iwl_mvm_power_vif_assoc(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1769 void iwl_mvm_power_uapsd_misbehaving_ap_notif(struct iwl_mvm *mvm,
1770 struct iwl_rx_cmd_buffer *rxb);
1771
1772 #ifdef CONFIG_IWLWIFI_LEDS
1773 int iwl_mvm_leds_init(struct iwl_mvm *mvm);
1774 void iwl_mvm_leds_exit(struct iwl_mvm *mvm);
1775 void iwl_mvm_leds_sync(struct iwl_mvm *mvm);
1776 #else
1777 static inline int iwl_mvm_leds_init(struct iwl_mvm *mvm)
1778 {
1779 return 0;
1780 }
1781 static inline void iwl_mvm_leds_exit(struct iwl_mvm *mvm)
1782 {
1783 }
1784 static inline void iwl_mvm_leds_sync(struct iwl_mvm *mvm)
1785 {
1786 }
1787 #endif
1788
1789
1790 int iwl_mvm_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan);
1791 int iwl_mvm_resume(struct ieee80211_hw *hw);
1792 void iwl_mvm_set_wakeup(struct ieee80211_hw *hw, bool enabled);
1793 void iwl_mvm_set_rekey_data(struct ieee80211_hw *hw,
1794 struct ieee80211_vif *vif,
1795 struct cfg80211_gtk_rekey_data *data);
1796 void iwl_mvm_ipv6_addr_change(struct ieee80211_hw *hw,
1797 struct ieee80211_vif *vif,
1798 struct inet6_dev *idev);
1799 void iwl_mvm_set_default_unicast_key(struct ieee80211_hw *hw,
1800 struct ieee80211_vif *vif, int idx);
1801 extern const struct file_operations iwl_dbgfs_d3_test_ops;
1802 #ifdef CONFIG_PM
1803 void iwl_mvm_set_last_nonqos_seq(struct iwl_mvm *mvm,
1804 struct ieee80211_vif *vif);
1805 #else
1806 static inline void
1807 iwl_mvm_set_last_nonqos_seq(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
1808 {
1809 }
1810 #endif
1811 void iwl_mvm_set_wowlan_qos_seq(struct iwl_mvm_sta *mvm_ap_sta,
1812 struct iwl_wowlan_config_cmd *cmd);
1813 int iwl_mvm_send_proto_offload(struct iwl_mvm *mvm,
1814 struct ieee80211_vif *vif,
1815 bool disable_offloading,
1816 bool offload_ns,
1817 u32 cmd_flags);
1818
1819
1820 int iwl_mvm_send_bt_init_conf(struct iwl_mvm *mvm);
1821 void iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm,
1822 struct iwl_rx_cmd_buffer *rxb);
1823 void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1824 enum ieee80211_rssi_event_data);
1825 void iwl_mvm_bt_coex_vif_change(struct iwl_mvm *mvm);
1826 u16 iwl_mvm_coex_agg_time_limit(struct iwl_mvm *mvm,
1827 struct ieee80211_sta *sta);
1828 bool iwl_mvm_bt_coex_is_mimo_allowed(struct iwl_mvm *mvm,
1829 struct ieee80211_sta *sta);
1830 bool iwl_mvm_bt_coex_is_ant_avail(struct iwl_mvm *mvm, u8 ant);
1831 bool iwl_mvm_bt_coex_is_shared_ant_avail(struct iwl_mvm *mvm);
1832 bool iwl_mvm_bt_coex_is_tpc_allowed(struct iwl_mvm *mvm,
1833 enum nl80211_band band);
1834 u8 iwl_mvm_bt_coex_get_single_ant_msk(struct iwl_mvm *mvm, u8 enabled_ants);
1835 u8 iwl_mvm_bt_coex_tx_prio(struct iwl_mvm *mvm, struct ieee80211_hdr *hdr,
1836 struct ieee80211_tx_info *info, u8 ac);
1837
1838
1839 #ifdef CONFIG_IWLWIFI_DEBUGFS
1840 void
1841 iwl_mvm_beacon_filter_debugfs_parameters(struct ieee80211_vif *vif,
1842 struct iwl_beacon_filter_cmd *cmd);
1843 #else
1844 static inline void
1845 iwl_mvm_beacon_filter_debugfs_parameters(struct ieee80211_vif *vif,
1846 struct iwl_beacon_filter_cmd *cmd)
1847 {}
1848 #endif
1849 int iwl_mvm_enable_beacon_filter(struct iwl_mvm *mvm,
1850 struct ieee80211_vif *vif,
1851 u32 flags);
1852 int iwl_mvm_disable_beacon_filter(struct iwl_mvm *mvm,
1853 struct ieee80211_vif *vif,
1854 u32 flags);
1855
1856 void iwl_mvm_update_smps(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1857 enum iwl_mvm_smps_type_request req_type,
1858 enum ieee80211_smps_mode smps_request);
1859 bool iwl_mvm_rx_diversity_allowed(struct iwl_mvm *mvm,
1860 struct iwl_mvm_phy_ctxt *ctxt);
1861 void iwl_mvm_apply_fw_smps_request(struct ieee80211_vif *vif);
1862
1863
1864 int iwl_mvm_update_low_latency(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1865 bool low_latency,
1866 enum iwl_mvm_low_latency_cause cause);
1867
1868 bool iwl_mvm_low_latency(struct iwl_mvm *mvm);
1869 bool iwl_mvm_low_latency_band(struct iwl_mvm *mvm, enum nl80211_band band);
1870 void iwl_mvm_send_low_latency_cmd(struct iwl_mvm *mvm, bool low_latency,
1871 u16 mac_id);
1872
1873
1874 static inline bool iwl_mvm_vif_low_latency(struct iwl_mvm_vif *mvmvif)
1875 {
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886 return mvmvif->low_latency_actual;
1887 }
1888
1889 static inline
1890 void iwl_mvm_vif_set_low_latency(struct iwl_mvm_vif *mvmvif, bool set,
1891 enum iwl_mvm_low_latency_cause cause)
1892 {
1893 u8 new_state;
1894
1895 if (set)
1896 mvmvif->low_latency |= cause;
1897 else
1898 mvmvif->low_latency &= ~cause;
1899
1900
1901
1902
1903
1904 if (mvmvif->low_latency & LOW_LATENCY_DEBUGFS_FORCE_ENABLE &&
1905 cause != LOW_LATENCY_DEBUGFS_FORCE_ENABLE)
1906 return;
1907
1908 if (cause == LOW_LATENCY_DEBUGFS_FORCE_ENABLE && set)
1909
1910
1911
1912 new_state = !!(mvmvif->low_latency &
1913 LOW_LATENCY_DEBUGFS_FORCE);
1914 else
1915
1916
1917
1918 new_state = !!(mvmvif->low_latency &
1919 ~(LOW_LATENCY_DEBUGFS_FORCE_ENABLE |
1920 LOW_LATENCY_DEBUGFS_FORCE));
1921
1922 mvmvif->low_latency_actual = new_state;
1923 }
1924
1925
1926
1927
1928 static inline u32 iwl_mvm_flushable_queues(struct iwl_mvm *mvm)
1929 {
1930 return ((BIT(mvm->trans->trans_cfg->base_params->num_of_queues) - 1) &
1931 ~BIT(IWL_MVM_DQA_CMD_QUEUE));
1932 }
1933
1934 void iwl_mvm_stop_device(struct iwl_mvm *mvm);
1935
1936
1937 void iwl_mvm_tt_tx_backoff(struct iwl_mvm *mvm, u32 backoff);
1938 void iwl_mvm_temp_notif(struct iwl_mvm *mvm,
1939 struct iwl_rx_cmd_buffer *rxb);
1940 void iwl_mvm_tt_handler(struct iwl_mvm *mvm);
1941 void iwl_mvm_thermal_initialize(struct iwl_mvm *mvm, u32 min_backoff);
1942 void iwl_mvm_thermal_exit(struct iwl_mvm *mvm);
1943 void iwl_mvm_set_hw_ctkill_state(struct iwl_mvm *mvm, bool state);
1944 int iwl_mvm_get_temp(struct iwl_mvm *mvm, s32 *temp);
1945 void iwl_mvm_ct_kill_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
1946 void iwl_mvm_enter_ctkill(struct iwl_mvm *mvm);
1947 int iwl_mvm_send_temp_report_ths_cmd(struct iwl_mvm *mvm);
1948 int iwl_mvm_ctdp_command(struct iwl_mvm *mvm, u32 op, u32 budget);
1949
1950 #if IS_ENABLED(CONFIG_IWLMEI)
1951
1952
1953 void iwl_mvm_vendor_cmds_register(struct iwl_mvm *mvm);
1954
1955 #else
1956
1957 static inline void iwl_mvm_vendor_cmds_register(struct iwl_mvm *mvm) {}
1958
1959 #endif
1960
1961
1962 struct iwl_mcc_update_resp *
1963 iwl_mvm_update_mcc(struct iwl_mvm *mvm, const char *alpha2,
1964 enum iwl_mcc_source src_id);
1965 int iwl_mvm_init_mcc(struct iwl_mvm *mvm);
1966 void iwl_mvm_rx_chub_update_mcc(struct iwl_mvm *mvm,
1967 struct iwl_rx_cmd_buffer *rxb);
1968 struct ieee80211_regdomain *iwl_mvm_get_regdomain(struct wiphy *wiphy,
1969 const char *alpha2,
1970 enum iwl_mcc_source src_id,
1971 bool *changed);
1972 struct ieee80211_regdomain *iwl_mvm_get_current_regdomain(struct iwl_mvm *mvm,
1973 bool *changed);
1974 int iwl_mvm_init_fw_regd(struct iwl_mvm *mvm);
1975 void iwl_mvm_update_changed_regdom(struct iwl_mvm *mvm);
1976
1977
1978 int iwl_mvm_sf_update(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1979 bool added_vif);
1980
1981
1982 int iwl_mvm_ftm_start_responder(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1983 void iwl_mvm_ftm_restart_responder(struct iwl_mvm *mvm,
1984 struct ieee80211_vif *vif);
1985 void iwl_mvm_ftm_responder_stats(struct iwl_mvm *mvm,
1986 struct iwl_rx_cmd_buffer *rxb);
1987 int iwl_mvm_ftm_resp_remove_pasn_sta(struct iwl_mvm *mvm,
1988 struct ieee80211_vif *vif, u8 *addr);
1989 int iwl_mvm_ftm_respoder_add_pasn_sta(struct iwl_mvm *mvm,
1990 struct ieee80211_vif *vif,
1991 u8 *addr, u32 cipher, u8 *tk, u32 tk_len,
1992 u8 *hltk, u32 hltk_len);
1993 void iwl_mvm_ftm_responder_clear(struct iwl_mvm *mvm,
1994 struct ieee80211_vif *vif);
1995
1996
1997 void iwl_mvm_ftm_restart(struct iwl_mvm *mvm);
1998 void iwl_mvm_ftm_range_resp(struct iwl_mvm *mvm,
1999 struct iwl_rx_cmd_buffer *rxb);
2000 void iwl_mvm_ftm_lc_notif(struct iwl_mvm *mvm,
2001 struct iwl_rx_cmd_buffer *rxb);
2002 int iwl_mvm_ftm_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
2003 struct cfg80211_pmsr_request *request);
2004 void iwl_mvm_ftm_abort(struct iwl_mvm *mvm, struct cfg80211_pmsr_request *req);
2005 void iwl_mvm_ftm_initiator_smooth_config(struct iwl_mvm *mvm);
2006 void iwl_mvm_ftm_initiator_smooth_stop(struct iwl_mvm *mvm);
2007 int iwl_mvm_ftm_add_pasn_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
2008 u8 *addr, u32 cipher, u8 *tk, u32 tk_len,
2009 u8 *hltk, u32 hltk_len);
2010 void iwl_mvm_ftm_remove_pasn_sta(struct iwl_mvm *mvm, u8 *addr);
2011
2012
2013
2014
2015
2016
2017
2018 #define IWL_MVM_TDLS_FW_TID 4
2019
2020 int iwl_mvm_tdls_sta_count(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
2021 void iwl_mvm_teardown_tdls_peers(struct iwl_mvm *mvm);
2022 void iwl_mvm_recalc_tdls_state(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
2023 bool sta_added);
2024 void iwl_mvm_mac_mgd_protect_tdls_discover(struct ieee80211_hw *hw,
2025 struct ieee80211_vif *vif);
2026 int iwl_mvm_tdls_channel_switch(struct ieee80211_hw *hw,
2027 struct ieee80211_vif *vif,
2028 struct ieee80211_sta *sta, u8 oper_class,
2029 struct cfg80211_chan_def *chandef,
2030 struct sk_buff *tmpl_skb, u32 ch_sw_tm_ie);
2031 void iwl_mvm_tdls_recv_channel_switch(struct ieee80211_hw *hw,
2032 struct ieee80211_vif *vif,
2033 struct ieee80211_tdls_ch_sw_params *params);
2034 void iwl_mvm_tdls_cancel_channel_switch(struct ieee80211_hw *hw,
2035 struct ieee80211_vif *vif,
2036 struct ieee80211_sta *sta);
2037 void iwl_mvm_rx_tdls_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
2038 void iwl_mvm_tdls_ch_switch_work(struct work_struct *work);
2039
2040 void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm,
2041 enum iwl_mvm_rxq_notif_type type,
2042 bool sync,
2043 const void *data, 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 struct ieee80211_vif *iwl_mvm_get_vif_by_macid(struct iwl_mvm *mvm, u32 macid);
2047 bool iwl_mvm_is_vif_assoc(struct iwl_mvm *mvm);
2048
2049 #define MVM_TCM_PERIOD_MSEC 500
2050 #define MVM_TCM_PERIOD (HZ * MVM_TCM_PERIOD_MSEC / 1000)
2051 #define MVM_LL_PERIOD (10 * HZ)
2052 void iwl_mvm_tcm_work(struct work_struct *work);
2053 void iwl_mvm_recalc_tcm(struct iwl_mvm *mvm);
2054 void iwl_mvm_pause_tcm(struct iwl_mvm *mvm, bool with_cancel);
2055 void iwl_mvm_resume_tcm(struct iwl_mvm *mvm);
2056 void iwl_mvm_tcm_add_vif(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
2057 void iwl_mvm_tcm_rm_vif(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
2058 u8 iwl_mvm_tcm_load_percentage(u32 airtime, u32 elapsed);
2059
2060 void iwl_mvm_nic_restart(struct iwl_mvm *mvm, bool fw_error);
2061 unsigned int iwl_mvm_get_wd_timeout(struct iwl_mvm *mvm,
2062 struct ieee80211_vif *vif,
2063 bool tdls, bool cmd_q);
2064 void iwl_mvm_connection_loss(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
2065 const char *errmsg);
2066 void iwl_mvm_event_frame_timeout_callback(struct iwl_mvm *mvm,
2067 struct ieee80211_vif *vif,
2068 const struct ieee80211_sta *sta,
2069 u16 tid);
2070
2071 int iwl_mvm_sar_select_profile(struct iwl_mvm *mvm, int prof_a, int prof_b);
2072 int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm);
2073 int iwl_mvm_ppag_send_cmd(struct iwl_mvm *mvm);
2074 void iwl_mvm_get_acpi_tables(struct iwl_mvm *mvm);
2075 #ifdef CONFIG_IWLWIFI_DEBUGFS
2076 void iwl_mvm_sta_add_debugfs(struct ieee80211_hw *hw,
2077 struct ieee80211_vif *vif,
2078 struct ieee80211_sta *sta,
2079 struct dentry *dir);
2080 #endif
2081
2082 int iwl_rfi_send_config_cmd(struct iwl_mvm *mvm,
2083 struct iwl_rfi_lut_entry *rfi_table);
2084 struct iwl_rfi_freq_table_resp_cmd *iwl_rfi_get_freq_table(struct iwl_mvm *mvm);
2085 void iwl_rfi_deactivate_notif_handler(struct iwl_mvm *mvm,
2086 struct iwl_rx_cmd_buffer *rxb);
2087
2088 static inline u8 iwl_mvm_phy_band_from_nl80211(enum nl80211_band band)
2089 {
2090 switch (band) {
2091 case NL80211_BAND_2GHZ:
2092 return PHY_BAND_24;
2093 case NL80211_BAND_5GHZ:
2094 return PHY_BAND_5;
2095 case NL80211_BAND_6GHZ:
2096 return PHY_BAND_6;
2097 default:
2098 WARN_ONCE(1, "Unsupported band (%u)\n", band);
2099 return PHY_BAND_5;
2100 }
2101 }
2102
2103
2104 static inline bool iwl_mvm_has_ultra_hb_channel(struct iwl_mvm *mvm)
2105 {
2106 return fw_has_capa(&mvm->fw->ucode_capa,
2107 IWL_UCODE_TLV_CAPA_ULTRA_HB_CHANNELS);
2108 }
2109
2110 static inline void *iwl_mvm_chan_info_cmd_tail(struct iwl_mvm *mvm,
2111 struct iwl_fw_channel_info *ci)
2112 {
2113 return (u8 *)ci + (iwl_mvm_has_ultra_hb_channel(mvm) ?
2114 sizeof(struct iwl_fw_channel_info) :
2115 sizeof(struct iwl_fw_channel_info_v1));
2116 }
2117
2118 static inline size_t iwl_mvm_chan_info_padding(struct iwl_mvm *mvm)
2119 {
2120 return iwl_mvm_has_ultra_hb_channel(mvm) ? 0 :
2121 sizeof(struct iwl_fw_channel_info) -
2122 sizeof(struct iwl_fw_channel_info_v1);
2123 }
2124
2125 static inline void iwl_mvm_set_chan_info(struct iwl_mvm *mvm,
2126 struct iwl_fw_channel_info *ci,
2127 u32 chan, u8 band, u8 width,
2128 u8 ctrl_pos)
2129 {
2130 if (iwl_mvm_has_ultra_hb_channel(mvm)) {
2131 ci->channel = cpu_to_le32(chan);
2132 ci->band = band;
2133 ci->width = width;
2134 ci->ctrl_pos = ctrl_pos;
2135 } else {
2136 struct iwl_fw_channel_info_v1 *ci_v1 =
2137 (struct iwl_fw_channel_info_v1 *)ci;
2138
2139 ci_v1->channel = chan;
2140 ci_v1->band = band;
2141 ci_v1->width = width;
2142 ci_v1->ctrl_pos = ctrl_pos;
2143 }
2144 }
2145
2146 static inline void
2147 iwl_mvm_set_chan_info_chandef(struct iwl_mvm *mvm,
2148 struct iwl_fw_channel_info *ci,
2149 struct cfg80211_chan_def *chandef)
2150 {
2151 enum nl80211_band band = chandef->chan->band;
2152
2153 iwl_mvm_set_chan_info(mvm, ci, chandef->chan->hw_value,
2154 iwl_mvm_phy_band_from_nl80211(band),
2155 iwl_mvm_get_channel_width(chandef),
2156 iwl_mvm_get_ctrl_pos(chandef));
2157 }
2158
2159 static inline int iwl_umac_scan_get_max_profiles(const struct iwl_fw *fw)
2160 {
2161 u8 ver = iwl_fw_lookup_cmd_ver(fw, SCAN_OFFLOAD_UPDATE_PROFILES_CMD,
2162 IWL_FW_CMD_VER_UNKNOWN);
2163 return (ver == IWL_FW_CMD_VER_UNKNOWN || ver < 3) ?
2164 IWL_SCAN_MAX_PROFILES : IWL_SCAN_MAX_PROFILES_V2;
2165 }
2166
2167 static inline
2168 enum iwl_location_cipher iwl_mvm_cipher_to_location_cipher(u32 cipher)
2169 {
2170 switch (cipher) {
2171 case WLAN_CIPHER_SUITE_CCMP:
2172 return IWL_LOCATION_CIPHER_CCMP_128;
2173 case WLAN_CIPHER_SUITE_GCMP:
2174 return IWL_LOCATION_CIPHER_GCMP_128;
2175 case WLAN_CIPHER_SUITE_GCMP_256:
2176 return IWL_LOCATION_CIPHER_GCMP_256;
2177 default:
2178 return IWL_LOCATION_CIPHER_INVALID;
2179 }
2180 }
2181
2182 struct iwl_mvm_csme_conn_info *iwl_mvm_get_csme_conn_info(struct iwl_mvm *mvm);
2183 static inline int iwl_mvm_mei_get_ownership(struct iwl_mvm *mvm)
2184 {
2185 if (mvm->mei_registered)
2186 return iwl_mei_get_ownership();
2187 return 0;
2188 }
2189
2190 static inline void iwl_mvm_mei_tx_copy_to_csme(struct iwl_mvm *mvm,
2191 struct sk_buff *skb,
2192 unsigned int ivlen)
2193 {
2194 if (mvm->mei_registered)
2195 iwl_mei_tx_copy_to_csme(skb, ivlen);
2196 }
2197
2198 static inline void iwl_mvm_mei_host_disassociated(struct iwl_mvm *mvm)
2199 {
2200 if (mvm->mei_registered)
2201 iwl_mei_host_disassociated();
2202 }
2203
2204 static inline void iwl_mvm_mei_device_down(struct iwl_mvm *mvm)
2205 {
2206 if (mvm->mei_registered)
2207 iwl_mei_device_down();
2208 }
2209
2210 static inline void iwl_mvm_mei_set_sw_rfkill_state(struct iwl_mvm *mvm)
2211 {
2212 bool sw_rfkill =
2213 mvm->hw_registered ? rfkill_soft_blocked(mvm->hw->wiphy->rfkill) : false;
2214
2215 if (mvm->mei_registered)
2216 iwl_mei_set_rfkill_state(iwl_mvm_is_radio_killed(mvm),
2217 sw_rfkill);
2218 }
2219
2220 void iwl_mvm_send_roaming_forbidden_event(struct iwl_mvm *mvm,
2221 struct ieee80211_vif *vif,
2222 bool forbidden);
2223
2224 #endif