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>
This commit is contained in:
committed by
John W. Linville
parent
1a34c04380
commit
743cdf1b65
@@ -2717,19 +2717,34 @@ static void iwl3945_bg_alive_start(struct work_struct *data)
|
|||||||
mutex_unlock(&priv->mutex);
|
mutex_unlock(&priv->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 3945 cannot interrupt driver when hardware rf kill switch toggles;
|
||||||
|
* driver must poll CSR_GP_CNTRL_REG register for change. This register
|
||||||
|
* *is* readable even when device has been SW_RESET into low power mode
|
||||||
|
* (e.g. during RF KILL).
|
||||||
|
*/
|
||||||
static void iwl3945_rfkill_poll(struct work_struct *data)
|
static void iwl3945_rfkill_poll(struct work_struct *data)
|
||||||
{
|
{
|
||||||
struct iwl_priv *priv =
|
struct iwl_priv *priv =
|
||||||
container_of(data, struct iwl_priv, rfkill_poll.work);
|
container_of(data, struct iwl_priv, rfkill_poll.work);
|
||||||
|
bool old_rfkill = test_bit(STATUS_RF_KILL_HW, &priv->status);
|
||||||
|
bool new_rfkill = !(iwl_read32(priv, CSR_GP_CNTRL)
|
||||||
|
& CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW);
|
||||||
|
|
||||||
if (iwl_read32(priv, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW)
|
if (new_rfkill != old_rfkill) {
|
||||||
clear_bit(STATUS_RF_KILL_HW, &priv->status);
|
if (new_rfkill)
|
||||||
else
|
set_bit(STATUS_RF_KILL_HW, &priv->status);
|
||||||
set_bit(STATUS_RF_KILL_HW, &priv->status);
|
else
|
||||||
|
clear_bit(STATUS_RF_KILL_HW, &priv->status);
|
||||||
|
|
||||||
wiphy_rfkill_set_hw_state(priv->hw->wiphy,
|
wiphy_rfkill_set_hw_state(priv->hw->wiphy, new_rfkill);
|
||||||
test_bit(STATUS_RF_KILL_HW, &priv->status));
|
|
||||||
|
|
||||||
|
IWL_DEBUG_RF_KILL(priv, "RF_KILL bit toggled to %s.\n",
|
||||||
|
new_rfkill ? "disable radio" : "enable radio");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Keep this running, even if radio now enabled. This will be
|
||||||
|
* cancelled in mac_start() if system decides to start again */
|
||||||
queue_delayed_work(priv->workqueue, &priv->rfkill_poll,
|
queue_delayed_work(priv->workqueue, &priv->rfkill_poll,
|
||||||
round_jiffies_relative(2 * HZ));
|
round_jiffies_relative(2 * HZ));
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user