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