Commit f41bfc7e authored by Kyle Tso's avatar Kyle Tso Committed by Greg Kroah-Hartman

usb: typec: tcpm: Correct the responses in SVDM Version 2.0 DFP

In USB PD Spec Rev 3.1 Ver 1.0, section "6.12.5 Applicability of
Structured VDM Commands", DFP is allowed and recommended to respond to
Discovery Identity with ACK. And in section "6.4.4.2.5.1 Commands other
than Attention", NAK should be returned only when receiving Messages
with invalid fields, Messages in wrong situation, or unrecognize
Messages.

Still keep the original design for SVDM Version 1.0 for backward
compatibilities.

Fixes: 193a6801 ("staging: typec: tcpm: Respond to Discover Identity commands")
Acked-by: default avatarHeikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: default avatarKyle Tso <kyletso@google.com>
Link: https://lore.kernel.org/r/20210601123151.3441914-2-kyletso@google.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 8f11fe7e
...@@ -1547,19 +1547,25 @@ static int tcpm_pd_svdm(struct tcpm_port *port, struct typec_altmode *adev, ...@@ -1547,19 +1547,25 @@ static int tcpm_pd_svdm(struct tcpm_port *port, struct typec_altmode *adev,
if (PD_VDO_VID(p[0]) != USB_SID_PD) if (PD_VDO_VID(p[0]) != USB_SID_PD)
break; break;
if (PD_VDO_SVDM_VER(p[0]) < svdm_version) if (PD_VDO_SVDM_VER(p[0]) < svdm_version) {
typec_partner_set_svdm_version(port->partner, typec_partner_set_svdm_version(port->partner,
PD_VDO_SVDM_VER(p[0])); PD_VDO_SVDM_VER(p[0]));
svdm_version = PD_VDO_SVDM_VER(p[0]);
}
tcpm_ams_start(port, DISCOVER_IDENTITY); tcpm_ams_start(port, DISCOVER_IDENTITY);
/* 6.4.4.3.1: Only respond as UFP (device) */ /*
if (port->data_role == TYPEC_DEVICE && * PD2.0 Spec 6.10.3: respond with NAK as DFP (data host)
* PD3.1 Spec 6.4.4.2.5.1: respond with NAK if "invalid field" or
* "wrong configuation" or "Unrecognized"
*/
if ((port->data_role == TYPEC_DEVICE || svdm_version >= SVDM_VER_2_0) &&
port->nr_snk_vdo) { port->nr_snk_vdo) {
/* /*
* Product Type DFP and Connector Type are not defined in SVDM * Product Type DFP and Connector Type are not defined in SVDM
* version 1.0 and shall be set to zero. * version 1.0 and shall be set to zero.
*/ */
if (typec_get_negotiated_svdm_version(typec) < SVDM_VER_2_0) if (svdm_version < SVDM_VER_2_0)
response[1] = port->snk_vdo[0] & ~IDH_DFP_MASK response[1] = port->snk_vdo[0] & ~IDH_DFP_MASK
& ~IDH_CONN_MASK; & ~IDH_CONN_MASK;
else else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment