BOOLEAN odm_IsConnected_92C( IN PADAPTER Adapter ) { PRT_WLAN_STA pEntry; PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); u4Byte i; BOOLEAN bConnected=FALSE; if(pMgntInfo->mAssoc) { bConnected = TRUE; } else { for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) { if(IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL) pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i); else pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i); if(pEntry!=NULL) { if(pEntry->bAssociated) { bConnected = TRUE; break; } } else { break; } } } return bConnected; }
VOID odm_CCKTXPathDiversity_92C( IN PADAPTER Adapter ) { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); PRT_WLAN_STA pEntry; s4Byte MinRSSI = 0xFF; u1Byte i, DefaultRespPath = 0; // BOOLEAN bBModePathDiv = FALSE; pPD_T pDM_PDTable = &Adapter->DM_PDTable; //1 Default Port if(pMgntInfo->mAssoc) { if(pHalData->OFDM_Pkt_Cnt == 0) { for(i=0; i<2; i++) { if(pDM_PDTable->RSSI_CCK_Path_cnt[i] > 1) //Because the first packet is discarded pDM_PDTable->RSSI_CCK_Path[i] = pDM_PDTable->RSSI_CCK_Path[i] / (pDM_PDTable->RSSI_CCK_Path_cnt[i]-1); else pDM_PDTable->RSSI_CCK_Path[i] = 0; } RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: pDM_PDTable->RSSI_CCK_Path[0]=%d, pDM_PDTable->RSSI_CCK_Path[1]=%d\n", pDM_PDTable->RSSI_CCK_Path[0], pDM_PDTable->RSSI_CCK_Path[1])); RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: pDM_PDTable->RSSI_CCK_Path_cnt[0]=%d, pDM_PDTable->RSSI_CCK_Path_cnt[1]=%d\n", pDM_PDTable->RSSI_CCK_Path_cnt[0], pDM_PDTable->RSSI_CCK_Path_cnt[1])); if(pDM_PDTable->RSSI_CCK_Path[0] > pDM_PDTable->RSSI_CCK_Path[1]) { pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & (~BIT0); MinRSSI = pDM_PDTable->RSSI_CCK_Path[1]; DefaultRespPath = 0; RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-0\n")); } else if(pDM_PDTable->RSSI_CCK_Path[0] < pDM_PDTable->RSSI_CCK_Path[1]) { pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath | BIT0; MinRSSI = pDM_PDTable->RSSI_CCK_Path[0]; DefaultRespPath = 1; RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-1\n")); } else { if((pDM_PDTable->RSSI_CCK_Path[0] != 0) && (pDM_PDTable->RSSI_CCK_Path[0] < MinRSSI)) { pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & (~BIT0); RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port Select CCK Path-0\n")); MinRSSI = pDM_PDTable->RSSI_CCK_Path[1]; DefaultRespPath = 0; } else { RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Default port unchange CCK Path\n")); } } } else //Follow OFDM decision { pDM_PDTable->CCKTXPath = (pDM_PDTable->CCKTXPath & (~BIT0)) | (pDM_PDTable->OFDMTXPath &BIT0); RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Follow OFDM decision, Default port Select CCK Path-%d\n", pDM_PDTable->CCKTXPath &BIT0)); } } //1 Extension Port for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) { if(IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL) pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i); else pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i); if(pEntry!=NULL) { if(pEntry->bAssociated) { if(pEntry->rssi_stat.OFDM_Pkt_Cnt == 0) { u1Byte j=0; for(j=0; j<2; j++) { if(pEntry->rssi_stat.RSSI_CCK_Path_cnt[j] > 1) pEntry->rssi_stat.RSSI_CCK_Path[j] = pEntry->rssi_stat.RSSI_CCK_Path[j] / (pEntry->rssi_stat.RSSI_CCK_Path_cnt[j]-1); else pEntry->rssi_stat.RSSI_CCK_Path[j] = 0; } RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d, RSSI_CCK0=%d, RSSI_CCK1=%d\n", pEntry->AssociatedMacId, pEntry->rssi_stat.RSSI_CCK_Path[0], pEntry->rssi_stat.RSSI_CCK_Path[1])); if(pEntry->rssi_stat.RSSI_CCK_Path[0] >pEntry->rssi_stat.RSSI_CCK_Path[1]) { pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & ~(BIT(pEntry->AssociatedMacId)); RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-0\n", pEntry->AssociatedMacId)); if(pEntry->rssi_stat.RSSI_CCK_Path[1] < MinRSSI) { MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[1]; DefaultRespPath = 0; } } else if(pEntry->rssi_stat.RSSI_CCK_Path[0] <pEntry->rssi_stat.RSSI_CCK_Path[1]) { pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath | BIT(pEntry->AssociatedMacId); RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-1\n", pEntry->AssociatedMacId)); if(pEntry->rssi_stat.RSSI_CCK_Path[0] < MinRSSI) { MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[0]; DefaultRespPath = 1; } } else { if((pEntry->rssi_stat.RSSI_CCK_Path[0] != 0) && (pEntry->rssi_stat.RSSI_CCK_Path[0] < MinRSSI)) { pDM_PDTable->CCKTXPath = pDM_PDTable->CCKTXPath & ~(BIT(pEntry->AssociatedMacId)); MinRSSI = pEntry->rssi_stat.RSSI_CCK_Path[1]; DefaultRespPath = 0; RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d Select CCK Path-0\n", pEntry->AssociatedMacId)); } else { RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: MACID=%d unchange CCK Path\n", pEntry->AssociatedMacId)); } } } else //Follow OFDM decision { pDM_PDTable->CCKTXPath = (pDM_PDTable->CCKTXPath & (~(BIT(pEntry->AssociatedMacId)))) | (pDM_PDTable->OFDMTXPath & BIT(pEntry->AssociatedMacId)); RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_CCKTXPathDiversity_92C: Follow OFDM decision, MACID=%d Select CCK Path-%d\n", pEntry->AssociatedMacId, (pDM_PDTable->CCKTXPath & BIT(pEntry->AssociatedMacId))>>(pEntry->AssociatedMacId))); } } } else { break; } }
VOID odm_DynamicPrimaryCCA( IN PDM_ODM_T pDM_Odm ) { PADAPTER Adapter = pDM_Odm->Adapter; // for NIC #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN)) PRT_WLAN_STA pEntry; #endif PFALSE_ALARM_STATISTICS FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm , PHYDM_FALSEALMCNT); pPri_CCA_T PrimaryCCA = &(pDM_Odm->DM_PriCCA); BOOLEAN Is40MHz; BOOLEAN Client_40MHz = FALSE, Client_tmp = FALSE; // connected client BW BOOLEAN bConnected = FALSE; // connected or not static u1Byte Client_40MHz_pre = 0; static u8Byte lastTxOkCnt = 0; static u8Byte lastRxOkCnt = 0; static u4Byte Counter = 0; static u1Byte Delay = 1; u8Byte curTxOkCnt; u8Byte curRxOkCnt; u1Byte SecCHOffset; u1Byte i; if(!(pDM_Odm->SupportAbility & ODM_BB_PRIMARY_CCA)) return; #if((DM_ODM_SUPPORT_TYPE==ODM_ADSL) ||( DM_ODM_SUPPORT_TYPE==ODM_CE)) return; #else if(pDM_Odm->SupportICType != ODM_RTL8188E) return; Is40MHz = *(pDM_Odm->pBandWidth); SecCHOffset = *(pDM_Odm->pSecChOffset); ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Second CH Offset = %d\n", SecCHOffset)); #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) if(Is40MHz==1) SecCHOffset = SecCHOffset%2+1; // NIC's definition is reverse to AP 1:secondary below, 2: secondary above ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Second CH Offset = %d\n", SecCHOffset)); //3 Check Current WLAN Traffic curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - lastTxOkCnt; curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - lastRxOkCnt; lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast; lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast; #elif (DM_ODM_SUPPORT_TYPE == ODM_AP) //3 Check Current WLAN Traffic curTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast)-lastTxOkCnt; curRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast)-lastRxOkCnt; lastTxOkCnt = *(pDM_Odm->pNumTxBytesUnicast); lastRxOkCnt = *(pDM_Odm->pNumRxBytesUnicast); #endif //==================Debug Message==================== ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("TP = %llu\n", curTxOkCnt+curRxOkCnt)); ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Is40MHz = %d\n", Is40MHz)); ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("BW_LSC = %d\n", FalseAlmCnt->Cnt_BW_LSC)); ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("BW_USC = %d\n", FalseAlmCnt->Cnt_BW_USC)); ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("CCA OFDM = %d\n", FalseAlmCnt->Cnt_OFDM_CCA)); ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("CCA CCK = %d\n", FalseAlmCnt->Cnt_CCK_CCA)); ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("OFDM FA = %d\n", FalseAlmCnt->Cnt_Ofdm_fail)); ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("CCK FA = %d\n", FalseAlmCnt->Cnt_Cck_fail)); //================================================ #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) if (ACTING_AS_AP(Adapter)) // primary cca process only do at AP mode #endif { #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("ACTING as AP mode=%d\n", ACTING_AS_AP(Adapter))); //3 To get entry's connection and BW infomation status. for(i=0;i<ASSOCIATE_ENTRY_NUM;i++) { if(IsAPModeExist(Adapter)&&GetFirstExtAdapter(Adapter)!=NULL) pEntry=AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i); else pEntry=AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i); if(pEntry!=NULL) { Client_tmp = pEntry->BandWidth; // client BW ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Client_BW=%d\n", Client_tmp)); if(Client_tmp>Client_40MHz) Client_40MHz = Client_tmp; // 40M/20M coexist => 40M priority is High if(pEntry->bAssociated) { bConnected=TRUE; // client is connected or not break; } } else { break; } } #elif (DM_ODM_SUPPORT_TYPE == ODM_AP) //3 To get entry's connection and BW infomation status. PSTA_INFO_T pstat; for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) { pstat = pDM_Odm->pODM_StaInfo[i]; if(IS_STA_VALID(pstat) ) { Client_tmp = pstat->tx_bw; if(Client_tmp>Client_40MHz) Client_40MHz = Client_tmp; // 40M/20M coexist => 40M priority is High bConnected = TRUE; } } #endif ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("bConnected=%d\n", bConnected)); ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_PRICCA, ODM_DBG_LOUD, ("Is Client 40MHz=%d\n", Client_40MHz)); //1 Monitor whether the interference exists or not if(PrimaryCCA->Monitor_flag == 1) { if(SecCHOffset == 1) // secondary channel is below the primary channel { if((FalseAlmCnt->Cnt_OFDM_CCA > 500)&&(FalseAlmCnt->Cnt_BW_LSC > FalseAlmCnt->Cnt_BW_USC+500)) { if(FalseAlmCnt->Cnt_Ofdm_fail > FalseAlmCnt->Cnt_OFDM_CCA>>1) { PrimaryCCA->intf_type = 1; PrimaryCCA->PriCCA_flag = 1; ODM_SetBBReg(pDM_Odm, 0xc6c, BIT8|BIT7, 2); // USC MF if(PrimaryCCA->DupRTS_flag == 1) PrimaryCCA->DupRTS_flag = 0; } else { PrimaryCCA->intf_type = 2; if(PrimaryCCA->DupRTS_flag == 0) PrimaryCCA->DupRTS_flag = 1; } } else // interferecne disappear { PrimaryCCA->DupRTS_flag = 0; PrimaryCCA->intf_flag = 0; PrimaryCCA->intf_type = 0; } } else if(SecCHOffset == 2) // secondary channel is above the primary channel
VOID odm_OFDMTXPathDiversity_92C( IN PADAPTER Adapter) { // HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); PRT_WLAN_STA pEntry; u1Byte i, DefaultRespPath = 0; s4Byte MinRSSI = 0xFF; pPD_T pDM_PDTable = &Adapter->DM_PDTable; pDM_PDTable->OFDMTXPath = 0; //1 Default Port if(pMgntInfo->mAssoc) { RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port RSSI[0]=%d, RSSI[1]=%d\n", Adapter->RxStats.RxRSSIPercentage[0], Adapter->RxStats.RxRSSIPercentage[1])); if(Adapter->RxStats.RxRSSIPercentage[0] > Adapter->RxStats.RxRSSIPercentage[1]) { pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath & (~BIT0); MinRSSI = Adapter->RxStats.RxRSSIPercentage[1]; DefaultRespPath = 0; RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port Select Path-0\n")); } else { pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath | BIT0; MinRSSI = Adapter->RxStats.RxRSSIPercentage[0]; DefaultRespPath = 1; RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: Default port Select Path-1\n")); } //RT_TRACE( COMP_INIT, DBG_LOUD, ("pDM_PDTable->OFDMTXPath =0x%x\n",pDM_PDTable->OFDMTXPath)); } //1 Extension Port for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) { if(IsAPModeExist(Adapter) && GetFirstExtAdapter(Adapter) != NULL) pEntry = AsocEntry_EnumStation(GetFirstExtAdapter(Adapter), i); else pEntry = AsocEntry_EnumStation(GetDefaultAdapter(Adapter), i); if(pEntry!=NULL) { if(pEntry->bAssociated) { RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d, RSSI_0=%d, RSSI_1=%d\n", pEntry->AssociatedMacId, pEntry->rssi_stat.RxRSSIPercentage[0], pEntry->rssi_stat.RxRSSIPercentage[1])); if(pEntry->rssi_stat.RxRSSIPercentage[0] > pEntry->rssi_stat.RxRSSIPercentage[1]) { pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath & ~(BIT(pEntry->AssociatedMacId)); //pHalData->TXPath = pHalData->TXPath & ~(1<<(pEntry->AssociatedMacId)); RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d Select Path-0\n", pEntry->AssociatedMacId)); if(pEntry->rssi_stat.RxRSSIPercentage[1] < MinRSSI) { MinRSSI = pEntry->rssi_stat.RxRSSIPercentage[1]; DefaultRespPath = 0; } } else { pDM_PDTable->OFDMTXPath = pDM_PDTable->OFDMTXPath | BIT(pEntry->AssociatedMacId); //pHalData->TXPath = pHalData->TXPath | (1 << (pEntry->AssociatedMacId)); RT_TRACE( COMP_INIT, DBG_LOUD, ("odm_OFDMTXPathDiversity_92C: MACID=%d Select Path-1\n", pEntry->AssociatedMacId)); if(pEntry->rssi_stat.RxRSSIPercentage[0] < MinRSSI) { MinRSSI = pEntry->rssi_stat.RxRSSIPercentage[0]; DefaultRespPath = 1; } } } } else { break; } } pDM_PDTable->OFDMDefaultRespPath = DefaultRespPath; }
VOID odm_DIG_8723( IN PDM_ODM_T pDM_Odm ) { pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable; PFALSE_ALARM_STATISTICS pFalseAlmCnt = &pDM_Odm->FalseAlmCnt; //pRXHP_T pRX_HP_Table = &pDM_Odm->DM_RXHP_Table; u1Byte DIG_Dynamic_MIN; BOOLEAN FirstConnect, FirstDisConnect; u1Byte dm_dig_max, dm_dig_min; u1Byte CurrentIGI = pDM_DigTable->CurIGValue; #if (DM_ODM_SUPPORT_TYPE == ODM_MP) // This should be moved out of OUTSRC PADAPTER pAdapter = pDM_Odm->Adapter; #if OS_WIN_FROM_WIN7(OS_VERSION) if(IsAPModeExist( pAdapter) && pAdapter->bInHctTest) { ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: Is AP mode or In HCT Test \n")); return; } #endif if(pDM_Odm->bBtHsOperation) { odm8723b_DigForBtHsMode(pDM_Odm); } #if 0 // Neil Chen No RX HP for 8723 if(!(pDM_Odm->SupportICType &(ODM_RTL8723A|ODM_RTL8188E))) { if(pRX_HP_Table->RXHP_flag == 1) { ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: In RXHP Operation \n")); return; } } #endif #endif #if 0 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) prtl8192cd_priv priv = pDM_Odm->priv; if (!((priv->up_time > 5) && (priv->up_time % 2)) ) { ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: Not In DIG Operation Period \n")); return; } #endif #endif ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG()==>\n")); //if(!(pDM_Odm->SupportAbility & (ODM_BB_DIG|ODM_BB_FA_CNT))) if((!(pDM_Odm->SupportAbility&ODM_BB_DIG)) ||(!(pDM_Odm->SupportAbility&ODM_BB_FA_CNT))) { #if 0 if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL)) { if ((pDM_Odm->SupportICType == ODM_RTL8192C) && (pDM_Odm->ExtLNA == 1)) CurrentIGI = 0x30; //pDM_DigTable->CurIGValue = 0x30; else CurrentIGI = 0x20; //pDM_DigTable->CurIGValue = 0x20; ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue); } #endif ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: SupportAbility ODM_BB_DIG or ODM_BB_FA_CNT is disabled\n")); return; } if(*(pDM_Odm->pbScanInProcess)) { ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: In Scan Progress \n")); return; } //add by Neil Chen to avoid PSD is processing if(pDM_Odm->SupportICType&(ODM_RTL8723A|ODM_RTL8723B)) { if(pDM_Odm->bDMInitialGainEnable == FALSE) { ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() Return: PSD is Processing \n")); return; } } DIG_Dynamic_MIN = pDM_DigTable->DIG_Dynamic_MIN_0; FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE); FirstDisConnect = (!pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == TRUE); #if 0 if(pDM_Odm->SupportICType & (ODM_RTL8192C) &&(pDM_Odm->BoardType & (ODM_BOARD_EXT_LNA | ODM_BOARD_EXT_PA))) { if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL)) { dm_dig_max = DM_DIG_MAX_AP_HP; dm_dig_min = DM_DIG_MIN_AP_HP; } else { dm_dig_max = DM_DIG_MAX_NIC_HP; dm_dig_min = DM_DIG_MIN_NIC_HP; } DIG_MaxOfMin = DM_DIG_MAX_AP_HP; } else { if(pDM_Odm->SupportPlatform & (ODM_AP|ODM_ADSL)) { #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL)) #ifdef DFS if (!priv->pmib->dot11DFSEntry.disable_DFS && (OPMODE & WIFI_AP_STATE) && (((pDM_Odm->ControlChannel >= 52) && (pDM_Odm->ControlChannel <= 64)) || ((pDM_Odm->ControlChannel >= 100) && (pDM_Odm->ControlChannel <= 140)))) dm_dig_max = 0x24; else #endif if (priv->pmib->dot11RFEntry.tx2path) { if (*(pDM_Odm->pWirelessMode) == ODM_WM_B)//(priv->pmib->dot11BssType.net_work_type == WIRELESS_11B) dm_dig_max = 0x2A; else dm_dig_max = 0x32; } else #endif dm_dig_max = DM_DIG_MAX_AP; dm_dig_min = DM_DIG_MIN_AP; DIG_MaxOfMin = dm_dig_max; } else { if((pDM_Odm->SupportICType >= ODM_RTL8188E) && (pDM_Odm->SupportPlatform & (ODM_MP|ODM_CE))) dm_dig_max = 0x5A; else dm_dig_max = DM_DIG_MAX_NIC; dm_dig_min = DM_DIG_MIN_NIC; DIG_MaxOfMin = DM_DIG_MAX_AP; } } #endif // masked by neilchen to simpily 8723B case ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): RSSI=0x%x\n",pDM_Odm->RSSI_Min)); if((pDM_Odm->SupportICType >= ODM_RTL8723B) && (pDM_Odm->SupportPlatform & (ODM_MP|ODM_CE))) dm_dig_max = 0x5A; else dm_dig_max = DM_DIG_MAX_NIC; dm_dig_min = DM_DIG_MIN_NIC_8723; if(pDM_Odm->bLinked) { if(pDM_Odm->SupportICType&(ODM_RTL8723B)) { //BT is Concurrent if(pDM_Odm->bBtLimitedDig) { if(( pDM_Odm->RSSI_Min + 10) > DM_DIG_MAX_NIC ) pDM_DigTable->rx_gain_range_max = DM_DIG_MAX_NIC; else if(( pDM_Odm->RSSI_Min + 10) < DM_DIG_MIN_NIC ) pDM_DigTable->rx_gain_range_max = DM_DIG_MIN_NIC; else pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 10; if(pDM_Odm->RSSI_Min>10) { if((pDM_Odm->RSSI_Min - 10) > DM_DIG_MAX_NIC) DIG_Dynamic_MIN = DM_DIG_MAX_NIC; else if((pDM_Odm->RSSI_Min - 10) < DM_DIG_MIN_NIC_8723) DIG_Dynamic_MIN = DM_DIG_MIN_NIC_8723; else DIG_Dynamic_MIN = pDM_Odm->RSSI_Min - 10; } else DIG_Dynamic_MIN=DM_DIG_MIN_NIC_8723; } else { if((pDM_Odm->RSSI_Min + 20) > dm_dig_max ) pDM_DigTable->rx_gain_range_max = dm_dig_max; else if((pDM_Odm->RSSI_Min + 20) < dm_dig_min ) pDM_DigTable->rx_gain_range_max = dm_dig_min; else pDM_DigTable->rx_gain_range_max = pDM_Odm->RSSI_Min + 20; if(pDM_Odm->RSSI_Min>20) { if((pDM_Odm->RSSI_Min - 20) > DM_DIG_MAX_NIC) DIG_Dynamic_MIN = DM_DIG_MAX_NIC; else if((pDM_Odm->RSSI_Min - 20) < DM_DIG_MIN_NIC_8723) DIG_Dynamic_MIN = DM_DIG_MIN_NIC_8723; else DIG_Dynamic_MIN = pDM_Odm->RSSI_Min -20; } else DIG_Dynamic_MIN=DM_DIG_MIN_NIC_8723; } } } else { pDM_DigTable->rx_gain_range_max = dm_dig_max; pDM_DigTable->rx_gain_range_min = DM_DIG_MIN_NIC_8723; DIG_Dynamic_MIN = dm_dig_min; ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG() : No Link\n")); } #if 0 if(pFalseAlmCnt->Cnt_all > 10000) { ODM_RT_TRACE(pDM_Odm,ODM_COMP_DIG, ODM_DBG_LOUD, ("dm_DIG(): Abnornally false alarm case. \n")); if(pDM_DigTable->LargeFAHit != 3) pDM_DigTable->LargeFAHit++; if(pDM_DigTable->ForbiddenIGI < CurrentIGI)//if(pDM_DigTable->ForbiddenIGI < pDM_DigTable->CurIGValue) { pDM_DigTable->ForbiddenIGI = CurrentIGI;//pDM_DigTable->ForbiddenIGI = pDM_DigTable->CurIGValue; pDM_DigTable->LargeFAHit = 1; } if(pDM_DigTable->LargeFAHit >= 3) { if((pDM_DigTable->ForbiddenIGI+1) >pDM_DigTable->rx_gain_range_max) pDM_DigTable->rx_gain_range_min = pDM_DigTable->rx_gain_range_max; else pDM_DigTable->rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 1); pDM_DigTable->Recover_cnt = 3600; //3600=2hr } } else { //Recovery mechanism for IGI lower bound if(pDM_DigTable->Recover_cnt != 0) pDM_DigTable->Recover_cnt --; else { if(pDM_DigTable->LargeFAHit < 3) { if((pDM_DigTable->ForbiddenIGI -1) < DIG_Dynamic_MIN) //DM_DIG_MIN) { pDM_DigTable->ForbiddenIGI = DIG_Dynamic_MIN; //DM_DIG_MIN; pDM_DigTable->rx_gain_range_min = DIG_Dynamic_MIN; //DM_DIG_MIN; ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: At Lower Bound\n")); } else { pDM_DigTable->ForbiddenIGI --; pDM_DigTable->rx_gain_range_min = (pDM_DigTable->ForbiddenIGI + 1); ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): Normal Case: Approach Lower Bound\n")); } } else { pDM_DigTable->LargeFAHit = 0; } } } ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): pDM_DigTable->LargeFAHit=%d\n",pDM_DigTable->LargeFAHit)); #endif ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG():pDM_DigTable->Recover_cnt=%d\n",pDM_DigTable->Recover_cnt)); //1 Adjust initial gain by false alarm if(pDM_Odm->bLinked) { ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG AfterLink\n")); if(FirstConnect) { CurrentIGI = pDM_Odm->RSSI_Min; ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("DIG: First Connect\n")); } else { //FA for Combo IC--NeilChen--2012--09--28 if(pDM_Odm->SupportICType == ODM_RTL8723B) { //WLAN and BT ConCurrent if(pDM_Odm->bBtLimitedDig) { if(pFalseAlmCnt->Cnt_all > 0x500) CurrentIGI = CurrentIGI + 4; else if (pFalseAlmCnt->Cnt_all > 0x300) CurrentIGI = CurrentIGI + 2; else if(pFalseAlmCnt->Cnt_all <0x150) CurrentIGI = CurrentIGI -2; } else //Not Concurrent { if(pFalseAlmCnt->Cnt_all > 0x400) CurrentIGI = CurrentIGI + 4;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+2; else if (pFalseAlmCnt->Cnt_all > 0x200) CurrentIGI = CurrentIGI + 2;//pDM_DigTable->CurIGValue = pDM_DigTable->PreIGValue+1; else if(pFalseAlmCnt->Cnt_all < 0x100) CurrentIGI = CurrentIGI - 2;//pDM_DigTable->CurIGValue =pDM_DigTable->PreIGValue-1; } } } } else { CurrentIGI = pDM_DigTable->rx_gain_range_min;//pDM_DigTable->CurIGValue = pDM_DigTable->rx_gain_range_min ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG BeforeLink\n")); if(FirstDisConnect) { CurrentIGI = pDM_DigTable->rx_gain_range_min; ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): First DisConnect \n")); } else { //2012.03.30 LukeLee: enable DIG before link but with very high thresholds if(pFalseAlmCnt->Cnt_all > 10000) CurrentIGI = CurrentIGI + 4; else if (pFalseAlmCnt->Cnt_all > 8000) CurrentIGI = CurrentIGI + 2; else if(pFalseAlmCnt->Cnt_all < 500) CurrentIGI = CurrentIGI - 2; ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): England DIG \n")); } } ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): DIG End Adjust IGI\n")); //1 Check initial gain by upper/lower bound if(CurrentIGI > pDM_DigTable->rx_gain_range_max) CurrentIGI = pDM_DigTable->rx_gain_range_max; if(CurrentIGI < pDM_DigTable->rx_gain_range_min) CurrentIGI = pDM_DigTable->rx_gain_range_min; ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): rx_gain_range_max=0x%x, rx_gain_range_min=0x%x\n", pDM_DigTable->rx_gain_range_max, pDM_DigTable->rx_gain_range_min)); ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): TotalFA=%d\n", pFalseAlmCnt->Cnt_all)); ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue=0x%x\n", CurrentIGI)); ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): RSSI=0x%x\n",pDM_Odm->RSSI_Min)); //2 High power RSSI threshold #if (DM_ODM_SUPPORT_TYPE & ODM_MP) { HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pDM_Odm->Adapter); //----------------------------------------------------------end for LC Mocca issue if((pDM_Odm->SupportICType == ODM_RTL8723B)&& (pHalData->UndecoratedSmoothedPWDB > DM_DIG_HIGH_PWR_THRESHOLD)) { // High power IGI lower bound ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): UndecoratedSmoothedPWDB(%#x)\n", pHalData->UndecoratedSmoothedPWDB)); if(CurrentIGI < DM_DIG_HIGH_PWR_IGI_LOWER_BOUND) { ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): CurIGValue(%#x)\n", pDM_DigTable->CurIGValue)); //pDM_DigTable->CurIGValue = DM_DIG_HIGH_PWR_IGI_LOWER_BOUND; CurrentIGI=DM_DIG_HIGH_PWR_IGI_LOWER_BOUND; } } #if 0 if((pDM_Odm->SupportICType & ODM_RTL8723A) && IS_WIRELESS_MODE_G(pAdapter)) { if(pHalData->UndecoratedSmoothedPWDB > 0x28) { if(CurrentIGI < DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND) { //pDM_DigTable->CurIGValue = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND; CurrentIGI = DM_DIG_Gmode_HIGH_PWR_IGI_LOWER_BOUND; } } } #endif // end if 0 } #endif if(pDM_Odm->bBtHsOperation) { if(pDM_Odm->bLinked) { if(pDM_DigTable->BT30_CurIGI > (CurrentIGI)) { ODM_Write_DIG(pDM_Odm, CurrentIGI); } else { ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI); } pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked; pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN; } else { if(pDM_Odm->bLinkInProcess) { ODM_Write_DIG(pDM_Odm, 0x1c); } else if(pDM_Odm->bBtConnectProcess) { ODM_Write_DIG(pDM_Odm, 0x28); } else { ODM_Write_DIG(pDM_Odm, pDM_DigTable->BT30_CurIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue); } } } else // BT is not using { ODM_Write_DIG(pDM_Odm, CurrentIGI);//ODM_Write_DIG(pDM_Odm, pDM_DigTable->CurIGValue); pDM_DigTable->bMediaConnect_0 = pDM_Odm->bLinked; pDM_DigTable->DIG_Dynamic_MIN_0 = DIG_Dynamic_MIN; } }