Merge "net: ipc_router: Initialize IPC Router on a first interface attempt"
This commit is contained in:
commit
668164c6bd
|
@ -187,7 +187,9 @@ static void do_read_data(struct work_struct *work);
|
||||||
static LIST_HEAD(xprt_info_list);
|
static LIST_HEAD(xprt_info_list);
|
||||||
static DECLARE_RWSEM(xprt_info_list_lock_lha5);
|
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)
|
#define IPC_ROUTER_INIT_TIMEOUT (10 * HZ)
|
||||||
|
|
||||||
static uint32_t next_port_id;
|
static uint32_t next_port_id;
|
||||||
|
@ -2795,9 +2797,10 @@ struct msm_ipc_port *msm_ipc_router_create_port(
|
||||||
struct msm_ipc_port *port_ptr;
|
struct msm_ipc_port *port_ptr;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = wait_for_completion_interruptible(&msm_ipc_local_router_up);
|
ret = msm_ipc_router_init();
|
||||||
if (ret < 0) {
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3311,16 +3314,13 @@ 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_info *xprt_info = xprt->priv;
|
||||||
struct msm_ipc_router_xprt_work *xprt_work;
|
struct msm_ipc_router_xprt_work *xprt_work;
|
||||||
struct rr_packet *pkt;
|
struct rr_packet *pkt;
|
||||||
unsigned long ret;
|
int ret;
|
||||||
|
|
||||||
if (!msm_ipc_router_workqueue) {
|
ret = msm_ipc_router_init();
|
||||||
ret = wait_for_completion_timeout(&msm_ipc_local_router_up,
|
if (ret < 0) {
|
||||||
IPC_ROUTER_INIT_TIMEOUT);
|
IPC_RTR_ERR("%s: Error %d initializing IPC Router\n",
|
||||||
if (!ret || !msm_ipc_router_workqueue) {
|
__func__, ret);
|
||||||
IPC_RTR_ERR("%s: IPC Router not initialized\n",
|
return;
|
||||||
__func__);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
|
@ -3374,11 +3374,17 @@ void msm_ipc_router_xprt_notify(struct msm_ipc_router_xprt *xprt,
|
||||||
queue_work(xprt_info->workqueue, &xprt_info->read_data);
|
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;
|
int i, ret;
|
||||||
struct msm_ipc_routing_table_entry *rt_entry;
|
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;
|
msm_ipc_router_debug_mask |= SMEM_LOG;
|
||||||
ipc_rtr_log_ctxt = ipc_log_context_create(IPC_RTR_LOG_PAGES,
|
ipc_rtr_log_ctxt = ipc_log_context_create(IPC_RTR_LOG_PAGES,
|
||||||
"ipc_router", 0);
|
"ipc_router", 0);
|
||||||
|
@ -3413,9 +3419,12 @@ static int __init msm_ipc_router_init(void)
|
||||||
|
|
||||||
msm_ipc_router_workqueue =
|
msm_ipc_router_workqueue =
|
||||||
create_singlethread_workqueue("msm_ipc_router");
|
create_singlethread_workqueue("msm_ipc_router");
|
||||||
if (!msm_ipc_router_workqueue)
|
if (!msm_ipc_router_workqueue) {
|
||||||
|
mutex_unlock(&ipc_router_init_lock);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
complete_all(&msm_ipc_local_router_up);
|
}
|
||||||
|
is_ipc_router_inited = true;
|
||||||
|
mutex_unlock(&ipc_router_init_lock);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue