From: Bart Van Assche <bvanassche@acm.org>
To: "Martin K . Petersen" <martin.petersen@oracle.com>
Cc: linux-scsi@vger.kernel.org, Bart Van Assche <bvanassche@acm.org>,
"James E.J. Bottomley" <James.Bottomley@HansenPartnership.com>,
Peter Wang <peter.wang@mediatek.com>,
Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>,
Avri Altman <avri.altman@wdc.com>,
Andrew Halaney <ahalaney@redhat.com>,
Bean Huo <beanhuo@micron.com>,
Alim Akhtar <alim.akhtar@samsung.com>,
Eric Biggers <ebiggers@google.com>,
Minwoo Im <minwoo.im@samsung.com>,
Maramaina Naresh <quic_mnaresh@quicinc.com>
Subject: [PATCH 2/2] scsi: ufs: core: Fix the code for entering hibernation
Date: Wed, 21 Aug 2024 11:29:12 -0700 [thread overview]
Message-ID: <20240821182923.145631-3-bvanassche@acm.org> (raw)
In-Reply-To: <20240821182923.145631-1-bvanassche@acm.org>
Accessing a host controller register after the host controller has
entered the hibernation state may cause the host controller to exit the
hibernation state. Hence rework the hibernation entry code such that it
does not modify the interrupt enabled status. This patch relies on the
following:
* If an UIC command is submitted that should be completed by the UIC
command completion interrupt, hba->uic_async_done == NULL.
* If an UIC command is submitted that should be completed by the power
mode change interrupt or by a hibernation state change interrupt,
hba->uic_async_done != NULL.
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
---
drivers/ufs/core/ufshcd.c | 22 ++++++----------------
include/ufs/ufshcd.h | 7 ++++---
2 files changed, 10 insertions(+), 19 deletions(-)
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index d0ae6e50becc..e12f30b8a83c 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -2585,6 +2585,7 @@ int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)
ufshcd_hold(hba);
mutex_lock(&hba->uic_cmd_mutex);
ufshcd_add_delay_before_dme_cmd(hba);
+ WARN_ON(hba->uic_async_done);
ret = __ufshcd_send_uic_cmd(hba, uic_cmd, true);
if (!ret)
@@ -4255,7 +4256,6 @@ static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba, struct uic_command *cmd)
unsigned long flags;
u8 status;
int ret;
- bool reenable_intr = false;
mutex_lock(&hba->uic_cmd_mutex);
ufshcd_add_delay_before_dme_cmd(hba);
@@ -4266,15 +4266,6 @@ static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba, struct uic_command *cmd)
goto out_unlock;
}
hba->uic_async_done = &uic_async_done;
- if (ufshcd_readl(hba, REG_INTERRUPT_ENABLE) & UIC_COMMAND_COMPL) {
- ufshcd_disable_intr(hba, UIC_COMMAND_COMPL);
- /*
- * Make sure UIC command completion interrupt is disabled before
- * issuing UIC command.
- */
- ufshcd_readl(hba, REG_INTERRUPT_ENABLE);
- reenable_intr = true;
- }
spin_unlock_irqrestore(hba->host->host_lock, flags);
ret = __ufshcd_send_uic_cmd(hba, cmd, false);
if (ret) {
@@ -4318,8 +4309,6 @@ static int ufshcd_uic_pwr_ctrl(struct ufs_hba *hba, struct uic_command *cmd)
spin_lock_irqsave(hba->host->host_lock, flags);
hba->active_uic_cmd = NULL;
hba->uic_async_done = NULL;
- if (reenable_intr)
- ufshcd_enable_intr(hba, UIC_COMMAND_COMPL);
if (ret) {
ufshcd_set_link_broken(hba);
ufshcd_schedule_eh_work(hba);
@@ -5472,11 +5461,12 @@ static irqreturn_t ufshcd_uic_cmd_compl(struct ufs_hba *hba, u32 intr_status)
hba->errors |= (UFSHCD_UIC_HIBERN8_MASK & intr_status);
if (intr_status & UIC_COMMAND_COMPL && cmd) {
- cmd->argument2 |= ufshcd_get_uic_cmd_result(hba);
- cmd->argument3 = ufshcd_get_dme_attr_val(hba);
- if (!hba->uic_async_done)
+ if (!hba->uic_async_done) {
+ cmd->argument2 |= ufshcd_get_uic_cmd_result(hba);
+ cmd->argument3 = ufshcd_get_dme_attr_val(hba);
cmd->cmd_active = 0;
- complete(&cmd->done);
+ complete(&cmd->done);
+ }
retval = IRQ_HANDLED;
}
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index a43b14276bc3..0577013a4611 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -868,9 +868,10 @@ enum ufshcd_mcq_opr {
* @tmf_tag_set: TMF tag set.
* @tmf_queue: Used to allocate TMF tags.
* @tmf_rqs: array with pointers to TMF requests while these are in progress.
- * @active_uic_cmd: handle of active UIC command
- * @uic_cmd_mutex: mutex for UIC command
- * @uic_async_done: completion used during UIC processing
+ * @active_uic_cmd: active UIC command pointer.
+ * @uic_cmd_mutex: mutex used to serialize UIC command processing.
+ * @uic_async_done: completion used to wait for power mode or hibernation state
+ * changes.
* @ufshcd_state: UFSHCD state
* @eh_flags: Error handling flags
* @intr_mask: Interrupt Mask Bits
next prev parent reply other threads:[~2024-08-21 18:29 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-21 18:29 [PATCH 0/2] Fix the UFS driver hibernation code Bart Van Assche
2024-08-21 18:29 ` [PATCH 1/2] scsi: ufs: core: Make ufshcd_uic_cmd_compl() easier to read Bart Van Assche
2024-08-21 21:27 ` Bean Huo
2024-08-22 5:34 ` Peter Wang (王信友)
2024-08-22 17:02 ` Bart Van Assche
2024-08-23 2:54 ` Peter Wang (王信友)
2024-08-26 6:25 ` Dan Carpenter
2024-08-26 18:05 ` Bart Van Assche
2024-08-26 21:36 ` Dan Carpenter
2024-08-21 18:29 ` Bart Van Assche [this message]
2024-08-21 21:27 ` [PATCH 2/2] scsi: ufs: core: Fix the code for entering hibernation Bean Huo
2024-08-21 21:39 ` Bart Van Assche
2024-08-22 14:17 ` Bean Huo
2024-08-22 17:51 ` Bart Van Assche
2024-08-23 10:54 ` Bean Huo
2024-08-23 11:26 ` Can Guo
2024-08-23 16:09 ` Bart Van Assche
2024-08-21 23:26 ` Bao D. Nguyen
2024-08-22 0:14 ` Bart Van Assche
2024-08-22 1:05 ` Bao D. Nguyen
2024-08-22 18:13 ` Bart Van Assche
2024-08-22 20:54 ` Bao D. Nguyen
2024-08-22 21:08 ` Bart Van Assche
2024-08-23 12:01 ` Manivannan Sadhasivam
2024-08-23 14:23 ` Bart Van Assche
2024-08-23 14:58 ` Manivannan Sadhasivam
2024-08-23 16:07 ` Bart Van Assche
2024-08-23 16:48 ` Manivannan Sadhasivam
2024-08-23 18:05 ` Bart Van Assche
2024-08-24 2:29 ` Manivannan Sadhasivam
2024-08-24 2:48 ` Bart Van Assche
2024-08-24 3:03 ` Manivannan Sadhasivam
2024-08-26 6:48 ` Can Guo
2024-08-22 6:36 ` [PATCH 2/2] scsi: ufs: core: Fix the code for entering hibernation Manivannan Sadhasivam
2024-08-22 5:36 ` Peter Wang (王信友)
2024-08-22 23:34 ` Bao D. Nguyen
2024-08-23 2:06 ` Bart Van Assche
2024-08-23 2:57 ` Peter Wang (王信友)
2024-08-23 20:27 ` Bart Van Assche
2024-08-26 6:16 ` Peter Wang (王信友)
2024-08-26 18:08 ` Bart Van Assche
2024-08-27 1:39 ` Peter Wang (王信友)
2024-08-27 15:42 ` Bart Van Assche
2024-08-27 21:59 ` Bao D. Nguyen
2024-08-28 6:17 ` Peter Wang (王信友)
2024-08-28 11:18 ` Bart Van Assche
2024-08-28 13:46 ` Peter Wang (王信友)
2024-08-28 14:10 ` Bart Van Assche
2024-08-29 2:34 ` Peter Wang (王信友)
2024-08-23 3:43 ` Bao D. Nguyen
2024-08-23 20:25 ` Bart Van Assche
2024-08-27 21:17 ` Bao D. Nguyen
2024-08-27 21:39 ` Bart Van Assche
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240821182923.145631-3-bvanassche@acm.org \
--to=bvanassche@acm.org \
--cc=James.Bottomley@HansenPartnership.com \
--cc=ahalaney@redhat.com \
--cc=alim.akhtar@samsung.com \
--cc=avri.altman@wdc.com \
--cc=beanhuo@micron.com \
--cc=ebiggers@google.com \
--cc=linux-scsi@vger.kernel.org \
--cc=manivannan.sadhasivam@linaro.org \
--cc=martin.petersen@oracle.com \
--cc=minwoo.im@samsung.com \
--cc=peter.wang@mediatek.com \
--cc=quic_mnaresh@quicinc.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox