diff options
author | Nicolas Boichat <drinkcat@google.com> | 2016-12-05 15:37:01 +0800 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2017-10-30 17:05:04 +0000 |
commit | 0e15ed7dc241187a3d15215c6af82e623bb6046d (patch) | |
tree | 364d4f35479f12e879534effe98f163edfbe363e | |
parent | e3103182047dd33479bcc4a3b81ce598ffde3efd (diff) | |
download | chrome-ec-0e15ed7dc241187a3d15215c6af82e623bb6046d.tar.gz |
usb_pd_policy: pd_extract_pdo_power: Check that mv != 0
It's preferable to print an error when mv = 0, rather than
crashing. Also, do not even select invalid PDO in
pd_find_pdo_index.
This was seen on elm, where ANX7688 appears to send the EC a
corrupted packet during hard reset when connected to j5create
adapter.
BRANCH=none
BUG=chrome-os-partner:60575
TEST=Plug in j5create adapter, then HDMI adapter, then power, elm
does not crash (note that the HDMI output still does not work,
but at least elm charges).
Change-Id: I2150ad6f13465a005444804ec44ec3bdc0ded361
Reviewed-on: https://chromium-review.googlesource.com/416700
Commit-Ready: Nicolas Boichat <drinkcat@chromium.org>
Tested-by: Nicolas Boichat <drinkcat@chromium.org>
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/740000
Reviewed-by: Shawn N <shawnn@chromium.org>
Tested-by: Shawn N <shawnn@chromium.org>
Commit-Queue: Shawn N <shawnn@chromium.org>
-rw-r--r-- | common/usb_pd_policy.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c index 1fa53d5695..6a3d8b3ee8 100644 --- a/common/usb_pd_policy.c +++ b/common/usb_pd_policy.c @@ -107,6 +107,9 @@ static int pd_find_pdo_index(int cnt, uint32_t *src_caps, int max_mv) /* Get max power that is under our max voltage input */ for (i = 0; i < cnt; i++) { mv = ((src_caps[i] >> 10) & 0x3FF) * 50; + /* Skip invalid voltage */ + if (!mv) + continue; /* Skip any voltage not supported by this board */ if (!pd_is_valid_input_voltage(mv)) continue; @@ -154,6 +157,12 @@ static void pd_extract_pdo_power(uint32_t pdo, uint32_t *ma, uint32_t *mv) int max_ma, uw; *mv = ((pdo >> 10) & 0x3FF) * 50; + if (*mv == 0) { + CPRINTF("ERR:PDO mv=0\n"); + *ma = 0; + return; + } + if ((pdo & PDO_TYPE_MASK) == PDO_TYPE_BATTERY) { uw = 250000 * (pdo & 0x3FF); max_ma = 1000 * MIN(1000 * uw, PD_MAX_POWER_MW) / *mv; |