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

Commit 34164b74 authored by Mohit Aggarwal's avatar Mohit Aggarwal
Browse files

diag: Open glink channels in workqueue context



Currently, on loading WDSP, diag is trying to close socket
transport and opening glink channels. Due to this, deadlock
is happening and wdsp channels are not getting opened properly
which leads to WDSP log stall. This patch fixes the issue by
moving opening of channels in workqueue context.

CRs-Fixed: 2030858
Change-Id: Ib6153b04cdda80275a94b16842032a19b2a5bb75
Signed-off-by: default avatarMohit Aggarwal <maggarwa@codeaurora.org>
parent 1ccabf65
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -487,6 +487,18 @@ static void diag_glink_remote_disconnect_work_fn(struct work_struct *work)
	atomic_set(&glink_info->tx_intent_ready, 0);
}

static void diag_glink_late_init_work_fn(struct work_struct *work)
{
	struct diag_glink_info *glink_info = container_of(work,
							struct diag_glink_info,
							late_init_work);
	if (!glink_info || !glink_info->hdl)
		return;
	DIAG_LOG(DIAG_DEBUG_PERIPHERALS, "p: %d t: %d\n",
			glink_info->peripheral, glink_info->type);
	diagfwd_channel_open(glink_info->fwd_ctxt);
}

static void diag_glink_transport_notify_state(void *handle, const void *priv,
					  unsigned event)
{
@@ -617,7 +629,7 @@ static void glink_late_init(struct diag_glink_info *glink_info)
	glink_info->inited = 1;

	if (atomic_read(&glink_info->opened))
		diagfwd_channel_open(glink_info->fwd_ctxt);
		queue_work(glink_info->wq, &(glink_info->late_init_work));

	DIAG_LOG(DIAG_DEBUG_PERIPHERALS, "%s exiting\n",
		 glink_info->name);
@@ -665,6 +677,7 @@ static void __diag_glink_init(struct diag_glink_info *glink_info)
	INIT_WORK(&(glink_info->connect_work), diag_glink_connect_work_fn);
	INIT_WORK(&(glink_info->remote_disconnect_work),
		diag_glink_remote_disconnect_work_fn);
	INIT_WORK(&(glink_info->late_init_work), diag_glink_late_init_work_fn);
	link_info.glink_link_state_notif_cb = diag_glink_notify_cb;
	link_info.transport = NULL;
	link_info.edge = glink_info->edge;
+1 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ struct diag_glink_info {
	struct work_struct read_work;
	struct work_struct connect_work;
	struct work_struct remote_disconnect_work;
	struct work_struct late_init_work;
	struct diagfwd_info *fwd_ctxt;
};