/** * \brief * UMAC Task handler. This function will be triggered on the system event * SC_UMAC_TASK_MESSAGE * \param UmacHandle - Handle to the UMAC Instance. * \returns none. *****************************************************************************/ void wfm_umac_task(UMAC_HANDLE UmacHandle) { uint8 index; WFM_UMAC_INSTANCE *pUmacInstance; WFM_UMAC_PKT_Q *pPktQ; uint32 Get; uint32 Put; OS_ASSERT(UmacHandle); pUmacInstance = (WFM_UMAC_INSTANCE *) UmacHandle; OS_LOCK(pUmacInstance->gVars.p.tcb.Lock); Get = pUmacInstance->gVars.p.tcb.UmacTaskQGet; Put = pUmacInstance->gVars.p.tcb.UmacTaskQPut; if ((uint8) (Put - Get) > 0) { WFM_UMAC_PKT_Q pktQ = { 0 }; index = (uint8) (Get & (WFM_UMAC_MAX_NO_OUTSTANDING_FRAMES - 1)); pPktQ = &pUmacInstance->gVars.p.tcb.UmacPktQ[index]; pktQ = *pPktQ; Get++; pUmacInstance->gVars.p.tcb.UmacTaskQGet = Get; pPktQ->pMsg = NULL; OS_UNLOCK(pUmacInstance->gVars.p.tcb.Lock); WfmUmacMsgDispatchTbl[pktQ.Type] (UmacHandle, &pktQ); if ((uint8) (Put - Get) != 0) { /*There are more packets to be processed */ /*Request for Contact- Schedule for future */ pUmacInstance->gVars.p.ScheduleCb( pUmacInstance->gVars.p.ScheduleParam ); } /* if((uint8)(Put - Get) != 0) */ } else { OS_UNLOCK(pUmacInstance->gVars.p.tcb.Lock); LOG_EVENT(DBG_WFM_ERROR | DBG_WFM_STATE_MC, "BAD UMAC TASK SET EVENT*******\n"); } } /* end wfm_umac_task() */
/** * \brief * Queues an Event or message to UMAC. * \param UmacHandle - Handle to the UMAC Instance. * \param MessageType - Message to be processed. * \param EventType - Event to be processed. * \param *pMsg - Message to be processed. * \returns none. *****************************************************************************/ void wfm_umac_q_msg(UMAC_HANDLE UmacHandle, uint16 MessageType, uint16 EventType, void *pMsg) { uint8 index; WFM_UMAC_INSTANCE *pUmacInstance; WFM_UMAC_PKT_Q *pPktQ; uint32 Put; OS_ASSERT(UmacHandle); pUmacInstance = (WFM_UMAC_INSTANCE *) UmacHandle; OS_LOCK(pUmacInstance->gVars.p.tcb.Lock); Put = pUmacInstance->gVars.p.tcb.UmacTaskQPut; if ((int)(Put - pUmacInstance->gVars.p.tcb.UmacTaskQGet) < WFM_UMAC_MAX_NO_OUTSTANDING_FRAMES) { index = (uint8) (Put & (WFM_UMAC_MAX_NO_OUTSTANDING_FRAMES - 1)); pPktQ = (WFM_UMAC_PKT_Q *) &pUmacInstance->gVars.p.tcb.UmacPktQ[index]; OS_ASSERT(!(pPktQ->pMsg)); Put++; pUmacInstance->gVars.p.tcb.UmacTaskQPut = Put; pPktQ->Type = MessageType; pPktQ->Event = EventType; pPktQ->pMsg = pMsg; OS_UNLOCK(pUmacInstance->gVars.p.tcb.Lock); pUmacInstance->gVars.p.ScheduleCb( pUmacInstance->gVars.p.ScheduleParam ); } else { OS_UNLOCK(pUmacInstance->gVars.p.tcb.Lock); /*Task Queue over-flow */ OS_ASSERT(0); } } /* end wfm_umac_q_msg() */
void rt_tsk_unlock (void) { /* Unlock scheduler and re-enable task switching */ if (os_tick_irqn < 0) { OS_UNLOCK(); os_lock = __FALSE; OS_PEND(pend_flags, os_psh_flag); os_psh_flag = __FALSE; } else { OS_X_UNLOCK((U32)os_tick_irqn); os_lock = __FALSE; OS_X_PEND(pend_flags, os_psh_flag); os_psh_flag = __FALSE; } }
/** * \brief * This function moves the messages queued in the pending message queue to the * main task queue. * \param UmacHandle - Handle to the UMAC Instance. * \returns none. *****************************************************************************/ void umac_move_pending_msgs_to_active_q(UMAC_HANDLE UmacHandle) { uint8 index; WFM_UMAC_INSTANCE *pUmacInstance; WFM_UMAC_PKT_Q *pPktQ; OS_ASSERT(UmacHandle); pUmacInstance = (WFM_UMAC_INSTANCE *) UmacHandle; while (IS_MORE_PENDING_MESSAGES(UmacHandle)) { OS_LOCK(pUmacInstance->gVars.p.tcb.PendingQLock); index = (uint8) (pUmacInstance->gVars.p.tcb.PendingQGet & (WFM_UMAC_MAX_NO_OUTSTANDING_FRAMES - 1) ); pPktQ = (WFM_UMAC_PKT_Q *) &pUmacInstance->gVars.p.tcb.PendingPktQ[index]; pUmacInstance->gVars.p.tcb.PendingQGet++; OS_UNLOCK(pUmacInstance->gVars.p.tcb.PendingQLock); wfm_umac_q_msg( UmacHandle, pPktQ->Type, pPktQ->Event, pPktQ->pMsg ); pPktQ->Type = 0; pPktQ->Event = 0; pPktQ->pMsg = NULL; } /* while(IS_MORE_PENDING_MESSAGES(UmacHandle)) */ } /* end umac_move_pending_msgs_to_active_q */
/** * \brief * Queues an Event or message to UMAC. * \param UmacHandle - Handle to the UMAC Instance. * \param MessageType - Message to be processed. * \param EventType - Event to be processed. * \param *pMsg - Message to be processed. * \returns none. *****************************************************************************/ void umac_q_pending_msg(UMAC_HANDLE UmacHandle, uint16 MessageType, uint16 EventType, void *pMsg) { uint8 index; WFM_UMAC_INSTANCE *pUmacInstance; WFM_UMAC_PKT_Q *pPktQ; uint32 Put; OS_ASSERT(UmacHandle); pUmacInstance = (WFM_UMAC_INSTANCE *) UmacHandle; OS_LOCK(pUmacInstance->gVars.p.tcb.PendingQLock); Put = pUmacInstance->gVars.p.tcb.PendingQPut; OS_ASSERT((int)(Put - pUmacInstance->gVars.p.tcb.PendingQGet) < WFM_UMAC_MAX_NO_OUTSTANDING_FRAMES); index = (uint8) (Put & (WFM_UMAC_MAX_NO_OUTSTANDING_FRAMES - 1)); pPktQ = (WFM_UMAC_PKT_Q *) &pUmacInstance->gVars.p.tcb.PendingPktQ[index]; OS_ASSERT(!(pPktQ->pMsg)); Put++; pUmacInstance->gVars.p.tcb.PendingQPut = Put; pPktQ->Type = MessageType; pPktQ->Event = EventType; pPktQ->pMsg = pMsg; OS_UNLOCK(pUmacInstance->gVars.p.tcb.PendingQLock); } /* end umac_q_pending_msg() */