ath9k_htc: Fix fast channel change
authorSujith Manoharan <Sujith.Manoharan@atheros.com>
Tue, 28 Dec 2010 08:58:37 +0000 (14:28 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 4 Jan 2011 19:43:00 +0000 (14:43 -0500)
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: Sujith Manoharan <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/htc.h
drivers/net/wireless/ath/ath9k/htc_drv_main.c

index 10622740dc76ec8e31d56f0d9410c26a450fa607..34456a85ab77d2e13e21ec7872d5d4ab4f3eacdb 100644 (file)
@@ -331,16 +331,15 @@ void ath_htc_cancel_btcoex_work(struct ath9k_htc_priv *priv);
 
 #define OP_INVALID                BIT(0)
 #define OP_SCANNING               BIT(1)
-#define OP_FULL_RESET             BIT(2)
-#define OP_LED_ASSOCIATED         BIT(3)
-#define OP_LED_ON                 BIT(4)
-#define OP_PREAMBLE_SHORT         BIT(5)
-#define OP_PROTECT_ENABLE         BIT(6)
-#define OP_ASSOCIATED             BIT(7)
-#define OP_ENABLE_BEACON          BIT(8)
-#define OP_LED_DEINIT             BIT(9)
-#define OP_BT_PRIORITY_DETECTED    BIT(10)
-#define OP_BT_SCAN                 BIT(11)
+#define OP_LED_ASSOCIATED         BIT(2)
+#define OP_LED_ON                 BIT(3)
+#define OP_PREAMBLE_SHORT         BIT(4)
+#define OP_PROTECT_ENABLE         BIT(5)
+#define OP_ASSOCIATED             BIT(6)
+#define OP_ENABLE_BEACON          BIT(7)
+#define OP_LED_DEINIT             BIT(8)
+#define OP_BT_PRIORITY_DETECTED    BIT(9)
+#define OP_BT_SCAN                 BIT(10)
 
 struct ath9k_htc_priv {
        struct device *dev;
index 07f10ddee6a57ca9cd9b6bdfe485fbb87d9cd885..6da5e88673092cf2d09b92127a3a1ae8e9546e50 100644 (file)
@@ -177,7 +177,7 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
        struct ath_hw *ah = priv->ah;
        struct ath_common *common = ath9k_hw_common(ah);
        struct ieee80211_conf *conf = &common->hw->conf;
-       bool fastcc = true;
+       bool fastcc;
        struct ieee80211_channel *channel = hw->conf.channel;
        struct ath9k_hw_cal_data *caldata;
        enum htc_phymode mode;
@@ -188,8 +188,7 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
        if (priv->op_flags & OP_INVALID)
                return -EIO;
 
-       if (priv->op_flags & OP_FULL_RESET)
-               fastcc = false;
+       fastcc = !!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL);
 
        ath9k_htc_ps_wakeup(priv);
        htc_stop(priv->htc);
@@ -231,8 +230,6 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv,
                goto err;
 
        htc_start(priv->htc);
-
-       priv->op_flags &= ~OP_FULL_RESET;
 err:
        ath9k_htc_ps_restore(priv);
        return ret;
@@ -1847,7 +1844,6 @@ static void ath9k_htc_sw_scan_complete(struct ieee80211_hw *hw)
        spin_lock_bh(&priv->beacon_lock);
        priv->op_flags &= ~OP_SCANNING;
        spin_unlock_bh(&priv->beacon_lock);
-       priv->op_flags |= OP_FULL_RESET;
        if (priv->op_flags & OP_ASSOCIATED) {
                ath9k_htc_beacon_config(priv, priv->vif);
                ath_start_ani(priv);