/**
 * \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() */
예제 #3
0
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() */