diff options
author | Nicolas Boichat <drinkcat@google.com> | 2016-12-08 10:45:04 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-12-08 22:47:02 -0800 |
commit | 9d7d189450182a9da68b922a737c89bccbd81925 (patch) | |
tree | c2b7ac7b23cd12dedb92eed0f38caea4e27bb28c | |
parent | 0d5562fa73d59d00c1ebf3bfc6a0640f7c3f8f03 (diff) | |
download | chrome-ec-9d7d189450182a9da68b922a737c89bccbd81925.tar.gz |
usb_pd_protocol: tcpm_get_message: Check return value
We currently rely on *head == 0 as error condition, which is
fragile and inconsistent across TCPCs implementations.
Instead, let's return a proper return value on all implementations.
BRANCH=none
BUG=chrome-os-partner:60575
TEST=elm FW as of 65fb80d (later version include a fix that would
hide this issue), cherry-pick this patch, connect j5create
adapter, then HDMI, then power => no crash
Change-Id: If7235e0491e9f80fdd50ce2605477ee518f8e1aa
Reviewed-on: https://chromium-review.googlesource.com/417443
Commit-Ready: Nicolas Boichat <drinkcat@chromium.org>
Tested-by: Nicolas Boichat <drinkcat@chromium.org>
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
-rw-r--r-- | common/usb_pd_protocol.c | 3 | ||||
-rw-r--r-- | driver/tcpm/anx74xx.c | 7 | ||||
-rw-r--r-- | driver/tcpm/it83xx.c | 11 | ||||
-rw-r--r-- | driver/tcpm/tcpci.c | 1 |
4 files changed, 9 insertions, 13 deletions
diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c index 3ea1dbf723..e50bc7f734 100644 --- a/common/usb_pd_protocol.c +++ b/common/usb_pd_protocol.c @@ -1698,8 +1698,7 @@ void pd_task(void) /* process any potential incoming message */ incoming_packet = evt & PD_EVENT_RX; if (incoming_packet) { - tcpm_get_message(port, payload, &head); - if (head > 0) + if (!tcpm_get_message(port, payload, &head)) handle_request(port, head, payload); } /* if nothing to do, verify the state of the world in 500ms */ diff --git a/driver/tcpm/anx74xx.c b/driver/tcpm/anx74xx.c index 89f187f44b..08525a0d08 100644 --- a/driver/tcpm/anx74xx.c +++ b/driver/tcpm/anx74xx.c @@ -717,7 +717,6 @@ static int anx74xx_tcpm_get_message(int port, uint32_t *payload, int *head) /* Fetch the header */ rv |= tcpc_read16(port, ANX74XX_REG_PD_HEADER, ®); if (rv) { - *head = 0; clear_recvd_msg_int(port); return EC_ERROR_UNKNOWN; } @@ -726,17 +725,15 @@ static int anx74xx_tcpm_get_message(int port, uint32_t *payload, int *head) len = PD_HEADER_CNT(*head) * 4; if (!len) { clear_recvd_msg_int(port); - return EC_SUCCESS; + return EC_SUCCESS; } /* Receive message : assuming payload have enough * memory allocated */ rv |= anx74xx_read_pd_obj(port, (uint8_t *)payload, len); - if (rv) { - *head = 0; + if (rv) return EC_ERROR_UNKNOWN; - } return rv; } diff --git a/driver/tcpm/it83xx.c b/driver/tcpm/it83xx.c index 66e4dd1502..d31a00ecec 100644 --- a/driver/tcpm/it83xx.c +++ b/driver/tcpm/it83xx.c @@ -93,13 +93,12 @@ static enum tcpc_cc_voltage_status it83xx_get_cc( return cc_state; } -static void it83xx_rx_data(enum usbpd_port port, int *head, uint32_t *buf) +static int it83xx_rx_data(enum usbpd_port port, int *head, uint32_t *buf) { struct usbpd_header *p_head = (struct usbpd_header *)head; - *head = 0; if (!USBPD_IS_RX_DONE(port)) - return; + return EC_ERROR_UNKNOWN; /* store header */ *p_head = *((struct usbpd_header *)IT83XX_USBPD_RMH_BASE(port)); @@ -113,6 +112,8 @@ static void it83xx_rx_data(enum usbpd_port port, int *head, uint32_t *buf) * If clear this bit, USBPD receives next packet */ IT83XX_USBPD_MRSR(port) = USBPD_REG_MASK_RX_MSG_VALID; + + return EC_SUCCESS; } static enum tcpc_transmit_complete it83xx_tx_data( @@ -423,11 +424,11 @@ static int it83xx_tcpm_set_rx_enable(int port, int enable) static int it83xx_tcpm_get_message(int port, uint32_t *payload, int *head) { - it83xx_rx_data(port, head, payload); + int ret = it83xx_rx_data(port, head, payload); /* un-mask RX done interrupt */ IT83XX_USBPD_IMR(port) &= ~USBPD_REG_MASK_MSG_RX_DONE; - return EC_SUCCESS; + return ret; } static int it83xx_tcpm_transmit(int port, diff --git a/driver/tcpm/tcpci.c b/driver/tcpm/tcpci.c index 68453706c7..a2e196351f 100644 --- a/driver/tcpm/tcpci.c +++ b/driver/tcpm/tcpci.c @@ -201,7 +201,6 @@ int tcpci_tcpm_get_message(int port, uint32_t *payload, int *head) /* RX_BYTE_CNT includes 3 bytes for frame type and header */ if (rv != EC_SUCCESS || cnt < 3) { - *head = 0; rv = EC_ERROR_UNKNOWN; goto clear; } |