Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 14b485f0 authored by Eran Harary's avatar Eran Harary Committed by Emmanuel Grumbach
Browse files

iwlwifi: mvm: prevent nic to powered up at driver load



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: default avatarEran Harary <eran.harary@intel.com>
Reviewed-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
parent 30085544
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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;
};

/*
+1 −1
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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);
+4 −2
Original line number Diff line number Diff line
@@ -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;
+11 −5
Original line number Diff line number Diff line
@@ -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;