int init_local_ev_ring_by_type(struct mhi_device_ctxt *mhi_dev_ctxt, enum MHI_TYPE_EVENT_RING type) { enum MHI_STATUS ret_val = MHI_STATUS_SUCCESS; u32 i; mhi_log(MHI_MSG_INFO, "Entered\n"); for (i = 0; i < mhi_dev_ctxt->mmio_info.nr_event_rings; i++) { if (GET_EV_PROPS(EV_TYPE, mhi_dev_ctxt->ev_ring_props[i].flags) == type && !mhi_dev_ctxt->ev_ring_props[i].state) { ret_val = mhi_init_local_event_ring(mhi_dev_ctxt, mhi_dev_ctxt->ev_ring_props[i].nr_desc, i); if (ret_val) return ret_val; } ring_ev_db(mhi_dev_ctxt, i); mhi_log(MHI_MSG_INFO, "Finished ev ring init %d\n", i); } mhi_log(MHI_MSG_INFO, "Exited\n"); return 0; }
/** * @brief Add elements to event ring for the device to use * * @param mhi device context * * @return MHI_STATUS */ MHI_STATUS mhi_add_elements_to_event_rings(mhi_device_ctxt *mhi_dev_ctxt, STATE_TRANSITION new_state) { MHI_STATUS ret_val = MHI_STATUS_SUCCESS; MHI_EVENT_RING_STATE event_ring_state = MHI_EVENT_RING_UINIT; switch (new_state) { case STATE_TRANSITION_READY: MHI_GET_EVENT_RING_INFO(EVENT_RING_STATE_FIELD, mhi_dev_ctxt->ev_ring_props[PRIMARY_EVENT_RING], event_ring_state); if (MHI_EVENT_RING_UINIT == event_ring_state) { ret_val = mhi_init_event_ring(mhi_dev_ctxt, EV_EL_PER_RING, mhi_dev_ctxt->alloced_ev_rings[PRIMARY_EVENT_RING]); if (MHI_STATUS_SUCCESS != ret_val) { mhi_log(MHI_MSG_ERROR, "Failed to add ev el on event ring\n"); return MHI_STATUS_ERROR; } MHI_SET_EVENT_RING_INFO(EVENT_RING_STATE_FIELD, mhi_dev_ctxt->ev_ring_props[PRIMARY_EVENT_RING], MHI_EVENT_RING_INIT); } mhi_log(MHI_MSG_ERROR, "Event ring initialized ringing, EV DB to resume\n"); ring_ev_db(mhi_dev_ctxt, mhi_dev_ctxt->alloced_ev_rings[PRIMARY_EVENT_RING]); break; case STATE_TRANSITION_AMSS: MHI_GET_EVENT_RING_INFO(EVENT_RING_STATE_FIELD, mhi_dev_ctxt->ev_ring_props[IPA_OUT_EV_RING], event_ring_state); if (MHI_EVENT_RING_UINIT == event_ring_state) { ret_val = mhi_init_event_ring(mhi_dev_ctxt, EV_EL_PER_RING, mhi_dev_ctxt->alloced_ev_rings[IPA_OUT_EV_RING]); if (MHI_STATUS_SUCCESS != ret_val) { mhi_log(MHI_MSG_ERROR, "Failed to add ev el on event ring\n"); return MHI_STATUS_ERROR; } ret_val = mhi_init_event_ring(mhi_dev_ctxt, EV_EL_PER_RING, mhi_dev_ctxt->alloced_ev_rings[IPA_IN_EV_RING]); if (MHI_STATUS_SUCCESS != ret_val) { mhi_log(MHI_MSG_ERROR, "Failed to add ev el on event ring\n"); return MHI_STATUS_ERROR; } MHI_SET_EVENT_RING_INFO(EVENT_RING_STATE_FIELD, mhi_dev_ctxt->ev_ring_props[IPA_OUT_EV_RING], MHI_EVENT_RING_INIT); MHI_SET_EVENT_RING_INFO(EVENT_RING_STATE_FIELD, mhi_dev_ctxt->ev_ring_props[IPA_IN_EV_RING], MHI_EVENT_RING_INIT); } ring_ev_db(mhi_dev_ctxt, mhi_dev_ctxt->alloced_ev_rings[SOFTWARE_EV_RING]); ring_ev_db(mhi_dev_ctxt, mhi_dev_ctxt->alloced_ev_rings[IPA_OUT_EV_RING]); ring_ev_db(mhi_dev_ctxt, mhi_dev_ctxt->alloced_ev_rings[IPA_IN_EV_RING]); break; default: mhi_log(MHI_MSG_ERROR, "Unrecognized event stage, %d\n", new_state); ret_val = MHI_STATUS_ERROR; break; } return ret_val; }