Message ID | 20250209071926.69625-1-joswang1221@gmail.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [1/1] usb: typec: displayport: Receive DP Status Update NAK request exit dp altmode | expand |
On Sun, Feb 09, 2025 at 03:19:26PM +0800, joswang wrote: > From: Jos Wang <joswang@lenovo.com> > > Although some Type-C DRD devices that do not support the DP Sink > function (such as Huawei Mate 40Pro), the Source Port initiates > Enter Mode CMD, but the device responds to Enter Mode ACK, the > Source port then initiates DP Status Update CMD, and the device > responds to DP Status Update NAK. > > As PD2.0 spec ("6.4.4.3.4 Enter Mode Command"),A DR_Swap Message > Shall Not be sent during Modal Operation between the Port Partners. > At this time, the source port initiates DR_Swap message through the > "echo device > /sys/class/typec/port0/data_role" command to switch > the data role from host to device. The device will initiate a Hard > Reset for recovery, resulting in the failure of data role swap. > > Therefore, when DP Status Update NAK is received, Exit Mode CMD is > initiated to exit the currently entered DP altmode. > > Signed-off-by: Jos Wang <joswang@lenovo.com> This looks okay to me, but Benson, can you take a look at this? > --- > drivers/usb/typec/altmodes/displayport.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/drivers/usb/typec/altmodes/displayport.c b/drivers/usb/typec/altmodes/displayport.c > index ac84a6d64c2f..b09b58d7311d 100644 > --- a/drivers/usb/typec/altmodes/displayport.c > +++ b/drivers/usb/typec/altmodes/displayport.c > @@ -393,6 +393,10 @@ static int dp_altmode_vdm(struct typec_altmode *alt, > break; > case CMDT_RSP_NAK: > switch (cmd) { > + case DP_CMD_STATUS_UPDATE: > + if (typec_altmode_exit(alt)) > + dev_err(&dp->alt->dev, "Exit Mode Failed!\n"); > + break; > case DP_CMD_CONFIGURE: > dp->data.conf = 0; > ret = dp_altmode_configured(dp); > -- > 2.17.1
diff --git a/drivers/usb/typec/altmodes/displayport.c b/drivers/usb/typec/altmodes/displayport.c index ac84a6d64c2f..b09b58d7311d 100644 --- a/drivers/usb/typec/altmodes/displayport.c +++ b/drivers/usb/typec/altmodes/displayport.c @@ -393,6 +393,10 @@ static int dp_altmode_vdm(struct typec_altmode *alt, break; case CMDT_RSP_NAK: switch (cmd) { + case DP_CMD_STATUS_UPDATE: + if (typec_altmode_exit(alt)) + dev_err(&dp->alt->dev, "Exit Mode Failed!\n"); + break; case DP_CMD_CONFIGURE: dp->data.conf = 0; ret = dp_altmode_configured(dp);