0001
0002
0003
0004 #ifndef __RTL92CE_TRX_H__
0005 #define __RTL92CE_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_bmc(__le32 *__pdesc, u32 __val)
0030 {
0031 le32p_replace_bits(__pdesc, __val, BIT(24));
0032 }
0033
0034 static inline void set_tx_desc_htc(__le32 *__pdesc, u32 __val)
0035 {
0036 le32p_replace_bits(__pdesc, __val, BIT(25));
0037 }
0038
0039 static inline void set_tx_desc_last_seg(__le32 *__pdesc, u32 __val)
0040 {
0041 le32p_replace_bits(__pdesc, __val, BIT(26));
0042 }
0043
0044 static inline void set_tx_desc_first_seg(__le32 *__pdesc, u32 __val)
0045 {
0046 le32p_replace_bits(__pdesc, __val, BIT(27));
0047 }
0048
0049 static inline void set_tx_desc_linip(__le32 *__pdesc, u32 __val)
0050 {
0051 le32p_replace_bits(__pdesc, __val, BIT(28));
0052 }
0053
0054 static inline void set_tx_desc_own(__le32 *__pdesc, u32 __val)
0055 {
0056 le32p_replace_bits(__pdesc, __val, BIT(31));
0057 }
0058
0059 static inline int get_tx_desc_own(__le32 *__pdesc)
0060 {
0061 return le32_get_bits(*(__pdesc), BIT(31));
0062 }
0063
0064 static inline void set_tx_desc_macid(__le32 *__pdesc, u32 __val)
0065 {
0066 le32p_replace_bits((__pdesc + 1), __val, GENMASK(4, 0));
0067 }
0068
0069 static inline void set_tx_desc_agg_break(__le32 *__pdesc, u32 __val)
0070 {
0071 le32p_replace_bits((__pdesc + 1), __val, BIT(5));
0072 }
0073
0074 static inline void set_tx_desc_rdg_enable(__le32 *__pdesc, u32 __val)
0075 {
0076 le32p_replace_bits((__pdesc + 1), __val, BIT(7));
0077 }
0078
0079 static inline void set_tx_desc_queue_sel(__le32 *__pdesc, u32 __val)
0080 {
0081 le32p_replace_bits((__pdesc + 1), __val, GENMASK(12, 8));
0082 }
0083
0084 static inline void set_tx_desc_rate_id(__le32 *__pdesc, u32 __val)
0085 {
0086 le32p_replace_bits((__pdesc + 1), __val, GENMASK(19, 16));
0087 }
0088
0089 static inline void set_tx_desc_sec_type(__le32 *__pdesc, u32 __val)
0090 {
0091 le32p_replace_bits((__pdesc + 1), __val, GENMASK(23, 22));
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 int get_rx_desc_pkt_len(__le32 *__pdesc)
0230 {
0231 return le32_get_bits(*(__pdesc), GENMASK(13, 0));
0232 }
0233
0234 static inline int get_rx_desc_crc32(__le32 *__pdesc)
0235 {
0236 return le32_get_bits(*(__pdesc), BIT(14));
0237 }
0238
0239 static inline int get_rx_desc_icv(__le32 *__pdesc)
0240 {
0241 return le32_get_bits(*(__pdesc), BIT(15));
0242 }
0243
0244 static inline int get_rx_desc_drv_info_size(__le32 *__pdesc)
0245 {
0246 return le32_get_bits(*(__pdesc), GENMASK(19, 16));
0247 }
0248
0249 static inline int get_rx_desc_shift(__le32 *__pdesc)
0250 {
0251 return le32_get_bits(*(__pdesc), GENMASK(25, 24));
0252 }
0253
0254 static inline int get_rx_desc_physt(__le32 *__pdesc)
0255 {
0256 return le32_get_bits(*(__pdesc), BIT(26));
0257 }
0258
0259 static inline int get_rx_desc_swdec(__le32 *__pdesc)
0260 {
0261 return le32_get_bits(*(__pdesc), BIT(27));
0262 }
0263
0264 static inline int 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 int get_rx_desc_paggr(__le32 *__pdesc)
0285 {
0286 return le32_get_bits(*((__pdesc + 1)), BIT(14));
0287 }
0288
0289 static inline int get_rx_desc_faggr(__le32 *__pdesc)
0290 {
0291 return le32_get_bits(*((__pdesc + 1)), BIT(15));
0292 }
0293
0294 static inline int get_rx_desc_rxmcs(__le32 *__pdesc)
0295 {
0296 return le32_get_bits(*((__pdesc + 3)), GENMASK(5, 0));
0297 }
0298
0299 static inline int get_rx_desc_rxht(__le32 *__pdesc)
0300 {
0301 return le32_get_bits(*((__pdesc + 3)), BIT(6));
0302 }
0303
0304 static inline int get_rx_desc_splcp(__le32 *__pdesc)
0305 {
0306 return le32_get_bits(*((__pdesc + 3)), BIT(8));
0307 }
0308
0309 static inline int 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, int _size)
0330 {
0331 memset(__pdesc, 0, min_t(size_t, _size, TX_DESC_NEXT_DESC_OFFSET));
0332 }
0333
0334 struct rx_fwinfo_92c {
0335 u8 gain_trsw[4];
0336 u8 pwdb_all;
0337 u8 cfosho[4];
0338 u8 cfotail[4];
0339 s8 rxevm[2];
0340 s8 rxsnr[4];
0341 u8 pdsnr[2];
0342 u8 csi_current[2];
0343 u8 csi_target[2];
0344 u8 sigevm;
0345 u8 max_ex_pwr;
0346 u8 ex_intf_flag:1;
0347 u8 sgi_en:1;
0348 u8 rxsc:2;
0349 u8 reserve:4;
0350 } __packed;
0351
0352 struct tx_desc_92c {
0353 u32 pktsize:16;
0354 u32 offset:8;
0355 u32 bmc:1;
0356 u32 htc:1;
0357 u32 lastseg:1;
0358 u32 firstseg:1;
0359 u32 linip:1;
0360 u32 noacm:1;
0361 u32 gf:1;
0362 u32 own:1;
0363
0364 u32 macid:5;
0365 u32 agg_en:1;
0366 u32 bk:1;
0367 u32 rdg_en:1;
0368 u32 queuesel:5;
0369 u32 rd_nav_ext:1;
0370 u32 lsig_txop_en:1;
0371 u32 pifs:1;
0372 u32 rateid:4;
0373 u32 nav_usehdr:1;
0374 u32 en_descid:1;
0375 u32 sectype:2;
0376 u32 pktoffset:8;
0377
0378 u32 rts_rc:6;
0379 u32 data_rc:6;
0380 u32 rsvd0:2;
0381 u32 bar_retryht:2;
0382 u32 rsvd1:1;
0383 u32 morefrag:1;
0384 u32 raw:1;
0385 u32 ccx:1;
0386 u32 ampdudensity:3;
0387 u32 rsvd2:1;
0388 u32 ant_sela:1;
0389 u32 ant_selb:1;
0390 u32 txant_cck:2;
0391 u32 txant_l:2;
0392 u32 txant_ht:2;
0393
0394 u32 nextheadpage:8;
0395 u32 tailpage:8;
0396 u32 seq:12;
0397 u32 pktid:4;
0398
0399 u32 rtsrate:5;
0400 u32 apdcfe:1;
0401 u32 qos:1;
0402 u32 hwseq_enable:1;
0403 u32 userrate:1;
0404 u32 dis_rtsfb:1;
0405 u32 dis_datafb:1;
0406 u32 cts2self:1;
0407 u32 rts_en:1;
0408 u32 hwrts_en:1;
0409 u32 portid:1;
0410 u32 rsvd3:3;
0411 u32 waitdcts:1;
0412 u32 cts2ap_en:1;
0413 u32 txsc:2;
0414 u32 stbc:2;
0415 u32 txshort:1;
0416 u32 txbw:1;
0417 u32 rtsshort:1;
0418 u32 rtsbw:1;
0419 u32 rtssc:2;
0420 u32 rtsstbc:2;
0421
0422 u32 txrate:6;
0423 u32 shortgi:1;
0424 u32 ccxt:1;
0425 u32 txrate_fb_lmt:5;
0426 u32 rtsrate_fb_lmt:4;
0427 u32 retrylmt_en:1;
0428 u32 txretrylmt:6;
0429 u32 usb_txaggnum:8;
0430
0431 u32 txagca:5;
0432 u32 txagcb:5;
0433 u32 usemaxlen:1;
0434 u32 maxaggnum:5;
0435 u32 mcsg1maxlen:4;
0436 u32 mcsg2maxlen:4;
0437 u32 mcsg3maxlen:4;
0438 u32 mcs7sgimaxlen:4;
0439
0440 u32 txbuffersize:16;
0441 u32 mcsg4maxlen:4;
0442 u32 mcsg5maxlen:4;
0443 u32 mcsg6maxlen:4;
0444 u32 mcsg15sgimaxlen:4;
0445
0446 u32 txbuffaddr;
0447 u32 txbufferaddr64;
0448 u32 nextdescaddress;
0449 u32 nextdescaddress64;
0450
0451 u32 reserve_pass_pcie_mm_limit[4];
0452 } __packed;
0453
0454 struct rx_desc_92c {
0455 u32 length:14;
0456 u32 crc32:1;
0457 u32 icverror:1;
0458 u32 drv_infosize:4;
0459 u32 security:3;
0460 u32 qos:1;
0461 u32 shift:2;
0462 u32 phystatus:1;
0463 u32 swdec:1;
0464 u32 lastseg:1;
0465 u32 firstseg:1;
0466 u32 eor:1;
0467 u32 own:1;
0468
0469 u32 macid:5;
0470 u32 tid:4;
0471 u32 hwrsvd:5;
0472 u32 paggr:1;
0473 u32 faggr:1;
0474 u32 a1_fit:4;
0475 u32 a2_fit:4;
0476 u32 pam:1;
0477 u32 pwr:1;
0478 u32 moredata:1;
0479 u32 morefrag:1;
0480 u32 type:2;
0481 u32 mc:1;
0482 u32 bc:1;
0483
0484 u32 seq:12;
0485 u32 frag:4;
0486 u32 nextpktlen:14;
0487 u32 nextind:1;
0488 u32 rsvd:1;
0489
0490 u32 rxmcs:6;
0491 u32 rxht:1;
0492 u32 amsdu:1;
0493 u32 splcp:1;
0494 u32 bandwidth:1;
0495 u32 htc:1;
0496 u32 tcpchk_rpt:1;
0497 u32 ipcchk_rpt:1;
0498 u32 tcpchk_valid:1;
0499 u32 hwpcerr:1;
0500 u32 hwpcind:1;
0501 u32 iv0:16;
0502
0503 u32 iv1;
0504
0505 u32 tsfl;
0506
0507 u32 bufferaddress;
0508 u32 bufferaddress64;
0509
0510 } __packed;
0511
0512 void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
0513 struct ieee80211_hdr *hdr, u8 *pdesc,
0514 u8 *pbd_desc_tx, struct ieee80211_tx_info *info,
0515 struct ieee80211_sta *sta,
0516 struct sk_buff *skb, u8 hw_queue,
0517 struct rtl_tcb_desc *ptcb_desc);
0518 bool rtl92ce_rx_query_desc(struct ieee80211_hw *hw,
0519 struct rtl_stats *stats,
0520 struct ieee80211_rx_status *rx_status,
0521 u8 *pdesc, struct sk_buff *skb);
0522 void rtl92ce_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
0523 u8 desc_name, u8 *val);
0524 u64 rtl92ce_get_desc(struct ieee80211_hw *hw, u8 *p_desc,
0525 bool istx, u8 desc_name);
0526 bool rtl92ce_is_tx_desc_closed(struct ieee80211_hw *hw,
0527 u8 hw_queue, u16 index);
0528 void rtl92ce_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
0529 void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
0530 bool b_firstseg, bool b_lastseg,
0531 struct sk_buff *skb);
0532 #endif