From e636c8d336489bf3eed5878299e6cc045bbad077 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Tue, 20 Feb 2024 01:17:29 +0000
Subject: [PATCH] debug lk
---
kernel/drivers/usb/typec/tcpm/tcpm.c | 42 ++++++++++++++++++++++++++++++++++++------
1 files changed, 36 insertions(+), 6 deletions(-)
diff --git a/kernel/drivers/usb/typec/tcpm/tcpm.c b/kernel/drivers/usb/typec/tcpm/tcpm.c
index a088c6e..f474eeb 100644
--- a/kernel/drivers/usb/typec/tcpm/tcpm.c
+++ b/kernel/drivers/usb/typec/tcpm/tcpm.c
@@ -1447,10 +1447,18 @@
static void tcpm_queue_vdm(struct tcpm_port *port, const u32 header,
const u32 *data, int cnt)
{
+ u32 vdo_hdr = port->vdo_data[0];
+
WARN_ON(!mutex_is_locked(&port->lock));
- /* Make sure we are not still processing a previous VDM packet */
- WARN_ON(port->vdm_state > VDM_STATE_DONE);
+ /* If is sending discover_identity, handle received message first */
+ if (PD_VDO_SVDM(vdo_hdr) && PD_VDO_CMD(vdo_hdr) == CMD_DISCOVER_IDENT) {
+ port->send_discover = true;
+ mod_send_discover_delayed_work(port, SEND_DISCOVER_RETRY_MS);
+ } else {
+ /* Make sure we are not still processing a previous VDM packet */
+ WARN_ON(port->vdm_state > VDM_STATE_DONE);
+ }
port->vdo_count = cnt + 1;
port->vdo_data[0] = header;
@@ -1540,7 +1548,7 @@
* 0x0000 in the last VDO, so we need to break the Discover SVIDs
* request and return false here.
*/
- return cnt == 7 ? true : false;
+ return cnt == 7;
abort:
tcpm_log(port, "SVID_DISCOVERY_MAX(%d) too low!", SVID_DISCOVERY_MAX);
return false;
@@ -1724,6 +1732,14 @@
rlen = 1;
} else if (port->data_role == TYPEC_HOST) {
tcpm_register_partner_altmodes(port);
+ } else {
+ /* Do dr_swap for ufp if the port supports drd */
+ if (port->typec_caps.data == TYPEC_PORT_DRD &&
+ !IS_ERR_OR_NULL(port->port_altmode[0])) {
+ port->vdm_sm_running = false;
+ port->upcoming_state = DR_SWAP_SEND;
+ tcpm_ams_start(port, DATA_ROLE_SWAP);
+ }
}
break;
case CMD_ENTER_MODE:
@@ -1755,6 +1771,16 @@
tcpm_ams_finish(port);
switch (cmd) {
case CMD_DISCOVER_IDENT:
+ /* Do dr_swap for ufp if the port supports drd */
+ if (port->typec_caps.data == TYPEC_PORT_DRD &&
+ port->data_role == TYPEC_DEVICE &&
+ !IS_ERR_OR_NULL(port->port_altmode[0])) {
+ port->vdm_sm_running = false;
+ port->upcoming_state = DR_SWAP_SEND;
+ tcpm_ams_start(port, DATA_ROLE_SWAP);
+ break;
+ }
+ fallthrough;
case CMD_DISCOVER_SVID:
case CMD_DISCOVER_MODES:
case VDO_CMD_VENDOR(0) ... VDO_CMD_VENDOR(15):
@@ -1883,7 +1909,8 @@
}
break;
case ADEV_ATTENTION:
- typec_altmode_attention(adev, p[1]);
+ if (typec_altmode_attention(adev, p[1]))
+ tcpm_log(port, "typec_altmode_attention no port partner altmode");
break;
}
}
@@ -1976,11 +2003,13 @@
switch (PD_VDO_CMD(vdo_hdr)) {
case CMD_DISCOVER_IDENT:
res = tcpm_ams_start(port, DISCOVER_IDENTITY);
- if (res == 0)
+ if (res == 0) {
port->send_discover = false;
- else if (res == -EAGAIN)
+ } else if (res == -EAGAIN) {
+ port->vdo_data[0] = 0;
mod_send_discover_delayed_work(port,
SEND_DISCOVER_RETRY_MS);
+ }
break;
case CMD_DISCOVER_SVID:
res = tcpm_ams_start(port, DISCOVER_SVIDS);
@@ -2063,6 +2092,7 @@
unsigned long timeout;
port->vdm_retries = 0;
+ port->vdo_data[0] = 0;
port->vdm_state = VDM_STATE_BUSY;
timeout = vdm_ready_timeout(vdo_hdr);
mod_vdm_delayed_work(port, timeout);
--
Gitblit v1.6.2