summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/usb_pd_protocol.c24
-rw-r--r--include/usb_pd.h2
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 | \