diff options
author | Diana Z <dzigterman@chromium.org> | 2020-08-11 15:44:09 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-08-13 02:19:48 +0000 |
commit | a9ab8ea074fb28f9d11225b5800a8cf7339a9218 (patch) | |
tree | 81fc23f6a8352e77c66e3c1d17fecd7e3b849aca | |
parent | c7134fa6499b03d3ee625f84f0412a7ddafb572a (diff) | |
download | chrome-ec-a9ab8ea074fb28f9d11225b5800a8cf7339a9218.tar.gz |
TCPMv2: Check discard flag before processing received messages
When an outgoing message is discarded due to receiving an incoming
message, the new message will arrive the same state machine cycle as the
discard notification (if chunking is disabled).
Child states of the sender response and VDM send parent should verify
their message wasn't discarded before reading the received message.
The parent will continue to handle the discard flag after the child
run state.
BRANCH=None
BUG=b:162753650
TEST=on Volteer with chunking disabled, Gatkex creek is able to continue
correctly after message discard
Signed-off-by: Diana Z <dzigterman@chromium.org>
Change-Id: I9c6343c7713351b38639668a721291eba31519bc
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2350502
Reviewed-by: Keith Short <keithshort@chromium.org>
Reviewed-by: Jett Rink <jettrink@chromium.org>
Tested-by: Keith Short <keithshort@chromium.org>
Commit-Queue: Keith Short <keithshort@chromium.org>
-rw-r--r-- | common/usbc/usb_pe_drp_sm.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c index 5de59c56c2..5f1db976d5 100644 --- a/common/usbc/usb_pe_drp_sm.c +++ b/common/usbc/usb_pe_drp_sm.c @@ -150,6 +150,18 @@ | PE_FLAGS_MSG_DISCARDED \ | PE_FLAGS_VDM_REQUEST_TIMEOUT) +/* + * Combination to check whether a reply to a message was received. Our message + * should have sent (i.e. not been discarded) and a partner message is ready to + * process. + * + * When chunking is disabled (ex. for PD 2.0), these flags will set + * on the same run cycle. With chunking, received message will take an + * additional cycle to be flagged. + */ +#define PE_CHK_REPLY(port) (PE_CHK_FLAG(port, PE_FLAGS_MSG_RECEIVED) && \ + !PE_CHK_FLAG(port, PE_FLAGS_MSG_DISCARDED)) + /* 6.7.3 Hard Reset Counter */ #define N_HARD_RESET_COUNT 2 @@ -3524,7 +3536,7 @@ static void pe_drs_send_swap_run(int port) * 1) A Reject Message is received. * 2) Or a Wait Message is received. */ - if (PE_CHK_FLAG(port, PE_FLAGS_MSG_RECEIVED)) { + if (PE_CHK_REPLY(port)) { PE_CLR_FLAG(port, PE_FLAGS_MSG_RECEIVED); type = PD_HEADER_TYPE(rx_emsg[port].header); @@ -3739,7 +3751,7 @@ static void pe_prs_src_snk_send_swap_run(int port) * 1) A Reject Message is received. * 2) Or a Wait Message is received. */ - if (PE_CHK_FLAG(port, PE_FLAGS_MSG_RECEIVED)) { + if (PE_CHK_REPLY(port)) { PE_CLR_FLAG(port, PE_FLAGS_MSG_RECEIVED); type = PD_HEADER_TYPE(rx_emsg[port].header); @@ -4238,7 +4250,7 @@ static enum vdm_response_result parse_vdm_response_common(int port) uint8_t cnt; uint8_t ext; - if (!PE_CHK_FLAG(port, PE_FLAGS_MSG_RECEIVED)) + if (!PE_CHK_REPLY(port)) return VDM_RESULT_WAITING; PE_CLR_FLAG(port, PE_FLAGS_MSG_RECEIVED); @@ -5170,7 +5182,7 @@ static void pe_vcs_send_swap_run(int port) uint8_t cnt; enum tcpm_transmit_type sop; - if (PE_CHK_FLAG(port, PE_FLAGS_MSG_RECEIVED)) { + if (PE_CHK_REPLY(port)) { PE_CLR_FLAG(port, PE_FLAGS_MSG_RECEIVED); type = PD_HEADER_TYPE(rx_emsg[port].header); @@ -5440,7 +5452,7 @@ static void pe_dr_snk_get_sink_cap_run(int port) * Transition to PE_SEND_SOFT_RESET state when: * 1) An unexpected message is received */ - if (PE_CHK_FLAG(port, PE_FLAGS_MSG_RECEIVED)) { + if (PE_CHK_REPLY(port)) { PE_CLR_FLAG(port, PE_FLAGS_MSG_RECEIVED); type = PD_HEADER_TYPE(rx_emsg[port].header); |