2022-08-17 22:18:38

by Badhri Jagan Sridharan

[permalink] [raw]
Subject: [PATCH v3] usb: typec: tcpm: Return ENOTSUPP for power supply prop writes

When the port does not support USB PD, prevent transition to PD
only states when power supply property is written. In this case,
TCPM transitions to SNK_NEGOTIATE_CAPABILITIES
which should not be the case given that the port is not pd_capable.

[ 84.308251] state change SNK_READY -> SNK_NEGOTIATE_CAPABILITIES [rev3 NONE_AMS]
[ 84.308335] Setting usb_comm capable false
[ 84.323367] set_auto_vbus_discharge_threshold mode:3 pps_active:n vbus:5000 ret:0
[ 84.323376] state change SNK_NEGOTIATE_CAPABILITIES -> SNK_WAIT_CAPABILITIES [rev3 NONE_AMS]

Fixes: e9e6e164ed8f6 ("usb: typec: tcpm: Support non-PD mode")
Cc: [email protected]
Signed-off-by: Badhri Jagan Sridharan <[email protected]>
---
Changes since v1:
- Add Fixes tag.
Changes since v2:
- CCed stable
---
drivers/usb/typec/tcpm/tcpm.c | 7 +++++++
1 file changed, 7 insertions(+)

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index ea5a917c51b1..904c7b4ce2f0 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -6320,6 +6320,13 @@ static int tcpm_psy_set_prop(struct power_supply *psy,
struct tcpm_port *port = power_supply_get_drvdata(psy);
int ret;

+ /*
+ * All the properties below are related to USB PD. The check needs to be
+ * property specific when a non-pd related property is added.
+ */
+ if (!port->pd_supported)
+ return -EOPNOTSUPP;
+
switch (psp) {
case POWER_SUPPLY_PROP_ONLINE:
ret = tcpm_psy_set_online(port, val);
--
2.37.1.595.g718a3a8f04-goog


2022-08-18 08:07:59

by Heikki Krogerus

[permalink] [raw]
Subject: Re: [PATCH v3] usb: typec: tcpm: Return ENOTSUPP for power supply prop writes

On Wed, Aug 17, 2022 at 02:54:10PM -0700, Badhri Jagan Sridharan wrote:
> When the port does not support USB PD, prevent transition to PD
> only states when power supply property is written. In this case,
> TCPM transitions to SNK_NEGOTIATE_CAPABILITIES
> which should not be the case given that the port is not pd_capable.
>
> [ 84.308251] state change SNK_READY -> SNK_NEGOTIATE_CAPABILITIES [rev3 NONE_AMS]
> [ 84.308335] Setting usb_comm capable false
> [ 84.323367] set_auto_vbus_discharge_threshold mode:3 pps_active:n vbus:5000 ret:0
> [ 84.323376] state change SNK_NEGOTIATE_CAPABILITIES -> SNK_WAIT_CAPABILITIES [rev3 NONE_AMS]
>
> Fixes: e9e6e164ed8f6 ("usb: typec: tcpm: Support non-PD mode")
> Cc: [email protected]
> Signed-off-by: Badhri Jagan Sridharan <[email protected]>

Reviewed-by: Heikki Krogerus <[email protected]>

> ---
> Changes since v1:
> - Add Fixes tag.
> Changes since v2:
> - CCed stable
> ---
> drivers/usb/typec/tcpm/tcpm.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
> index ea5a917c51b1..904c7b4ce2f0 100644
> --- a/drivers/usb/typec/tcpm/tcpm.c
> +++ b/drivers/usb/typec/tcpm/tcpm.c
> @@ -6320,6 +6320,13 @@ static int tcpm_psy_set_prop(struct power_supply *psy,
> struct tcpm_port *port = power_supply_get_drvdata(psy);
> int ret;
>
> + /*
> + * All the properties below are related to USB PD. The check needs to be
> + * property specific when a non-pd related property is added.
> + */
> + if (!port->pd_supported)
> + return -EOPNOTSUPP;
> +
> switch (psp) {
> case POWER_SUPPLY_PROP_ONLINE:
> ret = tcpm_psy_set_online(port, val);
> --
> 2.37.1.595.g718a3a8f04-goog

--
heikki