From aa2489ddb7ac7249d00c8796dfaa55a0bfe5bf00 Mon Sep 17 00:00:00 2001 From: Li Jun Date: Thu, 27 Jul 2017 21:47:51 +0800 Subject: [PATCH] MLK-16013-21 staging: typec: tcpm: handle pd message send failure If the PD message send failed, we need to do soft reset, further if soft reset failed, we have to start a hard reset. Reviewed-by: Peter Chen Signed-off-by: Li Jun --- drivers/staging/typec/tcpm.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/drivers/staging/typec/tcpm.c b/drivers/staging/typec/tcpm.c index 73a9e3689af3..0a96c4faaa4e 100644 --- a/drivers/staging/typec/tcpm.c +++ b/drivers/staging/typec/tcpm.c @@ -1560,6 +1560,7 @@ static int tcpm_pd_send_control(struct tcpm_port *port, static bool tcpm_send_queued_message(struct tcpm_port *port) { enum pd_msg_request queued_message; + int ret = 0; do { queued_message = port->queued_message; @@ -1567,22 +1568,28 @@ static bool tcpm_send_queued_message(struct tcpm_port *port) switch (queued_message) { case PD_MSG_CTRL_WAIT: - tcpm_pd_send_control(port, PD_CTRL_WAIT); + ret = tcpm_pd_send_control(port, PD_CTRL_WAIT); break; case PD_MSG_CTRL_REJECT: - tcpm_pd_send_control(port, PD_CTRL_REJECT); + ret = tcpm_pd_send_control(port, PD_CTRL_REJECT); break; case PD_MSG_DATA_SINK_CAP: - tcpm_pd_send_sink_caps(port); + ret = tcpm_pd_send_sink_caps(port); break; case PD_MSG_DATA_SOURCE_CAP: - tcpm_pd_send_source_caps(port); + ret = tcpm_pd_send_source_caps(port); break; default: break; } } while (port->queued_message != PD_MSG_NONE); + if (ret) { + tcpm_set_state(port, SOFT_RESET_SEND, 0); + tcpm_log(port, "TCPM sending message failure!"); + return false; + } + if (port->delayed_state != INVALID_STATE) { if (time_is_after_jiffies(port->delayed_runtime)) { mod_delayed_work(port->wq, &port->state_machine, -- 2.17.1