Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /* Copyright(c) 2009-2012  Realtek Corporation.*/
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 /* 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_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