From 7b4636eac208e91488248f9791f98682bd42cb92 Mon Sep 17 00:00:00 2001 From: Nitin Rawat Date: Tue, 15 Dec 2020 16:09:21 +0530 Subject: [PATCH] scsi: ufs: Disable interrupt in reset path During error scenarios, while error handler is in middle of resetting the host controller, we might get a line reset which may result isr handler trying to access UFS register. But since controller is in reset state, SW won't have access to controller register which will lead to noc error. Change-Id: I5aab4dba1b12be9473bd91764307e16b7ef2f279 Signed-off-by: Nitin Rawat --- drivers/scsi/ufs/ufs-qcom.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/scsi/ufs/ufs-qcom.c b/drivers/scsi/ufs/ufs-qcom.c index b40416d3f5c3..7bff6414e6a6 100644 --- a/drivers/scsi/ufs/ufs-qcom.c +++ b/drivers/scsi/ufs/ufs-qcom.c @@ -446,12 +446,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", @@ -473,6 +478,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; }