Merge "diag: Do not open glink channel twice"

This commit is contained in:
Linux Build Service Account 2016-09-02 13:52:46 -07:00 committed by Gerrit - the friendly Code Review server
commit cd601585c7
2 changed files with 12 additions and 7 deletions

View file

@ -475,7 +475,7 @@ static void diag_glink_open_work_fn(struct work_struct *work)
struct glink_open_config open_cfg; struct glink_open_config open_cfg;
void *handle = NULL; void *handle = NULL;
if (!glink_info) if (!glink_info || glink_info->hdl)
return; return;
memset(&open_cfg, 0, sizeof(struct glink_open_config)); memset(&open_cfg, 0, sizeof(struct glink_open_config));
@ -499,11 +499,12 @@ static void diag_glink_close_work_fn(struct work_struct *work)
struct diag_glink_info *glink_info = container_of(work, struct diag_glink_info *glink_info = container_of(work,
struct diag_glink_info, struct diag_glink_info,
close_work); close_work);
if (!glink_info->inited) if (!glink_info || !glink_info->inited || !glink_info->hdl)
return; return;
glink_close(glink_info->hdl); glink_close(glink_info->hdl);
atomic_set(&glink_info->opened, 0); atomic_set(&glink_info->opened, 0);
glink_info->hdl = NULL;
diagfwd_channel_close(glink_info->fwd_ctxt); diagfwd_channel_close(glink_info->fwd_ctxt);
} }
@ -586,6 +587,7 @@ static void __diag_glink_init(struct diag_glink_info *glink_info)
{ {
char wq_name[DIAG_GLINK_NAME_SZ + 12]; char wq_name[DIAG_GLINK_NAME_SZ + 12];
struct glink_link_info link_info; struct glink_link_info link_info;
void *link_state_handle = NULL;
if (!glink_info) if (!glink_info)
return; return;
@ -606,23 +608,25 @@ static void __diag_glink_init(struct diag_glink_info *glink_info)
INIT_WORK(&(glink_info->read_work), diag_glink_read_work_fn); INIT_WORK(&(glink_info->read_work), diag_glink_read_work_fn);
link_info.glink_link_state_notif_cb = diag_glink_notify_cb; link_info.glink_link_state_notif_cb = diag_glink_notify_cb;
link_info.transport = NULL; link_info.transport = NULL;
strlcpy((char *)link_info.edge, glink_info->edge, link_info.edge = glink_info->edge;
sizeof(link_info.edge)); glink_info->link_state_handle = NULL;
glink_info->hdl = glink_register_link_state_cb(&link_info, link_state_handle = glink_register_link_state_cb(&link_info,
(void *)glink_info); (void *)glink_info);
if (IS_ERR_OR_NULL(glink_info->hdl)) { if (IS_ERR_OR_NULL(link_state_handle)) {
pr_err("diag: In %s, unable to register for glink channel %s\n", pr_err("diag: In %s, unable to register for glink channel %s\n",
__func__, glink_info->name); __func__, glink_info->name);
destroy_workqueue(glink_info->wq); destroy_workqueue(glink_info->wq);
return; return;
} }
glink_info->link_state_handle = link_state_handle;
glink_info->fwd_ctxt = NULL; glink_info->fwd_ctxt = NULL;
atomic_set(&glink_info->tx_intent_ready, 0); atomic_set(&glink_info->tx_intent_ready, 0);
atomic_set(&glink_info->opened, 0); atomic_set(&glink_info->opened, 0);
atomic_set(&glink_info->diag_state, 0); atomic_set(&glink_info->diag_state, 0);
DIAG_LOG(DIAG_DEBUG_PERIPHERALS, DIAG_LOG(DIAG_DEBUG_PERIPHERALS,
"%s initialized fwd_ctxt: %pK hdl: %pK\n", "%s initialized fwd_ctxt: %pK hdl: %pK\n",
glink_info->name, glink_info->fwd_ctxt, glink_info->hdl); glink_info->name, glink_info->fwd_ctxt,
glink_info->link_state_handle);
} }
void diag_glink_invalidate(void *ctxt, struct diagfwd_info *fwd_ctxt) void diag_glink_invalidate(void *ctxt, struct diagfwd_info *fwd_ctxt)

View file

@ -25,6 +25,7 @@ struct diag_glink_info {
uint32_t fifo_size; uint32_t fifo_size;
atomic_t tx_intent_ready; atomic_t tx_intent_ready;
void *hdl; void *hdl;
void *link_state_handle;
char edge[DIAG_GLINK_NAME_SZ]; char edge[DIAG_GLINK_NAME_SZ];
char name[DIAG_GLINK_NAME_SZ]; char name[DIAG_GLINK_NAME_SZ];
struct mutex lock; struct mutex lock;