1 | /* SPDX-License-Identifier: ISC */ |
2 | /* Copyright (C) 2023 MediaTek Inc. */ |
3 | |
4 | #ifndef __MT7925_H |
5 | #define __MT7925_H |
6 | |
7 | #include "../mt792x.h" |
8 | #include "regs.h" |
9 | |
10 | #define MT7925_BEACON_RATES_TBL 25 |
11 | |
12 | #define MT7925_TX_RING_SIZE 2048 |
13 | #define MT7925_TX_MCU_RING_SIZE 256 |
14 | #define MT7925_TX_FWDL_RING_SIZE 128 |
15 | |
16 | #define MT7925_RX_RING_SIZE 1536 |
17 | #define MT7925_RX_MCU_RING_SIZE 512 |
18 | |
19 | #define MT7925_EEPROM_SIZE 3584 |
20 | #define MT7925_TOKEN_SIZE 8192 |
21 | |
22 | #define MT7925_EEPROM_BLOCK_SIZE 16 |
23 | |
24 | #define MT7925_SKU_RATE_NUM 161 |
25 | #define MT7925_SKU_MAX_DELTA_IDX MT7925_SKU_RATE_NUM |
26 | #define MT7925_SKU_TABLE_SIZE (MT7925_SKU_RATE_NUM + 1) |
27 | |
28 | #define MCU_UNI_EVENT_ROC 0x27 |
29 | |
30 | #define HIF_TRAFFIC_IDLE 0x2 |
31 | |
32 | enum { |
33 | UNI_EVENT_HIF_CTRL_BASIC = 0, |
34 | UNI_EVENT_HIF_CTRL_TAG_NUM |
35 | }; |
36 | |
37 | struct mt7925_mcu_hif_ctrl_basic_tlv { |
38 | __le16 tag; |
39 | __le16 len; |
40 | u8 cid; |
41 | u8 pad[3]; |
42 | u32 status; |
43 | u8 hif_type; |
44 | u8 hif_tx_traffic_status; |
45 | u8 hif_rx_traffic_status; |
46 | u8 hifsuspend; |
47 | u8 rsv[4]; |
48 | } __packed; |
49 | |
50 | enum { |
51 | UNI_ROC_ACQUIRE, |
52 | UNI_ROC_ABORT, |
53 | UNI_ROC_SUB_LINK = 3, |
54 | UNI_ROC_NUM |
55 | }; |
56 | |
57 | enum mt7925_roc_req { |
58 | MT7925_ROC_REQ_JOIN, |
59 | MT7925_ROC_REQ_ROC, |
60 | MT7925_ROC_REQ_SUB_LINK, |
61 | MT7925_ROC_REQ_MLSR_AG = 10, |
62 | MT7925_ROC_REQ_MLSR_AA, |
63 | MT7925_ROC_REQ_NUM |
64 | }; |
65 | |
66 | enum { |
67 | UNI_EVENT_ROC_GRANT = 0, |
68 | UNI_EVENT_ROC_GRANT_SUB_LINK = 4, |
69 | UNI_EVENT_ROC_TAG_NUM |
70 | }; |
71 | |
72 | struct mt7925_roc_grant_tlv { |
73 | __le16 tag; |
74 | __le16 len; |
75 | u8 bss_idx; |
76 | u8 tokenid; |
77 | u8 status; |
78 | u8 primarychannel; |
79 | u8 rfsco; |
80 | u8 rfband; |
81 | u8 channelwidth; |
82 | u8 centerfreqseg1; |
83 | u8 centerfreqseg2; |
84 | u8 reqtype; |
85 | u8 dbdcband; |
86 | u8 rsv[1]; |
87 | __le32 max_interval; |
88 | } __packed; |
89 | |
90 | struct mt7925_beacon_loss_tlv { |
91 | __le16 tag; |
92 | __le16 len; |
93 | u8 reason; |
94 | u8 nr_btolink; |
95 | u8 pad[2]; |
96 | } __packed; |
97 | |
98 | struct mt7925_uni_beacon_loss_event { |
99 | struct { |
100 | u8 bss_idx; |
101 | u8 pad[3]; |
102 | } __packed hdr; |
103 | struct mt7925_beacon_loss_tlv beacon_loss; |
104 | } __packed; |
105 | |
106 | #define (field, rxv) ((FIELD_GET(field, rxv) - 220) / 2) |
107 | #define to_rcpi(rssi) (2 * (rssi) + 220) |
108 | |
109 | enum mt7925_txq_id { |
110 | MT7925_TXQ_BAND0, |
111 | MT7925_TXQ_BAND1, |
112 | MT7925_TXQ_MCU_WM = 15, |
113 | MT7925_TXQ_FWDL, |
114 | }; |
115 | |
116 | enum mt7925_rxq_id { |
117 | MT7925_RXQ_BAND0 = 2, |
118 | MT7925_RXQ_BAND1, |
119 | MT7925_RXQ_MCU_WM = 0, |
120 | MT7925_RXQ_MCU_WM2, /* for tx done */ |
121 | }; |
122 | |
123 | enum { |
124 | MODE_OPEN = 0, |
125 | MODE_SHARED = 1, |
126 | MODE_WPA = 3, |
127 | MODE_WPA_PSK = 4, |
128 | MODE_WPA_NONE = 5, |
129 | MODE_WPA2 = 6, |
130 | MODE_WPA2_PSK = 7, |
131 | MODE_WPA3_SAE = 11, |
132 | }; |
133 | |
134 | enum { |
135 | MT7925_CLC_POWER, |
136 | MT7925_CLC_CHAN, |
137 | MT7925_CLC_MAX_NUM, |
138 | }; |
139 | |
140 | struct mt7925_clc_rule_v2 { |
141 | u32 flag; |
142 | u8 alpha2[2]; |
143 | u8 rsv[10]; |
144 | } __packed; |
145 | |
146 | struct mt7925_clc_rule { |
147 | u8 alpha2[2]; |
148 | u8 type[2]; |
149 | u8 seg_idx; |
150 | u8 flag; /* UNII4~8 ctrl flag */ |
151 | u8 rsv[2]; |
152 | } __packed; |
153 | |
154 | struct mt7925_clc_segment { |
155 | u8 idx; |
156 | u8 rsv1[3]; |
157 | u32 offset; |
158 | u32 len; |
159 | u8 rsv2[4]; |
160 | } __packed; |
161 | |
162 | struct mt7925_clc_type0 { |
163 | u8 nr_country; |
164 | u8 type; |
165 | u8 nr_seg; |
166 | u8 rsv[7]; |
167 | } __packed; |
168 | |
169 | struct mt7925_clc_type2 { |
170 | u8 type; |
171 | u8 rsv[9]; |
172 | } __packed; |
173 | |
174 | struct mt7925_clc { |
175 | __le32 len; |
176 | u8 idx; |
177 | u8 ver; |
178 | union { |
179 | struct mt7925_clc_type0 t0; |
180 | struct mt7925_clc_type2 t2; |
181 | }; |
182 | u8 data[]; |
183 | } __packed; |
184 | |
185 | enum mt7925_eeprom_field { |
186 | MT_EE_CHIP_ID = 0x000, |
187 | MT_EE_VERSION = 0x002, |
188 | MT_EE_MAC_ADDR = 0x004, |
189 | MT_EE_HW_TYPE = 0xa71, |
190 | __MT_EE_MAX = 0x9ff |
191 | }; |
192 | |
193 | #define MT_EE_HW_TYPE_ENCAP GENMASK(1, 0) |
194 | |
195 | enum { |
196 | TXPWR_USER, |
197 | TXPWR_EEPROM, |
198 | TXPWR_MAC, |
199 | TXPWR_MAX_NUM, |
200 | }; |
201 | |
202 | struct mt7925_txpwr { |
203 | s8 cck[4][2]; |
204 | s8 ofdm[8][2]; |
205 | s8 ht20[8][2]; |
206 | s8 ht40[9][2]; |
207 | s8 vht20[12][2]; |
208 | s8 vht40[12][2]; |
209 | s8 vht80[12][2]; |
210 | s8 vht160[12][2]; |
211 | s8 he26[12][2]; |
212 | s8 he52[12][2]; |
213 | s8 he106[12][2]; |
214 | s8 he242[12][2]; |
215 | s8 he484[12][2]; |
216 | s8 he996[12][2]; |
217 | s8 he996x2[12][2]; |
218 | s8 eht26[16][2]; |
219 | s8 eht52[16][2]; |
220 | s8 eht106[16][2]; |
221 | s8 eht242[16][2]; |
222 | s8 eht484[16][2]; |
223 | s8 eht996[16][2]; |
224 | s8 eht996x2[16][2]; |
225 | s8 eht996x4[16][2]; |
226 | s8 eht26_52[16][2]; |
227 | s8 eht26_106[16][2]; |
228 | s8 eht484_242[16][2]; |
229 | s8 eht996_484[16][2]; |
230 | s8 eht996_484_242[16][2]; |
231 | s8 eht996x2_484[16][2]; |
232 | s8 eht996x3[16][2]; |
233 | s8 eht996x3_484[16][2]; |
234 | }; |
235 | |
236 | extern const struct ieee80211_ops mt7925_ops; |
237 | |
238 | int __mt7925_start(struct mt792x_phy *phy); |
239 | int mt7925_register_device(struct mt792x_dev *dev); |
240 | void mt7925_unregister_device(struct mt792x_dev *dev); |
241 | int mt7925_run_firmware(struct mt792x_dev *dev); |
242 | int mt7925_mcu_set_bss_pm(struct mt792x_dev *dev, |
243 | struct ieee80211_bss_conf *link_conf, |
244 | bool enable); |
245 | int mt7925_mcu_sta_update(struct mt792x_dev *dev, |
246 | struct ieee80211_link_sta *link_sta, |
247 | struct ieee80211_vif *vif, bool enable, |
248 | enum mt76_sta_info_state state); |
249 | int mt7925_mcu_set_chan_info(struct mt792x_phy *phy, u16 tag); |
250 | int mt7925_mcu_set_tx(struct mt792x_dev *dev, struct ieee80211_bss_conf *bss_conf); |
251 | int mt7925_mcu_set_eeprom(struct mt792x_dev *dev); |
252 | int mt7925_mcu_get_rx_rate(struct mt792x_phy *phy, struct ieee80211_vif *vif, |
253 | struct ieee80211_sta *sta, struct rate_info *rate); |
254 | int mt7925_mcu_fw_log_2_host(struct mt792x_dev *dev, u8 ctrl); |
255 | void mt7925_mcu_rx_event(struct mt792x_dev *dev, struct sk_buff *skb); |
256 | int mt7925_mcu_chip_config(struct mt792x_dev *dev, const char *cmd); |
257 | int mt7925_mcu_set_rxfilter(struct mt792x_dev *dev, u32 fif, |
258 | u8 bit_op, u32 bit_map); |
259 | |
260 | void mt7925_regd_be_ctrl(struct mt792x_dev *dev, u8 *alpha2); |
261 | void mt7925_regd_update(struct mt792x_dev *dev); |
262 | int mt7925_mac_init(struct mt792x_dev *dev); |
263 | int mt7925_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, |
264 | struct ieee80211_sta *sta); |
265 | bool mt7925_mac_wtbl_update(struct mt792x_dev *dev, int idx, u32 mask); |
266 | int mt7925_mac_sta_event(struct mt76_dev *mdev, struct ieee80211_vif *vif, |
267 | struct ieee80211_sta *sta, enum mt76_sta_event ev); |
268 | void mt7925_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif, |
269 | struct ieee80211_sta *sta); |
270 | void mt7925_mac_reset_work(struct work_struct *work); |
271 | int mt7925e_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, |
272 | enum mt76_txq_id qid, struct mt76_wcid *wcid, |
273 | struct ieee80211_sta *sta, |
274 | struct mt76_tx_info *tx_info); |
275 | |
276 | void mt7925_tx_token_put(struct mt792x_dev *dev); |
277 | bool mt7925_rx_check(struct mt76_dev *mdev, void *data, int len); |
278 | void mt7925_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q, |
279 | struct sk_buff *skb, u32 *info); |
280 | void mt7925_stats_work(struct work_struct *work); |
281 | void mt7925_set_stream_he_eht_caps(struct mt792x_phy *phy); |
282 | int mt7925_init_mlo_caps(struct mt792x_phy *phy); |
283 | int mt7925_init_debugfs(struct mt792x_dev *dev); |
284 | |
285 | int mt7925_mcu_set_beacon_filter(struct mt792x_dev *dev, |
286 | struct ieee80211_vif *vif, |
287 | bool enable); |
288 | int mt7925_mcu_uni_tx_ba(struct mt792x_dev *dev, |
289 | struct ieee80211_ampdu_params *params, |
290 | bool enable); |
291 | int mt7925_mcu_uni_rx_ba(struct mt792x_dev *dev, |
292 | struct ieee80211_ampdu_params *params, |
293 | bool enable); |
294 | void mt7925_mlo_pm_work(struct work_struct *work); |
295 | void mt7925_scan_work(struct work_struct *work); |
296 | void mt7925_roc_work(struct work_struct *work); |
297 | int mt7925_mcu_uni_bss_ps(struct mt792x_dev *dev, |
298 | struct ieee80211_bss_conf *link_conf); |
299 | void mt7925_coredump_work(struct work_struct *work); |
300 | int mt7925_get_txpwr_info(struct mt792x_dev *dev, u8 band_idx, |
301 | struct mt7925_txpwr *txpwr); |
302 | void mt7925_mac_set_fixed_rate_table(struct mt792x_dev *dev, |
303 | u8 tbl_idx, u16 rate_idx); |
304 | void mt7925_mac_write_txwi(struct mt76_dev *dev, __le32 *txwi, |
305 | struct sk_buff *skb, struct mt76_wcid *wcid, |
306 | struct ieee80211_key_conf *key, int pid, |
307 | enum mt76_txq_id qid, u32 changed); |
308 | void mt7925_txwi_free(struct mt792x_dev *dev, struct mt76_txwi_cache *t, |
309 | struct ieee80211_sta *sta, struct mt76_wcid *wcid, |
310 | struct list_head *free_list); |
311 | int mt7925_mcu_parse_response(struct mt76_dev *mdev, int cmd, |
312 | struct sk_buff *skb, int seq); |
313 | |
314 | int mt7925e_mac_reset(struct mt792x_dev *dev); |
315 | int mt7925e_mcu_init(struct mt792x_dev *dev); |
316 | void mt7925_mac_add_txs(struct mt792x_dev *dev, void *data); |
317 | void mt7925_set_runtime_pm(struct mt792x_dev *dev); |
318 | void mt7925_mcu_set_suspend_iter(void *priv, u8 *mac, |
319 | struct ieee80211_vif *vif); |
320 | void mt7925_connac_mcu_set_suspend_iter(void *priv, u8 *mac, |
321 | struct ieee80211_vif *vif); |
322 | void mt7925_set_ipv6_ns_work(struct work_struct *work); |
323 | |
324 | int mt7925_mcu_set_sniffer(struct mt792x_dev *dev, struct ieee80211_vif *vif, |
325 | bool enable); |
326 | int mt7925_mcu_config_sniffer(struct mt792x_vif *vif, |
327 | struct ieee80211_chanctx_conf *ctx); |
328 | int mt7925_mcu_get_temperature(struct mt792x_phy *phy); |
329 | |
330 | int mt7925_usb_sdio_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, |
331 | enum mt76_txq_id qid, struct mt76_wcid *wcid, |
332 | struct ieee80211_sta *sta, |
333 | struct mt76_tx_info *tx_info); |
334 | void mt7925_usb_sdio_tx_complete_skb(struct mt76_dev *mdev, |
335 | struct mt76_queue_entry *e); |
336 | bool mt7925_usb_sdio_tx_status_data(struct mt76_dev *mdev, u8 *update); |
337 | |
338 | int mt7925_mcu_uni_add_beacon_offload(struct mt792x_dev *dev, |
339 | struct ieee80211_hw *hw, |
340 | struct ieee80211_vif *vif, |
341 | bool enable); |
342 | int mt7925_set_tx_sar_pwr(struct ieee80211_hw *hw, |
343 | const struct cfg80211_sar_specs *sar); |
344 | |
345 | int mt7925_mcu_regval(struct mt792x_dev *dev, u32 regidx, u32 *val, bool set); |
346 | int mt7925_mcu_set_clc(struct mt792x_dev *dev, u8 *alpha2, |
347 | enum environment_cap env_cap); |
348 | int mt7925_mcu_set_mlo_roc(struct mt792x_bss_conf *mconf, u16 sel_links, |
349 | int duration, u8 token_id); |
350 | int mt7925_mcu_set_roc(struct mt792x_phy *phy, struct mt792x_bss_conf *mconf, |
351 | struct ieee80211_channel *chan, int duration, |
352 | enum mt7925_roc_req type, u8 token_id); |
353 | int mt7925_mcu_abort_roc(struct mt792x_phy *phy, struct mt792x_bss_conf *mconf, |
354 | u8 token_id); |
355 | void mt7925_roc_abort_sync(struct mt792x_dev *dev); |
356 | int mt7925_mcu_fill_message(struct mt76_dev *mdev, struct sk_buff *skb, |
357 | int cmd, int *wait_seq); |
358 | int mt7925_mcu_add_key(struct mt76_dev *dev, struct ieee80211_vif *vif, |
359 | struct mt76_connac_sta_key_conf *sta_key_conf, |
360 | struct ieee80211_key_conf *key, int mcu_cmd, |
361 | struct mt76_wcid *wcid, enum set_key_cmd cmd, |
362 | struct mt792x_sta *msta); |
363 | int mt7925_mcu_set_rts_thresh(struct mt792x_phy *phy, u32 val); |
364 | int mt7925_mcu_wtbl_update_hdr_trans(struct mt792x_dev *dev, |
365 | struct ieee80211_vif *vif, |
366 | struct ieee80211_sta *sta, |
367 | int link_id); |
368 | int mt7925_mcu_wf_rf_pin_ctrl(struct mt792x_phy *phy); |
369 | |
370 | int mt7925_testmode_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif, |
371 | void *data, int len); |
372 | int mt7925_testmode_dump(struct ieee80211_hw *hw, struct sk_buff *msg, |
373 | struct netlink_callback *cb, void *data, int len); |
374 | |
375 | #endif |
376 | |