Skip to content

Commit f34bfcc

Browse files
RD Babieragregkh
authored andcommitted
usb: typec: tcpm: properly deliver cable vdms to altmode drivers
tcpm_handle_vdm_request delivers messages to the partner altmode or the cable altmode depending on the SVDM response type, which is incorrect. The partner or cable should be chosen based on the received message type instead. Also add this filter to ADEV_NOTIFY_USB_AND_QUEUE_VDM, which is used when the Enter Mode command is responded to by a NAK on SOP or SOP' and when the Exit Mode command is responded to by an ACK on SOP. Fixes: 7e7877c ("usb: typec: tcpm: add alt mode enter/exit/vdm support for sop'") Cc: [email protected] Signed-off-by: RD Babiera <[email protected]> Reviewed-by: Badhri Jagan Sridharan <[email protected]> Reviewed-by: Heikki Krogerus <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 8d63c83 commit f34bfcc

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

drivers/usb/typec/tcpm/tcpm.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2426,17 +2426,21 @@ static void tcpm_handle_vdm_request(struct tcpm_port *port,
24262426
case ADEV_NONE:
24272427
break;
24282428
case ADEV_NOTIFY_USB_AND_QUEUE_VDM:
2429-
WARN_ON(typec_altmode_notify(adev, TYPEC_STATE_USB, NULL));
2430-
typec_altmode_vdm(adev, p[0], &p[1], cnt);
2429+
if (rx_sop_type == TCPC_TX_SOP_PRIME) {
2430+
typec_cable_altmode_vdm(adev, TYPEC_PLUG_SOP_P, p[0], &p[1], cnt);
2431+
} else {
2432+
WARN_ON(typec_altmode_notify(adev, TYPEC_STATE_USB, NULL));
2433+
typec_altmode_vdm(adev, p[0], &p[1], cnt);
2434+
}
24312435
break;
24322436
case ADEV_QUEUE_VDM:
2433-
if (response_tx_sop_type == TCPC_TX_SOP_PRIME)
2437+
if (rx_sop_type == TCPC_TX_SOP_PRIME)
24342438
typec_cable_altmode_vdm(adev, TYPEC_PLUG_SOP_P, p[0], &p[1], cnt);
24352439
else
24362440
typec_altmode_vdm(adev, p[0], &p[1], cnt);
24372441
break;
24382442
case ADEV_QUEUE_VDM_SEND_EXIT_MODE_ON_FAIL:
2439-
if (response_tx_sop_type == TCPC_TX_SOP_PRIME) {
2443+
if (rx_sop_type == TCPC_TX_SOP_PRIME) {
24402444
if (typec_cable_altmode_vdm(adev, TYPEC_PLUG_SOP_P,
24412445
p[0], &p[1], cnt)) {
24422446
int svdm_version = typec_get_cable_svdm_version(

0 commit comments

Comments
 (0)