root/drivers/net/wireless/realtek/rtl818x/rtl818x.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  * Definitions for RTL818x hardware
   4  *
   5  * Copyright 2007 Michael Wu <flamingice@sourmilk.net>
   6  * Copyright 2007 Andrea Merello <andrea.merello@gmail.com>
   7  *
   8  * Based on the r8187 driver, which is:
   9  * Copyright 2005 Andrea Merello <andrea.merello@gmail.com>, et al.
  10  */
  11 
  12 #ifndef RTL818X_H
  13 #define RTL818X_H
  14 
  15 struct rtl818x_csr {
  16 
  17         u8      MAC[6];
  18         u8      reserved_0[2];
  19 
  20         union {
  21                 __le32  MAR[2];  /* 0x8 */
  22 
  23                 struct{ /* rtl8187se */
  24                         u8 rf_sw_config; /* 0x8 */
  25                         u8 reserved_01[3];
  26                         __le32 TMGDA; /* 0xc */
  27                 } __packed;
  28         } __packed;
  29 
  30         union { /*  0x10  */
  31                 struct {
  32                         u8      RX_FIFO_COUNT;
  33                         u8      reserved_1;
  34                         u8      TX_FIFO_COUNT;
  35                         u8      BQREQ;
  36                 } __packed;
  37 
  38                 __le32 TBKDA; /* for 8187se */
  39         } __packed;
  40 
  41         __le32 TBEDA; /* 0x14 - for rtl8187se */
  42 
  43         __le32  TSFT[2];
  44 
  45         union { /* 0x20 */
  46                 __le32  TLPDA;
  47                 __le32  TVIDA; /* for 8187se */
  48         } __packed;
  49 
  50         union { /* 0x24 */
  51                 __le32  TNPDA;
  52                 __le32  TVODA; /* for 8187se */
  53         } __packed;
  54 
  55         /* hi pri ring for all cards */
  56         __le32  THPDA; /* 0x28 */
  57 
  58         union { /* 0x2c */
  59                 struct {
  60                         u8 reserved_2a;
  61                         u8 EIFS_8187SE;
  62                 } __packed;
  63 
  64                 __le16  BRSR;
  65         } __packed;
  66 
  67         u8      BSSID[6]; /* 0x2e */
  68 
  69         union { /* 0x34 */
  70                 struct {
  71                         u8 RESP_RATE;
  72                         u8 EIFS;
  73                 } __packed;
  74                 __le16 BRSR_8187SE;
  75         } __packed;
  76 
  77         u8      reserved_3[1]; /* 0x36 */
  78         u8      CMD; /* 0x37 */
  79 #define RTL818X_CMD_TX_ENABLE           (1 << 2)
  80 #define RTL818X_CMD_RX_ENABLE           (1 << 3)
  81 #define RTL818X_CMD_RESET               (1 << 4)
  82         u8      reserved_4[4]; /* 0x38 */
  83         union {
  84                 struct {
  85                         __le16  INT_MASK;
  86                         __le16  INT_STATUS;
  87                 } __packed;
  88 
  89                 __le32  INT_STATUS_SE; /* 0x3c */
  90         } __packed;
  91 /* status bits for rtl8187 and rtl8180/8185 */
  92 #define RTL818X_INT_RX_OK               (1 <<  0)
  93 #define RTL818X_INT_RX_ERR              (1 <<  1)
  94 #define RTL818X_INT_TXL_OK              (1 <<  2)
  95 #define RTL818X_INT_TXL_ERR             (1 <<  3)
  96 #define RTL818X_INT_RX_DU               (1 <<  4)
  97 #define RTL818X_INT_RX_FO               (1 <<  5)
  98 #define RTL818X_INT_TXN_OK              (1 <<  6)
  99 #define RTL818X_INT_TXN_ERR             (1 <<  7)
 100 #define RTL818X_INT_TXH_OK              (1 <<  8)
 101 #define RTL818X_INT_TXH_ERR             (1 <<  9)
 102 #define RTL818X_INT_TXB_OK              (1 << 10)
 103 #define RTL818X_INT_TXB_ERR             (1 << 11)
 104 #define RTL818X_INT_ATIM                (1 << 12)
 105 #define RTL818X_INT_BEACON              (1 << 13)
 106 #define RTL818X_INT_TIME_OUT            (1 << 14)
 107 #define RTL818X_INT_TX_FO               (1 << 15)
 108 /* status bits for rtl8187se */
 109 #define RTL818X_INT_SE_TIMER3           (1 <<  0)
 110 #define RTL818X_INT_SE_TIMER2           (1 <<  1)
 111 #define RTL818X_INT_SE_RQ0SOR           (1 <<  2)
 112 #define RTL818X_INT_SE_TXBED_OK         (1 <<  3)
 113 #define RTL818X_INT_SE_TXBED_ERR        (1 <<  4)
 114 #define RTL818X_INT_SE_TXBE_OK          (1 <<  5)
 115 #define RTL818X_INT_SE_TXBE_ERR         (1 <<  6)
 116 #define RTL818X_INT_SE_RX_OK            (1 <<  7)
 117 #define RTL818X_INT_SE_RX_ERR           (1 <<  8)
 118 #define RTL818X_INT_SE_TXL_OK           (1 <<  9)
 119 #define RTL818X_INT_SE_TXL_ERR          (1 << 10)
 120 #define RTL818X_INT_SE_RX_DU            (1 << 11)
 121 #define RTL818X_INT_SE_RX_FIFO          (1 << 12)
 122 #define RTL818X_INT_SE_TXN_OK           (1 << 13)
 123 #define RTL818X_INT_SE_TXN_ERR          (1 << 14)
 124 #define RTL818X_INT_SE_TXH_OK           (1 << 15)
 125 #define RTL818X_INT_SE_TXH_ERR          (1 << 16)
 126 #define RTL818X_INT_SE_TXB_OK           (1 << 17)
 127 #define RTL818X_INT_SE_TXB_ERR          (1 << 18)
 128 #define RTL818X_INT_SE_ATIM_TO          (1 << 19)
 129 #define RTL818X_INT_SE_BK_TO            (1 << 20)
 130 #define RTL818X_INT_SE_TIMER1           (1 << 21)
 131 #define RTL818X_INT_SE_TX_FIFO          (1 << 22)
 132 #define RTL818X_INT_SE_WAKEUP           (1 << 23)
 133 #define RTL818X_INT_SE_BK_DMA           (1 << 24)
 134 #define RTL818X_INT_SE_TMGD_OK          (1 << 30)
 135         __le32  TX_CONF; /* 0x40 */
 136 #define RTL818X_TX_CONF_LOOPBACK_MAC    (1 << 17)
 137 #define RTL818X_TX_CONF_LOOPBACK_CONT   (3 << 17)
 138 #define RTL818X_TX_CONF_NO_ICV          (1 << 19)
 139 #define RTL818X_TX_CONF_DISCW           (1 << 20)
 140 #define RTL818X_TX_CONF_SAT_HWPLCP      (1 << 24)
 141 #define RTL818X_TX_CONF_R8180_ABCD      (2 << 25)
 142 #define RTL818X_TX_CONF_R8180_F         (3 << 25)
 143 #define RTL818X_TX_CONF_R8185_ABC       (4 << 25)
 144 #define RTL818X_TX_CONF_R8185_D         (5 << 25)
 145 #define RTL818X_TX_CONF_R8187vD         (5 << 25)
 146 #define RTL818X_TX_CONF_R8187vD_B       (6 << 25)
 147 #define RTL818X_TX_CONF_RTL8187SE       (6 << 25)
 148 #define RTL818X_TX_CONF_HWVER_MASK      (7 << 25)
 149 #define RTL818X_TX_CONF_DISREQQSIZE     (1 << 28)
 150 #define RTL818X_TX_CONF_PROBE_DTS       (1 << 29)
 151 #define RTL818X_TX_CONF_HW_SEQNUM       (1 << 30)
 152 #define RTL818X_TX_CONF_CW_MIN          (1 << 31)
 153         __le32  RX_CONF;
 154 #define RTL818X_RX_CONF_MONITOR         (1 <<  0)
 155 #define RTL818X_RX_CONF_NICMAC          (1 <<  1)
 156 #define RTL818X_RX_CONF_MULTICAST       (1 <<  2)
 157 #define RTL818X_RX_CONF_BROADCAST       (1 <<  3)
 158 #define RTL818X_RX_CONF_FCS             (1 <<  5)
 159 #define RTL818X_RX_CONF_DATA            (1 << 18)
 160 #define RTL818X_RX_CONF_CTRL            (1 << 19)
 161 #define RTL818X_RX_CONF_MGMT            (1 << 20)
 162 #define RTL818X_RX_CONF_ADDR3           (1 << 21)
 163 #define RTL818X_RX_CONF_PM              (1 << 22)
 164 #define RTL818X_RX_CONF_BSSID           (1 << 23)
 165 #define RTL818X_RX_CONF_RX_AUTORESETPHY (1 << 28)
 166 #define RTL818X_RX_CONF_CSDM1           (1 << 29)
 167 #define RTL818X_RX_CONF_CSDM2           (1 << 30)
 168 #define RTL818X_RX_CONF_ONLYERLPKT      (1 << 31)
 169         __le32  INT_TIMEOUT;
 170         __le32  TBDA;
 171         u8      EEPROM_CMD;
 172 #define RTL818X_EEPROM_CMD_READ         (1 << 0)
 173 #define RTL818X_EEPROM_CMD_WRITE        (1 << 1)
 174 #define RTL818X_EEPROM_CMD_CK           (1 << 2)
 175 #define RTL818X_EEPROM_CMD_CS           (1 << 3)
 176 #define RTL818X_EEPROM_CMD_NORMAL       (0 << 6)
 177 #define RTL818X_EEPROM_CMD_LOAD         (1 << 6)
 178 #define RTL818X_EEPROM_CMD_PROGRAM      (2 << 6)
 179 #define RTL818X_EEPROM_CMD_CONFIG       (3 << 6)
 180         u8      CONFIG0;
 181         u8      CONFIG1;
 182         u8      CONFIG2;
 183 #define RTL818X_CONFIG2_ANTENNA_DIV     (1 << 6)
 184         __le32  ANAPARAM;
 185         u8      MSR;
 186 #define RTL818X_MSR_NO_LINK             (0 << 2)
 187 #define RTL818X_MSR_ADHOC               (1 << 2)
 188 #define RTL818X_MSR_INFRA               (2 << 2)
 189 #define RTL818X_MSR_MASTER              (3 << 2)
 190 #define RTL818X_MSR_ENEDCA              (4 << 2)
 191         u8      CONFIG3;
 192 #define RTL818X_CONFIG3_ANAPARAM_WRITE  (1 << 6)
 193 #define RTL818X_CONFIG3_GNT_SELECT      (1 << 7)
 194         u8      CONFIG4;
 195 #define RTL818X_CONFIG4_POWEROFF        (1 << 6)
 196 #define RTL818X_CONFIG4_VCOOFF          (1 << 7)
 197         u8      TESTR;
 198         u8      reserved_9[2];
 199         u8      PGSELECT;
 200         u8      SECURITY;
 201         __le32  ANAPARAM2;
 202         u8      reserved_10[8];
 203         __le32  IMR;            /* 0x6c - Interrupt mask reg for 8187se */
 204 #define IMR_TMGDOK      ((1 << 30))
 205 #define IMR_DOT11HINT   ((1 << 25))     /* 802.11h Measurement Interrupt */
 206 #define IMR_BCNDMAINT   ((1 << 24))     /* Beacon DMA Interrupt */
 207 #define IMR_WAKEINT     ((1 << 23))     /* Wake Up Interrupt */
 208 #define IMR_TXFOVW      ((1 << 22))     /* Tx FIFO Overflow */
 209 #define IMR_TIMEOUT1    ((1 << 21))     /* Time Out Interrupt 1 */
 210 #define IMR_BCNINT      ((1 << 20))     /* Beacon Time out */
 211 #define IMR_ATIMINT     ((1 << 19))     /* ATIM Time Out */
 212 #define IMR_TBDER       ((1 << 18))     /* Tx Beacon Descriptor Error */
 213 #define IMR_TBDOK       ((1 << 17))     /* Tx Beacon Descriptor OK */
 214 #define IMR_THPDER      ((1 << 16))     /* Tx High Priority Descriptor Error */
 215 #define IMR_THPDOK      ((1 << 15))     /* Tx High Priority Descriptor OK */
 216 #define IMR_TVODER      ((1 << 14))     /* Tx AC_VO Descriptor Error Int */
 217 #define IMR_TVODOK      ((1 << 13))     /* Tx AC_VO Descriptor OK Interrupt */
 218 #define IMR_FOVW        ((1 << 12))     /* Rx FIFO Overflow Interrupt */
 219 #define IMR_RDU         ((1 << 11))     /* Rx Descriptor Unavailable */
 220 #define IMR_TVIDER      ((1 << 10))     /* Tx AC_VI Descriptor Error */
 221 #define IMR_TVIDOK      ((1 << 9))      /* Tx AC_VI Descriptor OK Interrupt */
 222 #define IMR_RER         ((1 << 8))      /* Rx Error Interrupt */
 223 #define IMR_ROK         ((1 << 7))      /* Receive OK Interrupt */
 224 #define IMR_TBEDER      ((1 << 6))      /* Tx AC_BE Descriptor Error */
 225 #define IMR_TBEDOK      ((1 << 5))      /* Tx AC_BE Descriptor OK */
 226 #define IMR_TBKDER      ((1 << 4))      /* Tx AC_BK Descriptor Error */
 227 #define IMR_TBKDOK      ((1 << 3))      /* Tx AC_BK Descriptor OK */
 228 #define IMR_RQOSOK      ((1 << 2))      /* Rx QoS OK Interrupt */
 229 #define IMR_TIMEOUT2    ((1 << 1))      /* Time Out Interrupt 2 */
 230 #define IMR_TIMEOUT3    ((1 << 0))      /* Time Out Interrupt 3 */
 231         __le16  BEACON_INTERVAL; /* 0x70 */
 232         __le16  ATIM_WND; /*  0x72 */
 233         __le16  BEACON_INTERVAL_TIME; /*  0x74 */
 234         __le16  ATIMTR_INTERVAL; /*  0x76 */
 235         u8      PHY_DELAY; /*  0x78 */
 236         u8      CARRIER_SENSE_COUNTER; /* 0x79 */
 237         u8      reserved_11[2]; /* 0x7a */
 238         u8      PHY[4]; /* 0x7c  */
 239         __le16  RFPinsOutput; /* 0x80 */
 240         __le16  RFPinsEnable; /* 0x82 */
 241         __le16  RFPinsSelect; /* 0x84 */
 242         __le16  RFPinsInput;  /* 0x86 */
 243         __le32  RF_PARA; /*  0x88 */
 244         __le32  RF_TIMING; /*  0x8c */
 245         u8      GP_ENABLE; /*  0x90 */
 246         u8      GPIO0; /*  0x91 */
 247         u8      GPIO1; /*  0x92 */
 248         u8      TPPOLL_STOP; /*  0x93 - rtl8187se only */
 249 #define RTL818x_TPPOLL_STOP_BQ                  (1 << 7)
 250 #define RTL818x_TPPOLL_STOP_VI                  (1 << 4)
 251 #define RTL818x_TPPOLL_STOP_VO                  (1 << 5)
 252 #define RTL818x_TPPOLL_STOP_BE                  (1 << 3)
 253 #define RTL818x_TPPOLL_STOP_BK                  (1 << 2)
 254 #define RTL818x_TPPOLL_STOP_MG                  (1 << 1)
 255 #define RTL818x_TPPOLL_STOP_HI                  (1 << 6)
 256 
 257         __le32  HSSI_PARA; /*  0x94 */
 258         u8      reserved_13[4]; /* 0x98 */
 259         u8      TX_AGC_CTL; /*  0x9c */
 260 #define RTL818X_TX_AGC_CTL_PERPACKET_GAIN       (1 << 0)
 261 #define RTL818X_TX_AGC_CTL_PERPACKET_ANTSEL     (1 << 1)
 262 #define RTL818X_TX_AGC_CTL_FEEDBACK_ANT         (1 << 2)
 263         u8      TX_GAIN_CCK;
 264         u8      TX_GAIN_OFDM;
 265         u8      TX_ANTENNA;
 266         u8      reserved_14[16];
 267         u8      WPA_CONF;
 268         u8      reserved_15[3];
 269         u8      SIFS;
 270         u8      DIFS;
 271         u8      SLOT;
 272         u8      reserved_16[5];
 273         u8      CW_CONF;
 274 #define RTL818X_CW_CONF_PERPACKET_CW    (1 << 0)
 275 #define RTL818X_CW_CONF_PERPACKET_RETRY (1 << 1)
 276         u8      CW_VAL;
 277         u8      RATE_FALLBACK;
 278 #define RTL818X_RATE_FALLBACK_ENABLE    (1 << 7)
 279         u8      ACM_CONTROL;
 280         u8      reserved_17[24];
 281         u8      CONFIG5;
 282         u8      TX_DMA_POLLING;
 283         u8      PHY_PR;
 284         u8      reserved_18;
 285         __le16  CWR;
 286         u8      RETRY_CTR;
 287         u8      reserved_19[3];
 288         __le16  INT_MIG;
 289 /* RTL818X_R8187B_*: magic numbers from ioregisters */
 290 #define RTL818X_R8187B_B        0
 291 #define RTL818X_R8187B_D        1
 292 #define RTL818X_R8187B_E        2
 293         __le32  RDSAR;
 294         __le16  TID_AC_MAP;
 295         u8      reserved_20[4];
 296         union {
 297                 __le16  ANAPARAM3; /* 0xee */
 298                 u8      ANAPARAM3A; /* for rtl8187 */
 299         };
 300 
 301 #define AC_PARAM_TXOP_LIMIT_SHIFT       16
 302 #define AC_PARAM_ECW_MAX_SHIFT          12
 303 #define AC_PARAM_ECW_MIN_SHIFT          8
 304 #define AC_PARAM_AIFS_SHIFT             0
 305 
 306         __le32 AC_VO_PARAM; /* 0xf0 */
 307 
 308         union { /* 0xf4 */
 309                 __le32 AC_VI_PARAM;
 310                 __le16 FEMR;
 311         } __packed;
 312 
 313         union{ /* 0xf8 */
 314                 __le32  AC_BE_PARAM; /* rtl8187se */
 315                 struct{
 316                         u8      reserved_21[2];
 317                         __le16  TALLY_CNT; /* 0xfa */
 318                 } __packed;
 319         } __packed;
 320 
 321         union {
 322                 u8      TALLY_SEL; /* 0xfc */
 323                 __le32  AC_BK_PARAM;
 324 
 325         } __packed;
 326 
 327 } __packed;
 328 
 329 /* These are addresses with NON-standard usage.
 330  * They have offsets very far from this struct.
 331  * I don't like to introduce a ton of "reserved"..
 332  * They are for RTL8187SE
 333  */
 334 #define REG_ADDR1(addr) ((u8 __iomem *)priv->map + (addr))
 335 #define REG_ADDR2(addr) ((__le16 __iomem *)priv->map + ((addr) >> 1))
 336 #define REG_ADDR4(addr) ((__le32 __iomem *)priv->map + ((addr) >> 2))
 337 
 338 #define FEMR_SE         REG_ADDR2(0x1D4)
 339 #define ARFR            REG_ADDR2(0x1E0)
 340 #define RFSW_CTRL       REG_ADDR2(0x272)
 341 #define SW_3W_DB0       REG_ADDR2(0x274)
 342 #define SW_3W_DB0_4     REG_ADDR4(0x274)
 343 #define SW_3W_DB1       REG_ADDR2(0x278)
 344 #define SW_3W_DB1_4     REG_ADDR4(0x278)
 345 #define SW_3W_CMD1      REG_ADDR1(0x27D)
 346 #define PI_DATA_REG     REG_ADDR2(0x360)
 347 #define SI_DATA_REG     REG_ADDR2(0x362)
 348 
 349 struct rtl818x_rf_ops {
 350         char *name;
 351         void (*init)(struct ieee80211_hw *);
 352         void (*stop)(struct ieee80211_hw *);
 353         void (*set_chan)(struct ieee80211_hw *, struct ieee80211_conf *);
 354         u8 (*calc_rssi)(u8 agc, u8 sq);
 355 };
 356 
 357 /**
 358  * enum rtl818x_tx_desc_flags - Tx/Rx flags are common between RTL818X chips
 359  *
 360  * @RTL818X_TX_DESC_FLAG_NO_ENC: Disable hardware based encryption.
 361  * @RTL818X_TX_DESC_FLAG_TX_OK: TX frame was ACKed.
 362  * @RTL818X_TX_DESC_FLAG_SPLCP: Use short preamble.
 363  * @RTL818X_TX_DESC_FLAG_MOREFRAG: More fragments follow.
 364  * @RTL818X_TX_DESC_FLAG_CTS: Use CTS-to-self protection.
 365  * @RTL818X_TX_DESC_FLAG_RTS: Use RTS/CTS protection.
 366  * @RTL818X_TX_DESC_FLAG_LS: Last segment of the frame.
 367  * @RTL818X_TX_DESC_FLAG_FS: First segment of the frame.
 368  */
 369 enum rtl818x_tx_desc_flags {
 370         RTL818X_TX_DESC_FLAG_NO_ENC     = (1 << 15),
 371         RTL818X_TX_DESC_FLAG_TX_OK      = (1 << 15),
 372         RTL818X_TX_DESC_FLAG_SPLCP      = (1 << 16),
 373         RTL818X_TX_DESC_FLAG_RX_UNDER   = (1 << 16),
 374         RTL818X_TX_DESC_FLAG_MOREFRAG   = (1 << 17),
 375         RTL818X_TX_DESC_FLAG_CTS        = (1 << 18),
 376         RTL818X_TX_DESC_FLAG_RTS        = (1 << 23),
 377         RTL818X_TX_DESC_FLAG_LS         = (1 << 28),
 378         RTL818X_TX_DESC_FLAG_FS         = (1 << 29),
 379         RTL818X_TX_DESC_FLAG_DMA        = (1 << 30),
 380         RTL818X_TX_DESC_FLAG_OWN        = (1 << 31)
 381 };
 382 
 383 enum rtl818x_rx_desc_flags {
 384         RTL818X_RX_DESC_FLAG_ICV_ERR    = (1 << 12),
 385         RTL818X_RX_DESC_FLAG_CRC32_ERR  = (1 << 13),
 386         RTL818X_RX_DESC_FLAG_PM         = (1 << 14),
 387         RTL818X_RX_DESC_FLAG_RX_ERR     = (1 << 15),
 388         RTL818X_RX_DESC_FLAG_BCAST      = (1 << 16),
 389         RTL818X_RX_DESC_FLAG_PAM        = (1 << 17),
 390         RTL818X_RX_DESC_FLAG_MCAST      = (1 << 18),
 391         RTL818X_RX_DESC_FLAG_QOS        = (1 << 19), /* RTL8187(B) only */
 392         RTL818X_RX_DESC_FLAG_TRSW       = (1 << 24), /* RTL8187(B) only */
 393         RTL818X_RX_DESC_FLAG_SPLCP      = (1 << 25),
 394         RTL818X_RX_DESC_FLAG_FOF        = (1 << 26),
 395         RTL818X_RX_DESC_FLAG_DMA_FAIL   = (1 << 27),
 396         RTL818X_RX_DESC_FLAG_LS         = (1 << 28),
 397         RTL818X_RX_DESC_FLAG_FS         = (1 << 29),
 398         RTL818X_RX_DESC_FLAG_EOR        = (1 << 30),
 399         RTL818X_RX_DESC_FLAG_OWN        = (1 << 31)
 400 };
 401 
 402 #endif /* RTL818X_H */

/* [<][>][^][v][top][bottom][index][help] */