From 4406c24b6da6e276670abac12d89d1fef0a26ae2 Mon Sep 17 00:00:00 2001 From: nbd Date: Thu, 12 Apr 2012 21:30:39 +0000 Subject: [PATCH] ath9k: fix sleep mode handling issues, should improve client mode reliability (backport of r31265) git-svn-id: svn://svn.openwrt.org/openwrt/branches/backfire@31266 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../mac80211/patches/300-pending_work.patch | 26 +++++++++++++------ .../patches/513-ath9k_channelbw_debugfs.patch | 6 ++--- .../patches/531-ath9k_cur_txpower.patch | 4 +-- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch index eb09e03e1..b69ecc6b0 100644 --- a/package/mac80211/patches/300-pending_work.patch +++ b/package/mac80211/patches/300-pending_work.patch @@ -322,17 +322,18 @@ mutex_unlock(&sc->mutex); -@@ -1627,8 +1588,8 @@ static int ath9k_config(struct ieee80211 +@@ -1627,8 +1588,9 @@ static int ath9k_config(struct ieee80211 struct ath_hw *ah = sc->sc_ah; struct ath_common *common = ath9k_hw_common(ah); struct ieee80211_conf *conf = &hw->conf; - bool disable_radio = false; ++ bool reset_channel = false; + ath9k_ps_wakeup(sc); mutex_lock(&sc->mutex); /* -@@ -1639,13 +1600,8 @@ static int ath9k_config(struct ieee80211 +@@ -1639,13 +1601,14 @@ static int ath9k_config(struct ieee80211 */ if (changed & IEEE80211_CONF_CHANGE_IDLE) { sc->ps_idle = !!(conf->flags & IEEE80211_CONF_IDLE); @@ -345,18 +346,27 @@ - } + if (sc->ps_idle) + ath_cancel_work(sc); ++ else ++ /* ++ * The chip needs a reset to properly wake up from ++ * full sleep ++ */ ++ reset_channel = ah->chip_fullsleep; } /* -@@ -1678,7 +1634,6 @@ static int ath9k_config(struct ieee80211 +@@ -1676,9 +1639,8 @@ static int ath9k_config(struct ieee80211 + } + } - if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { +- if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { ++ if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) { struct ieee80211_channel *curchan = hw->conf.channel; - struct ath9k_channel old_chan; int pos = curchan->hw_value; int old_pos = -1; unsigned long flags; -@@ -1704,11 +1659,8 @@ static int ath9k_config(struct ieee80211 +@@ -1704,11 +1666,8 @@ static int ath9k_config(struct ieee80211 * Preserve the current channel values, before updating * the same channel */ @@ -370,7 +380,7 @@ ath9k_cmn_update_ichannel(&sc->sc_ah->channels[pos], curchan, conf->channel_type); -@@ -1752,18 +1704,12 @@ static int ath9k_config(struct ieee80211 +@@ -1752,18 +1711,12 @@ static int ath9k_config(struct ieee80211 ath_dbg(common, ATH_DBG_CONFIG, "Set power: %d\n", conf->power_level); sc->config.txpowlimit = 2 * conf->power_level; @@ -390,7 +400,7 @@ return 0; } -@@ -2331,9 +2277,6 @@ static void ath9k_flush(struct ieee80211 +@@ -2331,9 +2284,6 @@ static void ath9k_flush(struct ieee80211 return; } @@ -400,7 +410,7 @@ for (j = 0; j < timeout; j++) { bool npend = false; -@@ -2351,21 +2294,22 @@ static void ath9k_flush(struct ieee80211 +@@ -2351,21 +2301,22 @@ static void ath9k_flush(struct ieee80211 } if (!npend) diff --git a/package/mac80211/patches/513-ath9k_channelbw_debugfs.patch b/package/mac80211/patches/513-ath9k_channelbw_debugfs.patch index ae65b60e1..523b380ce 100644 --- a/package/mac80211/patches/513-ath9k_channelbw_debugfs.patch +++ b/package/mac80211/patches/513-ath9k_channelbw_debugfs.patch @@ -90,9 +90,9 @@ { struct ath_softc *sc = hw->priv; struct ath_hw *ah = sc->sc_ah; -@@ -1616,9 +1616,11 @@ static int ath9k_config(struct ieee80211 +@@ -1623,9 +1623,11 @@ static int ath9k_config(struct ieee80211 - if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { + if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) { struct ieee80211_channel *curchan = hw->conf.channel; + struct ath9k_channel *hchan; int pos = curchan->hw_value; @@ -102,7 +102,7 @@ if (ah->curchan) old_pos = ah->curchan - &ah->channels[0]; -@@ -1667,7 +1669,23 @@ static int ath9k_config(struct ieee80211 +@@ -1674,7 +1676,23 @@ static int ath9k_config(struct ieee80211 memset(&sc->survey[pos], 0, sizeof(struct survey_info)); } diff --git a/package/mac80211/patches/531-ath9k_cur_txpower.patch b/package/mac80211/patches/531-ath9k_cur_txpower.patch index adc5292f8..48dc438b0 100644 --- a/package/mac80211/patches/531-ath9k_cur_txpower.patch +++ b/package/mac80211/patches/531-ath9k_cur_txpower.patch @@ -1,6 +1,6 @@ --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c -@@ -1691,6 +1691,8 @@ int ath9k_config(struct ieee80211_hw *hw +@@ -1698,6 +1698,8 @@ int ath9k_config(struct ieee80211_hw *hw return -EINVAL; } @@ -9,7 +9,7 @@ /* * The most recent snapshot of channel->noisefloor for the old * channel is only available after the hardware reset. Copy it to -@@ -1706,6 +1708,7 @@ int ath9k_config(struct ieee80211_hw *hw +@@ -1713,6 +1715,7 @@ int ath9k_config(struct ieee80211_hw *hw sc->config.txpowlimit = 2 * conf->power_level; ath9k_cmn_update_txpow(ah, sc->curtxpow, sc->config.txpowlimit, &sc->curtxpow); -- 2.35.1