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

Commit 05f93ebf authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "soc: qcom: glink_smd_xprt: Defer channel close ACK operation"

parents b2b64139 a6018888
Loading
Loading
Loading
Loading
+25 −5
Original line number Diff line number Diff line
@@ -561,6 +561,24 @@ static void ssr_work_func(struct work_struct *work)
	mutex_unlock(&einfo->in_ssr_lock);
}

/**
 * deferred_close_ack() - Generate a deferred channel close ack
 * @work:	The channel close ack work to generate.
 */
static void deferred_close_ack(struct work_struct *work)
{
	struct channel_work *ch_work;
	struct channel *ch;

	ch_work = container_of(work, struct channel_work, work);
	ch = ch_work->ch;
	mutex_lock(&ch->edge->rx_cmd_lock);
	ch->edge->xprt_if.glink_core_if_ptr->rx_cmd_ch_close_ack(
				&ch->edge->xprt_if, ch->lcid);
	mutex_unlock(&ch->edge->rx_cmd_lock);
	kfree(ch_work);
}

/**
 * process_tx_done() - process a tx done task
 * @work:	The tx done task to process.
@@ -904,6 +922,7 @@ static void smd_data_ch_close(struct channel *ch)
{
	struct intent_info *intent;
	unsigned long flags;
	struct channel_work *ch_work;

	SMDXPRT_INFO(ch->edge, "%s Closing SMD channel lcid %u\n",
			__func__, ch->lcid);
@@ -924,11 +943,12 @@ static void smd_data_ch_close(struct channel *ch)
		smd_close(ch->smd_ch);
		ch->smd_ch = NULL;
	} else if (ch->local_legacy) {
		mutex_lock(&ch->edge->rx_cmd_lock);
		ch->edge->xprt_if.glink_core_if_ptr->rx_cmd_ch_close_ack(
							&ch->edge->xprt_if,
							ch->lcid);
		mutex_unlock(&ch->edge->rx_cmd_lock);
		ch_work = kzalloc(sizeof(*ch_work), GFP_KERNEL);
		if (ch_work) {
			ch_work->ch = ch;
			INIT_WORK(&ch_work->work, deferred_close_ack);
			queue_work(ch->wq, &ch_work->work);
		}
	}
	mutex_unlock(&ch->ch_probe_lock);