brintos

brintos / linux-shallow public Read only

0
0
Text · 9.4 KiB · 09e61dc Raw
398 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/* Copyright(c) 2009-2012  Realtek Corporation.*/3 4#ifndef __RTL92CU_TRX_H__5#define __RTL92CU_TRX_H__6 7#define RTL92C_NUM_RX_URBS			88#define RTL92C_NUM_TX_URBS			329 10#define RTL92C_SIZE_MAX_RX_BUFFER		15360   /* 8192 */11#define RX_DRV_INFO_SIZE_UNIT			812 13enum usb_rx_agg_mode {14	USB_RX_AGG_DISABLE,15	USB_RX_AGG_DMA,16	USB_RX_AGG_USB,17	USB_RX_AGG_DMA_USB18};19 20#define TX_SELE_HQ				BIT(0)	/* High Queue */21#define TX_SELE_LQ				BIT(1)	/* Low Queue */22#define TX_SELE_NQ				BIT(2)	/* Normal Queue */23 24#define RTL_USB_TX_AGG_NUM_DESC			525 26#define RTL_USB_RX_AGG_PAGE_NUM			427#define RTL_USB_RX_AGG_PAGE_TIMEOUT		328 29#define RTL_USB_RX_AGG_BLOCK_NUM		530#define RTL_USB_RX_AGG_BLOCK_TIMEOUT		331 32/*======================== rx status =========================================*/33 34struct rx_drv_info_92c {35	/*36	 * Driver info contain PHY status and other variabel size info37	 * PHY Status content as below38	 */39 40	/* DWORD 0 */41	u8 gain_trsw[4];42 43	/* DWORD 1 */44	u8 pwdb_all;45	u8 cfosho[4];46 47	/* DWORD 2 */48	u8 cfotail[4];49 50	/* DWORD 3 */51	s8 rxevm[2];52	s8 rxsnr[4];53 54	/* DWORD 4 */55	u8 pdsnr[2];56 57	/* DWORD 5 */58	u8 csi_current[2];59	u8 csi_target[2];60 61	/* DWORD 6 */62	u8 sigevm;63	u8 max_ex_pwr;64	u8 ex_intf_flag:1;65	u8 sgi_en:1;66	u8 rxsc:2;67	u8 reserve:4;68} __packed;69 70/* macros to read various fields in RX descriptor */71 72/* DWORD 0 */73static inline u32 get_rx_desc_pkt_len(__le32 *__rxdesc)74{75	return le32_get_bits(*__rxdesc, GENMASK(13, 0));76}77 78static inline u32 get_rx_desc_crc32(__le32 *__rxdesc)79{80	return le32_get_bits(*__rxdesc, BIT(14));81}82 83static inline u32 get_rx_desc_icv(__le32 *__rxdesc)84{85	return le32_get_bits(*__rxdesc, BIT(15));86}87 88static inline u32 get_rx_desc_drvinfo_size(__le32 *__rxdesc)89{90	return le32_get_bits(*__rxdesc, GENMASK(19, 16));91}92 93static inline u32 get_rx_desc_shift(__le32 *__rxdesc)94{95	return le32_get_bits(*__rxdesc, GENMASK(25, 24));96}97 98static inline u32 get_rx_desc_phy_status(__le32 *__rxdesc)99{100	return le32_get_bits(*__rxdesc, BIT(26));101}102 103static inline u32 get_rx_desc_swdec(__le32 *__rxdesc)104{105	return le32_get_bits(*__rxdesc, BIT(27));106}107 108 109/* DWORD 1 */110static inline u32 get_rx_desc_paggr(__le32 *__rxdesc)111{112	return le32_get_bits(*(__rxdesc + 1), BIT(14));113}114 115static inline u32 get_rx_desc_faggr(__le32 *__rxdesc)116{117	return le32_get_bits(*(__rxdesc + 1), BIT(15));118}119 120 121/* DWORD 3 */122static inline u32 get_rx_desc_rx_mcs(__le32 *__rxdesc)123{124	return le32_get_bits(*(__rxdesc + 3), GENMASK(5, 0));125}126 127static inline u32 get_rx_desc_rx_ht(__le32 *__rxdesc)128{129	return le32_get_bits(*(__rxdesc + 3), BIT(6));130}131 132static inline u32 get_rx_desc_splcp(__le32 *__rxdesc)133{134	return le32_get_bits(*(__rxdesc + 3), BIT(8));135}136 137static inline u32 get_rx_desc_bw(__le32 *__rxdesc)138{139	return le32_get_bits(*(__rxdesc + 3), BIT(9));140}141 142 143/* DWORD 5 */144static inline u32 get_rx_desc_tsfl(__le32 *__rxdesc)145{146	return le32_to_cpu(*((__rxdesc + 5)));147}148 149 150/*======================= tx desc ============================================*/151 152/* macros to set various fields in TX descriptor */153 154/* Dword 0 */155static inline void set_tx_desc_pkt_size(__le32 *__txdesc, u32 __value)156{157	le32p_replace_bits(__txdesc, __value, GENMASK(15, 0));158}159 160static inline void set_tx_desc_offset(__le32 *__txdesc, u32 __value)161{162	le32p_replace_bits(__txdesc, __value, GENMASK(23, 16));163}164 165static inline void set_tx_desc_bmc(__le32 *__txdesc, u32 __value)166{167	le32p_replace_bits(__txdesc, __value, BIT(24));168}169 170static inline void set_tx_desc_htc(__le32 *__txdesc, u32 __value)171{172	le32p_replace_bits(__txdesc, __value, BIT(25));173}174 175static inline void set_tx_desc_last_seg(__le32 *__txdesc, u32 __value)176{177	le32p_replace_bits(__txdesc, __value, BIT(26));178}179 180static inline void set_tx_desc_first_seg(__le32 *__txdesc, u32 __value)181{182	le32p_replace_bits(__txdesc, __value, BIT(27));183}184 185static inline void set_tx_desc_linip(__le32 *__txdesc, u32 __value)186{187	le32p_replace_bits(__txdesc, __value, BIT(28));188}189 190static inline void set_tx_desc_own(__le32 *__txdesc, u32 __value)191{192	le32p_replace_bits(__txdesc, __value, BIT(31));193}194 195 196/* Dword 1 */197static inline void set_tx_desc_macid(__le32 *__txdesc, u32 __value)198{199	le32p_replace_bits((__txdesc + 1), __value, GENMASK(4, 0));200}201 202static inline void set_tx_desc_agg_enable(__le32 *__txdesc, u32 __value)203{204	le32p_replace_bits((__txdesc + 1), __value, BIT(5));205}206 207static inline void set_tx_desc_agg_break(__le32 *__txdesc, u32 __value)208{209	le32p_replace_bits((__txdesc + 1), __value, BIT(6));210}211 212static inline void set_tx_desc_rdg_enable(__le32 *__txdesc, u32 __value)213{214	le32p_replace_bits((__txdesc + 1), __value, BIT(7));215}216 217static inline void set_tx_desc_queue_sel(__le32 *__txdesc, u32 __value)218{219	le32p_replace_bits((__txdesc + 1), __value, GENMASK(12, 8));220}221 222static inline void set_tx_desc_rate_id(__le32 *__txdesc, u32 __value)223{224	le32p_replace_bits((__txdesc + 1), __value, GENMASK(19, 16));225}226 227static inline void set_tx_desc_nav_use_hdr(__le32 *__txdesc, u32 __value)228{229	le32p_replace_bits((__txdesc + 1), __value, BIT(20));230}231 232static inline void set_tx_desc_sec_type(__le32 *__txdesc, u32 __value)233{234	le32p_replace_bits((__txdesc + 1), __value, GENMASK(23, 22));235}236 237static inline void set_tx_desc_pkt_offset(__le32 *__txdesc, u32 __value)238{239	le32p_replace_bits((__txdesc + 1), __value, GENMASK(30, 26));240}241 242 243/* Dword 2 */244static inline void set_tx_desc_more_frag(__le32 *__txdesc, u32 __value)245{246	le32p_replace_bits((__txdesc + 2), __value, BIT(17));247}248 249static inline void set_tx_desc_ampdu_density(__le32 *__txdesc, u32 __value)250{251	le32p_replace_bits((__txdesc + 2), __value, GENMASK(22, 20));252}253 254 255/* Dword 3 */256static inline void set_tx_desc_seq(__le32 *__txdesc, u32 __value)257{258	le32p_replace_bits((__txdesc + 3), __value, GENMASK(27, 16));259}260 261static inline void set_tx_desc_pkt_id(__le32 *__txdesc, u32 __value)262{263	le32p_replace_bits((__txdesc + 3), __value, GENMASK(31, 28));264}265 266 267/* Dword 4 */268static inline void set_tx_desc_rts_rate(__le32 *__txdesc, u32 __value)269{270	le32p_replace_bits((__txdesc + 4), __value, GENMASK(4, 0));271}272 273static inline void set_tx_desc_qos(__le32 *__txdesc, u32 __value)274{275	le32p_replace_bits((__txdesc + 4), __value, BIT(6));276}277 278static inline void set_tx_desc_hwseq_en(__le32 *__txdesc, u32 __value)279{280	le32p_replace_bits((__txdesc + 4), __value, BIT(7));281}282 283static inline void set_tx_desc_use_rate(__le32 *__txdesc, u32 __value)284{285	le32p_replace_bits((__txdesc + 4), __value, BIT(8));286}287 288static inline void set_tx_desc_disable_fb(__le32 *__txdesc, u32 __value)289{290	le32p_replace_bits((__txdesc + 4), __value, BIT(10));291}292 293static inline void set_tx_desc_cts2self(__le32 *__txdesc, u32 __value)294{295	le32p_replace_bits((__txdesc + 4), __value, BIT(11));296}297 298static inline void set_tx_desc_rts_enable(__le32 *__txdesc, u32 __value)299{300	le32p_replace_bits((__txdesc + 4), __value, BIT(12));301}302 303static inline void set_tx_desc_hw_rts_enable(__le32 *__txdesc, u32 __value)304{305	le32p_replace_bits((__txdesc + 4), __value, BIT(13));306}307 308static inline void set_tx_desc_data_sc(__le32 *__txdesc, u32 __value)309{310	le32p_replace_bits((__txdesc + 4), __value, GENMASK(21, 20));311}312 313static inline void set_tx_desc_data_bw(__le32 *__txdesc, u32 __value)314{315	le32p_replace_bits((__txdesc + 4), __value, BIT(25));316}317 318static inline void set_tx_desc_rts_short(__le32 *__txdesc, u32 __value)319{320	le32p_replace_bits((__txdesc + 4), __value, BIT(26));321}322 323static inline void set_tx_desc_rts_bw(__le32 *__txdesc, u32 __value)324{325	le32p_replace_bits((__txdesc + 4), __value, BIT(27));326}327 328static inline void set_tx_desc_rts_sc(__le32 *__txdesc, u32 __value)329{330	le32p_replace_bits((__txdesc + 4), __value, GENMASK(29, 28));331}332 333static inline void set_tx_desc_rts_stbc(__le32 *__txdesc, u32 __value)334{335	le32p_replace_bits((__txdesc + 4), __value, GENMASK(31, 30));336}337 338 339/* Dword 5 */340static inline void set_tx_desc_tx_rate(__le32 *__pdesc, u32 __val)341{342	le32p_replace_bits((__pdesc + 5), __val, GENMASK(5, 0));343}344 345static inline void set_tx_desc_data_shortgi(__le32 *__pdesc, u32 __val)346{347	le32p_replace_bits((__pdesc + 5), __val, BIT(6));348}349 350static inline void set_tx_desc_data_rate_fb_limit(__le32 *__txdesc, u32 __value)351{352	le32p_replace_bits((__txdesc + 5), __value, GENMASK(12, 8));353}354 355static inline void set_tx_desc_rts_rate_fb_limit(__le32 *__txdesc, u32 __value)356{357	le32p_replace_bits((__txdesc + 5), __value, GENMASK(16, 13));358}359 360 361/* Dword 6 */362static inline void set_tx_desc_max_agg_num(__le32 *__txdesc, u32 __value)363{364	le32p_replace_bits((__txdesc + 6), __value, GENMASK(15, 11));365}366 367 368/* Dword 7 */369static inline void set_tx_desc_tx_desc_checksum(__le32 *__txdesc, u32 __value)370{371	le32p_replace_bits((__txdesc + 7), __value, GENMASK(15, 0));372}373 374 375int  rtl8192cu_endpoint_mapping(struct ieee80211_hw *hw);376u16 rtl8192cu_mq_to_hwq(__le16 fc, u16 mac80211_queue_index);377bool rtl92cu_rx_query_desc(struct ieee80211_hw *hw,378			   struct rtl_stats *stats,379			   struct ieee80211_rx_status *rx_status,380			   u8 *p_desc, struct sk_buff *skb);381void  rtl8192cu_rx_hdl(struct ieee80211_hw *hw, struct sk_buff * skb);382void rtl8192c_tx_cleanup(struct ieee80211_hw *hw, struct sk_buff  *skb);383int rtl8192c_tx_post_hdl(struct ieee80211_hw *hw, struct urb *urb,384			 struct sk_buff *skb);385struct sk_buff *rtl8192c_tx_aggregate_hdl(struct ieee80211_hw *,386					   struct sk_buff_head *);387void rtl92cu_tx_fill_desc(struct ieee80211_hw *hw,388			  struct ieee80211_hdr *hdr, u8 *pdesc_tx,389			  u8 *pbd_desc_tx, struct ieee80211_tx_info *info,390			  struct ieee80211_sta *sta,391			  struct sk_buff *skb,392			  u8 queue_index,393			  struct rtl_tcb_desc *tcb_desc);394void rtl92cu_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,395			     struct sk_buff *skb);396 397#endif398