summaryrefslogtreecommitdiff
path: root/common/usb_pd_policy.c
diff options
context:
space:
mode:
authorVincent Palatin <vpalatin@chromium.org>2014-10-16 14:09:41 -0700
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-10-17 05:52:45 +0000
commit24699aead9e24f197597dea67b6747f3a9157591 (patch)
tree8893445e90dcaceb2170e823580a6f7bd5e0e3b7 /common/usb_pd_policy.c
parentfd709edf12dfdfb7ee4cf443c4df8bd1461e7b41 (diff)
downloadchrome-ec-24699aead9e24f197597dea67b6747f3a9157591.tar.gz
pd: NACK unsupported VDM requests
When a VDM request is not supported, return a proper NAK message rather than trying to execute a NULL pointer. Signed-off-by: Vincent Palatin <vpalatin@chromium.org> BRANCH=samus BUG=none TEST=plug a power source sending discovery VDM to Samus. Change-Id: Iba60fd29d950c99fd981f9e8ecf3e911409147d5 Reviewed-on: https://chromium-review.googlesource.com/223780 Tested-by: Vincent Palatin <vpalatin@chromium.org> Reviewed-by: Todd Broch <tbroch@chromium.org> Reviewed-by: Alec Berg <alecaberg@chromium.org> Commit-Queue: Vincent Palatin <vpalatin@chromium.org>
Diffstat (limited to 'common/usb_pd_policy.c')
-rw-r--r--common/usb_pd_policy.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c
index b7e072775d..9128c19d29 100644
--- a/common/usb_pd_policy.c
+++ b/common/usb_pd_policy.c
@@ -179,6 +179,7 @@ int pd_svdm(int port, int cnt, uint32_t *payload, uint32_t **rpayload)
int i;
int cmd = PD_VDO_CMD(payload[0]);
int cmd_type = PD_VDO_CMDT(payload[0]);
+ int (*func)(int port, uint32_t *payload) = NULL;
int rsize = 1; /* VDM header at a minimum */
ccprintf("%T] SVDM/%d [%d] %08x", cnt, cmd, payload[0]);
@@ -192,21 +193,25 @@ int pd_svdm(int port, int cnt, uint32_t *payload, uint32_t **rpayload)
if (cmd_type == CMDT_INIT) {
switch (cmd) {
case CMD_DISCOVER_IDENT:
- rsize = svdm_rsp.identity(port, payload);
+ func = svdm_rsp.identity;
break;
case CMD_DISCOVER_SVID:
- rsize = svdm_rsp.svids(port, payload);
+ func = svdm_rsp.svids;
break;
case CMD_DISCOVER_MODES:
- rsize = svdm_rsp.modes(port, payload);
+ func = svdm_rsp.modes;
break;
case CMD_ENTER_MODE:
- rsize = svdm_rsp.enter_mode(port, payload);
+ func = svdm_rsp.enter_mode;
break;
case CMD_EXIT_MODE:
- rsize = svdm_rsp.exit_mode(port, payload);
+ func = svdm_rsp.exit_mode;
break;
}
+ if (func)
+ rsize = func(port, payload);
+ else /* not supported : NACK it */
+ rsize = 1;
if (rsize > 1)
payload[0] |= VDO_CMDT(CMDT_RSP_ACK);
else if (rsize == 1)