5ff1000b240032ce9bb434c3eba687e2096ccef9
[linux-2.6-microblaze.git] / drivers / net / wireless / realtek / rtlwifi / rtl8192de / trx.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright(c) 2009-2012  Realtek Corporation.*/
3
4 #ifndef __RTL92DE_TRX_H__
5 #define __RTL92DE_TRX_H__
6
7 #define TX_DESC_SIZE                            64
8 #define TX_DESC_AGGR_SUBFRAME_SIZE              32
9
10 #define RX_DESC_SIZE                            32
11 #define RX_DRV_INFO_SIZE_UNIT                   8
12
13 #define TX_DESC_NEXT_DESC_OFFSET                40
14 #define USB_HWDESC_HEADER_LEN                   32
15 #define CRCLENGTH                               4
16
17 /* macros to read/write various fields in RX or TX descriptors */
18
19 #define SET_TX_DESC_PKT_SIZE(__pdesc, __val)            \
20         le32p_replace_bits((__le32 *)__pdesc, __val, GENMASK(15, 0))
21 #define SET_TX_DESC_OFFSET(__pdesc, __val)              \
22         le32p_replace_bits((__le32 *)__pdesc, __val, GENMASK(23, 16))
23 #define SET_TX_DESC_HTC(__pdesc, __val)                 \
24         le32p_replace_bits((__le32 *)__pdesc, __val, BIT(25))
25 #define SET_TX_DESC_LAST_SEG(__pdesc, __val)            \
26         le32p_replace_bits((__le32 *)__pdesc, __val, BIT(26))
27 #define SET_TX_DESC_FIRST_SEG(__pdesc, __val)           \
28         le32p_replace_bits((__le32 *)__pdesc, __val, BIT(27))
29 #define SET_TX_DESC_LINIP(__pdesc, __val)               \
30         le32p_replace_bits((__le32 *)__pdesc, __val, BIT(28))
31 #define SET_TX_DESC_OWN(__pdesc, __val)                 \
32         le32p_replace_bits((__le32 *)__pdesc, __val, BIT(31))
33
34 #define GET_TX_DESC_OWN(__pdesc)                        \
35         le32_get_bits(*(__le32 *)__pdesc, BIT(31))
36
37 #define SET_TX_DESC_MACID(__pdesc, __val)               \
38         le32p_replace_bits((__le32 *)(__pdesc + 4), __val, GENMASK(4, 0))
39 #define SET_TX_DESC_AGG_ENABLE(__pdesc, __val)          \
40         le32p_replace_bits((__le32 *)(__pdesc + 4), __val, BIT(5))
41 #define SET_TX_DESC_RDG_ENABLE(__pdesc, __val)          \
42         le32p_replace_bits((__le32 *)(__pdesc + 4), __val, BIT(7))
43 #define SET_TX_DESC_QUEUE_SEL(__pdesc, __val)           \
44         le32p_replace_bits((__le32 *)(__pdesc + 4), __val, GENMASK(12, 8))
45 #define SET_TX_DESC_RATE_ID(__pdesc, __val)             \
46         le32p_replace_bits((__le32 *)(__pdesc + 4), __val, GENMASK(19, 16))
47 #define SET_TX_DESC_SEC_TYPE(__pdesc, __val)            \
48         le32p_replace_bits((__le32 *)(__pdesc + 4), __val, GENMASK(23, 22))
49 #define SET_TX_DESC_PKT_OFFSET(__pdesc, __val)          \
50         le32p_replace_bits((__le32 *)(__pdesc + 4), __val, GENMASK(30, 26))
51
52 #define SET_TX_DESC_MORE_FRAG(__pdesc, __val)           \
53         le32p_replace_bits((__le32 *)(__pdesc + 8), __val, BIT(17))
54 #define SET_TX_DESC_AMPDU_DENSITY(__pdesc, __val)       \
55         le32p_replace_bits((__le32 *)(__pdesc + 8), __val, GENMASK(22, 20))
56
57 #define SET_TX_DESC_SEQ(__pdesc, __val)                 \
58         le32p_replace_bits((__le32 *)(__pdesc + 12), __val, GENMASK(27, 16))
59 #define SET_TX_DESC_PKT_ID(__pdesc, __val)              \
60         le32p_replace_bits((__le32 *)(__pdesc + 12), __val, GENMASK(31, 28))
61
62 #define SET_TX_DESC_RTS_RATE(__pdesc, __val)            \
63         le32p_replace_bits((__le32 *)(__pdesc + 16), __val, GENMASK(4, 0))
64 #define SET_TX_DESC_QOS(__pdesc, __val)                 \
65         le32p_replace_bits((__le32 *)(__pdesc + 16), __val, BIT(6))
66 #define SET_TX_DESC_HWSEQ_EN(__pdesc, __val)            \
67         le32p_replace_bits((__le32 *)(__pdesc + 16), __val, BIT(7))
68 #define SET_TX_DESC_USE_RATE(__pdesc, __val)            \
69         le32p_replace_bits((__le32 *)(__pdesc + 16), __val, BIT(8))
70 #define SET_TX_DESC_DISABLE_FB(__pdesc, __val)          \
71         le32p_replace_bits((__le32 *)(__pdesc + 16), __val, BIT(10))
72 #define SET_TX_DESC_CTS2SELF(__pdesc, __val)            \
73         le32p_replace_bits((__le32 *)(__pdesc + 16), __val, BIT(11))
74 #define SET_TX_DESC_RTS_ENABLE(__pdesc, __val)          \
75         le32p_replace_bits((__le32 *)(__pdesc + 16), __val, BIT(12))
76 #define SET_TX_DESC_HW_RTS_ENABLE(__pdesc, __val)       \
77         le32p_replace_bits((__le32 *)(__pdesc + 16), __val, BIT(13))
78 #define SET_TX_DESC_TX_SUB_CARRIER(__pdesc, __val)      \
79         le32p_replace_bits((__le32 *)(__pdesc + 16), __val, GENMASK(21, 20))
80 #define SET_TX_DESC_DATA_BW(__pdesc, __val)             \
81         le32p_replace_bits((__le32 *)(__pdesc + 16), __val, BIT(25))
82 #define SET_TX_DESC_RTS_SHORT(__pdesc, __val)           \
83         le32p_replace_bits((__le32 *)(__pdesc + 16), __val, BIT(26))
84 #define SET_TX_DESC_RTS_BW(__pdesc, __val)              \
85         le32p_replace_bits((__le32 *)(__pdesc + 16), __val, BIT(27))
86 #define SET_TX_DESC_RTS_SC(__pdesc, __val)              \
87         le32p_replace_bits((__le32 *)(__pdesc + 16), __val, GENMASK(29, 28))
88 #define SET_TX_DESC_RTS_STBC(__pdesc, __val)            \
89         le32p_replace_bits((__le32 *)(__pdesc + 16), __val, GENMASK(31, 30))
90
91 #define SET_TX_DESC_TX_RATE(__pdesc, __val)             \
92         le32p_replace_bits((__le32 *)(__pdesc + 20), __val, GENMASK(5, 0))
93 #define SET_TX_DESC_DATA_SHORTGI(__pdesc, __val)        \
94         le32p_replace_bits((__le32 *)(__pdesc + 20), __val, BIT(6))
95 #define SET_TX_DESC_DATA_RATE_FB_LIMIT(__pdesc, __val)  \
96         le32p_replace_bits((__le32 *)(__pdesc + 20), __val, GENMASK(12, 8))
97 #define SET_TX_DESC_RTS_RATE_FB_LIMIT(__pdesc, __val)   \
98         le32p_replace_bits((__le32 *)(__pdesc + 20), __val, GENMASK(16, 13))
99
100 #define SET_TX_DESC_MAX_AGG_NUM(__pdesc, __val)         \
101         le32p_replace_bits((__le32 *)(__pdesc + 24), __val, GENMASK(15, 11))
102
103 #define SET_TX_DESC_TX_BUFFER_SIZE(__pdesc, __val)      \
104         le32p_replace_bits((__le32 *)(__pdesc + 28), __val, GENMASK(15, 0))
105
106 #define SET_TX_DESC_TX_BUFFER_ADDRESS(__pdesc, __val)   \
107         *(__le32 *)(__pdesc + 32) = cpu_to_le32(__val)
108
109 #define GET_TX_DESC_TX_BUFFER_ADDRESS(__pdesc)          \
110         le32_to_cpu(*(__le32 *)(__pdesc + 32))
111
112 #define SET_TX_DESC_NEXT_DESC_ADDRESS(__pdesc, __val)   \
113         *(__le32 *)(__pdesc + 40) = cpu_to_le32(__val)
114
115 #define GET_RX_DESC_PKT_LEN(__pdesc)                    \
116         le32_get_bits(*(__le32 *)__pdesc, GENMASK(13, 0))
117 #define GET_RX_DESC_CRC32(__pdesc)                      \
118         le32_get_bits(*(__le32 *)__pdesc, BIT(14))
119 #define GET_RX_DESC_ICV(__pdesc)                        \
120         le32_get_bits(*(__le32 *)__pdesc, BIT(15))
121 #define GET_RX_DESC_DRV_INFO_SIZE(__pdesc)              \
122         le32_get_bits(*(__le32 *)__pdesc, GENMASK(19, 16))
123 #define GET_RX_DESC_SHIFT(__pdesc)                      \
124         le32_get_bits(*(__le32 *)__pdesc, GENMASK(25, 24))
125 #define GET_RX_DESC_PHYST(__pdesc)                      \
126         le32_get_bits(*(__le32 *)__pdesc, BIT(26))
127 #define GET_RX_DESC_SWDEC(__pdesc)                      \
128         le32_get_bits(*(__le32 *)__pdesc, BIT(27))
129 #define GET_RX_DESC_OWN(__pdesc)                        \
130         le32_get_bits(*(__le32 *)__pdesc, BIT(31))
131
132 #define SET_RX_DESC_PKT_LEN(__pdesc, __val)             \
133         le32p_replace_bits((__le32 *)__pdesc, __val, GENMASK(13, 0))
134 #define SET_RX_DESC_EOR(__pdesc, __val)                 \
135         le32p_replace_bits((__le32 *)__pdesc, __val, BIT(30))
136 #define SET_RX_DESC_OWN(__pdesc, __val)                 \
137         le32p_replace_bits((__le32 *)__pdesc, __val, BIT(31))
138
139 #define GET_RX_DESC_PAGGR(__pdesc)                      \
140         le32_get_bits(*(__le32 *)(__pdesc + 4), BIT(14))
141 #define GET_RX_DESC_FAGGR(__pdesc)                      \
142         le32_get_bits(*(__le32 *)(__pdesc + 4), BIT(15))
143
144 #define GET_RX_DESC_RXMCS(__pdesc)                      \
145         le32_get_bits(*(__le32 *)(__pdesc + 12), GENMASK(5, 0))
146 #define GET_RX_DESC_RXHT(__pdesc)                       \
147         le32_get_bits(*(__le32 *)(__pdesc + 12), BIT(6))
148 #define GET_RX_DESC_SPLCP(__pdesc)                      \
149         le32_get_bits(*(__le32 *)(__pdesc + 12), BIT(8))
150 #define GET_RX_DESC_BW(__pdesc)                         \
151         le32_get_bits(*(__le32 *)(__pdesc + 12), BIT(9))
152
153 #define GET_RX_DESC_TSFL(__pdesc)                       \
154         le32_to_cpu(*(__le32 *)(__pdesc + 20))
155
156 #define GET_RX_DESC_BUFF_ADDR(__pdesc)                  \
157         le32_to_cpu(*(__le32 *)(__pdesc + 24))
158 #define SET_RX_DESC_BUFF_ADDR(__pdesc, __val)           \
159         *(__le32 *)(__pdesc + 24) = cpu_to_le32(__val)
160
161 #define CLEAR_PCI_TX_DESC_CONTENT(__pdesc, _size)       \
162         memset((void *)__pdesc, 0,                      \
163                min_t(size_t, _size, TX_DESC_NEXT_DESC_OFFSET))
164
165 /* For 92D early mode */
166 #define SET_EARLYMODE_PKTNUM(__paddr, __value)          \
167         le32p_replace_bits((__le32 *)__paddr, __value, GENMASK(2, 0))
168 #define SET_EARLYMODE_LEN0(__paddr, __value)            \
169         le32p_replace_bits((__le32 *)__paddr, __value, GENMASK(15, 4))
170 #define SET_EARLYMODE_LEN1(__paddr, __value)            \
171         le32p_replace_bits((__le32 *)__paddr, __value, GENMASK(27, 16))
172 #define SET_EARLYMODE_LEN2_1(__paddr, __value)          \
173         le32p_replace_bits((__le32 *)__paddr, __value, GENMASK(31, 28))
174 #define SET_EARLYMODE_LEN2_2(__paddr, __value)          \
175         le32p_replace_bits((__le32 *)(__paddr + 4), __value, GENMASK(7, 0))
176 #define SET_EARLYMODE_LEN3(__paddr, __value)            \
177         le32p_replace_bits((__le32 *)(__paddr + 4), __value, GENMASK(19, 8))
178 #define SET_EARLYMODE_LEN4(__paddr, __value)            \
179         le32p_replace_bits((__le32 *)(__paddr + 4), __value, GENMASK(31, 20))
180
181 struct rx_fwinfo_92d {
182         u8 gain_trsw[4];
183         u8 pwdb_all;
184         u8 cfosho[4];
185         u8 cfotail[4];
186         s8 rxevm[2];
187         s8 rxsnr[4];
188         u8 pdsnr[2];
189         u8 csi_current[2];
190         u8 csi_target[2];
191         u8 sigevm;
192         u8 max_ex_pwr;
193         u8 ex_intf_flag:1;
194         u8 sgi_en:1;
195         u8 rxsc:2;
196         u8 reserve:4;
197 } __packed;
198
199 struct tx_desc_92d {
200         u32 pktsize:16;
201         u32 offset:8;
202         u32 bmc:1;
203         u32 htc:1;
204         u32 lastseg:1;
205         u32 firstseg:1;
206         u32 linip:1;
207         u32 noacm:1;
208         u32 gf:1;
209         u32 own:1;
210
211         u32 macid:5;
212         u32 agg_en:1;
213         u32 bk:1;
214         u32 rdg_en:1;
215         u32 queuesel:5;
216         u32 rd_nav_ext:1;
217         u32 lsig_txop_en:1;
218         u32 pifs:1;
219         u32 rateid:4;
220         u32 nav_usehdr:1;
221         u32 en_descid:1;
222         u32 sectype:2;
223         u32 pktoffset:8;
224
225         u32 rts_rc:6;
226         u32 data_rc:6;
227         u32 rsvd0:2;
228         u32 bar_retryht:2;
229         u32 rsvd1:1;
230         u32 morefrag:1;
231         u32 raw:1;
232         u32 ccx:1;
233         u32 ampdudensity:3;
234         u32 rsvd2:1;
235         u32 ant_sela:1;
236         u32 ant_selb:1;
237         u32 txant_cck:2;
238         u32 txant_l:2;
239         u32 txant_ht:2;
240
241         u32 nextheadpage:8;
242         u32 tailpage:8;
243         u32 seq:12;
244         u32 pktid:4;
245
246         u32 rtsrate:5;
247         u32 apdcfe:1;
248         u32 qos:1;
249         u32 hwseq_enable:1;
250         u32 userrate:1;
251         u32 dis_rtsfb:1;
252         u32 dis_datafb:1;
253         u32 cts2self:1;
254         u32 rts_en:1;
255         u32 hwrts_en:1;
256         u32 portid:1;
257         u32 rsvd3:3;
258         u32 waitdcts:1;
259         u32 cts2ap_en:1;
260         u32 txsc:2;
261         u32 stbc:2;
262         u32 txshort:1;
263         u32 txbw:1;
264         u32 rtsshort:1;
265         u32 rtsbw:1;
266         u32 rtssc:2;
267         u32 rtsstbc:2;
268
269         u32 txrate:6;
270         u32 shortgi:1;
271         u32 ccxt:1;
272         u32 txrate_fb_lmt:5;
273         u32 rtsrate_fb_lmt:4;
274         u32 retrylmt_en:1;
275         u32 txretrylmt:6;
276         u32 usb_txaggnum:8;
277
278         u32 txagca:5;
279         u32 txagcb:5;
280         u32 usemaxlen:1;
281         u32 maxaggnum:5;
282         u32 mcsg1maxlen:4;
283         u32 mcsg2maxlen:4;
284         u32 mcsg3maxlen:4;
285         u32 mcs7sgimaxlen:4;
286
287         u32 txbuffersize:16;
288         u32 mcsg4maxlen:4;
289         u32 mcsg5maxlen:4;
290         u32 mcsg6maxlen:4;
291         u32 mcsg15sgimaxlen:4;
292
293         u32 txbuffaddr;
294         u32 txbufferaddr64;
295         u32 nextdescaddress;
296         u32 nextdescaddress64;
297
298         u32 reserve_pass_pcie_mm_limit[4];
299 } __packed;
300
301 struct rx_desc_92d {
302         u32 length:14;
303         u32 crc32:1;
304         u32 icverror:1;
305         u32 drv_infosize:4;
306         u32 security:3;
307         u32 qos:1;
308         u32 shift:2;
309         u32 phystatus:1;
310         u32 swdec:1;
311         u32 lastseg:1;
312         u32 firstseg:1;
313         u32 eor:1;
314         u32 own:1;
315
316         u32 macid:5;
317         u32 tid:4;
318         u32 hwrsvd:5;
319         u32 paggr:1;
320         u32 faggr:1;
321         u32 a1_fit:4;
322         u32 a2_fit:4;
323         u32 pam:1;
324         u32 pwr:1;
325         u32 moredata:1;
326         u32 morefrag:1;
327         u32 type:2;
328         u32 mc:1;
329         u32 bc:1;
330
331         u32 seq:12;
332         u32 frag:4;
333         u32 nextpktlen:14;
334         u32 nextind:1;
335         u32 rsvd:1;
336
337         u32 rxmcs:6;
338         u32 rxht:1;
339         u32 amsdu:1;
340         u32 splcp:1;
341         u32 bandwidth:1;
342         u32 htc:1;
343         u32 tcpchk_rpt:1;
344         u32 ipcchk_rpt:1;
345         u32 tcpchk_valid:1;
346         u32 hwpcerr:1;
347         u32 hwpcind:1;
348         u32 iv0:16;
349
350         u32 iv1;
351
352         u32 tsfl;
353
354         u32 bufferaddress;
355         u32 bufferaddress64;
356
357 } __packed;
358
359 void rtl92de_tx_fill_desc(struct ieee80211_hw *hw,
360                           struct ieee80211_hdr *hdr, u8 *pdesc,
361                           u8 *pbd_desc_tx, struct ieee80211_tx_info *info,
362                           struct ieee80211_sta *sta,
363                           struct sk_buff *skb, u8 hw_queue,
364                           struct rtl_tcb_desc *ptcb_desc);
365 bool rtl92de_rx_query_desc(struct ieee80211_hw *hw,
366                            struct rtl_stats *stats,
367                            struct ieee80211_rx_status *rx_status,
368                            u8 *pdesc, struct sk_buff *skb);
369 void rtl92de_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
370                       u8 desc_name, u8 *val);
371 u64 rtl92de_get_desc(struct ieee80211_hw *hw,
372                      u8 *p_desc, bool istx, u8 desc_name);
373 bool rtl92de_is_tx_desc_closed(struct ieee80211_hw *hw,
374                                u8 hw_queue, u16 index);
375 void rtl92de_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
376 void rtl92de_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
377                              bool b_firstseg, bool b_lastseg,
378                              struct sk_buff *skb);
379
380 #endif