summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Boichat <drinkcat@google.com>2016-12-05 15:37:01 +0800
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2016-12-07 00:46:34 +0000
commit87d3bc6264bbd7cfef02a65094315ee2cec24097 (patch)
tree012815a4c7fc1df914ef7f07d5da4768b1654637
parent86800045f84b2e19ee0f3afc9004468daed4dc60 (diff)
downloadchrome-ec-87d3bc6264bbd7cfef02a65094315ee2cec24097.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> (cherry picked from commit d0af9df60552aecd2ea308753c25ea607f217fe8) Reviewed-on: https://chromium-review.googlesource.com/416090 Reviewed-by: Nicolas Boichat <drinkcat@chromium.org> Commit-Queue: Nicolas Boichat <drinkcat@chromium.org> Trybot-Ready: Nicolas Boichat <drinkcat@chromium.org>
-rw-r--r--common/usb_pd_policy.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c
index 074d07dc00..d727d8c127 100644
--- a/common/usb_pd_policy.c
+++ b/common/usb_pd_policy.c
@@ -98,6 +98,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;
@@ -140,6 +143,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;