From 8611eb0c52b00186d7342dec32d6a6157899243b Mon Sep 17 00:00:00 2001 From: Can Guo Date: Wed, 10 Jun 2020 10:15:56 +0800 Subject: [PATCH] scsi: ufs: Move ufshcd_vops_dbg_register_dump out of ufshcd_print_host_regs If ufshcd_print_host_regs() is called from IRQ context, some registers like test bus and UFS PHY will not be printed by ufshcd_vops_dbg_register_dump() due to sleep is not allowed. Move ufshcd_vops_dbg_register_dump out of ufshcd_print_host_regs and explicitly call ufshcd_vops_dbg_register_dump where we need to. Change-Id: Icde9a71fc578c43af04a5329b04353d87217ce4f Signed-off-by: Can Guo --- drivers/scsi/ufs/ufshcd.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index f86f7ac777f7..6c7681699f26 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -418,8 +418,6 @@ static void ufshcd_print_host_regs(struct ufs_hba *hba) ufshcd_print_clk_freqs(hba); - ufshcd_vops_dbg_register_dump(hba); - ufshcd_crypto_debug(hba); } @@ -3912,6 +3910,7 @@ out: ufshcd_print_host_state(hba); ufshcd_print_pwr_info(hba); ufshcd_print_host_regs(hba); + ufshcd_vops_dbg_register_dump(hba); } spin_lock_irqsave(hba->host->host_lock, flags); @@ -4623,6 +4622,7 @@ out: ufshcd_print_host_state(hba); ufshcd_print_pwr_info(hba); ufshcd_print_host_regs(hba); + ufshcd_vops_dbg_register_dump(hba); } return ret; } @@ -4979,8 +4979,10 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) dev_err(hba->dev, "OCS error from controller = %x for tag %d\n", ocs, lrbp->task_tag); - ufshcd_print_host_regs(hba); ufshcd_print_host_state(hba); + ufshcd_print_pwr_info(hba); + ufshcd_print_host_regs(hba); + ufshcd_vops_dbg_register_dump(hba); break; } /* end of switch */ @@ -5533,6 +5535,11 @@ static void ufshcd_err_handler(struct work_struct *work) if (!ret) goto skip_err_handling; } + + spin_unlock_irqrestore(hba->host->host_lock, flags); + ufshcd_vops_dbg_register_dump(hba); + spin_lock_irqsave(hba->host->host_lock, flags); + if ((hba->saved_err & INT_FATAL_ERRORS) || (hba->saved_err & UFSHCD_UIC_HIBERN8_MASK) || ((hba->saved_err & UIC_ERROR) && @@ -5780,8 +5787,9 @@ static irqreturn_t ufshcd_check_errors(struct ufs_hba *hba) __func__, hba->saved_err, hba->saved_uic_err); - ufshcd_print_host_regs(hba); + 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); @@ -6358,10 +6366,11 @@ static int ufshcd_abort(struct scsi_cmnd *cmd) scsi_print_command(hba->lrb[tag].cmd); if (!hba->req_abort_count) { ufshcd_update_reg_hist(&hba->ufs_stats.task_abort, 0); - ufshcd_print_host_regs(hba); + ufshcd_print_trs(hba, 1 << tag, true); ufshcd_print_host_state(hba); ufshcd_print_pwr_info(hba); - ufshcd_print_trs(hba, 1 << tag, true); + ufshcd_print_host_regs(hba); + ufshcd_vops_dbg_register_dump(hba); } else { ufshcd_print_trs(hba, 1 << tag, false); } @@ -8744,8 +8753,9 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq) err = ufshcd_hba_enable(hba); if (err) { dev_err(hba->dev, "Host controller enable failed\n"); - ufshcd_print_host_regs(hba); ufshcd_print_host_state(hba); + ufshcd_print_host_regs(hba); + ufshcd_vops_dbg_register_dump(hba); goto out_remove_scsi_host; }