msm: mhi_dev: Send uevents during device reset
Notify clients during MHI device reset on channel and
device reset.
Change-Id: Id3b6f564bd85346e9177b27c8a7647c504998a64
Signed-off-by: Siddartha Mohanadoss <smohanad@codeaurora.org>
diff --git a/drivers/platform/msm/mhi_dev/mhi.c b/drivers/platform/msm/mhi_dev/mhi.c
index 47d5292..1c16e5a 100644
--- a/drivers/platform/msm/mhi_dev/mhi.c
+++ b/drivers/platform/msm/mhi_dev/mhi.c
@@ -38,6 +38,7 @@
/* Wait time before suspend/resume is complete */
#define MHI_SUSPEND_MIN 100
#define MHI_SUSPEND_TIMEOUT 600
+#define MHI_WAKEUP_TIMEOUT_CNT 20
#define MHI_MASK_CH_EV_LEN 32
#define MHI_RING_CMD_ID 0
#define MHI_RING_PRIMARY_EVT_ID 1
@@ -1326,6 +1327,8 @@
struct mhi_dev_channel *ch;
struct mhi_dev_ring *ring;
int ch_id = 0, rc = 0;
+ char *disconnected_12[2] = { "MHI_CHANNEL_STATE_12=DISCONNECTED", NULL};
+ char *disconnected_14[2] = { "MHI_CHANNEL_STATE_14=DISCONNECTED", NULL};
/* Hard stop all the channels */
for (ch_id = 0; ch_id < mhi->cfg.channels; ch_id++) {
@@ -1341,6 +1344,17 @@
/* Update ctrl node */
mhi_update_state_info(MHI_DEV_UEVENT_CTRL, MHI_STATE_DISCONNECTED);
+ mhi_update_state_info(MHI_CLIENT_MBIM_OUT, MHI_STATE_DISCONNECTED);
+ mhi_update_state_info(MHI_CLIENT_QMI_OUT, MHI_STATE_DISCONNECTED);
+ rc = kobject_uevent_env(&mhi_ctx->dev->kobj,
+ KOBJ_CHANGE, disconnected_12);
+ if (rc)
+ pr_err("Error sending uevent:%d\n", rc);
+
+ rc = kobject_uevent_env(&mhi_ctx->dev->kobj,
+ KOBJ_CHANGE, disconnected_14);
+ if (rc)
+ pr_err("Error sending uevent:%d\n", rc);
flush_workqueue(mhi->ring_init_wq);
flush_workqueue(mhi->pending_ring_wq);
@@ -2175,11 +2189,19 @@
}
while (atomic_read(&mhi_ctx->is_suspended) &&
- suspend_wait_timeout < MHI_SUSPEND_TIMEOUT) {
+ suspend_wait_timeout < MHI_WAKEUP_TIMEOUT_CNT) {
/* wait for the suspend to finish */
msleep(MHI_SUSPEND_MIN);
suspend_wait_timeout++;
}
+
+ if (suspend_wait_timeout >= MHI_WAKEUP_TIMEOUT_CNT ||
+ mhi_ctx->ctrl_info != MHI_STATE_CONNECTED) {
+ pr_err("Failed to wake up core\n");
+ mutex_unlock(&mhi_ctx->mhi_write_test);
+ return -ENODEV;
+ }
+
handle_client = wreq->client;
ch = handle_client->channel;
ch->wr_request_active = true;