From ed2fedf0a5d087656530676d63d8b3ba6deacbcd Mon Sep 17 00:00:00 2001 From: Sagar Dharia Date: Fri, 4 Dec 2015 16:44:49 -0700 Subject: [PATCH] slim_msm: Gracefully handle QMI timeout failures QMI timeout can happen if other processor doesn't respond within the time expected by slimbus driver on apps. It has been noticed that QMI call to power-on slimbus rarely takes more than 500msec. Timeout is increased to allow that possibility. Additionally, QMI channel is drained out of left-over messages and runtime-PM state check is modified to allow graceful handling of timeout if at all any timeout still happens. Change-Id: I392a4fa761735135a261fb543815823cee5eba41 Signed-off-by: Sagar Dharia --- drivers/slimbus/slim-msm-ngd.c | 4 ++-- drivers/slimbus/slim-msm.c | 9 ++++++--- drivers/slimbus/slim-msm.h | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/drivers/slimbus/slim-msm-ngd.c b/drivers/slimbus/slim-msm-ngd.c index efc6b7ac9981..8006e562d6ad 100644 --- a/drivers/slimbus/slim-msm-ngd.c +++ b/drivers/slimbus/slim-msm-ngd.c @@ -395,7 +395,7 @@ static int ngd_xfer_msg(struct slim_controller *ctrl, struct slim_msg_txn *txn) * It also makes HW status cosistent with what SW has it here */ if ((pm_runtime_enabled(dev->dev) && ret < 0) || - dev->state == MSM_CTRL_DOWN) { + dev->state >= MSM_CTRL_ASLEEP) { SLIM_ERR(dev, "slim ctrl vote failed ret:%d, state:%d", ret, dev->state); pm_runtime_set_suspended(dev->dev); @@ -716,7 +716,7 @@ static int ngd_bulk_wr(struct slim_controller *ctrl, u8 la, u8 mt, u8 mc, mutex_lock(&dev->tx_lock); if ((pm_runtime_enabled(dev->dev) && ret < 0) || - dev->state == MSM_CTRL_DOWN) { + dev->state >= MSM_CTRL_ASLEEP) { SLIM_WARN(dev, "vote failed/SSR in-progress ret:%d, state:%d", ret, dev->state); pm_runtime_set_suspended(dev->dev); diff --git a/drivers/slimbus/slim-msm.c b/drivers/slimbus/slim-msm.c index 932fc0bb20e3..03862d283f90 100644 --- a/drivers/slimbus/slim-msm.c +++ b/drivers/slimbus/slim-msm.c @@ -1404,9 +1404,12 @@ static void msm_slim_qmi_recv_msg(struct kthread_work *work) struct msm_slim_qmi *qmi = container_of(work, struct msm_slim_qmi, kwork); - rc = qmi_recv_msg(qmi->handle); - if (rc < 0) - pr_err("%s: Error receiving QMI message\n", __func__); + /* Drain all packets received */ + do { + rc = qmi_recv_msg(qmi->handle); + } while (rc == 0); + if (rc != -ENOMSG) + pr_err("%s: Error receiving QMI message:%d\n", __func__, rc); } static void msm_slim_qmi_notify(struct qmi_handle *handle, diff --git a/drivers/slimbus/slim-msm.h b/drivers/slimbus/slim-msm.h index 15c12ff580e4..86d2606182fa 100644 --- a/drivers/slimbus/slim-msm.h +++ b/drivers/slimbus/slim-msm.h @@ -96,7 +96,7 @@ #define SLIMBUS_QMI_INS_ID 0 /* QMI response timeout of 500ms */ -#define SLIM_QMI_RESP_TOUT 500 +#define SLIM_QMI_RESP_TOUT 1000 #define PGD_THIS_EE(r, v) ((v) ? PGD_THIS_EE_V2(r) : PGD_THIS_EE_V1(r)) #define PGD_PORT(r, p, v) ((v) ? PGD_PORT_V2(r, p) : PGD_PORT_V1(r, p))