diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath5k/ath5k.h')
-rw-r--r-- | drivers/net/wireless/ath/ath5k/ath5k.h | 68 |
1 files changed, 52 insertions, 16 deletions
diff --git a/drivers/net/wireless/ath/ath5k/ath5k.h b/drivers/net/wireless/ath/ath5k/ath5k.h index 1d7491c85460..2785946f659a 100644 --- a/drivers/net/wireless/ath/ath5k/ath5k.h +++ b/drivers/net/wireless/ath/ath5k/ath5k.h | |||
@@ -202,6 +202,8 @@ | |||
202 | #define AR5K_TUNE_MAX_TXPOWER 63 | 202 | #define AR5K_TUNE_MAX_TXPOWER 63 |
203 | #define AR5K_TUNE_DEFAULT_TXPOWER 25 | 203 | #define AR5K_TUNE_DEFAULT_TXPOWER 25 |
204 | #define AR5K_TUNE_TPC_TXPOWER false | 204 | #define AR5K_TUNE_TPC_TXPOWER false |
205 | #define ATH5K_TUNE_CALIBRATION_INTERVAL_FULL 10000 /* 10 sec */ | ||
206 | #define ATH5K_TUNE_CALIBRATION_INTERVAL_ANI 1000 /* 1 sec */ | ||
205 | 207 | ||
206 | #define AR5K_INIT_CARR_SENSE_EN 1 | 208 | #define AR5K_INIT_CARR_SENSE_EN 1 |
207 | 209 | ||
@@ -799,9 +801,9 @@ struct ath5k_athchan_2ghz { | |||
799 | * @AR5K_INT_TXURN: received when we should increase the TX trigger threshold | 801 | * @AR5K_INT_TXURN: received when we should increase the TX trigger threshold |
800 | * We currently do increments on interrupt by | 802 | * We currently do increments on interrupt by |
801 | * (AR5K_TUNE_MAX_TX_FIFO_THRES - current_trigger_level) / 2 | 803 | * (AR5K_TUNE_MAX_TX_FIFO_THRES - current_trigger_level) / 2 |
802 | * @AR5K_INT_MIB: Indicates the Management Information Base counters should be | 804 | * @AR5K_INT_MIB: Indicates the either Management Information Base counters or |
803 | * checked. We should do this with ath5k_hw_update_mib_counters() but | 805 | * one of the PHY error counters reached the maximum value and should be |
804 | * it seems we should also then do some noise immunity work. | 806 | * read and cleared. |
805 | * @AR5K_INT_RXPHY: RX PHY Error | 807 | * @AR5K_INT_RXPHY: RX PHY Error |
806 | * @AR5K_INT_RXKCM: RX Key cache miss | 808 | * @AR5K_INT_RXKCM: RX Key cache miss |
807 | * @AR5K_INT_SWBA: SoftWare Beacon Alert - indicates its time to send a | 809 | * @AR5K_INT_SWBA: SoftWare Beacon Alert - indicates its time to send a |
@@ -889,10 +891,11 @@ enum ath5k_int { | |||
889 | AR5K_INT_NOCARD = 0xffffffff | 891 | AR5K_INT_NOCARD = 0xffffffff |
890 | }; | 892 | }; |
891 | 893 | ||
892 | /* Software interrupts used for calibration */ | 894 | /* mask which calibration is active at the moment */ |
893 | enum ath5k_software_interrupt { | 895 | enum ath5k_calibration_mask { |
894 | AR5K_SWI_FULL_CALIBRATION = 0x01, | 896 | AR5K_CALIBRATION_FULL = 0x01, |
895 | AR5K_SWI_SHORT_CALIBRATION = 0x02, | 897 | AR5K_CALIBRATION_SHORT = 0x02, |
898 | AR5K_CALIBRATION_ANI = 0x04, | ||
896 | }; | 899 | }; |
897 | 900 | ||
898 | /* | 901 | /* |
@@ -981,6 +984,8 @@ struct ath5k_capabilities { | |||
981 | struct { | 984 | struct { |
982 | u8 q_tx_num; | 985 | u8 q_tx_num; |
983 | } cap_queues; | 986 | } cap_queues; |
987 | |||
988 | bool cap_has_phyerr_counters; | ||
984 | }; | 989 | }; |
985 | 990 | ||
986 | /* size of noise floor history (keep it a power of two) */ | 991 | /* size of noise floor history (keep it a power of two) */ |
@@ -991,6 +996,15 @@ struct ath5k_nfcal_hist | |||
991 | s16 nfval[ATH5K_NF_CAL_HIST_MAX]; /* last few noise floors */ | 996 | s16 nfval[ATH5K_NF_CAL_HIST_MAX]; /* last few noise floors */ |
992 | }; | 997 | }; |
993 | 998 | ||
999 | /** | ||
1000 | * struct avg_val - Helper structure for average calculation | ||
1001 | * @avg: contains the actual average value | ||
1002 | * @avg_weight: is used internally during calculation to prevent rounding errors | ||
1003 | */ | ||
1004 | struct ath5k_avg_val { | ||
1005 | int avg; | ||
1006 | int avg_weight; | ||
1007 | }; | ||
994 | 1008 | ||
995 | /***************************************\ | 1009 | /***************************************\ |
996 | HARDWARE ABSTRACTION LAYER STRUCTURE | 1010 | HARDWARE ABSTRACTION LAYER STRUCTURE |
@@ -1095,17 +1109,18 @@ struct ath5k_hw { | |||
1095 | 1109 | ||
1096 | struct ath5k_nfcal_hist ah_nfcal_hist; | 1110 | struct ath5k_nfcal_hist ah_nfcal_hist; |
1097 | 1111 | ||
1112 | /* average beacon RSSI in our BSS (used by ANI) */ | ||
1113 | struct ath5k_avg_val ah_beacon_rssi_avg; | ||
1114 | |||
1098 | /* noise floor from last periodic calibration */ | 1115 | /* noise floor from last periodic calibration */ |
1099 | s32 ah_noise_floor; | 1116 | s32 ah_noise_floor; |
1100 | 1117 | ||
1101 | /* Calibration timestamp */ | 1118 | /* Calibration timestamp */ |
1102 | unsigned long ah_cal_tstamp; | 1119 | unsigned long ah_cal_next_full; |
1103 | 1120 | unsigned long ah_cal_next_ani; | |
1104 | /* Calibration interval (secs) */ | ||
1105 | u8 ah_cal_intval; | ||
1106 | 1121 | ||
1107 | /* Software interrupt mask */ | 1122 | /* Calibration mask */ |
1108 | u8 ah_swi_mask; | 1123 | u8 ah_cal_mask; |
1109 | 1124 | ||
1110 | /* | 1125 | /* |
1111 | * Function pointers | 1126 | * Function pointers |
@@ -1163,8 +1178,7 @@ int ath5k_hw_update_tx_triglevel(struct ath5k_hw *ah, bool increase); | |||
1163 | bool ath5k_hw_is_intr_pending(struct ath5k_hw *ah); | 1178 | bool ath5k_hw_is_intr_pending(struct ath5k_hw *ah); |
1164 | int ath5k_hw_get_isr(struct ath5k_hw *ah, enum ath5k_int *interrupt_mask); | 1179 | int ath5k_hw_get_isr(struct ath5k_hw *ah, enum ath5k_int *interrupt_mask); |
1165 | enum ath5k_int ath5k_hw_set_imr(struct ath5k_hw *ah, enum ath5k_int new_mask); | 1180 | enum ath5k_int ath5k_hw_set_imr(struct ath5k_hw *ah, enum ath5k_int new_mask); |
1166 | void ath5k_hw_update_mib_counters(struct ath5k_hw *ah, | 1181 | void ath5k_hw_update_mib_counters(struct ath5k_hw *ah); |
1167 | struct ieee80211_low_level_stats *stats); | ||
1168 | 1182 | ||
1169 | /* EEPROM access functions */ | 1183 | /* EEPROM access functions */ |
1170 | int ath5k_eeprom_init(struct ath5k_hw *ah); | 1184 | int ath5k_eeprom_init(struct ath5k_hw *ah); |
@@ -1256,7 +1270,6 @@ int ath5k_hw_channel(struct ath5k_hw *ah, struct ieee80211_channel *channel); | |||
1256 | void ath5k_hw_init_nfcal_hist(struct ath5k_hw *ah); | 1270 | void ath5k_hw_init_nfcal_hist(struct ath5k_hw *ah); |
1257 | int ath5k_hw_phy_calibrate(struct ath5k_hw *ah, | 1271 | int ath5k_hw_phy_calibrate(struct ath5k_hw *ah, |
1258 | struct ieee80211_channel *channel); | 1272 | struct ieee80211_channel *channel); |
1259 | void ath5k_hw_calibration_poll(struct ath5k_hw *ah); | ||
1260 | /* Spur mitigation */ | 1273 | /* Spur mitigation */ |
1261 | bool ath5k_hw_chan_has_spur_noise(struct ath5k_hw *ah, | 1274 | bool ath5k_hw_chan_has_spur_noise(struct ath5k_hw *ah, |
1262 | struct ieee80211_channel *channel); | 1275 | struct ieee80211_channel *channel); |
@@ -1308,4 +1321,27 @@ static inline u32 ath5k_hw_bitswap(u32 val, unsigned int bits) | |||
1308 | return retval; | 1321 | return retval; |
1309 | } | 1322 | } |
1310 | 1323 | ||
1324 | #define AVG_SAMPLES 8 | ||
1325 | #define AVG_FACTOR 1000 | ||
1326 | |||
1327 | /** | ||
1328 | * ath5k_moving_average - Exponentially weighted moving average | ||
1329 | * @avg: average structure | ||
1330 | * @val: current value | ||
1331 | * | ||
1332 | * This implementation make use of a struct ath5k_avg_val to prevent rounding | ||
1333 | * errors. | ||
1334 | */ | ||
1335 | static inline struct ath5k_avg_val | ||
1336 | ath5k_moving_average(const struct ath5k_avg_val avg, const int val) | ||
1337 | { | ||
1338 | struct ath5k_avg_val new; | ||
1339 | new.avg_weight = avg.avg_weight ? | ||
1340 | (((avg.avg_weight * ((AVG_SAMPLES) - 1)) + | ||
1341 | (val * (AVG_FACTOR))) / (AVG_SAMPLES)) : | ||
1342 | (val * (AVG_FACTOR)); | ||
1343 | new.avg = new.avg_weight / (AVG_FACTOR); | ||
1344 | return new; | ||
1345 | } | ||
1346 | |||
1311 | #endif | 1347 | #endif |