Two minor changes related with error handling
Subsystems (2)
cover Two minor changes related with error handling
The 1st change is a complementary change for error handling.
The 2nd change disables IRQ in host reset path to avoid possible NoC issues.
Can Guo (1):
scsi: ufs: Minor adjustments to error handling
Nitin Rawat (1):
scsi: ufs-qcom: Disable interrupt in reset path
drivers/scsi/ufs/ufs-qcom.c | 10 ++++++++++ drivers/scsi/ufs/ufshcd.c | 14 +++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-)
Signature · 1 line
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.
PATCH 1/2 scsi: ufs: Minor adjustments to error handling
In error handling prepare stage, after SCSI requests are blocked, do a down/up_write(clk_scaling_lock) to clean up the queuecommand() path. Meanwhile, stop eeh_work in case it disturbs error recovery. Moreover, reset ufshcd_state at the entrance of ufshcd_probe_hba(), since it may be called multiple times during error recovery.
drivers/scsi/ufs/ufshcd.c +11 -3
@@ -4964,6 +4964,7 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)* UFS device needs urgent BKOPs. */ if (!hba->pm_op_in_progress && + !ufshcd_eh_in_progress (hba) &&ufshcd_is_exception_event (lrbp->ucd_rsp_ptr) &&schedule_work (&hba->eeh_work)) {/*
@@ -5765,10 +5766,16 @@ static void ufshcd_err_handling_prepare(struct ufs_hba *hba)ufshcd_suspend_clkscaling (hba); } } +ufshcd_scsi_block_requests (hba); +/* Clean up ufshcd_queuecommand path */ +down_write (&hba->clk_scaling_lock); +up_write (&hba->clk_scaling_lock); +cancel_work_sync (&hba->eeh_work); }static void ufshcd_err_handling_unprepare (struct ufs_hba *hba) { +ufshcd_scsi_unblock_requests (hba);ufshcd_release (hba);if (hba->clk_scaling.is_allowed)ufshcd_resume_clkscaling (hba);
@@ -5862,8 +5869,8 @@ static void ufshcd_err_handler(struct work_struct *work)spin_unlock_irqrestore (hba->host->host_lock, flags);ufshcd_err_handling_prepare (hba);spin_lock_irqsave (hba->host->host_lock, flags); -ufshcd_scsi_block_requests (hba); - hba->ufshcd_state =UFSHCD_STATE_RESET ; +if (hba->ufshcd_state !=UFSHCD_STATE_ERROR ) + hba->ufshcd_state =UFSHCD_STATE_RESET ;/* Complete requests that have door-bell cleared by h/w */ ufshcd_complete_requests (hba);
@@ -6022,7 +6029,6 @@ static void ufshcd_err_handler(struct work_struct *work) }ufshcd_clear_eh_in_progress (hba);spin_unlock_irqrestore (hba->host->host_lock, flags); -ufshcd_scsi_unblock_requests (hba);ufshcd_err_handling_unprepare (hba);up (&hba->eh_sem); }
@@ -7836,6 +7842,8 @@ static int ufshcd_probe_hba(struct ufs_hba *hba, bool async)unsigned long flags;ktime_t start =ktime_get (); + hba->ufshcd_state =UFSHCD_STATE_RESET ; + ret =ufshcd_link_startup (hba);if (ret) goto out;
Signature · 1 line
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.
PATCH 2/2 scsi: ufs-qcom: Disable interrupt in reset path
In reply to Can GuoFrom: Nitin Rawat <[email protected]>
Disable interrupt in reset path to flush pending IRQ handler in order to avoid possible NoC issues.
drivers/scsi/ufs/ufs-qcom.c +10 -0
@@ -253,12 +253,17 @@ static int ufs_qcom_host_reset(struct ufs_hba *hba) {int ret =0 ;struct ufs_qcom_host *host =ufshcd_get_variant (hba); +bool reenable_intr = false;if (!host->core_reset) {dev_warn (hba->dev,"%s: reset control not set\n" , __func__); goto out; } + reenable_intr = hba->is_irq_enabled; +disable_irq (hba->irq); + hba->is_irq_enabled = false; + ret =reset_control_assert (host->core_reset);if (ret) { dev_err(hba->dev, "%s: core_reset assert failed, err = %d\n",
@@ -280,6 +285,11 @@ static int ufs_qcom_host_reset(struct ufs_hba *hba)usleep_range (1000 ,1100 ); +if (reenable_intr) { +enable_irq (hba->irq); + hba->is_irq_enabled = true; + } + out:return ret; }
Signature · 1 line
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.