xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852bs/phl/phl_trx_def.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright(c) 2019 Realtek Corporation.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify it
6*4882a593Smuzhiyun  * under the terms of version 2 of the GNU General Public License as
7*4882a593Smuzhiyun  * published by the Free Software Foundation.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful, but WITHOUT
10*4882a593Smuzhiyun  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12*4882a593Smuzhiyun  * more details.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  *****************************************************************************/
15*4882a593Smuzhiyun #ifndef __PHL_TRX_DEF_H_
16*4882a593Smuzhiyun #define __PHL_TRX_DEF_H_
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun /* core / phl common structrue */
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #ifndef MAX_PHL_TX_RING_ENTRY_NUM
21*4882a593Smuzhiyun #define MAX_PHL_TX_RING_ENTRY_NUM 4096
22*4882a593Smuzhiyun #endif /*MAX_PHL_TX_RING_ENTRY_NUM*/
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #ifndef MAX_PHL_RX_RING_ENTRY_NUM
25*4882a593Smuzhiyun #define MAX_PHL_RX_RING_ENTRY_NUM 4096
26*4882a593Smuzhiyun #endif /*MAX_PHL_RX_RING_ENTRY_NUM*/
27*4882a593Smuzhiyun #define MAX_PHL_RING_CAT_NUM 10 /* 8 tid + 1 mgnt + 1 hiq*/
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #ifdef CONFIG_RTW_REDUCE_MEM
31*4882a593Smuzhiyun #define MAX_PHL_RING_RX_PKT_NUM MAX_PHL_RX_RING_ENTRY_NUM
32*4882a593Smuzhiyun #else
33*4882a593Smuzhiyun #define MAX_PHL_RING_RX_PKT_NUM 8192
34*4882a593Smuzhiyun #endif
35*4882a593Smuzhiyun #define MAX_RX_BUF_SEG_NUM 4
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #define _H2CB_CMD_QLEN 32
38*4882a593Smuzhiyun #define _H2CB_DATA_QLEN 32
39*4882a593Smuzhiyun #define _H2CB_LONG_DATA_QLEN 200 /* should be refined */
40*4882a593Smuzhiyun #define MAX_H2C_PKT_NUM (_H2CB_CMD_QLEN + _H2CB_DATA_QLEN + _H2CB_LONG_DATA_QLEN)
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define FWCMD_HDR_LEN 8
43*4882a593Smuzhiyun #define _WD_BODY_LEN 24
44*4882a593Smuzhiyun #define H2C_CMD_LEN 64
45*4882a593Smuzhiyun #define H2C_DATA_LEN 256
46*4882a593Smuzhiyun #define H2C_LONG_DATA_LEN 2048
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun #define get_h2c_size_by_range(i) \
49*4882a593Smuzhiyun 	((i < _H2CB_CMD_QLEN) ? \
50*4882a593Smuzhiyun 	(FWCMD_HDR_LEN + _WD_BODY_LEN + H2C_CMD_LEN) : \
51*4882a593Smuzhiyun 	((i < (_H2CB_CMD_QLEN + _H2CB_DATA_QLEN)) ? \
52*4882a593Smuzhiyun 	(FWCMD_HDR_LEN + _WD_BODY_LEN + H2C_DATA_LEN) : \
53*4882a593Smuzhiyun 	(FWCMD_HDR_LEN + _WD_BODY_LEN + H2C_LONG_DATA_LEN)))
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun struct rtw_h2c_pkt {
56*4882a593Smuzhiyun 	_os_list list;
57*4882a593Smuzhiyun 	u8 *vir_head; /* should not reset */
58*4882a593Smuzhiyun 	u8 *vir_data;
59*4882a593Smuzhiyun 	u8 *vir_end;
60*4882a593Smuzhiyun 	u8 *vir_tail;
61*4882a593Smuzhiyun 	void *os_rsvd[1];
62*4882a593Smuzhiyun 	u8 type;
63*4882a593Smuzhiyun 	u32 id; /* h2c id */
64*4882a593Smuzhiyun 	u32 buf_len;
65*4882a593Smuzhiyun 	u32 data_len;
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun 	u32 phy_addr_l;
68*4882a593Smuzhiyun 	u32 phy_addr_h;
69*4882a593Smuzhiyun 	u8 cache;
70*4882a593Smuzhiyun 	u16 host_idx;
71*4882a593Smuzhiyun 	u8 h2c_seq; /* h2c seq */
72*4882a593Smuzhiyun };
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun /**
75*4882a593Smuzhiyun  * the category of phl ring
76*4882a593Smuzhiyun  */
77*4882a593Smuzhiyun enum rtw_phl_ring_cat {
78*4882a593Smuzhiyun 	RTW_PHL_RING_CAT_TID0 = 0,
79*4882a593Smuzhiyun 	RTW_PHL_RING_CAT_TID1 = 1,
80*4882a593Smuzhiyun 	RTW_PHL_RING_CAT_TID2 = 2,
81*4882a593Smuzhiyun 	RTW_PHL_RING_CAT_TID3 = 3,
82*4882a593Smuzhiyun 	RTW_PHL_RING_CAT_TID4 = 4,
83*4882a593Smuzhiyun 	RTW_PHL_RING_CAT_TID5 = 5,
84*4882a593Smuzhiyun 	RTW_PHL_RING_CAT_TID6 = 6,
85*4882a593Smuzhiyun 	RTW_PHL_RING_CAT_TID7 = 7,
86*4882a593Smuzhiyun 	RTW_PHL_RING_CAT_MGNT = 8,
87*4882a593Smuzhiyun 	RTW_PHL_RING_CAT_HIQ = 9,
88*4882a593Smuzhiyun 	RTW_PHL_RING_CAT_MAX = 0xff
89*4882a593Smuzhiyun };
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun 
92*4882a593Smuzhiyun /**
93*4882a593Smuzhiyun  * @RTW_PHL_TREQ_TYPE_PHL_UPDATE_TXSC:
94*4882a593Smuzhiyun  *    this is for phl tx shortcut entry to update
95*4882a593Smuzhiyun  * @RTW_PHL_TREQ_TYPE_CORE_TXSC:
96*4882a593Smuzhiyun  *    it means this txreq is a shortcut pkt, so it need a txsc recycle
97*4882a593Smuzhiyun  * @RTW_PHL_TREQ_TYPE_PHL_ADD_TXSC:
98*4882a593Smuzhiyun  *    it means this txreq is a new cache in core layer and also need cache
99*4882a593Smuzhiyun  *    in phl layer
100*4882a593Smuzhiyun */
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun enum rtw_treq_type {
103*4882a593Smuzhiyun #if defined(CONFIG_CORE_TXSC) || defined(CONFIG_PHL_TXSC)
104*4882a593Smuzhiyun 	RTW_PHL_TREQ_TYPE_PHL_UPDATE_TXSC = 0x80,
105*4882a593Smuzhiyun #endif
106*4882a593Smuzhiyun 	RTW_PHL_TREQ_TYPE_NORMAL = 0,
107*4882a593Smuzhiyun 	RTW_PHL_TREQ_TYPE_TEST_PATTERN = 1,
108*4882a593Smuzhiyun #if defined(CONFIG_CORE_TXSC) || defined(CONFIG_PHL_TXSC)
109*4882a593Smuzhiyun 	RTW_PHL_TREQ_TYPE_CORE_TXSC = 2,
110*4882a593Smuzhiyun 	RTW_PHL_TREQ_TYPE_PHL_ADD_TXSC = 3,
111*4882a593Smuzhiyun #endif
112*4882a593Smuzhiyun 	RTW_PHL_TREQ_TYPE_MAX = 0xFF
113*4882a593Smuzhiyun };
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun enum rtw_packet_type {
117*4882a593Smuzhiyun 	RTW_PHL_PKT_TYPE_DATA = 0,
118*4882a593Smuzhiyun 	RTW_PHL_PKT_TYPE_MGNT = 1,
119*4882a593Smuzhiyun 	RTW_PHL_PKT_TYPE_H2C = 2,
120*4882a593Smuzhiyun 	RTW_PHL_PKT_TYPE_CTRL = 3,
121*4882a593Smuzhiyun 	RTW_PHL_PKT_TYPE_FWDL = 4,
122*4882a593Smuzhiyun 	RTW_PHL_PKT_TYPE_MAX = 0xFF
123*4882a593Smuzhiyun };
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun /**
127*4882a593Smuzhiyun   * struct rtw_t_mdata_non_dcpu:
128*4882a593Smuzhiyun   * this settings are only used in non-dcpu mode.
129*4882a593Smuzhiyun   */
130*4882a593Smuzhiyun struct rtw_t_mdata_non_dcpu {
131*4882a593Smuzhiyun 	u8 tbd;
132*4882a593Smuzhiyun };
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun /**
135*4882a593Smuzhiyun   * struct rtw_t_mdata_dcpu:
136*4882a593Smuzhiyun   * this settings are only used in dcpu mode.
137*4882a593Smuzhiyun   */
138*4882a593Smuzhiyun struct rtw_t_mdata_dcpu {
139*4882a593Smuzhiyun 	u8 tbd;
140*4882a593Smuzhiyun };
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun /**
143*4882a593Smuzhiyun  * tx packet descrption
144*4882a593Smuzhiyun  *
145*4882a593Smuzhiyun  * @u: the union separates dpcu mode and non-dpcu mode unique settings
146*4882a593Smuzhiyun  * @mac_priv: the mac private struture only used by HV tool.
147*4882a593Smuzhiyun  *            normal driver won't allocate memory for this pointer.
148*4882a593Smuzhiyun  */
149*4882a593Smuzhiyun struct rtw_t_meta_data {
150*4882a593Smuzhiyun 	/* basic */
151*4882a593Smuzhiyun 	u8 *ta;
152*4882a593Smuzhiyun 	u8 *ra;
153*4882a593Smuzhiyun 	u8 da[6];
154*4882a593Smuzhiyun 	u8 sa[6];
155*4882a593Smuzhiyun 	u8 to_ds;
156*4882a593Smuzhiyun 	u8 from_ds;
157*4882a593Smuzhiyun 	u8 band; /*0 or 1*/
158*4882a593Smuzhiyun 	u8 wmm; /*0 or 1*/
159*4882a593Smuzhiyun 	enum rtw_packet_type type;
160*4882a593Smuzhiyun 	u8 tid;
161*4882a593Smuzhiyun 	u8 bc;
162*4882a593Smuzhiyun 	u8 mc;
163*4882a593Smuzhiyun 	u16 pktlen; /* MAC header length + frame body length */
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun 	u16 macid;
166*4882a593Smuzhiyun 	u8 hal_port;
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun 	/* sequence */
169*4882a593Smuzhiyun 	u8 hw_seq_mode;
170*4882a593Smuzhiyun 	u8 hw_ssn_sel;
171*4882a593Smuzhiyun 	u16 sw_seq;
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 	/* hdr conversion & hw amsdu */
174*4882a593Smuzhiyun 	u8 smh_en;
175*4882a593Smuzhiyun 	u8 hw_amsdu;
176*4882a593Smuzhiyun 	u8 hdr_len;
177*4882a593Smuzhiyun 	u8 wp_offset;
178*4882a593Smuzhiyun 	u8 shcut_camid;
179*4882a593Smuzhiyun 	u8 upd_wlan_hdr;
180*4882a593Smuzhiyun 	u8 reuse_start_num;
181*4882a593Smuzhiyun 	u8 reuse_size;
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 	/* sec */
184*4882a593Smuzhiyun 	u8 hw_sec_iv;
185*4882a593Smuzhiyun 	u8 sw_sec_iv;
186*4882a593Smuzhiyun 	u8 sec_keyid;
187*4882a593Smuzhiyun 	u8 sec_cam_idx;
188*4882a593Smuzhiyun 	u8 sec_hw_enc;
189*4882a593Smuzhiyun 	u8 sec_type;
190*4882a593Smuzhiyun 	u8 force_key_en;
191*4882a593Smuzhiyun 	u8 iv[6];
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun 	/* dma */
194*4882a593Smuzhiyun 	u8 dma_ch;
195*4882a593Smuzhiyun 	u8 wd_page_size;
196*4882a593Smuzhiyun 	u8 wdinfo_en;
197*4882a593Smuzhiyun 	u8 addr_info_num;
198*4882a593Smuzhiyun 	u8 usb_pkt_ofst;
199*4882a593Smuzhiyun 	u8 usb_txagg_num;
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 	/* ampdu */
202*4882a593Smuzhiyun 	u8 ampdu_en;
203*4882a593Smuzhiyun 	u8 max_agg_num;
204*4882a593Smuzhiyun 	u8 bk;
205*4882a593Smuzhiyun 	u8 ampdu_density;
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun 	/* rate */
208*4882a593Smuzhiyun 	u8 data_bw_er;
209*4882a593Smuzhiyun 	u8 f_ldpc;
210*4882a593Smuzhiyun 	u8 f_stbc;
211*4882a593Smuzhiyun 	u8 f_dcm;
212*4882a593Smuzhiyun 	u8 f_er;
213*4882a593Smuzhiyun 	u16 f_rate;
214*4882a593Smuzhiyun 	u8 f_gi_ltf;
215*4882a593Smuzhiyun 	u8 f_bw;
216*4882a593Smuzhiyun 	u8 userate_sel;
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 	/* a ctrl */
219*4882a593Smuzhiyun 	u8 a_ctrl_bqr;
220*4882a593Smuzhiyun 	u8 a_ctrl_uph;
221*4882a593Smuzhiyun 	u8 a_ctrl_bsr;
222*4882a593Smuzhiyun 	u8 a_ctrl_cas;
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 	/* tx cnt & rty rate */
225*4882a593Smuzhiyun 	u8 dis_rts_rate_fb;
226*4882a593Smuzhiyun 	u8 dis_data_rate_fb;
227*4882a593Smuzhiyun 	u16 data_rty_lowest_rate;
228*4882a593Smuzhiyun 	u8 data_tx_cnt_lmt;
229*4882a593Smuzhiyun 	u8 data_tx_cnt_lmt_en;
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun 	/* protection */
232*4882a593Smuzhiyun 	u8 rts_en;
233*4882a593Smuzhiyun 	u8 cts2self;
234*4882a593Smuzhiyun 	u8 rts_cca_mode;
235*4882a593Smuzhiyun 	u8 hw_rts_en;
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	/* misc */
238*4882a593Smuzhiyun 	u8 mbssid;
239*4882a593Smuzhiyun 	u8 nav_use_hdr;
240*4882a593Smuzhiyun 	u8 ack_ch_info;
241*4882a593Smuzhiyun 	u8 life_time_sel;
242*4882a593Smuzhiyun 	u8 no_ack;
243*4882a593Smuzhiyun 	u8 ndpa;
244*4882a593Smuzhiyun 	u8 snd_pkt_sel;
245*4882a593Smuzhiyun 	u8 sifs_tx;
246*4882a593Smuzhiyun 	u8 rtt_en;
247*4882a593Smuzhiyun 	u8 spe_rpt;
248*4882a593Smuzhiyun 	u8 raw;
249*4882a593Smuzhiyun 	u8 sw_define;
250*4882a593Smuzhiyun 
251*4882a593Smuzhiyun 	union {
252*4882a593Smuzhiyun 		struct rtw_t_mdata_non_dcpu non_dcpu;
253*4882a593Smuzhiyun 		struct rtw_t_mdata_dcpu dcpu;
254*4882a593Smuzhiyun 	} u;
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	void *mac_priv;
257*4882a593Smuzhiyun };
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun /**
261*4882a593Smuzhiyun  * packet recv information
262*4882a593Smuzhiyun  */
263*4882a593Smuzhiyun struct rtw_r_meta_data {
264*4882a593Smuzhiyun 	u8 dma_ch;
265*4882a593Smuzhiyun 	u8 hal_port;
266*4882a593Smuzhiyun 	u8 ta[6]; /* Transmitter Address */
267*4882a593Smuzhiyun 	u8 ppdu_cnt_chg;
268*4882a593Smuzhiyun #ifdef CONFIG_PHL_CSUM_OFFLOAD_RX
269*4882a593Smuzhiyun 	u8 chksum_status; /*return mac_chk_rx_tcpip_chksum_ofd,0 is ok ,1 is fail*/
270*4882a593Smuzhiyun #endif
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 	u16 pktlen;		/* DW0 [0:13] */
273*4882a593Smuzhiyun 	u8 shift;		/* DW0 [14:15] */
274*4882a593Smuzhiyun 	u8 wl_hd_iv_len;	/* DW0 [16:21] */
275*4882a593Smuzhiyun 	u8 bb_sel;		/* DW0 [22:22] */
276*4882a593Smuzhiyun 	u8 mac_info_vld;	/* DW0 [23:23] */
277*4882a593Smuzhiyun 	u8 rpkt_type;		/* DW0 [24:27] */
278*4882a593Smuzhiyun 	u8 drv_info_size;	/* DW0 [28:30] */
279*4882a593Smuzhiyun 	u8 long_rxd;		/* DW0 [31:31] */
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun 	u8 ppdu_type;		/* DW1 [0:3] */
282*4882a593Smuzhiyun 	u8 ppdu_cnt;		/* DW1 [4:6] */
283*4882a593Smuzhiyun 	u8 sr_en;		/* DW1 [7:7] */
284*4882a593Smuzhiyun 	u8 user_id;		/* DW1 [8:15] */
285*4882a593Smuzhiyun 	u16 rx_rate;		/* DW1 [16:24] */
286*4882a593Smuzhiyun 	u8 rx_gi_ltf;		/* DW1 [25:27] */
287*4882a593Smuzhiyun 	u8 non_srg_ppdu;	/* DW1 [28:28] */
288*4882a593Smuzhiyun 	u8 inter_ppdu;		/* DW1 [29:29] */
289*4882a593Smuzhiyun 	u8 bw;			/* DW1 [30:31] */
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun 	u32 freerun_cnt;	/* DW2 [0:31] */
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun 	u8 a1_match;		/* DW3 [0:0] */
294*4882a593Smuzhiyun 	u8 sw_dec;		/* DW3 [1:1] */
295*4882a593Smuzhiyun 	u8 hw_dec;		/* DW3 [2:2] */
296*4882a593Smuzhiyun 	u8 ampdu;		/* DW3 [3:3] */
297*4882a593Smuzhiyun 	u8 ampdu_end_pkt;	/* DW3 [4:4] */
298*4882a593Smuzhiyun 	u8 amsdu;		/* DW3 [5:5] */
299*4882a593Smuzhiyun 	u8 amsdu_cut;		/* DW3 [6:6] */
300*4882a593Smuzhiyun 	u8 last_msdu;		/* DW3 [7:7] */
301*4882a593Smuzhiyun 	u8 bypass;		/* DW3 [8:8] */
302*4882a593Smuzhiyun 	u8 crc32;		/* DW3 [9:9] */
303*4882a593Smuzhiyun 	u8 icverr;		/* DW3 [10:10] */
304*4882a593Smuzhiyun 	u8 magic_wake;		/* DW3 [11:11] */
305*4882a593Smuzhiyun 	u8 unicast_wake;	/* DW3 [12:12] */
306*4882a593Smuzhiyun 	u8 pattern_wake;	/* DW3 [13:13] */
307*4882a593Smuzhiyun 	u8 get_ch_info;		/* DW3 [14:15] */
308*4882a593Smuzhiyun 	u8 pattern_idx;		/* DW3 [16:20] */
309*4882a593Smuzhiyun 	u8 target_idc;		/* DW3 [21:23] */
310*4882a593Smuzhiyun 	u8 chksum_ofld_en;	/* DW3 [24:24] */
311*4882a593Smuzhiyun 	u8 with_llc;		/* DW3 [25:25] */
312*4882a593Smuzhiyun 	u8 rx_statistics;	/* DW3 [26:26] */
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun 	u8 frame_type;		/* DW4 [0:1] */
315*4882a593Smuzhiyun 	u8 mc;			/* DW4 [2:2] */
316*4882a593Smuzhiyun 	u8 bc;			/* DW4 [3:3] */
317*4882a593Smuzhiyun 	u8 more_data;		/* DW4 [4:4] */
318*4882a593Smuzhiyun 	u8 more_frag;		/* DW4 [5:5] */
319*4882a593Smuzhiyun 	u8 pwr_bit;		/* DW4 [6:6] */
320*4882a593Smuzhiyun 	u8 qos;			/* DW4 [7:7] */
321*4882a593Smuzhiyun 	u8 tid;			/* DW4 [8:11] */
322*4882a593Smuzhiyun 	u8 eosp;		/* DW4 [12:12] */
323*4882a593Smuzhiyun 	u8 htc;			/* DW4 [13:13] */
324*4882a593Smuzhiyun 	u8 q_null;		/* DW4 [14:14] */
325*4882a593Smuzhiyun 	u16 seq;		/* DW4 [16:27] */
326*4882a593Smuzhiyun 	u8 frag_num;		/* DW4 [28:31] */
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun 	u8 sec_cam_idx;		/* DW5 [0:7] */
329*4882a593Smuzhiyun 	u8 addr_cam;		/* DW5 [8:15] */
330*4882a593Smuzhiyun 	u16 macid;		/* DW5 [16:23] */
331*4882a593Smuzhiyun 	u8 rx_pl_id;		/* DW5 [24:27] */
332*4882a593Smuzhiyun 	u8 addr_cam_vld;	/* DW5 [28:28] */
333*4882a593Smuzhiyun 	u8 addr_fwd_en;		/* DW5 [29:29] */
334*4882a593Smuzhiyun 	u8 rx_pl_match;		/* DW5 [30:30] */
335*4882a593Smuzhiyun 
336*4882a593Smuzhiyun 	u8 mac_addr[6];		/* DW6 [0:31] DW7 [0:15] */
337*4882a593Smuzhiyun 	u8 smart_ant;		/* DW7 [16:16] */
338*4882a593Smuzhiyun 	u8 sec_type;		/* DW7 [17:20] */
339*4882a593Smuzhiyun };
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun /**
343*4882a593Smuzhiyun  * rtw_pkt_buf_list -- store pakcet from upper layer(ex. ndis, kernel, ethernet..)
344*4882a593Smuzhiyun  * @vir_addr: virtual address of this packet
345*4882a593Smuzhiyun  * @phy_addr_l: lower 32-bit physical address of this packet
346*4882a593Smuzhiyun  * @phy_addr_h: higher 32-bit physical address of this packet
347*4882a593Smuzhiyun  * @length: length of this packet
348*4882a593Smuzhiyun  * @type: tbd
349*4882a593Smuzhiyun  */
350*4882a593Smuzhiyun struct rtw_pkt_buf_list {
351*4882a593Smuzhiyun 	u8 *vir_addr;
352*4882a593Smuzhiyun 	u32 phy_addr_l;
353*4882a593Smuzhiyun 	u32 phy_addr_h;
354*4882a593Smuzhiyun 	u16 length;
355*4882a593Smuzhiyun };
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun enum rtw_tx_status {
358*4882a593Smuzhiyun 	TX_STATUS_TX_DONE,
359*4882a593Smuzhiyun 	TX_STATUS_TX_FAIL_REACH_RTY_LMT,
360*4882a593Smuzhiyun 	TX_STATUS_TX_FAIL_LIFETIME_DROP,
361*4882a593Smuzhiyun 	TX_STATUS_TX_FAIL_MACID_DROP,
362*4882a593Smuzhiyun 	TX_STATUS_TX_FAIL_SW_DROP,
363*4882a593Smuzhiyun 	TX_STATUS_TX_FAIL_MAX
364*4882a593Smuzhiyun };
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun #ifdef CONFIG_PHL_TX_DBG
367*4882a593Smuzhiyun typedef
368*4882a593Smuzhiyun void
369*4882a593Smuzhiyun (*CORE_TX_HANDLE_CALLBACK)
370*4882a593Smuzhiyun (
371*4882a593Smuzhiyun 	void *drv_priv,
372*4882a593Smuzhiyun 	void *pctx,
373*4882a593Smuzhiyun 	bool btx_ok
374*4882a593Smuzhiyun );
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun /**
377*4882a593Smuzhiyun  * @en_dbg: if en_dbg = true, phl tx will print tx dbg info for this dbg pkt. set the flag from core layer.
378*4882a593Smuzhiyun  * @tx_dbg_pkt_type: Identification type, define by core layer
379*4882a593Smuzhiyun  * @core_add_tx_t: core layer add tx req to phl time
380*4882a593Smuzhiyun  * @enq_pending_wd_t: phl tx enqueue pending wd page time
381*4882a593Smuzhiyun  * @recycle_wd_t: phl tx handle the wp report and recycle wd time
382*4882a593Smuzhiyun  */
383*4882a593Smuzhiyun struct rtw_tx_dbg {
384*4882a593Smuzhiyun 	bool en_dbg;
385*4882a593Smuzhiyun 	u16 tx_dbg_pkt_type;
386*4882a593Smuzhiyun 	u32 core_add_tx_t;
387*4882a593Smuzhiyun 	u32 enq_pending_wd_t;
388*4882a593Smuzhiyun 	u32 recycle_wd_t;
389*4882a593Smuzhiyun 	CORE_TX_HANDLE_CALLBACK statecb;
390*4882a593Smuzhiyun 	void *pctx;
391*4882a593Smuzhiyun };
392*4882a593Smuzhiyun #endif /* CONFIG_PHL_TX_DBG */
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun /**
395*4882a593Smuzhiyun  * context for tx feedback handler
396*4882a593Smuzhiyun  * @drvpriv: driver private
397*4882a593Smuzhiyun  * @ctx: private context
398*4882a593Smuzhiyun  * @id: module id of this tx packet
399*4882a593Smuzhiyun  * @txsts: detail tx status
400*4882a593Smuzhiyun  * @txfb_cb: tx feedback handler, currently assign by core layer
401*4882a593Smuzhiyun  */
402*4882a593Smuzhiyun struct rtw_txfb_t {
403*4882a593Smuzhiyun 	void *drvpriv;
404*4882a593Smuzhiyun 	void *ctx;
405*4882a593Smuzhiyun 	enum phl_module_id id;
406*4882a593Smuzhiyun 	enum rtw_tx_status txsts;
407*4882a593Smuzhiyun 	void (*txfb_cb)(struct rtw_txfb_t *txfb);
408*4882a593Smuzhiyun };
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun /**
412*4882a593Smuzhiyun  * the xmit request from core layer, store in xmit phl ring
413*4882a593Smuzhiyun  * @list: list
414*4882a593Smuzhiyun  * @os_priv: the private context from core layer
415*4882a593Smuzhiyun  * @mdata: see structure rtw_t_meta_data
416*4882a593Smuzhiyun  * @tx_time: xmit requset tx time, unit in ms
417*4882a593Smuzhiyun  * @shortcut_id: short cut id this packet will use in phl/hal
418*4882a593Smuzhiyun  * @total_len: the total length of pkt_list
419*4882a593Smuzhiyun  * @pkt_cnt: the packet number of pkt_list
420*4882a593Smuzhiyun  * @pkt_list: see structure rtw_pkt_buf_list
421*4882a593Smuzhiyun  * @txfb: tx feedback context
422*4882a593Smuzhiyun  *
423*4882a593Smuzhiyun  * Note, this structure are visible to core, phl and hal layer
424*4882a593Smuzhiyun  */
425*4882a593Smuzhiyun struct rtw_xmit_req {
426*4882a593Smuzhiyun 	_os_list list;
427*4882a593Smuzhiyun 	void *os_priv;
428*4882a593Smuzhiyun 	enum rtw_treq_type treq_type;
429*4882a593Smuzhiyun 	struct rtw_t_meta_data mdata;
430*4882a593Smuzhiyun 	u32 tx_time;
431*4882a593Smuzhiyun 	u8 shortcut_id;
432*4882a593Smuzhiyun 	u32 total_len;
433*4882a593Smuzhiyun 	u8 pkt_cnt;
434*4882a593Smuzhiyun 	u8 *pkt_list;
435*4882a593Smuzhiyun 	struct rtw_txfb_t *txfb;
436*4882a593Smuzhiyun #ifdef CONFIG_PHL_TX_DBG
437*4882a593Smuzhiyun 	struct rtw_tx_dbg tx_dbg;
438*4882a593Smuzhiyun #endif /* CONFIG_PHL_TX_DBG */
439*4882a593Smuzhiyun };
440*4882a593Smuzhiyun 
441*4882a593Smuzhiyun /**
442*4882a593Smuzhiyun  * the recv packet to core layer, store in recv phl ring
443*4882a593Smuzhiyun  * @os_priv: the private context from core layer
444*4882a593Smuzhiyun  * @mdata: see structure rtw_r_meta_data
445*4882a593Smuzhiyun  * @shortcut_id: short cut id this packet will use in phl/hal
446*4882a593Smuzhiyun  * @pkt_cnt: the packet counts of pkt_list
447*4882a593Smuzhiyun  * @rx_role: the role to which the RX packet is targeted
448*4882a593Smuzhiyun  * @tx_sta: the phl sta that sends this packet
449*4882a593Smuzhiyun  * @pkt_list: see structure rtw_pkt_buf_list
450*4882a593Smuzhiyun  *
451*4882a593Smuzhiyun  * Note, this structure are visible to core, phl and hal layer
452*4882a593Smuzhiyun  */
453*4882a593Smuzhiyun struct rtw_recv_pkt {
454*4882a593Smuzhiyun 	void *os_priv;
455*4882a593Smuzhiyun 	struct rtw_r_meta_data mdata;
456*4882a593Smuzhiyun 	u8 shortcut_id;
457*4882a593Smuzhiyun 	u8 pkt_cnt;
458*4882a593Smuzhiyun 	u16 os_netbuf_len;
459*4882a593Smuzhiyun 	struct rtw_wifi_role_t *rx_role;
460*4882a593Smuzhiyun 	struct rtw_phl_stainfo_t *tx_sta;
461*4882a593Smuzhiyun 	struct rtw_pkt_buf_list pkt_list[MAX_RX_BUF_SEG_NUM];
462*4882a593Smuzhiyun 	struct rtw_phl_ppdu_phy_info phy_info;
463*4882a593Smuzhiyun };
464*4882a593Smuzhiyun 
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun /**
467*4882a593Smuzhiyun  * the phl ring which stores XMIT requests can be access by both
468*4882a593Smuzhiyun  * core and phl, and all the requests in this ring have the same TID value
469*4882a593Smuzhiyun  * @tid: the TID value of this phl ring
470*4882a593Smuzhiyun  * @dma_ch: dma channel of this phl ring, query by rtw_hal_tx_chnl_mapping()
471*4882a593Smuzhiyun  * @tx_thres: tx threshold of this phl ring for batch handling tx requests
472*4882a593Smuzhiyun  * @core_idx: record the index of latest entry accessed by core layer
473*4882a593Smuzhiyun  * @phl_idx: record the index of handling done by phl layer
474*4882a593Smuzhiyun  * @phl_next_idx: record the index of latest entry accessed by phl layer
475*4882a593Smuzhiyun  * @entry: store the pointer of requests assigned to this phl ring
476*4882a593Smuzhiyun  */
477*4882a593Smuzhiyun struct rtw_phl_tx_ring {
478*4882a593Smuzhiyun 	u8 tid;
479*4882a593Smuzhiyun 	u8 dma_ch;
480*4882a593Smuzhiyun 	u16 tx_thres;
481*4882a593Smuzhiyun 	u16 core_idx;
482*4882a593Smuzhiyun 	_os_atomic phl_idx;
483*4882a593Smuzhiyun 	_os_atomic phl_next_idx;
484*4882a593Smuzhiyun 	u8 *entry[MAX_PHL_TX_RING_ENTRY_NUM];/* change to dynamic allocation */
485*4882a593Smuzhiyun };
486*4882a593Smuzhiyun 
487*4882a593Smuzhiyun /**
488*4882a593Smuzhiyun  * this structure stores sorted tx rings having frames to tx to the same sta
489*4882a593Smuzhiyun  * it will change everytime _phl_check_tring_list() executed
490*4882a593Smuzhiyun  * @list: link to the next sta which has frames to transmit
491*4882a593Smuzhiyun  * @sleep: true if this macid is under power-saving mode
492*4882a593Smuzhiyun  * @has_mgnt: true if this macid has management frames to transmit
493*4882a593Smuzhiyun  * @has_hiq: true if this macid has hiq frames to transmit
494*4882a593Smuzhiyun  * @sorted_ring: pre-sorted phl ring status list of this macid
495*4882a593Smuzhiyun  */
496*4882a593Smuzhiyun struct phl_tx_plan {
497*4882a593Smuzhiyun 	_os_list list;
498*4882a593Smuzhiyun 	bool sleep;
499*4882a593Smuzhiyun 	bool has_mgnt;
500*4882a593Smuzhiyun 	bool has_hiq;
501*4882a593Smuzhiyun 	_os_list sorted_ring;
502*4882a593Smuzhiyun };
503*4882a593Smuzhiyun 
504*4882a593Smuzhiyun /**
505*4882a593Smuzhiyun  * this phl ring list contains a list of phl TX rings that have the same macid
506*4882a593Smuzhiyun  * and different tid, and it can be access by both core and phl
507*4882a593Smuzhiyun  * @list: link to next phl ring list with other macid
508*4882a593Smuzhiyun  * @macid: the MACID value of this phl ring list
509*4882a593Smuzhiyun  * @band: band of this phl ring list, band idx 0~1
510*4882a593Smuzhiyun  * @wmm: wmm of this phl ring list, wmm idx 0~1
511*4882a593Smuzhiyun  * @port: port of this phl ring list, port idx 0~4
512*4882a593Smuzhiyun  * @mbssid: TODO
513*4882a593Smuzhiyun  * @phl_ring: the phl rings with same macid but different tid, see rtw_phl_tx_ring
514*4882a593Smuzhiyun  * @tx_plan: transmission plan for this macid, decide by _phl_check_tring_list()
515*4882a593Smuzhiyun  */
516*4882a593Smuzhiyun struct rtw_phl_tring_list {
517*4882a593Smuzhiyun 	_os_list list;
518*4882a593Smuzhiyun 	u16 macid;
519*4882a593Smuzhiyun 	u8 band;/*0 or 1*/
520*4882a593Smuzhiyun 	u8 wmm;/*0 or 1*/
521*4882a593Smuzhiyun 	u8 port;
522*4882a593Smuzhiyun 	/*u8 mbssid*/
523*4882a593Smuzhiyun 	struct rtw_phl_tx_ring phl_ring[MAX_PHL_RING_CAT_NUM];/* tid 0~7, 8:mgnt, 9:hiq */
524*4882a593Smuzhiyun 	struct phl_tx_plan tx_plan;
525*4882a593Smuzhiyun };
526*4882a593Smuzhiyun 
527*4882a593Smuzhiyun /**
528*4882a593Smuzhiyun  * this phl RX ring can be access by both core and phl
529*4882a593Smuzhiyun  * @core_idx: record the index of latest entry accessed by core layer
530*4882a593Smuzhiyun  * @phl_idx: record the index of handling done by phl layer
531*4882a593Smuzhiyun  * @entry: store the pointer of requests assigned to this phl ring
532*4882a593Smuzhiyun  */
533*4882a593Smuzhiyun struct rtw_phl_rx_ring {
534*4882a593Smuzhiyun 	_os_atomic core_idx;
535*4882a593Smuzhiyun 	_os_atomic phl_idx;
536*4882a593Smuzhiyun 	struct rtw_recv_pkt *entry[MAX_PHL_RX_RING_ENTRY_NUM];/* change to dynamic allocation */
537*4882a593Smuzhiyun };
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun /**
541*4882a593Smuzhiyun  * the physical address list
542*4882a593Smuzhiyun  */
543*4882a593Smuzhiyun struct rtw_phy_addr_list {
544*4882a593Smuzhiyun 	_os_list list;
545*4882a593Smuzhiyun 	u32 phy_addr_l;
546*4882a593Smuzhiyun 	u32 phy_addr_h;
547*4882a593Smuzhiyun };
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun /**
550*4882a593Smuzhiyun  * the phl pkt tx request from phl layer to hal layer
551*4882a593Smuzhiyun  * @wd_page: the buffer of wd page allocated by phl and filled by hal
552*4882a593Smuzhiyun  * @wd_len: the phl tx shortcut cached wd_page length, if wd_len = 0 means no phl txsc
553*4882a593Smuzhiyun  * @wp_seq: pcie only, wp sequence of this phl packet request
554*4882a593Smuzhiyun  * @tx_req: see struct rtw_xmit_req
555*4882a593Smuzhiyun  *
556*4882a593Smuzhiyun  * Note, this structure should be visible to phl and hal layer (hana_todo)
557*4882a593Smuzhiyun  */
558*4882a593Smuzhiyun struct rtw_phl_pkt_req {
559*4882a593Smuzhiyun 	u8 *wd_page;
560*4882a593Smuzhiyun 	u8 wd_len;
561*4882a593Smuzhiyun 	u16 wp_seq;
562*4882a593Smuzhiyun 	struct rtw_xmit_req *tx_req;
563*4882a593Smuzhiyun };
564*4882a593Smuzhiyun 
565*4882a593Smuzhiyun /*
566*4882a593Smuzhiyun 0000: WIFI packet
567*4882a593Smuzhiyun 0001: PPDU status
568*4882a593Smuzhiyun 0010: channel info
569*4882a593Smuzhiyun 0011: BB scope mode
570*4882a593Smuzhiyun 0100: F2P TX CMD report
571*4882a593Smuzhiyun 0101: SS2FW report
572*4882a593Smuzhiyun 0110: TX report
573*4882a593Smuzhiyun 0111: TX payload release to host
574*4882a593Smuzhiyun 1000: DFS report
575*4882a593Smuzhiyun 1001: TX payload release to WLCPU
576*4882a593Smuzhiyun 1010: C2H packet */
577*4882a593Smuzhiyun enum rtw_rx_type {
578*4882a593Smuzhiyun 	RTW_RX_TYPE_WIFI = 0,
579*4882a593Smuzhiyun 	RTW_RX_TYPE_PPDU_STATUS = 1,
580*4882a593Smuzhiyun 	RTW_RX_TYPE_CHANNEL_INFO = 2,
581*4882a593Smuzhiyun 	RTW_RX_TYPE_TX_RPT = 3,
582*4882a593Smuzhiyun 	RTW_RX_TYPE_TX_WP_RELEASE_HOST = 4,
583*4882a593Smuzhiyun 	RTW_RX_TYPE_DFS_RPT = 5,
584*4882a593Smuzhiyun 	RTW_RX_TYPE_C2H = 6,
585*4882a593Smuzhiyun 	RTW_RX_TYPE_MAX = 0xFF
586*4882a593Smuzhiyun };
587*4882a593Smuzhiyun 
588*4882a593Smuzhiyun struct rtw_phl_rx_pkt {
589*4882a593Smuzhiyun 	_os_list list;
590*4882a593Smuzhiyun 	enum rtw_rx_type type;
591*4882a593Smuzhiyun 	u8 *rxbuf_ptr;
592*4882a593Smuzhiyun 	struct rtw_recv_pkt r;
593*4882a593Smuzhiyun };
594*4882a593Smuzhiyun 
595*4882a593Smuzhiyun 
596*4882a593Smuzhiyun struct rtw_xmit_recycle {
597*4882a593Smuzhiyun 	u16 wp_seq;
598*4882a593Smuzhiyun 	struct rtw_xmit_req *tx_req;
599*4882a593Smuzhiyun };
600*4882a593Smuzhiyun 
601*4882a593Smuzhiyun enum rtw_traffic_dir {
602*4882a593Smuzhiyun 	TRAFFIC_UL = 0, /* Uplink */
603*4882a593Smuzhiyun 	TRAFFIC_DL, /* Downlink */
604*4882a593Smuzhiyun 	TRAFFIC_BALANCE,
605*4882a593Smuzhiyun 	TRAFFIC_MAX
606*4882a593Smuzhiyun };
607*4882a593Smuzhiyun 
608*4882a593Smuzhiyun enum rtw_rx_fltr_mode {
609*4882a593Smuzhiyun 	RX_FLTR_MODE_SNIFFER,		/* 0 */
610*4882a593Smuzhiyun 	RX_FLTR_MODE_SCAN,
611*4882a593Smuzhiyun 	RX_FLTR_MODE_STA_LINKING,
612*4882a593Smuzhiyun 	RX_FLTR_MODE_STA_NORMAL,
613*4882a593Smuzhiyun 	RX_FLTR_MODE_AP_NORMAL,
614*4882a593Smuzhiyun 	RX_FLTR_MODE_RESTORE = 0xFF
615*4882a593Smuzhiyun };
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun #endif	/* __PHL_TRX_DEF_H_ */
618