aboutsummaryrefslogtreecommitdiffstats
path: root/package/madwifi/patches-r3776/316-ani_fix.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/madwifi/patches-r3776/316-ani_fix.patch')
-rw-r--r--package/madwifi/patches-r3776/316-ani_fix.patch740
1 files changed, 740 insertions, 0 deletions
diff --git a/package/madwifi/patches-r3776/316-ani_fix.patch b/package/madwifi/patches-r3776/316-ani_fix.patch
new file mode 100644
index 0000000000..d14deac528
--- /dev/null
+++ b/package/madwifi/patches-r3776/316-ani_fix.patch
@@ -0,0 +1,740 @@
+Index: madwifi-trunk-r3776/ath/if_ath.c
+===================================================================
+--- madwifi-trunk-r3776.orig/ath/if_ath.c 2008-07-17 03:06:03.000000000 +0200
++++ madwifi-trunk-r3776/ath/if_ath.c 2008-07-17 03:53:09.000000000 +0200
+@@ -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
+ */
+@@ -4248,8 +4240,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)
+@@ -4265,6 +4256,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;
+@@ -6809,8 +6802,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 "
+@@ -8726,7 +8718,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;
+ }
+
+@@ -10632,8 +10623,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
+@@ -10695,6 +10688,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;
+@@ -10933,30 +10968,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;
+@@ -11028,9 +11046,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;
+@@ -11412,6 +11435,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[] = {
+Index: madwifi-trunk-r3776/ath/if_athvar.h
+===================================================================
+--- madwifi-trunk-r3776.orig/ath/if_athvar.h 2008-07-17 03:04:02.000000000 +0200
++++ madwifi-trunk-r3776/ath/if_athvar.h 2008-07-17 03:12:36.000000000 +0200
+@@ -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 */
+Index: madwifi-trunk-r3776/ath/if_ath_hal_extensions.h
+===================================================================
+--- madwifi-trunk-r3776.orig/ath/if_ath_hal_extensions.h 2008-07-17 00:21:39.000000000 +0200
++++ madwifi-trunk-r3776/ath/if_ath_hal_extensions.h 2008-07-17 03:50:03.000000000 +0200
+@@ -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);
+Index: madwifi-trunk-r3776/ath/if_ath_hal.h
+===================================================================
+--- madwifi-trunk-r3776.orig/ath/if_ath_hal.h 2008-07-17 00:53:20.000000000 +0200
++++ madwifi-trunk-r3776/ath/if_ath_hal.h 2008-07-17 03:41:25.000000000 +0200
+@@ -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);
+Index: madwifi-trunk-r3776/scripts/if_ath_hal_generator.pl
+===================================================================
+--- madwifi-trunk-r3776.orig/scripts/if_ath_hal_generator.pl 2008-07-17 00:21:30.000000000 +0200
++++ madwifi-trunk-r3776/scripts/if_ath_hal_generator.pl 2008-07-17 03:46:30.000000000 +0200
+@@ -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) ) {