MHI_STATUS process_READY_transition(mhi_device_ctxt *mhi_dev_ctxt, STATE_TRANSITION cur_work_item) { MHI_STATUS ret_val = MHI_STATUS_SUCCESS; mhi_log(MHI_MSG_INFO, "Processing READY state transition\n"); mhi_dev_ctxt->mhi_state = MHI_STATE_READY; ret_val = mhi_reset_all_thread_queues(mhi_dev_ctxt); if (MHI_STATUS_SUCCESS != ret_val) mhi_log(MHI_MSG_ERROR, "Failed to reset thread queues\n"); /* Initialize MMIO */ if (MHI_STATUS_SUCCESS != mhi_init_mmio(mhi_dev_ctxt)) { mhi_log(MHI_MSG_ERROR, "Failure during MMIO initialization\n"); return MHI_STATUS_ERROR; } ret_val = mhi_add_elements_to_event_rings(mhi_dev_ctxt, cur_work_item); if (MHI_STATUS_SUCCESS != ret_val) { mhi_log(MHI_MSG_ERROR, "Failure during event ring init\n"); return MHI_STATUS_ERROR; } mhi_reg_write_field(mhi_dev_ctxt->mmio_addr, MHICTRL, MHICTRL_MHISTATE_MASK, MHICTRL_MHISTATE_SHIFT, MHI_STATE_M0); return MHI_STATUS_SUCCESS; }
/** * @brief Main initialization function for a mhi struct device context * All threads, events mutexes, mhi specific data structures * are initialized here * * @param dev_info [IN ] pcie struct device information structure to which this mhi context belongs * @param mhi_struct device [IN/OUT] reference to a mhi context to be populated * * @return MHI_STATUS */ enum MHI_STATUS mhi_init_device_ctxt(struct mhi_pcie_dev_info *dev_info, struct mhi_device_ctxt *mhi_dev_ctxt) { if (NULL == dev_info || NULL == mhi_dev_ctxt) return MHI_STATUS_ERROR; mhi_log(MHI_MSG_VERBOSE, "mhi_init_device_ctxt>Init MHI dev ctxt\n"); if (MHI_STATUS_SUCCESS != mhi_create_ctxt(mhi_dev_ctxt)) { mhi_log(MHI_MSG_ERROR, "Failed to initialize mhi dev ctxt\n"); return MHI_STATUS_ERROR; } if (MHI_STATUS_SUCCESS != mhi_init_sync(mhi_dev_ctxt)) { mhi_log(MHI_MSG_ERROR, "Failed to initialize mhi sync\n"); mhi_clean_init_stage(mhi_dev_ctxt, MHI_INIT_ERROR_STAGE_SYNC); return MHI_STATUS_ERROR; } if (MHI_STATUS_SUCCESS != mhi_init_ctrl_zone(dev_info, mhi_dev_ctxt)) { mhi_log(MHI_MSG_ERROR, "Failed to initialize memory zones\n"); mhi_clean_init_stage(mhi_dev_ctxt, MHI_INIT_ERROR_STAGE_MEM_ZONES); return MHI_STATUS_ERROR; } if (MHI_STATUS_SUCCESS != mhi_init_events(mhi_dev_ctxt)) { mhi_log(MHI_MSG_ERROR, "Failed to initialize mhi events\n"); mhi_clean_init_stage(mhi_dev_ctxt, MHI_INIT_ERROR_STAGE_EVENTS); return MHI_STATUS_ERROR; } if (MHI_STATUS_SUCCESS != mhi_reset_all_thread_queues(mhi_dev_ctxt)) { mhi_log(MHI_MSG_ERROR, "Failed to initialize work queues\n"); mhi_clean_init_stage(mhi_dev_ctxt, MHI_INIT_ERROR_STAGE_THREAD_QUEUES); return MHI_STATUS_ERROR; } if (MHI_STATUS_SUCCESS != mhi_init_device_ctrl(mhi_dev_ctxt)) { mhi_log(MHI_MSG_ERROR, "Failed to initialize ctrl seg\n"); mhi_clean_init_stage(mhi_dev_ctxt, MHI_INIT_ERROR_STAGE_THREAD_QUEUES); return MHI_STATUS_ERROR; } if (MHI_STATUS_SUCCESS != mhi_init_contexts(mhi_dev_ctxt)) { mhi_log(MHI_MSG_ERROR, "Failed initializing contexts\n"); mhi_clean_init_stage(mhi_dev_ctxt, MHI_INIT_ERROR_STAGE_DEVICE_CTRL); return MHI_STATUS_ERROR; } if (MHI_STATUS_SUCCESS != mhi_spawn_threads(mhi_dev_ctxt)) { mhi_log(MHI_MSG_ERROR, "Failed to spawn threads\n"); return MHI_STATUS_ERROR; } if (MHI_STATUS_SUCCESS != mhi_init_timers(mhi_dev_ctxt)) { mhi_log(MHI_MSG_ERROR, "Failed initializing timers\n"); mhi_clean_init_stage(mhi_dev_ctxt, MHI_INIT_ERROR_STAGE_DEVICE_CTRL); return MHI_STATUS_ERROR; } if (MHI_STATUS_SUCCESS != mhi_init_wakelock(mhi_dev_ctxt)) { mhi_log(MHI_MSG_ERROR, "Failed to initialize wakelock\n"); mhi_clean_init_stage(mhi_dev_ctxt, MHI_INIT_ERROR_STAGE_DEVICE_CTRL); return MHI_STATUS_ERROR; } if (MHI_STATUS_SUCCESS != mhi_init_work_queues(mhi_dev_ctxt)) { mhi_log(MHI_MSG_ERROR, "Failed initializing work queues\n"); mhi_clean_init_stage(mhi_dev_ctxt, MHI_INIT_ERROR_STAGE_DEVICE_CTRL); return MHI_STATUS_ERROR; } mhi_dev_ctxt->dev_info = dev_info; mhi_dev_ctxt->dev_props = &dev_info->core; return MHI_STATUS_SUCCESS; }