Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /* Copyright(c) 2009-2012  Realtek Corporation.*/
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 /* macros to read/write various fields in RX or TX descriptors */
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 /* For 92D early mode */
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