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

Commit ebae8aac authored by Bhaumik Bhatt's avatar Bhaumik Bhatt
Browse files

mhi: core: Add extra checks for RDDM event handling



If the device enters RDDM when the host is in a fast/DRV suspended
state, MHI host may end up skipping the check from BHI interrupt
handling as a host resume may remain pending for a while. Once the
host resume is triggered by the controller, MHI host can either
walk the primary event ring to discover the RDDM EE event or check
the execution environment post the DRV resume and notify the
controller of the error condition as fallbacks to the original
method of using the BHI interrupt.

Change-Id: I93b678981a5ffd640c1dce15b90bf7bcd2e24971
Signed-off-by: default avatarBhaumik Bhatt <bbhatt@codeaurora.org>
parent acf54681
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -1258,6 +1258,22 @@ int mhi_process_ctrl_ev_ring(struct mhi_controller *mhi_cntrl,
				st = MHI_ST_TRANSITION_MISSION_MODE;
				break;
			case MHI_EE_RDDM:
				if (mhi_cntrl->ee == MHI_EE_RDDM ||
				    mhi_cntrl->power_down)
					break;

				MHI_ERR("RDDM event occurred!\n");
				write_lock_irq(&mhi_cntrl->pm_lock);
				mhi_cntrl->ee = MHI_EE_RDDM;
				write_unlock_irq(&mhi_cntrl->pm_lock);

				/* notify critical clients */
				mhi_control_error(mhi_cntrl);

				mhi_cntrl->status_cb(mhi_cntrl,
						     mhi_cntrl->priv_data,
						     MHI_CB_EE_RDDM);
				wake_up_all(&mhi_cntrl->state_event);
				break;
			default:
				MHI_ERR("Unhandled EE event:%s\n",
+21 −0
Original line number Diff line number Diff line
@@ -1495,6 +1495,26 @@ int mhi_pm_fast_resume(struct mhi_controller *mhi_cntrl, bool notify_client)
		return -EIO;
	}

	if (mhi_cntrl->rddm_supported) {
		if (mhi_get_exec_env(mhi_cntrl) == MHI_EE_RDDM &&
		    !mhi_cntrl->power_down) {
			mhi_cntrl->ee = MHI_EE_RDDM;
			write_unlock_irq(&mhi_cntrl->pm_lock);

			MHI_ERR("RDDM event occurred!\n");

			/* notify critical clients with early notifications */
			mhi_control_error(mhi_cntrl);

			mhi_cntrl->status_cb(mhi_cntrl, mhi_cntrl->priv_data,
					     MHI_CB_EE_RDDM);
			wake_up_all(&mhi_cntrl->state_event);

			tasklet_enable(&mhi_cntrl->mhi_event->task);
			goto exit_pm_fast_resume;
		}
	}

	/* restore the states */
	mhi_cntrl->pm_state = mhi_cntrl->saved_pm_state;
	mhi_cntrl->dev_state = mhi_cntrl->saved_dev_state;
@@ -1538,6 +1558,7 @@ int mhi_pm_fast_resume(struct mhi_controller *mhi_cntrl, bool notify_client)
	/* schedules worker if any special purpose events need to be handled */
	mhi_special_events_pending(mhi_cntrl);

exit_pm_fast_resume:
	MHI_LOG("Exit with pm_state:%s dev_state:%s\n",
		to_mhi_pm_state_str(mhi_cntrl->pm_state),
		TO_MHI_STATE_STR(mhi_cntrl->dev_state));