0001
0002
0003
0004 #ifndef __RTL92DE_TRX_H__
0005 #define __RTL92DE_TRX_H__
0006
0007 #define TX_DESC_SIZE 64
0008 #define TX_DESC_AGGR_SUBFRAME_SIZE 32
0009
0010 #define RX_DESC_SIZE 32
0011 #define RX_DRV_INFO_SIZE_UNIT 8
0012
0013 #define TX_DESC_NEXT_DESC_OFFSET 40
0014 #define USB_HWDESC_HEADER_LEN 32
0015 #define CRCLENGTH 4
0016
0017
0018
0019 static inline void set_tx_desc_pkt_size(__le32 *__pdesc, u32 __val)
0020 {
0021 le32p_replace_bits(__pdesc, __val, GENMASK(15, 0));
0022 }
0023
0024 static inline void set_tx_desc_offset(__le32 *__pdesc, u32 __val)
0025 {
0026 le32p_replace_bits(__pdesc, __val, GENMASK(23, 16));
0027 }
0028
0029 static inline void set_tx_desc_htc(__le32 *__pdesc, u32 __val)
0030 {
0031 le32p_replace_bits(__pdesc, __val, BIT(25));
0032 }
0033
0034 static inline void set_tx_desc_last_seg(__le32 *__pdesc, u32 __val)
0035 {
0036 le32p_replace_bits(__pdesc, __val, BIT(26));
0037 }
0038
0039 static inline void set_tx_desc_first_seg(__le32 *__pdesc, u32 __val)
0040 {
0041 le32p_replace_bits(__pdesc, __val, BIT(27));
0042 }
0043
0044 static inline void set_tx_desc_linip(__le32 *__pdesc, u32 __val)
0045 {
0046 le32p_replace_bits(__pdesc, __val, BIT(28));
0047 }
0048
0049 static inline void set_tx_desc_own(__le32 *__pdesc, u32 __val)
0050 {
0051 le32p_replace_bits(__pdesc, __val, BIT(31));
0052 }
0053
0054 static inline u32 get_tx_desc_own(__le32 *__pdesc)
0055 {
0056 return le32_get_bits(*__pdesc, BIT(31));
0057 }
0058
0059 static inline void set_tx_desc_macid(__le32 *__pdesc, u32 __val)
0060 {
0061 le32p_replace_bits((__pdesc + 1), __val, GENMASK(4, 0));
0062 }
0063
0064 static inline void set_tx_desc_agg_enable(__le32 *__pdesc, u32 __val)
0065 {
0066 le32p_replace_bits((__pdesc + 1), __val, BIT(5));
0067 }
0068
0069 static inline void set_tx_desc_rdg_enable(__le32 *__pdesc, u32 __val)
0070 {
0071 le32p_replace_bits((__pdesc + 1), __val, BIT(7));
0072 }
0073
0074 static inline void set_tx_desc_queue_sel(__le32 *__pdesc, u32 __val)
0075 {
0076 le32p_replace_bits((__pdesc + 1), __val, GENMASK(12, 8));
0077 }
0078
0079 static inline void set_tx_desc_rate_id(__le32 *__pdesc, u32 __val)
0080 {
0081 le32p_replace_bits((__pdesc + 1), __val, GENMASK(19, 16));
0082 }
0083
0084 static inline void set_tx_desc_sec_type(__le32 *__pdesc, u32 __val)
0085 {
0086 le32p_replace_bits((__pdesc + 1), __val, GENMASK(23, 22));
0087 }
0088
0089 static inline void set_tx_desc_pkt_offset(__le32 *__pdesc, u32 __val)
0090 {
0091 le32p_replace_bits((__pdesc + 1), __val, GENMASK(30, 26));
0092 }
0093
0094 static inline void set_tx_desc_more_frag(__le32 *__pdesc, u32 __val)
0095 {
0096 le32p_replace_bits((__pdesc + 2), __val, BIT(17));
0097 }
0098
0099 static inline void set_tx_desc_ampdu_density(__le32 *__pdesc, u32 __val)
0100 {
0101 le32p_replace_bits((__pdesc + 2), __val, GENMASK(22, 20));
0102 }
0103
0104 static inline void set_tx_desc_seq(__le32 *__pdesc, u32 __val)
0105 {
0106 le32p_replace_bits((__pdesc + 3), __val, GENMASK(27, 16));
0107 }
0108
0109 static inline void set_tx_desc_pkt_id(__le32 *__pdesc, u32 __val)
0110 {
0111 le32p_replace_bits((__pdesc + 3), __val, GENMASK(31, 28));
0112 }
0113
0114 static inline void set_tx_desc_rts_rate(__le32 *__pdesc, u32 __val)
0115 {
0116 le32p_replace_bits((__pdesc + 4), __val, GENMASK(4, 0));
0117 }
0118
0119 static inline void set_tx_desc_qos(__le32 *__pdesc, u32 __val)
0120 {
0121 le32p_replace_bits((__pdesc + 4), __val, BIT(6));
0122 }
0123
0124 static inline void set_tx_desc_hwseq_en(__le32 *__pdesc, u32 __val)
0125 {
0126 le32p_replace_bits((__pdesc + 4), __val, BIT(7));
0127 }
0128
0129 static inline void set_tx_desc_use_rate(__le32 *__pdesc, u32 __val)
0130 {
0131 le32p_replace_bits((__pdesc + 4), __val, BIT(8));
0132 }
0133
0134 static inline void set_tx_desc_disable_fb(__le32 *__pdesc, u32 __val)
0135 {
0136 le32p_replace_bits((__pdesc + 4), __val, BIT(10));
0137 }
0138
0139 static inline void set_tx_desc_cts2self(__le32 *__pdesc, u32 __val)
0140 {
0141 le32p_replace_bits((__pdesc + 4), __val, BIT(11));
0142 }
0143
0144 static inline void set_tx_desc_rts_enable(__le32 *__pdesc, u32 __val)
0145 {
0146 le32p_replace_bits((__pdesc + 4), __val, BIT(12));
0147 }
0148
0149 static inline void set_tx_desc_hw_rts_enable(__le32 *__pdesc, u32 __val)
0150 {
0151 le32p_replace_bits((__pdesc + 4), __val, BIT(13));
0152 }
0153
0154 static inline void set_tx_desc_tx_sub_carrier(__le32 *__pdesc, u32 __val)
0155 {
0156 le32p_replace_bits((__pdesc + 4), __val, GENMASK(21, 20));
0157 }
0158
0159 static inline void set_tx_desc_data_bw(__le32 *__pdesc, u32 __val)
0160 {
0161 le32p_replace_bits((__pdesc + 4), __val, BIT(25));
0162 }
0163
0164 static inline void set_tx_desc_rts_short(__le32 *__pdesc, u32 __val)
0165 {
0166 le32p_replace_bits((__pdesc + 4), __val, BIT(26));
0167 }
0168
0169 static inline void set_tx_desc_rts_bw(__le32 *__pdesc, u32 __val)
0170 {
0171 le32p_replace_bits((__pdesc + 4), __val, BIT(27));
0172 }
0173
0174 static inline void set_tx_desc_rts_sc(__le32 *__pdesc, u32 __val)
0175 {
0176 le32p_replace_bits((__pdesc + 4), __val, GENMASK(29, 28));
0177 }
0178
0179 static inline void set_tx_desc_rts_stbc(__le32 *__pdesc, u32 __val)
0180 {
0181 le32p_replace_bits((__pdesc + 4), __val, GENMASK(31, 30));
0182 }
0183
0184 static inline void set_tx_desc_tx_rate(__le32 *__pdesc, u32 __val)
0185 {
0186 le32p_replace_bits((__pdesc + 5), __val, GENMASK(5, 0));
0187 }
0188
0189 static inline void set_tx_desc_data_shortgi(__le32 *__pdesc, u32 __val)
0190 {
0191 le32p_replace_bits((__pdesc + 5), __val, BIT(6));
0192 }
0193
0194 static inline void set_tx_desc_data_rate_fb_limit(__le32 *__pdesc, u32 __val)
0195 {
0196 le32p_replace_bits((__pdesc + 5), __val, GENMASK(12, 8));
0197 }
0198
0199 static inline void set_tx_desc_rts_rate_fb_limit(__le32 *__pdesc, u32 __val)
0200 {
0201 le32p_replace_bits((__pdesc + 5), __val, GENMASK(16, 13));
0202 }
0203
0204 static inline void set_tx_desc_max_agg_num(__le32 *__pdesc, u32 __val)
0205 {
0206 le32p_replace_bits((__pdesc + 6), __val, GENMASK(15, 11));
0207 }
0208
0209 static inline void set_tx_desc_tx_buffer_size(__le32 *__pdesc, u32 __val)
0210 {
0211 le32p_replace_bits((__pdesc + 7), __val, GENMASK(15, 0));
0212 }
0213
0214 static inline void set_tx_desc_tx_buffer_address(__le32 *__pdesc, u32 __val)
0215 {
0216 *(__pdesc + 8) = cpu_to_le32(__val);
0217 }
0218
0219 static inline u32 get_tx_desc_tx_buffer_address(__le32 *__pdesc)
0220 {
0221 return le32_to_cpu(*(__pdesc + 8));
0222 }
0223
0224 static inline void set_tx_desc_next_desc_address(__le32 *__pdesc, u32 __val)
0225 {
0226 *(__pdesc + 10) = cpu_to_le32(__val);
0227 }
0228
0229 static inline u32 get_rx_desc_pkt_len(__le32 *__pdesc)
0230 {
0231 return le32_get_bits(*__pdesc, GENMASK(13, 0));
0232 }
0233
0234 static inline u32 get_rx_desc_crc32(__le32 *__pdesc)
0235 {
0236 return le32_get_bits(*__pdesc, BIT(14));
0237 }
0238
0239 static inline u32 get_rx_desc_icv(__le32 *__pdesc)
0240 {
0241 return le32_get_bits(*__pdesc, BIT(15));
0242 }
0243
0244 static inline u32 get_rx_desc_drv_info_size(__le32 *__pdesc)
0245 {
0246 return le32_get_bits(*__pdesc, GENMASK(19, 16));
0247 }
0248
0249 static inline u32 get_rx_desc_shift(__le32 *__pdesc)
0250 {
0251 return le32_get_bits(*__pdesc, GENMASK(25, 24));
0252 }
0253
0254 static inline u32 get_rx_desc_physt(__le32 *__pdesc)
0255 {
0256 return le32_get_bits(*__pdesc, BIT(26));
0257 }
0258
0259 static inline u32 get_rx_desc_swdec(__le32 *__pdesc)
0260 {
0261 return le32_get_bits(*__pdesc, BIT(27));
0262 }
0263
0264 static inline u32 get_rx_desc_own(__le32 *__pdesc)
0265 {
0266 return le32_get_bits(*__pdesc, BIT(31));
0267 }
0268
0269 static inline void set_rx_desc_pkt_len(__le32 *__pdesc, u32 __val)
0270 {
0271 le32p_replace_bits(__pdesc, __val, GENMASK(13, 0));
0272 }
0273
0274 static inline void set_rx_desc_eor(__le32 *__pdesc, u32 __val)
0275 {
0276 le32p_replace_bits(__pdesc, __val, BIT(30));
0277 }
0278
0279 static inline void set_rx_desc_own(__le32 *__pdesc, u32 __val)
0280 {
0281 le32p_replace_bits(__pdesc, __val, BIT(31));
0282 }
0283
0284 static inline u32 get_rx_desc_paggr(__le32 *__pdesc)
0285 {
0286 return le32_get_bits(*(__pdesc + 1), BIT(14));
0287 }
0288
0289 static inline u32 get_rx_desc_faggr(__le32 *__pdesc)
0290 {
0291 return le32_get_bits(*(__pdesc + 1), BIT(15));
0292 }
0293
0294 static inline u32 get_rx_desc_rxmcs(__le32 *__pdesc)
0295 {
0296 return le32_get_bits(*(__pdesc + 3), GENMASK(5, 0));
0297 }
0298
0299 static inline u32 get_rx_desc_rxht(__le32 *__pdesc)
0300 {
0301 return le32_get_bits(*(__pdesc + 3), BIT(6));
0302 }
0303
0304 static inline u32 get_rx_desc_splcp(__le32 *__pdesc)
0305 {
0306 return le32_get_bits(*(__pdesc + 3), BIT(8));
0307 }
0308
0309 static inline u32 get_rx_desc_bw(__le32 *__pdesc)
0310 {
0311 return le32_get_bits(*(__pdesc + 3), BIT(9));
0312 }
0313
0314 static inline u32 get_rx_desc_tsfl(__le32 *__pdesc)
0315 {
0316 return le32_to_cpu(*(__pdesc + 5));
0317 }
0318
0319 static inline u32 get_rx_desc_buff_addr(__le32 *__pdesc)
0320 {
0321 return le32_to_cpu(*(__pdesc + 6));
0322 }
0323
0324 static inline void set_rx_desc_buff_addr(__le32 *__pdesc, u32 __val)
0325 {
0326 *(__pdesc + 6) = cpu_to_le32(__val);
0327 }
0328
0329 static inline void clear_pci_tx_desc_content(__le32 *__pdesc, u32 _size)
0330 {
0331 memset((void *)__pdesc, 0,
0332 min_t(size_t, _size, TX_DESC_NEXT_DESC_OFFSET));
0333 }
0334
0335
0336 static inline void set_earlymode_pktnum(__le32 *__paddr, u32 __value)
0337 {
0338 le32p_replace_bits(__paddr, __value, GENMASK(2, 0));
0339 }
0340
0341 static inline void set_earlymode_len0(__le32 *__paddr, u32 __value)
0342 {
0343 le32p_replace_bits(__paddr, __value, GENMASK(15, 4));
0344 }
0345
0346 static inline void set_earlymode_len1(__le32 *__paddr, u32 __value)
0347 {
0348 le32p_replace_bits(__paddr, __value, GENMASK(27, 16));
0349 }
0350
0351 static inline void set_earlymode_len2_1(__le32 *__paddr, u32 __value)
0352 {
0353 le32p_replace_bits(__paddr, __value, GENMASK(31, 28));
0354 }
0355
0356 static inline void set_earlymode_len2_2(__le32 *__paddr, u32 __value)
0357 {
0358 le32p_replace_bits((__paddr + 1), __value, GENMASK(7, 0));
0359 }
0360
0361 static inline void set_earlymode_len3(__le32 *__paddr, u32 __value)
0362 {
0363 le32p_replace_bits((__paddr + 1), __value, GENMASK(19, 8));
0364 }
0365
0366 static inline void set_earlymode_len4(__le32 *__paddr, u32 __value)
0367 {
0368 le32p_replace_bits((__paddr + 1), __value, GENMASK(31, 20));
0369 }
0370
0371 struct rx_fwinfo_92d {
0372 u8 gain_trsw[4];
0373 u8 pwdb_all;
0374 u8 cfosho[4];
0375 u8 cfotail[4];
0376 s8 rxevm[2];
0377 s8 rxsnr[4];
0378 u8 pdsnr[2];
0379 u8 csi_current[2];
0380 u8 csi_target[2];
0381 u8 sigevm;
0382 u8 max_ex_pwr;
0383 u8 ex_intf_flag:1;
0384 u8 sgi_en:1;
0385 u8 rxsc:2;
0386 u8 reserve:4;
0387 } __packed;
0388
0389 struct tx_desc_92d {
0390 u32 pktsize:16;
0391 u32 offset:8;
0392 u32 bmc:1;
0393 u32 htc:1;
0394 u32 lastseg:1;
0395 u32 firstseg:1;
0396 u32 linip:1;
0397 u32 noacm:1;
0398 u32 gf:1;
0399 u32 own:1;
0400
0401 u32 macid:5;
0402 u32 agg_en:1;
0403 u32 bk:1;
0404 u32 rdg_en:1;
0405 u32 queuesel:5;
0406 u32 rd_nav_ext:1;
0407 u32 lsig_txop_en:1;
0408 u32 pifs:1;
0409 u32 rateid:4;
0410 u32 nav_usehdr:1;
0411 u32 en_descid:1;
0412 u32 sectype:2;
0413 u32 pktoffset:8;
0414
0415 u32 rts_rc:6;
0416 u32 data_rc:6;
0417 u32 rsvd0:2;
0418 u32 bar_retryht:2;
0419 u32 rsvd1:1;
0420 u32 morefrag:1;
0421 u32 raw:1;
0422 u32 ccx:1;
0423 u32 ampdudensity:3;
0424 u32 rsvd2:1;
0425 u32 ant_sela:1;
0426 u32 ant_selb:1;
0427 u32 txant_cck:2;
0428 u32 txant_l:2;
0429 u32 txant_ht:2;
0430
0431 u32 nextheadpage:8;
0432 u32 tailpage:8;
0433 u32 seq:12;
0434 u32 pktid:4;
0435
0436 u32 rtsrate:5;
0437 u32 apdcfe:1;
0438 u32 qos:1;
0439 u32 hwseq_enable:1;
0440 u32 userrate:1;
0441 u32 dis_rtsfb:1;
0442 u32 dis_datafb:1;
0443 u32 cts2self:1;
0444 u32 rts_en:1;
0445 u32 hwrts_en:1;
0446 u32 portid:1;
0447 u32 rsvd3:3;
0448 u32 waitdcts:1;
0449 u32 cts2ap_en:1;
0450 u32 txsc:2;
0451 u32 stbc:2;
0452 u32 txshort:1;
0453 u32 txbw:1;
0454 u32 rtsshort:1;
0455 u32 rtsbw:1;
0456 u32 rtssc:2;
0457 u32 rtsstbc:2;
0458
0459 u32 txrate:6;
0460 u32 shortgi:1;
0461 u32 ccxt:1;
0462 u32 txrate_fb_lmt:5;
0463 u32 rtsrate_fb_lmt:4;
0464 u32 retrylmt_en:1;
0465 u32 txretrylmt:6;
0466 u32 usb_txaggnum:8;
0467
0468 u32 txagca:5;
0469 u32 txagcb:5;
0470 u32 usemaxlen:1;
0471 u32 maxaggnum:5;
0472 u32 mcsg1maxlen:4;
0473 u32 mcsg2maxlen:4;
0474 u32 mcsg3maxlen:4;
0475 u32 mcs7sgimaxlen:4;
0476
0477 u32 txbuffersize:16;
0478 u32 mcsg4maxlen:4;
0479 u32 mcsg5maxlen:4;
0480 u32 mcsg6maxlen:4;
0481 u32 mcsg15sgimaxlen:4;
0482
0483 u32 txbuffaddr;
0484 u32 txbufferaddr64;
0485 u32 nextdescaddress;
0486 u32 nextdescaddress64;
0487
0488 u32 reserve_pass_pcie_mm_limit[4];
0489 } __packed;
0490
0491 struct rx_desc_92d {
0492 u32 length:14;
0493 u32 crc32:1;
0494 u32 icverror:1;
0495 u32 drv_infosize:4;
0496 u32 security:3;
0497 u32 qos:1;
0498 u32 shift:2;
0499 u32 phystatus:1;
0500 u32 swdec:1;
0501 u32 lastseg:1;
0502 u32 firstseg:1;
0503 u32 eor:1;
0504 u32 own:1;
0505
0506 u32 macid:5;
0507 u32 tid:4;
0508 u32 hwrsvd:5;
0509 u32 paggr:1;
0510 u32 faggr:1;
0511 u32 a1_fit:4;
0512 u32 a2_fit:4;
0513 u32 pam:1;
0514 u32 pwr:1;
0515 u32 moredata:1;
0516 u32 morefrag:1;
0517 u32 type:2;
0518 u32 mc:1;
0519 u32 bc:1;
0520
0521 u32 seq:12;
0522 u32 frag:4;
0523 u32 nextpktlen:14;
0524 u32 nextind:1;
0525 u32 rsvd:1;
0526
0527 u32 rxmcs:6;
0528 u32 rxht:1;
0529 u32 amsdu:1;
0530 u32 splcp:1;
0531 u32 bandwidth:1;
0532 u32 htc:1;
0533 u32 tcpchk_rpt:1;
0534 u32 ipcchk_rpt:1;
0535 u32 tcpchk_valid:1;
0536 u32 hwpcerr:1;
0537 u32 hwpcind:1;
0538 u32 iv0:16;
0539
0540 u32 iv1;
0541
0542 u32 tsfl;
0543
0544 u32 bufferaddress;
0545 u32 bufferaddress64;
0546
0547 } __packed;
0548
0549 void rtl92de_tx_fill_desc(struct ieee80211_hw *hw,
0550 struct ieee80211_hdr *hdr, u8 *pdesc,
0551 u8 *pbd_desc_tx, struct ieee80211_tx_info *info,
0552 struct ieee80211_sta *sta,
0553 struct sk_buff *skb, u8 hw_queue,
0554 struct rtl_tcb_desc *ptcb_desc);
0555 bool rtl92de_rx_query_desc(struct ieee80211_hw *hw,
0556 struct rtl_stats *stats,
0557 struct ieee80211_rx_status *rx_status,
0558 u8 *pdesc, struct sk_buff *skb);
0559 void rtl92de_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
0560 u8 desc_name, u8 *val);
0561 u64 rtl92de_get_desc(struct ieee80211_hw *hw,
0562 u8 *p_desc, bool istx, u8 desc_name);
0563 bool rtl92de_is_tx_desc_closed(struct ieee80211_hw *hw,
0564 u8 hw_queue, u16 index);
0565 void rtl92de_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
0566 void rtl92de_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
0567 bool b_firstseg, bool b_lastseg,
0568 struct sk_buff *skb);
0569
0570 #endif