Commit c3be8d1e authored by Can Guo's avatar Can Guo Committed by Martin K. Petersen
Browse files

scsi: ufs: Move dumps in IRQ handler to error handler

Performing dumps in the IRQ handler causes system stability issues. Move
dumps to the error handler and only print basic host registers here.

Link: https://lore.kernel.org/r/1596975355-39813-8-git-send-email-cang@codeaurora.org


Reviewed-by: default avatarBean Huo <beanhuo@micron.com>
Reviewed-by: default avatarAsutosh Das <asutoshd@codeaurora.org>
Signed-off-by: default avatarCan Guo <cang@codeaurora.org>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent c72e79c0
Loading
Loading
Loading
Loading
+15 −8
Original line number Diff line number Diff line
@@ -5696,6 +5696,19 @@ static void ufshcd_err_handler(struct work_struct *work)
				    UFSHCD_UIC_DL_TCx_REPLAY_ERROR))))
		needs_reset = true;

	if (hba->saved_err & (INT_FATAL_ERRORS | UIC_ERROR |
			      UFSHCD_UIC_HIBERN8_MASK)) {
		bool pr_prdt = !!(hba->saved_err & SYSTEM_BUS_FATAL_ERROR);

		spin_unlock_irqrestore(hba->host->host_lock, flags);
		ufshcd_print_host_state(hba);
		ufshcd_print_pwr_info(hba);
		ufshcd_print_host_regs(hba);
		ufshcd_print_tmrs(hba, hba->outstanding_tasks);
		ufshcd_print_trs(hba, hba->outstanding_reqs, pr_prdt);
		spin_lock_irqsave(hba->host->host_lock, flags);
	}

	/*
	 * if host reset is required then skip clearing the pending
	 * transfers forcefully because they will get cleared during
@@ -5915,18 +5928,12 @@ static irqreturn_t ufshcd_check_errors(struct ufs_hba *hba)

		/* dump controller state before resetting */
		if (hba->saved_err & (INT_FATAL_ERRORS | UIC_ERROR)) {
			bool pr_prdt = !!(hba->saved_err &
					SYSTEM_BUS_FATAL_ERROR);

			dev_err(hba->dev, "%s: saved_err 0x%x saved_uic_err 0x%x\n",
					__func__, hba->saved_err,
					hba->saved_uic_err);

			ufshcd_print_host_regs(hba);
			ufshcd_dump_regs(hba, 0, UFSHCI_REG_SPACE_SIZE,
					 "host_regs: ");
			ufshcd_print_pwr_info(hba);
			ufshcd_print_tmrs(hba, hba->outstanding_tasks);
			ufshcd_print_trs(hba, hba->outstanding_reqs,
					pr_prdt);
		}
		ufshcd_schedule_eh_work(hba);
		retval |= IRQ_HANDLED;