diff options
author | Nicolas Boichat <drinkcat@google.com> | 2016-12-08 10:45:04 +0800 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2016-12-09 07:13:19 +0000 |
commit | bebf6114e598bc3816822928fdd378fab6c6b5c7 (patch) | |
tree | 48412f97e9e7be3f1d214bb9698ea646d8399035 | |
parent | a93464581f2b4db7a81db1c61ec933a5c46c8b99 (diff) | |
download | chrome-ec-bebf6114e598bc3816822928fdd378fab6c6b5c7.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>
Reviewed-on: https://chromium-review.googlesource.com/418635
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_protocol.c | 3 | ||||
-rw-r--r-- | driver/tcpm/anx74xx.c | 5 | ||||
-rw-r--r-- | driver/tcpm/it83xx.c | 11 | ||||
-rw-r--r-- | driver/tcpm/tcpci.c | 1 |
4 files changed, 8 insertions, 12 deletions
diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c index db0040d75a..0599fdcf1a 100644 --- a/common/usb_pd_protocol.c +++ b/common/usb_pd_protocol.c @@ -1513,8 +1513,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 13d1bb1c07..b181a6fe1b 100644 --- a/driver/tcpm/anx74xx.c +++ b/driver/tcpm/anx74xx.c @@ -610,7 +610,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 receive message interrupt bit(bit-0) */ tcpc_read(port, ANX74XX_REG_IRQ_SOURCE_RECV_MSG, ®); tcpc_write(port, ANX74XX_REG_IRQ_SOURCE_RECV_MSG, @@ -632,10 +631,8 @@ static int anx74xx_tcpm_get_message(int port, uint32_t *payload, int *head) * 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 3bc0c0db32..f662ad13a1 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( @@ -398,11 +399,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 607dc71063..3f40fb7d7c 100644 --- a/driver/tcpm/tcpci.c +++ b/driver/tcpm/tcpci.c @@ -148,7 +148,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; } |