Linux SCSI subsystem development
 help / color / mirror / Atom feed
From: Bart Van Assche <bvanassche@acm.org>
To: "Bao D. Nguyen" <quic_nguyenb@quicinc.com>,
	"Martin K . Petersen" <martin.petersen@oracle.com>
Cc: linux-scsi@vger.kernel.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: Re: [PATCH 2/2] scsi: ufs: core: Fix the code for entering hibernation
Date: Fri, 23 Aug 2024 13:25:55 -0700	[thread overview]
Message-ID: <e974b034-62e8-4795-aa78-ee142fd14441@acm.org> (raw)
In-Reply-To: <1bc51b34-0d2f-59ec-f025-bcc68da74718@quicinc.com>

On 8/22/24 8:43 PM, Bao D. Nguyen wrote:
> However, the UIC_COMMAND_COMPL extra interrupt 
> belonging to the previous PMC/hibern8_enter/exit() command can come late 
> and causes the ufshcd_uic_cmd_compl() to complete the current uic 
> command incorrectly.

Hi Bao,

If the UIC command completion interrupt could come late we would
already have observed unhandled interrupt errors in device logs, isn't
it?

Anyway, isn't this something that is easy to fix with something like the
(untested) patch below?

Thanks,

Bart.

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index d0ae6e50becc..e3a487ea83f9 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -2543,13 +2543,11 @@ ufshcd_wait_for_uic_cmd(struct ufs_hba *hba, 
struct uic_command *uic_cmd)
   * __ufshcd_send_uic_cmd - Send UIC commands and retrieve the result
   * @hba: per adapter instance
   * @uic_cmd: UIC command
- * @completion: initialize the completion only if this is set to true
   *
   * Return: 0 only if success.
   */
  static int
-__ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd,
-		      bool completion)
+__ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd)
  {
  	lockdep_assert_held(&hba->uic_cmd_mutex);

@@ -2559,8 +2557,7 @@ __ufshcd_send_uic_cmd(struct ufs_hba *hba, struct 
uic_command *uic_cmd,
  		return -EIO;
  	}

-	if (completion)
-		init_completion(&uic_cmd->done);
+	init_completion(&uic_cmd->done);

  	uic_cmd->cmd_active = 1;
  	ufshcd_dispatch_uic_cmd(hba, uic_cmd);
@@ -2586,7 +2583,7 @@ int ufshcd_send_uic_cmd(struct ufs_hba *hba, 
struct uic_command *uic_cmd)
  	mutex_lock(&hba->uic_cmd_mutex);
  	ufshcd_add_delay_before_dme_cmd(hba);

-	ret = __ufshcd_send_uic_cmd(hba, uic_cmd, true);
+	ret = __ufshcd_send_uic_cmd(hba, uic_cmd);
  	if (!ret)
  		ret = ufshcd_wait_for_uic_cmd(hba, uic_cmd);

@@ -4255,7 +4252,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,17 +4262,8 @@ 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);
+	ret = __ufshcd_send_uic_cmd(hba, cmd);
  	if (ret) {
  		dev_err(hba->dev,
  			"pwr ctrl cmd 0x%x with mode 0x%x uic error %d\n",
@@ -4300,6 +4287,13 @@ static int ufshcd_uic_pwr_ctrl(struct ufs_hba 
*hba, struct uic_command *cmd)
  		goto out;
  	}

+	ret = wait_for_completion_timeout(&cmd->done,
+					  msecs_to_jiffies(uic_cmd_timeout));
+	WARN_ON_ONCE(ret < 0);
+	if (ret == 0)
+		dev_err(hba->dev, "UIC command %#x timed out\n", cmd->command);
+	ret = 0;
+
  check_upmcrs:
  	status = ufshcd_get_upmcrs(hba);
  	if (status != PWR_LOCAL) {
@@ -4318,8 +4312,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);


  reply	other threads:[~2024-08-23 20:26 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 ` [PATCH 2/2] scsi: ufs: core: Fix the code for entering hibernation Bart Van Assche
2024-08-21 21:27   ` 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 [this message]
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=e974b034-62e8-4795-aa78-ee142fd14441@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 \
    --cc=quic_nguyenb@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