From cb17bac6f8d3eb4725b903b53d27fec58145392b Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Wed, 20 Feb 2008 21:26:29 +0000 Subject: [PATCH] improve reliability of beacon transmissions after channel change SVN-Revision: 10512 --- .../madwifi/patches/332-reset_beacons.patch | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 package/madwifi/patches/332-reset_beacons.patch diff --git a/package/madwifi/patches/332-reset_beacons.patch b/package/madwifi/patches/332-reset_beacons.patch new file mode 100644 index 0000000000..e34746ee6a --- /dev/null +++ b/package/madwifi/patches/332-reset_beacons.patch @@ -0,0 +1,68 @@ +Index: madwifi-trunk-r3314/ath/if_ath.c +=================================================================== +--- madwifi-trunk-r3314.orig/ath/if_ath.c 2008-02-20 22:22:50.203268987 +0100 ++++ madwifi-trunk-r3314/ath/if_ath.c 2008-02-20 22:23:25.745294410 +0100 +@@ -1592,6 +1592,16 @@ + ath_init(dev); + } + ++static HAL_BOOL ath_hw_reset(struct ath_hal *ah, HAL_OPMODE opmode, ++ HAL_CHANNEL *channel, HAL_BOOL bChannelChange, ++ HAL_STATUS *status) ++{ ++ HAL_BOOL ret; ++ ret = ath_hal_reset(ah, opmode, channel, bChannelChange, status); ++ mdelay(5); /* extra delay to allow the hw to settle in */ ++ return ret; ++} ++ + /* Channel Availability Check is running, or a channel has already found to be + * unavailable. */ + static int +@@ -2474,7 +2484,7 @@ + */ + sc->sc_curchan.channel = ic->ic_curchan->ic_freq; + sc->sc_curchan.channelFlags = ath_chan2flags(ic->ic_curchan); +- if (!ath_hal_reset(ah, sc->sc_opmode, &sc->sc_curchan, AH_FALSE, &status)) { ++ if (!ath_hw_reset(ah, sc->sc_opmode, &sc->sc_curchan, AH_FALSE, &status)) { + EPRINTF(sc, "unable to reset hardware: '%s' (HAL status %u) " + "(freq %u flags 0x%x)\n", + ath_get_hal_status_desc(status), status, +@@ -2773,7 +2783,7 @@ + ath_draintxq(sc); /* stop xmit side */ + ath_stoprecv(sc); /* stop recv side */ + /* NB: indicate channel change so we do a full reset */ +- if (!ath_hal_reset(ah, sc->sc_opmode, &sc->sc_curchan, AH_TRUE, &status)) ++ if (!ath_hw_reset(ah, sc->sc_opmode, &sc->sc_curchan, AH_TRUE, &status)) + EPRINTF(sc, "Unable to reset hardware: '%s' (HAL status %u)\n", + ath_get_hal_status_desc(status), status); + +@@ -8848,8 +8858,8 @@ + * needed to do the reset with chanchange = AH_FALSE in order + * to receive traffic when peforming high velocity channel + * changes. */ +- if (!ath_hal_reset(ah, sc->sc_opmode, &hchan, AH_TRUE, &status) || +- !ath_hal_reset(ah, sc->sc_opmode, &hchan, AH_FALSE, &status)) { ++ if (!ath_hw_reset(ah, sc->sc_opmode, &hchan, AH_TRUE, &status) || ++ !ath_hw_reset(ah, sc->sc_opmode, &hchan, AH_FALSE, &status)) { + EPRINTF(sc, "Unable to reset channel %u (%u MHz) " + "flags 0x%x '%s' (HAL status %u)\n", + ieee80211_chan2ieee(ic, chan), chan->ic_freq, +@@ -8905,7 +8915,7 @@ + * re configure beacons when it is a turbo mode switch. + * HW seems to turn off beacons during turbo mode switch. + */ +- if (sc->sc_beacons && tswitch && !sc->sc_dfs_cac) ++ if (sc->sc_beacons && !sc->sc_dfs_cac) + ath_beacon_config(sc, NULL); + /* + * Re-enable interrupts. +@@ -11455,7 +11465,7 @@ + ieee80211_cancel_scan(vap); /* anything current */ + ieee80211_wme_updateparams(vap); + /* reset the WNIC */ +- if (!ath_hal_reset(ah, sc->sc_opmode, ++ if (!ath_hw_reset(ah, sc->sc_opmode, + &sc->sc_curchan, AH_TRUE, &status)) { + EPRINTF(sc, "ath_hal_reset failed: '%s' " + "(HAL status %u).\n", -- 2.25.1