wlan: Auto Channel Selection Support in HT40/VHT80

Auto Channel Selection Support in HT40/VHT80

Change-Id: I0b6424031f11446395a0b6f6a724b879758df9ca
CR-Fixed: 427491
diff --git a/CORE/SAP/src/sapChSelect.c b/CORE/SAP/src/sapChSelect.c
index 756370a..a2200ca 100644
--- a/CORE/SAP/src/sapChSelect.c
+++ b/CORE/SAP/src/sapChSelect.c
@@ -348,6 +348,7 @@
         pSpectCh->chNum = *pChans;
         pSpectCh->valid = eSAP_TRUE;
         pSpectCh->rssiAgr = SOFTAP_MIN_RSSI;// Initialise for all channels
+        pSpectCh->channelWidth = SOFTAP_HT20_CHANNELWIDTH; // Initialise 20MHz for all the Channels 
         pSpectCh++;
         pChans++;
     }
@@ -439,18 +440,21 @@
 
     tCsrScanResultInfo *pScanResult;
     tSapSpectChInfo *pSpectCh   = pSpectInfoParams->pSpectCh;
+    v_U32_t operatingBand;
 
     VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, Computing spectral weight", __func__);
 
     /**
     * Soft AP specific channel weight calculation using DFS formula
     */
+    ccmCfgGetInt( halHandle, WNI_CFG_SAP_CHANNEL_SELECT_OPERATING_BAND, &operatingBand);
 
     pScanResult = sme_ScanResultGetFirst(halHandle, pResult);    
 
     while (pScanResult) {
         pSpectCh = pSpectInfoParams->pSpectCh;
-        // Processing for each tCsrScanResultInfo in the tCsrScanResult DLink list
+        
+	// Processing for each tCsrScanResultInfo in the tCsrScanResult DLink list
         for (chn_num = 0; chn_num < pSpectInfoParams->numSpectChans; chn_num++) {
 
             /*
@@ -468,11 +472,166 @@
 
                 ++pSpectCh->bssCount; // Increment the count of BSS
 
+                if(operatingBand) // Connsidering the Extension Channel only in a channels
+                {
+                    /* Updating the received ChannelWidth */
+                    if (pSpectCh->channelWidth != pScanResult->BssDescriptor.channelWidth) 
+                        pSpectCh->channelWidth = pScanResult->BssDescriptor.channelWidth;
+		    
+                    /* If received ChannelWidth is other than HT20, we need to update the extension channel Params as well
+                     * channelWidth == 0, HT20
+                     * channelWidth == 1, HT40
+                     * channelWidth == 2, VHT80
+                     */
+                    switch(pSpectCh->channelWidth)
+                    {
+                        case eHT_CHANNEL_WIDTH_40MHZ: //HT40
+                            switch( pScanResult->BssDescriptor.secondaryChannelOffset)
+                            {
+                                tSapSpectChInfo *pExtSpectCh = NULL;
+                                case PHY_DOUBLE_CHANNEL_LOW_PRIMARY: // Above the Primary Channel
+                                    pExtSpectCh = (pSpectCh + 1);
+                                    if(pExtSpectCh != NULL)
+                                    {
+                                        ++pExtSpectCh->bssCount;
+                                        // REducing the rssi by -20 and assigning it to Extension channel
+                                        pExtSpectCh->rssiAgr = (pSpectCh->rssiAgr + SAP_EXT_CHAN_RSSI);
+                                        if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
+                                            pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
+                                    }
+                                break;
+                                case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY: // Below the Primary channel
+                                    pExtSpectCh = (pSpectCh - 1);
+                                    if(pExtSpectCh != NULL) 
+                                    {
+                                        pExtSpectCh->rssiAgr = (pSpectCh->rssiAgr + SAP_EXT_CHAN_RSSI);
+                                        if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
+                                            pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
+                                        ++pExtSpectCh->bssCount;
+                                    }
+                                break;
+                            }
+                        break;
+                        case eHT_CHANNEL_WIDTH_80MHZ: // VHT80
+                            if((pScanResult->BssDescriptor.centerFreq - channel_id) == 6)
+                            {
+                                tSapSpectChInfo *pExtSpectCh = NULL;
+                                pExtSpectCh = (pSpectCh + 1);
+                                if(pExtSpectCh != NULL)
+                                {
+                                    ++pExtSpectCh->bssCount;
+                                    pExtSpectCh->rssiAgr = (pSpectCh->rssiAgr + SAP_EXT_CHAN_RSSI); // Reducing the rssi by -20 and assigning it to Subband 1 
+                                    if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
+                                        pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
+                                }
+                                pExtSpectCh = (pSpectCh + 2);
+                                if(pExtSpectCh != NULL)
+                                {
+                                    ++pExtSpectCh->bssCount;
+                                    pExtSpectCh->rssiAgr = (pSpectCh->rssiAgr + SAP_EXT_SUBBAND2_RSSI); // Reducing the rssi by -30 and assigning it to Subband 2
+                                    if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
+                                        pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
+                                }
+                                pExtSpectCh = (pSpectCh + 3);
+                                if(pExtSpectCh != NULL)
+                                {
+                                    ++pExtSpectCh->bssCount;
+                                    pExtSpectCh->rssiAgr = (pSpectCh->rssiAgr + SAP_EXT_SUBBAND3_RSSI); // Reducing the rssi by -40 and assigning it to Subband 3
+                                    if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
+                                        pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
+                                }  
+                            }
+                            else if((pScanResult->BssDescriptor.centerFreq - channel_id) == 2)
+                            {
+                                tSapSpectChInfo *pExtSpectCh = NULL;
+                                pExtSpectCh = (pSpectCh - 1 );
+                                if(pExtSpectCh != NULL)
+                                {
+                                    ++pExtSpectCh->bssCount;
+                                    pExtSpectCh->rssiAgr = (pSpectCh->rssiAgr + SAP_EXT_CHAN_RSSI);
+                                    if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
+                                        pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
+                                }
+                                pExtSpectCh = (pSpectCh + 1);
+                                if(pExtSpectCh != NULL)
+                                {
+                                    ++pExtSpectCh->bssCount;
+                                    pExtSpectCh->rssiAgr = (pSpectCh->rssiAgr + SAP_EXT_CHAN_RSSI);
+                                    if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
+                                        pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
+                                }
+                                pExtSpectCh = (pSpectCh + 2);
+                                if(pExtSpectCh != NULL)
+                                {
+                                    ++pExtSpectCh->bssCount;
+                                    pExtSpectCh->rssiAgr = (pSpectCh->rssiAgr + SAP_EXT_SUBBAND2_RSSI);
+                                    if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
+                                        pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
+                                }
+                            }
+                            else if((pScanResult->BssDescriptor.centerFreq - channel_id) == -2)
+                            {
+                                tSapSpectChInfo *pExtSpectCh = NULL;
+                                pExtSpectCh = (pSpectCh - 1 );
+                                if(pExtSpectCh != NULL)
+                                {
+                                    ++pExtSpectCh->bssCount;
+                                    pExtSpectCh->rssiAgr = (pSpectCh->rssiAgr + SAP_EXT_CHAN_RSSI);
+                                    if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
+                                        pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
+                                }
+                                pExtSpectCh = (pSpectCh - 2);
+                                if(pExtSpectCh != NULL)
+                                {
+                                    ++pExtSpectCh->bssCount;
+                                    pExtSpectCh->rssiAgr = (pSpectCh->rssiAgr + SAP_EXT_SUBBAND2_RSSI);
+                                    if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
+                                        pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
+                                }
+                                pExtSpectCh = (pSpectCh + 1);
+                                if(pExtSpectCh != NULL)
+                                {
+                                    ++pExtSpectCh->bssCount;
+                                    pExtSpectCh->rssiAgr = (pSpectCh->rssiAgr + SAP_EXT_CHAN_RSSI);
+                                    if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
+                                        pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
+                                }
+                            }
+                            else if((pScanResult->BssDescriptor.centerFreq - channel_id) == -6)
+                            {
+                                tSapSpectChInfo *pExtSpectCh = NULL;
+                                pExtSpectCh = (pSpectCh - 1 );
+                                if(pExtSpectCh != NULL)
+                                {
+                                    ++pExtSpectCh->bssCount;
+                                    pExtSpectCh->rssiAgr = (pSpectCh->rssiAgr + SAP_EXT_CHAN_RSSI);
+                                    if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
+                                        pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
+                                }
+                                pExtSpectCh = (pSpectCh - 2);
+                                if(pExtSpectCh != NULL)
+                                {
+                                    ++pExtSpectCh->bssCount;
+                                    pExtSpectCh->rssiAgr = (pSpectCh->rssiAgr + SAP_EXT_SUBBAND2_RSSI);
+                                    if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
+                                        pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
+                                }
+                                pExtSpectCh = (pSpectCh - 3);
+                                if(pExtSpectCh != NULL)
+                                {
+                                    ++pExtSpectCh->bssCount;
+                                    pExtSpectCh->rssiAgr = (pSpectCh->rssiAgr + SAP_EXT_SUBBAND3_RSSI);
+                                    if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
+                                        pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
+                                }
+                            }
+                        break;
+                    }
+                } 
+
                 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
-                   "In %s, bssdes.ch_self=%d, bssdes.ch_ID=%d, bssdes.rssi=%d, SpectCh.bssCount=%d, pScanResult=0x%x",
-                  __func__, pScanResult->BssDescriptor.channelIdSelf, pScanResult->BssDescriptor.channelId, 
-                  pScanResult->BssDescriptor.rssi, pSpectCh->bssCount, pScanResult);
-                         
+                   "In %s, bssdes.ch_self=%d, bssdes.ch_ID=%d, bssdes.rssi=%d, SpectCh.bssCount=%d, pScanResult=0x%x, ChannelWidth %d, secondaryChanOffset %d, center frequency %d \n",
+                  __func__, pScanResult->BssDescriptor.channelIdSelf, pScanResult->BssDescriptor.channelId, pScanResult->BssDescriptor.rssi, pSpectCh->bssCount, pScanResult,pSpectCh->channelWidth,pScanResult->BssDescriptor.secondaryChannelOffset,pScanResult->BssDescriptor.centerFreq);
                  pSpectCh++;
                  break;
            } else {