]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
scsi: ufs: core: Add a quirk to suppress link_startup_again
authorAdrian Hunter <adrian.hunter@intel.com>
Fri, 24 Oct 2025 08:59:16 +0000 (11:59 +0300)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 30 Oct 2025 03:20:19 +0000 (23:20 -0400)
ufshcd_link_startup() has a facility (link_startup_again) to issue
DME_LINKSTARTUP a 2nd time even though the 1st time was successful.

Some older hardware benefits from that, however the behaviour is
non-standard, and has been found to cause link startup to be unreliable
for some Intel Alder Lake based host controllers.

Add UFSHCD_QUIRK_PERFORM_LINK_STARTUP_ONCE to suppress
link_startup_again, in preparation for setting the quirk for affected
controllers.

Fixes: 7dc9fb47bc9a ("scsi: ufs: ufs-pci: Add support for Intel ADL")
Cc: stable@vger.kernel.org
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Link: https://patch.msgid.link/20251024085918.31825-3-adrian.hunter@intel.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/core/ufshcd.c
include/ufs/ufshcd.h

index 2b76f543d0720e9a07182217b4416528bfcc0ace..453a99ec6282c9e1eadb3ebd5f8e582f1bb330f8 100644 (file)
@@ -5066,7 +5066,8 @@ static int ufshcd_link_startup(struct ufs_hba *hba)
         * If UFS device isn't active then we will have to issue link startup
         * 2 times to make sure the device state move to active.
         */
-       if (!ufshcd_is_ufs_dev_active(hba))
+       if (!(hba->quirks & UFSHCD_QUIRK_PERFORM_LINK_STARTUP_ONCE) &&
+           !ufshcd_is_ufs_dev_active(hba))
                link_startup_again = true;
 
 link_startup:
index 9425cfd9d00eb0671566cfad2e4b8ad67e4802b2..0f95576bf1f6ca999df904d89f59cc7b2a6ac293 100644 (file)
@@ -688,6 +688,13 @@ enum ufshcd_quirks {
         * single doorbell mode.
         */
        UFSHCD_QUIRK_BROKEN_LSDBS_CAP                   = 1 << 25,
+
+       /*
+        * This quirk indicates that DME_LINKSTARTUP should not be issued a 2nd
+        * time (refer link_startup_again) after the 1st time was successful,
+        * because it causes link startup to become unreliable.
+        */
+       UFSHCD_QUIRK_PERFORM_LINK_STARTUP_ONCE          = 1 << 26,
 };
 
 enum ufshcd_caps {