MLK-16013-21 staging: typec: tcpm: handle pd message send failure
authorLi Jun <jun.li@nxp.com>
Thu, 27 Jul 2017 13:47:51 +0000 (21:47 +0800)
committerNitin Garg <nitin.garg@nxp.com>
Mon, 19 Mar 2018 20:36:19 +0000 (15:36 -0500)
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 <peter.chen@nxp.com>
Signed-off-by: Li Jun <jun.li@nxp.com>
drivers/staging/typec/tcpm.c

index 73a9e36..0a96c4f 100644 (file)
@@ -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,