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;
void *handle = NULL;
if (!glink_info)
if (!glink_info || glink_info->hdl)
return;
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,
close_work);
if (!glink_info->inited)
if (!glink_info || !glink_info->inited || !glink_info->hdl)
return;
glink_close(glink_info->hdl);
atomic_set(&glink_info->opened, 0);
glink_info->hdl = NULL;
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];
struct glink_link_info link_info;
void *link_state_handle = NULL;
if (!glink_info)
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);
link_info.glink_link_state_notif_cb = diag_glink_notify_cb;
link_info.transport = NULL;
strlcpy((char *)link_info.edge, glink_info->edge,
sizeof(link_info.edge));
glink_info->hdl = glink_register_link_state_cb(&link_info,
link_info.edge = glink_info->edge;
glink_info->link_state_handle = NULL;
link_state_handle = glink_register_link_state_cb(&link_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",
__func__, glink_info->name);
destroy_workqueue(glink_info->wq);
return;
}
glink_info->link_state_handle = link_state_handle;
glink_info->fwd_ctxt = NULL;
atomic_set(&glink_info->tx_intent_ready, 0);
atomic_set(&glink_info->opened, 0);
atomic_set(&glink_info->diag_state, 0);
DIAG_LOG(DIAG_DEBUG_PERIPHERALS,
"%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)

View file

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