summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorDenis Brockus <dbrockus@google.com>2020-10-15 14:27:22 -0600
committerCommit Bot <commit-bot@chromium.org>2020-10-16 01:58:01 +0000
commit8ef11a2aae529d46ea0924eb12dd8654ee3859ad (patch)
treedfa041241d111c4381bf1f9f388f06270dd1ac5f /common
parenta05e4e60626165412a03a8c43d6fbf47d829e5c1 (diff)
downloadchrome-ec-8ef11a2aae529d46ea0924eb12dd8654ee3859ad.tar.gz
tcpmv2: handle custom VDM better
We were receiving a custom VDM that was not one that we would understand and should have gracefully exited from this. BUG=b:158605675 BRANCH=zork TEST=USB-C to HDMI dongle with power attached Signed-off-by: Denis Brockus <dbrockus@google.com> Change-Id: Icf5a699709828c7354d392612a771307bd7a09e7 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2477235 Reviewed-by: Denis Brockus <dbrockus@chromium.org> Tested-by: Denis Brockus <dbrockus@chromium.org> Commit-Queue: Denis Brockus <dbrockus@chromium.org> Auto-Submit: Denis Brockus <dbrockus@chromium.org>
Diffstat (limited to 'common')
-rw-r--r--common/usb_common.c4
-rw-r--r--common/usbc/usb_pe_drp_sm.c6
2 files changed, 10 insertions, 0 deletions
diff --git a/common/usb_common.c b/common/usb_common.c
index 47b0bc9454..d2a5e43cdb 100644
--- a/common/usb_common.c
+++ b/common/usb_common.c
@@ -622,6 +622,10 @@ __overridable int pd_custom_vdm(int port, int cnt, uint32_t *payload,
if (cnt == 0)
return 0;
+ /* Only handle custom requests for SVID Google */
+ if (PD_VDO_VID(*payload) != USB_VID_GOOGLE)
+ return 0;
+
switch (cmd) {
case VDO_CMD_VERSION:
/* guarantee last byte of payload is null character */
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c
index d4a8184883..2f61b2efe3 100644
--- a/common/usbc/usb_pe_drp_sm.c
+++ b/common/usbc/usb_pe_drp_sm.c
@@ -4562,6 +4562,12 @@ static void pe_handle_custom_vdm_request_entry(int port)
tx_emsg[port].len = rlen * 4;
memcpy(tx_emsg[port].buf, (uint8_t *)rdata, tx_emsg[port].len);
send_data_msg(port, sop, PD_DATA_VENDOR_DEF);
+ } else {
+ if (prl_get_rev(port, TCPC_TX_SOP) > PD_REV20)
+ set_state_pe(port, PE_SEND_NOT_SUPPORTED);
+ else
+ pe_set_ready_state(port);
+ return;
}
}