MLK-16013-21 usb: typec: tcpm: handle pd message send failure
authorLi Jun <jun.li@nxp.com>
Wed, 9 Jan 2019 06:07:36 +0000 (11:37 +0530)
committerLeonard Crestez <leonard.crestez@nxp.com>
Wed, 17 Apr 2019 23:51:34 +0000 (02:51 +0300)
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>
Signed-off-by: Vipul Kumar <vipul_kumar@mentor.com>
drivers/usb/typec/tcpm.c

index 920bb13..6fe764e 100644 (file)
@@ -2014,6 +2014,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;
@@ -2021,25 +2022,31 @@ 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_CTRL_NOT_SUPP:
-                       tcpm_pd_send_control(port, PD_CTRL_NOT_SUPP);
+                       ret = tcpm_pd_send_control(port, PD_CTRL_NOT_SUPP);
                        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,