summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Boichat <drinkcat@google.com>2016-12-08 10:45:04 +0800
committerChromeOS Commit Bot <chromeos-commit-bot@chromium.org>2016-12-09 07:13:19 +0000
commitbebf6114e598bc3816822928fdd378fab6c6b5c7 (patch)
tree48412f97e9e7be3f1d214bb9698ea646d8399035
parenta93464581f2b4db7a81db1c61ec933a5c46c8b99 (diff)
downloadchrome-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.c3
-rw-r--r--driver/tcpm/anx74xx.c5
-rw-r--r--driver/tcpm/it83xx.c11
-rw-r--r--driver/tcpm/tcpci.c1
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, &reg);
if (rv) {
- *head = 0;
/* Clear receive message interrupt bit(bit-0) */
tcpc_read(port, ANX74XX_REG_IRQ_SOURCE_RECV_MSG, &reg);
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;
}