ath9k_htc: Handle IDLE LED properly
authorSujith <Sujith.Manoharan@atheros.com>
Fri, 7 May 2010 08:07:57 +0000 (13:37 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 7 May 2010 18:57:17 +0000 (14:57 -0400)
Switch LED off/on when handling CONF_CHANGE_IDLE.
Not doing this would leave the radio LED on even
though the chip would be in full sleep mode.

Signed-off-by: Sujith <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/htc_drv_main.c

index 7c9e33ba95ab230900197d8efdb44b3531bf7485..f50358605266aae8f77b66326a8a95acf5ece3be 100644 (file)
@@ -1099,7 +1099,7 @@ fail_tx:
        return 0;
 }
 
-static int ath9k_htc_radio_enable(struct ieee80211_hw *hw)
+static int ath9k_htc_radio_enable(struct ieee80211_hw *hw, bool led)
 {
        struct ath9k_htc_priv *priv = hw->priv;
        struct ath_hw *ah = priv->ah;
@@ -1147,6 +1147,13 @@ static int ath9k_htc_radio_enable(struct ieee80211_hw *hw)
        priv->tx_queues_stop = false;
        spin_unlock_bh(&priv->tx_lock);
 
+       if (led) {
+               /* Enable LED */
+               ath9k_hw_cfg_output(ah, ah->led_pin,
+                                   AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
+               ath9k_hw_set_gpio(ah, ah->led_pin, 0);
+       }
+
        ieee80211_wake_queues(hw);
 
        return ret;
@@ -1158,13 +1165,13 @@ static int ath9k_htc_start(struct ieee80211_hw *hw)
        int ret = 0;
 
        mutex_lock(&priv->mutex);
-       ret = ath9k_htc_radio_enable(hw);
+       ret = ath9k_htc_radio_enable(hw, false);
        mutex_unlock(&priv->mutex);
 
        return ret;
 }
 
-static void ath9k_htc_radio_disable(struct ieee80211_hw *hw)
+static void ath9k_htc_radio_disable(struct ieee80211_hw *hw, bool led)
 {
        struct ath9k_htc_priv *priv = hw->priv;
        struct ath_hw *ah = priv->ah;
@@ -1177,6 +1184,12 @@ static void ath9k_htc_radio_disable(struct ieee80211_hw *hw)
                return;
        }
 
+       if (led) {
+               /* Disable LED */
+               ath9k_hw_set_gpio(ah, ah->led_pin, 1);
+               ath9k_hw_cfg_gpio_input(ah, ah->led_pin);
+       }
+
        /* Cancel all the running timers/work .. */
        cancel_work_sync(&priv->ps_work);
        cancel_delayed_work_sync(&priv->ath9k_ani_work);
@@ -1217,7 +1230,7 @@ static void ath9k_htc_stop(struct ieee80211_hw *hw)
        struct ath9k_htc_priv *priv = hw->priv;
 
        mutex_lock(&priv->mutex);
-       ath9k_htc_radio_disable(hw);
+       ath9k_htc_radio_disable(hw, false);
        mutex_unlock(&priv->mutex);
 }
 
@@ -1337,7 +1350,7 @@ static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed)
 
                if (enable_radio) {
                        ath9k_htc_setpower(priv, ATH9K_PM_AWAKE);
-                       ath9k_htc_radio_enable(hw);
+                       ath9k_htc_radio_enable(hw, true);
                        ath_print(common, ATH_DBG_CONFIG,
                                  "not-idle: enabling radio\n");
                }
@@ -1389,10 +1402,9 @@ static int ath9k_htc_config(struct ieee80211_hw *hw, u32 changed)
        if (priv->ps_idle) {
                ath_print(common, ATH_DBG_CONFIG,
                          "idle: disabling radio\n");
-               ath9k_htc_radio_disable(hw);
+               ath9k_htc_radio_disable(hw, true);
        }
 
-
        mutex_unlock(&priv->mutex);
 
        return 0;