xref: /linux/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/trx.h (revision 79790b6818e96c58fe2bffee1b418c16e64e7b80)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright(c) 2009-2012  Realtek Corporation.*/
3 
4 #ifndef __RTL92CU_TRX_H__
5 #define __RTL92CU_TRX_H__
6 
7 #define RTL92C_NUM_RX_URBS			8
8 #define RTL92C_NUM_TX_URBS			32
9 
10 #define RTL92C_SIZE_MAX_RX_BUFFER		15360   /* 8192 */
11 #define RX_DRV_INFO_SIZE_UNIT			8
12 
13 enum usb_rx_agg_mode {
14 	USB_RX_AGG_DISABLE,
15 	USB_RX_AGG_DMA,
16 	USB_RX_AGG_USB,
17 	USB_RX_AGG_DMA_USB
18 };
19 
20 #define TX_SELE_HQ				BIT(0)	/* High Queue */
21 #define TX_SELE_LQ				BIT(1)	/* Low Queue */
22 #define TX_SELE_NQ				BIT(2)	/* Normal Queue */
23 
24 #define RTL_USB_TX_AGG_NUM_DESC			5
25 
26 #define RTL_USB_RX_AGG_PAGE_NUM			4
27 #define RTL_USB_RX_AGG_PAGE_TIMEOUT		3
28 
29 #define RTL_USB_RX_AGG_BLOCK_NUM		5
30 #define RTL_USB_RX_AGG_BLOCK_TIMEOUT		3
31 
32 /*======================== rx status =========================================*/
33 
34 struct rx_drv_info_92c {
35 	/*
36 	 * Driver info contain PHY status and other variabel size info
37 	 * PHY Status content as below
38 	 */
39 
40 	/* DWORD 0 */
41 	u8 gain_trsw[4];
42 
43 	/* DWORD 1 */
44 	u8 pwdb_all;
45 	u8 cfosho[4];
46 
47 	/* DWORD 2 */
48 	u8 cfotail[4];
49 
50 	/* DWORD 3 */
51 	s8 rxevm[2];
52 	s8 rxsnr[4];
53 
54 	/* DWORD 4 */
55 	u8 pdsnr[2];
56 
57 	/* DWORD 5 */
58 	u8 csi_current[2];
59 	u8 csi_target[2];
60 
61 	/* DWORD 6 */
62 	u8 sigevm;
63 	u8 max_ex_pwr;
64 	u8 ex_intf_flag:1;
65 	u8 sgi_en:1;
66 	u8 rxsc:2;
67 	u8 reserve:4;
68 } __packed;
69 
70 /* macros to read various fields in RX descriptor */
71 
72 /* DWORD 0 */
get_rx_desc_pkt_len(__le32 * __rxdesc)73 static inline u32 get_rx_desc_pkt_len(__le32 *__rxdesc)
74 {
75 	return le32_get_bits(*__rxdesc, GENMASK(13, 0));
76 }
77 
get_rx_desc_crc32(__le32 * __rxdesc)78 static inline u32 get_rx_desc_crc32(__le32 *__rxdesc)
79 {
80 	return le32_get_bits(*__rxdesc, BIT(14));
81 }
82 
get_rx_desc_icv(__le32 * __rxdesc)83 static inline u32 get_rx_desc_icv(__le32 *__rxdesc)
84 {
85 	return le32_get_bits(*__rxdesc, BIT(15));
86 }
87 
get_rx_desc_drvinfo_size(__le32 * __rxdesc)88 static inline u32 get_rx_desc_drvinfo_size(__le32 *__rxdesc)
89 {
90 	return le32_get_bits(*__rxdesc, GENMASK(19, 16));
91 }
92 
get_rx_desc_shift(__le32 * __rxdesc)93 static inline u32 get_rx_desc_shift(__le32 *__rxdesc)
94 {
95 	return le32_get_bits(*__rxdesc, GENMASK(25, 24));
96 }
97 
get_rx_desc_phy_status(__le32 * __rxdesc)98 static inline u32 get_rx_desc_phy_status(__le32 *__rxdesc)
99 {
100 	return le32_get_bits(*__rxdesc, BIT(26));
101 }
102 
get_rx_desc_swdec(__le32 * __rxdesc)103 static inline u32 get_rx_desc_swdec(__le32 *__rxdesc)
104 {
105 	return le32_get_bits(*__rxdesc, BIT(27));
106 }
107 
108 
109 /* DWORD 1 */
get_rx_desc_paggr(__le32 * __rxdesc)110 static inline u32 get_rx_desc_paggr(__le32 *__rxdesc)
111 {
112 	return le32_get_bits(*(__rxdesc + 1), BIT(14));
113 }
114 
get_rx_desc_faggr(__le32 * __rxdesc)115 static inline u32 get_rx_desc_faggr(__le32 *__rxdesc)
116 {
117 	return le32_get_bits(*(__rxdesc + 1), BIT(15));
118 }
119 
120 
121 /* DWORD 3 */
get_rx_desc_rx_mcs(__le32 * __rxdesc)122 static inline u32 get_rx_desc_rx_mcs(__le32 *__rxdesc)
123 {
124 	return le32_get_bits(*(__rxdesc + 3), GENMASK(5, 0));
125 }
126 
get_rx_desc_rx_ht(__le32 * __rxdesc)127 static inline u32 get_rx_desc_rx_ht(__le32 *__rxdesc)
128 {
129 	return le32_get_bits(*(__rxdesc + 3), BIT(6));
130 }
131 
get_rx_desc_splcp(__le32 * __rxdesc)132 static inline u32 get_rx_desc_splcp(__le32 *__rxdesc)
133 {
134 	return le32_get_bits(*(__rxdesc + 3), BIT(8));
135 }
136 
get_rx_desc_bw(__le32 * __rxdesc)137 static inline u32 get_rx_desc_bw(__le32 *__rxdesc)
138 {
139 	return le32_get_bits(*(__rxdesc + 3), BIT(9));
140 }
141 
142 
143 /* DWORD 5 */
get_rx_desc_tsfl(__le32 * __rxdesc)144 static inline u32 get_rx_desc_tsfl(__le32 *__rxdesc)
145 {
146 	return le32_to_cpu(*((__rxdesc + 5)));
147 }
148 
149 
150 /*======================= tx desc ============================================*/
151 
152 /* macros to set various fields in TX descriptor */
153 
154 /* Dword 0 */
set_tx_desc_pkt_size(__le32 * __txdesc,u32 __value)155 static inline void set_tx_desc_pkt_size(__le32 *__txdesc, u32 __value)
156 {
157 	le32p_replace_bits(__txdesc, __value, GENMASK(15, 0));
158 }
159 
set_tx_desc_offset(__le32 * __txdesc,u32 __value)160 static inline void set_tx_desc_offset(__le32 *__txdesc, u32 __value)
161 {
162 	le32p_replace_bits(__txdesc, __value, GENMASK(23, 16));
163 }
164 
set_tx_desc_bmc(__le32 * __txdesc,u32 __value)165 static inline void set_tx_desc_bmc(__le32 *__txdesc, u32 __value)
166 {
167 	le32p_replace_bits(__txdesc, __value, BIT(24));
168 }
169 
set_tx_desc_htc(__le32 * __txdesc,u32 __value)170 static inline void set_tx_desc_htc(__le32 *__txdesc, u32 __value)
171 {
172 	le32p_replace_bits(__txdesc, __value, BIT(25));
173 }
174 
set_tx_desc_last_seg(__le32 * __txdesc,u32 __value)175 static inline void set_tx_desc_last_seg(__le32 *__txdesc, u32 __value)
176 {
177 	le32p_replace_bits(__txdesc, __value, BIT(26));
178 }
179 
set_tx_desc_first_seg(__le32 * __txdesc,u32 __value)180 static inline void set_tx_desc_first_seg(__le32 *__txdesc, u32 __value)
181 {
182 	le32p_replace_bits(__txdesc, __value, BIT(27));
183 }
184 
set_tx_desc_linip(__le32 * __txdesc,u32 __value)185 static inline void set_tx_desc_linip(__le32 *__txdesc, u32 __value)
186 {
187 	le32p_replace_bits(__txdesc, __value, BIT(28));
188 }
189 
set_tx_desc_own(__le32 * __txdesc,u32 __value)190 static inline void set_tx_desc_own(__le32 *__txdesc, u32 __value)
191 {
192 	le32p_replace_bits(__txdesc, __value, BIT(31));
193 }
194 
195 
196 /* Dword 1 */
set_tx_desc_macid(__le32 * __txdesc,u32 __value)197 static inline void set_tx_desc_macid(__le32 *__txdesc, u32 __value)
198 {
199 	le32p_replace_bits((__txdesc + 1), __value, GENMASK(4, 0));
200 }
201 
set_tx_desc_agg_enable(__le32 * __txdesc,u32 __value)202 static inline void set_tx_desc_agg_enable(__le32 *__txdesc, u32 __value)
203 {
204 	le32p_replace_bits((__txdesc + 1), __value, BIT(5));
205 }
206 
set_tx_desc_agg_break(__le32 * __txdesc,u32 __value)207 static inline void set_tx_desc_agg_break(__le32 *__txdesc, u32 __value)
208 {
209 	le32p_replace_bits((__txdesc + 1), __value, BIT(6));
210 }
211 
set_tx_desc_rdg_enable(__le32 * __txdesc,u32 __value)212 static inline void set_tx_desc_rdg_enable(__le32 *__txdesc, u32 __value)
213 {
214 	le32p_replace_bits((__txdesc + 1), __value, BIT(7));
215 }
216 
set_tx_desc_queue_sel(__le32 * __txdesc,u32 __value)217 static inline void set_tx_desc_queue_sel(__le32 *__txdesc, u32 __value)
218 {
219 	le32p_replace_bits((__txdesc + 1), __value, GENMASK(12, 8));
220 }
221 
set_tx_desc_rate_id(__le32 * __txdesc,u32 __value)222 static inline void set_tx_desc_rate_id(__le32 *__txdesc, u32 __value)
223 {
224 	le32p_replace_bits((__txdesc + 1), __value, GENMASK(19, 16));
225 }
226 
set_tx_desc_nav_use_hdr(__le32 * __txdesc,u32 __value)227 static inline void set_tx_desc_nav_use_hdr(__le32 *__txdesc, u32 __value)
228 {
229 	le32p_replace_bits((__txdesc + 1), __value, BIT(20));
230 }
231 
set_tx_desc_sec_type(__le32 * __txdesc,u32 __value)232 static inline void set_tx_desc_sec_type(__le32 *__txdesc, u32 __value)
233 {
234 	le32p_replace_bits((__txdesc + 1), __value, GENMASK(23, 22));
235 }
236 
set_tx_desc_pkt_offset(__le32 * __txdesc,u32 __value)237 static inline void set_tx_desc_pkt_offset(__le32 *__txdesc, u32 __value)
238 {
239 	le32p_replace_bits((__txdesc + 1), __value, GENMASK(30, 26));
240 }
241 
242 
243 /* Dword 2 */
set_tx_desc_more_frag(__le32 * __txdesc,u32 __value)244 static inline void set_tx_desc_more_frag(__le32 *__txdesc, u32 __value)
245 {
246 	le32p_replace_bits((__txdesc + 2), __value, BIT(17));
247 }
248 
set_tx_desc_ampdu_density(__le32 * __txdesc,u32 __value)249 static inline void set_tx_desc_ampdu_density(__le32 *__txdesc, u32 __value)
250 {
251 	le32p_replace_bits((__txdesc + 2), __value, GENMASK(22, 20));
252 }
253 
254 
255 /* Dword 3 */
set_tx_desc_seq(__le32 * __txdesc,u32 __value)256 static inline void set_tx_desc_seq(__le32 *__txdesc, u32 __value)
257 {
258 	le32p_replace_bits((__txdesc + 3), __value, GENMASK(27, 16));
259 }
260 
set_tx_desc_pkt_id(__le32 * __txdesc,u32 __value)261 static inline void set_tx_desc_pkt_id(__le32 *__txdesc, u32 __value)
262 {
263 	le32p_replace_bits((__txdesc + 3), __value, GENMASK(31, 28));
264 }
265 
266 
267 /* Dword 4 */
set_tx_desc_rts_rate(__le32 * __txdesc,u32 __value)268 static inline void set_tx_desc_rts_rate(__le32 *__txdesc, u32 __value)
269 {
270 	le32p_replace_bits((__txdesc + 4), __value, GENMASK(4, 0));
271 }
272 
set_tx_desc_qos(__le32 * __txdesc,u32 __value)273 static inline void set_tx_desc_qos(__le32 *__txdesc, u32 __value)
274 {
275 	le32p_replace_bits((__txdesc + 4), __value, BIT(6));
276 }
277 
set_tx_desc_hwseq_en(__le32 * __txdesc,u32 __value)278 static inline void set_tx_desc_hwseq_en(__le32 *__txdesc, u32 __value)
279 {
280 	le32p_replace_bits((__txdesc + 4), __value, BIT(7));
281 }
282 
set_tx_desc_use_rate(__le32 * __txdesc,u32 __value)283 static inline void set_tx_desc_use_rate(__le32 *__txdesc, u32 __value)
284 {
285 	le32p_replace_bits((__txdesc + 4), __value, BIT(8));
286 }
287 
set_tx_desc_disable_fb(__le32 * __txdesc,u32 __value)288 static inline void set_tx_desc_disable_fb(__le32 *__txdesc, u32 __value)
289 {
290 	le32p_replace_bits((__txdesc + 4), __value, BIT(10));
291 }
292 
set_tx_desc_cts2self(__le32 * __txdesc,u32 __value)293 static inline void set_tx_desc_cts2self(__le32 *__txdesc, u32 __value)
294 {
295 	le32p_replace_bits((__txdesc + 4), __value, BIT(11));
296 }
297 
set_tx_desc_rts_enable(__le32 * __txdesc,u32 __value)298 static inline void set_tx_desc_rts_enable(__le32 *__txdesc, u32 __value)
299 {
300 	le32p_replace_bits((__txdesc + 4), __value, BIT(12));
301 }
302 
set_tx_desc_hw_rts_enable(__le32 * __txdesc,u32 __value)303 static inline void set_tx_desc_hw_rts_enable(__le32 *__txdesc, u32 __value)
304 {
305 	le32p_replace_bits((__txdesc + 4), __value, BIT(13));
306 }
307 
set_tx_desc_data_sc(__le32 * __txdesc,u32 __value)308 static inline void set_tx_desc_data_sc(__le32 *__txdesc, u32 __value)
309 {
310 	le32p_replace_bits((__txdesc + 4), __value, GENMASK(21, 20));
311 }
312 
set_tx_desc_data_bw(__le32 * __txdesc,u32 __value)313 static inline void set_tx_desc_data_bw(__le32 *__txdesc, u32 __value)
314 {
315 	le32p_replace_bits((__txdesc + 4), __value, BIT(25));
316 }
317 
set_tx_desc_rts_short(__le32 * __txdesc,u32 __value)318 static inline void set_tx_desc_rts_short(__le32 *__txdesc, u32 __value)
319 {
320 	le32p_replace_bits((__txdesc + 4), __value, BIT(26));
321 }
322 
set_tx_desc_rts_bw(__le32 * __txdesc,u32 __value)323 static inline void set_tx_desc_rts_bw(__le32 *__txdesc, u32 __value)
324 {
325 	le32p_replace_bits((__txdesc + 4), __value, BIT(27));
326 }
327 
set_tx_desc_rts_sc(__le32 * __txdesc,u32 __value)328 static inline void set_tx_desc_rts_sc(__le32 *__txdesc, u32 __value)
329 {
330 	le32p_replace_bits((__txdesc + 4), __value, GENMASK(29, 28));
331 }
332 
set_tx_desc_rts_stbc(__le32 * __txdesc,u32 __value)333 static inline void set_tx_desc_rts_stbc(__le32 *__txdesc, u32 __value)
334 {
335 	le32p_replace_bits((__txdesc + 4), __value, GENMASK(31, 30));
336 }
337 
338 
339 /* Dword 5 */
set_tx_desc_tx_rate(__le32 * __pdesc,u32 __val)340 static inline void set_tx_desc_tx_rate(__le32 *__pdesc, u32 __val)
341 {
342 	le32p_replace_bits((__pdesc + 5), __val, GENMASK(5, 0));
343 }
344 
set_tx_desc_data_shortgi(__le32 * __pdesc,u32 __val)345 static inline void set_tx_desc_data_shortgi(__le32 *__pdesc, u32 __val)
346 {
347 	le32p_replace_bits((__pdesc + 5), __val, BIT(6));
348 }
349 
set_tx_desc_data_rate_fb_limit(__le32 * __txdesc,u32 __value)350 static inline void set_tx_desc_data_rate_fb_limit(__le32 *__txdesc, u32 __value)
351 {
352 	le32p_replace_bits((__txdesc + 5), __value, GENMASK(12, 8));
353 }
354 
set_tx_desc_rts_rate_fb_limit(__le32 * __txdesc,u32 __value)355 static inline void set_tx_desc_rts_rate_fb_limit(__le32 *__txdesc, u32 __value)
356 {
357 	le32p_replace_bits((__txdesc + 5), __value, GENMASK(16, 13));
358 }
359 
360 
361 /* Dword 6 */
set_tx_desc_max_agg_num(__le32 * __txdesc,u32 __value)362 static inline void set_tx_desc_max_agg_num(__le32 *__txdesc, u32 __value)
363 {
364 	le32p_replace_bits((__txdesc + 6), __value, GENMASK(15, 11));
365 }
366 
367 
368 /* Dword 7 */
set_tx_desc_tx_desc_checksum(__le32 * __txdesc,u32 __value)369 static inline void set_tx_desc_tx_desc_checksum(__le32 *__txdesc, u32 __value)
370 {
371 	le32p_replace_bits((__txdesc + 7), __value, GENMASK(15, 0));
372 }
373 
374 
375 int  rtl8192cu_endpoint_mapping(struct ieee80211_hw *hw);
376 u16 rtl8192cu_mq_to_hwq(__le16 fc, u16 mac80211_queue_index);
377 bool rtl92cu_rx_query_desc(struct ieee80211_hw *hw,
378 			   struct rtl_stats *stats,
379 			   struct ieee80211_rx_status *rx_status,
380 			   u8 *p_desc, struct sk_buff *skb);
381 void  rtl8192cu_rx_hdl(struct ieee80211_hw *hw, struct sk_buff * skb);
382 void rtl8192c_tx_cleanup(struct ieee80211_hw *hw, struct sk_buff  *skb);
383 int rtl8192c_tx_post_hdl(struct ieee80211_hw *hw, struct urb *urb,
384 			 struct sk_buff *skb);
385 struct sk_buff *rtl8192c_tx_aggregate_hdl(struct ieee80211_hw *,
386 					   struct sk_buff_head *);
387 void rtl92cu_tx_fill_desc(struct ieee80211_hw *hw,
388 			  struct ieee80211_hdr *hdr, u8 *pdesc_tx,
389 			  u8 *pbd_desc_tx, struct ieee80211_tx_info *info,
390 			  struct ieee80211_sta *sta,
391 			  struct sk_buff *skb,
392 			  u8 queue_index,
393 			  struct rtl_tcb_desc *tcb_desc);
394 void rtl92cu_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
395 			     struct sk_buff *skb);
396 
397 #endif
398