summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Boichat <drinkcat@google.com>2016-12-08 10:45:04 +0800
committerchrome-bot <chrome-bot@chromium.org>2016-12-08 22:47:02 -0800
commit9d7d189450182a9da68b922a737c89bccbd81925 (patch)
treec2b7ac7b23cd12dedb92eed0f38caea4e27bb28c
parent0d5562fa73d59d00c1ebf3bfc6a0640f7c3f8f03 (diff)
downloadchrome-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.c3
-rw-r--r--driver/tcpm/anx74xx.c7
-rw-r--r--driver/tcpm/it83xx.c11
-rw-r--r--driver/tcpm/tcpci.c1
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, &reg);
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;
}