Example #1
0
MHI_STATUS probe_clients(mhi_device_ctxt *mhi_dev_ctxt,STATE_TRANSITION new_state)
{
	int ret_val = 0;
	if (new_state == STATE_TRANSITION_AMSS) {
		probe_clients(mhi_dev_ctxt, STATE_TRANSITION_SBL);
		mhi_dev_ctxt->mhi_rmnet_dev = platform_device_alloc("mhi_rmnet",-1);
		ret_val = platform_device_add(mhi_dev_ctxt->mhi_rmnet_dev);
		if (ret_val)
			mhi_log(MHI_MSG_CRITICAL, "Failed to add MHI_RmNET device.\n");
	} else if (new_state == STATE_TRANSITION_SBL) {
		if (0 == mhi_dev_ctxt->flags.uci_probed) {
			mhi_dev_ctxt->mhi_uci_dev = platform_device_alloc("mhi_uci",-1);
			ret_val = platform_device_add(mhi_dev_ctxt->mhi_uci_dev);

			if (ret_val)
				mhi_log(MHI_MSG_CRITICAL, "Failed to add MHI_SHIM device.\n");
			mhi_dev_ctxt->flags.uci_probed = 1;
		}
	}
	return ret_val;
}
Example #2
0
MHI_STATUS process_SBL_transition(mhi_device_ctxt *mhi_dev_ctxt,
		STATE_TRANSITION cur_work_item)
{
	MHI_STATUS ret_val;
	u32 chan;
	mhi_chan_ctxt *chan_ctxt;
	mhi_log(MHI_MSG_INFO, "Processing SBL state transition\n");
	for (chan = 0; chan <= MHI_CLIENT_SAHARA_IN; ++chan)
	{
		chan_ctxt =
			&mhi_dev_ctxt->mhi_ctrl_seg->mhi_cc_list[chan];
		if (MHI_CHAN_STATE_ENABLED == chan_ctxt->mhi_chan_state ) {
			ret_val = mhi_send_cmd(mhi_dev_ctxt,
						MHI_COMMAND_START_CHAN,
						chan);
			if (MHI_STATUS_SUCCESS != ret_val) {
				mhi_log(MHI_MSG_VERBOSE,
					"Starting Channel 0x%x \n", chan);
				mhi_log(MHI_MSG_CRITICAL,
					"Failed to start chan0x%x, ret 0x%x\n",
					chan, ret_val);
				return MHI_STATUS_ERROR;
			} else {
					atomic_inc(
					&mhi_dev_ctxt->start_cmd_pending_ack);
			}
		}
		wait_event_interruptible(*mhi_dev_ctxt->chan_start_complete,
		atomic_read(&mhi_dev_ctxt->start_cmd_pending_ack) == 0);
	}

	if (!mhi_dev_ctxt->flags.mhi_clients_probed) {
		ret_val = probe_clients(mhi_dev_ctxt, cur_work_item);
	}

	return MHI_STATUS_SUCCESS;
}
Example #3
0
MHI_STATUS process_AMSS_transition(mhi_device_ctxt *mhi_dev_ctxt,
				STATE_TRANSITION cur_work_item)
{
	MHI_STATUS ret_val;
	u32 chan;
	unsigned long flags;
	mhi_chan_ctxt *chan_ctxt;
	mhi_log(MHI_MSG_INFO, "Processing AMSS state transition\n");
	write_lock_irqsave(&mhi_dev_ctxt->xfer_lock, flags);
	atomic_inc(&mhi_dev_ctxt->flags.data_pending);
	mhi_assert_device_wake(mhi_dev_ctxt);

	write_unlock_irqrestore(&mhi_dev_ctxt->xfer_lock, flags);
	ret_val = mhi_add_elements_to_event_rings(mhi_dev_ctxt,
			cur_work_item);
	if (MHI_STATUS_SUCCESS != ret_val)
		return MHI_STATUS_ERROR;
	for (chan = 0; chan <= MHI_MAX_CHANNELS; ++chan) {
		if (VALID_CHAN_NR(chan)) {
			chan_ctxt =
				&mhi_dev_ctxt->mhi_ctrl_seg->mhi_cc_list[chan];
			if (MHI_CHAN_STATE_ENABLED ==
						chan_ctxt->mhi_chan_state) {
				mhi_log(MHI_MSG_INFO,
					"Starting Channel 0x%x \n", chan);
				ret_val = mhi_send_cmd(mhi_dev_ctxt,
						MHI_COMMAND_START_CHAN,
						chan);
				if (MHI_STATUS_SUCCESS != ret_val) {
					mhi_log(MHI_MSG_CRITICAL,
							"Failed to start chan0x%x,0x%x\n",
							chan, ret_val);
					return MHI_STATUS_ERROR;
				} else {
					atomic_inc(
							&mhi_dev_ctxt->start_cmd_pending_ack);
				}
			}
		}
	}
	mhi_log(MHI_MSG_INFO, "Waiting for cmd completions\n");
	wait_event_interruptible(*mhi_dev_ctxt->chan_start_complete,
			atomic_read(&mhi_dev_ctxt->start_cmd_pending_ack) == 0);
	if (0 == mhi_dev_ctxt->flags.mhi_initialized) {

		mhi_dev_ctxt->flags.mhi_initialized = 1;
		ret_val = mhi_set_state_of_all_channels(mhi_dev_ctxt,
				MHI_CHAN_STATE_RUNNING);
		if (MHI_STATUS_SUCCESS != ret_val)
			mhi_log(MHI_MSG_CRITICAL,
					"Failed to set local chan state\n");
		if (!mhi_dev_ctxt->flags.mhi_clients_probed) {
			ret_val = probe_clients(mhi_dev_ctxt, cur_work_item);
			if (ret_val != MHI_STATUS_SUCCESS)
				mhi_log(MHI_MSG_CRITICAL,
						"Failed to probe MHI CORE clients.\n");
			mhi_dev_ctxt->flags.mhi_clients_probed = 1;

			ring_all_ev_dbs(mhi_dev_ctxt);
			ring_all_chan_dbs(mhi_dev_ctxt);
			ring_all_cmd_dbs(mhi_dev_ctxt);

		} else {
			ring_all_chan_dbs(mhi_dev_ctxt);
			mhi_log(MHI_MSG_CRITICAL,
					"Notifying clients that MHI is enabled\n");
			mhi_notify_clients(mhi_dev_ctxt,
					MHI_CB_MHI_ENABLED);
		}
		if (ret_val != MHI_STATUS_SUCCESS)
			mhi_log(MHI_MSG_CRITICAL,
					"Failed to probe MHI CORE clients, ret 0x%x \n",
					ret_val);
	}
	atomic_dec(&mhi_dev_ctxt->flags.data_pending);
	mhi_log(MHI_MSG_INFO, "Exited\n");
	return MHI_STATUS_SUCCESS;
}