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