1cbb3ec25SBjoern A. Zeeb /* SPDX-License-Identifier: ISC */
2cbb3ec25SBjoern A. Zeeb /* Copyright (C) 2023 MediaTek Inc. */
3cbb3ec25SBjoern A. Zeeb
4cbb3ec25SBjoern A. Zeeb #ifndef __MT792X_H
5cbb3ec25SBjoern A. Zeeb #define __MT792X_H
6cbb3ec25SBjoern A. Zeeb
7cbb3ec25SBjoern A. Zeeb #include <linux/interrupt.h>
8cbb3ec25SBjoern A. Zeeb #include <linux/ktime.h>
9cbb3ec25SBjoern A. Zeeb
10cbb3ec25SBjoern A. Zeeb #include "mt76_connac_mcu.h"
11cbb3ec25SBjoern A. Zeeb #include "mt792x_regs.h"
12cbb3ec25SBjoern A. Zeeb #include "mt792x_acpi_sar.h"
13cbb3ec25SBjoern A. Zeeb
14cbb3ec25SBjoern A. Zeeb #define MT792x_PM_TIMEOUT (HZ / 12)
15cbb3ec25SBjoern A. Zeeb #define MT792x_HW_SCAN_TIMEOUT (HZ / 10)
16cbb3ec25SBjoern A. Zeeb
17cbb3ec25SBjoern A. Zeeb #define MT792x_MAX_INTERFACES 4
18cbb3ec25SBjoern A. Zeeb #define MT792x_WTBL_SIZE 20
19cbb3ec25SBjoern A. Zeeb #define MT792x_WTBL_RESERVED (MT792x_WTBL_SIZE - 1)
20cbb3ec25SBjoern A. Zeeb #define MT792x_WTBL_STA (MT792x_WTBL_RESERVED - MT792x_MAX_INTERFACES)
21cbb3ec25SBjoern A. Zeeb
22cbb3ec25SBjoern A. Zeeb #define MT792x_CFEND_RATE_DEFAULT 0x49 /* OFDM 24M */
23cbb3ec25SBjoern A. Zeeb #define MT792x_CFEND_RATE_11B 0x03 /* 11B LP, 11M */
24cbb3ec25SBjoern A. Zeeb
25cbb3ec25SBjoern A. Zeeb #define MT792x_FW_TAG_FEATURE 4
26cbb3ec25SBjoern A. Zeeb #define MT792x_FW_CAP_CNM BIT(7)
27cbb3ec25SBjoern A. Zeeb
28*8ba4d145SBjoern A. Zeeb #define MT792x_CHIP_CAP_CLC_EVT_EN BIT(0)
29*8ba4d145SBjoern A. Zeeb #define MT792x_CHIP_CAP_RSSI_NOTIFY_EVT_EN BIT(1)
30*8ba4d145SBjoern A. Zeeb #define MT792x_CHIP_CAP_MLO_EVT_EN BIT(2)
31*8ba4d145SBjoern A. Zeeb #define MT792x_CHIP_CAP_WF_RF_PIN_CTRL_EVT_EN BIT(3)
32*8ba4d145SBjoern A. Zeeb
33cbb3ec25SBjoern A. Zeeb /* NOTE: used to map mt76_rates. idx may change if firmware expands table */
34cbb3ec25SBjoern A. Zeeb #define MT792x_BASIC_RATES_TBL 11
35cbb3ec25SBjoern A. Zeeb
36cbb3ec25SBjoern A. Zeeb #define MT792x_WATCHDOG_TIME (HZ / 4)
37cbb3ec25SBjoern A. Zeeb
38cbb3ec25SBjoern A. Zeeb #define MT792x_DRV_OWN_RETRY_COUNT 10
39cbb3ec25SBjoern A. Zeeb #define MT792x_MCU_INIT_RETRY_COUNT 10
40cbb3ec25SBjoern A. Zeeb #define MT792x_WFSYS_INIT_RETRY_COUNT 2
41cbb3ec25SBjoern A. Zeeb
42*8ba4d145SBjoern A. Zeeb #define MT7920_FIRMWARE_WM "mediatek/WIFI_RAM_CODE_MT7961_1a.bin"
43cbb3ec25SBjoern A. Zeeb #define MT7921_FIRMWARE_WM "mediatek/WIFI_RAM_CODE_MT7961_1.bin"
44cbb3ec25SBjoern A. Zeeb #define MT7922_FIRMWARE_WM "mediatek/WIFI_RAM_CODE_MT7922_1.bin"
45*8ba4d145SBjoern A. Zeeb #define MT7925_FIRMWARE_WM "mediatek/mt7925/WIFI_RAM_CODE_MT7925_1_1.bin"
46cbb3ec25SBjoern A. Zeeb
47*8ba4d145SBjoern A. Zeeb #define MT7920_ROM_PATCH "mediatek/WIFI_MT7961_patch_mcu_1a_2_hdr.bin"
48cbb3ec25SBjoern A. Zeeb #define MT7921_ROM_PATCH "mediatek/WIFI_MT7961_patch_mcu_1_2_hdr.bin"
49cbb3ec25SBjoern A. Zeeb #define MT7922_ROM_PATCH "mediatek/WIFI_MT7922_patch_mcu_1_1_hdr.bin"
50*8ba4d145SBjoern A. Zeeb #define MT7925_ROM_PATCH "mediatek/mt7925/WIFI_MT7925_PATCH_MCU_1_1_hdr.bin"
51*8ba4d145SBjoern A. Zeeb
52*8ba4d145SBjoern A. Zeeb #define MT792x_SDIO_HDR_TX_BYTES GENMASK(15, 0)
53*8ba4d145SBjoern A. Zeeb #define MT792x_SDIO_HDR_PKT_TYPE GENMASK(17, 16)
54cbb3ec25SBjoern A. Zeeb
55cbb3ec25SBjoern A. Zeeb struct mt792x_vif;
56cbb3ec25SBjoern A. Zeeb struct mt792x_sta;
57cbb3ec25SBjoern A. Zeeb
58cbb3ec25SBjoern A. Zeeb struct mt792x_realease_info {
59cbb3ec25SBjoern A. Zeeb __le16 len;
60cbb3ec25SBjoern A. Zeeb u8 pad_len;
61cbb3ec25SBjoern A. Zeeb u8 tag;
62cbb3ec25SBjoern A. Zeeb } __packed;
63cbb3ec25SBjoern A. Zeeb
64cbb3ec25SBjoern A. Zeeb struct mt792x_fw_features {
65cbb3ec25SBjoern A. Zeeb u8 segment;
66cbb3ec25SBjoern A. Zeeb u8 data;
67cbb3ec25SBjoern A. Zeeb u8 rsv[14];
68cbb3ec25SBjoern A. Zeeb } __packed;
69cbb3ec25SBjoern A. Zeeb
70cbb3ec25SBjoern A. Zeeb enum {
71cbb3ec25SBjoern A. Zeeb MT792x_CLC_POWER,
72*8ba4d145SBjoern A. Zeeb MT792x_CLC_POWER_EXT,
73cbb3ec25SBjoern A. Zeeb MT792x_CLC_MAX_NUM,
74cbb3ec25SBjoern A. Zeeb };
75cbb3ec25SBjoern A. Zeeb
76*8ba4d145SBjoern A. Zeeb enum mt792x_reg_power_type {
77*8ba4d145SBjoern A. Zeeb MT_AP_UNSET = 0,
78*8ba4d145SBjoern A. Zeeb MT_AP_DEFAULT,
79*8ba4d145SBjoern A. Zeeb MT_AP_LPI,
80*8ba4d145SBjoern A. Zeeb MT_AP_SP,
81*8ba4d145SBjoern A. Zeeb MT_AP_VLP,
82*8ba4d145SBjoern A. Zeeb };
83*8ba4d145SBjoern A. Zeeb
84cbb3ec25SBjoern A. Zeeb DECLARE_EWMA(avg_signal, 10, 8)
85cbb3ec25SBjoern A. Zeeb
86*8ba4d145SBjoern A. Zeeb struct mt792x_link_sta {
87cbb3ec25SBjoern A. Zeeb struct mt76_wcid wcid; /* must be first */
88cbb3ec25SBjoern A. Zeeb
89cbb3ec25SBjoern A. Zeeb u32 airtime_ac[8];
90cbb3ec25SBjoern A. Zeeb
91cbb3ec25SBjoern A. Zeeb int ack_signal;
92cbb3ec25SBjoern A. Zeeb struct ewma_avg_signal avg_ack_signal;
93cbb3ec25SBjoern A. Zeeb
94cbb3ec25SBjoern A. Zeeb unsigned long last_txs;
95cbb3ec25SBjoern A. Zeeb
96cbb3ec25SBjoern A. Zeeb struct mt76_connac_sta_key_conf bip;
97*8ba4d145SBjoern A. Zeeb
98*8ba4d145SBjoern A. Zeeb struct mt792x_sta *sta;
99*8ba4d145SBjoern A. Zeeb
100*8ba4d145SBjoern A. Zeeb struct ieee80211_link_sta *pri_link;
101*8ba4d145SBjoern A. Zeeb };
102*8ba4d145SBjoern A. Zeeb
103*8ba4d145SBjoern A. Zeeb struct mt792x_sta {
104*8ba4d145SBjoern A. Zeeb struct mt792x_link_sta deflink; /* must be first */
105*8ba4d145SBjoern A. Zeeb struct mt792x_link_sta __rcu *link[IEEE80211_MLD_MAX_NUM_LINKS];
106*8ba4d145SBjoern A. Zeeb
107*8ba4d145SBjoern A. Zeeb struct mt792x_vif *vif;
108*8ba4d145SBjoern A. Zeeb
109*8ba4d145SBjoern A. Zeeb u16 valid_links;
110*8ba4d145SBjoern A. Zeeb u8 deflink_id;
111cbb3ec25SBjoern A. Zeeb };
112cbb3ec25SBjoern A. Zeeb
113cbb3ec25SBjoern A. Zeeb DECLARE_EWMA(rssi, 10, 8);
114cbb3ec25SBjoern A. Zeeb
115*8ba4d145SBjoern A. Zeeb struct mt792x_chanctx {
116*8ba4d145SBjoern A. Zeeb struct mt792x_bss_conf *bss_conf;
117*8ba4d145SBjoern A. Zeeb };
118*8ba4d145SBjoern A. Zeeb
119*8ba4d145SBjoern A. Zeeb struct mt792x_bss_conf {
120*8ba4d145SBjoern A. Zeeb struct mt76_vif_link mt76; /* must be first */
121*8ba4d145SBjoern A. Zeeb struct mt792x_vif *vif;
122*8ba4d145SBjoern A. Zeeb struct ewma_rssi rssi;
123*8ba4d145SBjoern A. Zeeb struct ieee80211_tx_queue_params queue_params[IEEE80211_NUM_ACS];
124*8ba4d145SBjoern A. Zeeb unsigned int link_id;
125*8ba4d145SBjoern A. Zeeb };
126*8ba4d145SBjoern A. Zeeb
127cbb3ec25SBjoern A. Zeeb struct mt792x_vif {
128*8ba4d145SBjoern A. Zeeb struct mt792x_bss_conf bss_conf; /* must be first */
129*8ba4d145SBjoern A. Zeeb struct mt792x_bss_conf __rcu *link_conf[IEEE80211_MLD_MAX_NUM_LINKS];
130cbb3ec25SBjoern A. Zeeb
131cbb3ec25SBjoern A. Zeeb struct mt792x_sta sta;
132cbb3ec25SBjoern A. Zeeb struct mt792x_sta *wep_sta;
133cbb3ec25SBjoern A. Zeeb
134cbb3ec25SBjoern A. Zeeb struct mt792x_phy *phy;
135*8ba4d145SBjoern A. Zeeb u16 valid_links;
136*8ba4d145SBjoern A. Zeeb u8 deflink_id;
137cbb3ec25SBjoern A. Zeeb
138*8ba4d145SBjoern A. Zeeb struct work_struct csa_work;
139*8ba4d145SBjoern A. Zeeb struct timer_list csa_timer;
140cbb3ec25SBjoern A. Zeeb };
141cbb3ec25SBjoern A. Zeeb
142cbb3ec25SBjoern A. Zeeb struct mt792x_phy {
143cbb3ec25SBjoern A. Zeeb struct mt76_phy *mt76;
144cbb3ec25SBjoern A. Zeeb struct mt792x_dev *dev;
145cbb3ec25SBjoern A. Zeeb
146cbb3ec25SBjoern A. Zeeb struct ieee80211_sband_iftype_data iftype[NUM_NL80211_BANDS][NUM_NL80211_IFTYPES];
147cbb3ec25SBjoern A. Zeeb
148cbb3ec25SBjoern A. Zeeb u64 omac_mask;
149cbb3ec25SBjoern A. Zeeb
150cbb3ec25SBjoern A. Zeeb u16 noise;
151cbb3ec25SBjoern A. Zeeb
152cbb3ec25SBjoern A. Zeeb s16 coverage_class;
153cbb3ec25SBjoern A. Zeeb u8 slottime;
154cbb3ec25SBjoern A. Zeeb
155cbb3ec25SBjoern A. Zeeb u32 rx_ampdu_ts;
156cbb3ec25SBjoern A. Zeeb u32 ampdu_ref;
157cbb3ec25SBjoern A. Zeeb
158cbb3ec25SBjoern A. Zeeb struct mt76_mib_stats mib;
159cbb3ec25SBjoern A. Zeeb
160cbb3ec25SBjoern A. Zeeb u8 sta_work_count;
161*8ba4d145SBjoern A. Zeeb u8 clc_chan_conf;
162*8ba4d145SBjoern A. Zeeb enum mt792x_reg_power_type power_type;
163cbb3ec25SBjoern A. Zeeb
164cbb3ec25SBjoern A. Zeeb struct sk_buff_head scan_event_list;
165cbb3ec25SBjoern A. Zeeb struct delayed_work scan_work;
166cbb3ec25SBjoern A. Zeeb #ifdef CONFIG_ACPI
167cbb3ec25SBjoern A. Zeeb void *acpisar;
168cbb3ec25SBjoern A. Zeeb #endif
169cbb3ec25SBjoern A. Zeeb void *clc[MT792x_CLC_MAX_NUM];
170*8ba4d145SBjoern A. Zeeb u64 chip_cap;
171*8ba4d145SBjoern A. Zeeb u16 eml_cap;
172cbb3ec25SBjoern A. Zeeb
173cbb3ec25SBjoern A. Zeeb struct work_struct roc_work;
174cbb3ec25SBjoern A. Zeeb struct timer_list roc_timer;
175cbb3ec25SBjoern A. Zeeb wait_queue_head_t roc_wait;
176cbb3ec25SBjoern A. Zeeb u8 roc_token_id;
177cbb3ec25SBjoern A. Zeeb bool roc_grant;
178cbb3ec25SBjoern A. Zeeb };
179cbb3ec25SBjoern A. Zeeb
180cbb3ec25SBjoern A. Zeeb struct mt792x_irq_map {
181cbb3ec25SBjoern A. Zeeb u32 host_irq_enable;
182cbb3ec25SBjoern A. Zeeb struct {
183cbb3ec25SBjoern A. Zeeb u32 all_complete_mask;
184cbb3ec25SBjoern A. Zeeb u32 mcu_complete_mask;
185cbb3ec25SBjoern A. Zeeb } tx;
186cbb3ec25SBjoern A. Zeeb struct {
187cbb3ec25SBjoern A. Zeeb u32 data_complete_mask;
188cbb3ec25SBjoern A. Zeeb u32 wm_complete_mask;
189cbb3ec25SBjoern A. Zeeb u32 wm2_complete_mask;
190cbb3ec25SBjoern A. Zeeb } rx;
191cbb3ec25SBjoern A. Zeeb };
192cbb3ec25SBjoern A. Zeeb
193cbb3ec25SBjoern A. Zeeb #define mt792x_init_reset(dev) ((dev)->hif_ops->init_reset(dev))
194cbb3ec25SBjoern A. Zeeb #define mt792x_dev_reset(dev) ((dev)->hif_ops->reset(dev))
195cbb3ec25SBjoern A. Zeeb #define mt792x_mcu_init(dev) ((dev)->hif_ops->mcu_init(dev))
196cbb3ec25SBjoern A. Zeeb #define __mt792x_mcu_drv_pmctrl(dev) ((dev)->hif_ops->drv_own(dev))
197cbb3ec25SBjoern A. Zeeb #define __mt792x_mcu_fw_pmctrl(dev) ((dev)->hif_ops->fw_own(dev))
198cbb3ec25SBjoern A. Zeeb
199cbb3ec25SBjoern A. Zeeb struct mt792x_hif_ops {
200cbb3ec25SBjoern A. Zeeb int (*init_reset)(struct mt792x_dev *dev);
201cbb3ec25SBjoern A. Zeeb int (*reset)(struct mt792x_dev *dev);
202cbb3ec25SBjoern A. Zeeb int (*mcu_init)(struct mt792x_dev *dev);
203cbb3ec25SBjoern A. Zeeb int (*drv_own)(struct mt792x_dev *dev);
204cbb3ec25SBjoern A. Zeeb int (*fw_own)(struct mt792x_dev *dev);
205cbb3ec25SBjoern A. Zeeb };
206cbb3ec25SBjoern A. Zeeb
207cbb3ec25SBjoern A. Zeeb struct mt792x_dev {
208cbb3ec25SBjoern A. Zeeb union { /* must be first */
209cbb3ec25SBjoern A. Zeeb struct mt76_dev mt76;
210cbb3ec25SBjoern A. Zeeb struct mt76_phy mphy;
211cbb3ec25SBjoern A. Zeeb };
212cbb3ec25SBjoern A. Zeeb
213*8ba4d145SBjoern A. Zeeb struct mac_address macaddr_list[8];
214*8ba4d145SBjoern A. Zeeb
215cbb3ec25SBjoern A. Zeeb const struct mt76_bus_ops *bus_ops;
216cbb3ec25SBjoern A. Zeeb struct mt792x_phy phy;
217cbb3ec25SBjoern A. Zeeb
218cbb3ec25SBjoern A. Zeeb struct work_struct reset_work;
219cbb3ec25SBjoern A. Zeeb bool hw_full_reset:1;
220cbb3ec25SBjoern A. Zeeb bool hw_init_done:1;
221cbb3ec25SBjoern A. Zeeb bool fw_assert:1;
222cbb3ec25SBjoern A. Zeeb bool has_eht:1;
223*8ba4d145SBjoern A. Zeeb bool regd_in_progress:1;
224*8ba4d145SBjoern A. Zeeb bool aspm_supported:1;
225*8ba4d145SBjoern A. Zeeb bool hif_idle:1;
226*8ba4d145SBjoern A. Zeeb bool hif_resumed:1;
227*8ba4d145SBjoern A. Zeeb bool sar_inited:1;
228*8ba4d145SBjoern A. Zeeb bool regd_change:1;
229*8ba4d145SBjoern A. Zeeb wait_queue_head_t wait;
230cbb3ec25SBjoern A. Zeeb
231cbb3ec25SBjoern A. Zeeb struct work_struct init_work;
232cbb3ec25SBjoern A. Zeeb
233cbb3ec25SBjoern A. Zeeb u8 fw_debug;
234cbb3ec25SBjoern A. Zeeb u8 fw_features;
235cbb3ec25SBjoern A. Zeeb
236cbb3ec25SBjoern A. Zeeb struct mt76_connac_pm pm;
237cbb3ec25SBjoern A. Zeeb struct mt76_connac_coredump coredump;
238cbb3ec25SBjoern A. Zeeb const struct mt792x_hif_ops *hif_ops;
239cbb3ec25SBjoern A. Zeeb const struct mt792x_irq_map *irq_map;
240cbb3ec25SBjoern A. Zeeb
241cbb3ec25SBjoern A. Zeeb struct work_struct ipv6_ns_work;
242cbb3ec25SBjoern A. Zeeb /* IPv6 addresses for WoWLAN */
243cbb3ec25SBjoern A. Zeeb struct sk_buff_head ipv6_ns_list;
244cbb3ec25SBjoern A. Zeeb
245cbb3ec25SBjoern A. Zeeb enum environment_cap country_ie_env;
246cbb3ec25SBjoern A. Zeeb u32 backup_l1;
247cbb3ec25SBjoern A. Zeeb u32 backup_l2;
248*8ba4d145SBjoern A. Zeeb
249*8ba4d145SBjoern A. Zeeb struct ieee80211_chanctx_conf *new_ctx;
250cbb3ec25SBjoern A. Zeeb };
251cbb3ec25SBjoern A. Zeeb
252*8ba4d145SBjoern A. Zeeb static inline struct mt792x_bss_conf *
mt792x_vif_to_link(struct mt792x_vif * mvif,u8 link_id)253*8ba4d145SBjoern A. Zeeb mt792x_vif_to_link(struct mt792x_vif *mvif, u8 link_id)
254*8ba4d145SBjoern A. Zeeb {
255*8ba4d145SBjoern A. Zeeb struct ieee80211_vif *vif;
256*8ba4d145SBjoern A. Zeeb struct mt792x_bss_conf *bss_conf;
257*8ba4d145SBjoern A. Zeeb
258*8ba4d145SBjoern A. Zeeb vif = container_of((void *)mvif, struct ieee80211_vif, drv_priv);
259*8ba4d145SBjoern A. Zeeb
260*8ba4d145SBjoern A. Zeeb if (!ieee80211_vif_is_mld(vif) ||
261*8ba4d145SBjoern A. Zeeb link_id >= IEEE80211_LINK_UNSPECIFIED)
262*8ba4d145SBjoern A. Zeeb return &mvif->bss_conf;
263*8ba4d145SBjoern A. Zeeb
264*8ba4d145SBjoern A. Zeeb bss_conf = rcu_dereference_protected(mvif->link_conf[link_id],
265*8ba4d145SBjoern A. Zeeb lockdep_is_held(&mvif->phy->dev->mt76.mutex));
266*8ba4d145SBjoern A. Zeeb
267*8ba4d145SBjoern A. Zeeb return bss_conf ? bss_conf : &mvif->bss_conf;
268*8ba4d145SBjoern A. Zeeb }
269*8ba4d145SBjoern A. Zeeb
270*8ba4d145SBjoern A. Zeeb static inline struct mt792x_link_sta *
mt792x_sta_to_link(struct mt792x_sta * msta,u8 link_id)271*8ba4d145SBjoern A. Zeeb mt792x_sta_to_link(struct mt792x_sta *msta, u8 link_id)
272*8ba4d145SBjoern A. Zeeb {
273*8ba4d145SBjoern A. Zeeb struct ieee80211_vif *vif;
274*8ba4d145SBjoern A. Zeeb
275*8ba4d145SBjoern A. Zeeb vif = container_of((void *)msta->vif, struct ieee80211_vif, drv_priv);
276*8ba4d145SBjoern A. Zeeb
277*8ba4d145SBjoern A. Zeeb if (!ieee80211_vif_is_mld(vif) ||
278*8ba4d145SBjoern A. Zeeb link_id >= IEEE80211_LINK_UNSPECIFIED)
279*8ba4d145SBjoern A. Zeeb return &msta->deflink;
280*8ba4d145SBjoern A. Zeeb
281*8ba4d145SBjoern A. Zeeb return rcu_dereference_protected(msta->link[link_id],
282*8ba4d145SBjoern A. Zeeb lockdep_is_held(&msta->vif->phy->dev->mt76.mutex));
283*8ba4d145SBjoern A. Zeeb }
284*8ba4d145SBjoern A. Zeeb
285*8ba4d145SBjoern A. Zeeb static inline struct mt792x_bss_conf *
mt792x_link_conf_to_mconf(struct ieee80211_bss_conf * link_conf)286*8ba4d145SBjoern A. Zeeb mt792x_link_conf_to_mconf(struct ieee80211_bss_conf *link_conf)
287*8ba4d145SBjoern A. Zeeb {
288*8ba4d145SBjoern A. Zeeb struct ieee80211_vif *vif = link_conf->vif;
289*8ba4d145SBjoern A. Zeeb struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
290*8ba4d145SBjoern A. Zeeb
291*8ba4d145SBjoern A. Zeeb return mt792x_vif_to_link(mvif, link_conf->link_id);
292*8ba4d145SBjoern A. Zeeb }
293*8ba4d145SBjoern A. Zeeb
294*8ba4d145SBjoern A. Zeeb static inline struct ieee80211_bss_conf *
mt792x_vif_to_bss_conf(struct ieee80211_vif * vif,unsigned int link_id)295*8ba4d145SBjoern A. Zeeb mt792x_vif_to_bss_conf(struct ieee80211_vif *vif, unsigned int link_id)
296*8ba4d145SBjoern A. Zeeb {
297*8ba4d145SBjoern A. Zeeb if (!ieee80211_vif_is_mld(vif) ||
298*8ba4d145SBjoern A. Zeeb link_id >= IEEE80211_LINK_UNSPECIFIED)
299*8ba4d145SBjoern A. Zeeb return &vif->bss_conf;
300*8ba4d145SBjoern A. Zeeb
301*8ba4d145SBjoern A. Zeeb return link_conf_dereference_protected(vif, link_id);
302*8ba4d145SBjoern A. Zeeb }
303*8ba4d145SBjoern A. Zeeb
304*8ba4d145SBjoern A. Zeeb static inline struct ieee80211_link_sta *
mt792x_sta_to_link_sta(struct ieee80211_vif * vif,struct ieee80211_sta * sta,unsigned int link_id)305*8ba4d145SBjoern A. Zeeb mt792x_sta_to_link_sta(struct ieee80211_vif *vif, struct ieee80211_sta *sta,
306*8ba4d145SBjoern A. Zeeb unsigned int link_id)
307*8ba4d145SBjoern A. Zeeb {
308*8ba4d145SBjoern A. Zeeb if (!ieee80211_vif_is_mld(vif) ||
309*8ba4d145SBjoern A. Zeeb link_id >= IEEE80211_LINK_UNSPECIFIED)
310*8ba4d145SBjoern A. Zeeb return &sta->deflink;
311*8ba4d145SBjoern A. Zeeb
312*8ba4d145SBjoern A. Zeeb return link_sta_dereference_protected(sta, link_id);
313*8ba4d145SBjoern A. Zeeb }
314*8ba4d145SBjoern A. Zeeb
315cbb3ec25SBjoern A. Zeeb static inline struct mt792x_dev *
mt792x_hw_dev(struct ieee80211_hw * hw)316cbb3ec25SBjoern A. Zeeb mt792x_hw_dev(struct ieee80211_hw *hw)
317cbb3ec25SBjoern A. Zeeb {
318cbb3ec25SBjoern A. Zeeb struct mt76_phy *phy = hw->priv;
319cbb3ec25SBjoern A. Zeeb
320cbb3ec25SBjoern A. Zeeb return container_of(phy->dev, struct mt792x_dev, mt76);
321cbb3ec25SBjoern A. Zeeb }
322cbb3ec25SBjoern A. Zeeb
323cbb3ec25SBjoern A. Zeeb static inline struct mt792x_phy *
mt792x_hw_phy(struct ieee80211_hw * hw)324cbb3ec25SBjoern A. Zeeb mt792x_hw_phy(struct ieee80211_hw *hw)
325cbb3ec25SBjoern A. Zeeb {
326cbb3ec25SBjoern A. Zeeb struct mt76_phy *phy = hw->priv;
327cbb3ec25SBjoern A. Zeeb
328cbb3ec25SBjoern A. Zeeb return phy->priv;
329cbb3ec25SBjoern A. Zeeb }
330cbb3ec25SBjoern A. Zeeb
331cbb3ec25SBjoern A. Zeeb static inline void
mt792x_get_status_freq_info(struct mt76_rx_status * status,u8 chfreq)332cbb3ec25SBjoern A. Zeeb mt792x_get_status_freq_info(struct mt76_rx_status *status, u8 chfreq)
333cbb3ec25SBjoern A. Zeeb {
334cbb3ec25SBjoern A. Zeeb if (chfreq > 180) {
335cbb3ec25SBjoern A. Zeeb status->band = NL80211_BAND_6GHZ;
336cbb3ec25SBjoern A. Zeeb chfreq = (chfreq - 181) * 4 + 1;
337cbb3ec25SBjoern A. Zeeb } else if (chfreq > 14) {
338cbb3ec25SBjoern A. Zeeb status->band = NL80211_BAND_5GHZ;
339cbb3ec25SBjoern A. Zeeb } else {
340cbb3ec25SBjoern A. Zeeb status->band = NL80211_BAND_2GHZ;
341cbb3ec25SBjoern A. Zeeb }
342cbb3ec25SBjoern A. Zeeb status->freq = ieee80211_channel_to_frequency(chfreq, status->band);
343cbb3ec25SBjoern A. Zeeb }
344cbb3ec25SBjoern A. Zeeb
mt792x_dma_need_reinit(struct mt792x_dev * dev)345cbb3ec25SBjoern A. Zeeb static inline bool mt792x_dma_need_reinit(struct mt792x_dev *dev)
346cbb3ec25SBjoern A. Zeeb {
347cbb3ec25SBjoern A. Zeeb return !mt76_get_field(dev, MT_WFDMA_DUMMY_CR, MT_WFDMA_NEED_REINIT);
348cbb3ec25SBjoern A. Zeeb }
349cbb3ec25SBjoern A. Zeeb
350cbb3ec25SBjoern A. Zeeb #define mt792x_mutex_acquire(dev) \
351cbb3ec25SBjoern A. Zeeb mt76_connac_mutex_acquire(&(dev)->mt76, &(dev)->pm)
352cbb3ec25SBjoern A. Zeeb #define mt792x_mutex_release(dev) \
353cbb3ec25SBjoern A. Zeeb mt76_connac_mutex_release(&(dev)->mt76, &(dev)->pm)
354cbb3ec25SBjoern A. Zeeb
355*8ba4d145SBjoern A. Zeeb void mt792x_stop(struct ieee80211_hw *hw, bool suspend);
356cbb3ec25SBjoern A. Zeeb void mt792x_pm_wake_work(struct work_struct *work);
357cbb3ec25SBjoern A. Zeeb void mt792x_pm_power_save_work(struct work_struct *work);
358cbb3ec25SBjoern A. Zeeb void mt792x_reset(struct mt76_dev *mdev);
359cbb3ec25SBjoern A. Zeeb void mt792x_update_channel(struct mt76_phy *mphy);
360cbb3ec25SBjoern A. Zeeb void mt792x_mac_reset_counters(struct mt792x_phy *phy);
361cbb3ec25SBjoern A. Zeeb void mt792x_mac_init_band(struct mt792x_dev *dev, u8 band);
362cbb3ec25SBjoern A. Zeeb void mt792x_mac_assoc_rssi(struct mt792x_dev *dev, struct sk_buff *skb);
363cbb3ec25SBjoern A. Zeeb struct mt76_wcid *mt792x_rx_get_wcid(struct mt792x_dev *dev, u16 idx,
364cbb3ec25SBjoern A. Zeeb bool unicast);
365cbb3ec25SBjoern A. Zeeb void mt792x_mac_update_mib_stats(struct mt792x_phy *phy);
366cbb3ec25SBjoern A. Zeeb void mt792x_mac_set_timeing(struct mt792x_phy *phy);
367cbb3ec25SBjoern A. Zeeb void mt792x_mac_work(struct work_struct *work);
368cbb3ec25SBjoern A. Zeeb void mt792x_remove_interface(struct ieee80211_hw *hw,
369cbb3ec25SBjoern A. Zeeb struct ieee80211_vif *vif);
370cbb3ec25SBjoern A. Zeeb void mt792x_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control,
371cbb3ec25SBjoern A. Zeeb struct sk_buff *skb);
372cbb3ec25SBjoern A. Zeeb int mt792x_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
373cbb3ec25SBjoern A. Zeeb unsigned int link_id, u16 queue,
374cbb3ec25SBjoern A. Zeeb const struct ieee80211_tx_queue_params *params);
375cbb3ec25SBjoern A. Zeeb int mt792x_get_stats(struct ieee80211_hw *hw,
376cbb3ec25SBjoern A. Zeeb struct ieee80211_low_level_stats *stats);
377cbb3ec25SBjoern A. Zeeb u64 mt792x_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
378cbb3ec25SBjoern A. Zeeb void mt792x_set_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
379cbb3ec25SBjoern A. Zeeb u64 timestamp);
380cbb3ec25SBjoern A. Zeeb void mt792x_tx_worker(struct mt76_worker *w);
381cbb3ec25SBjoern A. Zeeb void mt792x_roc_timer(struct timer_list *timer);
382*8ba4d145SBjoern A. Zeeb void mt792x_csa_timer(struct timer_list *timer);
383cbb3ec25SBjoern A. Zeeb void mt792x_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
384cbb3ec25SBjoern A. Zeeb u32 queues, bool drop);
385cbb3ec25SBjoern A. Zeeb int mt792x_assign_vif_chanctx(struct ieee80211_hw *hw,
386cbb3ec25SBjoern A. Zeeb struct ieee80211_vif *vif,
387cbb3ec25SBjoern A. Zeeb struct ieee80211_bss_conf *link_conf,
388cbb3ec25SBjoern A. Zeeb struct ieee80211_chanctx_conf *ctx);
389cbb3ec25SBjoern A. Zeeb void mt792x_unassign_vif_chanctx(struct ieee80211_hw *hw,
390cbb3ec25SBjoern A. Zeeb struct ieee80211_vif *vif,
391cbb3ec25SBjoern A. Zeeb struct ieee80211_bss_conf *link_conf,
392cbb3ec25SBjoern A. Zeeb struct ieee80211_chanctx_conf *ctx);
393cbb3ec25SBjoern A. Zeeb void mt792x_set_wakeup(struct ieee80211_hw *hw, bool enabled);
394cbb3ec25SBjoern A. Zeeb void mt792x_get_et_strings(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
395cbb3ec25SBjoern A. Zeeb u32 sset, u8 *data);
396cbb3ec25SBjoern A. Zeeb int mt792x_get_et_sset_count(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
397cbb3ec25SBjoern A. Zeeb int sset);
398cbb3ec25SBjoern A. Zeeb void mt792x_get_et_stats(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
399cbb3ec25SBjoern A. Zeeb struct ethtool_stats *stats, u64 *data);
400cbb3ec25SBjoern A. Zeeb void mt792x_sta_statistics(struct ieee80211_hw *hw,
401cbb3ec25SBjoern A. Zeeb struct ieee80211_vif *vif,
402cbb3ec25SBjoern A. Zeeb struct ieee80211_sta *sta,
403cbb3ec25SBjoern A. Zeeb struct station_info *sinfo);
404cbb3ec25SBjoern A. Zeeb void mt792x_set_coverage_class(struct ieee80211_hw *hw, s16 coverage_class);
405cbb3ec25SBjoern A. Zeeb void mt792x_dma_cleanup(struct mt792x_dev *dev);
406cbb3ec25SBjoern A. Zeeb int mt792x_dma_enable(struct mt792x_dev *dev);
407cbb3ec25SBjoern A. Zeeb int mt792x_wpdma_reset(struct mt792x_dev *dev, bool force);
408cbb3ec25SBjoern A. Zeeb int mt792x_wpdma_reinit_cond(struct mt792x_dev *dev);
409cbb3ec25SBjoern A. Zeeb int mt792x_dma_disable(struct mt792x_dev *dev, bool force);
410cbb3ec25SBjoern A. Zeeb irqreturn_t mt792x_irq_handler(int irq, void *dev_instance);
411cbb3ec25SBjoern A. Zeeb void mt792x_rx_poll_complete(struct mt76_dev *mdev, enum mt76_rxq_id q);
412cbb3ec25SBjoern A. Zeeb int mt792x_poll_tx(struct napi_struct *napi, int budget);
413cbb3ec25SBjoern A. Zeeb int mt792x_poll_rx(struct napi_struct *napi, int budget);
414cbb3ec25SBjoern A. Zeeb void mt792x_irq_tasklet(unsigned long data);
415cbb3ec25SBjoern A. Zeeb int mt792x_wfsys_reset(struct mt792x_dev *dev);
416cbb3ec25SBjoern A. Zeeb int mt792x_tx_stats_show(struct seq_file *file, void *data);
417cbb3ec25SBjoern A. Zeeb int mt792x_queues_acq(struct seq_file *s, void *data);
418cbb3ec25SBjoern A. Zeeb int mt792x_queues_read(struct seq_file *s, void *data);
419cbb3ec25SBjoern A. Zeeb int mt792x_pm_stats(struct seq_file *s, void *data);
420cbb3ec25SBjoern A. Zeeb int mt792x_pm_idle_timeout_set(void *data, u64 val);
421cbb3ec25SBjoern A. Zeeb int mt792x_pm_idle_timeout_get(void *data, u64 *val);
422cbb3ec25SBjoern A. Zeeb int mt792x_init_wiphy(struct ieee80211_hw *hw);
423cbb3ec25SBjoern A. Zeeb struct ieee80211_ops *
424cbb3ec25SBjoern A. Zeeb mt792x_get_mac80211_ops(struct device *dev,
425cbb3ec25SBjoern A. Zeeb const struct ieee80211_ops *mac80211_ops,
426cbb3ec25SBjoern A. Zeeb void *drv_data, u8 *fw_features);
427cbb3ec25SBjoern A. Zeeb int mt792x_init_wcid(struct mt792x_dev *dev);
428cbb3ec25SBjoern A. Zeeb int mt792x_mcu_drv_pmctrl(struct mt792x_dev *dev);
429cbb3ec25SBjoern A. Zeeb int mt792x_mcu_fw_pmctrl(struct mt792x_dev *dev);
430*8ba4d145SBjoern A. Zeeb void mt792x_mac_link_bss_remove(struct mt792x_dev *dev,
431*8ba4d145SBjoern A. Zeeb struct mt792x_bss_conf *mconf,
432*8ba4d145SBjoern A. Zeeb struct mt792x_link_sta *mlink);
433*8ba4d145SBjoern A. Zeeb void mt792x_config_mac_addr_list(struct mt792x_dev *dev);
434cbb3ec25SBjoern A. Zeeb
mt792x_ram_name(struct mt792x_dev * dev)435cbb3ec25SBjoern A. Zeeb static inline char *mt792x_ram_name(struct mt792x_dev *dev)
436cbb3ec25SBjoern A. Zeeb {
437cbb3ec25SBjoern A. Zeeb switch (mt76_chip(&dev->mt76)) {
438*8ba4d145SBjoern A. Zeeb case 0x7920:
439*8ba4d145SBjoern A. Zeeb return MT7920_FIRMWARE_WM;
440cbb3ec25SBjoern A. Zeeb case 0x7922:
441cbb3ec25SBjoern A. Zeeb return MT7922_FIRMWARE_WM;
442*8ba4d145SBjoern A. Zeeb case 0x7925:
443*8ba4d145SBjoern A. Zeeb return MT7925_FIRMWARE_WM;
444cbb3ec25SBjoern A. Zeeb default:
445cbb3ec25SBjoern A. Zeeb return MT7921_FIRMWARE_WM;
446cbb3ec25SBjoern A. Zeeb }
447cbb3ec25SBjoern A. Zeeb }
448cbb3ec25SBjoern A. Zeeb
mt792x_patch_name(struct mt792x_dev * dev)449cbb3ec25SBjoern A. Zeeb static inline char *mt792x_patch_name(struct mt792x_dev *dev)
450cbb3ec25SBjoern A. Zeeb {
451cbb3ec25SBjoern A. Zeeb switch (mt76_chip(&dev->mt76)) {
452*8ba4d145SBjoern A. Zeeb case 0x7920:
453*8ba4d145SBjoern A. Zeeb return MT7920_ROM_PATCH;
454cbb3ec25SBjoern A. Zeeb case 0x7922:
455cbb3ec25SBjoern A. Zeeb return MT7922_ROM_PATCH;
456*8ba4d145SBjoern A. Zeeb case 0x7925:
457*8ba4d145SBjoern A. Zeeb return MT7925_ROM_PATCH;
458cbb3ec25SBjoern A. Zeeb default:
459cbb3ec25SBjoern A. Zeeb return MT7921_ROM_PATCH;
460cbb3ec25SBjoern A. Zeeb }
461cbb3ec25SBjoern A. Zeeb }
462cbb3ec25SBjoern A. Zeeb
463cbb3ec25SBjoern A. Zeeb int mt792x_load_firmware(struct mt792x_dev *dev);
464cbb3ec25SBjoern A. Zeeb
465cbb3ec25SBjoern A. Zeeb /* usb */
466cbb3ec25SBjoern A. Zeeb #define MT_USB_TYPE_VENDOR (USB_TYPE_VENDOR | 0x1f)
467cbb3ec25SBjoern A. Zeeb #define MT_USB_TYPE_UHW_VENDOR (USB_TYPE_VENDOR | 0x1e)
468cbb3ec25SBjoern A. Zeeb int mt792xu_dma_init(struct mt792x_dev *dev, bool resume);
469cbb3ec25SBjoern A. Zeeb int mt792xu_mcu_power_on(struct mt792x_dev *dev);
470cbb3ec25SBjoern A. Zeeb int mt792xu_wfsys_reset(struct mt792x_dev *dev);
471cbb3ec25SBjoern A. Zeeb int mt792xu_init_reset(struct mt792x_dev *dev);
472cbb3ec25SBjoern A. Zeeb u32 mt792xu_rr(struct mt76_dev *dev, u32 addr);
473cbb3ec25SBjoern A. Zeeb void mt792xu_wr(struct mt76_dev *dev, u32 addr, u32 val);
474cbb3ec25SBjoern A. Zeeb u32 mt792xu_rmw(struct mt76_dev *dev, u32 addr, u32 mask, u32 val);
475cbb3ec25SBjoern A. Zeeb void mt792xu_copy(struct mt76_dev *dev, u32 offset, const void *data, int len);
476cbb3ec25SBjoern A. Zeeb void mt792xu_disconnect(struct usb_interface *usb_intf);
477*8ba4d145SBjoern A. Zeeb void mt792xu_stop(struct ieee80211_hw *hw, bool suspend);
478*8ba4d145SBjoern A. Zeeb
479*8ba4d145SBjoern A. Zeeb static inline void
mt792x_skb_add_usb_sdio_hdr(struct mt792x_dev * dev,struct sk_buff * skb,int type)480*8ba4d145SBjoern A. Zeeb mt792x_skb_add_usb_sdio_hdr(struct mt792x_dev *dev, struct sk_buff *skb,
481*8ba4d145SBjoern A. Zeeb int type)
482*8ba4d145SBjoern A. Zeeb {
483*8ba4d145SBjoern A. Zeeb u32 hdr, len;
484*8ba4d145SBjoern A. Zeeb
485*8ba4d145SBjoern A. Zeeb len = mt76_is_usb(&dev->mt76) ? skb->len : skb->len + sizeof(hdr);
486*8ba4d145SBjoern A. Zeeb hdr = FIELD_PREP(MT792x_SDIO_HDR_TX_BYTES, len) |
487*8ba4d145SBjoern A. Zeeb FIELD_PREP(MT792x_SDIO_HDR_PKT_TYPE, type);
488*8ba4d145SBjoern A. Zeeb
489*8ba4d145SBjoern A. Zeeb put_unaligned_le32(hdr, skb_push(skb, sizeof(hdr)));
490*8ba4d145SBjoern A. Zeeb }
491cbb3ec25SBjoern A. Zeeb
492cbb3ec25SBjoern A. Zeeb int __mt792xe_mcu_drv_pmctrl(struct mt792x_dev *dev);
493cbb3ec25SBjoern A. Zeeb int mt792xe_mcu_drv_pmctrl(struct mt792x_dev *dev);
494cbb3ec25SBjoern A. Zeeb int mt792xe_mcu_fw_pmctrl(struct mt792x_dev *dev);
495cbb3ec25SBjoern A. Zeeb
496cbb3ec25SBjoern A. Zeeb #ifdef CONFIG_ACPI
497cbb3ec25SBjoern A. Zeeb int mt792x_init_acpi_sar(struct mt792x_dev *dev);
498cbb3ec25SBjoern A. Zeeb int mt792x_init_acpi_sar_power(struct mt792x_phy *phy, bool set_default);
499cbb3ec25SBjoern A. Zeeb u8 mt792x_acpi_get_flags(struct mt792x_phy *phy);
500*8ba4d145SBjoern A. Zeeb u8 mt792x_acpi_get_mtcl_conf(struct mt792x_phy *phy, char *alpha2);
501cbb3ec25SBjoern A. Zeeb #else
mt792x_init_acpi_sar(struct mt792x_dev * dev)502cbb3ec25SBjoern A. Zeeb static inline int mt792x_init_acpi_sar(struct mt792x_dev *dev)
503cbb3ec25SBjoern A. Zeeb {
504cbb3ec25SBjoern A. Zeeb return 0;
505cbb3ec25SBjoern A. Zeeb }
506cbb3ec25SBjoern A. Zeeb
mt792x_init_acpi_sar_power(struct mt792x_phy * phy,bool set_default)507cbb3ec25SBjoern A. Zeeb static inline int mt792x_init_acpi_sar_power(struct mt792x_phy *phy,
508cbb3ec25SBjoern A. Zeeb bool set_default)
509cbb3ec25SBjoern A. Zeeb {
510cbb3ec25SBjoern A. Zeeb return 0;
511cbb3ec25SBjoern A. Zeeb }
512cbb3ec25SBjoern A. Zeeb
mt792x_acpi_get_flags(struct mt792x_phy * phy)513cbb3ec25SBjoern A. Zeeb static inline u8 mt792x_acpi_get_flags(struct mt792x_phy *phy)
514cbb3ec25SBjoern A. Zeeb {
515cbb3ec25SBjoern A. Zeeb return 0;
516cbb3ec25SBjoern A. Zeeb }
517*8ba4d145SBjoern A. Zeeb
mt792x_acpi_get_mtcl_conf(struct mt792x_phy * phy,char * alpha2)518*8ba4d145SBjoern A. Zeeb static inline u8 mt792x_acpi_get_mtcl_conf(struct mt792x_phy *phy, char *alpha2)
519*8ba4d145SBjoern A. Zeeb {
520*8ba4d145SBjoern A. Zeeb return 0xf;
521*8ba4d145SBjoern A. Zeeb }
522cbb3ec25SBjoern A. Zeeb #endif
523cbb3ec25SBjoern A. Zeeb
524cbb3ec25SBjoern A. Zeeb #endif /* __MT7925_H */
525