xref: /linux/drivers/net/wireless/realtek/rtlwifi/rtl8192d/trx_common.h (revision a1ff5a7d78a036d6c2178ee5acd6ba4946243800)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright(c) 2009-2012  Realtek Corporation.*/
3 
4 #ifndef __RTL92D_TRX_COMMON_H__
5 #define __RTL92D_TRX_COMMON_H__
6 
7 #define RX_DRV_INFO_SIZE_UNIT			8
8 
9 enum rtl92d_rx_desc_enc {
10 	RX_DESC_ENC_NONE	= 0,
11 	RX_DESC_ENC_WEP40	= 1,
12 	RX_DESC_ENC_TKIP_WO_MIC	= 2,
13 	RX_DESC_ENC_TKIP_MIC	= 3,
14 	RX_DESC_ENC_AES		= 4,
15 	RX_DESC_ENC_WEP104	= 5,
16 };
17 
18 /* macros to read/write various fields in RX or TX descriptors */
19 
set_tx_desc_pkt_size(__le32 * __pdesc,u32 __val)20 static inline void set_tx_desc_pkt_size(__le32 *__pdesc, u32 __val)
21 {
22 	le32p_replace_bits(__pdesc, __val, GENMASK(15, 0));
23 }
24 
set_tx_desc_offset(__le32 * __pdesc,u32 __val)25 static inline void set_tx_desc_offset(__le32 *__pdesc, u32 __val)
26 {
27 	le32p_replace_bits(__pdesc, __val, GENMASK(23, 16));
28 }
29 
set_tx_desc_htc(__le32 * __pdesc,u32 __val)30 static inline void set_tx_desc_htc(__le32 *__pdesc, u32 __val)
31 {
32 	le32p_replace_bits(__pdesc, __val, BIT(25));
33 }
34 
set_tx_desc_last_seg(__le32 * __pdesc,u32 __val)35 static inline void set_tx_desc_last_seg(__le32 *__pdesc, u32 __val)
36 {
37 	le32p_replace_bits(__pdesc, __val, BIT(26));
38 }
39 
set_tx_desc_first_seg(__le32 * __pdesc,u32 __val)40 static inline void set_tx_desc_first_seg(__le32 *__pdesc, u32 __val)
41 {
42 	le32p_replace_bits(__pdesc, __val, BIT(27));
43 }
44 
set_tx_desc_linip(__le32 * __pdesc,u32 __val)45 static inline void set_tx_desc_linip(__le32 *__pdesc, u32 __val)
46 {
47 	le32p_replace_bits(__pdesc, __val, BIT(28));
48 }
49 
set_tx_desc_own(__le32 * __pdesc,u32 __val)50 static inline void set_tx_desc_own(__le32 *__pdesc, u32 __val)
51 {
52 	le32p_replace_bits(__pdesc, __val, BIT(31));
53 }
54 
get_tx_desc_own(__le32 * __pdesc)55 static inline u32 get_tx_desc_own(__le32 *__pdesc)
56 {
57 	return le32_get_bits(*__pdesc, BIT(31));
58 }
59 
set_tx_desc_macid(__le32 * __pdesc,u32 __val)60 static inline void set_tx_desc_macid(__le32 *__pdesc, u32 __val)
61 {
62 	le32p_replace_bits((__pdesc + 1), __val, GENMASK(4, 0));
63 }
64 
set_tx_desc_agg_enable(__le32 * __pdesc,u32 __val)65 static inline void set_tx_desc_agg_enable(__le32 *__pdesc, u32 __val)
66 {
67 	le32p_replace_bits((__pdesc + 1), __val, BIT(5));
68 }
69 
set_tx_desc_rdg_enable(__le32 * __pdesc,u32 __val)70 static inline void set_tx_desc_rdg_enable(__le32 *__pdesc, u32 __val)
71 {
72 	le32p_replace_bits((__pdesc + 1), __val, BIT(7));
73 }
74 
set_tx_desc_queue_sel(__le32 * __pdesc,u32 __val)75 static inline void set_tx_desc_queue_sel(__le32 *__pdesc, u32 __val)
76 {
77 	le32p_replace_bits((__pdesc + 1), __val, GENMASK(12, 8));
78 }
79 
set_tx_desc_rate_id(__le32 * __pdesc,u32 __val)80 static inline void set_tx_desc_rate_id(__le32 *__pdesc, u32 __val)
81 {
82 	le32p_replace_bits((__pdesc + 1), __val, GENMASK(19, 16));
83 }
84 
set_tx_desc_sec_type(__le32 * __pdesc,u32 __val)85 static inline void set_tx_desc_sec_type(__le32 *__pdesc, u32 __val)
86 {
87 	le32p_replace_bits((__pdesc + 1), __val, GENMASK(23, 22));
88 }
89 
set_tx_desc_pkt_offset(__le32 * __pdesc,u32 __val)90 static inline void set_tx_desc_pkt_offset(__le32 *__pdesc, u32 __val)
91 {
92 	le32p_replace_bits((__pdesc + 1), __val, GENMASK(30, 26));
93 }
94 
set_tx_desc_more_frag(__le32 * __pdesc,u32 __val)95 static inline void set_tx_desc_more_frag(__le32 *__pdesc, u32 __val)
96 {
97 	le32p_replace_bits((__pdesc + 2), __val, BIT(17));
98 }
99 
set_tx_desc_ampdu_density(__le32 * __pdesc,u32 __val)100 static inline void set_tx_desc_ampdu_density(__le32 *__pdesc, u32 __val)
101 {
102 	le32p_replace_bits((__pdesc + 2), __val, GENMASK(22, 20));
103 }
104 
set_tx_desc_seq(__le32 * __pdesc,u32 __val)105 static inline void set_tx_desc_seq(__le32 *__pdesc, u32 __val)
106 {
107 	le32p_replace_bits((__pdesc + 3), __val, GENMASK(27, 16));
108 }
109 
set_tx_desc_pkt_id(__le32 * __pdesc,u32 __val)110 static inline void set_tx_desc_pkt_id(__le32 *__pdesc, u32 __val)
111 {
112 	le32p_replace_bits((__pdesc + 3), __val, GENMASK(31, 28));
113 }
114 
set_tx_desc_rts_rate(__le32 * __pdesc,u32 __val)115 static inline void set_tx_desc_rts_rate(__le32 *__pdesc, u32 __val)
116 {
117 	le32p_replace_bits((__pdesc + 4), __val, GENMASK(4, 0));
118 }
119 
set_tx_desc_qos(__le32 * __pdesc,u32 __val)120 static inline void set_tx_desc_qos(__le32 *__pdesc, u32 __val)
121 {
122 	le32p_replace_bits((__pdesc + 4), __val, BIT(6));
123 }
124 
set_tx_desc_hwseq_en(__le32 * __pdesc,u32 __val)125 static inline void set_tx_desc_hwseq_en(__le32 *__pdesc, u32 __val)
126 {
127 	le32p_replace_bits((__pdesc + 4), __val, BIT(7));
128 }
129 
set_tx_desc_use_rate(__le32 * __pdesc,u32 __val)130 static inline void set_tx_desc_use_rate(__le32 *__pdesc, u32 __val)
131 {
132 	le32p_replace_bits((__pdesc + 4), __val, BIT(8));
133 }
134 
set_tx_desc_disable_fb(__le32 * __pdesc,u32 __val)135 static inline void set_tx_desc_disable_fb(__le32 *__pdesc, u32 __val)
136 {
137 	le32p_replace_bits((__pdesc + 4), __val, BIT(10));
138 }
139 
set_tx_desc_cts2self(__le32 * __pdesc,u32 __val)140 static inline void set_tx_desc_cts2self(__le32 *__pdesc, u32 __val)
141 {
142 	le32p_replace_bits((__pdesc + 4), __val, BIT(11));
143 }
144 
set_tx_desc_rts_enable(__le32 * __pdesc,u32 __val)145 static inline void set_tx_desc_rts_enable(__le32 *__pdesc, u32 __val)
146 {
147 	le32p_replace_bits((__pdesc + 4), __val, BIT(12));
148 }
149 
set_tx_desc_hw_rts_enable(__le32 * __pdesc,u32 __val)150 static inline void set_tx_desc_hw_rts_enable(__le32 *__pdesc, u32 __val)
151 {
152 	le32p_replace_bits((__pdesc + 4), __val, BIT(13));
153 }
154 
set_tx_desc_tx_sub_carrier(__le32 * __pdesc,u32 __val)155 static inline void set_tx_desc_tx_sub_carrier(__le32 *__pdesc, u32 __val)
156 {
157 	le32p_replace_bits((__pdesc + 4), __val, GENMASK(21, 20));
158 }
159 
set_tx_desc_data_bw(__le32 * __pdesc,u32 __val)160 static inline void set_tx_desc_data_bw(__le32 *__pdesc, u32 __val)
161 {
162 	le32p_replace_bits((__pdesc + 4), __val, BIT(25));
163 }
164 
set_tx_desc_rts_short(__le32 * __pdesc,u32 __val)165 static inline void set_tx_desc_rts_short(__le32 *__pdesc, u32 __val)
166 {
167 	le32p_replace_bits((__pdesc + 4), __val, BIT(26));
168 }
169 
set_tx_desc_rts_bw(__le32 * __pdesc,u32 __val)170 static inline void set_tx_desc_rts_bw(__le32 *__pdesc, u32 __val)
171 {
172 	le32p_replace_bits((__pdesc + 4), __val, BIT(27));
173 }
174 
set_tx_desc_rts_sc(__le32 * __pdesc,u32 __val)175 static inline void set_tx_desc_rts_sc(__le32 *__pdesc, u32 __val)
176 {
177 	le32p_replace_bits((__pdesc + 4), __val, GENMASK(29, 28));
178 }
179 
set_tx_desc_rts_stbc(__le32 * __pdesc,u32 __val)180 static inline void set_tx_desc_rts_stbc(__le32 *__pdesc, u32 __val)
181 {
182 	le32p_replace_bits((__pdesc + 4), __val, GENMASK(31, 30));
183 }
184 
set_tx_desc_tx_rate(__le32 * __pdesc,u32 __val)185 static inline void set_tx_desc_tx_rate(__le32 *__pdesc, u32 __val)
186 {
187 	le32p_replace_bits((__pdesc + 5), __val, GENMASK(5, 0));
188 }
189 
set_tx_desc_data_shortgi(__le32 * __pdesc,u32 __val)190 static inline void set_tx_desc_data_shortgi(__le32 *__pdesc, u32 __val)
191 {
192 	le32p_replace_bits((__pdesc + 5), __val, BIT(6));
193 }
194 
set_tx_desc_data_rate_fb_limit(__le32 * __pdesc,u32 __val)195 static inline void set_tx_desc_data_rate_fb_limit(__le32 *__pdesc, u32 __val)
196 {
197 	le32p_replace_bits((__pdesc + 5), __val, GENMASK(12, 8));
198 }
199 
set_tx_desc_rts_rate_fb_limit(__le32 * __pdesc,u32 __val)200 static inline void set_tx_desc_rts_rate_fb_limit(__le32 *__pdesc, u32 __val)
201 {
202 	le32p_replace_bits((__pdesc + 5), __val, GENMASK(16, 13));
203 }
204 
set_tx_desc_max_agg_num(__le32 * __pdesc,u32 __val)205 static inline void set_tx_desc_max_agg_num(__le32 *__pdesc, u32 __val)
206 {
207 	le32p_replace_bits((__pdesc + 6), __val, GENMASK(15, 11));
208 }
209 
set_tx_desc_tx_buffer_size(__le32 * __pdesc,u32 __val)210 static inline void set_tx_desc_tx_buffer_size(__le32 *__pdesc, u32 __val)
211 {
212 	le32p_replace_bits((__pdesc + 7), __val, GENMASK(15, 0));
213 }
214 
set_tx_desc_tx_buffer_address(__le32 * __pdesc,u32 __val)215 static inline void set_tx_desc_tx_buffer_address(__le32 *__pdesc, u32 __val)
216 {
217 	*(__pdesc + 8) = cpu_to_le32(__val);
218 }
219 
get_tx_desc_tx_buffer_address(__le32 * __pdesc)220 static inline u32 get_tx_desc_tx_buffer_address(__le32 *__pdesc)
221 {
222 	return le32_to_cpu(*(__pdesc + 8));
223 }
224 
set_tx_desc_next_desc_address(__le32 * __pdesc,u32 __val)225 static inline void set_tx_desc_next_desc_address(__le32 *__pdesc, u32 __val)
226 {
227 	*(__pdesc + 10) = cpu_to_le32(__val);
228 }
229 
get_rx_desc_pkt_len(__le32 * __pdesc)230 static inline u32 get_rx_desc_pkt_len(__le32 *__pdesc)
231 {
232 	return le32_get_bits(*__pdesc, GENMASK(13, 0));
233 }
234 
get_rx_desc_crc32(__le32 * __pdesc)235 static inline u32 get_rx_desc_crc32(__le32 *__pdesc)
236 {
237 	return le32_get_bits(*__pdesc, BIT(14));
238 }
239 
get_rx_desc_icv(__le32 * __pdesc)240 static inline u32 get_rx_desc_icv(__le32 *__pdesc)
241 {
242 	return le32_get_bits(*__pdesc, BIT(15));
243 }
244 
get_rx_desc_drv_info_size(__le32 * __pdesc)245 static inline u32 get_rx_desc_drv_info_size(__le32 *__pdesc)
246 {
247 	return le32_get_bits(*__pdesc, GENMASK(19, 16));
248 }
249 
get_rx_desc_enc_type(__le32 * __pdesc)250 static inline u32 get_rx_desc_enc_type(__le32 *__pdesc)
251 {
252 	return le32_get_bits(*__pdesc, GENMASK(22, 20));
253 }
254 
get_rx_desc_shift(__le32 * __pdesc)255 static inline u32 get_rx_desc_shift(__le32 *__pdesc)
256 {
257 	return le32_get_bits(*__pdesc, GENMASK(25, 24));
258 }
259 
get_rx_desc_physt(__le32 * __pdesc)260 static inline u32 get_rx_desc_physt(__le32 *__pdesc)
261 {
262 	return le32_get_bits(*__pdesc, BIT(26));
263 }
264 
get_rx_desc_swdec(__le32 * __pdesc)265 static inline u32 get_rx_desc_swdec(__le32 *__pdesc)
266 {
267 	return le32_get_bits(*__pdesc, BIT(27));
268 }
269 
get_rx_desc_own(__le32 * __pdesc)270 static inline u32 get_rx_desc_own(__le32 *__pdesc)
271 {
272 	return le32_get_bits(*__pdesc, BIT(31));
273 }
274 
set_rx_desc_pkt_len(__le32 * __pdesc,u32 __val)275 static inline void set_rx_desc_pkt_len(__le32 *__pdesc, u32 __val)
276 {
277 	le32p_replace_bits(__pdesc, __val, GENMASK(13, 0));
278 }
279 
set_rx_desc_eor(__le32 * __pdesc,u32 __val)280 static inline void set_rx_desc_eor(__le32 *__pdesc, u32 __val)
281 {
282 	le32p_replace_bits(__pdesc, __val, BIT(30));
283 }
284 
set_rx_desc_own(__le32 * __pdesc,u32 __val)285 static inline void set_rx_desc_own(__le32 *__pdesc, u32 __val)
286 {
287 	le32p_replace_bits(__pdesc, __val, BIT(31));
288 }
289 
get_rx_desc_paggr(__le32 * __pdesc)290 static inline u32 get_rx_desc_paggr(__le32 *__pdesc)
291 {
292 	return le32_get_bits(*(__pdesc + 1), BIT(14));
293 }
294 
get_rx_desc_faggr(__le32 * __pdesc)295 static inline u32 get_rx_desc_faggr(__le32 *__pdesc)
296 {
297 	return le32_get_bits(*(__pdesc + 1), BIT(15));
298 }
299 
get_rx_desc_rxmcs(__le32 * __pdesc)300 static inline u32 get_rx_desc_rxmcs(__le32 *__pdesc)
301 {
302 	return le32_get_bits(*(__pdesc + 3), GENMASK(5, 0));
303 }
304 
get_rx_desc_rxht(__le32 * __pdesc)305 static inline u32 get_rx_desc_rxht(__le32 *__pdesc)
306 {
307 	return le32_get_bits(*(__pdesc + 3), BIT(6));
308 }
309 
get_rx_desc_splcp(__le32 * __pdesc)310 static inline u32 get_rx_desc_splcp(__le32 *__pdesc)
311 {
312 	return le32_get_bits(*(__pdesc + 3), BIT(8));
313 }
314 
get_rx_desc_bw(__le32 * __pdesc)315 static inline u32 get_rx_desc_bw(__le32 *__pdesc)
316 {
317 	return le32_get_bits(*(__pdesc + 3), BIT(9));
318 }
319 
get_rx_desc_tsfl(__le32 * __pdesc)320 static inline u32 get_rx_desc_tsfl(__le32 *__pdesc)
321 {
322 	return le32_to_cpu(*(__pdesc + 5));
323 }
324 
get_rx_desc_buff_addr(__le32 * __pdesc)325 static inline u32 get_rx_desc_buff_addr(__le32 *__pdesc)
326 {
327 	return le32_to_cpu(*(__pdesc + 6));
328 }
329 
set_rx_desc_buff_addr(__le32 * __pdesc,u32 __val)330 static inline void set_rx_desc_buff_addr(__le32 *__pdesc, u32 __val)
331 {
332 	*(__pdesc + 6) = cpu_to_le32(__val);
333 }
334 
335 /* For 92D early mode */
set_earlymode_pktnum(__le32 * __paddr,u32 __value)336 static inline void set_earlymode_pktnum(__le32 *__paddr, u32 __value)
337 {
338 	le32p_replace_bits(__paddr, __value, GENMASK(2, 0));
339 }
340 
set_earlymode_len0(__le32 * __paddr,u32 __value)341 static inline void set_earlymode_len0(__le32 *__paddr, u32 __value)
342 {
343 	le32p_replace_bits(__paddr, __value, GENMASK(15, 4));
344 }
345 
set_earlymode_len1(__le32 * __paddr,u32 __value)346 static inline void set_earlymode_len1(__le32 *__paddr, u32 __value)
347 {
348 	le32p_replace_bits(__paddr, __value, GENMASK(27, 16));
349 }
350 
set_earlymode_len2_1(__le32 * __paddr,u32 __value)351 static inline void set_earlymode_len2_1(__le32 *__paddr, u32 __value)
352 {
353 	le32p_replace_bits(__paddr, __value, GENMASK(31, 28));
354 }
355 
set_earlymode_len2_2(__le32 * __paddr,u32 __value)356 static inline void set_earlymode_len2_2(__le32 *__paddr, u32 __value)
357 {
358 	le32p_replace_bits((__paddr + 1), __value, GENMASK(7, 0));
359 }
360 
set_earlymode_len3(__le32 * __paddr,u32 __value)361 static inline void set_earlymode_len3(__le32 *__paddr, u32 __value)
362 {
363 	le32p_replace_bits((__paddr + 1), __value, GENMASK(19, 8));
364 }
365 
set_earlymode_len4(__le32 * __paddr,u32 __value)366 static inline void set_earlymode_len4(__le32 *__paddr, u32 __value)
367 {
368 	le32p_replace_bits((__paddr + 1), __value, GENMASK(31, 20));
369 }
370 
371 struct rx_fwinfo_92d {
372 	u8 gain_trsw[4];
373 	u8 pwdb_all;
374 	u8 cfosho[4];
375 	u8 cfotail[4];
376 	s8 rxevm[2];
377 	s8 rxsnr[4];
378 	u8 pdsnr[2];
379 	u8 csi_current[2];
380 	u8 csi_target[2];
381 	u8 sigevm;
382 	u8 max_ex_pwr;
383 #ifdef __LITTLE_ENDIAN
384 	u8 ex_intf_flag:1;
385 	u8 sgi_en:1;
386 	u8 rxsc:2;
387 	u8 reserve:4;
388 #else
389 	u8 reserve:4;
390 	u8 rxsc:2;
391 	u8 sgi_en:1;
392 	u8 ex_intf_flag:1;
393 #endif
394 } __packed;
395 
396 bool rtl92d_rx_query_desc(struct ieee80211_hw *hw,
397 			  struct rtl_stats *stats,
398 			  struct ieee80211_rx_status *rx_status,
399 			  u8 *pdesc, struct sk_buff *skb);
400 void rtl92d_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
401 		     u8 desc_name, u8 *val);
402 u64 rtl92d_get_desc(struct ieee80211_hw *hw,
403 		    u8 *p_desc, bool istx, u8 desc_name);
404 
405 #endif
406