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