1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2*4882a593Smuzhiyun /* Copyright(c) 2018-2019 Realtek Corporation
3*4882a593Smuzhiyun */
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun #ifndef __RTW_FW_H_
6*4882a593Smuzhiyun #define __RTW_FW_H_
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #define H2C_PKT_SIZE 32
9*4882a593Smuzhiyun #define H2C_PKT_HDR_SIZE 8
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun /* FW bin information */
12*4882a593Smuzhiyun #define FW_HDR_SIZE 64
13*4882a593Smuzhiyun #define FW_HDR_CHKSUM_SIZE 8
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun #define FW_NLO_INFO_CHECK_SIZE 4
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun #define FIFO_PAGE_SIZE_SHIFT 12
18*4882a593Smuzhiyun #define FIFO_PAGE_SIZE 4096
19*4882a593Smuzhiyun #define FIFO_DUMP_ADDR 0x8000
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun #define DLFW_PAGE_SIZE_SHIFT_LEGACY 12
22*4882a593Smuzhiyun #define DLFW_PAGE_SIZE_LEGACY 0x1000
23*4882a593Smuzhiyun #define DLFW_BLK_SIZE_SHIFT_LEGACY 2
24*4882a593Smuzhiyun #define DLFW_BLK_SIZE_LEGACY 4
25*4882a593Smuzhiyun #define FW_START_ADDR_LEGACY 0x1000
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun enum rtw_c2h_cmd_id {
28*4882a593Smuzhiyun C2H_CCX_TX_RPT = 0x03,
29*4882a593Smuzhiyun C2H_BT_INFO = 0x09,
30*4882a593Smuzhiyun C2H_BT_MP_INFO = 0x0b,
31*4882a593Smuzhiyun C2H_RA_RPT = 0x0c,
32*4882a593Smuzhiyun C2H_HW_FEATURE_REPORT = 0x19,
33*4882a593Smuzhiyun C2H_WLAN_INFO = 0x27,
34*4882a593Smuzhiyun C2H_HW_FEATURE_DUMP = 0xfd,
35*4882a593Smuzhiyun C2H_HALMAC = 0xff,
36*4882a593Smuzhiyun };
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun enum rtw_c2h_cmd_id_ext {
39*4882a593Smuzhiyun C2H_CCX_RPT = 0x0f,
40*4882a593Smuzhiyun };
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun struct rtw_c2h_cmd {
43*4882a593Smuzhiyun u8 id;
44*4882a593Smuzhiyun u8 seq;
45*4882a593Smuzhiyun u8 payload[];
46*4882a593Smuzhiyun } __packed;
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun enum rtw_rsvd_packet_type {
49*4882a593Smuzhiyun RSVD_BEACON,
50*4882a593Smuzhiyun RSVD_DUMMY,
51*4882a593Smuzhiyun RSVD_PS_POLL,
52*4882a593Smuzhiyun RSVD_PROBE_RESP,
53*4882a593Smuzhiyun RSVD_NULL,
54*4882a593Smuzhiyun RSVD_QOS_NULL,
55*4882a593Smuzhiyun RSVD_LPS_PG_DPK,
56*4882a593Smuzhiyun RSVD_LPS_PG_INFO,
57*4882a593Smuzhiyun RSVD_PROBE_REQ,
58*4882a593Smuzhiyun RSVD_NLO_INFO,
59*4882a593Smuzhiyun RSVD_CH_INFO,
60*4882a593Smuzhiyun };
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun enum rtw_fw_rf_type {
63*4882a593Smuzhiyun FW_RF_1T2R = 0,
64*4882a593Smuzhiyun FW_RF_2T4R = 1,
65*4882a593Smuzhiyun FW_RF_2T2R = 2,
66*4882a593Smuzhiyun FW_RF_2T3R = 3,
67*4882a593Smuzhiyun FW_RF_1T1R = 4,
68*4882a593Smuzhiyun FW_RF_2T2R_GREEN = 5,
69*4882a593Smuzhiyun FW_RF_3T3R = 6,
70*4882a593Smuzhiyun FW_RF_3T4R = 7,
71*4882a593Smuzhiyun FW_RF_4T4R = 8,
72*4882a593Smuzhiyun FW_RF_MAX_TYPE = 0xF,
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun struct rtw_coex_info_req {
76*4882a593Smuzhiyun u8 seq;
77*4882a593Smuzhiyun u8 op_code;
78*4882a593Smuzhiyun u8 para1;
79*4882a593Smuzhiyun u8 para2;
80*4882a593Smuzhiyun u8 para3;
81*4882a593Smuzhiyun };
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun struct rtw_iqk_para {
84*4882a593Smuzhiyun u8 clear;
85*4882a593Smuzhiyun u8 segment_iqk;
86*4882a593Smuzhiyun };
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun struct rtw_lps_pg_dpk_hdr {
89*4882a593Smuzhiyun u16 dpk_path_ok;
90*4882a593Smuzhiyun u8 dpk_txagc[2];
91*4882a593Smuzhiyun u16 dpk_gs[2];
92*4882a593Smuzhiyun u32 coef[2][20];
93*4882a593Smuzhiyun u8 dpk_ch;
94*4882a593Smuzhiyun } __packed;
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun struct rtw_lps_pg_info_hdr {
97*4882a593Smuzhiyun u8 macid;
98*4882a593Smuzhiyun u8 mbssid;
99*4882a593Smuzhiyun u8 pattern_count;
100*4882a593Smuzhiyun u8 mu_tab_group_id;
101*4882a593Smuzhiyun u8 sec_cam_count;
102*4882a593Smuzhiyun u8 tx_bu_page_count;
103*4882a593Smuzhiyun u16 rsvd;
104*4882a593Smuzhiyun u8 sec_cam[MAX_PG_CAM_BACKUP_NUM];
105*4882a593Smuzhiyun } __packed;
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun struct rtw_rsvd_page {
108*4882a593Smuzhiyun /* associated with each vif */
109*4882a593Smuzhiyun struct list_head vif_list;
110*4882a593Smuzhiyun struct rtw_vif *rtwvif;
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun /* associated when build rsvd page */
113*4882a593Smuzhiyun struct list_head build_list;
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun struct sk_buff *skb;
116*4882a593Smuzhiyun enum rtw_rsvd_packet_type type;
117*4882a593Smuzhiyun u8 page;
118*4882a593Smuzhiyun bool add_txdesc;
119*4882a593Smuzhiyun struct cfg80211_ssid *ssid;
120*4882a593Smuzhiyun u16 probe_req_size;
121*4882a593Smuzhiyun };
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun enum rtw_keep_alive_pkt_type {
124*4882a593Smuzhiyun KEEP_ALIVE_NULL_PKT = 0,
125*4882a593Smuzhiyun KEEP_ALIVE_ARP_RSP = 1,
126*4882a593Smuzhiyun };
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun struct rtw_nlo_info_hdr {
129*4882a593Smuzhiyun u8 nlo_count;
130*4882a593Smuzhiyun u8 hidden_ap_count;
131*4882a593Smuzhiyun u8 rsvd1[2];
132*4882a593Smuzhiyun u8 pattern_check[FW_NLO_INFO_CHECK_SIZE];
133*4882a593Smuzhiyun u8 rsvd2[8];
134*4882a593Smuzhiyun u8 ssid_len[16];
135*4882a593Smuzhiyun u8 chiper[16];
136*4882a593Smuzhiyun u8 rsvd3[16];
137*4882a593Smuzhiyun u8 location[8];
138*4882a593Smuzhiyun } __packed;
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun enum rtw_packet_type {
141*4882a593Smuzhiyun RTW_PACKET_PROBE_REQ = 0x00,
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun RTW_PACKET_UNDEFINE = 0x7FFFFFFF,
144*4882a593Smuzhiyun };
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun struct rtw_fw_wow_keep_alive_para {
147*4882a593Smuzhiyun bool adopt;
148*4882a593Smuzhiyun u8 pkt_type;
149*4882a593Smuzhiyun u8 period; /* unit: sec */
150*4882a593Smuzhiyun };
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun struct rtw_fw_wow_disconnect_para {
153*4882a593Smuzhiyun bool adopt;
154*4882a593Smuzhiyun u8 period; /* unit: sec */
155*4882a593Smuzhiyun u8 retry_count;
156*4882a593Smuzhiyun };
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun struct rtw_ch_switch_option {
159*4882a593Smuzhiyun u8 periodic_option;
160*4882a593Smuzhiyun u32 tsf_high;
161*4882a593Smuzhiyun u32 tsf_low;
162*4882a593Smuzhiyun u8 dest_ch_en;
163*4882a593Smuzhiyun u8 absolute_time_en;
164*4882a593Smuzhiyun u8 dest_ch;
165*4882a593Smuzhiyun u8 normal_period;
166*4882a593Smuzhiyun u8 normal_period_sel;
167*4882a593Smuzhiyun u8 normal_cycle;
168*4882a593Smuzhiyun u8 slow_period;
169*4882a593Smuzhiyun u8 slow_period_sel;
170*4882a593Smuzhiyun u8 nlo_en;
171*4882a593Smuzhiyun };
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun struct rtw_fw_hdr {
174*4882a593Smuzhiyun __le16 signature;
175*4882a593Smuzhiyun u8 category;
176*4882a593Smuzhiyun u8 function;
177*4882a593Smuzhiyun __le16 version; /* 0x04 */
178*4882a593Smuzhiyun u8 subversion;
179*4882a593Smuzhiyun u8 subindex;
180*4882a593Smuzhiyun __le32 rsvd; /* 0x08 */
181*4882a593Smuzhiyun __le32 rsvd2; /* 0x0C */
182*4882a593Smuzhiyun u8 month; /* 0x10 */
183*4882a593Smuzhiyun u8 day;
184*4882a593Smuzhiyun u8 hour;
185*4882a593Smuzhiyun u8 min;
186*4882a593Smuzhiyun __le16 year; /* 0x14 */
187*4882a593Smuzhiyun __le16 rsvd3;
188*4882a593Smuzhiyun u8 mem_usage; /* 0x18 */
189*4882a593Smuzhiyun u8 rsvd4[3];
190*4882a593Smuzhiyun __le16 h2c_fmt_ver; /* 0x1C */
191*4882a593Smuzhiyun __le16 rsvd5;
192*4882a593Smuzhiyun __le32 dmem_addr; /* 0x20 */
193*4882a593Smuzhiyun __le32 dmem_size;
194*4882a593Smuzhiyun __le32 rsvd6;
195*4882a593Smuzhiyun __le32 rsvd7;
196*4882a593Smuzhiyun __le32 imem_size; /* 0x30 */
197*4882a593Smuzhiyun __le32 emem_size;
198*4882a593Smuzhiyun __le32 emem_addr;
199*4882a593Smuzhiyun __le32 imem_addr;
200*4882a593Smuzhiyun } __packed;
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun struct rtw_fw_hdr_legacy {
203*4882a593Smuzhiyun __le16 signature;
204*4882a593Smuzhiyun u8 category;
205*4882a593Smuzhiyun u8 function;
206*4882a593Smuzhiyun __le16 version; /* 0x04 */
207*4882a593Smuzhiyun u8 subversion1;
208*4882a593Smuzhiyun u8 subversion2;
209*4882a593Smuzhiyun u8 month; /* 0x08 */
210*4882a593Smuzhiyun u8 day;
211*4882a593Smuzhiyun u8 hour;
212*4882a593Smuzhiyun u8 minute;
213*4882a593Smuzhiyun __le16 size;
214*4882a593Smuzhiyun __le16 rsvd2;
215*4882a593Smuzhiyun __le32 idx; /* 0x10 */
216*4882a593Smuzhiyun __le32 rsvd3;
217*4882a593Smuzhiyun __le32 rsvd4; /* 0x18 */
218*4882a593Smuzhiyun __le32 rsvd5;
219*4882a593Smuzhiyun } __packed;
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun /* C2H */
222*4882a593Smuzhiyun #define GET_CCX_REPORT_SEQNUM_V0(c2h_payload) (c2h_payload[6] & 0xfc)
223*4882a593Smuzhiyun #define GET_CCX_REPORT_STATUS_V0(c2h_payload) (c2h_payload[0] & 0xc0)
224*4882a593Smuzhiyun #define GET_CCX_REPORT_SEQNUM_V1(c2h_payload) (c2h_payload[8] & 0xfc)
225*4882a593Smuzhiyun #define GET_CCX_REPORT_STATUS_V1(c2h_payload) (c2h_payload[9] & 0xc0)
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun #define GET_RA_REPORT_RATE(c2h_payload) (c2h_payload[0] & 0x7f)
228*4882a593Smuzhiyun #define GET_RA_REPORT_SGI(c2h_payload) ((c2h_payload[0] & 0x80) >> 7)
229*4882a593Smuzhiyun #define GET_RA_REPORT_BW(c2h_payload) (c2h_payload[6])
230*4882a593Smuzhiyun #define GET_RA_REPORT_MACID(c2h_payload) (c2h_payload[1])
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun /* PKT H2C */
233*4882a593Smuzhiyun #define H2C_PKT_CMD_ID 0xFF
234*4882a593Smuzhiyun #define H2C_PKT_CATEGORY 0x01
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun #define H2C_PKT_GENERAL_INFO 0x0D
237*4882a593Smuzhiyun #define H2C_PKT_PHYDM_INFO 0x11
238*4882a593Smuzhiyun #define H2C_PKT_IQK 0x0E
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun #define H2C_PKT_CH_SWITCH 0x02
241*4882a593Smuzhiyun #define H2C_PKT_UPDATE_PKT 0x0C
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun #define H2C_PKT_CH_SWITCH_LEN 0x20
244*4882a593Smuzhiyun #define H2C_PKT_UPDATE_PKT_LEN 0x4
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun #define SET_PKT_H2C_CATEGORY(h2c_pkt, value) \
247*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(6, 0))
248*4882a593Smuzhiyun #define SET_PKT_H2C_CMD_ID(h2c_pkt, value) \
249*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(15, 8))
250*4882a593Smuzhiyun #define SET_PKT_H2C_SUB_CMD_ID(h2c_pkt, value) \
251*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(31, 16))
252*4882a593Smuzhiyun #define SET_PKT_H2C_TOTAL_LEN(h2c_pkt, value) \
253*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(15, 0))
254*4882a593Smuzhiyun
rtw_h2c_pkt_set_header(u8 * h2c_pkt,u8 sub_id)255*4882a593Smuzhiyun static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id)
256*4882a593Smuzhiyun {
257*4882a593Smuzhiyun SET_PKT_H2C_CATEGORY(h2c_pkt, H2C_PKT_CATEGORY);
258*4882a593Smuzhiyun SET_PKT_H2C_CMD_ID(h2c_pkt, H2C_PKT_CMD_ID);
259*4882a593Smuzhiyun SET_PKT_H2C_SUB_CMD_ID(h2c_pkt, sub_id);
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun
262*4882a593Smuzhiyun #define FW_OFFLOAD_H2C_SET_SEQ_NUM(h2c_pkt, value) \
263*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(31, 16))
264*4882a593Smuzhiyun #define GENERAL_INFO_SET_FW_TX_BOUNDARY(h2c_pkt, value) \
265*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x02, value, GENMASK(23, 16))
266*4882a593Smuzhiyun
267*4882a593Smuzhiyun #define PHYDM_INFO_SET_REF_TYPE(h2c_pkt, value) \
268*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x02, value, GENMASK(7, 0))
269*4882a593Smuzhiyun #define PHYDM_INFO_SET_RF_TYPE(h2c_pkt, value) \
270*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x02, value, GENMASK(15, 8))
271*4882a593Smuzhiyun #define PHYDM_INFO_SET_CUT_VER(h2c_pkt, value) \
272*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x02, value, GENMASK(23, 16))
273*4882a593Smuzhiyun #define PHYDM_INFO_SET_RX_ANT_STATUS(h2c_pkt, value) \
274*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x02, value, GENMASK(27, 24))
275*4882a593Smuzhiyun #define PHYDM_INFO_SET_TX_ANT_STATUS(h2c_pkt, value) \
276*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x02, value, GENMASK(31, 28))
277*4882a593Smuzhiyun #define IQK_SET_CLEAR(h2c_pkt, value) \
278*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x02, value, BIT(0))
279*4882a593Smuzhiyun #define IQK_SET_SEGMENT_IQK(h2c_pkt, value) \
280*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x02, value, BIT(1))
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun #define CHSW_INFO_SET_CH(pkt, value) \
283*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(pkt) + 0x00, value, GENMASK(7, 0))
284*4882a593Smuzhiyun #define CHSW_INFO_SET_PRI_CH_IDX(pkt, value) \
285*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(pkt) + 0x00, value, GENMASK(11, 8))
286*4882a593Smuzhiyun #define CHSW_INFO_SET_BW(pkt, value) \
287*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(pkt) + 0x00, value, GENMASK(15, 12))
288*4882a593Smuzhiyun #define CHSW_INFO_SET_TIMEOUT(pkt, value) \
289*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(pkt) + 0x00, value, GENMASK(23, 16))
290*4882a593Smuzhiyun #define CHSW_INFO_SET_ACTION_ID(pkt, value) \
291*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(pkt) + 0x00, value, GENMASK(30, 24))
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun #define UPDATE_PKT_SET_SIZE(h2c_pkt, value) \
294*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x02, value, GENMASK(15, 0))
295*4882a593Smuzhiyun #define UPDATE_PKT_SET_PKT_ID(h2c_pkt, value) \
296*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x02, value, GENMASK(23, 16))
297*4882a593Smuzhiyun #define UPDATE_PKT_SET_LOCATION(h2c_pkt, value) \
298*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x02, value, GENMASK(31, 24))
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun #define CH_SWITCH_SET_START(h2c_pkt, value) \
301*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x02, value, BIT(0))
302*4882a593Smuzhiyun #define CH_SWITCH_SET_DEST_CH_EN(h2c_pkt, value) \
303*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x02, value, BIT(1))
304*4882a593Smuzhiyun #define CH_SWITCH_SET_ABSOLUTE_TIME(h2c_pkt, value) \
305*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x02, value, BIT(2))
306*4882a593Smuzhiyun #define CH_SWITCH_SET_PERIODIC_OPT(h2c_pkt, value) \
307*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x02, value, GENMASK(4, 3))
308*4882a593Smuzhiyun #define CH_SWITCH_SET_INFO_LOC(h2c_pkt, value) \
309*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x02, value, GENMASK(15, 8))
310*4882a593Smuzhiyun #define CH_SWITCH_SET_CH_NUM(h2c_pkt, value) \
311*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x02, value, GENMASK(23, 16))
312*4882a593Smuzhiyun #define CH_SWITCH_SET_PRI_CH_IDX(h2c_pkt, value) \
313*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x02, value, GENMASK(27, 24))
314*4882a593Smuzhiyun #define CH_SWITCH_SET_DEST_CH(h2c_pkt, value) \
315*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x03, value, GENMASK(7, 0))
316*4882a593Smuzhiyun #define CH_SWITCH_SET_NORMAL_PERIOD(h2c_pkt, value) \
317*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x03, value, GENMASK(13, 8))
318*4882a593Smuzhiyun #define CH_SWITCH_SET_NORMAL_PERIOD_SEL(h2c_pkt, value) \
319*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x03, value, GENMASK(15, 14))
320*4882a593Smuzhiyun #define CH_SWITCH_SET_SLOW_PERIOD(h2c_pkt, value) \
321*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x03, value, GENMASK(21, 16))
322*4882a593Smuzhiyun #define CH_SWITCH_SET_SLOW_PERIOD_SEL(h2c_pkt, value) \
323*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x03, value, GENMASK(23, 22))
324*4882a593Smuzhiyun #define CH_SWITCH_SET_NORMAL_CYCLE(h2c_pkt, value) \
325*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x03, value, GENMASK(31, 24))
326*4882a593Smuzhiyun #define CH_SWITCH_SET_TSF_HIGH(h2c_pkt, value) \
327*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x04, value, GENMASK(31, 0))
328*4882a593Smuzhiyun #define CH_SWITCH_SET_TSF_LOW(h2c_pkt, value) \
329*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x05, value, GENMASK(31, 0))
330*4882a593Smuzhiyun #define CH_SWITCH_SET_INFO_SIZE(h2c_pkt, value) \
331*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x06, value, GENMASK(15, 0))
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun /* Command H2C */
334*4882a593Smuzhiyun #define H2C_CMD_RSVD_PAGE 0x0
335*4882a593Smuzhiyun #define H2C_CMD_MEDIA_STATUS_RPT 0x01
336*4882a593Smuzhiyun #define H2C_CMD_SET_PWR_MODE 0x20
337*4882a593Smuzhiyun #define H2C_CMD_LPS_PG_INFO 0x2b
338*4882a593Smuzhiyun #define H2C_CMD_RA_INFO 0x40
339*4882a593Smuzhiyun #define H2C_CMD_RSSI_MONITOR 0x42
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun #define H2C_CMD_COEX_TDMA_TYPE 0x60
342*4882a593Smuzhiyun #define H2C_CMD_QUERY_BT_INFO 0x61
343*4882a593Smuzhiyun #define H2C_CMD_FORCE_BT_TX_POWER 0x62
344*4882a593Smuzhiyun #define H2C_CMD_IGNORE_WLAN_ACTION 0x63
345*4882a593Smuzhiyun #define H2C_CMD_WL_CH_INFO 0x66
346*4882a593Smuzhiyun #define H2C_CMD_QUERY_BT_MP_INFO 0x67
347*4882a593Smuzhiyun #define H2C_CMD_BT_WIFI_CONTROL 0x69
348*4882a593Smuzhiyun
349*4882a593Smuzhiyun #define H2C_CMD_KEEP_ALIVE 0x03
350*4882a593Smuzhiyun #define H2C_CMD_DISCONNECT_DECISION 0x04
351*4882a593Smuzhiyun #define H2C_CMD_WOWLAN 0x80
352*4882a593Smuzhiyun #define H2C_CMD_REMOTE_WAKE_CTRL 0x81
353*4882a593Smuzhiyun #define H2C_CMD_AOAC_GLOBAL_INFO 0x82
354*4882a593Smuzhiyun #define H2C_CMD_NLO_INFO 0x8C
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun #define SET_H2C_CMD_ID_CLASS(h2c_pkt, value) \
357*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(7, 0))
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun #define MEDIA_STATUS_RPT_SET_OP_MODE(h2c_pkt, value) \
360*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(8))
361*4882a593Smuzhiyun #define MEDIA_STATUS_RPT_SET_MACID(h2c_pkt, value) \
362*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 16))
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun #define SET_PWR_MODE_SET_MODE(h2c_pkt, value) \
365*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(14, 8))
366*4882a593Smuzhiyun #define SET_PWR_MODE_SET_RLBM(h2c_pkt, value) \
367*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(19, 16))
368*4882a593Smuzhiyun #define SET_PWR_MODE_SET_SMART_PS(h2c_pkt, value) \
369*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 20))
370*4882a593Smuzhiyun #define SET_PWR_MODE_SET_AWAKE_INTERVAL(h2c_pkt, value) \
371*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(31, 24))
372*4882a593Smuzhiyun #define SET_PWR_MODE_SET_PORT_ID(h2c_pkt, value) \
373*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(7, 5))
374*4882a593Smuzhiyun #define SET_PWR_MODE_SET_PWR_STATE(h2c_pkt, value) \
375*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(15, 8))
376*4882a593Smuzhiyun #define LPS_PG_INFO_LOC(h2c_pkt, value) \
377*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 16))
378*4882a593Smuzhiyun #define LPS_PG_DPK_LOC(h2c_pkt, value) \
379*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(31, 24))
380*4882a593Smuzhiyun #define LPS_PG_SEC_CAM_EN(h2c_pkt, value) \
381*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(8))
382*4882a593Smuzhiyun #define LPS_PG_PATTERN_CAM_EN(h2c_pkt, value) \
383*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(10))
384*4882a593Smuzhiyun #define SET_RSSI_INFO_MACID(h2c_pkt, value) \
385*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(15, 8))
386*4882a593Smuzhiyun #define SET_RSSI_INFO_RSSI(h2c_pkt, value) \
387*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(31, 24))
388*4882a593Smuzhiyun #define SET_RSSI_INFO_STBC(h2c_pkt, value) \
389*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, BIT(1))
390*4882a593Smuzhiyun #define SET_RA_INFO_MACID(h2c_pkt, value) \
391*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(15, 8))
392*4882a593Smuzhiyun #define SET_RA_INFO_RATE_ID(h2c_pkt, value) \
393*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(20, 16))
394*4882a593Smuzhiyun #define SET_RA_INFO_INIT_RA_LVL(h2c_pkt, value) \
395*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(22, 21))
396*4882a593Smuzhiyun #define SET_RA_INFO_SGI_EN(h2c_pkt, value) \
397*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(23))
398*4882a593Smuzhiyun #define SET_RA_INFO_BW_MODE(h2c_pkt, value) \
399*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(25, 24))
400*4882a593Smuzhiyun #define SET_RA_INFO_LDPC(h2c_pkt, value) \
401*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(26))
402*4882a593Smuzhiyun #define SET_RA_INFO_NO_UPDATE(h2c_pkt, value) \
403*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(27))
404*4882a593Smuzhiyun #define SET_RA_INFO_VHT_EN(h2c_pkt, value) \
405*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(29, 28))
406*4882a593Smuzhiyun #define SET_RA_INFO_DIS_PT(h2c_pkt, value) \
407*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(30))
408*4882a593Smuzhiyun #define SET_RA_INFO_RA_MASK0(h2c_pkt, value) \
409*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(7, 0))
410*4882a593Smuzhiyun #define SET_RA_INFO_RA_MASK1(h2c_pkt, value) \
411*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(15, 8))
412*4882a593Smuzhiyun #define SET_RA_INFO_RA_MASK2(h2c_pkt, value) \
413*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(23, 16))
414*4882a593Smuzhiyun #define SET_RA_INFO_RA_MASK3(h2c_pkt, value) \
415*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(31, 24))
416*4882a593Smuzhiyun #define SET_QUERY_BT_INFO(h2c_pkt, value) \
417*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(8))
418*4882a593Smuzhiyun #define SET_WL_CH_INFO_LINK(h2c_pkt, value) \
419*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(15, 8))
420*4882a593Smuzhiyun #define SET_WL_CH_INFO_CHNL(h2c_pkt, value) \
421*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 16))
422*4882a593Smuzhiyun #define SET_WL_CH_INFO_BW(h2c_pkt, value) \
423*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(31, 24))
424*4882a593Smuzhiyun #define SET_BT_MP_INFO_SEQ(h2c_pkt, value) \
425*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(15, 12))
426*4882a593Smuzhiyun #define SET_BT_MP_INFO_OP_CODE(h2c_pkt, value) \
427*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 16))
428*4882a593Smuzhiyun #define SET_BT_MP_INFO_PARA1(h2c_pkt, value) \
429*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(31, 24))
430*4882a593Smuzhiyun #define SET_BT_MP_INFO_PARA2(h2c_pkt, value) \
431*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(7, 0))
432*4882a593Smuzhiyun #define SET_BT_MP_INFO_PARA3(h2c_pkt, value) \
433*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(15, 8))
434*4882a593Smuzhiyun #define SET_BT_TX_POWER_INDEX(h2c_pkt, value) \
435*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(15, 8))
436*4882a593Smuzhiyun #define SET_IGNORE_WLAN_ACTION_EN(h2c_pkt, value) \
437*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(8))
438*4882a593Smuzhiyun #define SET_COEX_TDMA_TYPE_PARA1(h2c_pkt, value) \
439*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(15, 8))
440*4882a593Smuzhiyun #define SET_COEX_TDMA_TYPE_PARA2(h2c_pkt, value) \
441*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 16))
442*4882a593Smuzhiyun #define SET_COEX_TDMA_TYPE_PARA3(h2c_pkt, value) \
443*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(31, 24))
444*4882a593Smuzhiyun #define SET_COEX_TDMA_TYPE_PARA4(h2c_pkt, value) \
445*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(7, 0))
446*4882a593Smuzhiyun #define SET_COEX_TDMA_TYPE_PARA5(h2c_pkt, value) \
447*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(15, 8))
448*4882a593Smuzhiyun #define SET_BT_WIFI_CONTROL_OP_CODE(h2c_pkt, value) \
449*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(15, 8))
450*4882a593Smuzhiyun #define SET_BT_WIFI_CONTROL_DATA1(h2c_pkt, value) \
451*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 16))
452*4882a593Smuzhiyun #define SET_BT_WIFI_CONTROL_DATA2(h2c_pkt, value) \
453*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(31, 24))
454*4882a593Smuzhiyun #define SET_BT_WIFI_CONTROL_DATA3(h2c_pkt, value) \
455*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(7, 0))
456*4882a593Smuzhiyun #define SET_BT_WIFI_CONTROL_DATA4(h2c_pkt, value) \
457*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(15, 8))
458*4882a593Smuzhiyun #define SET_BT_WIFI_CONTROL_DATA5(h2c_pkt, value) \
459*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x01, value, GENMASK(23, 16))
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun #define SET_KEEP_ALIVE_ENABLE(h2c_pkt, value) \
462*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(8))
463*4882a593Smuzhiyun #define SET_KEEP_ALIVE_ADOPT(h2c_pkt, value) \
464*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(9))
465*4882a593Smuzhiyun #define SET_KEEP_ALIVE_PKT_TYPE(h2c_pkt, value) \
466*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(10))
467*4882a593Smuzhiyun #define SET_KEEP_ALIVE_CHECK_PERIOD(h2c_pkt, value) \
468*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 16))
469*4882a593Smuzhiyun
470*4882a593Smuzhiyun #define SET_DISCONNECT_DECISION_ENABLE(h2c_pkt, value) \
471*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(8))
472*4882a593Smuzhiyun #define SET_DISCONNECT_DECISION_ADOPT(h2c_pkt, value) \
473*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(9))
474*4882a593Smuzhiyun #define SET_DISCONNECT_DECISION_CHECK_PERIOD(h2c_pkt, value) \
475*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 16))
476*4882a593Smuzhiyun #define SET_DISCONNECT_DECISION_TRY_PKT_NUM(h2c_pkt, value) \
477*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(31, 24))
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun #define SET_WOWLAN_FUNC_ENABLE(h2c_pkt, value) \
480*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(8))
481*4882a593Smuzhiyun #define SET_WOWLAN_PATTERN_MATCH_ENABLE(h2c_pkt, value) \
482*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(9))
483*4882a593Smuzhiyun #define SET_WOWLAN_MAGIC_PKT_ENABLE(h2c_pkt, value) \
484*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(10))
485*4882a593Smuzhiyun #define SET_WOWLAN_UNICAST_PKT_ENABLE(h2c_pkt, value) \
486*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(11))
487*4882a593Smuzhiyun #define SET_WOWLAN_REKEY_WAKEUP_ENABLE(h2c_pkt, value) \
488*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(14))
489*4882a593Smuzhiyun #define SET_WOWLAN_DEAUTH_WAKEUP_ENABLE(h2c_pkt, value) \
490*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(15))
491*4882a593Smuzhiyun
492*4882a593Smuzhiyun #define SET_REMOTE_WAKECTRL_ENABLE(h2c_pkt, value) \
493*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(8))
494*4882a593Smuzhiyun #define SET_REMOTE_WAKE_CTRL_NLO_OFFLOAD_EN(h2c_pkt, value) \
495*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(12))
496*4882a593Smuzhiyun
497*4882a593Smuzhiyun #define SET_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(h2c_pkt, value) \
498*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(15, 8))
499*4882a593Smuzhiyun #define SET_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(h2c_pkt, value) \
500*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 16))
501*4882a593Smuzhiyun
502*4882a593Smuzhiyun #define SET_NLO_FUN_EN(h2c_pkt, value) \
503*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(8))
504*4882a593Smuzhiyun #define SET_NLO_PS_32K(h2c_pkt, value) \
505*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(9))
506*4882a593Smuzhiyun #define SET_NLO_IGNORE_SECURITY(h2c_pkt, value) \
507*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, BIT(10))
508*4882a593Smuzhiyun #define SET_NLO_LOC_NLO_INFO(h2c_pkt, value) \
509*4882a593Smuzhiyun le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 16))
510*4882a593Smuzhiyun
511*4882a593Smuzhiyun #define GET_FW_DUMP_LEN(_header) \
512*4882a593Smuzhiyun le32_get_bits(*((__le32 *)(_header) + 0x00), GENMASK(15, 0))
513*4882a593Smuzhiyun #define GET_FW_DUMP_SEQ(_header) \
514*4882a593Smuzhiyun le32_get_bits(*((__le32 *)(_header) + 0x00), GENMASK(22, 16))
515*4882a593Smuzhiyun #define GET_FW_DUMP_MORE(_header) \
516*4882a593Smuzhiyun le32_get_bits(*((__le32 *)(_header) + 0x00), BIT(23))
517*4882a593Smuzhiyun #define GET_FW_DUMP_VERSION(_header) \
518*4882a593Smuzhiyun le32_get_bits(*((__le32 *)(_header) + 0x00), GENMASK(31, 24))
519*4882a593Smuzhiyun #define GET_FW_DUMP_TLV_TYPE(_header) \
520*4882a593Smuzhiyun le32_get_bits(*((__le32 *)(_header) + 0x01), GENMASK(15, 0))
521*4882a593Smuzhiyun #define GET_FW_DUMP_TLV_LEN(_header) \
522*4882a593Smuzhiyun le32_get_bits(*((__le32 *)(_header) + 0x01), GENMASK(31, 16))
523*4882a593Smuzhiyun #define GET_FW_DUMP_TLV_VAL(_header) \
524*4882a593Smuzhiyun le32_get_bits(*((__le32 *)(_header) + 0x02), GENMASK(31, 0))
get_c2h_from_skb(struct sk_buff * skb)525*4882a593Smuzhiyun static inline struct rtw_c2h_cmd *get_c2h_from_skb(struct sk_buff *skb)
526*4882a593Smuzhiyun {
527*4882a593Smuzhiyun u32 pkt_offset;
528*4882a593Smuzhiyun
529*4882a593Smuzhiyun pkt_offset = *((u32 *)skb->cb);
530*4882a593Smuzhiyun return (struct rtw_c2h_cmd *)(skb->data + pkt_offset);
531*4882a593Smuzhiyun }
532*4882a593Smuzhiyun
533*4882a593Smuzhiyun void rtw_fw_c2h_cmd_rx_irqsafe(struct rtw_dev *rtwdev, u32 pkt_offset,
534*4882a593Smuzhiyun struct sk_buff *skb);
535*4882a593Smuzhiyun void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb);
536*4882a593Smuzhiyun void rtw_fw_send_general_info(struct rtw_dev *rtwdev);
537*4882a593Smuzhiyun void rtw_fw_send_phydm_info(struct rtw_dev *rtwdev);
538*4882a593Smuzhiyun
539*4882a593Smuzhiyun void rtw_fw_do_iqk(struct rtw_dev *rtwdev, struct rtw_iqk_para *para);
540*4882a593Smuzhiyun void rtw_fw_set_pwr_mode(struct rtw_dev *rtwdev);
541*4882a593Smuzhiyun void rtw_fw_set_pg_info(struct rtw_dev *rtwdev);
542*4882a593Smuzhiyun void rtw_fw_query_bt_info(struct rtw_dev *rtwdev);
543*4882a593Smuzhiyun void rtw_fw_wl_ch_info(struct rtw_dev *rtwdev, u8 link, u8 ch, u8 bw);
544*4882a593Smuzhiyun void rtw_fw_query_bt_mp_info(struct rtw_dev *rtwdev,
545*4882a593Smuzhiyun struct rtw_coex_info_req *req);
546*4882a593Smuzhiyun void rtw_fw_force_bt_tx_power(struct rtw_dev *rtwdev, u8 bt_pwr_dec_lvl);
547*4882a593Smuzhiyun void rtw_fw_bt_ignore_wlan_action(struct rtw_dev *rtwdev, bool enable);
548*4882a593Smuzhiyun void rtw_fw_coex_tdma_type(struct rtw_dev *rtwdev,
549*4882a593Smuzhiyun u8 para1, u8 para2, u8 para3, u8 para4, u8 para5);
550*4882a593Smuzhiyun void rtw_fw_bt_wifi_control(struct rtw_dev *rtwdev, u8 op_code, u8 *data);
551*4882a593Smuzhiyun void rtw_fw_send_rssi_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si);
552*4882a593Smuzhiyun void rtw_fw_send_ra_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si);
553*4882a593Smuzhiyun void rtw_fw_media_status_report(struct rtw_dev *rtwdev, u8 mac_id, bool conn);
554*4882a593Smuzhiyun int rtw_fw_write_data_rsvd_page(struct rtw_dev *rtwdev, u16 pg_addr,
555*4882a593Smuzhiyun u8 *buf, u32 size);
556*4882a593Smuzhiyun void rtw_remove_rsvd_page(struct rtw_dev *rtwdev,
557*4882a593Smuzhiyun struct rtw_vif *rtwvif);
558*4882a593Smuzhiyun void rtw_add_rsvd_page_bcn(struct rtw_dev *rtwdev,
559*4882a593Smuzhiyun struct rtw_vif *rtwvif);
560*4882a593Smuzhiyun void rtw_add_rsvd_page_pno(struct rtw_dev *rtwdev,
561*4882a593Smuzhiyun struct rtw_vif *rtwvif);
562*4882a593Smuzhiyun void rtw_add_rsvd_page_sta(struct rtw_dev *rtwdev,
563*4882a593Smuzhiyun struct rtw_vif *rtwvif);
564*4882a593Smuzhiyun int rtw_fw_download_rsvd_page(struct rtw_dev *rtwdev);
565*4882a593Smuzhiyun void rtw_send_rsvd_page_h2c(struct rtw_dev *rtwdev);
566*4882a593Smuzhiyun int rtw_dump_drv_rsvd_page(struct rtw_dev *rtwdev,
567*4882a593Smuzhiyun u32 offset, u32 size, u32 *buf);
568*4882a593Smuzhiyun void rtw_fw_set_remote_wake_ctrl_cmd(struct rtw_dev *rtwdev, bool enable);
569*4882a593Smuzhiyun void rtw_fw_set_wowlan_ctrl_cmd(struct rtw_dev *rtwdev, bool enable);
570*4882a593Smuzhiyun void rtw_fw_set_keep_alive_cmd(struct rtw_dev *rtwdev, bool enable);
571*4882a593Smuzhiyun void rtw_fw_set_disconnect_decision_cmd(struct rtw_dev *rtwdev, bool enable);
572*4882a593Smuzhiyun void rtw_fw_set_aoac_global_info_cmd(struct rtw_dev *rtwdev,
573*4882a593Smuzhiyun u8 pairwise_key_enc,
574*4882a593Smuzhiyun u8 group_key_enc);
575*4882a593Smuzhiyun
576*4882a593Smuzhiyun void rtw_fw_set_nlo_info(struct rtw_dev *rtwdev, bool enable);
577*4882a593Smuzhiyun void rtw_fw_update_pkt_probe_req(struct rtw_dev *rtwdev,
578*4882a593Smuzhiyun struct cfg80211_ssid *ssid);
579*4882a593Smuzhiyun void rtw_fw_channel_switch(struct rtw_dev *rtwdev, bool enable);
580*4882a593Smuzhiyun void rtw_fw_h2c_cmd_dbg(struct rtw_dev *rtwdev, u8 *h2c);
581*4882a593Smuzhiyun void rtw_fw_c2h_cmd_isr(struct rtw_dev *rtwdev);
582*4882a593Smuzhiyun int rtw_fw_dump_fifo(struct rtw_dev *rtwdev, u8 fifo_sel, u32 addr, u32 size,
583*4882a593Smuzhiyun u32 *buffer);
584*4882a593Smuzhiyun
585*4882a593Smuzhiyun #endif
586