/*----------------------------------------------------------------------------*/ BOOLEAN cnmP2PIsPermitted ( P_ADAPTER_T prAdapter ) { P_BSS_INFO_T prBssInfo; UINT_8 i; BOOLEAN fgBowIsActive; ASSERT(prAdapter); fgBowIsActive= FALSE; for (i = 0; i < BSS_INFO_NUM; i++) { prBssInfo = prAdapter->aprBssInfo[i]; if (prBssInfo && IS_BSS_ACTIVE(prBssInfo)) { if (prBssInfo->eCurrentOPMode == OP_MODE_IBSS) { return FALSE; } else if (IS_BSS_BOW(prBssInfo)) { fgBowIsActive = TRUE; } } } #if CFG_ENABLE_BT_OVER_WIFI if (fgBowIsActive) { /* Notify BOW to do deactivation */ bowNotifyAllLinkDisconnected(prAdapter); } #endif return TRUE; }
/*----------------------------------------------------------------------------*/ VOID cnmAisInfraConnectNotify(P_ADAPTER_T prAdapter) { #if CFG_ENABLE_BT_OVER_WIFI P_BSS_INFO_T prBssInfo, prAisBssInfo, prBowBssInfo; UINT_8 i; ASSERT(prAdapter); prAisBssInfo = NULL; prBowBssInfo = NULL; for (i = 0; i < BSS_INFO_NUM; i++) { prBssInfo = prAdapter->aprBssInfo[i]; if (prBssInfo && IS_BSS_ACTIVE(prBssInfo)) { if (IS_BSS_AIS(prBssInfo)) { prAisBssInfo = prBssInfo; } else if (IS_BSS_BOW(prBssInfo)) { prBowBssInfo = prBssInfo; } } } if (prAisBssInfo && prBowBssInfo && RLM_NET_PARAM_VALID(prAisBssInfo) && RLM_NET_PARAM_VALID(prBowBssInfo)) { if (prAisBssInfo->eBand != prBowBssInfo->eBand || prAisBssInfo->ucPrimaryChannel != prBowBssInfo->ucPrimaryChannel) { /* Notify BOW to do deactivation */ bowNotifyAllLinkDisconnected(prAdapter); } } #endif }
/*----------------------------------------------------------------------------*/ VOID cnmChMngrHandleChEvent ( P_ADAPTER_T prAdapter, P_WIFI_EVENT_T prEvent ) { P_EVENT_CH_PRIVILEGE_T prEventBody; P_MSG_CH_GRANT_T prChResp; P_BSS_INFO_T prBssInfo; P_CNM_INFO_T prCnmInfo; ASSERT(prAdapter); ASSERT(prEvent); prEventBody = (P_EVENT_CH_PRIVILEGE_T) (prEvent->aucBuffer); prChResp = (P_MSG_CH_GRANT_T) cnmMemAlloc(prAdapter, RAM_TYPE_MSG, sizeof(MSG_CH_GRANT_T)); ASSERT(prChResp); /* To do: exception handle */ if (!prChResp) { DBGLOG(CNM, ERROR, ("ChGrant: fail to get buf (net=%d, token=%d)\n", prEventBody->ucBssIndex, prEventBody->ucTokenID)); return; } DBGLOG(CNM, INFO, ("ChGrant net=%d token=%d ch=%d sco=%d\n", prEventBody->ucBssIndex, prEventBody->ucTokenID, prEventBody->ucPrimaryChannel, prEventBody->ucRfSco)); ASSERT(prEventBody->ucBssIndex <= MAX_BSS_INDEX); ASSERT(prEventBody->ucStatus == EVENT_CH_STATUS_GRANT); prBssInfo = prAdapter->aprBssInfo[prEventBody->ucBssIndex]; /* Decide message ID based on network and response status */ if (IS_BSS_AIS(prBssInfo)) { prChResp->rMsgHdr.eMsgId = MID_CNM_AIS_CH_GRANT; } #if CFG_ENABLE_WIFI_DIRECT else if (prAdapter->fgIsP2PRegistered && IS_BSS_P2P(prBssInfo)) { prChResp->rMsgHdr.eMsgId = MID_CNM_P2P_CH_GRANT; } #endif #if CFG_ENABLE_BT_OVER_WIFI else if (IS_BSS_BOW(prBssInfo)) { prChResp->rMsgHdr.eMsgId = MID_CNM_BOW_CH_GRANT; } #endif else { cnmMemFree(prAdapter, prChResp); return; } prChResp->ucBssIndex = prEventBody->ucBssIndex; prChResp->ucTokenID = prEventBody->ucTokenID; prChResp->ucPrimaryChannel = prEventBody->ucPrimaryChannel; prChResp->eRfSco = (ENUM_CHNL_EXT_T) prEventBody->ucRfSco; prChResp->eRfBand = (ENUM_BAND_T) prEventBody->ucRfBand; prChResp->eRfChannelWidth = (ENUM_CHANNEL_WIDTH_T) prEventBody->ucRfChannelWidth; prChResp->ucRfCenterFreqSeg1 = prEventBody->ucRfCenterFreqSeg1; prChResp->ucRfCenterFreqSeg2 = prEventBody->ucRfCenterFreqSeg2; prChResp->eReqType = (ENUM_CH_REQ_TYPE_T) prEventBody->ucReqType; prChResp->u4GrantInterval = prEventBody->u4GrantInterval; mboxSendMsg(prAdapter, MBOX_ID_0, (P_MSG_HDR_T) prChResp, MSG_SEND_METHOD_BUF); /* Record current granted BSS for TXM's reference */ prCnmInfo = &prAdapter->rCnmInfo; prCnmInfo->ucBssIndex = prEventBody->ucBssIndex; prCnmInfo->ucTokenID = prEventBody->ucTokenID; prCnmInfo->fgChGranted = TRUE; }