VOID odm_RSSIMonitorCheckCE( IN PVOID pDM_VOID ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PADAPTER Adapter = pDM_Odm->Adapter; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); struct dm_priv *pdmpriv = &pHalData->dmpriv; struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(Adapter); int i; int tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff; u8 sta_cnt=0; u32 UL_DL_STATE = 0, STBC_TX = 0, TxBF_EN = 0; u32 PWDB_rssi[NUM_STA]={0};//[0~15]:MACID, [16~31]:PWDB_rssi BOOLEAN FirstConnect = FALSE; pRA_T pRA_Table = &pDM_Odm->DM_RA_Table; if(pDM_Odm->bLinked != _TRUE) return; FirstConnect = (pDM_Odm->bLinked) && (pRA_Table->firstconnect == FALSE); pRA_Table->firstconnect = pDM_Odm->bLinked; { struct sta_info *psta; for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) { if (IS_STA_VALID(psta = pDM_Odm->pODM_StaInfo[i])) { if(IS_MCAST( psta->hwaddr)) //if(psta->mac_id ==1) continue; if(psta->rssi_stat.UndecoratedSmoothedPWDB == (-1)) continue; if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB) tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; if(psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB) tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; if(psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)) { #ifdef CONFIG_80211N_HT if(pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812) { #ifdef CONFIG_BEAMFORMING BEAMFORMING_CAP Beamform_cap = beamforming_get_entry_beam_cap_by_mac_id(&Adapter->mlmepriv, psta->mac_id); if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU)) TxBF_EN = 1; else TxBF_EN = 0; if (TxBF_EN) { STBC_TX = 0; } else #endif { #ifdef CONFIG_80211AC_VHT if(IsSupportedVHT(psta->wireless_mode)) STBC_TX = TEST_FLAG(psta->vhtpriv.stbc_cap, STBC_VHT_ENABLE_TX); else #endif STBC_TX = TEST_FLAG(psta->htpriv.stbc_cap, STBC_HT_ENABLE_TX); } } #endif if(pDM_Odm->SupportICType == ODM_RTL8192D) PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) | ((Adapter->stapriv.asoc_sta_count+1) << 8)); else if ((pDM_Odm->SupportICType == ODM_RTL8192E)||(pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821)) PWDB_rssi[sta_cnt++] = (((u8)(psta->mac_id&0xFF)) | ((psta->rssi_stat.UndecoratedSmoothedPWDB&0x7F)<<16) |(STBC_TX << 25) | (FirstConnect << 29) | (TxBF_EN << 30)); else PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) ); } } } for(i=0; i< sta_cnt; i++) { if(PWDB_rssi[i] != (0)){ if(pHalData->fw_ractrl == _TRUE)// Report every sta's RSSI to FW { if(pDM_Odm->SupportICType == ODM_RTL8723B){ rtl8723b_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i])); } } } } } if(tmpEntryMaxPWDB != 0) // If associated entry is found { pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB; } else { pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0; } if(tmpEntryMinPWDB != 0xff) // If associated entry is found { pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB; } else { pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0; } FindMinimumRSSI(Adapter);//get pdmpriv->MinUndecoratedPWDBForDM pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM; }
#ifdef CONFIG_80211N_HT if (pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812) { #ifdef CONFIG_BEAMFORMING BEAMFORMING_CAP Beamform_cap = beamforming_get_entry_beam_cap_by_mac_id(&Adapter->mlmepriv, psta->mac_id); if (Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU)) TxBF_EN = 1; else TxBF_EN = 0; if (TxBF_EN) STBC_TX = 0; else #endif { #ifdef CONFIG_80211AC_VHT if (IsSupportedVHT(psta->wireless_mode)) STBC_TX = TEST_FLAG(psta->vhtpriv.stbc_cap, STBC_VHT_ENABLE_TX); else #endif STBC_TX = TEST_FLAG(psta->htpriv.stbc_cap, STBC_HT_ENABLE_TX); } }