0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #ifndef _ATH5K_H
0019 #define _ATH5K_H
0020
0021
0022
0023
0024 #define CHAN_DEBUG 0
0025
0026 #include <linux/io.h>
0027 #include <linux/interrupt.h>
0028 #include <linux/types.h>
0029 #include <linux/average.h>
0030 #include <linux/leds.h>
0031 #include <net/mac80211.h>
0032 #include <net/cfg80211.h>
0033
0034
0035
0036 #include "desc.h"
0037
0038
0039
0040
0041 #include "eeprom.h"
0042 #include "debug.h"
0043 #include "../ath.h"
0044 #include "ani.h"
0045
0046
0047 #define PCI_DEVICE_ID_ATHEROS_AR5210 0x0007
0048 #define PCI_DEVICE_ID_ATHEROS_AR5311 0x0011
0049 #define PCI_DEVICE_ID_ATHEROS_AR5211 0x0012
0050 #define PCI_DEVICE_ID_ATHEROS_AR5212 0x0013
0051 #define PCI_DEVICE_ID_3COM_3CRDAG675 0x0013
0052 #define PCI_DEVICE_ID_3COM_2_3CRPAG175 0x0013
0053 #define PCI_DEVICE_ID_ATHEROS_AR5210_AP 0x0207
0054 #define PCI_DEVICE_ID_ATHEROS_AR5212_IBM 0x1014
0055 #define PCI_DEVICE_ID_ATHEROS_AR5210_DEFAULT 0x1107
0056 #define PCI_DEVICE_ID_ATHEROS_AR5212_DEFAULT 0x1113
0057 #define PCI_DEVICE_ID_ATHEROS_AR5211_DEFAULT 0x1112
0058 #define PCI_DEVICE_ID_ATHEROS_AR5212_FPGA 0xf013
0059 #define PCI_DEVICE_ID_ATHEROS_AR5211_LEGACY 0xff12
0060 #define PCI_DEVICE_ID_ATHEROS_AR5211_FPGA11B 0xf11b
0061 #define PCI_DEVICE_ID_ATHEROS_AR5312_REV2 0x0052
0062 #define PCI_DEVICE_ID_ATHEROS_AR5312_REV7 0x0057
0063 #define PCI_DEVICE_ID_ATHEROS_AR5312_REV8 0x0058
0064 #define PCI_DEVICE_ID_ATHEROS_AR5212_0014 0x0014
0065 #define PCI_DEVICE_ID_ATHEROS_AR5212_0015 0x0015
0066 #define PCI_DEVICE_ID_ATHEROS_AR5212_0016 0x0016
0067 #define PCI_DEVICE_ID_ATHEROS_AR5212_0017 0x0017
0068 #define PCI_DEVICE_ID_ATHEROS_AR5212_0018 0x0018
0069 #define PCI_DEVICE_ID_ATHEROS_AR5212_0019 0x0019
0070 #define PCI_DEVICE_ID_ATHEROS_AR2413 0x001a
0071 #define PCI_DEVICE_ID_ATHEROS_AR5413 0x001b
0072 #define PCI_DEVICE_ID_ATHEROS_AR5424 0x001c
0073 #define PCI_DEVICE_ID_ATHEROS_AR5416 0x0023
0074 #define PCI_DEVICE_ID_ATHEROS_AR5418 0x0024
0075
0076
0077
0078
0079
0080 #define ATH5K_PRINTF(fmt, ...) \
0081 pr_warn("%s: " fmt, __func__, ##__VA_ARGS__)
0082
0083 void __printf(3, 4)
0084 _ath5k_printk(const struct ath5k_hw *ah, const char *level,
0085 const char *fmt, ...);
0086
0087 #define ATH5K_PRINTK(_sc, _level, _fmt, ...) \
0088 _ath5k_printk(_sc, _level, _fmt, ##__VA_ARGS__)
0089
0090 #define ATH5K_PRINTK_LIMIT(_sc, _level, _fmt, ...) \
0091 do { \
0092 if (net_ratelimit()) \
0093 ATH5K_PRINTK(_sc, _level, _fmt, ##__VA_ARGS__); \
0094 } while (0)
0095
0096 #define ATH5K_INFO(_sc, _fmt, ...) \
0097 ATH5K_PRINTK(_sc, KERN_INFO, _fmt, ##__VA_ARGS__)
0098
0099 #define ATH5K_WARN(_sc, _fmt, ...) \
0100 ATH5K_PRINTK_LIMIT(_sc, KERN_WARNING, _fmt, ##__VA_ARGS__)
0101
0102 #define ATH5K_ERR(_sc, _fmt, ...) \
0103 ATH5K_PRINTK_LIMIT(_sc, KERN_ERR, _fmt, ##__VA_ARGS__)
0104
0105
0106
0107
0108
0109
0110
0111
0112 #define AR5K_REG_SM(_val, _flags) \
0113 (((_val) << _flags##_S) & (_flags))
0114
0115
0116 #define AR5K_REG_MS(_val, _flags) \
0117 (((_val) & (_flags)) >> _flags##_S)
0118
0119
0120
0121
0122
0123
0124 #define AR5K_REG_WRITE_BITS(ah, _reg, _flags, _val) \
0125 ath5k_hw_reg_write(ah, (ath5k_hw_reg_read(ah, _reg) & ~(_flags)) | \
0126 (((_val) << _flags##_S) & (_flags)), _reg)
0127
0128 #define AR5K_REG_MASKED_BITS(ah, _reg, _flags, _mask) \
0129 ath5k_hw_reg_write(ah, (ath5k_hw_reg_read(ah, _reg) & \
0130 (_mask)) | (_flags), _reg)
0131
0132 #define AR5K_REG_ENABLE_BITS(ah, _reg, _flags) \
0133 ath5k_hw_reg_write(ah, ath5k_hw_reg_read(ah, _reg) | (_flags), _reg)
0134
0135 #define AR5K_REG_DISABLE_BITS(ah, _reg, _flags) \
0136 ath5k_hw_reg_write(ah, ath5k_hw_reg_read(ah, _reg) & ~(_flags), _reg)
0137
0138
0139 #define AR5K_REG_READ_Q(ah, _reg, _queue) \
0140 (ath5k_hw_reg_read(ah, _reg) & (1 << _queue)) \
0141
0142 #define AR5K_REG_WRITE_Q(ah, _reg, _queue) \
0143 ath5k_hw_reg_write(ah, (1 << _queue), _reg)
0144
0145 #define AR5K_Q_ENABLE_BITS(_reg, _queue) do { \
0146 _reg |= 1 << _queue; \
0147 } while (0)
0148
0149 #define AR5K_Q_DISABLE_BITS(_reg, _queue) do { \
0150 _reg &= ~(1 << _queue); \
0151 } while (0)
0152
0153
0154 #define AR5K_REG_WAIT(_i) do { \
0155 if (_i % 64) \
0156 udelay(1); \
0157 } while (0)
0158
0159
0160
0161
0162
0163 #define AR5K_TUNE_DMA_BEACON_RESP 2
0164 #define AR5K_TUNE_SW_BEACON_RESP 10
0165 #define AR5K_TUNE_ADDITIONAL_SWBA_BACKOFF 0
0166 #define AR5K_TUNE_MIN_TX_FIFO_THRES 1
0167 #define AR5K_TUNE_MAX_TX_FIFO_THRES ((IEEE80211_MAX_FRAME_LEN / 64) + 1)
0168 #define AR5K_TUNE_REGISTER_TIMEOUT 20000
0169
0170
0171 #define AR5K_TUNE_RSSI_THRES 129
0172
0173
0174
0175
0176
0177 #define AR5K_TUNE_BMISS_THRES 7
0178 #define AR5K_TUNE_REGISTER_DWELL_TIME 20000
0179 #define AR5K_TUNE_BEACON_INTERVAL 100
0180 #define AR5K_TUNE_AIFS 2
0181 #define AR5K_TUNE_AIFS_11B 2
0182 #define AR5K_TUNE_AIFS_XR 0
0183 #define AR5K_TUNE_CWMIN 15
0184 #define AR5K_TUNE_CWMIN_11B 31
0185 #define AR5K_TUNE_CWMIN_XR 3
0186 #define AR5K_TUNE_CWMAX 1023
0187 #define AR5K_TUNE_CWMAX_11B 1023
0188 #define AR5K_TUNE_CWMAX_XR 7
0189 #define AR5K_TUNE_NOISE_FLOOR -72
0190 #define AR5K_TUNE_CCA_MAX_GOOD_VALUE -95
0191 #define AR5K_TUNE_MAX_TXPOWER 63
0192 #define AR5K_TUNE_DEFAULT_TXPOWER 25
0193 #define AR5K_TUNE_TPC_TXPOWER false
0194 #define ATH5K_TUNE_CALIBRATION_INTERVAL_FULL 60000
0195 #define ATH5K_TUNE_CALIBRATION_INTERVAL_SHORT 10000
0196 #define ATH5K_TUNE_CALIBRATION_INTERVAL_ANI 1000
0197 #define ATH5K_TX_COMPLETE_POLL_INT 3000
0198
0199 #define AR5K_INIT_CARR_SENSE_EN 1
0200
0201
0202 #if defined(__BIG_ENDIAN)
0203 #define AR5K_INIT_CFG ( \
0204 AR5K_CFG_SWTD | AR5K_CFG_SWRD \
0205 )
0206 #else
0207 #define AR5K_INIT_CFG 0x00000000
0208 #endif
0209
0210
0211 #define AR5K_INIT_CYCRSSI_THR1 2
0212
0213
0214 #define AR5K_INIT_RETRY_SHORT 7
0215 #define AR5K_INIT_RETRY_LONG 4
0216
0217
0218 #define AR5K_INIT_SLOT_TIME_TURBO 6
0219 #define AR5K_INIT_SLOT_TIME_DEFAULT 9
0220 #define AR5K_INIT_SLOT_TIME_HALF_RATE 13
0221 #define AR5K_INIT_SLOT_TIME_QUARTER_RATE 21
0222 #define AR5K_INIT_SLOT_TIME_B 20
0223 #define AR5K_SLOT_TIME_MAX 0xffff
0224
0225
0226 #define AR5K_INIT_SIFS_TURBO 6
0227 #define AR5K_INIT_SIFS_DEFAULT_BG 10
0228 #define AR5K_INIT_SIFS_DEFAULT_A 16
0229 #define AR5K_INIT_SIFS_HALF_RATE 32
0230 #define AR5K_INIT_SIFS_QUARTER_RATE 64
0231
0232
0233
0234
0235 #define AR5K_INIT_OFDM_PREAMPLE_TIME 20
0236
0237 #define AR5K_INIT_OFDM_PREAMBLE_TIME_MIN 14
0238 #define AR5K_INIT_OFDM_SYMBOL_TIME 4
0239 #define AR5K_INIT_OFDM_PLCP_BITS 22
0240
0241
0242 #define AR5K_INIT_RX_LAT_MAX 63
0243
0244
0245 #define AR5K_INIT_TX_LAT_A 54
0246 #define AR5K_INIT_TX_LAT_BG 384
0247
0248 #define AR5K_INIT_TX_LAT_MIN 32
0249
0250 #define AR5K_INIT_TX_LATENCY_5210 54
0251 #define AR5K_INIT_RX_LATENCY_5210 29
0252
0253
0254 #define AR5K_INIT_TXF2TXD_START_DEFAULT 14
0255 #define AR5K_INIT_TXF2TXD_START_DELAY_10MHZ 12
0256 #define AR5K_INIT_TXF2TXD_START_DELAY_5MHZ 13
0257
0258
0259
0260 #define AR5K_SWITCH_SETTLING 5760
0261 #define AR5K_SWITCH_SETTLING_TURBO 7168
0262
0263 #define AR5K_AGC_SETTLING 28
0264
0265 #define AR5K_AGC_SETTLING_TURBO 37
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279 enum ath5k_version {
0280 AR5K_AR5210 = 0,
0281 AR5K_AR5211 = 1,
0282 AR5K_AR5212 = 2,
0283 };
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296 enum ath5k_radio {
0297 AR5K_RF5110 = 0,
0298 AR5K_RF5111 = 1,
0299 AR5K_RF5112 = 2,
0300 AR5K_RF2413 = 3,
0301 AR5K_RF5413 = 4,
0302 AR5K_RF2316 = 5,
0303 AR5K_RF2317 = 6,
0304 AR5K_RF2425 = 7,
0305 };
0306
0307
0308
0309
0310
0311 #define AR5K_SREV_UNKNOWN 0xffff
0312
0313 #define AR5K_SREV_AR5210 0x00
0314 #define AR5K_SREV_AR5311 0x10
0315 #define AR5K_SREV_AR5311A 0x20
0316 #define AR5K_SREV_AR5311B 0x30
0317 #define AR5K_SREV_AR5211 0x40
0318 #define AR5K_SREV_AR5212 0x50
0319 #define AR5K_SREV_AR5312_R2 0x52
0320 #define AR5K_SREV_AR5212_V4 0x54
0321 #define AR5K_SREV_AR5213 0x55
0322 #define AR5K_SREV_AR5312_R7 0x57
0323 #define AR5K_SREV_AR2313_R8 0x58
0324 #define AR5K_SREV_AR5213A 0x59
0325 #define AR5K_SREV_AR2413 0x78
0326 #define AR5K_SREV_AR2414 0x70
0327 #define AR5K_SREV_AR2315_R6 0x86
0328 #define AR5K_SREV_AR2315_R7 0x87
0329 #define AR5K_SREV_AR5424 0x90
0330 #define AR5K_SREV_AR2317_R1 0x90
0331 #define AR5K_SREV_AR2317_R2 0x91
0332 #define AR5K_SREV_AR5413 0xa4
0333 #define AR5K_SREV_AR5414 0xa0
0334 #define AR5K_SREV_AR2415 0xb0
0335 #define AR5K_SREV_AR5416 0xc0
0336 #define AR5K_SREV_AR5418 0xca
0337 #define AR5K_SREV_AR2425 0xe0
0338 #define AR5K_SREV_AR2417 0xf0
0339
0340 #define AR5K_SREV_RAD_5110 0x00
0341 #define AR5K_SREV_RAD_5111 0x10
0342 #define AR5K_SREV_RAD_5111A 0x15
0343 #define AR5K_SREV_RAD_2111 0x20
0344 #define AR5K_SREV_RAD_5112 0x30
0345 #define AR5K_SREV_RAD_5112A 0x35
0346 #define AR5K_SREV_RAD_5112B 0x36
0347 #define AR5K_SREV_RAD_2112 0x40
0348 #define AR5K_SREV_RAD_2112A 0x45
0349 #define AR5K_SREV_RAD_2112B 0x46
0350 #define AR5K_SREV_RAD_2413 0x50
0351 #define AR5K_SREV_RAD_5413 0x60
0352 #define AR5K_SREV_RAD_2316 0x70
0353 #define AR5K_SREV_RAD_2317 0x80
0354 #define AR5K_SREV_RAD_5424 0xa0
0355 #define AR5K_SREV_RAD_2425 0xa2
0356 #define AR5K_SREV_RAD_5133 0xc0
0357
0358 #define AR5K_SREV_PHY_5211 0x30
0359 #define AR5K_SREV_PHY_5212 0x41
0360 #define AR5K_SREV_PHY_5212A 0x42
0361 #define AR5K_SREV_PHY_5212B 0x43
0362 #define AR5K_SREV_PHY_2413 0x45
0363 #define AR5K_SREV_PHY_5413 0x61
0364 #define AR5K_SREV_PHY_2425 0x70
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412
0413
0414
0415
0416
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448 enum ath5k_driver_mode {
0449 AR5K_MODE_11A = 0,
0450 AR5K_MODE_11B = 1,
0451 AR5K_MODE_11G = 2,
0452 AR5K_MODE_MAX = 3
0453 };
0454
0455
0456
0457
0458
0459
0460
0461
0462
0463
0464
0465
0466
0467
0468 enum ath5k_ant_mode {
0469 AR5K_ANTMODE_DEFAULT = 0,
0470 AR5K_ANTMODE_FIXED_A = 1,
0471 AR5K_ANTMODE_FIXED_B = 2,
0472 AR5K_ANTMODE_SINGLE_AP = 3,
0473 AR5K_ANTMODE_SECTOR_AP = 4,
0474 AR5K_ANTMODE_SECTOR_STA = 5,
0475 AR5K_ANTMODE_DEBUG = 6,
0476 AR5K_ANTMODE_MAX,
0477 };
0478
0479
0480
0481
0482
0483
0484
0485
0486 enum ath5k_bw_mode {
0487 AR5K_BWMODE_DEFAULT = 0,
0488 AR5K_BWMODE_5MHZ = 1,
0489 AR5K_BWMODE_10MHZ = 2,
0490 AR5K_BWMODE_40MHZ = 3
0491 };
0492
0493
0494
0495
0496
0497
0498
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511
0512
0513
0514 struct ath5k_tx_status {
0515 u16 ts_seqnum;
0516 u16 ts_tstamp;
0517 u8 ts_status;
0518 u8 ts_final_idx;
0519 u8 ts_final_retry;
0520 s8 ts_rssi;
0521 u8 ts_shortretry;
0522 u8 ts_virtcol;
0523 u8 ts_antenna;
0524 };
0525
0526 #define AR5K_TXSTAT_ALTRATE 0x80
0527 #define AR5K_TXERR_XRETRY 0x01
0528 #define AR5K_TXERR_FILT 0x02
0529 #define AR5K_TXERR_FIFO 0x04
0530
0531
0532
0533
0534
0535
0536
0537
0538
0539 enum ath5k_tx_queue {
0540 AR5K_TX_QUEUE_INACTIVE = 0,
0541 AR5K_TX_QUEUE_DATA,
0542 AR5K_TX_QUEUE_BEACON,
0543 AR5K_TX_QUEUE_CAB,
0544 AR5K_TX_QUEUE_UAPSD,
0545 };
0546
0547 #define AR5K_NUM_TX_QUEUES 10
0548 #define AR5K_NUM_TX_QUEUES_NOQCU 2
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562 enum ath5k_tx_queue_subtype {
0563 AR5K_WME_AC_BK = 0,
0564 AR5K_WME_AC_BE,
0565 AR5K_WME_AC_VI,
0566 AR5K_WME_AC_VO,
0567 };
0568
0569
0570
0571
0572
0573
0574
0575
0576
0577
0578
0579
0580
0581
0582 enum ath5k_tx_queue_id {
0583 AR5K_TX_QUEUE_ID_NOQCU_DATA = 0,
0584 AR5K_TX_QUEUE_ID_NOQCU_BEACON = 1,
0585 AR5K_TX_QUEUE_ID_DATA_MIN = 0,
0586 AR5K_TX_QUEUE_ID_DATA_MAX = 3,
0587 AR5K_TX_QUEUE_ID_UAPSD = 7,
0588 AR5K_TX_QUEUE_ID_CAB = 8,
0589 AR5K_TX_QUEUE_ID_BEACON = 9,
0590 };
0591
0592
0593
0594
0595 #define AR5K_TXQ_FLAG_TXOKINT_ENABLE 0x0001
0596 #define AR5K_TXQ_FLAG_TXERRINT_ENABLE 0x0002
0597 #define AR5K_TXQ_FLAG_TXEOLINT_ENABLE 0x0004
0598 #define AR5K_TXQ_FLAG_TXDESCINT_ENABLE 0x0008
0599 #define AR5K_TXQ_FLAG_TXURNINT_ENABLE 0x0010
0600 #define AR5K_TXQ_FLAG_CBRORNINT_ENABLE 0x0020
0601 #define AR5K_TXQ_FLAG_CBRURNINT_ENABLE 0x0040
0602 #define AR5K_TXQ_FLAG_QTRIGINT_ENABLE 0x0080
0603 #define AR5K_TXQ_FLAG_TXNOFRMINT_ENABLE 0x0100
0604 #define AR5K_TXQ_FLAG_BACKOFF_DISABLE 0x0200
0605 #define AR5K_TXQ_FLAG_RDYTIME_EXP_POLICY_ENABLE 0x0300
0606 #define AR5K_TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE 0x0800
0607 #define AR5K_TXQ_FLAG_POST_FR_BKOFF_DIS 0x1000
0608 #define AR5K_TXQ_FLAG_COMPRESSION_ENABLE 0x2000
0609
0610
0611
0612
0613
0614
0615
0616
0617
0618
0619
0620
0621
0622
0623
0624
0625
0626
0627
0628
0629 struct ath5k_txq {
0630 unsigned int qnum;
0631 u32 *link;
0632 struct list_head q;
0633 spinlock_t lock;
0634 bool setup;
0635 int txq_len;
0636 int txq_max;
0637 bool txq_poll_mark;
0638 unsigned int txq_stuck;
0639 };
0640
0641
0642
0643
0644
0645
0646
0647
0648
0649
0650
0651
0652 struct ath5k_txq_info {
0653 enum ath5k_tx_queue tqi_type;
0654 enum ath5k_tx_queue_subtype tqi_subtype;
0655 u16 tqi_flags;
0656 u8 tqi_aifs;
0657 u16 tqi_cw_min;
0658 u16 tqi_cw_max;
0659 u32 tqi_cbr_period;
0660 u32 tqi_cbr_overflow_limit;
0661 u32 tqi_burst_time;
0662 u32 tqi_ready_time;
0663 };
0664
0665
0666
0667
0668
0669
0670
0671
0672
0673
0674
0675 enum ath5k_pkt_type {
0676 AR5K_PKT_TYPE_NORMAL = 0,
0677 AR5K_PKT_TYPE_ATIM = 1,
0678 AR5K_PKT_TYPE_PSPOLL = 2,
0679 AR5K_PKT_TYPE_BEACON = 3,
0680 AR5K_PKT_TYPE_PROBE_RESP = 4,
0681 AR5K_PKT_TYPE_PIFS = 5,
0682 };
0683
0684
0685
0686
0687 #define AR5K_TXPOWER_OFDM(_r, _v) ( \
0688 ((0 & 1) << ((_v) + 6)) | \
0689 (((ah->ah_txpower.txp_rates_power_table[(_r)]) & 0x3f) << (_v)) \
0690 )
0691
0692 #define AR5K_TXPOWER_CCK(_r, _v) ( \
0693 (ah->ah_txpower.txp_rates_power_table[(_r)] & 0x3f) << (_v) \
0694 )
0695
0696
0697
0698
0699
0700
0701
0702
0703
0704
0705
0706
0707
0708
0709
0710
0711
0712
0713
0714 struct ath5k_rx_status {
0715 u16 rs_datalen;
0716 u16 rs_tstamp;
0717 u8 rs_status;
0718 u8 rs_phyerr;
0719 s8 rs_rssi;
0720 u8 rs_keyix;
0721 u8 rs_rate;
0722 u8 rs_antenna;
0723 u8 rs_more;
0724 };
0725
0726 #define AR5K_RXERR_CRC 0x01
0727 #define AR5K_RXERR_PHY 0x02
0728 #define AR5K_RXERR_FIFO 0x04
0729 #define AR5K_RXERR_DECRYPT 0x08
0730 #define AR5K_RXERR_MIC 0x10
0731 #define AR5K_RXKEYIX_INVALID ((u8) -1)
0732 #define AR5K_TXKEYIX_INVALID ((u32) -1)
0733
0734
0735
0736
0737
0738
0739 #define AR5K_BEACON_PERIOD 0x0000ffff
0740 #define AR5K_BEACON_ENA 0x00800000
0741 #define AR5K_BEACON_RESET_TSF 0x01000000
0742
0743
0744
0745
0746
0747
0748
0749
0750
0751 #define TSF_TO_TU(_tsf) (u32)((_tsf) >> 10)
0752
0753
0754
0755
0756
0757
0758
0759
0760
0761
0762
0763
0764
0765
0766 enum ath5k_rfgain {
0767 AR5K_RFGAIN_INACTIVE = 0,
0768 AR5K_RFGAIN_ACTIVE,
0769 AR5K_RFGAIN_READ_REQUESTED,
0770 AR5K_RFGAIN_NEED_CHANGE,
0771 };
0772
0773
0774
0775
0776
0777
0778
0779
0780
0781
0782
0783 struct ath5k_gain {
0784 u8 g_step_idx;
0785 u8 g_current;
0786 u8 g_target;
0787 u8 g_low;
0788 u8 g_high;
0789 u8 g_f_corr;
0790 u8 g_state;
0791 };
0792
0793
0794
0795
0796
0797
0798
0799 #define AR5K_SLOT_TIME_9 396
0800 #define AR5K_SLOT_TIME_20 880
0801 #define AR5K_SLOT_TIME_MAX 0xffff
0802
0803
0804
0805
0806
0807
0808
0809
0810
0811
0812
0813 struct ath5k_athchan_2ghz {
0814 u32 a2_flags;
0815 u16 a2_athchan;
0816 };
0817
0818
0819
0820
0821
0822
0823
0824
0825
0826
0827
0828
0829
0830
0831
0832
0833
0834 enum ath5k_dmasize {
0835 AR5K_DMASIZE_4B = 0,
0836 AR5K_DMASIZE_8B,
0837 AR5K_DMASIZE_16B,
0838 AR5K_DMASIZE_32B,
0839 AR5K_DMASIZE_64B,
0840 AR5K_DMASIZE_128B,
0841 AR5K_DMASIZE_256B,
0842 AR5K_DMASIZE_512B
0843 };
0844
0845
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873
0874
0875
0876
0877
0878
0879
0880
0881
0882
0883
0884
0885
0886
0887
0888
0889
0890
0891
0892
0893
0894
0895 #define AR5K_MAX_RATES 32
0896
0897
0898 #define ATH5K_RATE_CODE_1M 0x1B
0899 #define ATH5K_RATE_CODE_2M 0x1A
0900 #define ATH5K_RATE_CODE_5_5M 0x19
0901 #define ATH5K_RATE_CODE_11M 0x18
0902
0903 #define ATH5K_RATE_CODE_6M 0x0B
0904 #define ATH5K_RATE_CODE_9M 0x0F
0905 #define ATH5K_RATE_CODE_12M 0x0A
0906 #define ATH5K_RATE_CODE_18M 0x0E
0907 #define ATH5K_RATE_CODE_24M 0x09
0908 #define ATH5K_RATE_CODE_36M 0x0D
0909 #define ATH5K_RATE_CODE_48M 0x08
0910 #define ATH5K_RATE_CODE_54M 0x0C
0911
0912
0913
0914 #define AR5K_SET_SHORT_PREAMBLE 0x04
0915
0916
0917
0918
0919
0920 #define AR5K_KEYCACHE_SIZE 8
0921 extern bool ath5k_modparam_nohwcrypt;
0922
0923
0924
0925
0926
0927
0928
0929
0930 #define AR5K_RSSI_EP_MULTIPLIER (1 << 7)
0931
0932 #define AR5K_ASSERT_ENTRY(_e, _s) do { \
0933 if (_e >= _s) \
0934 return false; \
0935 } while (0)
0936
0937
0938
0939
0940
0941
0942
0943
0944
0945
0946
0947
0948
0949
0950
0951
0952
0953
0954
0955
0956
0957
0958
0959
0960
0961
0962
0963
0964
0965
0966
0967
0968
0969
0970
0971
0972
0973
0974
0975
0976
0977
0978
0979
0980
0981
0982
0983
0984
0985
0986
0987
0988
0989
0990
0991
0992
0993
0994
0995
0996
0997
0998
0999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009 enum ath5k_int {
1010 AR5K_INT_RXOK = 0x00000001,
1011 AR5K_INT_RXDESC = 0x00000002,
1012 AR5K_INT_RXERR = 0x00000004,
1013 AR5K_INT_RXNOFRM = 0x00000008,
1014 AR5K_INT_RXEOL = 0x00000010,
1015 AR5K_INT_RXORN = 0x00000020,
1016 AR5K_INT_TXOK = 0x00000040,
1017 AR5K_INT_TXDESC = 0x00000080,
1018 AR5K_INT_TXERR = 0x00000100,
1019 AR5K_INT_TXNOFRM = 0x00000200,
1020 AR5K_INT_TXEOL = 0x00000400,
1021 AR5K_INT_TXURN = 0x00000800,
1022 AR5K_INT_MIB = 0x00001000,
1023 AR5K_INT_SWI = 0x00002000,
1024 AR5K_INT_RXPHY = 0x00004000,
1025 AR5K_INT_RXKCM = 0x00008000,
1026 AR5K_INT_SWBA = 0x00010000,
1027 AR5K_INT_BRSSI = 0x00020000,
1028 AR5K_INT_BMISS = 0x00040000,
1029 AR5K_INT_FATAL = 0x00080000,
1030 AR5K_INT_BNR = 0x00100000,
1031 AR5K_INT_TIM = 0x00200000,
1032 AR5K_INT_DTIM = 0x00400000,
1033 AR5K_INT_DTIM_SYNC = 0x00800000,
1034 AR5K_INT_GPIO = 0x01000000,
1035 AR5K_INT_BCN_TIMEOUT = 0x02000000,
1036 AR5K_INT_CAB_TIMEOUT = 0x04000000,
1037 AR5K_INT_QCBRORN = 0x08000000,
1038 AR5K_INT_QCBRURN = 0x10000000,
1039 AR5K_INT_QTRIG = 0x20000000,
1040 AR5K_INT_GLOBAL = 0x80000000,
1041
1042 AR5K_INT_TX_ALL = AR5K_INT_TXOK
1043 | AR5K_INT_TXDESC
1044 | AR5K_INT_TXERR
1045 | AR5K_INT_TXNOFRM
1046 | AR5K_INT_TXEOL
1047 | AR5K_INT_TXURN,
1048
1049 AR5K_INT_RX_ALL = AR5K_INT_RXOK
1050 | AR5K_INT_RXDESC
1051 | AR5K_INT_RXERR
1052 | AR5K_INT_RXNOFRM
1053 | AR5K_INT_RXEOL
1054 | AR5K_INT_RXORN,
1055
1056 AR5K_INT_COMMON = AR5K_INT_RXOK
1057 | AR5K_INT_RXDESC
1058 | AR5K_INT_RXERR
1059 | AR5K_INT_RXNOFRM
1060 | AR5K_INT_RXEOL
1061 | AR5K_INT_RXORN
1062 | AR5K_INT_TXOK
1063 | AR5K_INT_TXDESC
1064 | AR5K_INT_TXERR
1065 | AR5K_INT_TXNOFRM
1066 | AR5K_INT_TXEOL
1067 | AR5K_INT_TXURN
1068 | AR5K_INT_MIB
1069 | AR5K_INT_SWI
1070 | AR5K_INT_RXPHY
1071 | AR5K_INT_RXKCM
1072 | AR5K_INT_SWBA
1073 | AR5K_INT_BRSSI
1074 | AR5K_INT_BMISS
1075 | AR5K_INT_GPIO
1076 | AR5K_INT_GLOBAL,
1077
1078 AR5K_INT_NOCARD = 0xffffffff
1079 };
1080
1081
1082
1083
1084
1085
1086
1087
1088 enum ath5k_calibration_mask {
1089 AR5K_CALIBRATION_FULL = 0x01,
1090 AR5K_CALIBRATION_SHORT = 0x02,
1091 AR5K_CALIBRATION_NF = 0x04,
1092 AR5K_CALIBRATION_ANI = 0x08,
1093 };
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108 enum ath5k_power_mode {
1109 AR5K_PM_UNDEFINED = 0,
1110 AR5K_PM_AUTO,
1111 AR5K_PM_AWAKE,
1112 AR5K_PM_FULL_SLEEP,
1113 AR5K_PM_NETWORK_SLEEP,
1114 };
1115
1116
1117
1118
1119
1120
1121 #define AR5K_LED_INIT 0
1122 #define AR5K_LED_SCAN 1
1123 #define AR5K_LED_AUTH 2
1124 #define AR5K_LED_ASSOC 3
1125 #define AR5K_LED_RUN 4
1126
1127
1128 #define AR5K_SOFTLED_PIN 0
1129 #define AR5K_SOFTLED_ON 0
1130 #define AR5K_SOFTLED_OFF 1
1131
1132
1133
1134 struct ath5k_capabilities {
1135
1136
1137
1138
1139 DECLARE_BITMAP(cap_mode, AR5K_MODE_MAX);
1140
1141
1142
1143
1144 struct {
1145 u16 range_2ghz_min;
1146 u16 range_2ghz_max;
1147 u16 range_5ghz_min;
1148 u16 range_5ghz_max;
1149 } cap_range;
1150
1151
1152
1153
1154 struct ath5k_eeprom_info cap_eeprom;
1155
1156
1157
1158
1159 struct {
1160 u8 q_tx_num;
1161 } cap_queues;
1162
1163 bool cap_has_phyerr_counters;
1164 bool cap_has_mrr_support;
1165 bool cap_needs_2GHz_ovr;
1166 };
1167
1168
1169 #define ATH5K_NF_CAL_HIST_MAX 8
1170 struct ath5k_nfcal_hist {
1171 s16 index;
1172 s16 nfval[ATH5K_NF_CAL_HIST_MAX];
1173 };
1174
1175 #define ATH5K_LED_MAX_NAME_LEN 31
1176
1177
1178
1179
1180 struct ath5k_led {
1181 char name[ATH5K_LED_MAX_NAME_LEN + 1];
1182 struct ath5k_hw *ah;
1183 struct led_classdev led_dev;
1184 };
1185
1186
1187 struct ath5k_rfkill {
1188
1189 u16 gpio;
1190
1191 bool polarity;
1192
1193 struct tasklet_struct toggleq;
1194 };
1195
1196
1197 struct ath5k_statistics {
1198
1199 unsigned int antenna_rx[5];
1200 unsigned int antenna_tx[5];
1201
1202
1203 unsigned int rx_all_count;
1204 unsigned int tx_all_count;
1205 unsigned int rx_bytes_count;
1206
1207
1208 unsigned int tx_bytes_count;
1209
1210
1211
1212 unsigned int rxerr_crc;
1213 unsigned int rxerr_phy;
1214 unsigned int rxerr_phy_code[32];
1215 unsigned int rxerr_fifo;
1216 unsigned int rxerr_decrypt;
1217 unsigned int rxerr_mic;
1218 unsigned int rxerr_proc;
1219 unsigned int rxerr_jumbo;
1220 unsigned int txerr_retry;
1221 unsigned int txerr_fifo;
1222 unsigned int txerr_filt;
1223
1224
1225 unsigned int ack_fail;
1226 unsigned int rts_fail;
1227 unsigned int rts_ok;
1228 unsigned int fcs_error;
1229 unsigned int beacons;
1230
1231 unsigned int mib_intr;
1232 unsigned int rxorn_intr;
1233 unsigned int rxeol_intr;
1234 };
1235
1236
1237
1238
1239
1240 #define AR5K_MAX_GPIO 10
1241 #define AR5K_MAX_RF_BANKS 8
1242
1243 #if CHAN_DEBUG
1244 #define ATH_CHAN_MAX (26 + 26 + 26 + 200 + 200)
1245 #else
1246 #define ATH_CHAN_MAX (14 + 14 + 14 + 252 + 20)
1247 #endif
1248
1249 #define ATH_RXBUF 40
1250 #define ATH_TXBUF 200
1251 #define ATH_BCBUF 4
1252 #define ATH5K_TXQ_LEN_MAX (ATH_TXBUF / 4)
1253 #define ATH5K_TXQ_LEN_LOW (ATH5K_TXQ_LEN_MAX / 2)
1254
1255 DECLARE_EWMA(beacon_rssi, 10, 8)
1256
1257
1258 struct ath5k_hw {
1259 struct ath_common common;
1260
1261 struct pci_dev *pdev;
1262 struct device *dev;
1263 int irq;
1264 u16 devid;
1265 void __iomem *iobase;
1266 struct mutex lock;
1267 struct ieee80211_hw *hw;
1268 struct ieee80211_supported_band sbands[NUM_NL80211_BANDS];
1269 struct ieee80211_channel channels[ATH_CHAN_MAX];
1270 struct ieee80211_rate rates[NUM_NL80211_BANDS][AR5K_MAX_RATES];
1271 s8 rate_idx[NUM_NL80211_BANDS][AR5K_MAX_RATES];
1272 enum nl80211_iftype opmode;
1273
1274 #ifdef CONFIG_ATH5K_DEBUG
1275 struct ath5k_dbg_info debug;
1276 #endif
1277
1278 struct ath5k_buf *bufptr;
1279 struct ath5k_desc *desc;
1280 dma_addr_t desc_daddr;
1281 size_t desc_len;
1282
1283 DECLARE_BITMAP(status, 4);
1284 #define ATH_STAT_INVALID 0
1285 #define ATH_STAT_LEDSOFT 2
1286 #define ATH_STAT_STARTED 3
1287 #define ATH_STAT_RESET 4
1288
1289 unsigned int filter_flags;
1290 unsigned int fif_filter_flags;
1291 struct ieee80211_channel *curchan;
1292
1293 u16 nvifs;
1294
1295 enum ath5k_int imask;
1296
1297 spinlock_t irqlock;
1298 bool rx_pending;
1299 bool tx_pending;
1300
1301 u8 bssidmask[ETH_ALEN];
1302
1303 unsigned int led_pin,
1304 led_on;
1305
1306 struct work_struct reset_work;
1307 struct work_struct calib_work;
1308
1309 struct list_head rxbuf;
1310 spinlock_t rxbuflock;
1311 u32 *rxlink;
1312 struct tasklet_struct rxtq;
1313 struct ath5k_led rx_led;
1314
1315 struct list_head txbuf;
1316 spinlock_t txbuflock;
1317 unsigned int txbuf_len;
1318 struct ath5k_txq txqs[AR5K_NUM_TX_QUEUES];
1319 struct tasklet_struct txtq;
1320 struct ath5k_led tx_led;
1321
1322 struct ath5k_rfkill rf_kill;
1323
1324 spinlock_t block;
1325 struct tasklet_struct beacontq;
1326 struct list_head bcbuf;
1327 struct ieee80211_vif *bslot[ATH_BCBUF];
1328 u16 num_ap_vifs;
1329 u16 num_adhoc_vifs;
1330 u16 num_mesh_vifs;
1331 unsigned int bhalq,
1332 bmisscount,
1333 bintval,
1334 bsent;
1335 unsigned int nexttbtt;
1336 struct ath5k_txq *cabq;
1337
1338 bool assoc;
1339 bool enable_beacon;
1340
1341 struct ath5k_statistics stats;
1342
1343 struct ath5k_ani_state ani_state;
1344 struct tasklet_struct ani_tasklet;
1345
1346 struct delayed_work tx_complete_work;
1347
1348 struct survey_info survey;
1349
1350 enum ath5k_int ah_imr;
1351
1352 struct ieee80211_channel *ah_current_channel;
1353 bool ah_iq_cal_needed;
1354 bool ah_single_chip;
1355
1356 enum ath5k_version ah_version;
1357 enum ath5k_radio ah_radio;
1358 u32 ah_mac_srev;
1359 u16 ah_mac_version;
1360 u16 ah_phy_revision;
1361 u16 ah_radio_5ghz_revision;
1362 u16 ah_radio_2ghz_revision;
1363
1364 #define ah_modes ah_capabilities.cap_mode
1365 #define ah_ee_version ah_capabilities.cap_eeprom.ee_version
1366
1367 u8 ah_retry_long;
1368 u8 ah_retry_short;
1369
1370 bool ah_use_32khz_clock;
1371
1372 u8 ah_coverage_class;
1373 bool ah_ack_bitrate_high;
1374 u8 ah_bwmode;
1375 bool ah_short_slot;
1376
1377
1378 u32 ah_ant_ctl[AR5K_EEPROM_N_MODES][AR5K_ANT_MAX];
1379 u8 ah_ant_mode;
1380 u8 ah_tx_ant;
1381 u8 ah_def_ant;
1382
1383 struct ath5k_capabilities ah_capabilities;
1384
1385 struct ath5k_txq_info ah_txq[AR5K_NUM_TX_QUEUES];
1386 u32 ah_txq_status;
1387 u32 ah_txq_imr_txok;
1388 u32 ah_txq_imr_txerr;
1389 u32 ah_txq_imr_txurn;
1390 u32 ah_txq_imr_txdesc;
1391 u32 ah_txq_imr_txeol;
1392 u32 ah_txq_imr_cbrorn;
1393 u32 ah_txq_imr_cbrurn;
1394 u32 ah_txq_imr_qtrig;
1395 u32 ah_txq_imr_nofrm;
1396
1397 u32 ah_txq_isr_txok_all;
1398
1399 u32 *ah_rf_banks;
1400 size_t ah_rf_banks_size;
1401 size_t ah_rf_regs_count;
1402 struct ath5k_gain ah_gain;
1403 u8 ah_offset[AR5K_MAX_RF_BANKS];
1404
1405
1406 struct {
1407
1408 u8 tmpL[AR5K_EEPROM_N_PD_GAINS]
1409 [AR5K_EEPROM_POWER_TABLE_SIZE];
1410 u8 tmpR[AR5K_EEPROM_N_PD_GAINS]
1411 [AR5K_EEPROM_POWER_TABLE_SIZE];
1412 u8 txp_pd_table[AR5K_EEPROM_POWER_TABLE_SIZE * 2];
1413 u16 txp_rates_power_table[AR5K_MAX_RATES];
1414 u8 txp_min_idx;
1415 bool txp_tpc;
1416
1417 s16 txp_min_pwr;
1418 s16 txp_max_pwr;
1419 s16 txp_cur_pwr;
1420
1421 s16 txp_offset;
1422 s16 txp_ofdm;
1423 s16 txp_cck_ofdm_gainf_delta;
1424
1425 s16 txp_cck_ofdm_pwr_delta;
1426 bool txp_setup;
1427 int txp_requested;
1428 } ah_txpower;
1429
1430 struct ath5k_nfcal_hist ah_nfcal_hist;
1431
1432
1433 struct ewma_beacon_rssi ah_beacon_rssi_avg;
1434
1435
1436 s32 ah_noise_floor;
1437
1438
1439 unsigned long ah_cal_next_full;
1440 unsigned long ah_cal_next_short;
1441 unsigned long ah_cal_next_ani;
1442
1443
1444 u8 ah_cal_mask;
1445
1446
1447
1448
1449 int (*ah_setup_tx_desc)(struct ath5k_hw *, struct ath5k_desc *,
1450 unsigned int, unsigned int, int, enum ath5k_pkt_type,
1451 unsigned int, unsigned int, unsigned int, unsigned int,
1452 unsigned int, unsigned int, unsigned int, unsigned int);
1453 int (*ah_proc_tx_desc)(struct ath5k_hw *, struct ath5k_desc *,
1454 struct ath5k_tx_status *);
1455 int (*ah_proc_rx_desc)(struct ath5k_hw *, struct ath5k_desc *,
1456 struct ath5k_rx_status *);
1457 };
1458
1459 struct ath_bus_ops {
1460 enum ath_bus_type ath_bus_type;
1461 void (*read_cachesize)(struct ath_common *common, int *csz);
1462 bool (*eeprom_read)(struct ath_common *common, u32 off, u16 *data);
1463 int (*eeprom_read_mac)(struct ath5k_hw *ah, u8 *mac);
1464 };
1465
1466
1467
1468
1469 extern const struct ieee80211_ops ath5k_hw_ops;
1470
1471
1472 int ath5k_hw_init(struct ath5k_hw *ah);
1473 void ath5k_hw_deinit(struct ath5k_hw *ah);
1474
1475 int ath5k_sysfs_register(struct ath5k_hw *ah);
1476 void ath5k_sysfs_unregister(struct ath5k_hw *ah);
1477
1478
1479 int ath5k_hw_read_srev(struct ath5k_hw *ah);
1480
1481
1482 int ath5k_init_leds(struct ath5k_hw *ah);
1483 void ath5k_led_enable(struct ath5k_hw *ah);
1484 void ath5k_led_off(struct ath5k_hw *ah);
1485 void ath5k_unregister_leds(struct ath5k_hw *ah);
1486
1487
1488
1489 int ath5k_hw_nic_wakeup(struct ath5k_hw *ah, struct ieee80211_channel *channel);
1490 int ath5k_hw_on_hold(struct ath5k_hw *ah);
1491 int ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
1492 struct ieee80211_channel *channel, bool fast, bool skip_pcu);
1493 int ath5k_hw_register_timeout(struct ath5k_hw *ah, u32 reg, u32 flag, u32 val,
1494 bool is_set);
1495
1496
1497
1498
1499 unsigned int ath5k_hw_htoclock(struct ath5k_hw *ah, unsigned int usec);
1500 unsigned int ath5k_hw_clocktoh(struct ath5k_hw *ah, unsigned int clock);
1501 void ath5k_hw_set_clockrate(struct ath5k_hw *ah);
1502
1503
1504
1505 void ath5k_hw_start_rx_dma(struct ath5k_hw *ah);
1506 u32 ath5k_hw_get_rxdp(struct ath5k_hw *ah);
1507 int ath5k_hw_set_rxdp(struct ath5k_hw *ah, u32 phys_addr);
1508 int ath5k_hw_start_tx_dma(struct ath5k_hw *ah, unsigned int queue);
1509 int ath5k_hw_stop_beacon_queue(struct ath5k_hw *ah, unsigned int queue);
1510 u32 ath5k_hw_get_txdp(struct ath5k_hw *ah, unsigned int queue);
1511 int ath5k_hw_set_txdp(struct ath5k_hw *ah, unsigned int queue,
1512 u32 phys_addr);
1513 int ath5k_hw_update_tx_triglevel(struct ath5k_hw *ah, bool increase);
1514
1515 bool ath5k_hw_is_intr_pending(struct ath5k_hw *ah);
1516 int ath5k_hw_get_isr(struct ath5k_hw *ah, enum ath5k_int *interrupt_mask);
1517 enum ath5k_int ath5k_hw_set_imr(struct ath5k_hw *ah, enum ath5k_int new_mask);
1518 void ath5k_hw_update_mib_counters(struct ath5k_hw *ah);
1519
1520 void ath5k_hw_dma_init(struct ath5k_hw *ah);
1521 int ath5k_hw_dma_stop(struct ath5k_hw *ah);
1522
1523
1524 int ath5k_eeprom_init(struct ath5k_hw *ah);
1525 void ath5k_eeprom_detach(struct ath5k_hw *ah);
1526 int ath5k_eeprom_mode_from_channel(struct ath5k_hw *ah,
1527 struct ieee80211_channel *channel);
1528
1529
1530
1531 int ath5k_hw_get_frame_duration(struct ath5k_hw *ah, enum nl80211_band band,
1532 int len, struct ieee80211_rate *rate, bool shortpre);
1533 unsigned int ath5k_hw_get_default_slottime(struct ath5k_hw *ah);
1534 unsigned int ath5k_hw_get_default_sifs(struct ath5k_hw *ah);
1535 int ath5k_hw_set_opmode(struct ath5k_hw *ah, enum nl80211_iftype opmode);
1536 void ath5k_hw_set_coverage_class(struct ath5k_hw *ah, u8 coverage_class);
1537
1538 int ath5k_hw_set_lladdr(struct ath5k_hw *ah, const u8 *mac);
1539 void ath5k_hw_set_bssid(struct ath5k_hw *ah);
1540 void ath5k_hw_set_bssid_mask(struct ath5k_hw *ah, const u8 *mask);
1541 void ath5k_hw_set_mcast_filter(struct ath5k_hw *ah, u32 filter0, u32 filter1);
1542 u32 ath5k_hw_get_rx_filter(struct ath5k_hw *ah);
1543 void ath5k_hw_set_rx_filter(struct ath5k_hw *ah, u32 filter);
1544
1545 void ath5k_hw_start_rx_pcu(struct ath5k_hw *ah);
1546 void ath5k_hw_stop_rx_pcu(struct ath5k_hw *ah);
1547
1548 u64 ath5k_hw_get_tsf64(struct ath5k_hw *ah);
1549 void ath5k_hw_set_tsf64(struct ath5k_hw *ah, u64 tsf64);
1550 void ath5k_hw_reset_tsf(struct ath5k_hw *ah);
1551 void ath5k_hw_init_beacon_timers(struct ath5k_hw *ah, u32 next_beacon,
1552 u32 interval);
1553 bool ath5k_hw_check_beacon_timers(struct ath5k_hw *ah, int intval);
1554
1555 void ath5k_hw_pcu_init(struct ath5k_hw *ah, enum nl80211_iftype op_mode);
1556
1557
1558 int ath5k_hw_get_tx_queueprops(struct ath5k_hw *ah, int queue,
1559 struct ath5k_txq_info *queue_info);
1560 int ath5k_hw_set_tx_queueprops(struct ath5k_hw *ah, int queue,
1561 const struct ath5k_txq_info *queue_info);
1562 int ath5k_hw_setup_tx_queue(struct ath5k_hw *ah,
1563 enum ath5k_tx_queue queue_type,
1564 struct ath5k_txq_info *queue_info);
1565 void ath5k_hw_set_tx_retry_limits(struct ath5k_hw *ah,
1566 unsigned int queue);
1567 u32 ath5k_hw_num_tx_pending(struct ath5k_hw *ah, unsigned int queue);
1568 void ath5k_hw_release_tx_queue(struct ath5k_hw *ah, unsigned int queue);
1569 int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue);
1570 int ath5k_hw_set_ifs_intervals(struct ath5k_hw *ah, unsigned int slot_time);
1571
1572 int ath5k_hw_init_queues(struct ath5k_hw *ah);
1573
1574
1575 int ath5k_hw_init_desc_functions(struct ath5k_hw *ah);
1576 int ath5k_hw_setup_rx_desc(struct ath5k_hw *ah, struct ath5k_desc *desc,
1577 u32 size, unsigned int flags);
1578 int ath5k_hw_setup_mrr_tx_desc(struct ath5k_hw *ah, struct ath5k_desc *desc,
1579 unsigned int tx_rate1, u_int tx_tries1, u_int tx_rate2,
1580 u_int tx_tries2, unsigned int tx_rate3, u_int tx_tries3);
1581
1582
1583
1584 void ath5k_hw_set_ledstate(struct ath5k_hw *ah, unsigned int state);
1585 int ath5k_hw_set_gpio_input(struct ath5k_hw *ah, u32 gpio);
1586 int ath5k_hw_set_gpio_output(struct ath5k_hw *ah, u32 gpio);
1587 u32 ath5k_hw_get_gpio(struct ath5k_hw *ah, u32 gpio);
1588 int ath5k_hw_set_gpio(struct ath5k_hw *ah, u32 gpio, u32 val);
1589 void ath5k_hw_set_gpio_intr(struct ath5k_hw *ah, unsigned int gpio,
1590 u32 interrupt_level);
1591
1592
1593
1594 void ath5k_rfkill_hw_start(struct ath5k_hw *ah);
1595 void ath5k_rfkill_hw_stop(struct ath5k_hw *ah);
1596
1597
1598
1599 int ath5k_hw_set_capabilities(struct ath5k_hw *ah);
1600 int ath5k_hw_enable_pspoll(struct ath5k_hw *ah, u8 *bssid, u16 assoc_id);
1601 int ath5k_hw_disable_pspoll(struct ath5k_hw *ah);
1602
1603
1604
1605 int ath5k_hw_write_initvals(struct ath5k_hw *ah, u8 mode, bool change_channel);
1606
1607
1608
1609
1610 u16 ath5k_hw_radio_revision(struct ath5k_hw *ah, enum nl80211_band band);
1611 int ath5k_hw_phy_disable(struct ath5k_hw *ah);
1612
1613 enum ath5k_rfgain ath5k_hw_gainf_calibrate(struct ath5k_hw *ah);
1614 int ath5k_hw_rfgain_opt_init(struct ath5k_hw *ah);
1615
1616 bool ath5k_channel_ok(struct ath5k_hw *ah, struct ieee80211_channel *channel);
1617
1618 void ath5k_hw_init_nfcal_hist(struct ath5k_hw *ah);
1619 int ath5k_hw_phy_calibrate(struct ath5k_hw *ah,
1620 struct ieee80211_channel *channel);
1621 void ath5k_hw_update_noise_floor(struct ath5k_hw *ah);
1622
1623 bool ath5k_hw_chan_has_spur_noise(struct ath5k_hw *ah,
1624 struct ieee80211_channel *channel);
1625
1626 void ath5k_hw_set_antenna_mode(struct ath5k_hw *ah, u8 ant_mode);
1627 void ath5k_hw_set_antenna_switch(struct ath5k_hw *ah, u8 ee_mode);
1628
1629 int ath5k_hw_set_txpower_limit(struct ath5k_hw *ah, u8 txpower);
1630
1631 int ath5k_hw_phy_init(struct ath5k_hw *ah, struct ieee80211_channel *channel,
1632 u8 mode, bool fast);
1633
1634
1635
1636
1637
1638 static inline struct ath_common *ath5k_hw_common(struct ath5k_hw *ah)
1639 {
1640 return &ah->common;
1641 }
1642
1643 static inline struct ath_regulatory *ath5k_hw_regulatory(struct ath5k_hw *ah)
1644 {
1645 return &(ath5k_hw_common(ah)->regulatory);
1646 }
1647
1648 #ifdef CONFIG_ATH5K_AHB
1649 #define AR5K_AR2315_PCI_BASE ((void __iomem *)0xb0100000)
1650
1651 static inline void __iomem *ath5k_ahb_reg(struct ath5k_hw *ah, u16 reg)
1652 {
1653
1654
1655 if (unlikely((reg >= 0x4000) && (reg < 0x5000) &&
1656 (ah->ah_mac_srev >= AR5K_SREV_AR2315_R6)))
1657 return AR5K_AR2315_PCI_BASE + reg;
1658
1659 return ah->iobase + reg;
1660 }
1661
1662 static inline u32 ath5k_hw_reg_read(struct ath5k_hw *ah, u16 reg)
1663 {
1664 return ioread32(ath5k_ahb_reg(ah, reg));
1665 }
1666
1667 static inline void ath5k_hw_reg_write(struct ath5k_hw *ah, u32 val, u16 reg)
1668 {
1669 iowrite32(val, ath5k_ahb_reg(ah, reg));
1670 }
1671
1672 #else
1673
1674 static inline u32 ath5k_hw_reg_read(struct ath5k_hw *ah, u16 reg)
1675 {
1676 return ioread32(ah->iobase + reg);
1677 }
1678
1679 static inline void ath5k_hw_reg_write(struct ath5k_hw *ah, u32 val, u16 reg)
1680 {
1681 iowrite32(val, ah->iobase + reg);
1682 }
1683
1684 #endif
1685
1686 static inline enum ath_bus_type ath5k_get_bus_type(struct ath5k_hw *ah)
1687 {
1688 return ath5k_hw_common(ah)->bus_ops->ath_bus_type;
1689 }
1690
1691 static inline void ath5k_read_cachesize(struct ath_common *common, int *csz)
1692 {
1693 common->bus_ops->read_cachesize(common, csz);
1694 }
1695
1696 static inline bool ath5k_hw_nvram_read(struct ath5k_hw *ah, u32 off, u16 *data)
1697 {
1698 struct ath_common *common = ath5k_hw_common(ah);
1699 return common->bus_ops->eeprom_read(common, off, data);
1700 }
1701
1702 static inline u32 ath5k_hw_bitswap(u32 val, unsigned int bits)
1703 {
1704 u32 retval = 0, bit, i;
1705
1706 for (i = 0; i < bits; i++) {
1707 bit = (val >> i) & 1;
1708 retval = (retval << 1) | bit;
1709 }
1710
1711 return retval;
1712 }
1713
1714 #endif