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

Commit 13fd2e4a authored by Karthikeyan Ramasubramanian's avatar Karthikeyan Ramasubramanian
Browse files

net: ipc_router: Initialize IPC Router on a first interface attempt



The clients of IPC Router are initialized and they attempt to interface
with IPC Router before it is initialized. The clients are blocked until
the IPC Router is initialized. Instead initialize IPC Router on a first
interface attempt.

Change-Id: I7e4d4eb837e9d04df1ec9f1d0b03703d0ba5b061
Signed-off-by: default avatarKarthikeyan Ramasubramanian <kramasub@codeaurora.org>
parent 654c97a0
Loading
Loading
Loading
Loading
+24 −15
Original line number Diff line number Diff line
@@ -187,7 +187,9 @@ static void do_read_data(struct work_struct *work);
static LIST_HEAD(xprt_info_list);
static DECLARE_RWSEM(xprt_info_list_lock_lha5);

static DECLARE_COMPLETION(msm_ipc_local_router_up);
static DEFINE_MUTEX(ipc_router_init_lock);
static bool is_ipc_router_inited;
static int msm_ipc_router_init(void);
#define IPC_ROUTER_INIT_TIMEOUT (10 * HZ)

static uint32_t next_port_id;
@@ -2792,9 +2794,10 @@ struct msm_ipc_port *msm_ipc_router_create_port(
	struct msm_ipc_port *port_ptr;
	int ret;

	ret = wait_for_completion_interruptible(&msm_ipc_local_router_up);
	ret = msm_ipc_router_init();
	if (ret < 0) {
		IPC_RTR_ERR("%s: Error waiting for local router\n", __func__);
		IPC_RTR_ERR("%s: Error %d initializing IPC Router\n",
			    __func__, ret);
		return NULL;
	}

@@ -3308,17 +3311,14 @@ void msm_ipc_router_xprt_notify(struct msm_ipc_router_xprt *xprt,
	struct msm_ipc_router_xprt_info *xprt_info = xprt->priv;
	struct msm_ipc_router_xprt_work *xprt_work;
	struct rr_packet *pkt;
	unsigned long ret;
	int ret;

	if (!msm_ipc_router_workqueue) {
		ret = wait_for_completion_timeout(&msm_ipc_local_router_up,
						  IPC_ROUTER_INIT_TIMEOUT);
		if (!ret || !msm_ipc_router_workqueue) {
			IPC_RTR_ERR("%s: IPC Router not initialized\n",
								__func__);
	ret = msm_ipc_router_init();
	if (ret < 0) {
		IPC_RTR_ERR("%s: Error %d initializing IPC Router\n",
			    __func__, ret);
		return;
	}
	}

	switch (event) {
	case IPC_ROUTER_XPRT_EVENT_OPEN:
@@ -3371,11 +3371,17 @@ void msm_ipc_router_xprt_notify(struct msm_ipc_router_xprt *xprt,
	queue_work(xprt_info->workqueue, &xprt_info->read_data);
}

static int __init msm_ipc_router_init(void)
static int msm_ipc_router_init(void)
{
	int i, ret;
	struct msm_ipc_routing_table_entry *rt_entry;

	mutex_lock(&ipc_router_init_lock);
	if (likely(is_ipc_router_inited)) {
		mutex_unlock(&ipc_router_init_lock);
		return 0;
	}

	msm_ipc_router_debug_mask |= SMEM_LOG;
	ipc_rtr_log_ctxt = ipc_log_context_create(IPC_RTR_LOG_PAGES,
						  "ipc_router", 0);
@@ -3410,9 +3416,12 @@ static int __init msm_ipc_router_init(void)

	msm_ipc_router_workqueue =
		create_singlethread_workqueue("msm_ipc_router");
	if (!msm_ipc_router_workqueue)
	if (!msm_ipc_router_workqueue) {
		mutex_unlock(&ipc_router_init_lock);
		return -ENOMEM;
	complete_all(&msm_ipc_local_router_up);
	}
	is_ipc_router_inited = true;
	mutex_unlock(&ipc_router_init_lock);
	return ret;
}