Commit 6e1c2241 authored by Badhri Jagan Sridharan's avatar Badhri Jagan Sridharan Committed by Greg Kroah-Hartman

usb: typec: tcpm: Stay in BIST mode till hardreset or unattached

Port starts to toggle when transitioning to unattached state.
This is incorrect while in BIST mode.

6.4.3.1 BIST Carrier Mode
Upon receipt of a BIST Message, with a BIST Carrier Mode BIST Data Object,
the UUT Shall send out a continuous string of BMC encoded alternating "1"s
and “0”s. The UUT Shall exit the Continuous BIST Mode within
tBISTContMode of this Continuous BIST Mode being enabled(see
Section 6.6.7.2).

6.4.3.2 BIST Test Data
Upon receipt of a BIST Message, with a BIST Test Data BIST Data Object,
the UUT Shall return a GoodCRC Message and Shall enter a test mode in which
it sends no further Messages except for GoodCRC Messages in response to
received Messages. See Section 5.9.2 for the definition of the Test Data
Frame. The test Shall be ended by sending Hard Reset Signaling to reset the
UUT.
Signed-off-by: default avatarBadhri Jagan Sridharan <badhri@google.com>
Reviewed-by: default avatarGuenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20200716034128.1251728-3-badhri@google.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c081ac42
...@@ -3561,6 +3561,8 @@ static void run_state_machine(struct tcpm_port *port) ...@@ -3561,6 +3561,8 @@ static void run_state_machine(struct tcpm_port *port)
switch (BDO_MODE_MASK(port->bist_request)) { switch (BDO_MODE_MASK(port->bist_request)) {
case BDO_MODE_CARRIER2: case BDO_MODE_CARRIER2:
tcpm_pd_transmit(port, TCPC_TX_BIST_MODE_2, NULL); tcpm_pd_transmit(port, TCPC_TX_BIST_MODE_2, NULL);
tcpm_set_state(port, unattached_state(port),
PD_T_BIST_CONT_MODE);
break; break;
case BDO_MODE_TESTDATA: case BDO_MODE_TESTDATA:
if (port->tcpc->set_bist_data) { if (port->tcpc->set_bist_data) {
...@@ -3571,8 +3573,6 @@ static void run_state_machine(struct tcpm_port *port) ...@@ -3571,8 +3573,6 @@ static void run_state_machine(struct tcpm_port *port)
default: default:
break; break;
} }
/* Always switch to unattached state */
tcpm_set_state(port, unattached_state(port), 0);
break; break;
case GET_STATUS_SEND: case GET_STATUS_SEND:
tcpm_pd_send_control(port, PD_CTRL_GET_STATUS); tcpm_pd_send_control(port, PD_CTRL_GET_STATUS);
...@@ -3962,6 +3962,9 @@ static void _tcpm_pd_vbus_off(struct tcpm_port *port) ...@@ -3962,6 +3962,9 @@ static void _tcpm_pd_vbus_off(struct tcpm_port *port)
static void _tcpm_pd_hard_reset(struct tcpm_port *port) static void _tcpm_pd_hard_reset(struct tcpm_port *port)
{ {
tcpm_log_force(port, "Received hard reset"); tcpm_log_force(port, "Received hard reset");
if (port->bist_request == BDO_MODE_TESTDATA && port->tcpc->set_bist_data)
port->tcpc->set_bist_data(port->tcpc, false);
/* /*
* If we keep receiving hard reset requests, executing the hard reset * If we keep receiving hard reset requests, executing the hard reset
* must have failed. Revert to error recovery if that happens. * must have failed. Revert to error recovery if that happens.
......
...@@ -483,4 +483,5 @@ static inline unsigned int rdo_max_power(u32 rdo) ...@@ -483,4 +483,5 @@ static inline unsigned int rdo_max_power(u32 rdo)
#define PD_N_CAPS_COUNT (PD_T_NO_RESPONSE / PD_T_SEND_SOURCE_CAP) #define PD_N_CAPS_COUNT (PD_T_NO_RESPONSE / PD_T_SEND_SOURCE_CAP)
#define PD_N_HARD_RESET_COUNT 2 #define PD_N_HARD_RESET_COUNT 2
#define PD_T_BIST_CONT_MODE 50 /* 30 - 60 ms */
#endif /* __LINUX_USB_PD_H */ #endif /* __LINUX_USB_PD_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment