All of lore.kernel.org
 help / color / mirror / Atom feed
From: cy_huang <u0084500@gmail.com>
To: linux@roeck-us.net, heikki.krogerus@linux.intel.com,
	matthias.bgg@gmail.com
Cc: gregkh@linuxfoundation.org, tommyyl.chen@mediatek.com,
	macpaul.lin@mediatek.com, gene_chen@richtek.com,
	linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-mediatek@lists.infradead.org,
	ChiYuan Huang <cy_huang@richtek.com>,
	stable@vger.kernel.org
Subject: [PATCH] usb: typec: tcpm: Fix altmode re-registration causes sysfs create fail
Date: Thu, 15 Dec 2022 17:21:36 +0800	[thread overview]
Message-ID: <1671096096-20307-1-git-send-email-u0084500@gmail.com> (raw)

From: ChiYuan Huang <cy_huang@richtek.com>

There's the altmode re-registeration issue after data role
swap (DR_SWAP).

Comparing to USBPD 2.0, in USBPD 3.0, it loose the limit that only DFP
can initiate the VDM command to get partner identity information.

For a USBPD 3.0 UFP device, it may already get the identity information
from its port partner before DR_SWAP. If DR_SWAP send or receive at the
mean time, 'send_discover' flag will be raised again. It causes discover
identify action restart while entering ready state. And after all
discover actions are done, the 'tcpm_register_altmodes' will be called.
If old altmode is not unregistered, this sysfs create fail can be found.

In 'DR_SWAP_CHANGE_DR' state case, only DFP will unregister altmodes.
For UFP, the original altmodes keep registered.

This patch fix the logic that after DR_SWAP, 'tcpm_unregister_altmodes'
must be called whatever the current data role is.

Fixes: ae8a2ca8a221 ("usb: typec: Group all TCPCI/TCPM code together)
Reported-by: TommyYl Chen <tommyyl.chen@mediatek.com>
Cc: stable@vger.kernel.org
Signed-off-by: ChiYuan Huang <cy_huang@richtek.com>
---
Hi,

Below's the issue log for the reference.

*TCPM
[    3.856679] AMS DISCOVER_MODES start
[    3.856687] PD TX, header: 0x188f
[    3.858827] PD TX complete, status: 0
[    3.865330] PD RX, header: 0x2daf [1]
[    3.865340] Rx VDM cmd 0xff01a043 type 1 cmd 3 len 2
[    3.865348] AMS DISCOVER_MODES finished
[    3.865352]  Alternate mode 0: SVID 0xff01, VDO 1: 0x001c0045
[    3.865362] AMS DISCOVER_MODES start
[    3.865367] PD TX, header: 0x1a8f
[    3.867802] PD TX complete, status: 0
[    3.875208] PD RX, header: 0x2faf [1]
[    3.875216] Rx VDM cmd 0x413ca043 type 1 cmd 3 len 2
[    3.875222] AMS DISCOVER_MODES finished
[    3.875225]  Alternate mode 1: SVID 0x413c, VDO 1: 0x00000001
[    3.938243] AMS GET_SINK_CAPABILITIES start
[    3.938255] state change SNK_READY -> AMS_START [rev3 GET_SINK_CAPABILITIES]
[    3.938266] state change AMS_START -> GET_SINK_CAP [rev3 GET_SINK_CAPABILITIES]
[    3.938274] PD TX, header: 0xe88
[    3.940268] PD TX complete, status: 0
[    3.940310] pending state change GET_SINK_CAP -> GET_SINK_CAP_TIMEOUT @ 60 ms
[rev3 GET_SINK_CAPABILITIES]
[    3.946291] PD RX, header: 0x13a4 [1]
[    3.946295] Port partner FRS capable partner_frs_current:0 port_frs_current:0 enable:n
[    3.946298] state change GET_SINK_CAP -> SNK_READY [rev3 GET_SINK_CAPABILITIES]
[    3.946304] AMS GET_SINK_CAPABILITIES finished
[    4.239342] CC1: 5 -> 4, CC2: 0 -> 0 [state SNK_READY, polarity 0, connected]
[    4.256594] PD RX, header: 0x5a9 [1]
[    4.256603] state change SNK_READY -> DR_SWAP_ACCEPT [rev3 DATA_ROLE_SWAP]
[    4.256609] PD TX, header: 0x83
[    4.258528] PD TX complete, status: 0
[    4.258584] state change DR_SWAP_ACCEPT -> DR_SWAP_CHANGE_DR [rev3 DATA_ROLE_SWAP]
[    4.258591] Requesting mux state 1, usb-role 1, orientation 1
[    4.259588] AMS DATA_ROLE_SWAP finished
[    4.259592] state change DR_SWAP_CHANGE_DR -> SNK_READY [rev3 NONE_AMS]
[    4.259605] AMS DISCOVER_IDENTITY start
[    4.259609] Sink TX No Go
[    4.260874] CC1: 4 -> 5, CC2: 0 -> 0 [state SNK_READY, polarity 0, connected]
[    4.359636] AMS DISCOVER_IDENTITY start
[    4.359642] PD TX, header: 0x12af
[    4.361884] PD TX complete, status: 0
[    4.369433] PD RX, header: 0x578f [1]
[    4.369439] Rx VDM cmd 0xff00a041 type 1 cmd 1 len 5
[    4.369448] AMS DISCOVER_IDENTITY finished
[    4.369515] Identity: 413c:c013.0712
[    4.369521] AMS DISCOVER_SVIDS start
[    4.369524] PD TX, header: 0x14af
[    4.371696] PD TX complete, status: 0
[    4.378564] PD RX, header: 0x398f [1]
[    4.378573] Rx VDM cmd 0xff00a042 type 1 cmd 2 len 3
[    4.378579] AMS DISCOVER_SVIDS finished
[    4.378582] SVID 1: 0xff01
[    4.378584] SVID 2: 0x413c
[    4.378594] AMS DISCOVER_MODES start
[    4.378597] PD TX, header: 0x16af
[    4.380696] PD TX complete, status: 0
[    4.387008] PD RX, header: 0x2b8f [1]
[    4.387014] Rx VDM cmd 0xff01a043 type 1 cmd 3 len 2
[    4.387021] AMS DISCOVER_MODES finished
[    4.387023]  Alternate mode 0: SVID 0xff01, VDO 1: 0x001c0045
[    4.387029] AMS DISCOVER_MODES start
[    4.387031] PD TX, header: 0x18af
[    4.389134] PD TX complete, status: 0
[    4.395528] PD RX, header: 0x2d8f [1]
[    4.395538] Rx VDM cmd 0x413ca043 type 1 cmd 3 len 2
[    4.395546] AMS DISCOVER_MODES finished
[    4.395548]  Alternate mode 1: SVID 0x413c, VDO 1: 0x00000001

*Kernel TRACE
sysfs: cannot create duplicate filename
'/devices/platform/soc/11d01000.i2c/i2c-0/0-0034/mt6360-tcpc.6.auto/typec/port0/port0.0/partner'
CPU: 2 PID: 299 Comm: mt6360-tcpc.6.a Tainted: GO      5.15.37-mtk+g880abc5122e7 #1
Hardware name: MediaTek MT8195 demo board (DT)
Call trace:
 dump_backtrace+0x0/0x1ac
 show_stack+0x24/0x30
 dump_stack_lvl+0x68/0x84
 dump_stack+0x1c/0x38
 sysfs_warn_dup+0x70/0x90
 typec_probe+0xa4/0x134 [typec]
 really_probe.part.0+0xa4/0x310
 __device_attach_driver+0x100/0x16c
 bus_for_each_drv+0x84/0xe0
 __device_attach+0xe0/0x1ac
 device_add+0x39c/0x8b0
 device_register+0x2c/0x40
 typec_register_altmode+0x1f4/0x360 [typec]
 typec_partner_register_altmode+0x1c/0x30 [typec]
 tcpm_pd_rx_handler+0x19d4/0x1c0c [tcpm]
 kthread_worker_fn+0xb8/0x290
 kthread+0x15c/0x170
 ret_from_fork+0x10/0x20
[    4.395962] typec_displayport port0-partner.2: failed to create symlinks
[    4.395967] typec_displayport: probe of port0-partner.2 failed with error -17

It seems it's a common issue if typec port supports the modal operation.

---
 drivers/usb/typec/tcpm/tcpm.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index 904c7b4..59b366b 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -4594,14 +4594,13 @@ static void run_state_machine(struct tcpm_port *port)
 		tcpm_set_state(port, ready_state(port), 0);
 		break;
 	case DR_SWAP_CHANGE_DR:
-		if (port->data_role == TYPEC_HOST) {
-			tcpm_unregister_altmodes(port);
+		tcpm_unregister_altmodes(port);
+		if (port->data_role == TYPEC_HOST)
 			tcpm_set_roles(port, true, port->pwr_role,
 				       TYPEC_DEVICE);
-		} else {
+		else
 			tcpm_set_roles(port, true, port->pwr_role,
 				       TYPEC_HOST);
-		}
 		tcpm_ams_finish(port);
 		tcpm_set_state(port, ready_state(port), 0);
 		break;
-- 
2.7.4



WARNING: multiple messages have this Message-ID (diff)
From: cy_huang <u0084500@gmail.com>
To: linux@roeck-us.net, heikki.krogerus@linux.intel.com,
	matthias.bgg@gmail.com
Cc: gregkh@linuxfoundation.org, tommyyl.chen@mediatek.com,
	macpaul.lin@mediatek.com, gene_chen@richtek.com,
	linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-mediatek@lists.infradead.org,
	ChiYuan Huang <cy_huang@richtek.com>,
	stable@vger.kernel.org
Subject: [PATCH] usb: typec: tcpm: Fix altmode re-registration causes sysfs create fail
Date: Thu, 15 Dec 2022 17:21:36 +0800	[thread overview]
Message-ID: <1671096096-20307-1-git-send-email-u0084500@gmail.com> (raw)

From: ChiYuan Huang <cy_huang@richtek.com>

There's the altmode re-registeration issue after data role
swap (DR_SWAP).

Comparing to USBPD 2.0, in USBPD 3.0, it loose the limit that only DFP
can initiate the VDM command to get partner identity information.

For a USBPD 3.0 UFP device, it may already get the identity information
from its port partner before DR_SWAP. If DR_SWAP send or receive at the
mean time, 'send_discover' flag will be raised again. It causes discover
identify action restart while entering ready state. And after all
discover actions are done, the 'tcpm_register_altmodes' will be called.
If old altmode is not unregistered, this sysfs create fail can be found.

In 'DR_SWAP_CHANGE_DR' state case, only DFP will unregister altmodes.
For UFP, the original altmodes keep registered.

This patch fix the logic that after DR_SWAP, 'tcpm_unregister_altmodes'
must be called whatever the current data role is.

Fixes: ae8a2ca8a221 ("usb: typec: Group all TCPCI/TCPM code together)
Reported-by: TommyYl Chen <tommyyl.chen@mediatek.com>
Cc: stable@vger.kernel.org
Signed-off-by: ChiYuan Huang <cy_huang@richtek.com>
---
Hi,

Below's the issue log for the reference.

*TCPM
[    3.856679] AMS DISCOVER_MODES start
[    3.856687] PD TX, header: 0x188f
[    3.858827] PD TX complete, status: 0
[    3.865330] PD RX, header: 0x2daf [1]
[    3.865340] Rx VDM cmd 0xff01a043 type 1 cmd 3 len 2
[    3.865348] AMS DISCOVER_MODES finished
[    3.865352]  Alternate mode 0: SVID 0xff01, VDO 1: 0x001c0045
[    3.865362] AMS DISCOVER_MODES start
[    3.865367] PD TX, header: 0x1a8f
[    3.867802] PD TX complete, status: 0
[    3.875208] PD RX, header: 0x2faf [1]
[    3.875216] Rx VDM cmd 0x413ca043 type 1 cmd 3 len 2
[    3.875222] AMS DISCOVER_MODES finished
[    3.875225]  Alternate mode 1: SVID 0x413c, VDO 1: 0x00000001
[    3.938243] AMS GET_SINK_CAPABILITIES start
[    3.938255] state change SNK_READY -> AMS_START [rev3 GET_SINK_CAPABILITIES]
[    3.938266] state change AMS_START -> GET_SINK_CAP [rev3 GET_SINK_CAPABILITIES]
[    3.938274] PD TX, header: 0xe88
[    3.940268] PD TX complete, status: 0
[    3.940310] pending state change GET_SINK_CAP -> GET_SINK_CAP_TIMEOUT @ 60 ms
[rev3 GET_SINK_CAPABILITIES]
[    3.946291] PD RX, header: 0x13a4 [1]
[    3.946295] Port partner FRS capable partner_frs_current:0 port_frs_current:0 enable:n
[    3.946298] state change GET_SINK_CAP -> SNK_READY [rev3 GET_SINK_CAPABILITIES]
[    3.946304] AMS GET_SINK_CAPABILITIES finished
[    4.239342] CC1: 5 -> 4, CC2: 0 -> 0 [state SNK_READY, polarity 0, connected]
[    4.256594] PD RX, header: 0x5a9 [1]
[    4.256603] state change SNK_READY -> DR_SWAP_ACCEPT [rev3 DATA_ROLE_SWAP]
[    4.256609] PD TX, header: 0x83
[    4.258528] PD TX complete, status: 0
[    4.258584] state change DR_SWAP_ACCEPT -> DR_SWAP_CHANGE_DR [rev3 DATA_ROLE_SWAP]
[    4.258591] Requesting mux state 1, usb-role 1, orientation 1
[    4.259588] AMS DATA_ROLE_SWAP finished
[    4.259592] state change DR_SWAP_CHANGE_DR -> SNK_READY [rev3 NONE_AMS]
[    4.259605] AMS DISCOVER_IDENTITY start
[    4.259609] Sink TX No Go
[    4.260874] CC1: 4 -> 5, CC2: 0 -> 0 [state SNK_READY, polarity 0, connected]
[    4.359636] AMS DISCOVER_IDENTITY start
[    4.359642] PD TX, header: 0x12af
[    4.361884] PD TX complete, status: 0
[    4.369433] PD RX, header: 0x578f [1]
[    4.369439] Rx VDM cmd 0xff00a041 type 1 cmd 1 len 5
[    4.369448] AMS DISCOVER_IDENTITY finished
[    4.369515] Identity: 413c:c013.0712
[    4.369521] AMS DISCOVER_SVIDS start
[    4.369524] PD TX, header: 0x14af
[    4.371696] PD TX complete, status: 0
[    4.378564] PD RX, header: 0x398f [1]
[    4.378573] Rx VDM cmd 0xff00a042 type 1 cmd 2 len 3
[    4.378579] AMS DISCOVER_SVIDS finished
[    4.378582] SVID 1: 0xff01
[    4.378584] SVID 2: 0x413c
[    4.378594] AMS DISCOVER_MODES start
[    4.378597] PD TX, header: 0x16af
[    4.380696] PD TX complete, status: 0
[    4.387008] PD RX, header: 0x2b8f [1]
[    4.387014] Rx VDM cmd 0xff01a043 type 1 cmd 3 len 2
[    4.387021] AMS DISCOVER_MODES finished
[    4.387023]  Alternate mode 0: SVID 0xff01, VDO 1: 0x001c0045
[    4.387029] AMS DISCOVER_MODES start
[    4.387031] PD TX, header: 0x18af
[    4.389134] PD TX complete, status: 0
[    4.395528] PD RX, header: 0x2d8f [1]
[    4.395538] Rx VDM cmd 0x413ca043 type 1 cmd 3 len 2
[    4.395546] AMS DISCOVER_MODES finished
[    4.395548]  Alternate mode 1: SVID 0x413c, VDO 1: 0x00000001

*Kernel TRACE
sysfs: cannot create duplicate filename
'/devices/platform/soc/11d01000.i2c/i2c-0/0-0034/mt6360-tcpc.6.auto/typec/port0/port0.0/partner'
CPU: 2 PID: 299 Comm: mt6360-tcpc.6.a Tainted: GO      5.15.37-mtk+g880abc5122e7 #1
Hardware name: MediaTek MT8195 demo board (DT)
Call trace:
 dump_backtrace+0x0/0x1ac
 show_stack+0x24/0x30
 dump_stack_lvl+0x68/0x84
 dump_stack+0x1c/0x38
 sysfs_warn_dup+0x70/0x90
 typec_probe+0xa4/0x134 [typec]
 really_probe.part.0+0xa4/0x310
 __device_attach_driver+0x100/0x16c
 bus_for_each_drv+0x84/0xe0
 __device_attach+0xe0/0x1ac
 device_add+0x39c/0x8b0
 device_register+0x2c/0x40
 typec_register_altmode+0x1f4/0x360 [typec]
 typec_partner_register_altmode+0x1c/0x30 [typec]
 tcpm_pd_rx_handler+0x19d4/0x1c0c [tcpm]
 kthread_worker_fn+0xb8/0x290
 kthread+0x15c/0x170
 ret_from_fork+0x10/0x20
[    4.395962] typec_displayport port0-partner.2: failed to create symlinks
[    4.395967] typec_displayport: probe of port0-partner.2 failed with error -17

It seems it's a common issue if typec port supports the modal operation.

---
 drivers/usb/typec/tcpm/tcpm.c | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
index 904c7b4..59b366b 100644
--- a/drivers/usb/typec/tcpm/tcpm.c
+++ b/drivers/usb/typec/tcpm/tcpm.c
@@ -4594,14 +4594,13 @@ static void run_state_machine(struct tcpm_port *port)
 		tcpm_set_state(port, ready_state(port), 0);
 		break;
 	case DR_SWAP_CHANGE_DR:
-		if (port->data_role == TYPEC_HOST) {
-			tcpm_unregister_altmodes(port);
+		tcpm_unregister_altmodes(port);
+		if (port->data_role == TYPEC_HOST)
 			tcpm_set_roles(port, true, port->pwr_role,
 				       TYPEC_DEVICE);
-		} else {
+		else
 			tcpm_set_roles(port, true, port->pwr_role,
 				       TYPEC_HOST);
-		}
 		tcpm_ams_finish(port);
 		tcpm_set_state(port, ready_state(port), 0);
 		break;
-- 
2.7.4


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

             reply	other threads:[~2022-12-15  9:22 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-15  9:21 cy_huang [this message]
2022-12-15  9:21 ` [PATCH] usb: typec: tcpm: Fix altmode re-registration causes sysfs create fail cy_huang
2022-12-15  9:44 ` Greg KH
2022-12-15  9:44   ` Greg KH
2022-12-15  9:53   ` ChiYuan Huang
2022-12-15  9:53     ` ChiYuan Huang
2022-12-15 11:43     ` Greg KH
2022-12-15 11:43       ` Greg KH
2023-01-09  1:41       ` ChiYuan Huang
2023-01-09  1:41         ` ChiYuan Huang
2023-01-09  6:38         ` Greg KH
2023-01-09  6:38           ` Greg KH
2023-01-09  6:46           ` ChiYuan Huang
2023-01-09  6:46             ` ChiYuan Huang
2023-01-09  7:22             ` ChiYuan Huang
2023-01-09  7:22               ` ChiYuan Huang
2022-12-15  9:58 ` Macpaul Lin
2022-12-15  9:58   ` Macpaul Lin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1671096096-20307-1-git-send-email-u0084500@gmail.com \
    --to=u0084500@gmail.com \
    --cc=cy_huang@richtek.com \
    --cc=gene_chen@richtek.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=heikki.krogerus@linux.intel.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mediatek@lists.infradead.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=macpaul.lin@mediatek.com \
    --cc=matthias.bgg@gmail.com \
    --cc=stable@vger.kernel.org \
    --cc=tommyyl.chen@mediatek.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.