1 /* 2 * Definitions for RTL818x hardware 3 * 4 * Copyright 2007 Michael Wu <flamingice (at) sourmilk.net> 5 * Copyright 2007 Andrea Merello <andreamrl (at) tiscali.it> 6 * 7 * Modified for gPXE, June 2009, by Joshua Oreman <oremanj (at) rwcr.net> 8 * 9 * Based on the r8187 driver, which is: 10 * Copyright 2005 Andrea Merello <andreamrl (at) tiscali.it>, et al. 11 * 12 * This program is free software; you can redistribute it and/or modify 13 * it under the terms of the GNU General Public License version 2 as 14 * published by the Free Software Foundation. 15 */ 16 17 #ifndef RTL818X_H 18 #define RTL818X_H 19 20 #include <gpxe/spi_bit.h> 21 #include <gpxe/tables.h> 22 23 FILE_LICENCE(GPL2_ONLY); 24 25 struct rtl818x_csr { 26 u8 MAC[6]; 27 u8 reserved_0[2]; 28 u32 MAR[2]; 29 u8 RX_FIFO_COUNT; 30 u8 reserved_1; 31 u8 TX_FIFO_COUNT; 32 u8 BQREQ; 33 u8 reserved_2[4]; 34 u32 TSFT[2]; 35 u32 TLPDA; 36 u32 TNPDA; 37 u32 THPDA; 38 u16 BRSR; 39 u8 BSSID[6]; 40 u8 RESP_RATE; 41 u8 EIFS; 42 u8 reserved_3[1]; 43 u8 CMD; 44 #define RTL818X_CMD_TX_ENABLE (1 << 2) 45 #define RTL818X_CMD_RX_ENABLE (1 << 3) 46 #define RTL818X_CMD_RESET (1 << 4) 47 u8 reserved_4[4]; 48 u16 INT_MASK; 49 u16 INT_STATUS; 50 #define RTL818X_INT_RX_OK (1 << 0) 51 #define RTL818X_INT_RX_ERR (1 << 1) 52 #define RTL818X_INT_TXL_OK (1 << 2) 53 #define RTL818X_INT_TXL_ERR (1 << 3) 54 #define RTL818X_INT_RX_DU (1 << 4) 55 #define RTL818X_INT_RX_FO (1 << 5) 56 #define RTL818X_INT_TXN_OK (1 << 6) 57 #define RTL818X_INT_TXN_ERR (1 << 7) 58 #define RTL818X_INT_TXH_OK (1 << 8) 59 #define RTL818X_INT_TXH_ERR (1 << 9) 60 #define RTL818X_INT_TXB_OK (1 << 10) 61 #define RTL818X_INT_TXB_ERR (1 << 11) 62 #define RTL818X_INT_ATIM (1 << 12) 63 #define RTL818X_INT_BEACON (1 << 13) 64 #define RTL818X_INT_TIME_OUT (1 << 14) 65 #define RTL818X_INT_TX_FO (1 << 15) 66 u32 TX_CONF; 67 #define RTL818X_TX_CONF_LOOPBACK_MAC (1 << 17) 68 #define RTL818X_TX_CONF_LOOPBACK_CONT (3 << 17) 69 #define RTL818X_TX_CONF_NO_ICV (1 << 19) 70 #define RTL818X_TX_CONF_DISCW (1 << 20) 71 #define RTL818X_TX_CONF_SAT_HWPLCP (1 << 24) 72 #define RTL818X_TX_CONF_R8180_ABCD (2 << 25) 73 #define RTL818X_TX_CONF_R8180_F (3 << 25) 74 #define RTL818X_TX_CONF_R8185_ABC (4 << 25) 75 #define RTL818X_TX_CONF_R8185_D (5 << 25) 76 #define RTL818X_TX_CONF_R8187vD (5 << 25) 77 #define RTL818X_TX_CONF_R8187vD_B (6 << 25) 78 #define RTL818X_TX_CONF_HWVER_MASK (7 << 25) 79 #define RTL818X_TX_CONF_DISREQQSIZE (1 << 28) 80 #define RTL818X_TX_CONF_PROBE_DTS (1 << 29) 81 #define RTL818X_TX_CONF_HW_SEQNUM (1 << 30) 82 #define RTL818X_TX_CONF_CW_MIN (1 << 31) 83 u32 RX_CONF; 84 #define RTL818X_RX_CONF_MONITOR (1 << 0) 85 #define RTL818X_RX_CONF_NICMAC (1 << 1) 86 #define RTL818X_RX_CONF_MULTICAST (1 << 2) 87 #define RTL818X_RX_CONF_BROADCAST (1 << 3) 88 #define RTL818X_RX_CONF_FCS (1 << 5) 89 #define RTL818X_RX_CONF_DATA (1 << 18) 90 #define RTL818X_RX_CONF_CTRL (1 << 19) 91 #define RTL818X_RX_CONF_MGMT (1 << 20) 92 #define RTL818X_RX_CONF_ADDR3 (1 << 21) 93 #define RTL818X_RX_CONF_PM (1 << 22) 94 #define RTL818X_RX_CONF_BSSID (1 << 23) 95 #define RTL818X_RX_CONF_RX_AUTORESETPHY (1 << 28) 96 #define RTL818X_RX_CONF_CSDM1 (1 << 29) 97 #define RTL818X_RX_CONF_CSDM2 (1 << 30) 98 #define RTL818X_RX_CONF_ONLYERLPKT (1 << 31) 99 u32 INT_TIMEOUT; 100 u32 TBDA; 101 u8 EEPROM_CMD; 102 #define RTL818X_EEPROM_CMD_READ (1 << 0) 103 #define RTL818X_EEPROM_CMD_WRITE (1 << 1) 104 #define RTL818X_EEPROM_CMD_CK (1 << 2) 105 #define RTL818X_EEPROM_CMD_CS (1 << 3) 106 #define RTL818X_EEPROM_CMD_NORMAL (0 << 6) 107 #define RTL818X_EEPROM_CMD_LOAD (1 << 6) 108 #define RTL818X_EEPROM_CMD_PROGRAM (2 << 6) 109 #define RTL818X_EEPROM_CMD_CONFIG (3 << 6) 110 u8 CONFIG0; 111 u8 CONFIG1; 112 u8 CONFIG2; 113 #define RTL818X_CONFIG2_ANTENNA_DIV (1 << 6) 114 u32 ANAPARAM; 115 u8 MSR; 116 #define RTL818X_MSR_NO_LINK (0 << 2) 117 #define RTL818X_MSR_ADHOC (1 << 2) 118 #define RTL818X_MSR_INFRA (2 << 2) 119 #define RTL818X_MSR_MASTER (3 << 2) 120 #define RTL818X_MSR_ENEDCA (4 << 2) 121 u8 CONFIG3; 122 #define RTL818X_CONFIG3_ANAPARAM_WRITE (1 << 6) 123 #define RTL818X_CONFIG3_GNT_SELECT (1 << 7) 124 u8 CONFIG4; 125 #define RTL818X_CONFIG4_POWEROFF (1 << 6) 126 #define RTL818X_CONFIG4_VCOOFF (1 << 7) 127 u8 TESTR; 128 u8 reserved_9[2]; 129 u8 PGSELECT; 130 u8 SECURITY; 131 u32 ANAPARAM2; 132 u8 reserved_10[12]; 133 u16 BEACON_INTERVAL; 134 u16 ATIM_WND; 135 u16 BEACON_INTERVAL_TIME; 136 u16 ATIMTR_INTERVAL; 137 u8 PHY_DELAY; 138 u8 CARRIER_SENSE_COUNTER; 139 u8 reserved_11[2]; 140 u8 PHY[4]; 141 u16 RFPinsOutput; 142 u16 RFPinsEnable; 143 u16 RFPinsSelect; 144 u16 RFPinsInput; 145 u32 RF_PARA; 146 u32 RF_TIMING; 147 u8 GP_ENABLE; 148 u8 GPIO; 149 u8 reserved_12[2]; 150 u32 HSSI_PARA; 151 u8 reserved_13[4]; 152 u8 TX_AGC_CTL; 153 #define RTL818X_TX_AGC_CTL_PERPACKET_GAIN_SHIFT (1 << 0) 154 #define RTL818X_TX_AGC_CTL_PERPACKET_ANTSEL_SHIFT (1 << 1) 155 #define RTL818X_TX_AGC_CTL_FEEDBACK_ANT (1 << 2) 156 u8 TX_GAIN_CCK; 157 u8 TX_GAIN_OFDM; 158 u8 TX_ANTENNA; 159 u8 reserved_14[16]; 160 u8 WPA_CONF; 161 u8 reserved_15[3]; 162 u8 SIFS; 163 u8 DIFS; 164 u8 SLOT; 165 u8 reserved_16[5]; 166 u8 CW_CONF; 167 #define RTL818X_CW_CONF_PERPACKET_CW_SHIFT (1 << 0) 168 #define RTL818X_CW_CONF_PERPACKET_RETRY_SHIFT (1 << 1) 169 u8 CW_VAL; 170 u8 RATE_FALLBACK; 171 #define RTL818X_RATE_FALLBACK_ENABLE (1 << 7) 172 u8 ACM_CONTROL; 173 u8 reserved_17[24]; 174 u8 CONFIG5; 175 u8 TX_DMA_POLLING; 176 u8 reserved_18[2]; 177 u16 CWR; 178 u8 RETRY_CTR; 179 u8 reserved_19[3]; 180 u16 INT_MIG; 181 /* RTL818X_R8187B_*: magic numbers from ioregisters */ 182 #define RTL818X_R8187B_B 0 183 #define RTL818X_R8187B_D 1 184 #define RTL818X_R8187B_E 2 185 u32 RDSAR; 186 u16 TID_AC_MAP; 187 u8 reserved_20[4]; 188 u8 ANAPARAM3; 189 u8 reserved_21[5]; 190 u16 FEMR; 191 u8 reserved_22[4]; 192 u16 TALLY_CNT; 193 u8 TALLY_SEL; 194 } __attribute__((packed)); 195 196 #define MAX_RX_SIZE IEEE80211_MAX_FRAME_LEN 197 198 #define RF_PARAM_ANALOGPHY (1 << 0) 199 #define RF_PARAM_ANTBDEFAULT (1 << 1) 200 #define RF_PARAM_CARRIERSENSE1 (1 << 2) 201 #define RF_PARAM_CARRIERSENSE2 (1 << 3) 202 203 #define BB_ANTATTEN_CHAN14 0x0C 204 #define BB_ANTENNA_B 0x40 205 206 #define BB_HOST_BANG (1 << 30) 207 #define BB_HOST_BANG_EN (1 << 2) 208 #define BB_HOST_BANG_CLK (1 << 1) 209 #define BB_HOST_BANG_DATA 1 210 211 #define ANAPARAM_TXDACOFF_SHIFT 27 212 #define ANAPARAM_PWR0_SHIFT 28 213 #define ANAPARAM_PWR0_MASK (0x07 << ANAPARAM_PWR0_SHIFT) 214 #define ANAPARAM_PWR1_SHIFT 20 215 #define ANAPARAM_PWR1_MASK (0x7F << ANAPARAM_PWR1_SHIFT) 216 217 #define RTL818X_RX_RING_SIZE 8 /* doesn't have to be a power of 2 */ 218 #define RTL818X_TX_RING_SIZE 8 /* nor this [but 2^n is very slightly faster] */ 219 #define RTL818X_RING_ALIGN 256 220 221 #define RTL818X_MAX_RETRIES 4 222 223 enum rtl818x_tx_desc_flags { 224 RTL818X_TX_DESC_FLAG_NO_ENC = (1 << 15), 225 RTL818X_TX_DESC_FLAG_TX_OK = (1 << 15), 226 RTL818X_TX_DESC_FLAG_SPLCP = (1 << 16), 227 RTL818X_TX_DESC_FLAG_RX_UNDER = (1 << 16), 228 RTL818X_TX_DESC_FLAG_MOREFRAG = (1 << 17), 229 RTL818X_TX_DESC_FLAG_CTS = (1 << 18), 230 RTL818X_TX_DESC_FLAG_RTS = (1 << 23), 231 RTL818X_TX_DESC_FLAG_LS = (1 << 28), 232 RTL818X_TX_DESC_FLAG_FS = (1 << 29), 233 RTL818X_TX_DESC_FLAG_DMA = (1 << 30), 234 RTL818X_TX_DESC_FLAG_OWN = (1 << 31) 235 }; 236 237 struct rtl818x_tx_desc { 238 u32 flags; 239 u16 rts_duration; 240 u16 plcp_len; 241 u32 tx_buf; 242 u32 frame_len; 243 u32 next_tx_desc; 244 u8 cw; 245 u8 retry_limit; 246 u8 agc; 247 u8 flags2; 248 u32 reserved[2]; 249 } __attribute__ ((packed)); 250 251 enum rtl818x_rx_desc_flags { 252 RTL818X_RX_DESC_FLAG_ICV_ERR = (1 << 12), 253 RTL818X_RX_DESC_FLAG_CRC32_ERR = (1 << 13), 254 RTL818X_RX_DESC_FLAG_PM = (1 << 14), 255 RTL818X_RX_DESC_FLAG_RX_ERR = (1 << 15), 256 RTL818X_RX_DESC_FLAG_BCAST = (1 << 16), 257 RTL818X_RX_DESC_FLAG_PAM = (1 << 17), 258 RTL818X_RX_DESC_FLAG_MCAST = (1 << 18), 259 RTL818X_RX_DESC_FLAG_QOS = (1 << 19), /* RTL8187(B) only */ 260 RTL818X_RX_DESC_FLAG_TRSW = (1 << 24), /* RTL8187(B) only */ 261 RTL818X_RX_DESC_FLAG_SPLCP = (1 << 25), 262 RTL818X_RX_DESC_FLAG_FOF = (1 << 26), 263 RTL818X_RX_DESC_FLAG_DMA_FAIL = (1 << 27), 264 RTL818X_RX_DESC_FLAG_LS = (1 << 28), 265 RTL818X_RX_DESC_FLAG_FS = (1 << 29), 266 RTL818X_RX_DESC_FLAG_EOR = (1 << 30), 267 RTL818X_RX_DESC_FLAG_OWN = (1 << 31) 268 }; 269 270 struct rtl818x_rx_desc { 271 u32 flags; 272 u32 flags2; 273 union { 274 u32 rx_buf; 275 u64 tsft; 276 }; 277 } __attribute__ ((packed)); 278 279 struct rtl818x_priv { 280 struct rtl818x_csr *map; 281 const struct rtl818x_rf_ops *rf; 282 int rf_flag; /* whatever RF driver wishes to use it for */ 283 int hw_rate; 284 int hw_rtscts_rate; 285 286 struct spi_bit_basher spibit; 287 struct spi_device eeprom; 288 289 struct rtl818x_rx_desc *rx_ring; 290 u32 rx_ring_dma; 291 unsigned int rx_idx; /* next desc to be filled by card */ 292 struct io_buffer *rx_buf[RTL818X_RX_RING_SIZE]; 293 294 struct rtl818x_tx_desc *tx_ring; 295 u32 tx_ring_dma; 296 unsigned int tx_cons; /* next desc to be filled by card */ 297 unsigned int tx_prod; /* next desc to be filled by driver */ 298 struct io_buffer *tx_buf[RTL818X_TX_RING_SIZE]; 299 300 struct pci_device *pdev; 301 u32 rx_conf; 302 303 u16 txpower[14]; 304 305 int r8185; 306 u32 anaparam; 307 u16 rfparam; 308 u8 csthreshold; 309 }; 310 311 void rtl818x_write_phy(struct net80211_device *dev, u8 addr, u32 data); 312 void rtl818x_set_anaparam(struct rtl818x_priv *priv, u32 anaparam); 313 314 static inline u8 rtl818x_ioread8(struct rtl818x_priv *priv __unused, u8 *addr) 315 { 316 return inb(addr); 317 } 318 319 static inline u16 rtl818x_ioread16(struct rtl818x_priv *priv __unused, u16 *addr) 320 { 321 return inw(addr); 322 } 323 324 static inline u32 rtl818x_ioread32(struct rtl818x_priv *priv __unused, u32 *addr) 325 { 326 return inl(addr); 327 } 328 329 static inline void rtl818x_iowrite8(struct rtl818x_priv *priv __unused, 330 u8 *addr, u8 val) 331 { 332 outb(val, addr); 333 } 334 335 static inline void rtl818x_iowrite16(struct rtl818x_priv *priv __unused, 336 u16 *addr, u16 val) 337 { 338 outw(val, addr); 339 } 340 341 static inline void rtl818x_iowrite32(struct rtl818x_priv *priv __unused, 342 u32 *addr, u32 val) 343 { 344 outl(val, addr); 345 } 346 347 #define RTL818X_RF_DRIVERS __table(struct rtl818x_rf_ops, "rtl818x_rf_drivers") 348 #define __rtl818x_rf_driver __table_entry(RTL818X_RF_DRIVERS, 01) 349 350 struct rtl818x_rf_ops { 351 char *name; 352 u8 id; /* as identified in EEPROM */ 353 void (*init)(struct net80211_device *dev); 354 void (*stop)(struct net80211_device *dev); 355 void (*set_chan)(struct net80211_device *dev, struct net80211_channel *chan); 356 void (*conf_erp)(struct net80211_device *dev); /* set based on dev->erp_flags */ 357 }; 358 359 #endif /* RTL818X_H */ 360