| From 5fa8a5c48a28ce39d7b4fc635aece49616444e12 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 17 Aug 2020 11:38:27 -0700 |
| Subject: usb: typec: tcpm: During PR_SWAP, source caps should be sent only |
| after tSwapSourceStart |
| |
| From: Badhri Jagan Sridharan <badhri@google.com> |
| |
| [ Upstream commit 6bbe2a90a0bb4af8dd99c3565e907fe9b5e7fd88 ] |
| |
| The patch addresses the compliance test failures while running |
| TD.PD.CP.E3, TD.PD.CP.E4, TD.PD.CP.E5 of the "Deterministic PD |
| Compliance MOI" test plan published in https://www.usb.org/usbc. |
| For a product to be Type-C compliant, it's expected that these tests |
| are run on usb.org certified Type-C compliance tester as mentioned in |
| https://www.usb.org/usbc. |
| |
| The purpose of the tests TD.PD.CP.E3, TD.PD.CP.E4, TD.PD.CP.E5 is to |
| verify the PR_SWAP response of the device. While doing so, the test |
| asserts that Source Capabilities message is NOT received from the test |
| device within tSwapSourceStart min (20 ms) from the time the last bit |
| of GoodCRC corresponding to the RS_RDY message sent by the UUT was |
| sent. If it does then the test fails. |
| |
| This is in line with the requirements from the USB Power Delivery |
| Specification Revision 3.0, Version 1.2: |
| "6.6.8.1 SwapSourceStartTimer |
| The SwapSourceStartTimer Shall be used by the new Source, after a |
| Power Role Swap or Fast Role Swap, to ensure that it does not send |
| Source_Capabilities Message before the new Sink is ready to receive |
| the |
| Source_Capabilities Message. The new Source Shall Not send the |
| Source_Capabilities Message earlier than tSwapSourceStart after the |
| last bit of the EOP of GoodCRC Message sent in response to the PS_RDY |
| Message sent by the new Source indicating that its power supply is |
| ready." |
| |
| The patch makes sure that TCPM does not send the Source_Capabilities |
| Message within tSwapSourceStart(20ms) by transitioning into |
| SRC_STARTUP only after tSwapSourceStart(20ms). |
| |
| Signed-off-by: Badhri Jagan Sridharan <badhri@google.com> |
| Reviewed-by: Guenter Roeck <linux@roeck-us.net> |
| Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com> |
| Link: https://lore.kernel.org/r/20200817183828.1895015-1-badhri@google.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/usb/typec/tcpm/tcpm.c | 2 +- |
| include/linux/usb/pd.h | 1 + |
| 2 files changed, 2 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c |
| index a48e3f90d1961..1e676ee44c937 100644 |
| --- a/drivers/usb/typec/tcpm/tcpm.c |
| +++ b/drivers/usb/typec/tcpm/tcpm.c |
| @@ -3573,7 +3573,7 @@ static void run_state_machine(struct tcpm_port *port) |
| */ |
| tcpm_set_pwr_role(port, TYPEC_SOURCE); |
| tcpm_pd_send_control(port, PD_CTRL_PS_RDY); |
| - tcpm_set_state(port, SRC_STARTUP, 0); |
| + tcpm_set_state(port, SRC_STARTUP, PD_T_SWAP_SRC_START); |
| break; |
| |
| case VCONN_SWAP_ACCEPT: |
| diff --git a/include/linux/usb/pd.h b/include/linux/usb/pd.h |
| index b6c233e79bd45..1df895e4680b2 100644 |
| --- a/include/linux/usb/pd.h |
| +++ b/include/linux/usb/pd.h |
| @@ -473,6 +473,7 @@ static inline unsigned int rdo_max_power(u32 rdo) |
| #define PD_T_ERROR_RECOVERY 100 /* minimum 25 is insufficient */ |
| #define PD_T_SRCSWAPSTDBY 625 /* Maximum of 650ms */ |
| #define PD_T_NEWSRC 250 /* Maximum of 275ms */ |
| +#define PD_T_SWAP_SRC_START 20 /* Minimum of 20ms */ |
| |
| #define PD_T_DRP_TRY 100 /* 75 - 150 ms */ |
| #define PD_T_DRP_TRYWAIT 600 /* 400 - 800 ms */ |
| -- |
| 2.27.0 |
| |