blob: 9f8b796db597ee5e22caacf0ac50f891d82c13a1 [file] [log] [blame]
developer4616dbd2022-10-11 13:18:59 +08001/* Copyright (C) 2021-2022 Mediatek Inc. */
2#ifndef __ATENL_H
3#define __ATENL_H
4
5#include <arpa/inet.h>
6#include <errno.h>
7#include <fcntl.h>
8#include <limits.h>
9#include <linux/nl80211.h>
10#include <net/if.h>
11#include <stdbool.h>
12#include <stdio.h>
13#include <stdlib.h>
14#include <unistd.h>
15
16#include "nl.h"
17#include "util.h"
18#include "debug.h"
19
20#define BRIDGE_NAME_OPENWRT "br-lan"
21#define BRIDGE_NAME_RDKB "brlan0"
developerb9a96602023-01-10 19:53:25 +080022#define ETH_P_RACFG 0x2880
developer4616dbd2022-10-11 13:18:59 +080023#define RACFG_PKT_MAX_SIZE 1600
developerb9a96602023-01-10 19:53:25 +080024#define RACFG_HLEN 12
25#define RACFG_MAGIC_NO 0x18142880
26#define PRE_CAL_INFO 16
developer32b0e0f2023-04-11 13:34:56 +080027#define DPD_INFO_CH_SHIFT 30
28#define DPD_INFO_2G_SHIFT 20
29#define DPD_INFO_5G_SHIFT 10
developer4616dbd2022-10-11 13:18:59 +080030#define DPD_INFO_6G_SHIFT 0
developer32b0e0f2023-04-11 13:34:56 +080031#define DPD_INFO_MASK GENMASK(9, 0)
developer4616dbd2022-10-11 13:18:59 +080032#define MT_EE_CAL_UNIT 1024
33
34#define RACFG_CMD_TYPE_MASK GENMASK(14, 0)
35#define RACFG_CMD_TYPE_ETHREQ BIT(3)
36#define RACFG_CMD_TYPE_PLATFORM_MODULE GENMASK(4, 3)
37
38#define set_band_val(_an, _band, _field, _val) \
39 _an->anb[_band]._field = (_val)
40#define get_band_val(_an, _band, _field) \
41 (_an->anb[_band]._field)
42
43enum atenl_rf_mode {
44 ATENL_RF_MODE_NORMAL,
45 ATENL_RF_MODE_TEST,
46 ATENL_RF_MODE_ICAP,
47 ATENL_RF_MODE_ICAP_OVERLAP,
48
49 __ATENL_RF_MODE_MAX,
50};
51
52struct atenl_rx_stat {
53 u64 total;
54 u64 ok_cnt;
55 u64 err_cnt;
56 u64 len_mismatch;
57};
58
59struct atenl_band {
60 bool valid;
61 u8 phy_idx;
62 u8 cap;
63 u8 chainmask;
64
65 enum mt76_testmode_state cur_state;
66 s8 tx_power;
67 enum atenl_rf_mode rf_mode;
68
69 bool use_tx_time;
70 u32 tx_time;
71 u32 tx_mpdu_len;
72
73 bool reset_tx_cnt;
74 bool reset_rx_cnt;
75
76 /* history */
77 struct atenl_rx_stat rx_stat;
78};
79
80#define MAX_BAND_NUM 3
81
82struct atenl {
83 struct atenl_band anb[MAX_BAND_NUM];
84 u16 chip_id;
85 u16 adie_id;
86 u8 sub_chip_id;
87 u8 cur_band;
88
89 u8 mac_addr[ETH_ALEN];
90 char *bridge_name;
91 bool unicast;
92 int sock_eth;
93
94 const char *mtd_part;
95 u32 mtd_offset;
developerb9a96602023-01-10 19:53:25 +080096 u8 band_idx;
developer4616dbd2022-10-11 13:18:59 +080097 u8 *eeprom_data;
98 int eeprom_fd;
99 u16 eeprom_size;
100 u32 eeprom_prek_offs;
101
102 u8 *cal;
103 u32 cal_info[5];
104
105 bool cmd_mode;
106
107 /* intermediate data */
108 u8 ibf_mcs;
109 u8 ibf_ant;
110};
111
112struct atenl_cmd_hdr {
113 __be32 magic_no;
114 __be16 cmd_type;
115 __be16 cmd_id;
116 __be16 len;
117 __be16 seq;
118 u8 data[2048];
119} __attribute__((packed));
120
121enum atenl_cmd {
122 HQA_CMD_UNKNOWN,
123 HQA_CMD_LEGACY, /* legacy or deprecated */
124
125 HQA_CMD_OPEN_ADAPTER,
126 HQA_CMD_CLOSE_ADAPTER,
127 HQA_CMD_GET_CHIP_ID,
128 HQA_CMD_GET_SUB_CHIP_ID,
129 HQA_CMD_SET_TX_BW,
130 HQA_CMD_SET_TX_PKT_BW,
131 HQA_CMD_SET_TX_PRI_BW,
132 HQA_CMD_GET_TX_INFO,
133 HQA_CMD_SET_TX_PATH,
134 HQA_CMD_SET_TX_POWER,
135 HQA_CMD_SET_TX_POWER_MANUAL,
136 HQA_CMD_SET_RF_MODE,
137 HQA_CMD_SET_RX_PATH,
138 HQA_CMD_SET_RX_PKT_LEN,
139 HQA_CMD_SET_FREQ_OFFSET,
140 HQA_CMD_SET_TSSI,
141 HQA_CMD_SET_CFG,
142 HQA_CMD_SET_RU,
143 HQA_CMD_SET_BAND,
144 HQA_CMD_SET_EEPROM_TO_FW,
145 HQA_CMD_READ_MAC_BBP_REG,
146 HQA_CMD_READ_MAC_BBP_REG_QA,
147 HQA_CMD_READ_RF_REG,
148 HQA_CMD_READ_EEPROM_BULK,
149 HQA_CMD_READ_TEMPERATURE,
150 HQA_CMD_WRITE_MAC_BBP_REG,
151 HQA_CMD_WRITE_RF_REG,
152 HQA_CMD_WRITE_EEPROM_BULK,
153 HQA_CMD_WRITE_BUFFER_DONE,
154 HQA_CMD_GET_BAND,
155 HQA_CMD_GET_CFG,
156 HQA_CMD_GET_TX_POWER,
157 HQA_CMD_GET_TX_TONE_POWER,
158 HQA_CMD_GET_EFUSE_FREE_BLOCK,
159 HQA_CMD_GET_FREQ_OFFSET,
160 HQA_CMD_GET_FW_INFO,
161 HQA_CMD_GET_RX_INFO,
162 HQA_CMD_GET_RF_CAP,
163 HQA_CMD_CHECK_EFUSE_MODE,
164 HQA_CMD_CHECK_EFUSE_MODE_TYPE,
165 HQA_CMD_CHECK_EFUSE_MODE_NATIVE,
166 HQA_CMD_ANT_SWAP_CAP,
167 HQA_CMD_RESET_TX_RX_COUNTER,
168 HQA_CMD_CONTINUOUS_TX,
169
170 HQA_CMD_EXT,
171 HQA_CMD_ERR,
172
173 __HQA_CMD_MAX_NUM,
174};
175
176enum atenl_ext_cmd {
177 HQA_EXT_CMD_UNSPEC,
178
179 HQA_EXT_CMD_SET_CHANNEL,
180 HQA_EXT_CMD_SET_TX,
181 HQA_EXT_CMD_START_TX,
182 HQA_EXT_CMD_START_RX,
183 HQA_EXT_CMD_STOP_TX,
184 HQA_EXT_CMD_STOP_RX,
185 HQA_EXT_CMD_SET_TX_TIME_OPT,
186
187 HQA_EXT_CMD_OFF_CH_SCAN,
188
189 HQA_EXT_CMD_IBF_SET_VAL,
190 HQA_EXT_CMD_IBF_GET_STATUS,
191 HQA_EXT_CMD_IBF_PROF_UPDATE_ALL,
192
193 HQA_EXT_CMD_ERR,
194
195 __HQA_EXT_CMD_MAX_NUM,
196};
197
198struct atenl_data {
199 u8 buf[RACFG_PKT_MAX_SIZE];
200 int len;
201 u16 cmd_id;
202 u8 ext_id;
203 enum atenl_cmd cmd;
204 enum atenl_ext_cmd ext_cmd;
205};
206
207struct atenl_ops {
208 int (*ops)(struct atenl *an, struct atenl_data *data);
209 u8 cmd;
210 u8 flags;
211 u16 cmd_id;
212 u16 resp_len;
213};
214
215#define ATENL_OPS_FLAG_EXT_CMD BIT(0)
216#define ATENL_OPS_FLAG_LEGACY BIT(1)
217#define ATENL_OPS_FLAG_SKIP BIT(2)
218
219static inline struct atenl_cmd_hdr * atenl_hdr(struct atenl_data *data)
220{
221 u8 *hqa_data = (u8 *)data->buf + ETH_HLEN;
222
223 return (struct atenl_cmd_hdr *)hqa_data;
224}
225
226enum atenl_phy_type {
227 ATENL_PHY_TYPE_CCK,
228 ATENL_PHY_TYPE_OFDM,
229 ATENL_PHY_TYPE_HT,
230 ATENL_PHY_TYPE_HT_GF,
231 ATENL_PHY_TYPE_VHT,
232 ATENL_PHY_TYPE_HE_SU = 8,
233 ATENL_PHY_TYPE_HE_EXT_SU,
234 ATENL_PHY_TYPE_HE_TB,
235 ATENL_PHY_TYPE_HE_MU,
236};
237
238enum atenl_e2p_mode {
239 E2P_EFUSE_MODE = 1,
240 E2P_FLASH_MODE,
241 E2P_EEPROM_MODE,
242 E2P_BIN_MODE,
243};
244
245enum atenl_band_type {
246 BAND_TYPE_UNUSE,
247 BAND_TYPE_2G,
248 BAND_TYPE_5G,
249 BAND_TYPE_2G_5G,
250 BAND_TYPE_6G,
251 BAND_TYPE_2G_6G,
252 BAND_TYPE_5G_6G,
253 BAND_TYPE_2G_5G_6G,
254};
255
256enum atenl_ch_band {
257 CH_BAND_2GHZ,
258 CH_BAND_5GHZ,
259 CH_BAND_6GHZ,
260};
261
262/* for mt7915 */
263enum {
264 MT_EE_BAND_SEL_DEFAULT,
265 MT_EE_BAND_SEL_5GHZ,
266 MT_EE_BAND_SEL_2GHZ,
267 MT_EE_BAND_SEL_DUAL,
268};
269
270/* for mt7916/mt7986 */
271enum {
272 MT_EE_BAND_SEL_2G,
273 MT_EE_BAND_SEL_5G,
274 MT_EE_BAND_SEL_6G,
275 MT_EE_BAND_SEL_5G_6G,
276};
277
developerb9a96602023-01-10 19:53:25 +0800278/* for mt7996 */
279enum {
280 MT_EE_EAGLE_BAND_SEL_DEFAULT,
281 MT_EE_EAGLE_BAND_SEL_2GHZ,
282 MT_EE_EAGLE_BAND_SEL_5GHZ,
283 MT_EE_EAGLE_BAND_SEL_6GHZ,
284 MT_EE_EAGLE_BAND_SEL_5GHZ_6GHZ,
285};
286
developer4616dbd2022-10-11 13:18:59 +0800287#define MT_EE_WIFI_CONF 0x190
288#define MT_EE_WIFI_CONF0_BAND_SEL GENMASK(7, 6)
developerb9a96602023-01-10 19:53:25 +0800289#define MT_EE_WIFI_EAGLE_CONF0_BAND_SEL GENMASK(2, 0)
290#define MT_EE_WIFI_EAGLE_CONF1_BAND_SEL GENMASK(5, 3)
291#define MT_EE_WIFI_EAGLE_CONF2_BAND_SEL GENMASK(2, 0)
developer4616dbd2022-10-11 13:18:59 +0800292
293enum {
294 MT7976_ONE_ADIE_DBDC = 0x7,
295 MT7975_ONE_ADIE_SINGLE_BAND = 0x8, /* AX7800 */
296 MT7976_ONE_ADIE_SINGLE_BAND = 0xa, /* AX7800 */
297 MT7975_DUAL_ADIE_DBDC = 0xd, /* AX6000 */
298 MT7976_DUAL_ADIE_DBDC = 0xf, /* AX6000 */
299};
300
301enum {
302 TEST_CBW_20MHZ,
303 TEST_CBW_40MHZ,
304 TEST_CBW_80MHZ,
305 TEST_CBW_10MHZ,
306 TEST_CBW_5MHZ,
307 TEST_CBW_160MHZ,
308 TEST_CBW_8080MHZ,
309
310 TEST_CBW_MAX = TEST_CBW_8080MHZ - 1,
311};
312
313struct atenl_rx_info_hdr {
314 __be32 type;
315 __be32 ver;
316 __be32 val;
317 __be32 len;
318} __attribute__((packed));
319
320struct atenl_rx_info_band {
321 __be32 mac_rx_fcs_err_cnt;
322 __be32 mac_rx_mdrdy_cnt;
323 __be32 mac_rx_len_mismatch;
324 __be32 mac_rx_fcs_ok_cnt;
325 __be32 phy_rx_fcs_err_cnt_cck;
326 __be32 phy_rx_fcs_err_cnt_ofdm;
327 __be32 phy_rx_pd_cck;
328 __be32 phy_rx_pd_ofdm;
329 __be32 phy_rx_sig_err_cck;
330 __be32 phy_rx_sfd_err_cck;
331 __be32 phy_rx_sig_err_ofdm;
332 __be32 phy_rx_tag_err_ofdm;
333 __be32 phy_rx_mdrdy_cnt_cck;
334 __be32 phy_rx_mdrdy_cnt_ofdm;
335} __attribute__((packed));
336
337struct atenl_rx_info_path {
338 __be32 rcpi;
339 __be32 rssi;
340 __be32 fagc_ib_rssi;
341 __be32 fagc_wb_rssi;
342 __be32 inst_ib_rssi;
343 __be32 inst_wb_rssi;
344} __attribute__((packed));
345
346struct atenl_rx_info_user {
347 __be32 freq_offset;
348 __be32 snr;
349 __be32 fcs_error_cnt;
350} __attribute__((packed));
351
352struct atenl_rx_info_comm {
353 __be32 rx_fifo_full;
354 __be32 aci_hit_low;
355 __be32 aci_hit_high;
356 __be32 mu_pkt_count;
357 __be32 sig_mcs;
358 __be32 sinr;
359 __be32 driver_rx_count;
360} __attribute__((packed));
361
362enum atenl_ibf_action {
363 TXBF_ACT_INIT = 1,
364 TXBF_ACT_CHANNEL,
365 TXBF_ACT_MCS,
366 TXBF_ACT_POWER,
367 TXBF_ACT_TX_ANT,
368 TXBF_ACT_RX_START,
369 TXBF_ACT_RX_ANT,
370 TXBF_ACT_LNA_GAIN,
371 TXBF_ACT_IBF_PHASE_COMP,
372 TXBF_ACT_TX_PKT,
373 TXBF_ACT_IBF_PROF_UPDATE,
374 TXBF_ACT_EBF_PROF_UPDATE,
375 TXBF_ACT_IBF_PHASE_CAL,
376 TXBF_ACT_IBF_PHASE_E2P_UPDATE = 16,
377};
378
379enum prek_ops {
380 PREK_SYNC_ALL = 1,
381 PREK_SYNC_GROUP,
382 PREK_SYNC_DPD_2G,
383 PREK_SYNC_DPD_5G,
384 PREK_SYNC_DPD_6G,
385 PREK_CLEAN_GROUP,
386 PREK_CLEAN_DPD,
387};
388
389static inline bool is_mt7915(struct atenl *an)
390{
391 return an->chip_id == 0x7915;
392}
393
394static inline bool is_mt7916(struct atenl *an)
395{
396 return (an->chip_id == 0x7916) || (an->chip_id == 0x7906);
397}
398
399static inline bool is_mt7986(struct atenl *an)
400{
401 return an->chip_id == 0x7986;
402}
403
developerb9a96602023-01-10 19:53:25 +0800404static inline bool is_mt7996(struct atenl *an)
405{
406 return an->chip_id == 0x7990;
407}
408
developer4616dbd2022-10-11 13:18:59 +0800409int atenl_eth_init(struct atenl *an);
410int atenl_eth_recv(struct atenl *an, struct atenl_data *data);
411int atenl_eth_send(struct atenl *an, struct atenl_data *data);
412int atenl_hqa_proc_cmd(struct atenl *an);
413int atenl_nl_process(struct atenl *an, struct atenl_data *data);
414int atenl_nl_process_many(struct atenl *an, struct atenl_data *data);
415int atenl_nl_check_mtd(struct atenl *an);
416int atenl_nl_write_eeprom(struct atenl *an, u32 offset, u8 *val, int len);
417int atenl_nl_write_efuse_all(struct atenl *an);
418int atenl_nl_update_buffer_mode(struct atenl *an);
419int atenl_nl_set_state(struct atenl *an, u8 band,
420 enum mt76_testmode_state state);
421int atenl_nl_set_aid(struct atenl *an, u8 band, u8 aid);
422int atenl_nl_precal_sync_from_driver(struct atenl *an, enum prek_ops ops);
423int atenl_eeprom_init(struct atenl *an, u8 phy_idx);
424void atenl_eeprom_close(struct atenl *an);
425int atenl_eeprom_write_mtd(struct atenl *an);
426int atenl_eeprom_update_precal(struct atenl *an, int write_offs, int size);
427int atenl_eeprom_read_from_driver(struct atenl *an, u32 offset, int len);
428void atenl_eeprom_cmd_handler(struct atenl *an, u8 phy_idx, char *cmd);
429u16 atenl_get_center_channel(u8 bw, u8 ch_band, u16 ctrl_ch);
430int atenl_reg_read(struct atenl *an, u32 offset, u32 *res);
431int atenl_reg_write(struct atenl *an, u32 offset, u32 val);
432int atenl_rf_read(struct atenl *an, u32 wf_sel, u32 offset, u32 *res);
433int atenl_rf_write(struct atenl *an, u32 wf_sel, u32 offset, u32 val);
434
435#endif