From 12c3acd63fd8d73d8254afb48dc72f1deae10142 Mon Sep 17 00:00:00 2001 From: Denis Brockus Date: Sat, 9 May 2020 13:16:10 -0600 Subject: tcpmv2: warm start DBG_ACC_SNK correctly DBG_ACC_SNK connections are warm starting in ATTACHED_SNK and this is not correct. Added BBRMFLG to keep track and jump back to the correct SNK entry state. BUG=none BRANCH=none TEST=connect a DBGACC and reboot should reconnect DBGACC Signed-off-by: Denis Brockus Change-Id: I4a17c2487a18ed0e4d58954e8d5ade08b4d44fff Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2191815 Tested-by: Denis Brockus Reviewed-by: Diana Z Commit-Queue: Denis Brockus Auto-Submit: Denis Brockus --- common/usbc/usb_tc_drp_acc_trysrc_sm.c | 27 ++++++++++++++++++++++++--- include/usb_pd.h | 1 + 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/common/usbc/usb_tc_drp_acc_trysrc_sm.c b/common/usbc/usb_tc_drp_acc_trysrc_sm.c index dde26301a9..6f3cda307d 100644 --- a/common/usbc/usb_tc_drp_acc_trysrc_sm.c +++ b/common/usbc/usb_tc_drp_acc_trysrc_sm.c @@ -1070,7 +1070,10 @@ void tc_state_init(int port) * change the data role when we get to the state. */ TC_SET_FLAG(port, TC_FLAGS_TC_WARM_ATTACHED_SNK); - set_state_tc(port, TC_ATTACHED_SNK); + set_state_tc(port, + (saved_flgs[port] & PD_BBRMFLG_DBGACC_ROLE) + ? TC_DBG_ACC_SNK + : TC_ATTACHED_SNK); } else { restart_tc_sm(port, TC_UNATTACHED_SNK); /* @@ -2107,6 +2110,9 @@ static void tc_unoriented_dbg_acc_src_entry(const int port) /* Enable auto discharge disconnect, if not PR Swapping */ if (!TC_CHK_FLAG(port, TC_FLAGS_PR_SWAP_IN_PROGRESS)) tcpm_enable_auto_discharge_disconnect(port, 1); + + /* Save our current connection is a DEBUG ACCESSORY */ + pd_update_saved_port_flags(port, PD_BBRMFLG_DBGACC_ROLE, 1); } static void tc_unoriented_dbg_acc_src_run(const int port) @@ -2208,6 +2214,9 @@ static void tc_unoriented_dbg_acc_src_exit(const int port) /* Clear PR swap flag */ TC_CLR_FLAG(port, TC_FLAGS_DO_PR_SWAP); + + /* Save our current connection is not a DEBUG ACCESSORY */ + pd_update_saved_port_flags(port, PD_BBRMFLG_DBGACC_ROLE, 0); } /** @@ -2247,10 +2256,16 @@ static void tc_dbg_acc_snk_entry(const int port) pd_set_polarity(port, tc[port].polarity); /* - * Initial data role for sink is UFP + * Initial data role for sink is UFP unless this is a warm + * attach. If it is a warm attach, the data role will be + * restored to the current connect role and will already + * have called tc_set_data_role with the appropriate role. * This also sets the usb mux */ - tc_set_data_role(port, PD_ROLE_UFP); + if (TC_CHK_FLAG(port, TC_FLAGS_TC_WARM_ATTACHED_SNK)) + TC_CLR_FLAG(port, TC_FLAGS_TC_WARM_ATTACHED_SNK); + else + tc_set_data_role(port, PD_ROLE_UFP); if (IS_ENABLED(CONFIG_CHARGE_MANAGER)) { tc[port].typec_curr = @@ -2272,6 +2287,9 @@ static void tc_dbg_acc_snk_entry(const int port) /* Enable auto discharge disconnect, if not PR Swapping */ if (!TC_CHK_FLAG(port, TC_FLAGS_PR_SWAP_IN_PROGRESS)) tcpm_enable_auto_discharge_disconnect(port, 1); + + /* Save our current connection is a DEBUG ACCESSORY */ + pd_update_saved_port_flags(port, PD_BBRMFLG_DBGACC_ROLE, 1); } static void tc_dbg_acc_snk_run(const int port) @@ -2350,6 +2368,9 @@ static void tc_dbg_acc_snk_exit(const int port) /* Stop drawing power */ sink_stop_drawing_current(port); + + /* Save our current connection is not a DEBUG ACCESSORY */ + pd_update_saved_port_flags(port, PD_BBRMFLG_DBGACC_ROLE, 0); } /** diff --git a/include/usb_pd.h b/include/usb_pd.h index 2ab05ebe2d..f324db8d81 100644 --- a/include/usb_pd.h +++ b/include/usb_pd.h @@ -889,6 +889,7 @@ enum pd_states { #define PD_BBRMFLG_POWER_ROLE BIT(1) #define PD_BBRMFLG_DATA_ROLE BIT(2) #define PD_BBRMFLG_VCONN_ROLE BIT(3) +#define PD_BBRMFLG_DBGACC_ROLE BIT(4) /* Initial value for CC debounce variable */ #define PD_CC_UNSET -1 -- cgit v1.2.1