iwlwifi: let the op_mode run a FW while in RFKILL
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Mon, 24 Dec 2012 09:10:43 +0000 (11:10 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 3 Jan 2013 14:28:16 +0000 (15:28 +0100)
In some cases, the fw should run even if the NIC is in
RFKILL. Make the API more flexible to allow that.

Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/iwlwifi/dvm/ucode.c
drivers/net/wireless/iwlwifi/iwl-trans.h
drivers/net/wireless/iwlwifi/pcie/trans.c

index ecf700b..ebec13a 100644 (file)
@@ -343,7 +343,7 @@ int iwl_load_ucode_wait_alive(struct iwl_priv *priv,
                                   alive_cmd, ARRAY_SIZE(alive_cmd),
                                   iwl_alive_fn, &alive_data);
 
-       ret = iwl_trans_start_fw(priv->trans, fw);
+       ret = iwl_trans_start_fw(priv->trans, fw, false);
        if (ret) {
                priv->cur_ucode = old_type;
                iwl_remove_notification(&priv->notif_wait, &alive_wait);
index 15b4700..16a82b5 100644 (file)
@@ -399,7 +399,8 @@ struct iwl_trans_ops {
 
        int (*start_hw)(struct iwl_trans *iwl_trans);
        void (*stop_hw)(struct iwl_trans *iwl_trans, bool op_mode_leaving);
-       int (*start_fw)(struct iwl_trans *trans, const struct fw_img *fw);
+       int (*start_fw)(struct iwl_trans *trans, const struct fw_img *fw,
+                       bool run_in_rfkill);
        void (*fw_alive)(struct iwl_trans *trans, u32 scd_addr);
        void (*stop_device)(struct iwl_trans *trans);
 
@@ -531,13 +532,14 @@ static inline void iwl_trans_fw_alive(struct iwl_trans *trans, u32 scd_addr)
 }
 
 static inline int iwl_trans_start_fw(struct iwl_trans *trans,
-                                    const struct fw_img *fw)
+                                    const struct fw_img *fw,
+                                    bool run_in_rfkill)
 {
        might_sleep();
 
        WARN_ON_ONCE(!trans->rx_mpdu_cmd);
 
-       return trans->ops->start_fw(trans, fw);
+       return trans->ops->start_fw(trans, fw, run_in_rfkill);
 }
 
 static inline void iwl_trans_stop_device(struct iwl_trans *trans)
index ab179ce..e67e179 100644 (file)
@@ -435,7 +435,7 @@ static int iwl_pcie_load_given_ucode(struct iwl_trans *trans,
 }
 
 static int iwl_trans_pcie_start_fw(struct iwl_trans *trans,
-                                  const struct fw_img *fw)
+                                  const struct fw_img *fw, bool run_in_rfkill)
 {
        struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
        int ret;
@@ -454,7 +454,7 @@ static int iwl_trans_pcie_start_fw(struct iwl_trans *trans,
        /* If platform's RF_KILL switch is NOT set to KILL */
        hw_rfkill = iwl_is_rfkill_set(trans);
        iwl_op_mode_hw_rf_kill(trans->op_mode, hw_rfkill);
-       if (hw_rfkill)
+       if (hw_rfkill && !run_in_rfkill)
                return -ERFKILL;
 
        iwl_write32(trans, CSR_INT, 0xFFFFFFFF);