summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorudaykiran <udaykiran@google.com>2021-06-18 23:07:05 -0700
committerCommit Bot <commit-bot@chromium.org>2021-06-25 03:33:38 +0000
commit1e6577393086546f983d325be264293dbfc12a76 (patch)
tree9facfe6c7bb34c8545fd75380de6f029315c8f00
parent07578aee1c0c64343ee0de7e186a708984552904 (diff)
downloadchrome-ec-1e6577393086546f983d325be264293dbfc12a76.tar.gz
SenderResponseTimer: offset with TCPC transmit success timestamp
The SenderResponseTimer shall be used by the sender's policy engine to ensure that a message requesting a response is responded to within a bounded time. Which is 24Msec to 30 Msec. However, delays associated TCPC I2C, PE, and PRL layers make hard reset response time greater 30Msec. This CL address the delay associated with TCPC. When TCPC transmit success is reported by TCPC upon receiving the GoodCRC, time stamp is recorded. Another time stamp is recorded just before starting SenderResponseTimer and offsetting PD_T_SENDER_RESPONSE. BUG=b:182439366 BRANCH=none TEST=checked with GRL compliance tester. Noted that total response time is in the middle of the expected time of 24ms to 30ms. This fix achieved response time about 27.675ms Signed-off-by: udaykiran <udaykiran@google.com> Change-Id: Id2ddcdd90eed8b3d66ade3d16877004871a21de8 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2971078 Reviewed-by: Diana Z <dzigterman@chromium.org>
-rw-r--r--common/mock/usb_prl_mock.c4
-rw-r--r--common/usbc/usb_pe_drp_sm.c16
-rw-r--r--common/usbc/usb_prl_sm.c17
-rw-r--r--include/mock/usb_prl_mock.h1
-rw-r--r--include/usb_prl_sm.h8
5 files changed, 43 insertions, 3 deletions
diff --git a/common/mock/usb_prl_mock.c b/common/mock/usb_prl_mock.c
index bf428e6328..9caf63fbf4 100644
--- a/common/mock/usb_prl_mock.c
+++ b/common/mock/usb_prl_mock.c
@@ -155,6 +155,10 @@ void mock_prl_clear_last_sent_msg(int port)
mock_prl_port[port].last_tx_type = TCPC_TX_INVALID;
}
+timestamp_t prl_get_tcpc_tx_success_ts(int port)
+{
+ return get_time();
+}
void mock_prl_message_sent(int port)
{
mock_prl_port[port].message_sent = 1;
diff --git a/common/usbc/usb_pe_drp_sm.c b/common/usbc/usb_pe_drp_sm.c
index 9171b2fb94..e0a364240b 100644
--- a/common/usbc/usb_pe_drp_sm.c
+++ b/common/usbc/usb_pe_drp_sm.c
@@ -2016,6 +2016,8 @@ static void pe_sender_response_msg_entry(const int port)
*/
static enum pe_msg_check pe_sender_response_msg_run(const int port)
{
+ timestamp_t tx_success_ts;
+ uint32_t offset;
if (pd_timer_is_disabled(port, PE_TIMER_SENDER_RESPONSE)) {
/* Check for Discard */
if (PE_CHK_FLAG(port, PE_FLAGS_MSG_DISCARDED)) {
@@ -2034,9 +2036,19 @@ static enum pe_msg_check pe_sender_response_msg_run(const int port)
if (PE_CHK_FLAG(port, PE_FLAGS_TX_COMPLETE)) {
PE_CLR_FLAG(port, PE_FLAGS_TX_COMPLETE);
- /* Initialize and run the SenderResponseTimer */
+ /* TCPC TX success time stamp */
+ tx_success_ts = prl_get_tcpc_tx_success_ts(port);
+ /* Calculate the delay from TX success to PE */
+ offset = time_since32(tx_success_ts);
+
+ /*
+ * Initialize and run the SenderResponseTimer by
+ * offsetting it with TX transmit success time.
+ * This would remove the effect of the latency from
+ * propagating the TX status.
+ */
pd_timer_enable(port, PE_TIMER_SENDER_RESPONSE,
- PD_T_SENDER_RESPONSE);
+ PD_T_SENDER_RESPONSE - offset);
return PE_MSG_SEND_COMPLETED;
}
return PE_MSG_SEND_PENDING;
diff --git a/common/usbc/usb_prl_sm.c b/common/usbc/usb_prl_sm.c
index b54061b04d..1d77de1aa4 100644
--- a/common/usbc/usb_prl_sm.c
+++ b/common/usbc/usb_prl_sm.c
@@ -19,7 +19,6 @@
#include "registers.h"
#include "system.h"
#include "task.h"
-#include "timer.h"
#include "tcpm/tcpm.h"
#include "util.h"
#include "usb_charge.h"
@@ -415,6 +414,8 @@ GEN_NOT_SUPPORTED(TCH_REPORT_ERROR);
#define TCH_REPORT_ERROR TCH_REPORT_ERROR_NOT_SUPPORTED
#endif /* !CONFIG_USB_PD_REV30 */
+/* To store the time stamp when TCPC sets TX Complete Success */
+static timestamp_t tcpc_tx_success_ts[CONFIG_USB_PD_PORT_MAX_COUNT];
/* Set the protocol transmit statemachine to a new state. */
static void set_state_prl_tx(const int port,
@@ -507,8 +508,22 @@ static void print_current_tch_state(const int port)
}
#endif /* CONFIG_USB_PD_EXTENDED_MESSAGES */
+
+timestamp_t prl_get_tcpc_tx_success_ts(int port)
+{
+ return tcpc_tx_success_ts[port];
+}
+
+/* Sets the time stamp when TCPC reports TX success. */
+static void set_tcpc_tx_success_ts(int port)
+{
+ tcpc_tx_success_ts[port] = get_time();
+}
+
void pd_transmit_complete(int port, int status)
{
+ if (status == TCPC_TX_COMPLETE_SUCCESS)
+ set_tcpc_tx_success_ts(port);
prl_tx[port].xmit_status = status;
}
diff --git a/include/mock/usb_prl_mock.h b/include/mock/usb_prl_mock.h
index 052b3e7b76..ca5d3c8fc4 100644
--- a/include/mock/usb_prl_mock.h
+++ b/include/mock/usb_prl_mock.h
@@ -22,6 +22,7 @@ enum pd_ctrl_msg_type mock_prl_get_last_sent_ctrl_msg(int port);
enum pd_data_msg_type mock_prl_get_last_sent_data_msg(int port);
+
void mock_prl_clear_last_sent_msg(int port);
void mock_prl_message_sent(int port);
diff --git a/include/usb_prl_sm.h b/include/usb_prl_sm.h
index afcaa2cfed..0111f54fc1 100644
--- a/include/usb_prl_sm.h
+++ b/include/usb_prl_sm.h
@@ -11,7 +11,15 @@
#include "usb_pd.h"
#include "usb_pd_tcpm.h"
#include "usb_sm.h"
+#include "timer.h"
+/**
+ * Returns TX success time stamp.
+ *
+ * @param port USB-C port number
+ * @return the time stamp of TCPC tx success.
+ **/
+timestamp_t prl_get_tcpc_tx_success_ts(int port);
/**
* Returns true if Protocol Layer State Machine is in run mode