Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6706ec15 authored by Dhoat Harpal's avatar Dhoat Harpal Committed by Gerrit - the friendly Code Review server
Browse files

soc: qcom: ipc_router_glink_xprt: Add wakeup source in RX path



In function glink_xprt_notify_rxv work item is queued without
wakelock. This allows system to go in suspend state without
scheduling this work item.

Wakelock is taken to avoid system suspend before workqueue
execution.

CRs-Fixed: 2098623
Change-Id: Ic5f74dbb4bf315f1cb6aa528367a6fb80e8a11b6
Signed-off-by: default avatarDhoat Harpal <hdhoat@codeaurora.org>
parent d0edcda0
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -82,6 +82,7 @@ struct ipc_router_glink_xprt {
	struct msm_ipc_router_xprt xprt;
	void *ch_hndl;
	struct workqueue_struct *xprt_wq;
	struct wakeup_source notify_rxv_ws;
	struct rw_semaphore ss_reset_rwlock;
	int ss_reset;
	void *pil;
@@ -379,6 +380,7 @@ static void glink_xprt_read_data(struct work_struct *work)
	glink_rx_done(glink_xprtp->ch_hndl, rx_work->iovec, reuse_intent);
	kfree(rx_work);
	up_read(&glink_xprtp->ss_reset_rwlock);
	__pm_relax(&glink_xprtp->notify_rxv_ws);
}

static void glink_xprt_open_event(struct work_struct *work)
@@ -493,6 +495,8 @@ static void glink_xprt_notify_rxv(void *handle, const void *priv,
	rx_work->iovec_size = size;
	rx_work->vbuf_provider = vbuf_provider;
	rx_work->pbuf_provider = pbuf_provider;
	if (!glink_xprtp->dynamic_wakeup_source)
		__pm_stay_awake(&glink_xprtp->notify_rxv_ws);
	INIT_WORK(&rx_work->work, glink_xprt_read_data);
	queue_work(glink_xprtp->xprt_wq, &rx_work->work);
}
@@ -761,6 +765,7 @@ static int ipc_router_glink_config_init(
		return -EFAULT;
	}

	wakeup_source_init(&glink_xprtp->notify_rxv_ws, xprt_wq_name);
	mutex_lock(&glink_xprt_list_lock_lha1);
	list_add(&glink_xprtp->list, &glink_xprt_list);
	mutex_unlock(&glink_xprt_list_lock_lha1);