/*--------------------------------------------------------------------------- wpalPostCtrlMsg - Post a message to control context so it can be processed in that context. Param: pPalContext - A PAL context pMsg - a pointer to called allocated opaque object; ---------------------------------------------------------------------------*/ wpt_status wpalPostCtrlMsg(void *pPalContext, wpt_msg *pMsg) { wpt_status status = eWLAN_PAL_STATUS_E_FAILURE; vos_msg_t msg; if (NULL == pMsg) { WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s: NULL message pointer", __FUNCTION__); WPAL_ASSERT(0); return status; } msg.type = 0; //This field is not used because VOSS doesn't check it. msg.reserved = 0; msg.bodyval = 0; msg.bodyptr = pMsg; if(VOS_IS_STATUS_SUCCESS(vos_mq_post_message(VOS_MQ_ID_WDI, &msg))) { status = eWLAN_PAL_STATUS_SUCCESS; } else { WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s fail to post msg %d\n", __FUNCTION__, pMsg->type); } return status; }
static VOS_STATUS sys_PostMcThreadProbeMsg( v_CONTEXT_t pVosContext, sysResponseCback userCallback, v_VOID_t *pUserData, SYS_MSG_ID sysMsgId ) { VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; vos_msg_t sysMsg; tSirRetStatus sirStatus = eSIR_SUCCESS; /*----------------------------------------------------------------------------------------*/ sysBuildMessageHeader( sysMsgId, &sysMsg ); // Save the user callback and user data to callback in the body pointer // and body data portion of the message. sysMsg.bodyptr = (void *)userCallback; sysMsg.bodyval = (v_U32_t)pUserData; // Post the message... vosStatus = vos_mq_post_message( VOS_MQ_ID_SYS, &sysMsg ); if ( eSIR_SUCCESS != sirStatus ) { vosStatus = VOS_STATUS_E_BADMSG; } return( vosStatus ); }
tSirRetStatus wdaPostCtrlMsg(tpAniSirGlobal pMac, tSirMsgQ *pMsg) { if(VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MQ_ID_WDA, (vos_msg_t *) pMsg)) return eSIR_FAILURE; else return eSIR_SUCCESS; } // halPostMsg()
VOS_STATUS sysMcStart( v_CONTEXT_t pVosContext, sysResponseCback userCallback, v_VOID_t *pUserData ) { VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; vos_msg_t sysMsg; sysBuildMessageHeader( SYS_MSG_ID_MC_START, &sysMsg ); // Save the user callback and user data to callback in the body pointer // and body data portion of the message. // finished. sysMsg.bodyptr = (void *)userCallback; sysMsg.bodyval = (v_U32_t)pUserData; // post the message.. vosStatus = vos_mq_post_message( VOS_MQ_ID_SYS, &sysMsg ); if ( !VOS_IS_STATUS_SUCCESS(vosStatus) ) { vosStatus = VOS_STATUS_E_BADMSG; } return( vosStatus ); }
VOS_STATUS sysStop( v_CONTEXT_t pVosContext ) { VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; vos_msg_t sysMsg; v_U8_t evtIndex; /* Initialize the stop event */ vosStatus = vos_event_init( &gStopEvt ); if(! VOS_IS_STATUS_SUCCESS( vosStatus )) { return vosStatus; } /* post a message to SYS module in MC to stop SME and MAC */ sysBuildMessageHeader( SYS_MSG_ID_MC_STOP, &sysMsg ); // Save the user callback and user data to callback in the body pointer // and body data portion of the message. // finished. sysMsg.bodyptr = (void *)sysStopCompleteCb; sysMsg.bodyval = (v_U32_t) &gStopEvt; // post the message.. vosStatus = vos_mq_post_message( VOS_MQ_ID_SYS, &sysMsg ); if ( !VOS_IS_STATUS_SUCCESS(vosStatus) ) { vosStatus = VOS_STATUS_E_BADMSG; } vosStatus = vos_wait_events( &gStopEvt, 1, 0, &evtIndex ); VOS_ASSERT( VOS_IS_STATUS_SUCCESS ( vosStatus ) ); vosStatus = vos_event_destroy( &gStopEvt ); VOS_ASSERT( VOS_IS_STATUS_SUCCESS ( vosStatus ) ); return( vosStatus ); }
VOS_STATUS sysStop( v_CONTEXT_t pVosContext ) { VOS_STATUS vosStatus = VOS_STATUS_SUCCESS; vos_msg_t sysMsg; v_U8_t evtIndex; vosStatus = vos_event_init( &gStopEvt ); if(! VOS_IS_STATUS_SUCCESS( vosStatus )) { return vosStatus; } sysBuildMessageHeader( SYS_MSG_ID_MC_STOP, &sysMsg ); sysMsg.bodyptr = (void *)sysStopCompleteCb; sysMsg.bodyval = (v_U32_t) &gStopEvt; vosStatus = vos_mq_post_message( VOS_MQ_ID_SYS, &sysMsg ); if ( !VOS_IS_STATUS_SUCCESS(vosStatus) ) { vosStatus = VOS_STATUS_E_BADMSG; } vosStatus = vos_wait_events( &gStopEvt, 1, SYS_STOP_TIMEOUT, &evtIndex ); VOS_ASSERT( VOS_IS_STATUS_SUCCESS ( vosStatus ) ); vosStatus = vos_event_destroy( &gStopEvt ); VOS_ASSERT( VOS_IS_STATUS_SUCCESS ( vosStatus ) ); return( vosStatus ); }
wpt_status wpalPostCtrlMsg(void *pPalContext, wpt_msg *pMsg) { wpt_status status = eWLAN_PAL_STATUS_E_FAILURE; vos_msg_t msg; if (NULL == pMsg) { WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s: NULL message pointer", __func__); WPAL_ASSERT(0); return status; } if ((WPAL_MC_MSG_SMD_NOTIF_OPEN_SIG == pMsg->type) || (WPAL_MC_MSG_SMD_NOTIF_DATA_SIG == pMsg->type)) { msg.type = pMsg->type; } else { msg.type = 0; } msg.reserved = 0; msg.bodyval = 0; msg.bodyptr = pMsg; if(VOS_IS_STATUS_SUCCESS(vos_mq_post_message(VOS_MQ_ID_WDI, &msg))) { status = eWLAN_PAL_STATUS_SUCCESS; } else { WPAL_TRACE(eWLAN_MODULE_PAL, eWLAN_PAL_TRACE_LEVEL_ERROR, "%s fail to post msg %d", __func__, pMsg->type); } return status; }
/****************************************************************************** * Function: sme_NanRequest * * Description: * This function gets called when HDD receives NAN vendor command * from user space * * Args: * Nan Request structure ptr * * Returns: * VOS_STATUS *****************************************************************************/ VOS_STATUS sme_NanRequest(tpNanRequestReq input) { vos_msg_t msg; tpNanRequest data; size_t data_len; data_len = sizeof(tNanRequest) + input->request_data_len; data = vos_mem_malloc(data_len); if (data == NULL) { VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, FL("Memory allocation failure")); return VOS_STATUS_E_FAULT; } vos_mem_zero(data, data_len); data->request_data_len = input->request_data_len; if (input->request_data_len) { vos_mem_copy(data->request_data, input->request_data, input->request_data_len); } msg.type = WDA_NAN_REQUEST; msg.reserved = 0; msg.bodyptr = data; if (VOS_STATUS_SUCCESS != vos_mq_post_message(VOS_MODULE_ID_WDA, &msg)) { VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR, FL("Not able to post WDA_NAN_REQUEST message to WDA")); vos_mem_free(data); return VOS_STATUS_SUCCESS; } return VOS_STATUS_SUCCESS; }
static void vos_linux_timer_callback ( v_U32_t data ) { vos_timer_t *timer = ( vos_timer_t *)data; vos_msg_t msg; VOS_STATUS vStatus; unsigned long flags; vos_timer_callback_t callback=NULL; v_PVOID_t userData=NULL; int threadId; VOS_TIMER_TYPE type=VOS_TIMER_TYPE_SW; VOS_ASSERT(timer); if (timer == NULL) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s Null pointer passed in!",__func__); return; } threadId = timer->platformInfo.threadID; spin_lock_irqsave( &timer->platformInfo.spinlock,flags ); switch ( timer->state ) { case VOS_TIMER_STATE_STARTING: // we are in this state because someone just started the timer, MM timer // got started and expired, but the time content have not bee updated // this is a rare race condition! timer->state = VOS_TIMER_STATE_STOPPED; vStatus = VOS_STATUS_E_ALREADY; break; case VOS_TIMER_STATE_STOPPED: vStatus = VOS_STATUS_E_ALREADY; break; case VOS_TIMER_STATE_UNUSED: vStatus = VOS_STATUS_E_EXISTS; break; case VOS_TIMER_STATE_RUNNING: // need to go to stop state here because the call-back function may restart // timer (to emulate periodic timer) timer->state = VOS_TIMER_STATE_STOPPED; // copy the relevant timer information to local variables; // once we exist from this critical section, the timer content may be modified // by other tasks callback = timer->callback; userData = timer->userData; threadId = timer->platformInfo.threadID; type = timer->type; vStatus = VOS_STATUS_SUCCESS; break; default: VOS_ASSERT(0); vStatus = VOS_STATUS_E_FAULT; break; } spin_unlock_irqrestore( &timer->platformInfo.spinlock,flags ); if ( VOS_STATUS_SUCCESS != vStatus ) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "TIMER callback called in a wrong state=%d", timer->state); return; } tryAllowingSleep( type ); if (callback == NULL) { VOS_ASSERT(0); VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: No TIMER callback, Could not enqueue timer to any queue", __func__); return; } // If timer has expired then call vos_client specific callback if ( vos_sched_is_tx_thread( threadId ) ) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO, "TIMER callback: running on TX thread"); //Serialize to the Tx thread sysBuildMessageHeader( SYS_MSG_ID_TX_TIMER, &msg ); msg.bodyptr = callback; msg.bodyval = (v_U32_t)userData; if(vos_tx_mq_serialize( VOS_MQ_ID_SYS, &msg ) == VOS_STATUS_SUCCESS) return; } else if ( vos_sched_is_rx_thread( threadId ) ) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO, "TIMER callback: running on RX thread"); //Serialize to the Rx thread sysBuildMessageHeader( SYS_MSG_ID_RX_TIMER, &msg ); msg.bodyptr = callback; msg.bodyval = (v_U32_t)userData; if(vos_rx_mq_serialize( VOS_MQ_ID_SYS, &msg ) == VOS_STATUS_SUCCESS) return; } else { VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO, "TIMER callback: running on MC thread"); // Serialize to the MC thread sysBuildMessageHeader( SYS_MSG_ID_MC_TIMER, &msg ); msg.bodyptr = callback; msg.bodyval = (v_U32_t)userData; if(vos_mq_post_message( VOS_MQ_ID_SYS, &msg ) == VOS_STATUS_SUCCESS) return; } VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: Could not enqueue timer to any queue", __func__); VOS_ASSERT(0); }
static void vos_linux_timer_callback ( v_U32_t data ) { vos_timer_t *timer = ( vos_timer_t *)data; vos_msg_t msg; VOS_STATUS vStatus; unsigned long flags; vos_timer_callback_t callback=NULL; v_PVOID_t userData=NULL; int threadId; VOS_TIMER_TYPE type=VOS_TIMER_TYPE_SW; VOS_ASSERT(timer); if (timer == NULL) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s Null pointer passed in!",__func__); return; } threadId = timer->platformInfo.threadID; spin_lock_irqsave( &timer->platformInfo.spinlock,flags ); switch ( timer->state ) { case VOS_TIMER_STATE_STARTING: // // // timer->state = VOS_TIMER_STATE_STOPPED; vStatus = VOS_STATUS_E_ALREADY; break; case VOS_TIMER_STATE_STOPPED: vStatus = VOS_STATUS_E_ALREADY; break; case VOS_TIMER_STATE_UNUSED: vStatus = VOS_STATUS_E_EXISTS; break; case VOS_TIMER_STATE_RUNNING: // // timer->state = VOS_TIMER_STATE_STOPPED; // // // callback = timer->callback; userData = timer->userData; threadId = timer->platformInfo.threadID; type = timer->type; vStatus = VOS_STATUS_SUCCESS; break; default: VOS_ASSERT(0); vStatus = VOS_STATUS_E_FAULT; break; } spin_unlock_irqrestore( &timer->platformInfo.spinlock,flags ); if ( VOS_STATUS_SUCCESS != vStatus ) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "TIMER callback called in a wrong state=%d", timer->state); return; } tryAllowingSleep( type ); if (callback == NULL) { VOS_ASSERT(0); VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: No TIMER callback, Could not enqueue timer to any queue", __func__); return; } // if ( vos_sched_is_tx_thread( threadId ) ) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO, "TIMER callback: running on TX thread"); // sysBuildMessageHeader( SYS_MSG_ID_TX_TIMER, &msg ); msg.bodyptr = callback; msg.bodyval = (v_U32_t)userData; if(vos_tx_mq_serialize( VOS_MQ_ID_SYS, &msg ) == VOS_STATUS_SUCCESS) return; } else if ( vos_sched_is_rx_thread( threadId ) ) { VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO, "TIMER callback: running on RX thread"); // sysBuildMessageHeader( SYS_MSG_ID_RX_TIMER, &msg ); msg.bodyptr = callback; msg.bodyval = (v_U32_t)userData; if(vos_rx_mq_serialize( VOS_MQ_ID_SYS, &msg ) == VOS_STATUS_SUCCESS) return; } else { VOS_TRACE( VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO, "TIMER callback: running on MC thread"); // sysBuildMessageHeader( SYS_MSG_ID_MC_TIMER, &msg ); msg.bodyptr = callback; msg.bodyval = (v_U32_t)userData; if(vos_mq_post_message( VOS_MQ_ID_SYS, &msg ) == VOS_STATUS_SUCCESS) return; } VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: Could not enqueue timer to any queue", __func__); VOS_ASSERT(0); }