00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef _ATH5K_H
00022 #define _ATH5K_H
00023
00024 FILE_LICENCE ( MIT );
00025
00026 #include <stddef.h>
00027 #include <byteswap.h>
00028 #include <gpxe/io.h>
00029 #include <gpxe/netdevice.h>
00030 #include <gpxe/net80211.h>
00031 #include <errno.h>
00032
00033
00034 #undef ERRFILE
00035 #define ERRFILE ERRFILE_ath5k
00036
00037 #define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0]))
00038
00039
00040 #include "desc.h"
00041
00042
00043 #include "eeprom.h"
00044
00045
00046 #define PCI_DEVICE_ID_ATHEROS_AR5210 0x0007
00047 #define PCI_DEVICE_ID_ATHEROS_AR5311 0x0011
00048 #define PCI_DEVICE_ID_ATHEROS_AR5211 0x0012
00049 #define PCI_DEVICE_ID_ATHEROS_AR5212 0x0013
00050 #define PCI_DEVICE_ID_3COM_3CRDAG675 0x0013
00051 #define PCI_DEVICE_ID_3COM_2_3CRPAG175 0x0013
00052 #define PCI_DEVICE_ID_ATHEROS_AR5210_AP 0x0207
00053 #define PCI_DEVICE_ID_ATHEROS_AR5212_IBM 0x1014
00054 #define PCI_DEVICE_ID_ATHEROS_AR5210_DEFAULT 0x1107
00055 #define PCI_DEVICE_ID_ATHEROS_AR5212_DEFAULT 0x1113
00056 #define PCI_DEVICE_ID_ATHEROS_AR5211_DEFAULT 0x1112
00057 #define PCI_DEVICE_ID_ATHEROS_AR5212_FPGA 0xf013
00058 #define PCI_DEVICE_ID_ATHEROS_AR5211_LEGACY 0xff12
00059 #define PCI_DEVICE_ID_ATHEROS_AR5211_FPGA11B 0xf11b
00060 #define PCI_DEVICE_ID_ATHEROS_AR5312_REV2 0x0052
00061 #define PCI_DEVICE_ID_ATHEROS_AR5312_REV7 0x0057
00062 #define PCI_DEVICE_ID_ATHEROS_AR5312_REV8 0x0058
00063 #define PCI_DEVICE_ID_ATHEROS_AR5212_0014 0x0014
00064 #define PCI_DEVICE_ID_ATHEROS_AR5212_0015 0x0015
00065 #define PCI_DEVICE_ID_ATHEROS_AR5212_0016 0x0016
00066 #define PCI_DEVICE_ID_ATHEROS_AR5212_0017 0x0017
00067 #define PCI_DEVICE_ID_ATHEROS_AR5212_0018 0x0018
00068 #define PCI_DEVICE_ID_ATHEROS_AR5212_0019 0x0019
00069 #define PCI_DEVICE_ID_ATHEROS_AR2413 0x001a
00070 #define PCI_DEVICE_ID_ATHEROS_AR5413 0x001b
00071 #define PCI_DEVICE_ID_ATHEROS_AR5424 0x001c
00072 #define PCI_DEVICE_ID_ATHEROS_AR5416 0x0023
00073 #define PCI_DEVICE_ID_ATHEROS_AR5418 0x0024
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 #define AR5K_REG_SM(_val, _flags) \
00087 (((_val) << _flags##_S) & (_flags))
00088
00089
00090 #define AR5K_REG_MS(_val, _flags) \
00091 (((_val) & (_flags)) >> _flags##_S)
00092
00093
00094
00095
00096
00097
00098 #define AR5K_REG_WRITE_BITS(ah, _reg, _flags, _val) \
00099 ath5k_hw_reg_write(ah, (ath5k_hw_reg_read(ah, _reg) & ~(_flags)) | \
00100 (((_val) << _flags##_S) & (_flags)), _reg)
00101
00102 #define AR5K_REG_MASKED_BITS(ah, _reg, _flags, _mask) \
00103 ath5k_hw_reg_write(ah, (ath5k_hw_reg_read(ah, _reg) & \
00104 (_mask)) | (_flags), _reg)
00105
00106 #define AR5K_REG_ENABLE_BITS(ah, _reg, _flags) \
00107 ath5k_hw_reg_write(ah, ath5k_hw_reg_read(ah, _reg) | (_flags), _reg)
00108
00109 #define AR5K_REG_DISABLE_BITS(ah, _reg, _flags) \
00110 ath5k_hw_reg_write(ah, ath5k_hw_reg_read(ah, _reg) & ~(_flags), _reg)
00111
00112
00113 #define AR5K_PHY_READ(ah, _reg) \
00114 ath5k_hw_reg_read(ah, (ah)->ah_phy + ((_reg) << 2))
00115
00116 #define AR5K_PHY_WRITE(ah, _reg, _val) \
00117 ath5k_hw_reg_write(ah, _val, (ah)->ah_phy + ((_reg) << 2))
00118
00119
00120 #define AR5K_REG_READ_Q(ah, _reg, _queue) \
00121 (ath5k_hw_reg_read(ah, _reg) & (1 << _queue)) \
00122
00123 #define AR5K_REG_WRITE_Q(ah, _reg, _queue) \
00124 ath5k_hw_reg_write(ah, (1 << _queue), _reg)
00125
00126 #define AR5K_Q_ENABLE_BITS(_reg, _queue) do { \
00127 _reg |= 1 << _queue; \
00128 } while (0)
00129
00130 #define AR5K_Q_DISABLE_BITS(_reg, _queue) do { \
00131 _reg &= ~(1 << _queue); \
00132 } while (0)
00133
00134
00135 #define AR5K_REG_WAIT(_i) do { \
00136 if (_i % 64) \
00137 udelay(1); \
00138 } while (0)
00139
00140
00141 #define AR5K_INI_RFGAIN_5GHZ 0
00142 #define AR5K_INI_RFGAIN_2GHZ 1
00143
00144
00145 #define AR5K_INI_VAL_11A 0
00146 #define AR5K_INI_VAL_11A_TURBO 1
00147 #define AR5K_INI_VAL_11B 2
00148 #define AR5K_INI_VAL_11G 3
00149 #define AR5K_INI_VAL_11G_TURBO 4
00150 #define AR5K_INI_VAL_XR 0
00151 #define AR5K_INI_VAL_MAX 5
00152
00153
00154 #define AR5K_LOW_ID(_a)( \
00155 (_a)[0] | (_a)[1] << 8 | (_a)[2] << 16 | (_a)[3] << 24 \
00156 )
00157
00158 #define AR5K_HIGH_ID(_a) ((_a)[4] | (_a)[5] << 8)
00159
00160 #define IEEE80211_MAX_LEN 2352
00161
00162
00163
00164
00165 #define AR5K_TUNE_DMA_BEACON_RESP 2
00166 #define AR5K_TUNE_SW_BEACON_RESP 10
00167 #define AR5K_TUNE_ADDITIONAL_SWBA_BACKOFF 0
00168 #define AR5K_TUNE_RADAR_ALERT 0
00169 #define AR5K_TUNE_MIN_TX_FIFO_THRES 1
00170 #define AR5K_TUNE_MAX_TX_FIFO_THRES ((IEEE80211_MAX_LEN / 64) + 1)
00171 #define AR5K_TUNE_REGISTER_TIMEOUT 20000
00172
00173
00174 #define AR5K_TUNE_RSSI_THRES 129
00175
00176
00177
00178
00179
00180 #define AR5K_TUNE_BMISS_THRES 7
00181 #define AR5K_TUNE_REGISTER_DWELL_TIME 20000
00182 #define AR5K_TUNE_BEACON_INTERVAL 100
00183 #define AR5K_TUNE_AIFS 2
00184 #define AR5K_TUNE_AIFS_11B 2
00185 #define AR5K_TUNE_AIFS_XR 0
00186 #define AR5K_TUNE_CWMIN 15
00187 #define AR5K_TUNE_CWMIN_11B 31
00188 #define AR5K_TUNE_CWMIN_XR 3
00189 #define AR5K_TUNE_CWMAX 1023
00190 #define AR5K_TUNE_CWMAX_11B 1023
00191 #define AR5K_TUNE_CWMAX_XR 7
00192 #define AR5K_TUNE_NOISE_FLOOR -72
00193 #define AR5K_TUNE_MAX_TXPOWER 63
00194 #define AR5K_TUNE_DEFAULT_TXPOWER 25
00195 #define AR5K_TUNE_TPC_TXPOWER 0
00196 #define AR5K_TUNE_ANT_DIVERSITY 1
00197 #define AR5K_TUNE_HWTXTRIES 4
00198
00199 #define AR5K_INIT_CARR_SENSE_EN 1
00200
00201
00202 #if __BYTE_ORDER == __BIG_ENDIAN
00203 #define AR5K_INIT_CFG ( \
00204 AR5K_CFG_SWTD | AR5K_CFG_SWRD \
00205 )
00206 #else
00207 #define AR5K_INIT_CFG 0x00000000
00208 #endif
00209
00210
00211 #define AR5K_INIT_CYCRSSI_THR1 2
00212 #define AR5K_INIT_TX_LATENCY 502
00213 #define AR5K_INIT_USEC 39
00214 #define AR5K_INIT_USEC_TURBO 79
00215 #define AR5K_INIT_USEC_32 31
00216 #define AR5K_INIT_SLOT_TIME 396
00217 #define AR5K_INIT_SLOT_TIME_TURBO 480
00218 #define AR5K_INIT_ACK_CTS_TIMEOUT 1024
00219 #define AR5K_INIT_ACK_CTS_TIMEOUT_TURBO 0x08000800
00220 #define AR5K_INIT_PROG_IFS 920
00221 #define AR5K_INIT_PROG_IFS_TURBO 960
00222 #define AR5K_INIT_EIFS 3440
00223 #define AR5K_INIT_EIFS_TURBO 6880
00224 #define AR5K_INIT_SIFS 560
00225 #define AR5K_INIT_SIFS_TURBO 480
00226 #define AR5K_INIT_SH_RETRY 10
00227 #define AR5K_INIT_LG_RETRY AR5K_INIT_SH_RETRY
00228 #define AR5K_INIT_SSH_RETRY 32
00229 #define AR5K_INIT_SLG_RETRY AR5K_INIT_SSH_RETRY
00230 #define AR5K_INIT_TX_RETRY 10
00231
00232 #define AR5K_INIT_TRANSMIT_LATENCY ( \
00233 (AR5K_INIT_TX_LATENCY << 14) | (AR5K_INIT_USEC_32 << 7) | \
00234 (AR5K_INIT_USEC) \
00235 )
00236 #define AR5K_INIT_TRANSMIT_LATENCY_TURBO ( \
00237 (AR5K_INIT_TX_LATENCY << 14) | (AR5K_INIT_USEC_32 << 7) | \
00238 (AR5K_INIT_USEC_TURBO) \
00239 )
00240 #define AR5K_INIT_PROTO_TIME_CNTRL ( \
00241 (AR5K_INIT_CARR_SENSE_EN << 26) | (AR5K_INIT_EIFS << 12) | \
00242 (AR5K_INIT_PROG_IFS) \
00243 )
00244 #define AR5K_INIT_PROTO_TIME_CNTRL_TURBO ( \
00245 (AR5K_INIT_CARR_SENSE_EN << 26) | (AR5K_INIT_EIFS_TURBO << 12) | \
00246 (AR5K_INIT_PROG_IFS_TURBO) \
00247 )
00248
00249
00250 #define AR5K_TXQ_USEDEFAULT ((u32) -1)
00251
00252
00253
00254
00255 enum ath5k_version {
00256 AR5K_AR5210 = 0,
00257 AR5K_AR5211 = 1,
00258 AR5K_AR5212 = 2,
00259 };
00260
00261
00262 enum ath5k_radio {
00263 AR5K_RF5110 = 0,
00264 AR5K_RF5111 = 1,
00265 AR5K_RF5112 = 2,
00266 AR5K_RF2413 = 3,
00267 AR5K_RF5413 = 4,
00268 AR5K_RF2316 = 5,
00269 AR5K_RF2317 = 6,
00270 AR5K_RF2425 = 7,
00271 };
00272
00273
00274
00275
00276
00277 enum ath5k_srev_type {
00278 AR5K_VERSION_MAC,
00279 AR5K_VERSION_RAD,
00280 };
00281
00282 struct ath5k_srev_name {
00283 const char *sr_name;
00284 enum ath5k_srev_type sr_type;
00285 unsigned sr_val;
00286 };
00287
00288 #define AR5K_SREV_UNKNOWN 0xffff
00289
00290 #define AR5K_SREV_AR5210 0x00
00291 #define AR5K_SREV_AR5311 0x10
00292 #define AR5K_SREV_AR5311A 0x20
00293 #define AR5K_SREV_AR5311B 0x30
00294 #define AR5K_SREV_AR5211 0x40
00295 #define AR5K_SREV_AR5212 0x50
00296 #define AR5K_SREV_AR5213 0x55
00297 #define AR5K_SREV_AR5213A 0x59
00298 #define AR5K_SREV_AR2413 0x78
00299 #define AR5K_SREV_AR2414 0x70
00300 #define AR5K_SREV_AR5424 0x90
00301 #define AR5K_SREV_AR5413 0xa4
00302 #define AR5K_SREV_AR5414 0xa0
00303 #define AR5K_SREV_AR2415 0xb0
00304 #define AR5K_SREV_AR5416 0xc0
00305 #define AR5K_SREV_AR5418 0xca
00306 #define AR5K_SREV_AR2425 0xe0
00307 #define AR5K_SREV_AR2417 0xf0
00308
00309 #define AR5K_SREV_RAD_5110 0x00
00310 #define AR5K_SREV_RAD_5111 0x10
00311 #define AR5K_SREV_RAD_5111A 0x15
00312 #define AR5K_SREV_RAD_2111 0x20
00313 #define AR5K_SREV_RAD_5112 0x30
00314 #define AR5K_SREV_RAD_5112A 0x35
00315 #define AR5K_SREV_RAD_5112B 0x36
00316 #define AR5K_SREV_RAD_2112 0x40
00317 #define AR5K_SREV_RAD_2112A 0x45
00318 #define AR5K_SREV_RAD_2112B 0x46
00319 #define AR5K_SREV_RAD_2413 0x50
00320 #define AR5K_SREV_RAD_5413 0x60
00321 #define AR5K_SREV_RAD_2316 0x70
00322 #define AR5K_SREV_RAD_2317 0x80
00323 #define AR5K_SREV_RAD_5424 0xa0
00324 #define AR5K_SREV_RAD_2425 0xa2
00325 #define AR5K_SREV_RAD_5133 0xc0
00326
00327 #define AR5K_SREV_PHY_5211 0x30
00328 #define AR5K_SREV_PHY_5212 0x41
00329 #define AR5K_SREV_PHY_5212A 0x42
00330 #define AR5K_SREV_PHY_5212B 0x43
00331 #define AR5K_SREV_PHY_2413 0x45
00332 #define AR5K_SREV_PHY_5413 0x61
00333 #define AR5K_SREV_PHY_2425 0x70
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351 #define MODULATION_XR 0x00000200
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391 #define MODULATION_TURBO 0x00000080
00392
00393 enum ath5k_driver_mode {
00394 AR5K_MODE_11A = 0,
00395 AR5K_MODE_11A_TURBO = 1,
00396 AR5K_MODE_11B = 2,
00397 AR5K_MODE_11G = 3,
00398 AR5K_MODE_11G_TURBO = 4,
00399 AR5K_MODE_XR = 5,
00400 };
00401
00402 enum {
00403 AR5K_MODE_BIT_11A = (1 << AR5K_MODE_11A),
00404 AR5K_MODE_BIT_11A_TURBO = (1 << AR5K_MODE_11A_TURBO),
00405 AR5K_MODE_BIT_11B = (1 << AR5K_MODE_11B),
00406 AR5K_MODE_BIT_11G = (1 << AR5K_MODE_11G),
00407 AR5K_MODE_BIT_11G_TURBO = (1 << AR5K_MODE_11G_TURBO),
00408 AR5K_MODE_BIT_XR = (1 << AR5K_MODE_XR),
00409 };
00410
00411
00412
00413
00414
00415
00416
00417
00418 struct ath5k_tx_status {
00419 u16 ts_seqnum;
00420 u16 ts_tstamp;
00421 u8 ts_status;
00422 u8 ts_rate[4];
00423 u8 ts_retry[4];
00424 u8 ts_final_idx;
00425 s8 ts_rssi;
00426 u8 ts_shortretry;
00427 u8 ts_longretry;
00428 u8 ts_virtcol;
00429 u8 ts_antenna;
00430 } __attribute__ ((packed));
00431
00432 #define AR5K_TXSTAT_ALTRATE 0x80
00433 #define AR5K_TXERR_XRETRY 0x01
00434 #define AR5K_TXERR_FILT 0x02
00435 #define AR5K_TXERR_FIFO 0x04
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446 enum ath5k_tx_queue {
00447 AR5K_TX_QUEUE_INACTIVE = 0,
00448 AR5K_TX_QUEUE_DATA,
00449 AR5K_TX_QUEUE_XR_DATA,
00450 AR5K_TX_QUEUE_BEACON,
00451 AR5K_TX_QUEUE_CAB,
00452 AR5K_TX_QUEUE_UAPSD,
00453 };
00454
00455
00456
00457
00458
00459
00460
00461
00462 enum ath5k_tx_queue_subtype {
00463 AR5K_WME_AC_BK = 0,
00464 AR5K_WME_AC_BE,
00465 AR5K_WME_AC_VI,
00466 AR5K_WME_AC_VO,
00467 };
00468
00469
00470
00471
00472
00473
00474
00475 enum ath5k_tx_queue_id {
00476 AR5K_TX_QUEUE_ID_NOQCU_DATA = 0,
00477 AR5K_TX_QUEUE_ID_NOQCU_BEACON = 1,
00478 AR5K_TX_QUEUE_ID_DATA_MIN = 0,
00479 AR5K_TX_QUEUE_ID_DATA_MAX = 4,
00480 AR5K_TX_QUEUE_ID_DATA_SVP = 5,
00481 AR5K_TX_QUEUE_ID_CAB = 6,
00482 AR5K_TX_QUEUE_ID_BEACON = 7,
00483 AR5K_TX_QUEUE_ID_UAPSD = 8,
00484 AR5K_TX_QUEUE_ID_XR_DATA = 9,
00485 };
00486
00487
00488
00489
00490 #define AR5K_TXQ_FLAG_TXOKINT_ENABLE 0x0001
00491 #define AR5K_TXQ_FLAG_TXERRINT_ENABLE 0x0002
00492 #define AR5K_TXQ_FLAG_TXEOLINT_ENABLE 0x0004
00493 #define AR5K_TXQ_FLAG_TXDESCINT_ENABLE 0x0008
00494 #define AR5K_TXQ_FLAG_TXURNINT_ENABLE 0x0010
00495 #define AR5K_TXQ_FLAG_CBRORNINT_ENABLE 0x0020
00496 #define AR5K_TXQ_FLAG_CBRURNINT_ENABLE 0x0040
00497 #define AR5K_TXQ_FLAG_QTRIGINT_ENABLE 0x0080
00498 #define AR5K_TXQ_FLAG_TXNOFRMINT_ENABLE 0x0100
00499 #define AR5K_TXQ_FLAG_BACKOFF_DISABLE 0x0200
00500 #define AR5K_TXQ_FLAG_RDYTIME_EXP_POLICY_ENABLE 0x0300
00501 #define AR5K_TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE 0x0800
00502 #define AR5K_TXQ_FLAG_POST_FR_BKOFF_DIS 0x1000
00503 #define AR5K_TXQ_FLAG_COMPRESSION_ENABLE 0x2000
00504
00505
00506
00507
00508 struct ath5k_txq_info {
00509 enum ath5k_tx_queue tqi_type;
00510 enum ath5k_tx_queue_subtype tqi_subtype;
00511 u16 tqi_flags;
00512 u32 tqi_aifs;
00513 s32 tqi_cw_min;
00514 s32 tqi_cw_max;
00515 u32 tqi_cbr_period;
00516 u32 tqi_cbr_overflow_limit;
00517 u32 tqi_burst_time;
00518 u32 tqi_ready_time;
00519 };
00520
00521
00522
00523
00524
00525
00526 enum ath5k_pkt_type {
00527 AR5K_PKT_TYPE_NORMAL = 0,
00528 AR5K_PKT_TYPE_ATIM = 1,
00529 AR5K_PKT_TYPE_PSPOLL = 2,
00530 AR5K_PKT_TYPE_BEACON = 3,
00531 AR5K_PKT_TYPE_PROBE_RESP = 4,
00532 AR5K_PKT_TYPE_PIFS = 5,
00533 };
00534
00535
00536
00537
00538 #define AR5K_TXPOWER_OFDM(_r, _v) ( \
00539 ((0 & 1) << ((_v) + 6)) | \
00540 (((ah->ah_txpower.txp_rates_power_table[(_r)]) & 0x3f) << (_v)) \
00541 )
00542
00543 #define AR5K_TXPOWER_CCK(_r, _v) ( \
00544 (ah->ah_txpower.txp_rates_power_table[(_r)] & 0x3f) << (_v) \
00545 )
00546
00547
00548
00549
00550 enum ath5k_dmasize {
00551 AR5K_DMASIZE_4B = 0,
00552 AR5K_DMASIZE_8B,
00553 AR5K_DMASIZE_16B,
00554 AR5K_DMASIZE_32B,
00555 AR5K_DMASIZE_64B,
00556 AR5K_DMASIZE_128B,
00557 AR5K_DMASIZE_256B,
00558 AR5K_DMASIZE_512B
00559 };
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569 struct ath5k_rx_status {
00570 u16 rs_datalen;
00571 u16 rs_tstamp;
00572 u8 rs_status;
00573 u8 rs_phyerr;
00574 s8 rs_rssi;
00575 u8 rs_keyix;
00576 u8 rs_rate;
00577 u8 rs_antenna;
00578 u8 rs_more;
00579 };
00580
00581 #define AR5K_RXERR_CRC 0x01
00582 #define AR5K_RXERR_PHY 0x02
00583 #define AR5K_RXERR_FIFO 0x04
00584 #define AR5K_RXERR_DECRYPT 0x08
00585 #define AR5K_RXERR_MIC 0x10
00586 #define AR5K_RXKEYIX_INVALID ((u8) - 1)
00587 #define AR5K_TXKEYIX_INVALID ((u32) - 1)
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597 #define TSF_TO_TU(_tsf) (u32)((_tsf) >> 10)
00598
00599
00600
00601
00602
00603
00604 enum ath5k_rfgain {
00605 AR5K_RFGAIN_INACTIVE = 0,
00606 AR5K_RFGAIN_ACTIVE,
00607 AR5K_RFGAIN_READ_REQUESTED,
00608 AR5K_RFGAIN_NEED_CHANGE,
00609 };
00610
00611 struct ath5k_gain {
00612 u8 g_step_idx;
00613 u8 g_current;
00614 u8 g_target;
00615 u8 g_low;
00616 u8 g_high;
00617 u8 g_f_corr;
00618 u8 g_state;
00619 };
00620
00621
00622
00623
00624
00625 #define AR5K_SLOT_TIME_9 396
00626 #define AR5K_SLOT_TIME_20 880
00627 #define AR5K_SLOT_TIME_MAX 0xffff
00628
00629
00630 #define CHANNEL_CW_INT 0x0008
00631 #define CHANNEL_TURBO 0x0010
00632 #define CHANNEL_CCK 0x0020
00633 #define CHANNEL_OFDM 0x0040
00634 #define CHANNEL_2GHZ 0x0080
00635 #define CHANNEL_5GHZ 0x0100
00636 #define CHANNEL_PASSIVE 0x0200
00637 #define CHANNEL_DYN 0x0400
00638 #define CHANNEL_XR 0x0800
00639
00640 #define CHANNEL_A (CHANNEL_5GHZ|CHANNEL_OFDM)
00641 #define CHANNEL_B (CHANNEL_2GHZ|CHANNEL_CCK)
00642 #define CHANNEL_G (CHANNEL_2GHZ|CHANNEL_OFDM)
00643 #define CHANNEL_T (CHANNEL_5GHZ|CHANNEL_OFDM|CHANNEL_TURBO)
00644 #define CHANNEL_TG (CHANNEL_2GHZ|CHANNEL_OFDM|CHANNEL_TURBO)
00645 #define CHANNEL_108A CHANNEL_T
00646 #define CHANNEL_108G CHANNEL_TG
00647 #define CHANNEL_X (CHANNEL_5GHZ|CHANNEL_OFDM|CHANNEL_XR)
00648
00649 #define CHANNEL_ALL (CHANNEL_OFDM|CHANNEL_CCK|CHANNEL_2GHZ|CHANNEL_5GHZ| \
00650 CHANNEL_TURBO)
00651
00652 #define CHANNEL_ALL_NOTURBO (CHANNEL_ALL & ~CHANNEL_TURBO)
00653 #define CHANNEL_MODES CHANNEL_ALL
00654
00655
00656
00657
00658
00659 #define IS_CHAN_XR(_c) ((_c->hw_value & CHANNEL_XR) != 0)
00660 #define IS_CHAN_B(_c) ((_c->hw_value & CHANNEL_B) != 0)
00661
00662
00663
00664
00665
00666
00667 struct ath5k_athchan_2ghz {
00668 u32 a2_flags;
00669 u16 a2_athchan;
00670 };
00671
00672
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705 #define AR5K_MAX_RATES 32
00706
00707
00708 #define ATH5K_RATE_CODE_1M 0x1B
00709 #define ATH5K_RATE_CODE_2M 0x1A
00710 #define ATH5K_RATE_CODE_5_5M 0x19
00711 #define ATH5K_RATE_CODE_11M 0x18
00712
00713 #define ATH5K_RATE_CODE_6M 0x0B
00714 #define ATH5K_RATE_CODE_9M 0x0F
00715 #define ATH5K_RATE_CODE_12M 0x0A
00716 #define ATH5K_RATE_CODE_18M 0x0E
00717 #define ATH5K_RATE_CODE_24M 0x09
00718 #define ATH5K_RATE_CODE_36M 0x0D
00719 #define ATH5K_RATE_CODE_48M 0x08
00720 #define ATH5K_RATE_CODE_54M 0x0C
00721
00722 #define ATH5K_RATE_CODE_XR_500K 0x07
00723 #define ATH5K_RATE_CODE_XR_1M 0x02
00724 #define ATH5K_RATE_CODE_XR_2M 0x06
00725 #define ATH5K_RATE_CODE_XR_3M 0x01
00726
00727
00728 #define AR5K_SET_SHORT_PREAMBLE 0x04
00729
00730
00731
00732
00733
00734 #define AR5K_KEYCACHE_SIZE 8
00735
00736
00737
00738
00739
00740
00741
00742
00743 #define AR5K_RSSI_EP_MULTIPLIER (1<<7)
00744
00745 #define AR5K_ASSERT_ENTRY(_e, _s) do { \
00746 if (_e >= _s) \
00747 return 0; \
00748 } while (0)
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806 enum ath5k_int {
00807 AR5K_INT_RXOK = 0x00000001,
00808 AR5K_INT_RXDESC = 0x00000002,
00809 AR5K_INT_RXERR = 0x00000004,
00810 AR5K_INT_RXNOFRM = 0x00000008,
00811 AR5K_INT_RXEOL = 0x00000010,
00812 AR5K_INT_RXORN = 0x00000020,
00813 AR5K_INT_TXOK = 0x00000040,
00814 AR5K_INT_TXDESC = 0x00000080,
00815 AR5K_INT_TXERR = 0x00000100,
00816 AR5K_INT_TXNOFRM = 0x00000200,
00817 AR5K_INT_TXEOL = 0x00000400,
00818 AR5K_INT_TXURN = 0x00000800,
00819 AR5K_INT_MIB = 0x00001000,
00820 AR5K_INT_SWI = 0x00002000,
00821 AR5K_INT_RXPHY = 0x00004000,
00822 AR5K_INT_RXKCM = 0x00008000,
00823 AR5K_INT_SWBA = 0x00010000,
00824 AR5K_INT_BRSSI = 0x00020000,
00825 AR5K_INT_BMISS = 0x00040000,
00826 AR5K_INT_FATAL = 0x00080000,
00827 AR5K_INT_BNR = 0x00100000,
00828 AR5K_INT_TIM = 0x00200000,
00829 AR5K_INT_DTIM = 0x00400000,
00830 AR5K_INT_DTIM_SYNC = 0x00800000,
00831 AR5K_INT_GPIO = 0x01000000,
00832 AR5K_INT_BCN_TIMEOUT = 0x02000000,
00833 AR5K_INT_CAB_TIMEOUT = 0x04000000,
00834 AR5K_INT_RX_DOPPLER = 0x08000000,
00835 AR5K_INT_QCBRORN = 0x10000000,
00836 AR5K_INT_QCBRURN = 0x20000000,
00837 AR5K_INT_QTRIG = 0x40000000,
00838 AR5K_INT_GLOBAL = 0x80000000,
00839
00840 AR5K_INT_COMMON = AR5K_INT_RXOK
00841 | AR5K_INT_RXDESC
00842 | AR5K_INT_RXERR
00843 | AR5K_INT_RXNOFRM
00844 | AR5K_INT_RXEOL
00845 | AR5K_INT_RXORN
00846 | AR5K_INT_TXOK
00847 | AR5K_INT_TXDESC
00848 | AR5K_INT_TXERR
00849 | AR5K_INT_TXNOFRM
00850 | AR5K_INT_TXEOL
00851 | AR5K_INT_TXURN
00852 | AR5K_INT_MIB
00853 | AR5K_INT_SWI
00854 | AR5K_INT_RXPHY
00855 | AR5K_INT_RXKCM
00856 | AR5K_INT_SWBA
00857 | AR5K_INT_BRSSI
00858 | AR5K_INT_BMISS
00859 | AR5K_INT_GPIO
00860 | AR5K_INT_GLOBAL,
00861
00862 AR5K_INT_NOCARD = 0xffffffff
00863 };
00864
00865
00866
00867
00868 enum ath5k_power_mode {
00869 AR5K_PM_UNDEFINED = 0,
00870 AR5K_PM_AUTO,
00871 AR5K_PM_AWAKE,
00872 AR5K_PM_FULL_SLEEP,
00873 AR5K_PM_NETWORK_SLEEP,
00874 };
00875
00876
00877 #define AR5K_SOFTLED_PIN 0
00878 #define AR5K_SOFTLED_ON 0
00879 #define AR5K_SOFTLED_OFF 1
00880
00881
00882
00883
00884
00885
00886
00887 enum ath5k_capability_type {
00888 AR5K_CAP_REG_DMN = 0,
00889 AR5K_CAP_TKIP_MIC = 2,
00890 AR5K_CAP_TKIP_SPLIT = 3,
00891 AR5K_CAP_PHYCOUNTERS = 4,
00892 AR5K_CAP_DIVERSITY = 5,
00893 AR5K_CAP_NUM_TXQUEUES = 6,
00894 AR5K_CAP_VEOL = 7,
00895 AR5K_CAP_COMPRESSION = 8,
00896 AR5K_CAP_BURST = 9,
00897 AR5K_CAP_FASTFRAME = 10,
00898 AR5K_CAP_TXPOW = 11,
00899 AR5K_CAP_TPC = 12,
00900 AR5K_CAP_BSSIDMASK = 13,
00901 AR5K_CAP_MCAST_KEYSRCH = 14,
00902 AR5K_CAP_TSF_ADJUST = 15,
00903 AR5K_CAP_XR = 16,
00904 AR5K_CAP_WME_TKIPMIC = 17,
00905 AR5K_CAP_CHAN_HALFRATE = 18,
00906 AR5K_CAP_CHAN_QUARTERRATE = 19,
00907 AR5K_CAP_RFSILENT = 20,
00908 };
00909
00910
00911
00912 struct ath5k_capabilities {
00913
00914
00915
00916
00917 u16 cap_mode;
00918
00919
00920
00921
00922 struct {
00923 u16 range_2ghz_min;
00924 u16 range_2ghz_max;
00925 u16 range_5ghz_min;
00926 u16 range_5ghz_max;
00927 } cap_range;
00928
00929
00930
00931
00932 struct ath5k_eeprom_info cap_eeprom;
00933
00934
00935
00936
00937 struct {
00938 u8 q_tx_num;
00939 } cap_queues;
00940 };
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951 #define AR5K_MAX_GPIO 10
00952 #define AR5K_MAX_RF_BANKS 8
00953
00954
00955 struct ath5k_hw {
00956 struct ath5k_softc *ah_sc;
00957 void *ah_iobase;
00958
00959 enum ath5k_int ah_imr;
00960 int ah_ier;
00961
00962 struct net80211_channel *ah_current_channel;
00963 int ah_turbo;
00964 int ah_calibration;
00965 int ah_running;
00966 int ah_single_chip;
00967 int ah_combined_mic;
00968
00969 u32 ah_mac_srev;
00970 u16 ah_mac_version;
00971 u16 ah_mac_revision;
00972 u16 ah_phy_revision;
00973 u16 ah_radio_5ghz_revision;
00974 u16 ah_radio_2ghz_revision;
00975
00976 enum ath5k_version ah_version;
00977 enum ath5k_radio ah_radio;
00978 u32 ah_phy;
00979
00980 int ah_5ghz;
00981 int ah_2ghz;
00982
00983 #define ah_regdomain ah_capabilities.cap_regdomain.reg_current
00984 #define ah_regdomain_hw ah_capabilities.cap_regdomain.reg_hw
00985 #define ah_modes ah_capabilities.cap_mode
00986 #define ah_ee_version ah_capabilities.cap_eeprom.ee_version
00987
00988 u32 ah_atim_window;
00989 u32 ah_aifs;
00990 u32 ah_cw_min;
00991 u32 ah_cw_max;
00992 int ah_software_retry;
00993 u32 ah_limit_tx_retries;
00994
00995 u32 ah_antenna[AR5K_EEPROM_N_MODES][AR5K_ANT_MAX];
00996 int ah_ant_diversity;
00997
00998 u8 ah_sta_id[ETH_ALEN];
00999
01000
01001
01002
01003 u8 ah_bssid[ETH_ALEN];
01004 u8 ah_bssid_mask[ETH_ALEN];
01005
01006 u32 ah_gpio[AR5K_MAX_GPIO];
01007 int ah_gpio_npins;
01008
01009 struct ath5k_capabilities ah_capabilities;
01010
01011 struct ath5k_txq_info ah_txq;
01012 u32 ah_txq_status;
01013 u32 ah_txq_imr_txok;
01014 u32 ah_txq_imr_txerr;
01015 u32 ah_txq_imr_txurn;
01016 u32 ah_txq_imr_txdesc;
01017 u32 ah_txq_imr_txeol;
01018 u32 ah_txq_imr_cbrorn;
01019 u32 ah_txq_imr_cbrurn;
01020 u32 ah_txq_imr_qtrig;
01021 u32 ah_txq_imr_nofrm;
01022 u32 ah_txq_isr;
01023 u32 *ah_rf_banks;
01024 size_t ah_rf_banks_size;
01025 size_t ah_rf_regs_count;
01026 struct ath5k_gain ah_gain;
01027 u8 ah_offset[AR5K_MAX_RF_BANKS];
01028
01029
01030 struct {
01031
01032 u8 tmpL[AR5K_EEPROM_N_PD_GAINS]
01033 [AR5K_EEPROM_POWER_TABLE_SIZE];
01034 u8 tmpR[AR5K_EEPROM_N_PD_GAINS]
01035 [AR5K_EEPROM_POWER_TABLE_SIZE];
01036 u8 txp_pd_table[AR5K_EEPROM_POWER_TABLE_SIZE * 2];
01037 u16 txp_rates_power_table[AR5K_MAX_RATES];
01038 u8 txp_min_idx;
01039 int txp_tpc;
01040
01041 s16 txp_min_pwr;
01042 s16 txp_max_pwr;
01043 s16 txp_offset;
01044 s16 txp_ofdm;
01045
01046 s16 txp_cck_ofdm_pwr_delta;
01047 s16 txp_cck_ofdm_gainf_delta;
01048 } ah_txpower;
01049
01050
01051 s32 ah_noise_floor;
01052
01053
01054
01055
01056 int (*ah_setup_rx_desc)(struct ath5k_hw *ah, struct ath5k_desc *desc,
01057 u32 size, unsigned int flags);
01058 int (*ah_setup_tx_desc)(struct ath5k_hw *, struct ath5k_desc *,
01059 unsigned int, unsigned int, enum ath5k_pkt_type, unsigned int,
01060 unsigned int, unsigned int, unsigned int, unsigned int,
01061 unsigned int, unsigned int, unsigned int);
01062 int (*ah_proc_tx_desc)(struct ath5k_hw *, struct ath5k_desc *,
01063 struct ath5k_tx_status *);
01064 int (*ah_proc_rx_desc)(struct ath5k_hw *, struct ath5k_desc *,
01065 struct ath5k_rx_status *);
01066 };
01067
01068
01069
01070
01071
01072 extern int ath5k_bitrate_to_hw_rix(int bitrate);
01073
01074
01075 extern int ath5k_hw_attach(struct ath5k_softc *sc, u8 mac_version, struct ath5k_hw **ah);
01076 extern void ath5k_hw_detach(struct ath5k_hw *ah);
01077
01078
01079 extern int ath5k_init_leds(struct ath5k_softc *sc);
01080 extern void ath5k_led_enable(struct ath5k_softc *sc);
01081 extern void ath5k_led_off(struct ath5k_softc *sc);
01082 extern void ath5k_unregister_leds(struct ath5k_softc *sc);
01083
01084
01085 extern int ath5k_hw_nic_wakeup(struct ath5k_hw *ah, int flags, int initial);
01086 extern int ath5k_hw_reset(struct ath5k_hw *ah, struct net80211_channel *channel, int change_channel);
01087
01088 extern int ath5k_hw_set_power(struct ath5k_hw *ah, enum ath5k_power_mode mode, int set_chip, u16 sleep_duration);
01089
01090
01091 extern void ath5k_hw_start_rx_dma(struct ath5k_hw *ah);
01092 extern int ath5k_hw_stop_rx_dma(struct ath5k_hw *ah);
01093 extern u32 ath5k_hw_get_rxdp(struct ath5k_hw *ah);
01094 extern void ath5k_hw_set_rxdp(struct ath5k_hw *ah, u32 phys_addr);
01095 extern int ath5k_hw_start_tx_dma(struct ath5k_hw *ah, unsigned int queue);
01096 extern int ath5k_hw_stop_tx_dma(struct ath5k_hw *ah, unsigned int queue);
01097 extern u32 ath5k_hw_get_txdp(struct ath5k_hw *ah, unsigned int queue);
01098 extern int ath5k_hw_set_txdp(struct ath5k_hw *ah, unsigned int queue,
01099 u32 phys_addr);
01100 extern int ath5k_hw_update_tx_triglevel(struct ath5k_hw *ah, int increase);
01101
01102 extern int ath5k_hw_is_intr_pending(struct ath5k_hw *ah);
01103 extern int ath5k_hw_get_isr(struct ath5k_hw *ah, enum ath5k_int *interrupt_mask);
01104 extern enum ath5k_int ath5k_hw_set_imr(struct ath5k_hw *ah, enum ath5k_int new_mask);
01105
01106
01107 extern int ath5k_eeprom_init(struct ath5k_hw *ah);
01108 extern void ath5k_eeprom_detach(struct ath5k_hw *ah);
01109 extern int ath5k_eeprom_read_mac(struct ath5k_hw *ah, u8 *mac);
01110 extern int ath5k_eeprom_is_hb63(struct ath5k_hw *ah);
01111
01112
01113 extern int ath5k_hw_set_opmode(struct ath5k_hw *ah);
01114
01115 extern void ath5k_hw_get_lladdr(struct ath5k_hw *ah, u8 *mac);
01116 extern int ath5k_hw_set_lladdr(struct ath5k_hw *ah, const u8 *mac);
01117 extern void ath5k_hw_set_associd(struct ath5k_hw *ah, const u8 *bssid, u16 assoc_id);
01118 extern int ath5k_hw_set_bssid_mask(struct ath5k_hw *ah, const u8 *mask);
01119
01120 extern void ath5k_hw_start_rx_pcu(struct ath5k_hw *ah);
01121 extern void ath5k_hw_stop_rx_pcu(struct ath5k_hw *ah);
01122
01123 extern void ath5k_hw_set_mcast_filter(struct ath5k_hw *ah, u32 filter0, u32 filter1);
01124 extern u32 ath5k_hw_get_rx_filter(struct ath5k_hw *ah);
01125 extern void ath5k_hw_set_rx_filter(struct ath5k_hw *ah, u32 filter);
01126
01127 void ath5k_hw_set_ack_bitrate_high(struct ath5k_hw *ah, int high);
01128
01129 extern int ath5k_hw_set_ack_timeout(struct ath5k_hw *ah, unsigned int timeout);
01130 extern unsigned int ath5k_hw_get_ack_timeout(struct ath5k_hw *ah);
01131 extern int ath5k_hw_set_cts_timeout(struct ath5k_hw *ah, unsigned int timeout);
01132 extern unsigned int ath5k_hw_get_cts_timeout(struct ath5k_hw *ah);
01133
01134 extern int ath5k_hw_reset_key(struct ath5k_hw *ah, u16 entry);
01135
01136
01137 extern int ath5k_hw_set_tx_queueprops(struct ath5k_hw *ah, const struct ath5k_txq_info *queue_info);
01138 extern int ath5k_hw_setup_tx_queue(struct ath5k_hw *ah,
01139 enum ath5k_tx_queue queue_type,
01140 struct ath5k_txq_info *queue_info);
01141 extern u32 ath5k_hw_num_tx_pending(struct ath5k_hw *ah);
01142 extern void ath5k_hw_release_tx_queue(struct ath5k_hw *ah);
01143 extern int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah);
01144 extern int ath5k_hw_set_slot_time(struct ath5k_hw *ah, unsigned int slot_time);
01145
01146
01147 extern int ath5k_hw_init_desc_functions(struct ath5k_hw *ah);
01148
01149
01150 extern int ath5k_hw_set_gpio_input(struct ath5k_hw *ah, u32 gpio);
01151 extern int ath5k_hw_set_gpio_output(struct ath5k_hw *ah, u32 gpio);
01152 extern u32 ath5k_hw_get_gpio(struct ath5k_hw *ah, u32 gpio);
01153 extern int ath5k_hw_set_gpio(struct ath5k_hw *ah, u32 gpio, u32 val);
01154 extern void ath5k_hw_set_gpio_intr(struct ath5k_hw *ah, unsigned int gpio, u32 interrupt_level);
01155
01156
01157 extern void ath5k_rfkill_hw_start(struct ath5k_hw *ah);
01158 extern void ath5k_rfkill_hw_stop(struct ath5k_hw *ah);
01159
01160
01161 int ath5k_hw_set_capabilities(struct ath5k_hw *ah);
01162 extern int ath5k_hw_get_capability(struct ath5k_hw *ah, enum ath5k_capability_type cap_type, u32 capability, u32 *result);
01163 extern int ath5k_hw_enable_pspoll(struct ath5k_hw *ah, u8 *bssid, u16 assoc_id);
01164 extern int ath5k_hw_disable_pspoll(struct ath5k_hw *ah);
01165
01166
01167 extern int ath5k_hw_write_initvals(struct ath5k_hw *ah, u8 mode, int change_channel);
01168
01169
01170 extern int ath5k_hw_rfregs_init(struct ath5k_hw *ah,
01171 struct net80211_channel *channel,
01172 unsigned int mode);
01173 extern int ath5k_hw_rfgain_init(struct ath5k_hw *ah, unsigned int freq);
01174 extern enum ath5k_rfgain ath5k_hw_gainf_calibrate(struct ath5k_hw *ah);
01175 extern int ath5k_hw_rfgain_opt_init(struct ath5k_hw *ah);
01176
01177 extern int ath5k_channel_ok(struct ath5k_hw *ah, u16 freq, unsigned int flags);
01178 extern int ath5k_hw_channel(struct ath5k_hw *ah, struct net80211_channel *channel);
01179
01180 extern int ath5k_hw_phy_calibrate(struct ath5k_hw *ah, struct net80211_channel *channel);
01181 extern int ath5k_hw_noise_floor_calibration(struct ath5k_hw *ah, short freq);
01182
01183 extern u16 ath5k_hw_radio_revision(struct ath5k_hw *ah, unsigned int chan);
01184 extern void ath5k_hw_set_def_antenna(struct ath5k_hw *ah, unsigned int ant);
01185 extern unsigned int ath5k_hw_get_def_antenna(struct ath5k_hw *ah);
01186 extern int ath5k_hw_phy_disable(struct ath5k_hw *ah);
01187
01188 extern int ath5k_hw_txpower(struct ath5k_hw *ah, struct net80211_channel *channel, u8 ee_mode, u8 txpower);
01189 extern int ath5k_hw_set_txpower_limit(struct ath5k_hw *ah, u8 ee_mode, u8 txpower);
01190
01191
01192
01193
01194
01195
01196
01197
01198
01199 static inline unsigned int ath5k_hw_htoclock(unsigned int usec, int turbo)
01200 {
01201 return turbo ? (usec * 80) : (usec * 40);
01202 }
01203
01204
01205
01206
01207
01208 static inline unsigned int ath5k_hw_clocktoh(unsigned int clock, int turbo)
01209 {
01210 return turbo ? (clock / 80) : (clock / 40);
01211 }
01212
01213
01214
01215
01216 static inline u32 ath5k_hw_reg_read(struct ath5k_hw *ah, u16 reg)
01217 {
01218 return readl(ah->ah_iobase + reg);
01219 }
01220
01221
01222
01223
01224 static inline void ath5k_hw_reg_write(struct ath5k_hw *ah, u32 val, u16 reg)
01225 {
01226 writel(val, ah->ah_iobase + reg);
01227 }
01228
01229 #if defined(_ATH5K_RESET) || defined(_ATH5K_PHY)
01230
01231
01232
01233 static int ath5k_hw_register_timeout(struct ath5k_hw *ah, u32 reg, u32 flag,
01234 u32 val, int is_set)
01235 {
01236 int i;
01237 u32 data;
01238
01239 for (i = AR5K_TUNE_REGISTER_TIMEOUT; i > 0; i--) {
01240 data = ath5k_hw_reg_read(ah, reg);
01241 if (is_set && (data & flag))
01242 break;
01243 else if ((data & flag) == val)
01244 break;
01245 udelay(15);
01246 }
01247
01248 return (i <= 0) ? -EAGAIN : 0;
01249 }
01250
01251
01252
01253
01254 static inline int ath5k_freq_to_channel(int freq)
01255 {
01256 if (freq == 2484)
01257 return 14;
01258
01259 if (freq < 2484)
01260 return (freq - 2407) / 5;
01261
01262 return freq/5 - 1000;
01263 }
01264
01265 #endif
01266
01267 static inline u32 ath5k_hw_bitswap(u32 val, unsigned int bits)
01268 {
01269 u32 retval = 0, bit, i;
01270
01271 for (i = 0; i < bits; i++) {
01272 bit = (val >> i) & 1;
01273 retval = (retval << 1) | bit;
01274 }
01275
01276 return retval;
01277 }
01278
01279 #endif