The branch main has been updated by jaeyoon:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=9930150214d1ca4ad21561d2e0afce9ebf2cdf6c

commit 9930150214d1ca4ad21561d2e0afce9ebf2cdf6c
Author:     Jaeyoon Choi <[email protected]>
AuthorDate: 2026-09-02 01:52:48 +0000
Commit:     Jaeyoon Choi <[email protected]>
CommitDate: 2026-09-02 02:05:10 +0000

    ufshci: skip the reinit when the new link works
    
    UFSHCI_QUIRK_REINIT_AFTER_MAX_GEAR_SWITCH always rebuilt the
    link after the gear switch. It threw away a working HS link and
    ended up in PWM. The reinit is only needed for a dead link.
    There the local side reports HS and the peer never answers. A
    local readback cannot tell the two apart. Peer traffic can.
    
    Probe the peer with DME_PEER_GET after the switch. Skip the
    reinit when the probe succeeds. Log it when the probe fails.
    
    Reviewed by:            imp (mentor)
    Sponsored by:           Samsung Electronics
    Differential Revision:  https://reviews.freebsd.org/D59299
---
 sys/dev/ufshci/ufshci_ctrlr.c | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/sys/dev/ufshci/ufshci_ctrlr.c b/sys/dev/ufshci/ufshci_ctrlr.c
index b3b9abbe867c..480bbfd43d81 100644
--- a/sys/dev/ufshci/ufshci_ctrlr.c
+++ b/sys/dev/ufshci/ufshci_ctrlr.c
@@ -127,10 +127,25 @@ ufshci_ctrlr_start(struct ufshci_controller *ctrlr, bool 
resetting)
 
        ufshci_dev_init_uic_link_state(ctrlr);
 
-       if ((ctrlr->quirks & UFSHCI_QUIRK_REINIT_AFTER_MAX_GEAR_SWITCH) &&
-           ufshci_ctrlr_reinit_after_max_gear_switch(ctrlr) != 0) {
-               ufshci_ctrlr_fail(ctrlr);
-               return;
+       if (ctrlr->quirks & UFSHCI_QUIRK_REINIT_AFTER_MAX_GEAR_SWITCH) {
+               uint32_t probe;
+
+               /*
+                * The reinit is only needed when the link did not survive
+                * the gear switch. A local readback still shows HS when the
+                * peer is dead. Only peer traffic proves the link works.
+                */
+               if (ufshci_uic_send_dme_peer_get(ctrlr, PA_Granularity,
+                   &probe) != 0) {
+                       ufshci_printf(ctrlr,
+                           "link probe failed after the gear switch, "
+                           "reinitializing\n");
+                       if (ufshci_ctrlr_reinit_after_max_gear_switch(
+                           ctrlr) != 0) {
+                               ufshci_ctrlr_fail(ctrlr);
+                               return;
+                       }
+               }
        }
 
        /* Read Controller Descriptor (Device, Geometry) */

Reply via email to