From ceb495caf4d17cd91d2c715c0b10033d449c8fa1 Mon Sep 17 00:00:00 2001 From: nbd Date: Fri, 13 Jul 2007 09:17:34 +0000 Subject: madwifi: patch for 'fixing' stuck beacons through card recalibration git-svn-id: svn://svn.openwrt.org/openwrt/trunk@7960 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- package/madwifi/patches/306-bstuck_calibrate.patch | 102 +++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 package/madwifi/patches/306-bstuck_calibrate.patch (limited to 'package/madwifi') diff --git a/package/madwifi/patches/306-bstuck_calibrate.patch b/package/madwifi/patches/306-bstuck_calibrate.patch new file mode 100644 index 0000000000..b498aa0e8e --- /dev/null +++ b/package/madwifi/patches/306-bstuck_calibrate.patch @@ -0,0 +1,102 @@ +Index: madwifi-ng-r2568-20070710/ath/if_ath.c +=================================================================== +--- madwifi-ng-r2568-20070710.orig/ath/if_ath.c 2007-07-13 11:14:06.322980052 +0200 ++++ madwifi-ng-r2568-20070710/ath/if_ath.c 2007-07-13 11:15:00.834086460 +0200 +@@ -153,6 +153,7 @@ + static void ath_turbo_switch_mode(unsigned long); + static int ath_check_beacon_done(struct ath_softc *); + #endif ++static void ath_do_calibrate(struct net_device *); + static void ath_beacon_send(struct ath_softc *, int *); + static void ath_beacon_start_adhoc(struct ath_softc *, struct ieee80211vap *); + static void ath_beacon_return(struct ath_softc *, struct ath_buf *); +@@ -4173,7 +4174,7 @@ + DPRINTF(sc, ATH_DEBUG_BEACON_PROC, + "%s: missed %u consecutive beacons\n", + __func__, sc->sc_bmisscount); +- if (sc->sc_bmisscount > BSTUCK_THRESH) ++ if (sc->sc_bmisscount > BSTUCK_CALIBR_THR) + ATH_SCHEDULE_TQUEUE(&sc->sc_bstucktq, needmark); + return; + } +@@ -4312,8 +4313,17 @@ + * check will be true, in which case return + * without resetting the driver. + */ +- if (sc->sc_bmisscount <= BSTUCK_THRESH) ++ if (sc->sc_bmisscount <= BSTUCK_CALIBR_THR) + return; ++ ++ if (sc->sc_bmisscount <= BSTUCK_RESET_THR) { ++ ATH_LOCK(sc); ++ ath_do_calibrate(dev); ++ mod_timer(&sc->sc_cal_ch, jiffies + (ath_calinterval * HZ)); ++ ATH_UNLOCK(sc); ++ return; ++ } ++ + printk("%s: stuck beacon; resetting (bmiss count %u)\n", + DEV_NAME(dev), sc->sc_bmisscount); + ath_reset(dev); +@@ -8027,17 +8037,13 @@ + * Periodically recalibrate the PHY to account + * for temperature/environment changes. + */ +-static void +-ath_calibrate(unsigned long arg) ++static void ath_do_calibrate(struct net_device *dev) + { +- struct net_device *dev = (struct net_device *) arg; + struct ath_softc *sc = dev->priv; + struct ath_hal *ah = sc->sc_ah; +- /* u_int32_t nchans; */ + HAL_BOOL isIQdone = AH_FALSE; + + sc->sc_stats.ast_per_cal++; +- + DPRINTF(sc, ATH_DEBUG_CALIBRATE, "%s: channel %u/%x\n", + __func__, sc->sc_curchan.channel, sc->sc_curchan.channelFlags); + +@@ -8055,15 +8061,26 @@ + __func__, sc->sc_curchan.channel); + sc->sc_stats.ast_per_calfail++; + } +- +- ath_hal_process_noisefloor(ah); + if (isIQdone == AH_TRUE) + ath_calinterval = ATH_LONG_CALINTERVAL; + else + ath_calinterval = ATH_SHORT_CALINTERVAL; ++} ++ ++static void ++ath_calibrate(unsigned long arg) ++{ ++ struct net_device *dev = (struct net_device *) arg; ++ struct ath_softc *sc = dev->priv; ++ struct ath_hal *ah = sc->sc_ah; ++ ++ ATH_LOCK(sc); ++ ath_do_calibrate(dev); ++ ath_hal_process_noisefloor(ah); + + sc->sc_cal_ch.expires = jiffies + (ath_calinterval * HZ); + add_timer(&sc->sc_cal_ch); ++ ATH_UNLOCK(sc); + } + + static void +Index: madwifi-ng-r2568-20070710/ath/if_athvar.h +=================================================================== +--- madwifi-ng-r2568-20070710.orig/ath/if_athvar.h 2007-07-13 11:14:06.274977315 +0200 ++++ madwifi-ng-r2568-20070710/ath/if_athvar.h 2007-07-13 11:14:06.522991448 +0200 +@@ -538,7 +538,8 @@ + */ + #define ATH_TXQ_MOVE_Q(_tqs,_tqd) ATH_TXQ_MOVE_MCASTQ(_tqs,_tqd) + +-#define BSTUCK_THRESH 10 /* # of stuck beacons before resetting NB: this is a guess*/ ++#define BSTUCK_CALIBR_THR 3 /* # of stuck beacons before restarting calibration */ ++#define BSTUCK_RESET_THR 10 /* # of stuck beacons before resetting NB: this is a guess*/ + + struct ath_softc { + struct ieee80211com sc_ic; /* NB: must be first */ -- cgit v1.2.3