diff options
author | Vincent Palatin <vpalatin@chromium.org> | 2014-10-16 14:09:41 -0700 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-10-17 05:52:45 +0000 |
commit | 24699aead9e24f197597dea67b6747f3a9157591 (patch) | |
tree | 8893445e90dcaceb2170e823580a6f7bd5e0e3b7 | |
parent | fd709edf12dfdfb7ee4cf443c4df8bd1461e7b41 (diff) | |
download | chrome-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>
-rw-r--r-- | common/usb_pd_policy.c | 15 |
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) |