patch "usb: typec: tcpm: Properly interrupt VDM AMS" added to usb-linus
Subsystems (4)
This is a note to let you know that I've just added the patch titled
usb: typec: tcpm: Properly interrupt VDM AMS
to my usb git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
in the usb-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From 0bc3ee92880d910a1d100b73a781904f359e1f1c Mon Sep 17 00:00:00 2001
From: Kyle Tso <[email protected]>
Date: Sun, 23 May 2021 09:58:54 +0800
Subject: usb: typec: tcpm: Properly interrupt VDM AMS
When a VDM AMS is interrupted by Messages other than VDM, the AMS needs to be finished properly. Also start a VDM AMS if receiving SVDM Commands from the port partner to complement the functionality of tcpm_vdm_ams().
--- drivers/usb/typec/tcpm/tcpm.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+)
drivers/usb/typec/tcpm/tcpm.c +30 -0
@@ -1550,6 +1550,8 @@ static int tcpm_pd_svdm(struct tcpm_port *port, struct typec_altmode *adev,if (PD_VDO_SVDM_VER (p[0 ]) < svdm_version)typec_partner_set_svdm_version (port->partner,PD_VDO_SVDM_VER (p[0 ])); + +tcpm_ams_start (port,DISCOVER_IDENTITY );/* 6.4.4.3.1: Only respond as UFP (device) */ if (port->data_role ==TYPEC_DEVICE && port->nr_snk_vdo) {
@@ -1568,14 +1570,19 @@ static int tcpm_pd_svdm(struct tcpm_port *port, struct typec_altmode *adev, }break ;case CMD_DISCOVER_SVID : +tcpm_ams_start (port,DISCOVER_SVIDS );break ;case CMD_DISCOVER_MODES : +tcpm_ams_start (port,DISCOVER_MODES );break ;case CMD_ENTER_MODE : +tcpm_ams_start (port,DFP_TO_UFP_ENTER_MODE );break ;case CMD_EXIT_MODE : +tcpm_ams_start (port,DFP_TO_UFP_EXIT_MODE );break ;case CMD_ATTENTION : +tcpm_ams_start (port,ATTENTION );/* Attention command does not have response */ *adev_action =ADEV_ATTENTION ;return 0 ;
@@ -2287,6 +2294,12 @@ static void tcpm_pd_data_request(struct tcpm_port *port,bool frs_enable;int ret; +if (tcpm_vdm_ams (port) && type !=PD_DATA_VENDOR_DEF ) { + port->vdm_state =VDM_STATE_ERR_BUSY ; +tcpm_ams_finish (port); +mod_vdm_delayed_work (port,0 ); + } +switch (type) {case PD_DATA_SOURCE_CAP :for (i =0 ; i < cnt; i++)
@@ -2459,6 +2472,16 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,enum pd_ctrl_msg_type type =pd_header_type_le (msg->header);enum tcpm_state next_state; +/* +* Stop VDM state machine if interrupted by other Messages while NOT_SUPP is allowed in +* VDM AMS if waiting for VDM responses and will be handled later. +*/ +if (tcpm_vdm_ams (port) && type !=PD_CTRL_NOT_SUPP && type !=PD_CTRL_GOOD_CRC ) { + port->vdm_state =VDM_STATE_ERR_BUSY ; +tcpm_ams_finish (port); +mod_vdm_delayed_work (port,0 ); + } +switch (type) {case PD_CTRL_GOOD_CRC :case PD_CTRL_PING :
@@ -2717,6 +2740,13 @@ static void tcpm_pd_ext_msg_request(struct tcpm_port *port,enum pd_ext_msg_type type =pd_header_type_le (msg->header);unsigned int data_size =pd_ext_header_data_size_le (msg->ext_msg.header); +/* stopping VDM state machine if interrupted by other Messages */ +if (tcpm_vdm_ams (port)) { + port->vdm_state =VDM_STATE_ERR_BUSY ; +tcpm_ams_finish (port); +mod_vdm_delayed_work (port,0 ); + } +if (!(le16_to_cpu (msg->ext_msg.header) &PD_EXT_HDR_CHUNKED )) {tcpm_pd_handle_msg (port,PD_MSG_CTRL_NOT_SUPP ,NONE_AMS );tcpm_log (port,"Unchunked extended messages unsupported" );
Signature · 1 line
2.31.1