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

Commit 570829fb authored by Veerabhadrarao Badiganti's avatar Veerabhadrarao Badiganti
Browse files

msm: mhi_dev: Don't process any other interrupts during M0 processing



M0 (mhi resume) processing and doorbell interrupt processing are done
in different contexts. And there can be a chance that DB processing
can proceed even before the resume is completely done.

Say while processing M0, MHI has issued M0-ack but not updated channel
state to running state for *all* channels yet. The host can start ringing
DB the moment it sees M0-ack and it's the channel is in running state.

To avoid this race condition, ensure MHI doesn't process any CHDB
interrupt until it's completely done with the resume.

Change-Id: Ie8f7fec034be6b17c71e3b7437ab8e6effb63365
Signed-off-by: default avatarVeerabhadrarao Badiganti <quic_vbadigan@quicinc.com>
parent 97db20de
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -1338,6 +1338,17 @@ int mhi_dev_notify_sm_event(enum mhi_dev_event event)
	INIT_WORK(&state_change_event->work, mhi_sm_dev_event_manager);
	atomic_inc(&mhi_sm_ctx->pending_device_events);
	queue_work(mhi_sm_ctx->mhi_sm_wq, &state_change_event->work);

	/*
	 * Wait until M0 processing is completely done.
	 * This ensures CHDB won't get processed while resume is in
	 * progress thus avoids race between M0 and CHDB processing.
	 */
	if (event == MHI_DEV_EVENT_M0_STATE) {
		MHI_SM_DBG("Got M0, wait until resume is done\n");
		flush_workqueue(mhi_sm_ctx->mhi_sm_wq);
	}

	res = 0;

exit: