]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
usb: typec: tcpm: fix state transition for SNK_WAIT_CAPABILITIES state in run_state_m...
authorAmit Sunil Dhamne <amitsd@google.com>
Tue, 11 Mar 2025 02:19:07 +0000 (19:19 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 14 Mar 2025 08:15:20 +0000 (09:15 +0100)
A subtle error got introduced while manually fixing merge conflict in
tcpm.c for commit 85c4efbe6088 ("Merge v6.12-rc6 into usb-next"). As a
result of this error, the next state is unconditionally set to
SNK_WAIT_CAPABILITIES_TIMEOUT while handling SNK_WAIT_CAPABILITIES state
in run_state_machine(...).

Fix this by setting new state of TCPM state machine to `upcoming_state`
(that is set to different values based on conditions).

Cc: stable@vger.kernel.org
Fixes: 85c4efbe60888 ("Merge v6.12-rc6 into usb-next")
Signed-off-by: Amit Sunil Dhamne <amitsd@google.com>
Reviewed-by: Badhri Jagan Sridharan <badhri@google.com>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Link: https://lore.kernel.org/r/20250310-fix-snk-wait-timeout-v6-14-rc6-v1-1-5db14475798f@google.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/typec/tcpm/tcpm.c

index 6bf1a22c785aff6b1ad77a20d85e22580527f5b1..62ca4a0ec55bb11c379d05f03ab2456ce2d51291 100644 (file)
@@ -5117,16 +5117,16 @@ static void run_state_machine(struct tcpm_port *port)
                 */
                if (port->vbus_never_low) {
                        port->vbus_never_low = false;
-                       tcpm_set_state(port, SNK_SOFT_RESET,
-                                      port->timings.sink_wait_cap_time);
+                       upcoming_state = SNK_SOFT_RESET;
                } else {
                        if (!port->self_powered)
                                upcoming_state = SNK_WAIT_CAPABILITIES_TIMEOUT;
                        else
                                upcoming_state = hard_reset_state(port);
-                       tcpm_set_state(port, SNK_WAIT_CAPABILITIES_TIMEOUT,
-                                      port->timings.sink_wait_cap_time);
                }
+
+               tcpm_set_state(port, upcoming_state,
+                              port->timings.sink_wait_cap_time);
                break;
        case SNK_WAIT_CAPABILITIES_TIMEOUT:
                /*