iwlwifi: mvm: prevent nic to powered up at driver load
authorEran Harary <eran.harary@intel.com>
Wed, 23 Apr 2014 07:46:09 +0000 (10:46 +0300)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Tue, 6 May 2014 17:40:02 +0000 (20:40 +0300)
A few devices aren't allowed to be powered up at driver
load time. Add "power_up_nic_in_init" flag to iwl_cfg
structure to customize the load flow according to the
device.

Signed-off-by: Eran Harary <eran.harary@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
drivers/net/wireless/iwlwifi/iwl-config.h
drivers/net/wireless/iwlwifi/mvm/fw.c
drivers/net/wireless/iwlwifi/mvm/mvm.h
drivers/net/wireless/iwlwifi/mvm/nvm.c
drivers/net/wireless/iwlwifi/mvm/ops.c

index b73eac9..97f23d6 100644 (file)
@@ -274,6 +274,7 @@ struct iwl_cfg {
        u8   nvm_hw_section_num;
        bool lp_xtal_workaround;
        const struct iwl_pwr_tx_backoff *pwr_tx_backoffs;
+       bool no_power_up_nic_in_init;
 };
 
 /*
index 3d99cf5..34ae3f3 100644 (file)
@@ -295,7 +295,7 @@ int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm)
        /* Read the NVM only at driver load time, no need to do this twice */
        if (read_nvm) {
                /* Read nvm */
-               ret = iwl_nvm_init(mvm);
+               ret = iwl_nvm_init(mvm, true);
                if (ret) {
                        IWL_ERR(mvm, "Failed to read NVM: %d\n", ret);
                        goto error;
index 17c42da..b52d1c9 100644 (file)
@@ -757,7 +757,7 @@ int iwl_mvm_rx_statistics(struct iwl_mvm *mvm,
                          struct iwl_device_cmd *cmd);
 
 /* NVM */
-int iwl_nvm_init(struct iwl_mvm *mvm);
+int iwl_nvm_init(struct iwl_mvm *mvm, bool read_nvm_from_nic);
 int iwl_mvm_load_nvm_to_nic(struct iwl_mvm *mvm);
 
 int iwl_mvm_up(struct iwl_mvm *mvm);
index 4092422..fe4c91e 100644 (file)
@@ -427,7 +427,7 @@ int iwl_mvm_load_nvm_to_nic(struct iwl_mvm *mvm)
        return ret;
 }
 
-int iwl_nvm_init(struct iwl_mvm *mvm)
+int iwl_nvm_init(struct iwl_mvm *mvm, bool read_nvm_from_nic)
 {
        int ret, i, section;
        u8 *nvm_buffer, *temp;
@@ -443,7 +443,9 @@ int iwl_nvm_init(struct iwl_mvm *mvm)
                ret = iwl_mvm_read_external_nvm(mvm);
                if (ret)
                        return ret;
-       } else {
+       }
+
+       if (read_nvm_from_nic) {
                /* list of NVM sections we are allowed/need to read */
                if (mvm->trans->cfg->device_family != IWL_DEVICE_FAMILY_8000) {
                        nvm_to_read[0] = mvm->cfg->nvm_hw_section_num;
index 7a5a8ba..3c14ea1 100644 (file)
@@ -467,12 +467,18 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
        min_backoff = calc_min_backoff(trans, cfg);
        iwl_mvm_tt_initialize(mvm, min_backoff);
 
+       if (WARN(cfg->no_power_up_nic_in_init && !iwlwifi_mod_params.nvm_file,
+                "not allowing power-up and not having nvm_file\n"))
+               goto out_free;
+
        /*
-        * If the NVM exists in an external file,
-        * there is no need to unnecessarily power up the NIC at driver load
+        * Even if nvm exists in the nvm_file driver should read agin the nvm
+        * from the nic because there might be entries that exist in the OTP
+        * and not in the file.
+        * for nics with no_power_up_nic_in_init: rely completley on nvm_file
         */
-       if (iwlwifi_mod_params.nvm_file) {
-               err = iwl_nvm_init(mvm);
+       if (cfg->no_power_up_nic_in_init && iwlwifi_mod_params.nvm_file) {
+               err = iwl_nvm_init(mvm, false);
                if (err)
                        goto out_free;
        } else {
@@ -519,7 +525,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
  out_free:
        iwl_phy_db_free(mvm->phy_db);
        kfree(mvm->scan_cmd);
-       if (!iwlwifi_mod_params.nvm_file)
+       if (!cfg->no_power_up_nic_in_init || !iwlwifi_mod_params.nvm_file)
                iwl_trans_op_mode_leave(trans);
        ieee80211_free_hw(mvm->hw);
        return NULL;