summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorDenis Brockus <dbrockus@google.com>2020-09-23 09:47:59 -0600
committerCommit Bot <commit-bot@chromium.org>2020-09-23 19:30:55 +0000
commit7caf6f199a53bfb1c1454053f4dbda77246053f2 (patch)
tree0d383e12fab9e5da2eaf7948ac20bd9a6afd1404 /common
parente4df84d057b245017fd1f9f2212e8d16e6345b58 (diff)
downloadchrome-ec-7caf6f199a53bfb1c1454053f4dbda77246053f2.tar.gz
tcpmv2: require init_vdm_mode ack response svid == requested svid
If an INIT VDM ACK response SVID is not equal to the requested SVID then treat this as a NAK This is being seen on the Lepow monitor I was testing on. The sequence looked as follows: DUT: REQ SVID=DP MON: ACK SVID=DP DUT: REQ SVID=Nintendo MON: ACK SVID=DP BUG=b:169077500 BRANCH=none TEST=Lepow monitor should not infinite loop on INIT_VDM Signed-off-by: Denis Brockus <dbrockus@google.com> Change-Id: I55210588494fdc09ed8f3551569262d70ba63277 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2426122 Reviewed-by: Denis Brockus <dbrockus@chromium.org> Commit-Queue: Denis Brockus <dbrockus@chromium.org> Tested-by: Denis Brockus <dbrockus@chromium.org> Auto-Submit: Denis Brockus <dbrockus@chromium.org>
Diffstat (limited to 'common')
-rw-r--r--common/usbc/usb_pe_drp_sm.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c
index a7a3774838..d6399ab632 100644
--- a/common/usbc/usb_pe_drp_sm.c
+++ b/common/usbc/usb_pe_drp_sm.c
@@ -5087,11 +5087,22 @@ static void pe_init_vdm_modes_request_run(int port)
uint32_t *payload = (uint32_t *) rx_emsg[port].buf;
int sop = PD_HEADER_GET_SOP(rx_emsg[port].header);
uint8_t cnt = PD_HEADER_CNT(rx_emsg[port].header);
+ uint16_t response_svid = (uint16_t) PD_VDO_VID(payload[0]);
- /* PE_INIT_VDM_Modes_ACKed embedded here */
- dfp_consume_modes(port, sop, cnt, payload);
- break;
+ /*
+ * Accept ACK if the request and response SVIDs are equal;
+ * otherwise, treat this as a NAK of the request SVID.
+ *
+ * TODO(b:169242812): support valid mode checking in
+ * dfp_consume_modes.
+ */
+ if (requested_svid == response_svid) {
+ /* PE_INIT_VDM_Modes_ACKed embedded here */
+ dfp_consume_modes(port, sop, cnt, payload);
+ break;
+ }
}
+ /* Fall Through */
case VDM_RESULT_NAK:
/* PE_INIT_VDM_Modes_NAKed embedded here */
pd_set_modes_discovery(port, pe[port].tx_type, requested_svid,