Patch "scsi: ufs: core: Poll HCS.UCRDY before issuing a UIC command" has been added to the 6.5-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    scsi: ufs: core: Poll HCS.UCRDY before issuing a UIC command

to the 6.5-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     scsi-ufs-core-poll-hcs.ucrdy-before-issuing-a-uic-co.patch
and it can be found in the queue-6.5 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit ee7bba5ad41d81211ee962e379d738a78fb37159
Author: Kiwoong Kim <kwmad.kim@xxxxxxxxxxx>
Date:   Mon Sep 4 10:30:45 2023 +0900

    scsi: ufs: core: Poll HCS.UCRDY before issuing a UIC command
    
    [ Upstream commit d32533d30e2119b0c0aa17596734f1f842f750df ]
    
    With auto hibern8 enabled, UIC could be busy processing a hibern8 operation
    and the HCI would reports UIC not ready for a short while through
    HCS.UCRDY. The UFS driver doesn't currently handle this situation. The
    UFSHCI spec specifies UCRDY like this: whether the host controller is ready
    to process UIC COMMAND
    
    The 'ready' could be seen as many different meanings. If the meaning
    includes not processing any request from HCI, processing a hibern8
    operation can be 'not ready'. In this situation, the driver needs to wait
    until the operations is completed.
    
    Signed-off-by: Kiwoong Kim <kwmad.kim@xxxxxxxxxxx>
    Link: https://lore.kernel.org/r/550484ffb66300bdcec63d3e304dfd55cb432f1f.1693790060.git.kwmad.kim@xxxxxxxxxxx
    Reviewed-by: Adrian Hunter <adrian.hunter@xxxxxxxxx>
    Reviewed-by: Chanwoo Lee <cw9316.lee@xxxxxxxxxxx>
    Signed-off-by: Martin K. Petersen <martin.petersen@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 75c6628af2c0e..80c48eb6bf85c 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -22,6 +22,7 @@
 #include <linux/module.h>
 #include <linux/regulator/consumer.h>
 #include <linux/sched/clock.h>
+#include <linux/iopoll.h>
 #include <scsi/scsi_cmnd.h>
 #include <scsi/scsi_dbg.h>
 #include <scsi/scsi_driver.h>
@@ -2324,7 +2325,11 @@ static inline int ufshcd_hba_capabilities(struct ufs_hba *hba)
  */
 static inline bool ufshcd_ready_for_uic_cmd(struct ufs_hba *hba)
 {
-	return ufshcd_readl(hba, REG_CONTROLLER_STATUS) & UIC_COMMAND_READY;
+	u32 val;
+	int ret = read_poll_timeout(ufshcd_readl, val, val & UIC_COMMAND_READY,
+				    500, UIC_CMD_TIMEOUT * 1000, false, hba,
+				    REG_CONTROLLER_STATUS);
+	return ret == 0 ? true : false;
 }
 
 /**



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux