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

Commit 291aa7c4 authored by Eran Harary's avatar Eran Harary Committed by Johannes Berg
Browse files

iwlwifi: mvm: fix debugfs restart if fw_restart is disabled



If fw_restart is disabled, using the fw_restart debugfs
file will enable fw_restart and then send the failing
command, but this still frequently fails restart because
it resets fw_restart afterwards and is thus racy.

Fix this by tracking fw_restart separately and allowing
"always restart", "never restart" and "restart N times".

Signed-off-by: default avatarEran Harary <eran.harary@intel.com>
Reviewed-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 5dca7c24
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -597,20 +597,19 @@ static ssize_t iwl_dbgfs_fw_restart_write(struct file *file,
					  size_t count, loff_t *ppos)
{
	struct iwl_mvm *mvm = file->private_data;
	bool restart_fw = iwlwifi_mod_params.restart_fw;
	int ret;

	iwlwifi_mod_params.restart_fw = true;

	mutex_lock(&mvm->mutex);

	/* allow one more restart that we're provoking here */
	if (mvm->restart_fw >= 0)
		mvm->restart_fw++;

	/* take the return value to make compiler happy - it will fail anyway */
	ret = iwl_mvm_send_cmd_pdu(mvm, REPLY_ERROR, CMD_SYNC, 0, NULL);

	mutex_unlock(&mvm->mutex);

	iwlwifi_mod_params.restart_fw = restart_fw;

	return count;
}

+3 −0
Original line number Diff line number Diff line
@@ -477,6 +477,9 @@ struct iwl_mvm {
	 */
	u8 vif_count;

	/* -1 for always, 0 for never, >0 for that many times */
	s8 restart_fw;

	struct led_classdev led;

	struct ieee80211_vif *p2p_device_vif;
+6 −3
Original line number Diff line number Diff line
@@ -342,6 +342,8 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
	mvm->fw = fw;
	mvm->hw = hw;

	mvm->restart_fw = iwlwifi_mod_params.restart_fw ? -1 : 0;

	mutex_init(&mvm->mutex);
	spin_lock_init(&mvm->async_handlers_lock);
	INIT_LIST_HEAD(&mvm->time_event_list);
@@ -695,8 +697,7 @@ static void iwl_mvm_nic_restart(struct iwl_mvm *mvm)
		reprobe->dev = mvm->trans->dev;
		INIT_WORK(&reprobe->work, iwl_mvm_reprobe_wk);
		schedule_work(&reprobe->work);
	} else if (mvm->cur_ucode == IWL_UCODE_REGULAR &&
		   iwlwifi_mod_params.restart_fw) {
	} else if (mvm->cur_ucode == IWL_UCODE_REGULAR && mvm->restart_fw) {
		/*
		 * This is a bit racy, but worst case we tell mac80211 about
		 * a stopped/aborted (sched) scan when that was already done
@@ -714,6 +715,8 @@ static void iwl_mvm_nic_restart(struct iwl_mvm *mvm)
			break;
		}

		if (mvm->restart_fw > 0)
			mvm->restart_fw--;
		ieee80211_restart_hw(mvm->hw);
	}
}
@@ -723,7 +726,7 @@ static void iwl_mvm_nic_error(struct iwl_op_mode *op_mode)
	struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);

	iwl_mvm_dump_nic_error_log(mvm);
	if (!iwlwifi_mod_params.restart_fw)
	if (!mvm->restart_fw)
		iwl_mvm_dump_sram(mvm);

	iwl_mvm_nic_restart(mvm);