diff options
Diffstat (limited to 'package/madwifi/patches-testing/316-ani_fix.patch')
-rw-r--r-- | package/madwifi/patches-testing/316-ani_fix.patch | 730 |
1 files changed, 730 insertions, 0 deletions
diff --git a/package/madwifi/patches-testing/316-ani_fix.patch b/package/madwifi/patches-testing/316-ani_fix.patch new file mode 100644 index 0000000000..ad7deb036c --- /dev/null +++ b/package/madwifi/patches-testing/316-ani_fix.patch @@ -0,0 +1,730 @@ +--- a/ath/if_ath.c ++++ b/ath/if_ath.c +@@ -343,6 +343,8 @@ + unsigned int param, unsigned int value); + + static u_int32_t ath_get_real_maxtxpower(struct ath_softc *sc); ++static int ath_setintmit(struct ath_softc *sc); ++static u_int32_t ath_calcrxfilter(struct ath_softc *sc); + + #ifdef AR_DEBUG + static int ath_txq_check(struct ath_softc *sc, struct ath_txq *txq, const char *msg); +@@ -356,7 +358,6 @@ + static char *ratectl = DEF_RATE_CTL; + static int rfkill = 0; + static int hal_tpc = 0; +-static int intmit = 0; + static int countrycode = CTRY_DEFAULT; + static int maxvaps = ATH_MAXVAPS_DEFAULT; + static int outdoor = 0; +@@ -398,7 +399,6 @@ + #endif + MODULE_PARM(autocreate, "s"); + MODULE_PARM(ratectl, "s"); +-MODULE_PARM(intmit, "i"); + #else + #include <linux/moduleparam.h> + module_param(beacon_cal, int, 0600); +@@ -412,7 +412,6 @@ + #endif + module_param(autocreate, charp, 0600); + module_param(ratectl, charp, 0600); +-module_param(intmit, int, 0600); + #endif + MODULE_PARM_DESC(countrycode, "Override default country code. Default is 0."); + MODULE_PARM_DESC(maxvaps, "Maximum VAPs. Default is 4."); +@@ -428,7 +427,6 @@ + "'none' to disable"); + MODULE_PARM_DESC(ratectl, "Rate control algorithm [amrr|minstrel|onoe|sample], " + "defaults to '" DEF_RATE_CTL "'"); +-MODULE_PARM_DESC(intmit, "Enable interference mitigation by default. Default is 0."); + + #ifdef AR_DEBUG + static int ath_debug = 0; +@@ -585,23 +583,13 @@ + if (ath_hal_hastxpowlimit(ah)) { + ic->ic_caps |= IEEE80211_C_TXPMGT; + } +- /* Interference mitigation/ambient noise immunity (ANI). +- * In modes other than HAL_M_STA, it causes receive sensitivity +- * problems for OFDM. */ ++ /* Interference mitigation/ambient noise immunity (ANI). */ + sc->sc_hasintmit = ath_hal_hasintmit(ah); +- sc->sc_useintmit = (intmit && sc->sc_hasintmit); +- if (!sc->sc_hasintmit && intmit) { +- WPRINTF(sc, "Interference mitigation was requested, but is not" +- "supported by the HAL/hardware.\n"); +- intmit = 0; /* Stop use in future ath_attach(). */ +- } +- else { +- ath_hal_setintmit(ah, sc->sc_useintmit); +- DPRINTF(sc, ATH_DEBUG_ANY, "Interference mitigation is " +- "supported. Currently %s.\n", +- (sc->sc_useintmit ? "enabled" : "disabled")); +- } + ++ /* auto, mode dependent */ ++ sc->sc_useintmit = -1; ++ sc->sc_noise_immunity = -1; ++ sc->sc_ofdm_weak_det = -1; + sc->sc_dmasize_stomp = 0; + + /* +@@ -614,15 +602,6 @@ + sc->sc_mrretry = ath_hal_setupxtxdesc(ah, NULL, 0,0, 0,0, 0,0); + + /* +- * Check if the device has hardware counters for PHY +- * errors. If so we need to enable the MIB interrupt +- * so we can act on stat triggers. +- */ +- sc->sc_needmib = ath_hal_hwphycounters(ah) && +- sc->sc_hasintmit && +- sc->sc_useintmit; +- +- /* + * Get the hardware key cache size. + */ + sc->sc_keymax = ath_hal_keycachesize(ah); +@@ -1593,37 +1572,6 @@ + ath_init(dev); + } + +-/* NB: Int. mit. was not implemented so that it could be enabled/disabled, +- * and actually in 0.9.30.13 HAL it really can't even be disabled because +- * it will start adjusting registers even when we turn off the capability +- * in the HAL. +- * +- * NB: This helper function basically clobbers all the related registers +- * if we have disabled int. mit. cap, allowing us to turn it on and off and +- * work around the bug preventing it from being disabled. */ +-static inline void ath_override_intmit_if_disabled(struct ath_softc *sc) { +- /* Restore int. mit. registers if they were turned off. */ +- if (sc->sc_hasintmit && !sc->sc_useintmit) +- ath_hal_restore_default_intmit(sc->sc_ah); +- /* Sanity check... remove later. */ +- if (!sc->sc_useintmit) { +- ath_hal_verify_default_intmit(sc->sc_ah); +- /* If we don't have int. mit. and we don't have DFS on channel, +- * it is safe to filter error packets. */ +- if (!ath_radar_is_dfs_required(sc, &sc->sc_curchan)) { +- ath_hal_setrxfilter(sc->sc_ah, +- ath_hal_getrxfilter(sc->sc_ah) & +- ~HAL_RX_FILTER_PHYERR); +- } +- } +- else { +- /* Make sure that we have errors in RX filter because ANI needs +- * them. */ +- ath_hal_setrxfilter(sc->sc_ah, +- ath_hal_getrxfilter(sc->sc_ah) | HAL_RX_FILTER_PHYERR); +- } +-} +- + static HAL_BOOL ath_hw_reset(struct ath_softc *sc, HAL_OPMODE opmode, + HAL_CHANNEL *channel, HAL_BOOL bChannelChange, + HAL_STATUS *status) +@@ -1698,11 +1646,7 @@ + ath_hal_settpc(sc->sc_ah, hal_tpc); + } + #endif +-#if 0 /* Setting via HAL does not work, so it is done manually below. */ +- if (sc->sc_hasintmit) +- ath_hal_setintmit(sc->sc_ah, sc->sc_useintmit); +-#endif +- ath_override_intmit_if_disabled(sc); ++ ath_setintmit(sc); + if (sc->sc_dmasize_stomp) + ath_hal_set_dmasize_pcie(sc->sc_ah); + if (sc->sc_softled) +@@ -2496,7 +2440,6 @@ + + /* Let the HAL handle the event. */ + ath_hal_mibevent(ah, &sc->sc_halstats); +- ath_override_intmit_if_disabled(sc); + } + } + if (needmark) +@@ -2564,6 +2507,55 @@ + return flags; + } + ++static int ath_setintmit(struct ath_softc *sc) ++{ ++ struct ath_hal *ah = sc->sc_ah; ++ int ret; ++ int val; ++ ++ if (!sc->sc_hasintmit) ++ return 0; ++ ++ switch(sc->sc_useintmit) { ++ case 0: /* disabled */ ++ case 1: /* enabled */ ++ val = sc->sc_useintmit; ++ break; ++ default: ++ if (sc->sc_opmode != IEEE80211_M_MONITOR) ++ val = 1; ++ else ++ val = 0; ++ break; ++ } ++ ret = ath_hal_setintmit(ah, val); ++ if (val) ++ goto done; ++ ++ /* manual settings */ ++ if ((sc->sc_noise_immunity >= 0) && (sc->sc_noise_immunity <= 5)) ++ ath_hal_setcapability(ah, HAL_CAP_INTMIT, 2, sc->sc_noise_immunity, NULL); ++ if ((sc->sc_ofdm_weak_det == 0) || (sc->sc_ofdm_weak_det == 1)) ++ ath_hal_setcapability(ah, HAL_CAP_INTMIT, 3, sc->sc_ofdm_weak_det, NULL); ++ ++done: ++ if (!sc->sc_imask) ++ goto out; ++ ++ /* MIB interrupt handling */ ++ sc->sc_needmib = ath_hal_hwphycounters(ah) && ++ sc->sc_useintmit; ++ if (sc->sc_needmib) ++ sc->sc_imask |= HAL_INT_MIB; ++ else ++ sc->sc_imask &= ~HAL_INT_MIB; ++ ath_hal_intrset(sc->sc_ah, sc->sc_imask); ++ ath_calcrxfilter(sc); ++ ++out: ++ return ret; ++} ++ + /* + * Context: process context + */ +@@ -4249,8 +4241,7 @@ + u_int32_t rfilt; + + /* Preserve the current Phy. radar and err. filters. */ +- rfilt = (ath_hal_getrxfilter(ah) & +- (HAL_RX_FILTER_PHYERR | HAL_RX_FILTER_PHYRADAR)) | ++ rfilt = (ath_hal_getrxfilter(ah) & HAL_RX_FILTER_PHYRADAR) | + HAL_RX_FILTER_UCAST | HAL_RX_FILTER_BCAST | + HAL_RX_FILTER_MCAST; + if (ic->ic_opmode != IEEE80211_M_STA) +@@ -4266,6 +4257,8 @@ + if (sc->sc_nmonvaps > 0) + rfilt |= (HAL_RX_FILTER_CONTROL | HAL_RX_FILTER_BEACON | + HAL_RX_FILTER_PROBEREQ | HAL_RX_FILTER_PROM); ++ if (sc->sc_hasintmit && !sc->sc_needmib && ath_hal_getintmit(ah, NULL)) ++ rfilt |= HAL_RX_FILTER_PHYERR; + if (sc->sc_curchan.privFlags & CHANNEL_DFS) + rfilt |= (HAL_RX_FILTER_PHYERR | HAL_RX_FILTER_PHYRADAR); + return rfilt; +@@ -6810,8 +6803,7 @@ + dev->quota -= bf_processed; + #endif + +- if (sc->sc_useintmit) +- ath_hal_rxmonitor(ah, &sc->sc_halstats, &sc->sc_curchan); ++ ath_hal_rxmonitor(ah, &sc->sc_halstats, &sc->sc_curchan); + if (!bf_processed) + DPRINTF(sc, ATH_DEBUG_RX_PROC, + "Warning: %s got scheduled when no receive " +@@ -8727,7 +8719,6 @@ + ath_hal_rxena(ah); /* enable recv descriptors */ + ath_mode_init(dev); /* set filters, etc. */ + ath_hal_startpcurecv(ah); /* re-enable PCU/DMA engine */ +- ath_override_intmit_if_disabled(sc); + return 0; + } + +@@ -10633,8 +10624,10 @@ + ATH_RP_IGNORED = 24, + ATH_RADAR_IGNORED = 25, + ATH_MAXVAPS = 26, +- ATH_INTMIT = 27, +- ATH_DISTANCE = 28, ++ ATH_DISTANCE = 27, ++ ATH_INTMIT = 28, ++ ATH_NOISE_IMMUNITY = 29, ++ ATH_OFDM_WEAK_DET = 30 + }; + + static inline int +@@ -10696,6 +10689,48 @@ + } + + static int ++ath_sysctl_set_intmit(struct ath_softc *sc, long ctl, u_int val) ++{ ++ int ret; ++ ++ switch(ctl) { ++ case ATH_INTMIT: ++ sc->sc_intmit = val; ++ break; ++ case ATH_NOISE_IMMUNITY: ++ sc->sc_noise_immunity = val; ++ break; ++ case ATH_OFDM_WEAK_DET: ++ sc->sc_ofdm_weak_det = val; ++ break; ++ default: ++ return -EINVAL; ++ } ++ ret = ath_setintmit(sc); ++ return ret; ++} ++ ++static int ++ath_sysctl_get_intmit(struct ath_softc *sc, long ctl, u_int *val) ++{ ++ struct ath_hal *ah = sc->sc_ah; ++ ++ switch(ctl) { ++ case ATH_INTMIT: ++ *val = (ath_hal_getcapability(ah, HAL_CAP_INTMIT, 1, NULL) == HAL_OK); ++ break; ++ case ATH_NOISE_IMMUNITY: ++ return ath_hal_getcapability(ah, HAL_CAP_INTMIT, 2, val); ++ case ATH_OFDM_WEAK_DET: ++ return ath_hal_getcapability(ah, HAL_CAP_INTMIT, 3, val); ++ default: ++ return -EINVAL; ++ } ++ return 0; ++} ++ ++ ++static int + ATH_SYSCTL_DECL(ath_sysctl_halparam, ctl, write, filp, buffer, lenp, ppos) + { + struct ath_softc *sc = ctl->extra1; +@@ -10934,30 +10969,13 @@ + sc->sc_radar_ignored = val; + break; + case ATH_INTMIT: +- if (!sc->sc_hasintmit) { ++ case ATH_NOISE_IMMUNITY: ++ case ATH_OFDM_WEAK_DET: ++ if (!sc->sc_hasintmit) + ret = -EOPNOTSUPP; +- break; +- } +- if (sc->sc_useintmit == val) +- break; +- sc->sc_useintmit = val; +- sc->sc_needmib = ath_hal_hwphycounters(ah) && +- sc->sc_useintmit; +- /* Update the HAL and MIB interrupt mask bits */ +- ath_hal_setintmit(ah, !!val); +- sc->sc_imask = (sc->sc_imask & ~HAL_INT_MIB) | +- (sc->sc_needmib ? HAL_INT_MIB : 0); +- ath_hal_intrset(sc->sc_ah, sc->sc_imask); +- /* Only do a reset if device is valid and UP +- * and we just made a change to the settings. */ +- if (sc->sc_dev && !sc->sc_invalid && +- (sc->sc_dev->flags & IFF_RUNNING)) +- ath_reset(sc->sc_dev); +- /* NB: Run this step to cleanup if HAL doesn't +- * obey capability flags and hangs onto ANI +- * settings. */ +- ath_override_intmit_if_disabled(sc); +- break; ++ else ++ ret = ath_sysctl_set_intmit(sc, (long)ctl->extra2, val); ++ break; + default: + ret = -EINVAL; + break; +@@ -11029,9 +11047,14 @@ + case ATH_RADAR_IGNORED: + val = sc->sc_radar_ignored; + break; +- case ATH_INTMIT: +- val = sc->sc_useintmit; +- break; ++ case ATH_INTMIT: ++ case ATH_NOISE_IMMUNITY: ++ case ATH_OFDM_WEAK_DET: ++ if (!sc->sc_hasintmit) ++ ret = -EOPNOTSUPP; ++ else ++ ret = ath_sysctl_get_intmit(sc, (long)ctl->extra2, &val); ++ break; + default: + ret = -EINVAL; + break; +@@ -11413,6 +11436,24 @@ + .maxlen = sizeof(ath_xchanmode), + .proc_handler = proc_dointvec + }, ++ { .ctl_name = CTL_AUTO, ++ .procname = "intmit", ++ .mode = 0644, ++ .proc_handler = ath_sysctl_halparam, ++ .extra2 = (void *)ATH_INTMIT, ++ }, ++ { .ctl_name = CTL_AUTO, ++ .procname = "noise_immunity", ++ .mode = 0644, ++ .proc_handler = ath_sysctl_halparam, ++ .extra2 = (void *)ATH_NOISE_IMMUNITY, ++ }, ++ { .ctl_name = CTL_AUTO, ++ .procname = "ofdm_weak_det", ++ .mode = 0644, ++ .proc_handler = ath_sysctl_halparam, ++ .extra2 = (void *)ATH_OFDM_WEAK_DET, ++ }, + { 0 } + }; + static ctl_table ath_ath_table[] = { +--- a/ath/if_athvar.h ++++ b/ath/if_athvar.h +@@ -712,6 +712,10 @@ + unsigned int sc_txcont_power; /* Continuous transmit power in 0.5dBm units */ + unsigned int sc_txcont_rate; /* Continuous transmit rate in Mbps */ + ++ int8_t sc_intmit; /* Interference mitigation enabled, -1 = auto, based on mode, 0/1 = off/on */ ++ int8_t sc_noise_immunity; /* Noise immunity level, 0-4, -1 == auto) */ ++ int8_t sc_ofdm_weak_det; /* OFDM weak frames detection, -1 == auto */ ++ + /* rate tables */ + const HAL_RATE_TABLE *sc_rates[IEEE80211_MODE_MAX]; + const HAL_RATE_TABLE *sc_currates; /* current rate table */ +--- a/ath/if_ath_hal_extensions.h ++++ b/ath/if_ath_hal_extensions.h +@@ -237,296 +237,18 @@ + AR5K_DMASIZE_512B + }; + +- +-int ath_set_ack_bitrate(struct ath_softc *sc, int); +-int ar_device(int devid); +-const char * ath5k_chip_name(enum ath5k_srev_type type, u_int16_t val); +- +-static inline unsigned long field_width(unsigned long mask, unsigned long shift) +-{ +- unsigned long r = 0; +- unsigned long x = mask >> shift; +- if ( 0 == mask ) return 0; +-#if BITS_PER_LONG >= 64 +- if ( x & (~0UL<<32) ) { x >>= 32; r += 32; } +-#endif +- if ( x & 0xffff0000 ) { x >>= 16; r += 16; } +- if ( x & 0x0000ff00 ) { x >>= 8; r += 8; } +- if ( x & 0x000000f0 ) { x >>= 4; r += 4; } +- if ( x & 0x0000000c ) { x >>= 2; r += 2; } +- if ( x & 0x00000002 ) { r += 1; } +- return r+1; +-} +- +-static inline u_int32_t get_field(struct ath_hal *ah, u_int32_t reg, u_int32_t mask, u_int32_t shift, int is_signed) { +- unsigned long x = ((OS_REG_READ(ah, reg) & mask) >> shift); +- if (is_signed) { +- unsigned long c =(-1) << (field_width(mask, shift)-1); +- return (x + c) ^ c; +- } +- return x; +-} +- + static inline void set_field(struct ath_hal *ah, u_int32_t reg, u_int32_t mask, u_int32_t shift, u_int32_t value) { + OS_REG_WRITE(ah, reg, + (OS_REG_READ(ah, reg) & ~mask) | + ((value << shift) & mask)); + } + +-static inline u_int32_t field_eq(struct ath_hal *ah, u_int32_t reg, +- u_int32_t mask, u_int32_t shift, +- u_int32_t value, int is_signed) { +- return (get_field(ah, reg, mask, shift, is_signed) & (mask >> shift)) == +- (value & (mask >> shift)); +-} +- +-static inline void override_warning(struct ath_hal *ah, const char *name, +- u_int32_t reg, u_int32_t mask, +- u_int32_t shift, u_int32_t expected, int is_signed) { +- +- if (!field_eq(ah, reg, mask, shift, expected, is_signed)) +- printk("%s: Correcting 0x%04x[%s] from 0x%x (%d) to 0x%x (%d).\n", +- SC_DEV_NAME(ah->ah_sc), +- reg, +- name, +- (get_field(ah, reg, mask, shift, is_signed) & (mask >> shift)), +- get_field(ah, reg, mask, shift, is_signed), +- (expected & (mask >> shift)), /* not sign extended */ +- expected); +-#if 0 /* NB: For checking to see if HAL is fixed or not */ +- else { +- printk("%s: Keeping 0x%04x[%s] - 0x%x (%d).\n", +- SC_DEV_NAME(ah->ah_sc), +- reg, +- name, +- (get_field(ah, reg, mask, shift, is_signed) & (mask >> shift)), +- get_field(ah, reg, mask, shift, is_signed)); +- } +-#endif +-} +- +-static inline void verification_warning(struct ath_hal *ah, const char *name, +- u_int32_t reg, u_int32_t mask, +- u_int32_t shift, u_int32_t expected, int is_signed) { +- +- int ret = field_eq(ah, reg, mask, shift, expected, is_signed); +- if (!ret) { +- printk("%s: %s verification of %s default value " +- "[found=0x%x (%d) expected=0x%x (%d)].\n", +- SC_DEV_NAME(ah->ah_sc), +- (ret ? "PASSED" : "FAILED"), +- name, +- (get_field(ah, reg, mask, shift, is_signed) & (mask >> shift)), +- get_field(ah, reg, mask, shift, is_signed), +- (expected & (mask >> shift)), /* not sign extended */ +- expected); +- ath_hal_print_decoded_register(ah, NULL, reg, +- OS_REG_READ(ah, reg), OS_REG_READ(ah, reg), 0); +- } +-} +- +-#define GET_FIELD(ah, __reg, __mask, __signed) \ +- get_field(ah, __reg, __mask, __mask ## _S, __signed) + #define SET_FIELD(ah, __reg, __mask, __value) \ + set_field(ah, __reg, __mask, __mask ## _S, __value); +-#define FIELD_EQ(ah, __reg, __mask, __value, __signed) \ +- field_eq(ah, __reg, __mask, __mask ## _S, __value, __signed) +- +-#if 0 /* NB: These are working at this point, and HAL tweaks them a lot */ +-#define OVERRIDE_WARNING(ah, __reg, __mask, __expected, __signed) \ +- override_warning(ah, #__mask, __reg, __mask, __mask ## _S, __expected, __signed) +-#else +-#define OVERRIDE_WARNING(ah, __reg, __mask, __expected, __signed) +-#endif +- +-#define VERIFICATION_WARNING(ah, __reg, __mask, __signed) \ +- verification_warning(ah, #__mask, __reg, __mask, __mask ## _S, DEFAULT_ ## __mask, __signed) +-#define VERIFICATION_WARNING_SW(ah, __reg, __mask, __signed) \ +- verification_warning(ah, #__mask, __reg, __mask, __mask ## _S, DEFAULT_ENABLE_ ## __reg ? __mask ## _ON : __mask ## _OFF, __signed) +- +-static inline void ath_hal_set_noise_immunity(struct ath_hal *ah, +- int agc_desired_size, +- int agc_coarse_hi, +- int agc_coarse_lo, +- int sig_firpwr) +-{ +- ATH_HAL_LOCK_IRQ(ah->ah_sc); +- ath_hal_set_function(__func__); +- ath_hal_set_device(SC_DEV_NAME(ah->ah_sc)); +- +-#if 0 /* NB: These are working at this point, and HAL tweaks them a lot */ +- OVERRIDE_WARNING(ah, AR5K_PHY_AGCSIZE, AR5K_PHY_AGCSIZE_DESIRED, agc_desired_size, 1); +- OVERRIDE_WARNING(ah, AR5K_PHY_AGCCOARSE, AR5K_PHY_AGCCOARSE_LO, agc_coarse_lo, 1); +- OVERRIDE_WARNING(ah, AR5K_PHY_AGCCOARSE, AR5K_PHY_AGCCOARSE_HI, agc_coarse_hi, 1); +- OVERRIDE_WARNING(ah, AR5K_PHY_SIG, AR5K_PHY_SIG_FIRPWR, sig_firpwr, 1); +-#endif +- +- SET_FIELD(ah, AR5K_PHY_AGCSIZE, AR5K_PHY_AGCSIZE_DESIRED, agc_desired_size); +- SET_FIELD(ah, AR5K_PHY_AGCCOARSE, AR5K_PHY_AGCCOARSE_LO, agc_coarse_lo); +- SET_FIELD(ah, AR5K_PHY_AGCCOARSE, AR5K_PHY_AGCCOARSE_HI, agc_coarse_hi); +- SET_FIELD(ah, AR5K_PHY_SIG, AR5K_PHY_SIG_FIRPWR, sig_firpwr); +- +- ath_hal_set_function(NULL); +- ath_hal_set_device(NULL); +- ATH_HAL_UNLOCK_IRQ(ah->ah_sc); +-} +- +-static inline void ath_hal_set_ofdm_weak_det(struct ath_hal *ah, +- int low_m1, int low_m2, int low_m2_count, int low_self_corr, +- int high_m1, int high_m2, int high_m2_count) +-{ +- ATH_HAL_LOCK_IRQ(ah->ah_sc); +- ath_hal_set_function(__func__); +- ath_hal_set_device(SC_DEV_NAME(ah->ah_sc)); +- +- OVERRIDE_WARNING(ah, AR5K_PHY_WEAK_OFDM_LOW, AR5K_PHY_WEAK_OFDM_LOW_M1, low_m1, 0); +- OVERRIDE_WARNING(ah, AR5K_PHY_WEAK_OFDM_LOW, AR5K_PHY_WEAK_OFDM_LOW_M2, low_m2, 0); +- OVERRIDE_WARNING(ah, AR5K_PHY_WEAK_OFDM_LOW, AR5K_PHY_WEAK_OFDM_LOW_M2_COUNT, low_m2_count, 0); +- OVERRIDE_WARNING(ah, AR5K_PHY_WEAK_OFDM_LOW, AR5K_PHY_WEAK_OFDM_LOW_SELFCOR, low_self_corr, 0); +- OVERRIDE_WARNING(ah, AR5K_PHY_WEAK_OFDM_HIGH, AR5K_PHY_WEAK_OFDM_HIGH_M1, high_m1, 0); +- OVERRIDE_WARNING(ah, AR5K_PHY_WEAK_OFDM_HIGH, AR5K_PHY_WEAK_OFDM_HIGH_M2, high_m2, 0); +- OVERRIDE_WARNING(ah, AR5K_PHY_WEAK_OFDM_HIGH, AR5K_PHY_WEAK_OFDM_HIGH_M2_COUNT, high_m2_count, 0); +- +- SET_FIELD(ah, AR5K_PHY_WEAK_OFDM_LOW, AR5K_PHY_WEAK_OFDM_LOW_M1, low_m1); +- SET_FIELD(ah, AR5K_PHY_WEAK_OFDM_LOW, AR5K_PHY_WEAK_OFDM_LOW_M2, low_m2); +- SET_FIELD(ah, AR5K_PHY_WEAK_OFDM_LOW, AR5K_PHY_WEAK_OFDM_LOW_M2_COUNT, low_m2_count); +- SET_FIELD(ah, AR5K_PHY_WEAK_OFDM_LOW, AR5K_PHY_WEAK_OFDM_LOW_SELFCOR, low_self_corr); +- SET_FIELD(ah, AR5K_PHY_WEAK_OFDM_HIGH, AR5K_PHY_WEAK_OFDM_HIGH_M1, high_m1); +- SET_FIELD(ah, AR5K_PHY_WEAK_OFDM_HIGH, AR5K_PHY_WEAK_OFDM_HIGH_M2, high_m2); +- SET_FIELD(ah, AR5K_PHY_WEAK_OFDM_HIGH, AR5K_PHY_WEAK_OFDM_HIGH_M2_COUNT, high_m2_count); +- +- ath_hal_set_function(NULL); +- ath_hal_set_device(NULL); +- ATH_HAL_UNLOCK_IRQ(ah->ah_sc); +-} +- +-static inline void ath_hal_set_cck_weak_det(struct ath_hal *ah, int thresh) +-{ +- ATH_HAL_LOCK_IRQ(ah->ah_sc); +- ath_hal_set_function(__func__); +- ath_hal_set_device(SC_DEV_NAME(ah->ah_sc)); +- +- OVERRIDE_WARNING(ah, AR5K_PHY_WEAK_CCK, AR5K_PHY_WEAK_CCK_THRESH, thresh, 0); +- +- SET_FIELD(ah, AR5K_PHY_WEAK_CCK, AR5K_PHY_WEAK_CCK_THRESH, thresh); +- +- ath_hal_set_function(NULL); +- ath_hal_set_device(NULL); +- ATH_HAL_UNLOCK_IRQ(ah->ah_sc); +-} +- +-static inline void ath_hal_set_sig_firstep(struct ath_hal *ah, int firstep) +-{ +- ATH_HAL_LOCK_IRQ(ah->ah_sc); +- ath_hal_set_function(__func__); +- ath_hal_set_device(SC_DEV_NAME(ah->ah_sc)); + +- OVERRIDE_WARNING(ah, AR5K_PHY_SIG, AR5K_PHY_SIG_FIRSTEP, firstep, 0); +- +- SET_FIELD(ah, AR5K_PHY_SIG, AR5K_PHY_SIG_FIRSTEP, firstep); +- +- ath_hal_set_function(NULL); +- ath_hal_set_device(NULL); +- ATH_HAL_UNLOCK_IRQ(ah->ah_sc); +-} +- +-static inline void ath_hal_set_spur_immunity(struct ath_hal *ah, int thresh) +-{ +- ATH_HAL_LOCK_IRQ(ah->ah_sc); +- ath_hal_set_function(__func__); +- ath_hal_set_device(SC_DEV_NAME(ah->ah_sc)); +- +- OVERRIDE_WARNING(ah, AR5K_PHY_SPUR, AR5K_PHY_SPUR_THRESH, thresh, 0); +- +- SET_FIELD(ah, AR5K_PHY_SPUR, AR5K_PHY_SPUR_THRESH, thresh); +- +- ath_hal_set_function(NULL); +- ath_hal_set_device(NULL); +- ATH_HAL_UNLOCK_IRQ(ah->ah_sc); +-} +- +-static inline void ath_hal_restore_default_noise_immunity(struct ath_hal *ah) { +- +- ath_hal_set_noise_immunity(ah, +- DEFAULT_AR5K_PHY_AGCSIZE_DESIRED, +- DEFAULT_AR5K_PHY_AGCCOARSE_HI, +- DEFAULT_AR5K_PHY_AGCCOARSE_LO, +- DEFAULT_AR5K_PHY_SIG_FIRPWR); +-} +- +-static inline void ath_hal_enable_ofdm_weak_det(struct ath_hal *ah, int enable) { +- if (enable) +- ath_hal_set_ofdm_weak_det(ah, +- AR5K_PHY_WEAK_OFDM_LOW_M1_ON, +- AR5K_PHY_WEAK_OFDM_LOW_M2_ON, +- AR5K_PHY_WEAK_OFDM_LOW_M2_COUNT_ON, +- AR5K_PHY_WEAK_OFDM_LOW_SELFCOR_ON, +- AR5K_PHY_WEAK_OFDM_HIGH_M1_ON, +- AR5K_PHY_WEAK_OFDM_HIGH_M2_ON, +- AR5K_PHY_WEAK_OFDM_HIGH_M2_COUNT_ON); +- else +- ath_hal_set_ofdm_weak_det(ah, +- AR5K_PHY_WEAK_OFDM_LOW_M1_OFF, +- AR5K_PHY_WEAK_OFDM_LOW_M2_OFF, +- AR5K_PHY_WEAK_OFDM_LOW_M2_COUNT_OFF, +- AR5K_PHY_WEAK_OFDM_LOW_SELFCOR_OFF, +- AR5K_PHY_WEAK_OFDM_HIGH_M1_OFF, +- AR5K_PHY_WEAK_OFDM_HIGH_M2_OFF, +- AR5K_PHY_WEAK_OFDM_HIGH_M2_COUNT_OFF); +-} +- +-static inline void ath_hal_enable_cck_weak_det(struct ath_hal *ah, int enable) { +- ath_hal_set_cck_weak_det(ah, enable +- ? AR5K_PHY_WEAK_CCK_THRESH_ON +- : AR5K_PHY_WEAK_CCK_THRESH_OFF); +-} +- +-static inline void ath_hal_restore_default_ofdm_weak_det(struct ath_hal *ah) { +- ath_hal_enable_ofdm_weak_det(ah, DEFAULT_ENABLE_AR5K_PHY_WEAK_OFDM); +-} +- +-static inline void ath_hal_restore_default_cck_weak_det(struct ath_hal *ah) { +- ath_hal_enable_cck_weak_det(ah, DEFAULT_ENABLE_AR5K_PHY_WEAK_CCK); +-} +- +-static inline void ath_hal_restore_default_sig_firstep(struct ath_hal *ah) { +- +- ath_hal_set_sig_firstep(ah, +- DEFAULT_AR5K_PHY_SIG_FIRSTEP); +-} +- +-static inline void ath_hal_restore_default_spur_immunity(struct ath_hal *ah) { +- +- ath_hal_set_spur_immunity(ah, +- DEFAULT_AR5K_PHY_SPUR_THRESH); +-} +- +-static inline void ath_hal_restore_default_intmit(struct ath_hal *ah) { +- ath_hal_restore_default_noise_immunity(ah); +- ath_hal_restore_default_ofdm_weak_det(ah); +- ath_hal_restore_default_cck_weak_det(ah); +- ath_hal_restore_default_sig_firstep(ah); +- ath_hal_restore_default_spur_immunity(ah); +- +-} +- +-static inline void ath_hal_verify_default_intmit(struct ath_hal *ah) { +- /* Just a list of all the fields above, for sanity checks... */ +- VERIFICATION_WARNING(ah, AR5K_PHY_AGCSIZE, AR5K_PHY_AGCSIZE_DESIRED, 1); +- VERIFICATION_WARNING(ah, AR5K_PHY_AGCCOARSE, AR5K_PHY_AGCCOARSE_LO, 1); +- VERIFICATION_WARNING(ah, AR5K_PHY_AGCCOARSE, AR5K_PHY_AGCCOARSE_HI, 1); +- VERIFICATION_WARNING(ah, AR5K_PHY_SIG, AR5K_PHY_SIG_FIRPWR, 1); +- VERIFICATION_WARNING_SW(ah, AR5K_PHY_WEAK_OFDM_LOW, AR5K_PHY_WEAK_OFDM_LOW_M1, 0); +- VERIFICATION_WARNING_SW(ah, AR5K_PHY_WEAK_OFDM_LOW, AR5K_PHY_WEAK_OFDM_LOW_M2, 0); +- VERIFICATION_WARNING_SW(ah, AR5K_PHY_WEAK_OFDM_LOW, AR5K_PHY_WEAK_OFDM_LOW_M2_COUNT, 0); +- VERIFICATION_WARNING_SW(ah, AR5K_PHY_WEAK_OFDM_LOW, AR5K_PHY_WEAK_OFDM_LOW_SELFCOR, 0); +- VERIFICATION_WARNING_SW(ah, AR5K_PHY_WEAK_OFDM_HIGH, AR5K_PHY_WEAK_OFDM_HIGH_M1, 0); +- VERIFICATION_WARNING_SW(ah, AR5K_PHY_WEAK_OFDM_HIGH, AR5K_PHY_WEAK_OFDM_HIGH_M2, 0); +- VERIFICATION_WARNING_SW(ah, AR5K_PHY_WEAK_OFDM_HIGH, AR5K_PHY_WEAK_OFDM_HIGH_M2_COUNT, 0); +- VERIFICATION_WARNING_SW(ah, AR5K_PHY_WEAK_CCK, AR5K_PHY_WEAK_CCK_THRESH, 0); +- VERIFICATION_WARNING(ah, AR5K_PHY_SIG, AR5K_PHY_SIG_FIRSTEP, 0); +- VERIFICATION_WARNING(ah, AR5K_PHY_SPUR, AR5K_PHY_SPUR_THRESH, 0); +-} ++int ath_set_ack_bitrate(struct ath_softc *sc, int); ++int ar_device(int devid); ++const char * ath5k_chip_name(enum ath5k_srev_type type, u_int16_t val); + + static inline void ath_hal_set_dmasize_pcie(struct ath_hal *ah) { + SET_FIELD(ah, AR5K_TXCFG, AR5K_TXCFG_SDMAMR, AR5K_DMASIZE_128B); +--- a/ath/if_ath_hal.h ++++ b/ath/if_ath_hal.h +@@ -79,7 +79,7 @@ + ath_hal_set_function(__func__); + ath_hal_set_device(SC_DEV_NAME(ah->ah_sc)); + ret = +- ah->ah_getDiagState(ah, request, args, argsize, *result, ++ ah->ah_getDiagState(ah, request, args, argsize, result, + resultsize); + ath_hal_set_function(NULL); + ath_hal_set_device(NULL); +--- a/scripts/if_ath_hal_generator.pl ++++ b/scripts/if_ath_hal_generator.pl +@@ -145,7 +145,9 @@ + "ah_waitForBeaconDone" => "ath_hal_waitforbeacon", + "ah_writeAssocid" => "ath_hal_setassocid", + "ah_clrMulticastFilterIndex" => "ath_hal_clearmcastfilter", +- "ah_detectCardPresent" => "ath_hal_detectcardpresent" ++ "ah_detectCardPresent" => "ath_hal_detectcardpresent", ++ "ah_setSifsTime" => "ath_hal_setsifstime", ++ "ah_getSifsTime" => "ath_hal_getsifstime" + ); + + # +@@ -254,7 +256,7 @@ + + foreach (@parameters) { + s/ \*/\* /; +- /^((?:(?:const|struct|\*)\s*)*)([^\s]+\*?)\s*([^\s]*)\s*/; ++ /^((?:(?:const|struct|\*)\s*)*)([^\s]+\**)\s*([^\s]*)\s*/; + my $type = "$1$2"; + my $name = "$3"; + if ( 0 == length($name) ) { |