/*------------------------------------------------------------------ * * Below function is called if pMac->fP2pListenOffload enabled and hdd * requests a remain on channel. * *------------------------------------------------------------------*/ static eHalStatus limSendHalReqRemainOnChanOffload(tpAniSirGlobal pMac, tSirRemainOnChnReq *pRemOnChnReq) { tSirScanOffloadReq *pScanOffloadReq; tSirMsgQ msg; tSirRetStatus rc = eSIR_SUCCESS; tANI_U8 bssid[SIR_MAC_ADDR_LENGTH] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; pScanOffloadReq = vos_mem_malloc(sizeof(tSirScanOffloadReq)); if (NULL == pScanOffloadReq) { limLog(pMac, LOGE, FL("Memory allocation failed for pScanOffloadReq")); return eHAL_STATUS_FAILURE; } vos_mem_zero(pScanOffloadReq, sizeof(tSirScanOffloadReq)); msg.type = WDA_START_SCAN_OFFLOAD_REQ; msg.bodyptr = pScanOffloadReq; msg.bodyval = 0; vos_mem_copy((tANI_U8 *) pScanOffloadReq->selfMacAddr, (tANI_U8 *) pRemOnChnReq->selfMacAddr, sizeof(tSirMacAddr)); vos_mem_copy((tANI_U8 *) pScanOffloadReq->bssId, (tANI_U8 *) bssid, sizeof(tSirMacAddr)); pScanOffloadReq->scanType = eSIR_PASSIVE_SCAN; pScanOffloadReq->p2pScanType = P2P_SCAN_TYPE_LISTEN; pScanOffloadReq->minChannelTime = pRemOnChnReq->duration; pScanOffloadReq->maxChannelTime = pRemOnChnReq->duration; pScanOffloadReq->sessionId = pRemOnChnReq->sessionId; pScanOffloadReq->channelList.numChannels = 1; pScanOffloadReq->channelList.channelNumber[0] = pRemOnChnReq->chnNum; limLog(pMac, LOG1, FL("Req-rem-on-channel: duration %u, session %hu, chan %hu"), pRemOnChnReq->duration, pRemOnChnReq->sessionId, pRemOnChnReq->chnNum); rc = wdaPostCtrlMsg(pMac, &msg); if (rc != eSIR_SUCCESS) { limLog(pMac, LOGE, FL("wdaPostCtrlMsg() return failure %u"), rc); vos_mem_free(pScanOffloadReq); return eHAL_STATUS_FAILURE; } pMac->lim.fOffloadScanPending = 1; pMac->lim.fOffloadScanP2PListen = 1; return eHAL_STATUS_SUCCESS; }
/** * limSendCFParams() * *FUNCTION: * This function is called to send CFP Parameters to WDA, when they are changed. * *LOGIC: * *ASSUMPTIONS: * NA * *NOTE: * NA * * @param pMac pointer to Global Mac structure. * @param bssIdx Bss Index of the BSS to which STA is associated. * @param cfpCount CFP Count, if that is changed. * @param cfpPeriod CFP Period if that is changed. * * @return success if message send is ok, else false. */ tSirRetStatus limSendCFParams(tpAniSirGlobal pMac, tANI_U8 bssIdx, tANI_U8 cfpCount, tANI_U8 cfpPeriod) { tpUpdateCFParams pCFParams = NULL; tSirRetStatus retCode = eSIR_SUCCESS; tSirMsgQ msgQ; if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **) &pCFParams, sizeof( tUpdateCFParams ))) { limLog( pMac, LOGP, FL( "Unable to PAL allocate memory during Update CF Params\n" )); retCode = eSIR_MEM_ALLOC_FAILED; goto returnFailure; } palZeroMemory( pMac->hHdd, (tANI_U8 *) pCFParams, sizeof(tUpdateCFParams)); pCFParams->cfpCount = cfpCount; pCFParams->cfpPeriod = cfpPeriod; pCFParams->bssIdx = bssIdx; msgQ.type = WDA_UPDATE_CF_IND; msgQ.reserved = 0; msgQ.bodyptr = pCFParams; msgQ.bodyval = 0; limLog( pMac, LOG3, FL( "Sending WDA_UPDATE_CF_IND..." )); MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type)); if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ ))) { palFreeMemory(pMac->hHdd, pCFParams); limLog( pMac, LOGP, FL("Posting WDA_UPDATE_CF_IND to WDA failed, reason=%X\n"), retCode ); } returnFailure: return retCode; }
/** * limSendCFParams() * *FUNCTION: * This function is called to send CFP Parameters to WDA, when they are changed. * *LOGIC: * *ASSUMPTIONS: * NA * *NOTE: * NA * * @param pMac pointer to Global Mac structure. * @param bssIdx Bss Index of the BSS to which STA is associated. * @param cfpCount CFP Count, if that is changed. * @param cfpPeriod CFP Period if that is changed. * * @return success if message send is ok, else false. */ tSirRetStatus limSendCFParams(tpAniSirGlobal pMac, tANI_U8 bssIdx, tANI_U8 cfpCount, tANI_U8 cfpPeriod) { tpUpdateCFParams pCFParams = NULL; tSirRetStatus retCode = eSIR_SUCCESS; tSirMsgQ msgQ; pCFParams = vos_mem_malloc(sizeof( tUpdateCFParams )); if ( NULL == pCFParams ) { limLog( pMac, LOGP, FL( "Unable to allocate memory during Update CF Params" )); retCode = eSIR_MEM_ALLOC_FAILED; goto returnFailure; } vos_mem_set( (tANI_U8 *) pCFParams, sizeof(tUpdateCFParams), 0); pCFParams->cfpCount = cfpCount; pCFParams->cfpPeriod = cfpPeriod; pCFParams->bssIdx = bssIdx; msgQ.type = WDA_UPDATE_CF_IND; msgQ.reserved = 0; msgQ.bodyptr = pCFParams; msgQ.bodyval = 0; limLog( pMac, LOG3, FL( "Sending WDA_UPDATE_CF_IND..." )); MTRACE(macTraceMsgTx(pMac, NO_SESSION, msgQ.type)); if( eSIR_SUCCESS != (retCode = wdaPostCtrlMsg( pMac, &msgQ ))) { vos_mem_free(pCFParams); limLog( pMac, LOGP, FL("Posting WDA_UPDATE_CF_IND to WDA failed, reason=%X"), retCode ); } returnFailure: return retCode; }
tSirRetStatus uMacPostCtrlMsg(void* pSirGlobal, tSirMbMsg* pMb) { tSirMsgQ msg; tpAniSirGlobal pMac = (tpAniSirGlobal)pSirGlobal; tSirMbMsg* pMbLocal; msg.type = pMb->type; msg.bodyval = 0; WDALOG3(wdaLog(pMac, LOG3, FL("msgType %d, msgLen %d\n" ), pMb->type, pMb->msgLen)); // copy the message from host buffer to firmware buffer // this will make sure that firmware allocates, uses and frees // it's own buffers for mailbox message instead of working on // host buffer // second parameter, 'wait option', to palAllocateMemory is ignored on Windows if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pMbLocal, pMb->msgLen)) { WDALOGE( wdaLog(pMac, LOGE, FL("Buffer Allocation failed!\n"))); return eSIR_FAILURE; } palCopyMemory(pMac, (void *)pMbLocal, (void *)pMb, pMb->msgLen); msg.bodyptr = pMbLocal; switch (msg.type & HAL_MMH_MB_MSG_TYPE_MASK) { case WDA_MSG_TYPES_BEGIN: // Posts a message to the HAL MsgQ wdaPostCtrlMsg(pMac, &msg); break; case SIR_LIM_MSG_TYPES_BEGIN: // Posts a message to the LIM MsgQ limPostMsgApi(pMac, &msg); break; case SIR_CFG_MSG_TYPES_BEGIN: // Posts a message to the CFG MsgQ wdaPostCfgMsg(pMac, &msg); break; case SIR_PMM_MSG_TYPES_BEGIN: // Posts a message to the PMM MsgQ pmmPostMessage(pMac, &msg); break; case SIR_PTT_MSG_TYPES_BEGIN: WDALOGW( wdaLog(pMac, LOGW, FL("%s:%d: message type = 0x%X"), __func__, __LINE__, msg.type)); vos_mem_free(msg.bodyptr); break; default: WDALOGW( wdaLog(pMac, LOGW, FL("Unknown message type = " "0x%X\n"), msg.type)); // Release the memory. if (palFreeMemory( pMac->hHdd, (void*)(msg.bodyptr)) != eHAL_STATUS_SUCCESS) { WDALOGE( wdaLog(pMac, LOGE, FL("Buffer Allocation failed!\n"))); return eSIR_FAILURE; } break; } return eSIR_SUCCESS; } // uMacPostCtrlMsg()
tSirRetStatus uMacPostCtrlMsg(void* pSirGlobal, tSirMbMsg* pMb) { tSirMsgQ msg; tpAniSirGlobal pMac = (tpAniSirGlobal)pSirGlobal; #ifdef ANI_OS_TYPE_RTAI_LINUX msg.type = pMb->type; msg.bodyptr = pMb; msg.bodyval = 0; WDALOG3( wdaLog(pMac, LOG3, FL("msgType %d, msgLen %d\n" ), pMb->type, pMb->msgLen)); #else tSirMbMsg* pMbLocal; msg.type = pMb->type; msg.bodyval = 0; WDALOG3(wdaLog(pMac, LOG3, FL("msgType %d, msgLen %d\n" ), pMb->type, pMb->msgLen)); // copy the message from host buffer to firmware buffer // this will make sure that firmware allocates, uses and frees // it's own buffers for mailbox message instead of working on // host buffer // second parameter, 'wait option', to palAllocateMemory is ignored on Windows if( eHAL_STATUS_SUCCESS != palAllocateMemory( pMac->hHdd, (void **)&pMbLocal, pMb->msgLen)) { WDALOGE( wdaLog(pMac, LOGE, FL("Buffer Allocation failed!\n"))); return eSIR_FAILURE; } palCopyMemory(pMac, (void *)pMbLocal, (void *)pMb, pMb->msgLen); msg.bodyptr = pMbLocal; #endif switch (msg.type & HAL_MMH_MB_MSG_TYPE_MASK) { case WDA_MSG_TYPES_BEGIN: // Posts a message to the HAL MsgQ wdaPostCtrlMsg(pMac, &msg); break; case SIR_LIM_MSG_TYPES_BEGIN: // Posts a message to the LIM MsgQ limPostMsgApi(pMac, &msg); break; case SIR_CFG_MSG_TYPES_BEGIN: // Posts a message to the CFG MsgQ wdaPostCfgMsg(pMac, &msg); break; case SIR_PMM_MSG_TYPES_BEGIN: // Posts a message to the PMM MsgQ pmmPostMessage(pMac, &msg); break; #if defined(ANI_MANF_DIAG) || defined(ANI_PHY_DEBUG) case SIR_PTT_MSG_TYPES_BEGIN: #ifndef FEATURE_WLAN_INTEGRATED_SOC halNimPTTPostMsgApi(pMac, &msg); // Posts a message to the NIM PTT MsgQ #endif /* FEATURE_WLAN_INTEGRATED_SOC */ break; #endif default: WDALOGW( wdaLog(pMac, LOGW, FL("Unknown message type = " "0x%X\n"), msg.type)); // Release the memory. if (palFreeMemory( pMac->hHdd, (void*)(msg.bodyptr)) != eHAL_STATUS_SUCCESS) { WDALOGE( wdaLog(pMac, LOGE, FL("Buffer Allocation failed!\n"))); return eSIR_FAILURE; } break; } return eSIR_SUCCESS; } // uMacPostCtrlMsg()