diff options
-rw-r--r-- | common/usb_pd_protocol.c | 24 | ||||
-rw-r--r-- | include/usb_pd.h | 2 |
2 files changed, 15 insertions, 11 deletions
diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c index 3ca0ab2733..cbbe3bdefc 100644 --- a/common/usb_pd_protocol.c +++ b/common/usb_pd_protocol.c @@ -68,6 +68,7 @@ static const uint8_t pd_comm_enabled = 1; #define PD_MESSAGE_ID_COUNT 7 #define PD_HARD_RESET_COUNT 2 #define PD_CAPS_COUNT 50 +#define PD_SNK_CAP_RETRIES 3 enum vdm_states { VDM_STATE_ERR_BUSY = -3, @@ -1339,6 +1340,7 @@ void pd_task(void) enum pd_cc_states new_cc_state; timestamp_t now; int caps_count = 0, hard_reset_sent = 0; + int snk_cap_count; int evt; /* Ensure the power supply is in the default state */ @@ -1602,6 +1604,7 @@ void pd_task(void) /* reset various counters */ caps_count = 0; pd[port].msg_id = 0; + snk_cap_count = 0; set_state_timeout( port, #ifdef CONFIG_USBC_BACKWARDS_COMPATIBLE_DFP @@ -1703,9 +1706,6 @@ void pd_task(void) case PD_STATE_SRC_READY: timeout = PD_T_SOURCE_ACTIVITY; - if (pd[port].last_state != pd[port].task_state) - pd[port].flags |= PD_FLAGS_GET_SNK_CAP_SENT; - /* * Don't send any PD traffic if we woke up due to * incoming packet or if VDO response pending to avoid @@ -1716,13 +1716,17 @@ void pd_task(void) break; /* Send get sink cap if haven't received it yet */ - if ((pd[port].flags & PD_FLAGS_GET_SNK_CAP_SENT) && + if (pd[port].last_state != pd[port].task_state && !(pd[port].flags & PD_FLAGS_SNK_CAP_RECVD)) { - /* Get sink cap to know if dual-role device */ - send_control(port, PD_CTRL_GET_SINK_CAP); - set_state(port, PD_STATE_SRC_GET_SINK_CAP); - pd[port].flags &= ~PD_FLAGS_GET_SNK_CAP_SENT; - break; + if (++snk_cap_count <= PD_SNK_CAP_RETRIES) { + /* Get sink cap to know if dual-role device */ + send_control(port, PD_CTRL_GET_SINK_CAP); + set_state(port, PD_STATE_SRC_GET_SINK_CAP); + break; + } else if (debug_level >= 1 && + snk_cap_count == PD_SNK_CAP_RETRIES+1) { + CPRINTF("ERR SNK_CAP\n"); + } } /* Check power role policy, which may trigger a swap */ @@ -2229,6 +2233,8 @@ void pd_task(void) break; } + /* Don't send GET_SINK_CAP on swap */ + snk_cap_count = PD_SNK_CAP_RETRIES+1; caps_count = 0; pd[port].msg_id = 0; pd[port].power_role = PD_ROLE_SOURCE; diff --git a/include/usb_pd.h b/include/usb_pd.h index 227e53f9e2..9fd95bac8d 100644 --- a/include/usb_pd.h +++ b/include/usb_pd.h @@ -695,7 +695,6 @@ enum pd_states { #define PD_FLAGS_PARTNER_DR_DATA (1 << 2) /* port partner is dualrole data */ #define PD_FLAGS_DATA_SWAPPED (1 << 3) /* data swap complete */ #define PD_FLAGS_SNK_CAP_RECVD (1 << 4) /* sink capabilities received */ -#define PD_FLAGS_GET_SNK_CAP_SENT (1 << 5) /* get sink cap sent */ #define PD_FLAGS_EXPLICIT_CONTRACT (1 << 6) /* explicit pwr contract in place */ #define PD_FLAGS_SFT_RST_DIS_COMM (1 << 7) /* disable comms after soft reset */ #define PD_FLAGS_PREVIOUS_PD_CONN (1 << 8) /* previously PD connected */ @@ -709,7 +708,6 @@ enum pd_states { PD_FLAGS_PARTNER_DR_DATA | \ PD_FLAGS_DATA_SWAPPED | \ PD_FLAGS_SNK_CAP_RECVD | \ - PD_FLAGS_GET_SNK_CAP_SENT | \ PD_FLAGS_EXPLICIT_CONTRACT | \ PD_FLAGS_PREVIOUS_PD_CONN | \ PD_FLAGS_CHECK_PR_ROLE | \ |