Commit 039a0721 authored by Sujith Manoharan's avatar Sujith Manoharan Committed by John W. Linville

ath9k_htc: Fix fast channel change

When returning to the operating channel, a full HW
reset has to be done instead of a fast channel change.
Since sw_scan_complete() is called after the config() call for the
home channel, we end up doing a FCC. Fix this issue by checking
the OFFCHANNEL flag to determine FCC.
Signed-off-by: default avatarSujith Manoharan <Sujith.Manoharan@atheros.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 73908674
...@@ -331,16 +331,15 @@ void ath_htc_cancel_btcoex_work(struct ath9k_htc_priv *priv); ...@@ -331,16 +331,15 @@ void ath_htc_cancel_btcoex_work(struct ath9k_htc_priv *priv);
#define OP_INVALID BIT(0) #define OP_INVALID BIT(0)
#define OP_SCANNING BIT(1) #define OP_SCANNING BIT(1)
#define OP_FULL_RESET BIT(2) #define OP_LED_ASSOCIATED BIT(2)
#define OP_LED_ASSOCIATED BIT(3) #define OP_LED_ON BIT(3)
#define OP_LED_ON BIT(4) #define OP_PREAMBLE_SHORT BIT(4)
#define OP_PREAMBLE_SHORT BIT(5) #define OP_PROTECT_ENABLE BIT(5)
#define OP_PROTECT_ENABLE BIT(6) #define OP_ASSOCIATED BIT(6)
#define OP_ASSOCIATED BIT(7) #define OP_ENABLE_BEACON BIT(7)
#define OP_ENABLE_BEACON BIT(8) #define OP_LED_DEINIT BIT(8)
#define OP_LED_DEINIT BIT(9) #define OP_BT_PRIORITY_DETECTED BIT(9)
#define OP_BT_PRIORITY_DETECTED BIT(10) #define OP_BT_SCAN BIT(10)
#define OP_BT_SCAN BIT(11)
struct ath9k_htc_priv { struct ath9k_htc_priv {
struct device *dev; struct device *dev;
......
...@@ -177,7 +177,7 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv, ...@@ -177,7 +177,7 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
struct ath_hw *ah = priv->ah; struct ath_hw *ah = priv->ah;
struct ath_common *common = ath9k_hw_common(ah); struct ath_common *common = ath9k_hw_common(ah);
struct ieee80211_conf *conf = &common->hw->conf; struct ieee80211_conf *conf = &common->hw->conf;
bool fastcc = true; bool fastcc;
struct ieee80211_channel *channel = hw->conf.channel; struct ieee80211_channel *channel = hw->conf.channel;
struct ath9k_hw_cal_data *caldata; struct ath9k_hw_cal_data *caldata;
enum htc_phymode mode; enum htc_phymode mode;
...@@ -188,8 +188,7 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv, ...@@ -188,8 +188,7 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
if (priv->op_flags & OP_INVALID) if (priv->op_flags & OP_INVALID)
return -EIO; return -EIO;
if (priv->op_flags & OP_FULL_RESET) fastcc = !!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL);
fastcc = false;
ath9k_htc_ps_wakeup(priv); ath9k_htc_ps_wakeup(priv);
htc_stop(priv->htc); htc_stop(priv->htc);
...@@ -231,8 +230,6 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv, ...@@ -231,8 +230,6 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
goto err; goto err;
htc_start(priv->htc); htc_start(priv->htc);
priv->op_flags &= ~OP_FULL_RESET;
err: err:
ath9k_htc_ps_restore(priv); ath9k_htc_ps_restore(priv);
return ret; return ret;
...@@ -1847,7 +1844,6 @@ static void ath9k_htc_sw_scan_complete(struct ieee80211_hw *hw) ...@@ -1847,7 +1844,6 @@ static void ath9k_htc_sw_scan_complete(struct ieee80211_hw *hw)
spin_lock_bh(&priv->beacon_lock); spin_lock_bh(&priv->beacon_lock);
priv->op_flags &= ~OP_SCANNING; priv->op_flags &= ~OP_SCANNING;
spin_unlock_bh(&priv->beacon_lock); spin_unlock_bh(&priv->beacon_lock);
priv->op_flags |= OP_FULL_RESET;
if (priv->op_flags & OP_ASSOCIATED) { if (priv->op_flags & OP_ASSOCIATED) {
ath9k_htc_beacon_config(priv, priv->vif); ath9k_htc_beacon_config(priv, priv->vif);
ath_start_ani(priv); ath_start_ani(priv);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment