blob: da3fd72ffc212cbd8f3a663c524ab2de38ea41ce [file] [log] [blame]
developer22c7ab62022-01-24 11:13:32 +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"
developerf30d4472022-05-30 16:40:23 +080018#include "debug.h"
developer22c7ab62022-01-24 11:13:32 +080019
developer543811b2022-10-07 15:54:07 +080020#define BRIDGE_NAME_OPENWRT "br-lan"
21#define BRIDGE_NAME_RDKB "brlan0"
developerbb73fa22022-12-28 22:40:23 +080022#define ETH_P_RACFG 0x2880
developer22c7ab62022-01-24 11:13:32 +080023#define RACFG_PKT_MAX_SIZE 1600
developerbb73fa22022-12-28 22:40:23 +080024#define RACFG_HLEN 12
25#define RACFG_MAGIC_NO 0x18142880
26#define PRE_CAL_INFO 16
developer8e1f5142023-03-31 17:43:25 +080027#define DPD_INFO_CH_SHIFT 30
28#define DPD_INFO_2G_SHIFT 20
29#define DPD_INFO_5G_SHIFT 10
developer454c4652022-08-31 20:39:29 +080030#define DPD_INFO_6G_SHIFT 0
developer8e1f5142023-03-31 17:43:25 +080031#define DPD_INFO_MASK GENMASK(9, 0)
developer454c4652022-08-31 20:39:29 +080032#define MT_EE_CAL_UNIT 1024
developer22c7ab62022-01-24 11:13:32 +080033
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
developer22c7ab62022-01-24 11:13:32 +080038#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;
developerf30d4472022-05-30 16:40:23 +080070 u32 tx_time;
71 u32 tx_mpdu_len;
developer22c7ab62022-01-24 11:13:32 +080072
73 bool reset_tx_cnt;
74 bool reset_rx_cnt;
75
76 /* history */
77 struct atenl_rx_stat rx_stat;
78};
79
developerf30d4472022-05-30 16:40:23 +080080#define MAX_BAND_NUM 3
developer22c7ab62022-01-24 11:13:32 +080081
82struct atenl {
83 struct atenl_band anb[MAX_BAND_NUM];
84 u16 chip_id;
developerf30d4472022-05-30 16:40:23 +080085 u16 adie_id;
86 u8 sub_chip_id;
developer22c7ab62022-01-24 11:13:32 +080087 u8 cur_band;
developer86045992024-06-03 16:24:42 +080088 u8 main_phy_idx;
developer22c7ab62022-01-24 11:13:32 +080089
90 u8 mac_addr[ETH_ALEN];
developer543811b2022-10-07 15:54:07 +080091 char *bridge_name;
developer22c7ab62022-01-24 11:13:32 +080092 bool unicast;
93 int sock_eth;
developer22c7ab62022-01-24 11:13:32 +080094
95 const char *mtd_part;
96 u32 mtd_offset;
developerbb73fa22022-12-28 22:40:23 +080097 u8 band_idx;
developer22c7ab62022-01-24 11:13:32 +080098 u8 *eeprom_data;
99 int eeprom_fd;
100 u16 eeprom_size;
developer454c4652022-08-31 20:39:29 +0800101 u32 eeprom_prek_offs;
102
103 u8 *cal;
104 u32 cal_info[5];
developer22c7ab62022-01-24 11:13:32 +0800105
106 bool cmd_mode;
developerf30d4472022-05-30 16:40:23 +0800107
108 /* intermediate data */
109 u8 ibf_mcs;
110 u8 ibf_ant;
developer22c7ab62022-01-24 11:13:32 +0800111};
112
113struct atenl_cmd_hdr {
114 __be32 magic_no;
115 __be16 cmd_type;
116 __be16 cmd_id;
117 __be16 len;
118 __be16 seq;
119 u8 data[2048];
120} __attribute__((packed));
121
122enum atenl_cmd {
123 HQA_CMD_UNKNOWN,
124 HQA_CMD_LEGACY, /* legacy or deprecated */
125
126 HQA_CMD_OPEN_ADAPTER,
127 HQA_CMD_CLOSE_ADAPTER,
128 HQA_CMD_GET_CHIP_ID,
129 HQA_CMD_GET_SUB_CHIP_ID,
130 HQA_CMD_SET_TX_BW,
131 HQA_CMD_SET_TX_PKT_BW,
132 HQA_CMD_SET_TX_PRI_BW,
133 HQA_CMD_GET_TX_INFO,
134 HQA_CMD_SET_TX_PATH,
135 HQA_CMD_SET_TX_POWER,
136 HQA_CMD_SET_TX_POWER_MANUAL,
137 HQA_CMD_SET_RF_MODE,
138 HQA_CMD_SET_RX_PATH,
139 HQA_CMD_SET_RX_PKT_LEN,
140 HQA_CMD_SET_FREQ_OFFSET,
141 HQA_CMD_SET_TSSI,
142 HQA_CMD_SET_CFG,
143 HQA_CMD_SET_RU,
144 HQA_CMD_SET_BAND,
developerf30d4472022-05-30 16:40:23 +0800145 HQA_CMD_SET_EEPROM_TO_FW,
developer22c7ab62022-01-24 11:13:32 +0800146 HQA_CMD_READ_MAC_BBP_REG,
developerf30d4472022-05-30 16:40:23 +0800147 HQA_CMD_READ_MAC_BBP_REG_QA,
developer22c7ab62022-01-24 11:13:32 +0800148 HQA_CMD_READ_RF_REG,
149 HQA_CMD_READ_EEPROM_BULK,
150 HQA_CMD_READ_TEMPERATURE,
151 HQA_CMD_WRITE_MAC_BBP_REG,
152 HQA_CMD_WRITE_RF_REG,
153 HQA_CMD_WRITE_EEPROM_BULK,
154 HQA_CMD_WRITE_BUFFER_DONE,
155 HQA_CMD_GET_BAND,
156 HQA_CMD_GET_CFG,
157 HQA_CMD_GET_TX_POWER,
158 HQA_CMD_GET_TX_TONE_POWER,
159 HQA_CMD_GET_EFUSE_FREE_BLOCK,
160 HQA_CMD_GET_FREQ_OFFSET,
161 HQA_CMD_GET_FW_INFO,
162 HQA_CMD_GET_RX_INFO,
163 HQA_CMD_GET_RF_CAP,
164 HQA_CMD_CHECK_EFUSE_MODE,
165 HQA_CMD_CHECK_EFUSE_MODE_TYPE,
166 HQA_CMD_CHECK_EFUSE_MODE_NATIVE,
167 HQA_CMD_ANT_SWAP_CAP,
168 HQA_CMD_RESET_TX_RX_COUNTER,
169 HQA_CMD_CONTINUOUS_TX,
170
171 HQA_CMD_EXT,
172 HQA_CMD_ERR,
173
174 __HQA_CMD_MAX_NUM,
175};
176
177enum atenl_ext_cmd {
178 HQA_EXT_CMD_UNSPEC,
179
180 HQA_EXT_CMD_SET_CHANNEL,
181 HQA_EXT_CMD_SET_TX,
182 HQA_EXT_CMD_START_TX,
183 HQA_EXT_CMD_START_RX,
184 HQA_EXT_CMD_STOP_TX,
185 HQA_EXT_CMD_STOP_RX,
186 HQA_EXT_CMD_SET_TX_TIME_OPT,
187
188 HQA_EXT_CMD_OFF_CH_SCAN,
189
190 HQA_EXT_CMD_IBF_SET_VAL,
191 HQA_EXT_CMD_IBF_GET_STATUS,
192 HQA_EXT_CMD_IBF_PROF_UPDATE_ALL,
193
194 HQA_EXT_CMD_ERR,
195
196 __HQA_EXT_CMD_MAX_NUM,
197};
198
199struct atenl_data {
200 u8 buf[RACFG_PKT_MAX_SIZE];
201 int len;
developerf30d4472022-05-30 16:40:23 +0800202 u16 cmd_id;
203 u8 ext_id;
developer22c7ab62022-01-24 11:13:32 +0800204 enum atenl_cmd cmd;
developer22c7ab62022-01-24 11:13:32 +0800205 enum atenl_ext_cmd ext_cmd;
206};
207
developerf30d4472022-05-30 16:40:23 +0800208struct atenl_ops {
developer22c7ab62022-01-24 11:13:32 +0800209 int (*ops)(struct atenl *an, struct atenl_data *data);
developerf30d4472022-05-30 16:40:23 +0800210 u8 cmd;
211 u8 flags;
212 u16 cmd_id;
213 u16 resp_len;
developer22c7ab62022-01-24 11:13:32 +0800214};
215
developerf30d4472022-05-30 16:40:23 +0800216#define ATENL_OPS_FLAG_EXT_CMD BIT(0)
217#define ATENL_OPS_FLAG_LEGACY BIT(1)
218#define ATENL_OPS_FLAG_SKIP BIT(2)
219
developer22c7ab62022-01-24 11:13:32 +0800220static inline struct atenl_cmd_hdr * atenl_hdr(struct atenl_data *data)
221{
222 u8 *hqa_data = (u8 *)data->buf + ETH_HLEN;
223
224 return (struct atenl_cmd_hdr *)hqa_data;
225}
226
developer22c7ab62022-01-24 11:13:32 +0800227enum atenl_phy_type {
228 ATENL_PHY_TYPE_CCK,
229 ATENL_PHY_TYPE_OFDM,
230 ATENL_PHY_TYPE_HT,
231 ATENL_PHY_TYPE_HT_GF,
232 ATENL_PHY_TYPE_VHT,
233 ATENL_PHY_TYPE_HE_SU = 8,
234 ATENL_PHY_TYPE_HE_EXT_SU,
235 ATENL_PHY_TYPE_HE_TB,
236 ATENL_PHY_TYPE_HE_MU,
developer86869102023-05-15 13:52:35 +0800237 ATENL_PHY_TYPE_EHT_SU = 13,
238 ATENL_PHY_TYPE_EHT_TRIG,
239 ATENL_PHY_TYPE_EHT_MU,
developer22c7ab62022-01-24 11:13:32 +0800240};
241
242enum atenl_e2p_mode {
243 E2P_EFUSE_MODE = 1,
244 E2P_FLASH_MODE,
245 E2P_EEPROM_MODE,
246 E2P_BIN_MODE,
247};
248
249enum atenl_band_type {
250 BAND_TYPE_UNUSE,
251 BAND_TYPE_2G,
252 BAND_TYPE_5G,
253 BAND_TYPE_2G_5G,
254 BAND_TYPE_6G,
255 BAND_TYPE_2G_6G,
256 BAND_TYPE_5G_6G,
257 BAND_TYPE_2G_5G_6G,
258};
259
260enum atenl_ch_band {
261 CH_BAND_2GHZ,
262 CH_BAND_5GHZ,
263 CH_BAND_6GHZ,
264};
265
266/* for mt7915 */
267enum {
268 MT_EE_BAND_SEL_DEFAULT,
269 MT_EE_BAND_SEL_5GHZ,
270 MT_EE_BAND_SEL_2GHZ,
271 MT_EE_BAND_SEL_DUAL,
272};
273
developerae49e8a2023-10-31 16:53:21 +0800274/* for mt7916/mt7981/mt7986 */
developer22c7ab62022-01-24 11:13:32 +0800275enum {
276 MT_EE_BAND_SEL_2G,
277 MT_EE_BAND_SEL_5G,
278 MT_EE_BAND_SEL_6G,
279 MT_EE_BAND_SEL_5G_6G,
280};
281
developerbb73fa22022-12-28 22:40:23 +0800282/* for mt7996 */
283enum {
284 MT_EE_EAGLE_BAND_SEL_DEFAULT,
285 MT_EE_EAGLE_BAND_SEL_2GHZ,
286 MT_EE_EAGLE_BAND_SEL_5GHZ,
287 MT_EE_EAGLE_BAND_SEL_6GHZ,
developer9efec3f2024-09-23 13:43:05 +0800288 MT_EE_EAGLE_BAND_SEL_5GHZ_LOW,
289 MT_EE_EAGLE_BAND_SEL_5GHZ_HIGH,
290 MT_EE_EAGLE_BAND_SEL_6GHZ_LOW,
291 MT_EE_EAGLE_BAND_SEL_6GHZ_HIGH,
developerbb73fa22022-12-28 22:40:23 +0800292};
293
developer22c7ab62022-01-24 11:13:32 +0800294#define MT_EE_WIFI_CONF 0x190
295#define MT_EE_WIFI_CONF0_BAND_SEL GENMASK(7, 6)
developerbb73fa22022-12-28 22:40:23 +0800296#define MT_EE_WIFI_EAGLE_CONF0_BAND_SEL GENMASK(2, 0)
297#define MT_EE_WIFI_EAGLE_CONF1_BAND_SEL GENMASK(5, 3)
298#define MT_EE_WIFI_EAGLE_CONF2_BAND_SEL GENMASK(2, 0)
developer22c7ab62022-01-24 11:13:32 +0800299
300enum {
301 MT7976_ONE_ADIE_DBDC = 0x7,
302 MT7975_ONE_ADIE_SINGLE_BAND = 0x8, /* AX7800 */
303 MT7976_ONE_ADIE_SINGLE_BAND = 0xa, /* AX7800 */
304 MT7975_DUAL_ADIE_DBDC = 0xd, /* AX6000 */
305 MT7976_DUAL_ADIE_DBDC = 0xf, /* AX6000 */
306};
307
308enum {
309 TEST_CBW_20MHZ,
310 TEST_CBW_40MHZ,
311 TEST_CBW_80MHZ,
312 TEST_CBW_10MHZ,
313 TEST_CBW_5MHZ,
314 TEST_CBW_160MHZ,
315 TEST_CBW_8080MHZ,
developer86869102023-05-15 13:52:35 +0800316 TEST_CBW_320MHZ = 12,
developer22c7ab62022-01-24 11:13:32 +0800317
developer86869102023-05-15 13:52:35 +0800318 TEST_CBW_MAX = TEST_CBW_320MHZ,
developer22c7ab62022-01-24 11:13:32 +0800319};
320
321struct atenl_rx_info_hdr {
322 __be32 type;
323 __be32 ver;
324 __be32 val;
325 __be32 len;
326} __attribute__((packed));
327
328struct atenl_rx_info_band {
329 __be32 mac_rx_fcs_err_cnt;
330 __be32 mac_rx_mdrdy_cnt;
331 __be32 mac_rx_len_mismatch;
332 __be32 mac_rx_fcs_ok_cnt;
333 __be32 phy_rx_fcs_err_cnt_cck;
334 __be32 phy_rx_fcs_err_cnt_ofdm;
335 __be32 phy_rx_pd_cck;
336 __be32 phy_rx_pd_ofdm;
337 __be32 phy_rx_sig_err_cck;
338 __be32 phy_rx_sfd_err_cck;
339 __be32 phy_rx_sig_err_ofdm;
340 __be32 phy_rx_tag_err_ofdm;
341 __be32 phy_rx_mdrdy_cnt_cck;
342 __be32 phy_rx_mdrdy_cnt_ofdm;
343} __attribute__((packed));
344
345struct atenl_rx_info_path {
346 __be32 rcpi;
347 __be32 rssi;
348 __be32 fagc_ib_rssi;
349 __be32 fagc_wb_rssi;
350 __be32 inst_ib_rssi;
351 __be32 inst_wb_rssi;
352} __attribute__((packed));
353
354struct atenl_rx_info_user {
355 __be32 freq_offset;
356 __be32 snr;
357 __be32 fcs_error_cnt;
358} __attribute__((packed));
359
360struct atenl_rx_info_comm {
361 __be32 rx_fifo_full;
362 __be32 aci_hit_low;
363 __be32 aci_hit_high;
364 __be32 mu_pkt_count;
365 __be32 sig_mcs;
366 __be32 sinr;
367 __be32 driver_rx_count;
368} __attribute__((packed));
369
370enum atenl_ibf_action {
371 TXBF_ACT_INIT = 1,
372 TXBF_ACT_CHANNEL,
373 TXBF_ACT_MCS,
374 TXBF_ACT_POWER,
375 TXBF_ACT_TX_ANT,
376 TXBF_ACT_RX_START,
377 TXBF_ACT_RX_ANT,
378 TXBF_ACT_LNA_GAIN,
379 TXBF_ACT_IBF_PHASE_COMP,
380 TXBF_ACT_TX_PKT,
381 TXBF_ACT_IBF_PROF_UPDATE,
382 TXBF_ACT_EBF_PROF_UPDATE,
383 TXBF_ACT_IBF_PHASE_CAL,
384 TXBF_ACT_IBF_PHASE_E2P_UPDATE = 16,
385};
386
developer454c4652022-08-31 20:39:29 +0800387enum prek_ops {
388 PREK_SYNC_ALL = 1,
389 PREK_SYNC_GROUP,
390 PREK_SYNC_DPD_2G,
391 PREK_SYNC_DPD_5G,
392 PREK_SYNC_DPD_6G,
393 PREK_CLEAN_GROUP,
394 PREK_CLEAN_DPD,
395};
396
developer9efec3f2024-09-23 13:43:05 +0800397#define MT7916_EEPROM_CHIP_ID 0x7916
398
399/* Wi-Fi6 device id */
400#define MT7915_DEVICE_ID 0x7915
401#define MT7915_DEVICE_ID_2 0x7916
402#define MT7916_DEVICE_ID 0x7906
403#define MT7916_DEVICE_ID_2 0x790a
404#define MT7981_DEVICE_ID 0x7981
405#define MT7986_DEVICE_ID 0x7986
406
407/* Wi-Fi7 device id */
408#define MT7996_DEVICE_ID 0x7990
409#define MT7996_DEVICE_ID_2 0x7991
410#define MT7992_DEVICE_ID 0x7992
411#define MT7992_DEVICE_ID_2 0x799a
412#define MT7990_DEVICE_ID 0x7993
413#define MT7990_DEVICE_ID_2 0x799b
414
developer22c7ab62022-01-24 11:13:32 +0800415static inline bool is_mt7915(struct atenl *an)
416{
developer9efec3f2024-09-23 13:43:05 +0800417 return an->chip_id == MT7915_DEVICE_ID;
developer22c7ab62022-01-24 11:13:32 +0800418}
419
420static inline bool is_mt7916(struct atenl *an)
421{
developer9efec3f2024-09-23 13:43:05 +0800422 /* Merlin is special case:
423 * pcie id is 0x7906/0x790a but eeprom chip id use 0x7916,
424 * since 0x7916 is already used by the second pcie of Harrier.
425 */
426 return (an->chip_id == MT7916_EEPROM_CHIP_ID) ||
427 (an->chip_id == MT7916_DEVICE_ID);
developer22c7ab62022-01-24 11:13:32 +0800428}
429
developerae49e8a2023-10-31 16:53:21 +0800430static inline bool is_mt7981(struct atenl *an)
431{
developer9efec3f2024-09-23 13:43:05 +0800432 return an->chip_id == MT7981_DEVICE_ID;
developerae49e8a2023-10-31 16:53:21 +0800433}
434
developer22c7ab62022-01-24 11:13:32 +0800435static inline bool is_mt7986(struct atenl *an)
436{
developer9efec3f2024-09-23 13:43:05 +0800437 return an->chip_id == MT7986_DEVICE_ID;
developer22c7ab62022-01-24 11:13:32 +0800438}
439
developerbb73fa22022-12-28 22:40:23 +0800440static inline bool is_mt7996(struct atenl *an)
441{
developer9efec3f2024-09-23 13:43:05 +0800442 return an->chip_id == MT7996_DEVICE_ID;
developerbb73fa22022-12-28 22:40:23 +0800443}
444
developere2e8ccc2023-10-13 18:41:57 +0800445static inline bool is_mt7992(struct atenl *an)
446{
developer9efec3f2024-09-23 13:43:05 +0800447 return an->chip_id == MT7992_DEVICE_ID;
developere2e8ccc2023-10-13 18:41:57 +0800448}
449
developer9efec3f2024-09-23 13:43:05 +0800450static inline bool is_mt7990(struct atenl *an)
451{
452 return an->chip_id == MT7990_DEVICE_ID;
453}
454
developere2e8ccc2023-10-13 18:41:57 +0800455static inline bool is_connac3(struct atenl *an)
456{
developer9efec3f2024-09-23 13:43:05 +0800457 return is_mt7996(an) || is_mt7992(an) || is_mt7990(an);
developere2e8ccc2023-10-13 18:41:57 +0800458}
459
developer22c7ab62022-01-24 11:13:32 +0800460int atenl_eth_init(struct atenl *an);
461int atenl_eth_recv(struct atenl *an, struct atenl_data *data);
462int atenl_eth_send(struct atenl *an, struct atenl_data *data);
developerf30d4472022-05-30 16:40:23 +0800463int atenl_hqa_proc_cmd(struct atenl *an);
developerc2309682024-11-15 19:28:46 +0800464void atenl_set_channel(struct atenl *an, u8 bw, u8 ch_band,
465 u16 ch, u16 center_ch1, u16 center_ch2);
developer22c7ab62022-01-24 11:13:32 +0800466int atenl_nl_process(struct atenl *an, struct atenl_data *data);
467int atenl_nl_process_many(struct atenl *an, struct atenl_data *data);
468int atenl_nl_check_mtd(struct atenl *an);
469int atenl_nl_write_eeprom(struct atenl *an, u32 offset, u8 *val, int len);
developer48fbcb62022-03-10 14:24:55 +0800470int atenl_nl_write_efuse_all(struct atenl *an);
developerdcf5eb32024-09-03 17:06:32 +0800471int atenl_nl_write_ext_eeprom_all(struct atenl *an);
developer22c7ab62022-01-24 11:13:32 +0800472int atenl_nl_update_buffer_mode(struct atenl *an);
473int atenl_nl_set_state(struct atenl *an, u8 band,
474 enum mt76_testmode_state state);
developerf30d4472022-05-30 16:40:23 +0800475int atenl_nl_set_aid(struct atenl *an, u8 band, u8 aid);
developer454c4652022-08-31 20:39:29 +0800476int atenl_nl_precal_sync_from_driver(struct atenl *an, enum prek_ops ops);
developer25a27292023-07-21 13:42:14 +0800477void atenl_get_ibf_cal_result(struct atenl *an);
developer22c7ab62022-01-24 11:13:32 +0800478int atenl_eeprom_init(struct atenl *an, u8 phy_idx);
479void atenl_eeprom_close(struct atenl *an);
480int atenl_eeprom_write_mtd(struct atenl *an);
developer454c4652022-08-31 20:39:29 +0800481int atenl_eeprom_update_precal(struct atenl *an, int write_offs, int size);
developer22c7ab62022-01-24 11:13:32 +0800482int atenl_eeprom_read_from_driver(struct atenl *an, u32 offset, int len);
483void atenl_eeprom_cmd_handler(struct atenl *an, u8 phy_idx, char *cmd);
484u16 atenl_get_center_channel(u8 bw, u8 ch_band, u16 ctrl_ch);
485int atenl_reg_read(struct atenl *an, u32 offset, u32 *res);
486int atenl_reg_write(struct atenl *an, u32 offset, u32 val);
developerf30d4472022-05-30 16:40:23 +0800487int atenl_rf_read(struct atenl *an, u32 wf_sel, u32 offset, u32 *res);
488int atenl_rf_write(struct atenl *an, u32 wf_sel, u32 offset, u32 val);
developer22c7ab62022-01-24 11:13:32 +0800489
490#endif