summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiana Z <dzigterman@chromium.org>2020-03-13 11:37:01 -0600
committerCommit Bot <commit-bot@chromium.org>2020-03-20 22:07:14 +0000
commit97abc2628c00a7b1a0e97af00c9a42a38af9fb72 (patch)
tree9dc7f028371393ce0f4a14a55a4aa6320e561f3d
parenteb649928b4f2e033e0f192263a855e16b01672f4 (diff)
downloadchrome-ec-97abc2628c00a7b1a0e97af00c9a42a38af9fb72.tar.gz
TCPMv2: Process incoming messages before discovery
Currently, the SNK_Ready and SRC_Ready states process discovery and DPMs first. This change puts priority on incoming messages, except for hard reset requests. BUG=b:151445255,b:150637227 BRANCH=None TEST=on kindred, saw PR_Swap processed when it came in during the discovery process Signed-off-by: Diana Z <dzigterman@chromium.org> Change-Id: I6260def4de063fee2e48ec7ca8a453d37f686924 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2103039 Reviewed-by: Jett Rink <jettrink@chromium.org>
-rw-r--r--common/usbc/usb_pe_drp_sm.c306
1 files changed, 154 insertions, 152 deletions
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c
index ae97ba4e28..bdca3c6512 100644
--- a/common/usbc/usb_pe_drp_sm.c
+++ b/common/usbc/usb_pe_drp_sm.c
@@ -1621,80 +1621,9 @@ static void pe_src_ready_run(int port)
return;
}
- if (pe[port].wait_and_add_jitter_timer == TIMER_DISABLED ||
- get_time().val > pe[port].wait_and_add_jitter_timer) {
-
- PE_CLR_FLAG(port, PE_FLAGS_FIRST_MSG);
- pe[port].wait_and_add_jitter_timer = TIMER_DISABLED;
-
- if (pe[port].cable.discovery == PD_DISC_NEEDED &&
- get_time().val > pe[port].discover_port_identity_timer &&
- pe_can_send_sop_prime(port)) {
- set_state_pe(port, PE_VDM_IDENTITY_REQUEST_CBL);
- return;
- }
-
- /*
- * Start Port Discovery when:
- * 1) The DiscoverIdentityTimer times out.
- */
- if (get_time().val > pe[port].discover_port_identity_timer) {
- pe_start_port_discovery(port);
- return;
- }
-
- /*
- * Handle Device Policy Manager Requests
- */
-
- /*
- * Ignore sink specific request:
- * DPM_REQUEST_NEW_POWER_LEVEL
- * DPM_REQUEST_SOURCE_CAP
- */
-
- PE_CLR_DPM_REQUEST(port, DPM_REQUEST_NEW_POWER_LEVEL |
- DPM_REQUEST_SOURCE_CAP);
-
- if (pe[port].dpm_request) {
- PE_SET_FLAG(port, PE_FLAGS_LOCALLY_INITIATED_AMS);
-
- if (PE_CHK_DPM_REQUEST(port, DPM_REQUEST_DR_SWAP)) {
- PE_CLR_DPM_REQUEST(port, DPM_REQUEST_DR_SWAP);
- if (PE_CHK_FLAG(port, PE_FLAGS_MODAL_OPERATION))
- set_state_pe(port, PE_SRC_HARD_RESET);
- else
- set_state_pe(port, PE_DRS_SEND_SWAP);
- } else if (PE_CHK_DPM_REQUEST(port,
- DPM_REQUEST_PR_SWAP)) {
- PE_CLR_DPM_REQUEST(port, DPM_REQUEST_PR_SWAP);
- set_state_pe(port, PE_PRS_SRC_SNK_SEND_SWAP);
- } else if (PE_CHK_DPM_REQUEST(port,
- DPM_REQUEST_GOTO_MIN)) {
- PE_CLR_DPM_REQUEST(port, DPM_REQUEST_GOTO_MIN);
- set_state_pe(port, PE_SRC_TRANSITION_SUPPLY);
- } else if (PE_CHK_DPM_REQUEST(port,
- DPM_REQUEST_SRC_CAP_CHANGE)) {
- PE_CLR_DPM_REQUEST(port,
- DPM_REQUEST_SRC_CAP_CHANGE);
- set_state_pe(port, PE_SRC_SEND_CAPABILITIES);
- } else if (PE_CHK_DPM_REQUEST(port,
- DPM_REQUEST_SEND_PING)) {
- PE_CLR_DPM_REQUEST(port, DPM_REQUEST_SEND_PING);
- set_state_pe(port, PE_SRC_PING);
- } else if (!common_src_snk_dpm_requests(port)) {
- CPRINTF("Unhandled DPM Request %x received\n",
- pe[port].dpm_request);
- PE_CLR_FLAG(port,
- PE_FLAGS_LOCALLY_INITIATED_AMS);
- }
-
- return;
- }
- }
-
/*
- * Handle Source Requests
+ * Handle incoming messages before discovery and DPMs other than hard
+ * reset
*/
if (PE_CHK_FLAG(port, PE_FLAGS_MSG_RECEIVED)) {
PE_CLR_FLAG(port, PE_FLAGS_MSG_RECEIVED);
@@ -1786,6 +1715,78 @@ static void pe_src_ready_run(int port)
PE_CLR_FLAG(port, PE_FLAGS_DISCOVER_PORT_CONTINUE);
set_state_pe(port, PE_VDM_REQUEST);
}
+
+ if (pe[port].wait_and_add_jitter_timer == TIMER_DISABLED ||
+ get_time().val > pe[port].wait_and_add_jitter_timer) {
+
+ PE_CLR_FLAG(port, PE_FLAGS_FIRST_MSG);
+ pe[port].wait_and_add_jitter_timer = TIMER_DISABLED;
+
+ if (pe[port].cable.discovery == PD_DISC_NEEDED &&
+ get_time().val > pe[port].discover_port_identity_timer &&
+ pe_can_send_sop_prime(port)) {
+ set_state_pe(port, PE_VDM_IDENTITY_REQUEST_CBL);
+ return;
+ }
+
+ /*
+ * Start Port Discovery when:
+ * 1) The DiscoverIdentityTimer times out.
+ */
+ if (get_time().val > pe[port].discover_port_identity_timer) {
+ pe_start_port_discovery(port);
+ return;
+ }
+
+ /*
+ * Handle Device Policy Manager Requests
+ */
+
+ /*
+ * Ignore sink specific request:
+ * DPM_REQUEST_NEW_POWER_LEVEL
+ * DPM_REQUEST_SOURCE_CAP
+ */
+
+ PE_CLR_DPM_REQUEST(port, DPM_REQUEST_NEW_POWER_LEVEL |
+ DPM_REQUEST_SOURCE_CAP);
+
+ if (pe[port].dpm_request) {
+ PE_SET_FLAG(port, PE_FLAGS_LOCALLY_INITIATED_AMS);
+
+ if (PE_CHK_DPM_REQUEST(port, DPM_REQUEST_DR_SWAP)) {
+ PE_CLR_DPM_REQUEST(port, DPM_REQUEST_DR_SWAP);
+ if (PE_CHK_FLAG(port, PE_FLAGS_MODAL_OPERATION))
+ set_state_pe(port, PE_SRC_HARD_RESET);
+ else
+ set_state_pe(port, PE_DRS_SEND_SWAP);
+ } else if (PE_CHK_DPM_REQUEST(port,
+ DPM_REQUEST_PR_SWAP)) {
+ PE_CLR_DPM_REQUEST(port, DPM_REQUEST_PR_SWAP);
+ set_state_pe(port, PE_PRS_SRC_SNK_SEND_SWAP);
+ } else if (PE_CHK_DPM_REQUEST(port,
+ DPM_REQUEST_GOTO_MIN)) {
+ PE_CLR_DPM_REQUEST(port, DPM_REQUEST_GOTO_MIN);
+ set_state_pe(port, PE_SRC_TRANSITION_SUPPLY);
+ } else if (PE_CHK_DPM_REQUEST(port,
+ DPM_REQUEST_SRC_CAP_CHANGE)) {
+ PE_CLR_DPM_REQUEST(port,
+ DPM_REQUEST_SRC_CAP_CHANGE);
+ set_state_pe(port, PE_SRC_SEND_CAPABILITIES);
+ } else if (PE_CHK_DPM_REQUEST(port,
+ DPM_REQUEST_SEND_PING)) {
+ PE_CLR_DPM_REQUEST(port, DPM_REQUEST_SEND_PING);
+ set_state_pe(port, PE_SRC_PING);
+ } else if (!common_src_snk_dpm_requests(port)) {
+ CPRINTF("Unhandled DPM Request %x received\n",
+ pe[port].dpm_request);
+ PE_CLR_FLAG(port,
+ PE_FLAGS_LOCALLY_INITIATED_AMS);
+ }
+
+ return;
+ }
+ }
}
static void pe_src_ready_exit(int port)
@@ -2356,86 +2357,9 @@ static void pe_snk_ready_run(int port)
return;
}
- if (pe[port].wait_and_add_jitter_timer == TIMER_DISABLED ||
- get_time().val > pe[port].wait_and_add_jitter_timer) {
- PE_CLR_FLAG(port, PE_FLAGS_FIRST_MSG);
- pe[port].wait_and_add_jitter_timer = TIMER_DISABLED;
-
- if (get_time().val > pe[port].sink_request_timer) {
- set_state_pe(port, PE_SNK_SELECT_CAPABILITY);
- return;
- }
-
- if (pe[port].cable.discovery == PD_DISC_NEEDED &&
- get_time().val > pe[port].discover_port_identity_timer &&
- pe_can_send_sop_prime(port)) {
- set_state_pe(port, PE_VDM_IDENTITY_REQUEST_CBL);
- return;
- }
-
- /*
- * Start Port Discovery when:
- * 1) The PortDiscoverIdentityTimer times out.
- */
- if (get_time().val > pe[port].discover_port_identity_timer) {
- pe_start_port_discovery(port);
- return;
- }
-
- /*
- * Handle Device Policy Manager Requests
- */
- /*
- * Ignore source specific requests:
- * DPM_REQUEST_GOTO_MIN
- * DPM_REQUEST_SRC_CAP_CHANGE,
- * DPM_REQUEST_SEND_PING
- */
- PE_CLR_DPM_REQUEST(port, DPM_REQUEST_GOTO_MIN |
- DPM_REQUEST_SRC_CAP_CHANGE |
- DPM_REQUEST_SEND_PING);
-
- if (pe[port].dpm_request) {
- PE_SET_FLAG(port, PE_FLAGS_LOCALLY_INITIATED_AMS);
-
- if (PE_CHK_DPM_REQUEST(port, DPM_REQUEST_DR_SWAP)) {
- PE_CLR_DPM_REQUEST(port, DPM_REQUEST_DR_SWAP);
- if (PE_CHK_FLAG(port, PE_FLAGS_MODAL_OPERATION))
- set_state_pe(port, PE_SNK_HARD_RESET);
- else
- set_state_pe(port, PE_DRS_SEND_SWAP);
- } else if (PE_CHK_DPM_REQUEST(port,
- DPM_REQUEST_PR_SWAP)) {
- PE_CLR_DPM_REQUEST(port, DPM_REQUEST_PR_SWAP);
- set_state_pe(port, PE_PRS_SNK_SRC_SEND_SWAP);
- } else if (PE_CHK_DPM_REQUEST(port,
- DPM_REQUEST_SOURCE_CAP)) {
- PE_CLR_DPM_REQUEST(port,
- DPM_REQUEST_SOURCE_CAP);
- set_state_pe(port, PE_SNK_GET_SOURCE_CAP);
- } else if (PE_CHK_DPM_REQUEST(port,
- DPM_REQUEST_NEW_POWER_LEVEL)) {
- PE_CLR_DPM_REQUEST(port,
- DPM_REQUEST_NEW_POWER_LEVEL);
- set_state_pe(port, PE_SNK_SELECT_CAPABILITY);
- } else if (PE_CHK_DPM_REQUEST(port,
- DPM_REQUEST_GET_SNK_CAPS)) {
- PE_CLR_DPM_REQUEST(port,
- DPM_REQUEST_GET_SNK_CAPS);
- set_state_pe(port, PE_DR_SNK_GET_SINK_CAP);
- } else if (!common_src_snk_dpm_requests(port)) {
- CPRINTF("Unhandled DPM Request %x received\n",
- pe[port].dpm_request);
- PE_CLR_FLAG(port,
- PE_FLAGS_LOCALLY_INITIATED_AMS);
- }
-
- return;
- }
- }
-
/*
- * Handle Source Requests
+ * Handle incoming messages before discovery and DPMs other than hard
+ * reset
*/
if (PE_CHK_FLAG(port, PE_FLAGS_MSG_RECEIVED)) {
PE_CLR_FLAG(port, PE_FLAGS_MSG_RECEIVED);
@@ -2528,6 +2452,84 @@ static void pe_snk_ready_run(int port)
PE_CLR_FLAG(port, PE_FLAGS_DISCOVER_PORT_CONTINUE);
set_state_pe(port, PE_VDM_REQUEST);
}
+
+ if (pe[port].wait_and_add_jitter_timer == TIMER_DISABLED ||
+ get_time().val > pe[port].wait_and_add_jitter_timer) {
+ PE_CLR_FLAG(port, PE_FLAGS_FIRST_MSG);
+ pe[port].wait_and_add_jitter_timer = TIMER_DISABLED;
+
+ if (get_time().val > pe[port].sink_request_timer) {
+ set_state_pe(port, PE_SNK_SELECT_CAPABILITY);
+ return;
+ }
+
+ if (pe[port].cable.discovery == PD_DISC_NEEDED &&
+ get_time().val > pe[port].discover_port_identity_timer &&
+ pe_can_send_sop_prime(port)) {
+ set_state_pe(port, PE_VDM_IDENTITY_REQUEST_CBL);
+ return;
+ }
+
+ /*
+ * Start Port Discovery when:
+ * 1) The PortDiscoverIdentityTimer times out.
+ */
+ if (get_time().val > pe[port].discover_port_identity_timer) {
+ pe_start_port_discovery(port);
+ return;
+ }
+
+ /*
+ * Handle Device Policy Manager Requests
+ */
+ /*
+ * Ignore source specific requests:
+ * DPM_REQUEST_GOTO_MIN
+ * DPM_REQUEST_SRC_CAP_CHANGE,
+ * DPM_REQUEST_SEND_PING
+ */
+ PE_CLR_DPM_REQUEST(port, DPM_REQUEST_GOTO_MIN |
+ DPM_REQUEST_SRC_CAP_CHANGE |
+ DPM_REQUEST_SEND_PING);
+
+ if (pe[port].dpm_request) {
+ PE_SET_FLAG(port, PE_FLAGS_LOCALLY_INITIATED_AMS);
+
+ if (PE_CHK_DPM_REQUEST(port, DPM_REQUEST_DR_SWAP)) {
+ PE_CLR_DPM_REQUEST(port, DPM_REQUEST_DR_SWAP);
+ if (PE_CHK_FLAG(port, PE_FLAGS_MODAL_OPERATION))
+ set_state_pe(port, PE_SNK_HARD_RESET);
+ else
+ set_state_pe(port, PE_DRS_SEND_SWAP);
+ } else if (PE_CHK_DPM_REQUEST(port,
+ DPM_REQUEST_PR_SWAP)) {
+ PE_CLR_DPM_REQUEST(port, DPM_REQUEST_PR_SWAP);
+ set_state_pe(port, PE_PRS_SNK_SRC_SEND_SWAP);
+ } else if (PE_CHK_DPM_REQUEST(port,
+ DPM_REQUEST_SOURCE_CAP)) {
+ PE_CLR_DPM_REQUEST(port,
+ DPM_REQUEST_SOURCE_CAP);
+ set_state_pe(port, PE_SNK_GET_SOURCE_CAP);
+ } else if (PE_CHK_DPM_REQUEST(port,
+ DPM_REQUEST_NEW_POWER_LEVEL)) {
+ PE_CLR_DPM_REQUEST(port,
+ DPM_REQUEST_NEW_POWER_LEVEL);
+ set_state_pe(port, PE_SNK_SELECT_CAPABILITY);
+ } else if (PE_CHK_DPM_REQUEST(port,
+ DPM_REQUEST_GET_SNK_CAPS)) {
+ PE_CLR_DPM_REQUEST(port,
+ DPM_REQUEST_GET_SNK_CAPS);
+ set_state_pe(port, PE_DR_SNK_GET_SINK_CAP);
+ } else if (!common_src_snk_dpm_requests(port)) {
+ CPRINTF("Unhandled DPM Request %x received\n",
+ pe[port].dpm_request);
+ PE_CLR_FLAG(port,
+ PE_FLAGS_LOCALLY_INITIATED_AMS);
+ }
+
+ return;
+ }
+ }
}
static void pe_snk_ready_exit(int port)