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