/* ========================================================================== Description: Update StaCfg->ChannelList[] according to 1) Country Region 2) RF IC type, and 3) PHY-mode user selected. The outcome is used by driver when doing site survey. IRQL = PASSIVE_LEVEL IRQL = DISPATCH_LEVEL ========================================================================== */ VOID BuildChannelList(RTMP_ADAPTER *pAd) { UCHAR i, j, index=0, num=0; PCH_DESC pChDesc = NULL; BOOLEAN bRegionFound = FALSE; PUCHAR pChannelList; PUCHAR pChannelListFlag; NdisZeroMemory(pAd->ChannelList, MAX_NUM_OF_CHANNELS * sizeof(CHANNEL_TX_POWER)); /* if not 11a-only mode, channel list starts from 2.4Ghz band*/ if (!WMODE_5G_ONLY(pAd->CommonCfg.PhyMode)) { for (i = 0; i < Country_Region_GroupNum_2GHZ; i++) { if ((pAd->CommonCfg.CountryRegion & 0x7f) == Country_Region_ChDesc_2GHZ[i].RegionIndex) { pChDesc = Country_Region_ChDesc_2GHZ[i].pChDesc; num = TotalChNum(pChDesc); bRegionFound = TRUE; break; } } if (!bRegionFound) { DBGPRINT(RT_DEBUG_ERROR,("CountryRegion=%d not support", pAd->CommonCfg.CountryRegion)); return; } if (num > 0) { os_alloc_mem(NULL, (UCHAR **)&pChannelList, num * sizeof(UCHAR)); if (!pChannelList) { DBGPRINT(RT_DEBUG_ERROR,("%s:Allocate memory for ChannelList failed\n", __FUNCTION__)); return; } os_alloc_mem(NULL, (UCHAR **)&pChannelListFlag, num * sizeof(UCHAR)); if (!pChannelListFlag) { DBGPRINT(RT_DEBUG_ERROR,("%s:Allocate memory for ChannelListFlag failed\n", __FUNCTION__)); os_free_mem(NULL, pChannelList); return; } for (i = 0; i < num; i++) { pChannelList[i] = GetChannel_2GHZ(pChDesc, i); pChannelListFlag[i] = GetChannelFlag(pChDesc, i); } for (i = 0; i < num; i++) { for (j = 0; j < MAX_NUM_OF_CHANNELS; j++) { if (pChannelList[i] == pAd->TxPower[j].Channel) NdisMoveMemory(&pAd->ChannelList[index+i], &pAd->TxPower[j], sizeof(CHANNEL_TX_POWER)); pAd->ChannelList[index + i].Flags = pChannelListFlag[i]; } #ifdef DOT11_N_SUPPORT if (N_ChannelGroupCheck(pAd, pAd->ChannelList[index + i].Channel)) pAd->ChannelList[index + i].Flags |= CHANNEL_40M_CAP; #ifdef DOT11_VHT_AC if (vht80_channel_group(pAd, pAd->ChannelList[index + i].Channel)) pAd->ChannelList[index + i].Flags |= CHANNEL_80M_CAP; #endif /* DOT11_VHT_AC */ #endif /* DOT11_N_SUPPORT */ pAd->ChannelList[index+i].MaxTxPwr = 20; } index += num; os_free_mem(NULL, pChannelList); os_free_mem(NULL, pChannelListFlag); } bRegionFound = FALSE; num = 0; } if (WMODE_CAP_5G(pAd->CommonCfg.PhyMode)) { for (i = 0; i < Country_Region_GroupNum_5GHZ; i++) { if ((pAd->CommonCfg.CountryRegionForABand & 0x7f) == Country_Region_ChDesc_5GHZ[i].RegionIndex) { pChDesc = Country_Region_ChDesc_5GHZ[i].pChDesc; num = TotalChNum(pChDesc); bRegionFound = TRUE; break; } } if (!bRegionFound) { DBGPRINT(RT_DEBUG_ERROR,("CountryRegionABand=%d not support", pAd->CommonCfg.CountryRegionForABand)); return; } if (num > 0) { UCHAR RadarCh[16]={52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144}; #ifdef CONFIG_AP_SUPPORT UCHAR q=0; #endif /* CONFIG_AP_SUPPORT */ os_alloc_mem(NULL, (UCHAR **)&pChannelList, num * sizeof(UCHAR)); if (!pChannelList) { DBGPRINT(RT_DEBUG_ERROR,("%s:Allocate memory for ChannelList failed\n", __FUNCTION__)); return; } os_alloc_mem(NULL, (UCHAR **)&pChannelListFlag, num * sizeof(UCHAR)); if (!pChannelListFlag) { DBGPRINT(RT_DEBUG_ERROR,("%s:Allocate memory for ChannelListFlag failed\n", __FUNCTION__)); os_free_mem(NULL, pChannelList); return; } for (i = 0; i < num; i++) { pChannelList[i] = GetChannel_5GHZ(pChDesc, i); pChannelListFlag[i] = GetChannelFlag(pChDesc, i); } #ifdef CONFIG_AP_SUPPORT for (i = 0; i < num; i++) { if((pAd->CommonCfg.bIEEE80211H == 0)|| ((pAd->CommonCfg.bIEEE80211H == 1) && (pAd->CommonCfg.RDDurRegion != FCC))) { pChannelList[q] = GetChannel_5GHZ(pChDesc, i); pChannelListFlag[q] = GetChannelFlag(pChDesc, i); q++; } /*Based on the requiremnt of FCC, some channles could not be used anymore when test DFS function.*/ else if ((pAd->CommonCfg.bIEEE80211H == 1) && (pAd->CommonCfg.RDDurRegion == FCC) && (pAd->Dot11_H.bDFSIndoor == 1)) { if((GetChannel_5GHZ(pChDesc, i) < 116) || (GetChannel_5GHZ(pChDesc, i) > 128)) { pChannelList[q] = GetChannel_5GHZ(pChDesc, i); pChannelListFlag[q] = GetChannelFlag(pChDesc, i); q++; } } else if ((pAd->CommonCfg.bIEEE80211H == 1) && (pAd->CommonCfg.RDDurRegion == FCC) && (pAd->Dot11_H.bDFSIndoor == 0)) { if((GetChannel_5GHZ(pChDesc, i) < 100) || (GetChannel_5GHZ(pChDesc, i) > 140) ) { pChannelList[q] = GetChannel_5GHZ(pChDesc, i); pChannelListFlag[q] = GetChannelFlag(pChDesc, i); q++; } } } num = q; #endif /* CONFIG_AP_SUPPORT */ for (i=0; i<num; i++) { for (j=0; j<MAX_NUM_OF_CHANNELS; j++) { if (pChannelList[i] == pAd->TxPower[j].Channel) NdisMoveMemory(&pAd->ChannelList[index+i], &pAd->TxPower[j], sizeof(CHANNEL_TX_POWER)); pAd->ChannelList[index + i].Flags = pChannelListFlag[i]; } #ifdef DOT11_N_SUPPORT if (N_ChannelGroupCheck(pAd, pAd->ChannelList[index + i].Channel)) pAd->ChannelList[index + i].Flags |= CHANNEL_40M_CAP; #ifdef DOT11_VHT_AC if (vht80_channel_group(pAd, pAd->ChannelList[index + i].Channel)) pAd->ChannelList[index + i].Flags |= CHANNEL_80M_CAP; #endif /* DOT11_VHT_AC */ #endif /* DOT11_N_SUPPORT */ for (j=0; j<16; j++) { if (pChannelList[i] == RadarCh[j]) { pAd->ChannelList[index+i].DfsReq = TRUE; #ifdef SMART_MESH pAd->ChannelList[index+i].bDfsAPExist = FALSE; #endif /* SMART_MESH */ } } #ifdef SMART_MESH pAd->ChannelList[index+i].FalseCCA = 0; #endif /* SMART_MESH */ pAd->ChannelList[index+i].MaxTxPwr = 20; } index += num; os_free_mem(NULL, pChannelList); os_free_mem(NULL, pChannelListFlag); } } pAd->ChannelListNum = index; DBGPRINT(RT_DEBUG_TRACE,("country code=%d/%d, RFIC=%d, PHY mode=%d, support %d channels\n", pAd->CommonCfg.CountryRegion, pAd->CommonCfg.CountryRegionForABand, pAd->RfIcType, pAd->CommonCfg.PhyMode, pAd->ChannelListNum)); #ifdef RT_CFG80211_SUPPORT for (i=0;i<pAd->ChannelListNum;i++) { CFG80211OS_ChanInfoInit( pAd->pCfg80211_CB, i, pAd->ChannelList[i].Channel, pAd->ChannelList[i].MaxTxPwr, WMODE_CAP_N(pAd->CommonCfg.PhyMode), (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_20)); } #endif /* RT_CFG80211_SUPPORT */ #ifdef DBG for (i=0;i<pAd->ChannelListNum;i++) { DBGPRINT_RAW(RT_DEBUG_TRACE,("BuildChannel # %d :: Pwr0 = %d, Pwr1 =%d, Flags = %x\n ", pAd->ChannelList[i].Channel, pAd->ChannelList[i].Power, pAd->ChannelList[i].Power2, pAd->ChannelList[i].Flags)); } #endif }
/* ========================================================================== Description: Update StaCfg->ChannelList[] according to 1) Country Region 2) RF IC type, and 3) PHY-mode user selected. The outcome is used by driver when doing site survey. IRQL = PASSIVE_LEVEL IRQL = DISPATCH_LEVEL ========================================================================== */ VOID BuildChannelList( IN PRTMP_ADAPTER pAd) { UCHAR i, j, index=0, num=0; PCH_DESC pChDesc = NULL; BOOLEAN bRegionFound = FALSE; PUCHAR pChannelList; PUCHAR pChannelListFlag; NdisZeroMemory(pAd->ChannelList, MAX_NUM_OF_CHANNELS * sizeof(CHANNEL_TX_POWER)); /* if not 11a-only mode, channel list starts from 2.4Ghz band*/ if ((pAd->CommonCfg.PhyMode != PHY_11A) #ifdef DOT11_N_SUPPORT && (pAd->CommonCfg.PhyMode != PHY_11AN_MIXED) && (pAd->CommonCfg.PhyMode != PHY_11N_5G) #endif /* DOT11_N_SUPPORT */ ) { for (i = 0; i < Country_Region_GroupNum_2GHZ; i++) { if ((pAd->CommonCfg.CountryRegion & 0x7f) == Country_Region_ChDesc_2GHZ[i].RegionIndex) { pChDesc = Country_Region_ChDesc_2GHZ[i].pChDesc; num = TotalChNum(pChDesc); bRegionFound = TRUE; break; } } if (!bRegionFound) { DBGPRINT(RT_DEBUG_ERROR,("CountryRegion=%d not support", pAd->CommonCfg.CountryRegion)); return; } if (num > 0) { os_alloc_mem(NULL, (UCHAR **)&pChannelList, num * sizeof(UCHAR)); if (!pChannelList) { DBGPRINT(RT_DEBUG_ERROR,("%s:Allocate memory for ChannelList failed\n", __FUNCTION__)); return; } os_alloc_mem(NULL, (UCHAR **)&pChannelListFlag, num * sizeof(UCHAR)); if (!pChannelListFlag) { DBGPRINT(RT_DEBUG_ERROR,("%s:Allocate memory for ChannelListFlag failed\n", __FUNCTION__)); os_free_mem(NULL, pChannelList); return; } for (i = 0; i < num; i++) { pChannelList[i] = GetChannel_2GHZ(pChDesc, i); pChannelListFlag[i] = GetChannelFlag(pChDesc, i); } for (i = 0; i < num; i++) { for (j = 0; j < MAX_NUM_OF_CHANNELS; j++) { if (pChannelList[i] == pAd->TxPower[j].Channel) NdisMoveMemory(&pAd->ChannelList[index+i], &pAd->TxPower[j], sizeof(CHANNEL_TX_POWER)); pAd->ChannelList[index + i].Flags = pChannelListFlag[i]; } #ifdef DOT11_N_SUPPORT if (N_ChannelGroupCheck(pAd, pAd->ChannelList[index + i].Channel)) pAd->ChannelList[index + i].Flags |= CHANNEL_40M_CAP; #endif /* DOT11_N_SUPPORT */ pAd->ChannelList[index+i].MaxTxPwr = 20; } index += num; os_free_mem(NULL, pChannelList); os_free_mem(NULL, pChannelListFlag); } bRegionFound = FALSE; num = 0; } if ((pAd->CommonCfg.PhyMode == PHY_11A) || (pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED) #ifdef DOT11_N_SUPPORT || (pAd->CommonCfg.PhyMode == PHY_11ABGN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11AN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11AGN_MIXED) || (pAd->CommonCfg.PhyMode == PHY_11N_5G) #endif /* DOT11_N_SUPPORT */ ) { for (i = 0; i < Country_Region_GroupNum_5GHZ; i++) { if ((pAd->CommonCfg.CountryRegionForABand & 0x7f) == Country_Region_ChDesc_5GHZ[i].RegionIndex) { pChDesc = Country_Region_ChDesc_5GHZ[i].pChDesc; num = TotalChNum(pChDesc); bRegionFound = TRUE; break; } } if (!bRegionFound) { DBGPRINT(RT_DEBUG_ERROR,("CountryRegionABand=%d not support", pAd->CommonCfg.CountryRegionForABand)); return; } if (num > 0) { UCHAR RadarCh[15]= {52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140}; os_alloc_mem(NULL, (UCHAR **)&pChannelList, num * sizeof(UCHAR)); if (!pChannelList) { DBGPRINT(RT_DEBUG_ERROR,("%s:Allocate memory for ChannelList failed\n", __FUNCTION__)); return; } os_alloc_mem(NULL, (UCHAR **)&pChannelListFlag, num * sizeof(UCHAR)); if (!pChannelListFlag) { DBGPRINT(RT_DEBUG_ERROR,("%s:Allocate memory for ChannelListFlag failed\n", __FUNCTION__)); os_free_mem(NULL, pChannelList); return; } for (i = 0; i < num; i++) { pChannelList[i] = GetChannel_5GHZ(pChDesc, i); pChannelListFlag[i] = GetChannelFlag(pChDesc, i); } for (i=0; i<num; i++) { for (j=0; j<MAX_NUM_OF_CHANNELS; j++) { if (pChannelList[i] == pAd->TxPower[j].Channel) NdisMoveMemory(&pAd->ChannelList[index+i], &pAd->TxPower[j], sizeof(CHANNEL_TX_POWER)); pAd->ChannelList[index + i].Flags = pChannelListFlag[i]; } #ifdef DOT11_N_SUPPORT if (N_ChannelGroupCheck(pAd, pAd->ChannelList[index + i].Channel)) pAd->ChannelList[index + i].Flags |= CHANNEL_40M_CAP; #endif /* DOT11_N_SUPPORT */ for (j=0; j<15; j++) { if (pChannelList[i] == RadarCh[j]) pAd->ChannelList[index+i].DfsReq = TRUE; } pAd->ChannelList[index+i].MaxTxPwr = 20; } index += num; os_free_mem(NULL, pChannelList); os_free_mem(NULL, pChannelListFlag); } } pAd->ChannelListNum = index; DBGPRINT(RT_DEBUG_TRACE,("country code=%d/%d, RFIC=%d, PHY mode=%d, support %d channels\n", pAd->CommonCfg.CountryRegion, pAd->CommonCfg.CountryRegionForABand, pAd->RfIcType, pAd->CommonCfg.PhyMode, pAd->ChannelListNum)); #ifdef RT_CFG80211_SUPPORT for (i=0; i<pAd->ChannelListNum; i++) { CFG80211OS_ChanInfoInit( pAd->pCfg80211_CB, i, pAd->ChannelList[i].Channel, pAd->ChannelList[i].MaxTxPwr, (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED), (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_20)); } #endif /* RT_CFG80211_SUPPORT */ #ifdef DBG for (i=0; i<pAd->ChannelListNum; i++) { DBGPRINT_RAW(RT_DEBUG_TRACE,("BuildChannel # %d :: Pwr0 = %d, Pwr1 =%d, Flags = %x\n ", pAd->ChannelList[i].Channel, pAd->ChannelList[i].Power, pAd->ChannelList[i].Power2, pAd->ChannelList[i].Flags)); } #endif }
static inline UCHAR SelectClearChannelApCnt( IN PRTMP_ADAPTER pAd ) { /*PBSSINFO pBssInfoTab = pAd->pBssInfoTab; */ PCHANNELINFO pChannelInfo = pAd->pChannelInfo; /*BSSENTRY *pBss; */ UCHAR channel_index = 0,dirty,base = 0; UCHAR final_channel = 0; if(pChannelInfo == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("pAd->pChannelInfo equal NULL.\n")); return (FirstChannel(pAd)); } /* Calculate Dirtiness */ for (channel_index=0 ; channel_index < pAd->ChannelListNum ; channel_index++) { if (pChannelInfo->ApCnt[channel_index] > 0) { INT ll; pChannelInfo->dirtyness[channel_index] += 30; /*5G */ if (pChannelInfo->IsABand) { int Channel = pAd->ChannelList[channel_index].Channel; /*Make secondary channel dirty */ if(pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40) { if (Channel > 14) { if ((Channel == 36) || (Channel == 44) || (Channel == 52) || (Channel== 60) || (Channel == 100) || (Channel == 108) || (Channel == 116) || (Channel == 124) || (Channel == 132) || (Channel == 149) || (Channel == 157)) { if (channel_index + 1 < MAX_NUM_OF_CHANNELS) if(pAd->ChannelList[channel_index+1].Channel - pAd->ChannelList[channel_index].Channel == 4) pChannelInfo->dirtyness[channel_index+1] += 1; } else if ((Channel == 40) || (Channel == 48) || (Channel == 56) || (Channel == 64) || (Channel == 104) || (Channel == 112) || (Channel == 120) || (Channel == 128) || (Channel == 136) || (Channel== 153) || (Channel == 161)) { if(channel_index - 1 >= 0) if(pAd->ChannelList[channel_index].Channel - pAd->ChannelList[channel_index-1].Channel == 4) pChannelInfo->dirtyness[channel_index-1] += 1; } } } #ifdef DOT11_VHT_AC else if(pAd->CommonCfg.RegTransmitSetting.field.BW == BW_80) { INT vht_ch_idx = get_vht_neighbor_index(pAd->ChannelList[channel_index].Channel); pChannelInfo->dirtyness[vht_ch_idx+channel_index]++; pChannelInfo->dirtyness[vht_ch_idx+(channel_index+1)]++; pChannelInfo->dirtyness[vht_ch_idx+(channel_index+2)]++; pChannelInfo->dirtyness[vht_ch_idx+(channel_index+3)]++; } #endif /* DOT11_VHT_AC */ } /*2.4G */ if (!pChannelInfo->IsABand) { int ChanOffset = 0; if((pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)&& (pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_BELOW)) { /* BW is 40Mhz the distance between two channel to prevent interference is 4 channel width plus 4 channel width (secondary channel) */ ChanOffset = 8; } else { /* BW is 20Mhz The channel width of 2.4G band is 5Mhz. The distance between two channel to prevent interference is 4 channel width */ ChanOffset = 4; } for (ll = channel_index + 1; ll < (channel_index + ChanOffset + 1); ll++) { if (ll < MAX_NUM_OF_CHANNELS) pChannelInfo->dirtyness[ll]++; } if((pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40)&& (pAd->CommonCfg.RegTransmitSetting.field.EXTCHA == EXTCHA_ABOVE)) { /* BW is 40Mhz */ ChanOffset = 8; } else { /* BW is 20Mhz */ ChanOffset = 4; } for (ll = channel_index - 1; ll > (channel_index - ChanOffset - 1); ll--) { if (ll >= 0) pChannelInfo->dirtyness[ll]++; } } } }/* Calculate Dirtiness */ AutoChannelSkipListSetDirty(pAd); printk("=====================================================\n"); for (channel_index=0 ; channel_index < pAd->ChannelListNum ; channel_index++) /* debug messages */ printk("Channel %d : Dirty = %ld, ApCnt=%ld, Busy Time = %d, Skip Channel = %s\n", pAd->ChannelList[channel_index].Channel, pChannelInfo->dirtyness[channel_index], pChannelInfo->ApCnt[channel_index], pChannelInfo->chanbusytime[channel_index], (pChannelInfo->SkipList[channel_index] == TRUE) ? "TRUE" : "FALSE"); printk("=====================================================\n"); pAd->ApCfg.AutoChannel_Channel = 0; /* RULE 1. pick up a good channel that no one used */ for (channel_index=0 ; channel_index < pAd->ChannelListNum ; channel_index++) { if (pChannelInfo->SkipList[channel_index] == TRUE) continue; if ((pAd->ApCfg.bAvoidDfsChannel == TRUE) &&(pChannelInfo->IsABand == TRUE) && RadarChannelCheck(pAd, pAd->ChannelList[channel_index].Channel)) continue; #ifdef AP_QLOAD_SUPPORT /* QLOAD ALARM */ if (QBSS_LoadIsBusyTimeAccepted(pAd, pChannelInfo->chanbusytime[channel_index]) == FALSE) continue; #endif /* AP_QLOAD_SUPPORT */ /* Check BW40/80 channel group */ if (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40) { if (!N_ChannelGroupCheck(pAd, pAd->ChannelList[channel_index].Channel)) { printk ("channel_%d is not in BW_40 channel group\n", pAd->ChannelList[channel_index].Channel); continue; } } #ifdef DOT11_VHT_AC else if (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_80) { if (!AC_ChannelGroupCheck(pAd, pAd->ChannelList[channel_index].Channel)) { printk ("channel_%d is not in BW_80 channel group\n", pAd->ChannelList[channel_index].Channel); continue; } } #endif /* DOT11_VHT_AC */ if (pChannelInfo->dirtyness[channel_index] == 0) break; } if (channel_index < pAd->ChannelListNum) { printk("Rule 1 APCnt : dirtiness == 0 (no one used and no interference) ==> Select Channel %d\n", pAd->ChannelList[channel_index].Channel); return pAd->ChannelList[channel_index].Channel; } /* RULE 2. if not available, then co-use a channel that's no interference (dirtyness=30) */ /* RULE 3. if not available, then co-use a channel that has minimum interference (dirtyness=31,32) */ for (dirty = 30; dirty <= 32; dirty++) { BOOLEAN candidate[MAX_NUM_OF_CHANNELS+1], candidate_num=0; UCHAR min_ApCnt = 255; final_channel = 0; NdisZeroMemory(candidate, MAX_NUM_OF_CHANNELS+1); for (channel_index=0 ; channel_index < pAd->ChannelListNum ; channel_index++) { if (pChannelInfo->SkipList[channel_index] == TRUE) continue; if (pChannelInfo->dirtyness[channel_index] == dirty) { candidate[channel_index]=TRUE; candidate_num++; } } /* if there's more than 1 candidate, pick up the channel with minimum RSSI */ if (candidate_num) { for (channel_index=0 ; channel_index < pAd->ChannelListNum ; channel_index++) { #ifdef AP_QLOAD_SUPPORT /* QLOAD ALARM */ /* when busy time of a channel > threshold, skip it */ /* TODO: Use weight for different references to do channel selection */ if (QBSS_LoadIsBusyTimeAccepted(pAd, pChannelInfo->chanbusytime[channel_index]) == FALSE) { /* check next one */ continue; } #endif /* AP_QLOAD_SUPPORT */ if (candidate[channel_index] && (pChannelInfo->ApCnt[channel_index] < min_ApCnt)) { if((pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40) && (BW40_ChannelCheck(pAd->ChannelList[channel_index].Channel) == FALSE)) { continue; } #ifdef DOT11_VHT_AC else if (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_80) { if (!AC_ChannelGroupCheck(pAd, pAd->ChannelList[channel_index].Channel)) { /* not in the BW_80 channel group */ continue; } } #endif /* DOT11_VHT_AC */ if ((pAd->ApCfg.bAvoidDfsChannel == TRUE) &&(pChannelInfo->IsABand == TRUE) && RadarChannelCheck(pAd, pAd->ChannelList[channel_index].Channel)) continue; final_channel = pAd->ChannelList[channel_index].Channel; min_ApCnt = pChannelInfo->ApCnt[channel_index]; } } if (final_channel != 0) { printk("Rule 2 APCnt : minimum APCnt with minimum interference(dirtiness: 30~32) ==> Select Channel %d\n", final_channel); printk(" Dirtiness = %d , Min ApCnt = %d\n", dirty, min_ApCnt); return final_channel; } } } /* RULE 3. still not available, pick up the random channel */ base = RandomByte2(pAd); for (channel_index=0 ; channel_index < pAd->ChannelListNum ; channel_index++) { final_channel = pAd->ChannelList[(base + channel_index) % pAd->ChannelListNum].Channel; if (AutoChannelSkipListCheck(pAd, final_channel)) continue; if (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40) { if (!N_ChannelGroupCheck(pAd, pAd->ChannelList[channel_index].Channel)) { /* not in the BW_40 channel group */ continue; } } #ifdef DOT11_VHT_AC else if (pAd->CommonCfg.RegTransmitSetting.field.BW == BW_80) { if (!AC_ChannelGroupCheck(pAd, pAd->ChannelList[channel_index].Channel)) { /* not in the BW_80 channel group */ continue; } } #endif /* DOT11_VHT_AC */ if ((pAd->ApCfg.bAvoidDfsChannel == TRUE) &&(pChannelInfo->IsABand == TRUE) && RadarChannelCheck(pAd, final_channel)) continue; break; } printk("Rule 3 APCnt : Randomly Select ==> Select Channel %d\n",final_channel); return final_channel; }