aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl3945-base.c
diff options
context:
space:
mode:
authorBen Cahill <ben.m.cahill@intel.com>2009-10-09 16:20:26 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-10-27 16:47:59 -0400
commit743cdf1b65656faf1e6f1f74278c52b89a0b7360 (patch)
treed06ceb91f10f74994fbd0aaa5ebad0b4fb028c31 /drivers/net/wireless/iwlwifi/iwl3945-base.c
parent1a34c043802a213e719420ece395cf25c85cc7c5 (diff)
iwl3945: streamline iwl3945_rfkill_poll()
iwl3945_rfkill_poll() has been silently calling wiphy_rfkill_set_hw_state() every 2 seconds, regardless of whether hardware RF KILL switch changed state. Call wiphy_rfkill_set_hw_state() only when RFKILL switch changes. Add IWL_DEBUG_RF_KILL log message and documentation. Signed-off-by: Ben Cahill <ben.m.cahill@intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl3945-base.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl3945-base.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
index ab4c4bae7600..2406b73e9093 100644
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
@@ -2717,19 +2717,34 @@ static void iwl3945_bg_alive_start(struct work_struct *data)
2717 mutex_unlock(&priv->mutex); 2717 mutex_unlock(&priv->mutex);
2718} 2718}
2719 2719
2720/*
2721 * 3945 cannot interrupt driver when hardware rf kill switch toggles;
2722 * driver must poll CSR_GP_CNTRL_REG register for change. This register
2723 * *is* readable even when device has been SW_RESET into low power mode
2724 * (e.g. during RF KILL).
2725 */
2720static void iwl3945_rfkill_poll(struct work_struct *data) 2726static void iwl3945_rfkill_poll(struct work_struct *data)
2721{ 2727{
2722 struct iwl_priv *priv = 2728 struct iwl_priv *priv =
2723 container_of(data, struct iwl_priv, rfkill_poll.work); 2729 container_of(data, struct iwl_priv, rfkill_poll.work);
2730 bool old_rfkill = test_bit(STATUS_RF_KILL_HW, &priv->status);
2731 bool new_rfkill = !(iwl_read32(priv, CSR_GP_CNTRL)
2732 & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW);
2724 2733
2725 if (iwl_read32(priv, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW) 2734 if (new_rfkill != old_rfkill) {
2726 clear_bit(STATUS_RF_KILL_HW, &priv->status); 2735 if (new_rfkill)
2727 else 2736 set_bit(STATUS_RF_KILL_HW, &priv->status);
2728 set_bit(STATUS_RF_KILL_HW, &priv->status); 2737 else
2738 clear_bit(STATUS_RF_KILL_HW, &priv->status);
2729 2739
2730 wiphy_rfkill_set_hw_state(priv->hw->wiphy, 2740 wiphy_rfkill_set_hw_state(priv->hw->wiphy, new_rfkill);
2731 test_bit(STATUS_RF_KILL_HW, &priv->status)); 2741
2742 IWL_DEBUG_RF_KILL(priv, "RF_KILL bit toggled to %s.\n",
2743 new_rfkill ? "disable radio" : "enable radio");
2744 }
2732 2745
2746 /* Keep this running, even if radio now enabled. This will be
2747 * cancelled in mac_start() if system decides to start again */
2733 queue_delayed_work(priv->workqueue, &priv->rfkill_poll, 2748 queue_delayed_work(priv->workqueue, &priv->rfkill_poll,
2734 round_jiffies_relative(2 * HZ)); 2749 round_jiffies_relative(2 * HZ));
2735 2750