diff options
author | Denis Brockus <dbrockus@google.com> | 2020-09-23 09:47:59 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-09-23 19:30:55 +0000 |
commit | 7caf6f199a53bfb1c1454053f4dbda77246053f2 (patch) | |
tree | 0d383e12fab9e5da2eaf7948ac20bd9a6afd1404 /common | |
parent | e4df84d057b245017fd1f9f2212e8d16e6345b58 (diff) | |
download | chrome-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.c | 17 |
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, |