162306a36Sopenharmony_ci/* SPDX-License-Identifier: ISC */ 262306a36Sopenharmony_ci/* Copyright (C) 2020 MediaTek Inc. */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#ifndef __MT7915_H 562306a36Sopenharmony_ci#define __MT7915_H 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/interrupt.h> 862306a36Sopenharmony_ci#include <linux/ktime.h> 962306a36Sopenharmony_ci#include "../mt76_connac.h" 1062306a36Sopenharmony_ci#include "regs.h" 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#define MT7915_MAX_INTERFACES 19 1362306a36Sopenharmony_ci#define MT7915_WTBL_SIZE 288 1462306a36Sopenharmony_ci#define MT7916_WTBL_SIZE 544 1562306a36Sopenharmony_ci#define MT7915_WTBL_RESERVED (mt7915_wtbl_size(dev) - 1) 1662306a36Sopenharmony_ci#define MT7915_WTBL_STA (MT7915_WTBL_RESERVED - \ 1762306a36Sopenharmony_ci MT7915_MAX_INTERFACES) 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#define MT7915_WATCHDOG_TIME (HZ / 10) 2062306a36Sopenharmony_ci#define MT7915_RESET_TIMEOUT (30 * HZ) 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#define MT7915_TX_RING_SIZE 2048 2362306a36Sopenharmony_ci#define MT7915_TX_MCU_RING_SIZE 256 2462306a36Sopenharmony_ci#define MT7915_TX_FWDL_RING_SIZE 128 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define MT7915_RX_RING_SIZE 1536 2762306a36Sopenharmony_ci#define MT7915_RX_MCU_RING_SIZE 512 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#define MT7915_FIRMWARE_WA "mediatek/mt7915_wa.bin" 3062306a36Sopenharmony_ci#define MT7915_FIRMWARE_WM "mediatek/mt7915_wm.bin" 3162306a36Sopenharmony_ci#define MT7915_ROM_PATCH "mediatek/mt7915_rom_patch.bin" 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#define MT7916_FIRMWARE_WA "mediatek/mt7916_wa.bin" 3462306a36Sopenharmony_ci#define MT7916_FIRMWARE_WM "mediatek/mt7916_wm.bin" 3562306a36Sopenharmony_ci#define MT7916_ROM_PATCH "mediatek/mt7916_rom_patch.bin" 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#define MT7981_FIRMWARE_WA "mediatek/mt7981_wa.bin" 3862306a36Sopenharmony_ci#define MT7981_FIRMWARE_WM "mediatek/mt7981_wm.bin" 3962306a36Sopenharmony_ci#define MT7981_ROM_PATCH "mediatek/mt7981_rom_patch.bin" 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci#define MT7986_FIRMWARE_WA "mediatek/mt7986_wa.bin" 4262306a36Sopenharmony_ci#define MT7986_FIRMWARE_WM "mediatek/mt7986_wm.bin" 4362306a36Sopenharmony_ci#define MT7986_FIRMWARE_WM_MT7975 "mediatek/mt7986_wm_mt7975.bin" 4462306a36Sopenharmony_ci#define MT7986_ROM_PATCH "mediatek/mt7986_rom_patch.bin" 4562306a36Sopenharmony_ci#define MT7986_ROM_PATCH_MT7975 "mediatek/mt7986_rom_patch_mt7975.bin" 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci#define MT7915_EEPROM_DEFAULT "mediatek/mt7915_eeprom.bin" 4862306a36Sopenharmony_ci#define MT7915_EEPROM_DEFAULT_DBDC "mediatek/mt7915_eeprom_dbdc.bin" 4962306a36Sopenharmony_ci#define MT7916_EEPROM_DEFAULT "mediatek/mt7916_eeprom.bin" 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci#define MT7981_EEPROM_MT7976_DEFAULT_DBDC "mediatek/mt7981_eeprom_mt7976_dbdc.bin" 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci#define MT7986_EEPROM_MT7975_DEFAULT "mediatek/mt7986_eeprom_mt7975.bin" 5462306a36Sopenharmony_ci#define MT7986_EEPROM_MT7975_DUAL_DEFAULT "mediatek/mt7986_eeprom_mt7975_dual.bin" 5562306a36Sopenharmony_ci#define MT7986_EEPROM_MT7976_DEFAULT "mediatek/mt7986_eeprom_mt7976.bin" 5662306a36Sopenharmony_ci#define MT7986_EEPROM_MT7976_DEFAULT_DBDC "mediatek/mt7986_eeprom_mt7976_dbdc.bin" 5762306a36Sopenharmony_ci#define MT7986_EEPROM_MT7976_DUAL_DEFAULT "mediatek/mt7986_eeprom_mt7976_dual.bin" 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ci#define MT7915_EEPROM_SIZE 3584 6062306a36Sopenharmony_ci#define MT7916_EEPROM_SIZE 4096 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci#define MT7915_EEPROM_BLOCK_SIZE 16 6362306a36Sopenharmony_ci#define MT7915_HW_TOKEN_SIZE 4096 6462306a36Sopenharmony_ci#define MT7915_TOKEN_SIZE 8192 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci#define MT7915_CFEND_RATE_DEFAULT 0x49 /* OFDM 24M */ 6762306a36Sopenharmony_ci#define MT7915_CFEND_RATE_11B 0x03 /* 11B LP, 11M */ 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci#define MT7915_THERMAL_THROTTLE_MAX 100 7062306a36Sopenharmony_ci#define MT7915_CDEV_THROTTLE_MAX 99 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci#define MT7915_SKU_RATE_NUM 161 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci#define MT7915_MAX_TWT_AGRT 16 7562306a36Sopenharmony_ci#define MT7915_MAX_STA_TWT_AGRT 8 7662306a36Sopenharmony_ci#define MT7915_MIN_TWT_DUR 64 7762306a36Sopenharmony_ci#define MT7915_MAX_QUEUE (MT_RXQ_BAND2 + __MT_MCUQ_MAX + 2) 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci#define MT7915_WED_RX_TOKEN_SIZE 12288 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci#define MT7915_CRIT_TEMP_IDX 0 8262306a36Sopenharmony_ci#define MT7915_MAX_TEMP_IDX 1 8362306a36Sopenharmony_ci#define MT7915_CRIT_TEMP 110 8462306a36Sopenharmony_ci#define MT7915_MAX_TEMP 120 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_cistruct mt7915_vif; 8762306a36Sopenharmony_cistruct mt7915_sta; 8862306a36Sopenharmony_cistruct mt7915_dfs_pulse; 8962306a36Sopenharmony_cistruct mt7915_dfs_pattern; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_cienum mt7915_txq_id { 9262306a36Sopenharmony_ci MT7915_TXQ_FWDL = 16, 9362306a36Sopenharmony_ci MT7915_TXQ_MCU_WM, 9462306a36Sopenharmony_ci MT7915_TXQ_BAND0, 9562306a36Sopenharmony_ci MT7915_TXQ_BAND1, 9662306a36Sopenharmony_ci MT7915_TXQ_MCU_WA, 9762306a36Sopenharmony_ci}; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_cienum mt7915_rxq_id { 10062306a36Sopenharmony_ci MT7915_RXQ_BAND0 = 0, 10162306a36Sopenharmony_ci MT7915_RXQ_BAND1, 10262306a36Sopenharmony_ci MT7915_RXQ_MCU_WM = 0, 10362306a36Sopenharmony_ci MT7915_RXQ_MCU_WA, 10462306a36Sopenharmony_ci MT7915_RXQ_MCU_WA_EXT, 10562306a36Sopenharmony_ci}; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cienum mt7916_rxq_id { 10862306a36Sopenharmony_ci MT7916_RXQ_MCU_WM = 0, 10962306a36Sopenharmony_ci MT7916_RXQ_MCU_WA, 11062306a36Sopenharmony_ci MT7916_RXQ_MCU_WA_MAIN, 11162306a36Sopenharmony_ci MT7916_RXQ_MCU_WA_EXT, 11262306a36Sopenharmony_ci MT7916_RXQ_BAND0, 11362306a36Sopenharmony_ci MT7916_RXQ_BAND1, 11462306a36Sopenharmony_ci}; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_cistruct mt7915_twt_flow { 11762306a36Sopenharmony_ci struct list_head list; 11862306a36Sopenharmony_ci u64 start_tsf; 11962306a36Sopenharmony_ci u64 tsf; 12062306a36Sopenharmony_ci u32 duration; 12162306a36Sopenharmony_ci u16 wcid; 12262306a36Sopenharmony_ci __le16 mantissa; 12362306a36Sopenharmony_ci u8 exp; 12462306a36Sopenharmony_ci u8 table_id; 12562306a36Sopenharmony_ci u8 id; 12662306a36Sopenharmony_ci u8 protection:1; 12762306a36Sopenharmony_ci u8 flowtype:1; 12862306a36Sopenharmony_ci u8 trigger:1; 12962306a36Sopenharmony_ci u8 sched:1; 13062306a36Sopenharmony_ci}; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ciDECLARE_EWMA(avg_signal, 10, 8) 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_cistruct mt7915_sta { 13562306a36Sopenharmony_ci struct mt76_wcid wcid; /* must be first */ 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci struct mt7915_vif *vif; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci struct list_head rc_list; 14062306a36Sopenharmony_ci u32 airtime_ac[8]; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci int ack_signal; 14362306a36Sopenharmony_ci struct ewma_avg_signal avg_ack_signal; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci unsigned long changed; 14662306a36Sopenharmony_ci unsigned long jiffies; 14762306a36Sopenharmony_ci struct mt76_connac_sta_key_conf bip; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci struct { 15062306a36Sopenharmony_ci u8 flowid_mask; 15162306a36Sopenharmony_ci struct mt7915_twt_flow flow[MT7915_MAX_STA_TWT_AGRT]; 15262306a36Sopenharmony_ci } twt; 15362306a36Sopenharmony_ci}; 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_cistruct mt7915_vif_cap { 15662306a36Sopenharmony_ci bool ht_ldpc:1; 15762306a36Sopenharmony_ci bool vht_ldpc:1; 15862306a36Sopenharmony_ci bool he_ldpc:1; 15962306a36Sopenharmony_ci bool vht_su_ebfer:1; 16062306a36Sopenharmony_ci bool vht_su_ebfee:1; 16162306a36Sopenharmony_ci bool vht_mu_ebfer:1; 16262306a36Sopenharmony_ci bool vht_mu_ebfee:1; 16362306a36Sopenharmony_ci bool he_su_ebfer:1; 16462306a36Sopenharmony_ci bool he_su_ebfee:1; 16562306a36Sopenharmony_ci bool he_mu_ebfer:1; 16662306a36Sopenharmony_ci}; 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_cistruct mt7915_vif { 16962306a36Sopenharmony_ci struct mt76_vif mt76; /* must be first */ 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ci struct mt7915_vif_cap cap; 17262306a36Sopenharmony_ci struct mt7915_sta sta; 17362306a36Sopenharmony_ci struct mt7915_phy *phy; 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci struct ieee80211_tx_queue_params queue_params[IEEE80211_NUM_ACS]; 17662306a36Sopenharmony_ci struct cfg80211_bitrate_mask bitrate_mask; 17762306a36Sopenharmony_ci}; 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci/* crash-dump */ 18062306a36Sopenharmony_cistruct mt7915_crash_data { 18162306a36Sopenharmony_ci guid_t guid; 18262306a36Sopenharmony_ci struct timespec64 timestamp; 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci u8 *memdump_buf; 18562306a36Sopenharmony_ci size_t memdump_buf_len; 18662306a36Sopenharmony_ci}; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_cistruct mt7915_hif { 18962306a36Sopenharmony_ci struct list_head list; 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci struct device *dev; 19262306a36Sopenharmony_ci void __iomem *regs; 19362306a36Sopenharmony_ci int irq; 19462306a36Sopenharmony_ci}; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_cistruct mt7915_phy { 19762306a36Sopenharmony_ci struct mt76_phy *mt76; 19862306a36Sopenharmony_ci struct mt7915_dev *dev; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci struct ieee80211_sband_iftype_data iftype[NUM_NL80211_BANDS][NUM_NL80211_IFTYPES]; 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci struct ieee80211_vif *monitor_vif; 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci struct thermal_cooling_device *cdev; 20562306a36Sopenharmony_ci u8 cdev_state; 20662306a36Sopenharmony_ci u8 throttle_state; 20762306a36Sopenharmony_ci u32 throttle_temp[2]; /* 0: critical high, 1: maximum */ 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci u32 rxfilter; 21062306a36Sopenharmony_ci u64 omac_mask; 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci u16 noise; 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci s16 coverage_class; 21562306a36Sopenharmony_ci u8 slottime; 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci u8 rdd_state; 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci u32 trb_ts; 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci u32 rx_ampdu_ts; 22262306a36Sopenharmony_ci u32 ampdu_ref; 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci struct mt76_mib_stats mib; 22562306a36Sopenharmony_ci struct mt76_channel_state state_ts; 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci#ifdef CONFIG_NL80211_TESTMODE 22862306a36Sopenharmony_ci struct { 22962306a36Sopenharmony_ci u32 *reg_backup; 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci s32 last_freq_offset; 23262306a36Sopenharmony_ci u8 last_rcpi[4]; 23362306a36Sopenharmony_ci s8 last_ib_rssi[4]; 23462306a36Sopenharmony_ci s8 last_wb_rssi[4]; 23562306a36Sopenharmony_ci u8 last_snr; 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci u8 spe_idx; 23862306a36Sopenharmony_ci } test; 23962306a36Sopenharmony_ci#endif 24062306a36Sopenharmony_ci}; 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_cistruct mt7915_dev { 24362306a36Sopenharmony_ci union { /* must be first */ 24462306a36Sopenharmony_ci struct mt76_dev mt76; 24562306a36Sopenharmony_ci struct mt76_phy mphy; 24662306a36Sopenharmony_ci }; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci struct mt7915_hif *hif2; 24962306a36Sopenharmony_ci struct mt7915_reg_desc reg; 25062306a36Sopenharmony_ci u8 q_id[MT7915_MAX_QUEUE]; 25162306a36Sopenharmony_ci u32 q_int_mask[MT7915_MAX_QUEUE]; 25262306a36Sopenharmony_ci u32 wfdma_mask; 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci const struct mt76_bus_ops *bus_ops; 25562306a36Sopenharmony_ci struct mt7915_phy phy; 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci /* monitor rx chain configured channel */ 25862306a36Sopenharmony_ci struct cfg80211_chan_def rdd2_chandef; 25962306a36Sopenharmony_ci struct mt7915_phy *rdd2_phy; 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci u16 chainmask; 26262306a36Sopenharmony_ci u16 chainshift; 26362306a36Sopenharmony_ci u32 hif_idx; 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci struct work_struct init_work; 26662306a36Sopenharmony_ci struct work_struct rc_work; 26762306a36Sopenharmony_ci struct work_struct dump_work; 26862306a36Sopenharmony_ci struct work_struct reset_work; 26962306a36Sopenharmony_ci wait_queue_head_t reset_wait; 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci struct { 27262306a36Sopenharmony_ci u32 state; 27362306a36Sopenharmony_ci u32 wa_reset_count; 27462306a36Sopenharmony_ci u32 wm_reset_count; 27562306a36Sopenharmony_ci bool hw_full_reset:1; 27662306a36Sopenharmony_ci bool hw_init_done:1; 27762306a36Sopenharmony_ci bool restart:1; 27862306a36Sopenharmony_ci } recovery; 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci /* protects coredump data */ 28162306a36Sopenharmony_ci struct mutex dump_mutex; 28262306a36Sopenharmony_ci#ifdef CONFIG_DEV_COREDUMP 28362306a36Sopenharmony_ci struct { 28462306a36Sopenharmony_ci struct mt7915_crash_data *crash_data; 28562306a36Sopenharmony_ci } coredump; 28662306a36Sopenharmony_ci#endif 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci struct list_head sta_rc_list; 28962306a36Sopenharmony_ci struct list_head twt_list; 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci u32 hw_pattern; 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci bool dbdc_support; 29462306a36Sopenharmony_ci bool flash_mode; 29562306a36Sopenharmony_ci bool muru_debug; 29662306a36Sopenharmony_ci bool ibf; 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci struct dentry *debugfs_dir; 29962306a36Sopenharmony_ci struct rchan *relay_fwlog; 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci void *cal; 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci struct { 30462306a36Sopenharmony_ci u8 debug_wm; 30562306a36Sopenharmony_ci u8 debug_wa; 30662306a36Sopenharmony_ci u8 debug_bin; 30762306a36Sopenharmony_ci } fw; 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci struct { 31062306a36Sopenharmony_ci u16 table_mask; 31162306a36Sopenharmony_ci u8 n_agrt; 31262306a36Sopenharmony_ci } twt; 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ci struct reset_control *rstc; 31562306a36Sopenharmony_ci void __iomem *dcm; 31662306a36Sopenharmony_ci void __iomem *sku; 31762306a36Sopenharmony_ci}; 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_cienum { 32062306a36Sopenharmony_ci WFDMA0 = 0x0, 32162306a36Sopenharmony_ci WFDMA1, 32262306a36Sopenharmony_ci WFDMA_EXT, 32362306a36Sopenharmony_ci __MT_WFDMA_MAX, 32462306a36Sopenharmony_ci}; 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_cienum { 32762306a36Sopenharmony_ci MT_RX_SEL0, 32862306a36Sopenharmony_ci MT_RX_SEL1, 32962306a36Sopenharmony_ci MT_RX_SEL2, /* monitor chain */ 33062306a36Sopenharmony_ci}; 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_cienum mt7915_rdd_cmd { 33362306a36Sopenharmony_ci RDD_STOP, 33462306a36Sopenharmony_ci RDD_START, 33562306a36Sopenharmony_ci RDD_DET_MODE, 33662306a36Sopenharmony_ci RDD_RADAR_EMULATE, 33762306a36Sopenharmony_ci RDD_START_TXQ = 20, 33862306a36Sopenharmony_ci RDD_SET_WF_ANT = 30, 33962306a36Sopenharmony_ci RDD_CAC_START = 50, 34062306a36Sopenharmony_ci RDD_CAC_END, 34162306a36Sopenharmony_ci RDD_NORMAL_START, 34262306a36Sopenharmony_ci RDD_DISABLE_DFS_CAL, 34362306a36Sopenharmony_ci RDD_PULSE_DBG, 34462306a36Sopenharmony_ci RDD_READ_PULSE, 34562306a36Sopenharmony_ci RDD_RESUME_BF, 34662306a36Sopenharmony_ci RDD_IRQ_OFF, 34762306a36Sopenharmony_ci}; 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_cistatic inline struct mt7915_phy * 35062306a36Sopenharmony_cimt7915_hw_phy(struct ieee80211_hw *hw) 35162306a36Sopenharmony_ci{ 35262306a36Sopenharmony_ci struct mt76_phy *phy = hw->priv; 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci return phy->priv; 35562306a36Sopenharmony_ci} 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_cistatic inline struct mt7915_dev * 35862306a36Sopenharmony_cimt7915_hw_dev(struct ieee80211_hw *hw) 35962306a36Sopenharmony_ci{ 36062306a36Sopenharmony_ci struct mt76_phy *phy = hw->priv; 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci return container_of(phy->dev, struct mt7915_dev, mt76); 36362306a36Sopenharmony_ci} 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_cistatic inline struct mt7915_phy * 36662306a36Sopenharmony_cimt7915_ext_phy(struct mt7915_dev *dev) 36762306a36Sopenharmony_ci{ 36862306a36Sopenharmony_ci struct mt76_phy *phy = dev->mt76.phys[MT_BAND1]; 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci if (!phy) 37162306a36Sopenharmony_ci return NULL; 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci return phy->priv; 37462306a36Sopenharmony_ci} 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_cistatic inline u32 mt7915_check_adie(struct mt7915_dev *dev, bool sku) 37762306a36Sopenharmony_ci{ 37862306a36Sopenharmony_ci u32 mask = sku ? MT_CONNINFRA_SKU_MASK : MT_ADIE_TYPE_MASK; 37962306a36Sopenharmony_ci if (!is_mt798x(&dev->mt76)) 38062306a36Sopenharmony_ci return 0; 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci return mt76_rr(dev, MT_CONNINFRA_SKU_DEC_ADDR) & mask; 38362306a36Sopenharmony_ci} 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_ciextern const struct ieee80211_ops mt7915_ops; 38662306a36Sopenharmony_ciextern const struct mt76_testmode_ops mt7915_testmode_ops; 38762306a36Sopenharmony_ciextern struct pci_driver mt7915_pci_driver; 38862306a36Sopenharmony_ciextern struct pci_driver mt7915_hif_driver; 38962306a36Sopenharmony_ciextern struct platform_driver mt798x_wmac_driver; 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci#ifdef CONFIG_MT798X_WMAC 39262306a36Sopenharmony_ciint mt7986_wmac_enable(struct mt7915_dev *dev); 39362306a36Sopenharmony_civoid mt7986_wmac_disable(struct mt7915_dev *dev); 39462306a36Sopenharmony_ci#else 39562306a36Sopenharmony_cistatic inline int mt7986_wmac_enable(struct mt7915_dev *dev) 39662306a36Sopenharmony_ci{ 39762306a36Sopenharmony_ci return 0; 39862306a36Sopenharmony_ci} 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_cistatic inline void mt7986_wmac_disable(struct mt7915_dev *dev) 40162306a36Sopenharmony_ci{ 40262306a36Sopenharmony_ci} 40362306a36Sopenharmony_ci#endif 40462306a36Sopenharmony_cistruct mt7915_dev *mt7915_mmio_probe(struct device *pdev, 40562306a36Sopenharmony_ci void __iomem *mem_base, u32 device_id); 40662306a36Sopenharmony_civoid mt7915_wfsys_reset(struct mt7915_dev *dev); 40762306a36Sopenharmony_ciirqreturn_t mt7915_irq_handler(int irq, void *dev_instance); 40862306a36Sopenharmony_ciu64 __mt7915_get_tsf(struct ieee80211_hw *hw, struct mt7915_vif *mvif); 40962306a36Sopenharmony_ciu32 mt7915_wed_init_buf(void *ptr, dma_addr_t phys, int token_id); 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ciint mt7915_register_device(struct mt7915_dev *dev); 41262306a36Sopenharmony_civoid mt7915_unregister_device(struct mt7915_dev *dev); 41362306a36Sopenharmony_ciint mt7915_eeprom_init(struct mt7915_dev *dev); 41462306a36Sopenharmony_civoid mt7915_eeprom_parse_hw_cap(struct mt7915_dev *dev, 41562306a36Sopenharmony_ci struct mt7915_phy *phy); 41662306a36Sopenharmony_ciint mt7915_eeprom_get_target_power(struct mt7915_dev *dev, 41762306a36Sopenharmony_ci struct ieee80211_channel *chan, 41862306a36Sopenharmony_ci u8 chain_idx); 41962306a36Sopenharmony_cis8 mt7915_eeprom_get_power_delta(struct mt7915_dev *dev, int band); 42062306a36Sopenharmony_ciint mt7915_dma_init(struct mt7915_dev *dev, struct mt7915_phy *phy2); 42162306a36Sopenharmony_civoid mt7915_dma_prefetch(struct mt7915_dev *dev); 42262306a36Sopenharmony_civoid mt7915_dma_cleanup(struct mt7915_dev *dev); 42362306a36Sopenharmony_ciint mt7915_dma_reset(struct mt7915_dev *dev, bool force); 42462306a36Sopenharmony_ciint mt7915_dma_start(struct mt7915_dev *dev, bool reset, bool wed_reset); 42562306a36Sopenharmony_ciint mt7915_txbf_init(struct mt7915_dev *dev); 42662306a36Sopenharmony_civoid mt7915_init_txpower(struct mt7915_dev *dev, 42762306a36Sopenharmony_ci struct ieee80211_supported_band *sband); 42862306a36Sopenharmony_civoid mt7915_reset(struct mt7915_dev *dev); 42962306a36Sopenharmony_ciint mt7915_run(struct ieee80211_hw *hw); 43062306a36Sopenharmony_ciint mt7915_mcu_init(struct mt7915_dev *dev); 43162306a36Sopenharmony_ciint mt7915_mcu_init_firmware(struct mt7915_dev *dev); 43262306a36Sopenharmony_ciint mt7915_mcu_twt_agrt_update(struct mt7915_dev *dev, 43362306a36Sopenharmony_ci struct mt7915_vif *mvif, 43462306a36Sopenharmony_ci struct mt7915_twt_flow *flow, 43562306a36Sopenharmony_ci int cmd); 43662306a36Sopenharmony_ciint mt7915_mcu_add_dev_info(struct mt7915_phy *phy, 43762306a36Sopenharmony_ci struct ieee80211_vif *vif, bool enable); 43862306a36Sopenharmony_ciint mt7915_mcu_add_bss_info(struct mt7915_phy *phy, 43962306a36Sopenharmony_ci struct ieee80211_vif *vif, int enable); 44062306a36Sopenharmony_ciint mt7915_mcu_add_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif, 44162306a36Sopenharmony_ci struct ieee80211_sta *sta, bool enable); 44262306a36Sopenharmony_ciint mt7915_mcu_add_tx_ba(struct mt7915_dev *dev, 44362306a36Sopenharmony_ci struct ieee80211_ampdu_params *params, 44462306a36Sopenharmony_ci bool add); 44562306a36Sopenharmony_ciint mt7915_mcu_add_rx_ba(struct mt7915_dev *dev, 44662306a36Sopenharmony_ci struct ieee80211_ampdu_params *params, 44762306a36Sopenharmony_ci bool add); 44862306a36Sopenharmony_ciint mt7915_mcu_update_bss_color(struct mt7915_dev *dev, struct ieee80211_vif *vif, 44962306a36Sopenharmony_ci struct cfg80211_he_bss_color *he_bss_color); 45062306a36Sopenharmony_ciint mt7915_mcu_add_inband_discov(struct mt7915_dev *dev, struct ieee80211_vif *vif, 45162306a36Sopenharmony_ci u32 changed); 45262306a36Sopenharmony_ciint mt7915_mcu_add_beacon(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 45362306a36Sopenharmony_ci int enable, u32 changed); 45462306a36Sopenharmony_ciint mt7915_mcu_add_obss_spr(struct mt7915_phy *phy, struct ieee80211_vif *vif, 45562306a36Sopenharmony_ci struct ieee80211_he_obss_pd *he_obss_pd); 45662306a36Sopenharmony_ciint mt7915_mcu_add_rate_ctrl(struct mt7915_dev *dev, struct ieee80211_vif *vif, 45762306a36Sopenharmony_ci struct ieee80211_sta *sta, bool changed); 45862306a36Sopenharmony_ciint mt7915_mcu_add_smps(struct mt7915_dev *dev, struct ieee80211_vif *vif, 45962306a36Sopenharmony_ci struct ieee80211_sta *sta); 46062306a36Sopenharmony_ciint mt7915_set_channel(struct mt7915_phy *phy); 46162306a36Sopenharmony_ciint mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd); 46262306a36Sopenharmony_ciint mt7915_mcu_set_tx(struct mt7915_dev *dev, struct ieee80211_vif *vif); 46362306a36Sopenharmony_ciint mt7915_mcu_update_edca(struct mt7915_dev *dev, void *req); 46462306a36Sopenharmony_ciint mt7915_mcu_set_fixed_rate_ctrl(struct mt7915_dev *dev, 46562306a36Sopenharmony_ci struct ieee80211_vif *vif, 46662306a36Sopenharmony_ci struct ieee80211_sta *sta, 46762306a36Sopenharmony_ci void *data, u32 field); 46862306a36Sopenharmony_ciint mt7915_mcu_set_eeprom(struct mt7915_dev *dev); 46962306a36Sopenharmony_ciint mt7915_mcu_get_eeprom(struct mt7915_dev *dev, u32 offset); 47062306a36Sopenharmony_ciint mt7915_mcu_get_eeprom_free_block(struct mt7915_dev *dev, u8 *block_num); 47162306a36Sopenharmony_ciint mt7915_mcu_set_mac(struct mt7915_dev *dev, int band, bool enable, 47262306a36Sopenharmony_ci bool hdr_trans); 47362306a36Sopenharmony_ciint mt7915_mcu_set_test_param(struct mt7915_dev *dev, u8 param, bool test_mode, 47462306a36Sopenharmony_ci u8 en); 47562306a36Sopenharmony_ciint mt7915_mcu_set_ser(struct mt7915_dev *dev, u8 action, u8 set, u8 band); 47662306a36Sopenharmony_ciint mt7915_mcu_set_sku_en(struct mt7915_phy *phy, bool enable); 47762306a36Sopenharmony_ciint mt7915_mcu_set_txpower_sku(struct mt7915_phy *phy); 47862306a36Sopenharmony_ciint mt7915_mcu_get_txpower_sku(struct mt7915_phy *phy, s8 *txpower, int len); 47962306a36Sopenharmony_ciint mt7915_mcu_set_txpower_frame_min(struct mt7915_phy *phy, s8 txpower); 48062306a36Sopenharmony_ciint mt7915_mcu_set_txpower_frame(struct mt7915_phy *phy, 48162306a36Sopenharmony_ci struct ieee80211_vif *vif, 48262306a36Sopenharmony_ci struct ieee80211_sta *sta, s8 txpower); 48362306a36Sopenharmony_ciint mt7915_mcu_set_txbf(struct mt7915_dev *dev, u8 action); 48462306a36Sopenharmony_ciint mt7915_mcu_set_fcc5_lpn(struct mt7915_dev *dev, int val); 48562306a36Sopenharmony_ciint mt7915_mcu_set_pulse_th(struct mt7915_dev *dev, 48662306a36Sopenharmony_ci const struct mt7915_dfs_pulse *pulse); 48762306a36Sopenharmony_ciint mt7915_mcu_set_radar_th(struct mt7915_dev *dev, int index, 48862306a36Sopenharmony_ci const struct mt7915_dfs_pattern *pattern); 48962306a36Sopenharmony_ciint mt7915_mcu_set_muru_ctrl(struct mt7915_dev *dev, u32 cmd, u32 val); 49062306a36Sopenharmony_ciint mt7915_mcu_apply_group_cal(struct mt7915_dev *dev); 49162306a36Sopenharmony_ciint mt7915_mcu_apply_tx_dpd(struct mt7915_phy *phy); 49262306a36Sopenharmony_ciint mt7915_mcu_get_chan_mib_info(struct mt7915_phy *phy, bool chan_switch); 49362306a36Sopenharmony_ciint mt7915_mcu_get_temperature(struct mt7915_phy *phy); 49462306a36Sopenharmony_ciint mt7915_mcu_set_thermal_throttling(struct mt7915_phy *phy, u8 state); 49562306a36Sopenharmony_ciint mt7915_mcu_set_thermal_protect(struct mt7915_phy *phy); 49662306a36Sopenharmony_ciint mt7915_mcu_get_rx_rate(struct mt7915_phy *phy, struct ieee80211_vif *vif, 49762306a36Sopenharmony_ci struct ieee80211_sta *sta, struct rate_info *rate); 49862306a36Sopenharmony_ciint mt7915_mcu_rdd_background_enable(struct mt7915_phy *phy, 49962306a36Sopenharmony_ci struct cfg80211_chan_def *chandef); 50062306a36Sopenharmony_ciint mt7915_mcu_wed_wa_tx_stats(struct mt7915_dev *dev, u16 wcid); 50162306a36Sopenharmony_ciint mt7915_mcu_rf_regval(struct mt7915_dev *dev, u32 regidx, u32 *val, bool set); 50262306a36Sopenharmony_ciint mt7915_mcu_wa_cmd(struct mt7915_dev *dev, int cmd, u32 a1, u32 a2, u32 a3); 50362306a36Sopenharmony_ciint mt7915_mcu_fw_log_2_host(struct mt7915_dev *dev, u8 type, u8 ctrl); 50462306a36Sopenharmony_ciint mt7915_mcu_fw_dbg_ctrl(struct mt7915_dev *dev, u32 module, u8 level); 50562306a36Sopenharmony_civoid mt7915_mcu_rx_event(struct mt7915_dev *dev, struct sk_buff *skb); 50662306a36Sopenharmony_civoid mt7915_mcu_exit(struct mt7915_dev *dev); 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_cistatic inline u16 mt7915_wtbl_size(struct mt7915_dev *dev) 50962306a36Sopenharmony_ci{ 51062306a36Sopenharmony_ci return is_mt7915(&dev->mt76) ? MT7915_WTBL_SIZE : MT7916_WTBL_SIZE; 51162306a36Sopenharmony_ci} 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_cistatic inline u16 mt7915_eeprom_size(struct mt7915_dev *dev) 51462306a36Sopenharmony_ci{ 51562306a36Sopenharmony_ci return is_mt7915(&dev->mt76) ? MT7915_EEPROM_SIZE : MT7916_EEPROM_SIZE; 51662306a36Sopenharmony_ci} 51762306a36Sopenharmony_ci 51862306a36Sopenharmony_civoid mt7915_dual_hif_set_irq_mask(struct mt7915_dev *dev, bool write_reg, 51962306a36Sopenharmony_ci u32 clear, u32 set); 52062306a36Sopenharmony_ci 52162306a36Sopenharmony_cistatic inline void mt7915_irq_enable(struct mt7915_dev *dev, u32 mask) 52262306a36Sopenharmony_ci{ 52362306a36Sopenharmony_ci if (dev->hif2) 52462306a36Sopenharmony_ci mt7915_dual_hif_set_irq_mask(dev, false, 0, mask); 52562306a36Sopenharmony_ci else 52662306a36Sopenharmony_ci mt76_set_irq_mask(&dev->mt76, 0, 0, mask); 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_ci tasklet_schedule(&dev->mt76.irq_tasklet); 52962306a36Sopenharmony_ci} 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_cistatic inline void mt7915_irq_disable(struct mt7915_dev *dev, u32 mask) 53262306a36Sopenharmony_ci{ 53362306a36Sopenharmony_ci if (dev->hif2) 53462306a36Sopenharmony_ci mt7915_dual_hif_set_irq_mask(dev, true, mask, 0); 53562306a36Sopenharmony_ci else 53662306a36Sopenharmony_ci mt76_set_irq_mask(&dev->mt76, MT_INT_MASK_CSR, mask, 0); 53762306a36Sopenharmony_ci} 53862306a36Sopenharmony_ci 53962306a36Sopenharmony_civoid mt7915_memcpy_fromio(struct mt7915_dev *dev, void *buf, u32 offset, 54062306a36Sopenharmony_ci size_t len); 54162306a36Sopenharmony_ci 54262306a36Sopenharmony_civoid mt7915_mac_init(struct mt7915_dev *dev); 54362306a36Sopenharmony_ciu32 mt7915_mac_wtbl_lmac_addr(struct mt7915_dev *dev, u16 wcid, u8 dw); 54462306a36Sopenharmony_cibool mt7915_mac_wtbl_update(struct mt7915_dev *dev, int idx, u32 mask); 54562306a36Sopenharmony_civoid mt7915_mac_reset_counters(struct mt7915_phy *phy); 54662306a36Sopenharmony_civoid mt7915_mac_cca_stats_reset(struct mt7915_phy *phy); 54762306a36Sopenharmony_civoid mt7915_mac_enable_nf(struct mt7915_dev *dev, bool ext_phy); 54862306a36Sopenharmony_civoid mt7915_mac_enable_rtscts(struct mt7915_dev *dev, 54962306a36Sopenharmony_ci struct ieee80211_vif *vif, bool enable); 55062306a36Sopenharmony_civoid mt7915_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi, 55162306a36Sopenharmony_ci struct sk_buff *skb, struct mt76_wcid *wcid, int pid, 55262306a36Sopenharmony_ci struct ieee80211_key_conf *key, 55362306a36Sopenharmony_ci enum mt76_txq_id qid, u32 changed); 55462306a36Sopenharmony_civoid mt7915_mac_set_timing(struct mt7915_phy *phy); 55562306a36Sopenharmony_ciint mt7915_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, 55662306a36Sopenharmony_ci struct ieee80211_sta *sta); 55762306a36Sopenharmony_civoid mt7915_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif, 55862306a36Sopenharmony_ci struct ieee80211_sta *sta); 55962306a36Sopenharmony_civoid mt7915_mac_work(struct work_struct *work); 56062306a36Sopenharmony_civoid mt7915_mac_reset_work(struct work_struct *work); 56162306a36Sopenharmony_civoid mt7915_mac_dump_work(struct work_struct *work); 56262306a36Sopenharmony_civoid mt7915_mac_sta_rc_work(struct work_struct *work); 56362306a36Sopenharmony_civoid mt7915_mac_update_stats(struct mt7915_phy *phy); 56462306a36Sopenharmony_civoid mt7915_mac_twt_teardown_flow(struct mt7915_dev *dev, 56562306a36Sopenharmony_ci struct mt7915_sta *msta, 56662306a36Sopenharmony_ci u8 flowid); 56762306a36Sopenharmony_civoid mt7915_mac_add_twt_setup(struct ieee80211_hw *hw, 56862306a36Sopenharmony_ci struct ieee80211_sta *sta, 56962306a36Sopenharmony_ci struct ieee80211_twt_setup *twt); 57062306a36Sopenharmony_ciint mt7915_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, 57162306a36Sopenharmony_ci enum mt76_txq_id qid, struct mt76_wcid *wcid, 57262306a36Sopenharmony_ci struct ieee80211_sta *sta, 57362306a36Sopenharmony_ci struct mt76_tx_info *tx_info); 57462306a36Sopenharmony_civoid mt7915_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q, 57562306a36Sopenharmony_ci struct sk_buff *skb, u32 *info); 57662306a36Sopenharmony_cibool mt7915_rx_check(struct mt76_dev *mdev, void *data, int len); 57762306a36Sopenharmony_civoid mt7915_stats_work(struct work_struct *work); 57862306a36Sopenharmony_ciint mt76_dfs_start_rdd(struct mt7915_dev *dev, bool force); 57962306a36Sopenharmony_ciint mt7915_dfs_init_radar_detector(struct mt7915_phy *phy); 58062306a36Sopenharmony_civoid mt7915_set_stream_he_caps(struct mt7915_phy *phy); 58162306a36Sopenharmony_civoid mt7915_set_stream_vht_txbf_caps(struct mt7915_phy *phy); 58262306a36Sopenharmony_civoid mt7915_update_channel(struct mt76_phy *mphy); 58362306a36Sopenharmony_ciint mt7915_mcu_muru_debug_set(struct mt7915_dev *dev, bool enable); 58462306a36Sopenharmony_ciint mt7915_mcu_muru_debug_get(struct mt7915_phy *phy); 58562306a36Sopenharmony_ciint mt7915_mcu_wed_enable_rx_stats(struct mt7915_dev *dev); 58662306a36Sopenharmony_ciint mt7915_init_debugfs(struct mt7915_phy *phy); 58762306a36Sopenharmony_civoid mt7915_debugfs_rx_fw_monitor(struct mt7915_dev *dev, const void *data, int len); 58862306a36Sopenharmony_cibool mt7915_debugfs_rx_log(struct mt7915_dev *dev, const void *data, int len); 58962306a36Sopenharmony_ci#ifdef CONFIG_MAC80211_DEBUGFS 59062306a36Sopenharmony_civoid mt7915_sta_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 59162306a36Sopenharmony_ci struct ieee80211_sta *sta, struct dentry *dir); 59262306a36Sopenharmony_ci#endif 59362306a36Sopenharmony_ciint mt7915_mmio_wed_init(struct mt7915_dev *dev, void *pdev_ptr, 59462306a36Sopenharmony_ci bool pci, int *irq); 59562306a36Sopenharmony_ci 59662306a36Sopenharmony_ci#endif 597