| /* Copyright 2020 The ChromiumOS Authors |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "mock/tcpci_i2c_mock.h" |
| #include "task.h" |
| #include "tcpm/tcpci.h" |
| #include "test_util.h" |
| #include "timer.h" |
| #include "usb_tc_sm.h" |
| #include "usb_tcpmv2_compliance.h" |
| |
| /***************************************************************************** |
| * TD.PD.SRC.E5 SenderResponseTimer Timeout - Request |
| * |
| * Description: |
| * As Consumer (UFP), the Tester intentionally does not send the Request |
| * message, which is intended to cause a SenderResponseTimer timeout on |
| * the Provider (DFP, UUT). The Tester verifies correct implementation |
| * of this timer |
| */ |
| int test_td_pd_src_e5(void) |
| { |
| uint64_t end_time; |
| |
| partner_set_pd_rev(PD_REV20); |
| |
| TEST_EQ(tcpci_startup(), EC_SUCCESS, "%d"); |
| |
| /* |
| * a) Run PROC.PD.E1 Bring-up according to the UUT role. |
| * |
| * NOTE: Calling PROC.PD.E1 with INITIAL_ATTACH will stop just before |
| * the PD_DATA_SOURCE_CAP is verified. We need to stop the process |
| * there to stop the REQUEST message. |
| */ |
| TEST_EQ(proc_pd_e1(PD_ROLE_DFP, INITIAL_ATTACH), EC_SUCCESS, "%d"); |
| |
| /* |
| * b) Upon receipt of the Source Capabilities message from the |
| * Provider, the Tester replies with a GoodCRC message. |
| */ |
| TEST_EQ(verify_tcpci_transmit(TCPCI_MSG_SOP, 0, PD_DATA_SOURCE_CAP), |
| EC_SUCCESS, "%d"); |
| mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS); |
| |
| /* Save time GoodCRC was sent */ |
| end_time = get_time().val; |
| |
| /* |
| * c) The Tester intentionally does not send a Request message and |
| * waits for a Hard Reset. |
| */ |
| |
| /* |
| * d) If a Hard Reset is not detected within 30 ms from the time the |
| * last bit of the GoodCRC message EOP has been sent, the test |
| * fails. |
| * e) If a Hard Reset is detected before 24 ms from the time the |
| * last bit of the GoodCRC message EOP has been sent, the test |
| * fails. |
| */ |
| end_time += 24 * MSEC; |
| while (get_time().val < end_time) { |
| TEST_NE(mock_tcpci_get_reg(TCPC_REG_TRANSMIT), |
| TCPCI_MSG_TX_HARD_RESET, "%d"); |
| task_wait_event(1 * MSEC); |
| } |
| |
| end_time += 6 * MSEC; |
| while (get_time().val < end_time) { |
| if (mock_tcpci_get_reg(TCPC_REG_TRANSMIT) == |
| TCPCI_MSG_TX_HARD_RESET) |
| break; |
| task_wait_event(1 * MSEC); |
| } |
| TEST_EQ(mock_tcpci_get_reg(TCPC_REG_TRANSMIT), TCPCI_MSG_TX_HARD_RESET, |
| "%d"); |
| mock_set_alert(TCPC_REG_ALERT_TX_SUCCESS | TCPC_REG_ALERT_TX_FAILED); |
| mock_tcpci_set_reg(TCPC_REG_TRANSMIT, 0); |
| task_wait_event(1 * MSEC); |
| |
| return EC_SUCCESS; |
| } |