blob: 7bf6090f74c7e11dfb9bbf401c23265e824c5fb8 [file] [log] [blame]
Jeff Johnson295189b2012-06-20 16:38:30 -07001/*
Jeff Johnson797280e2017-09-19 08:36:01 -07002 * Copyright (c) 2012-2014, 2016-2017 The Linux Foundation. All rights reserved.
Kiet Lam0fb93dd2014-02-19 00:32:59 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
Gopichand Nakkala92f07d82013-01-08 21:16:34 -080020 */
Kiet Lam0fb93dd2014-02-19 00:32:59 -080021
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
Jeff Johnson295189b2012-06-20 16:38:30 -070028/*===========================================================================
29
30 s a p C h S e l e c t . C
Jeff Johnson295189b2012-06-20 16:38:30 -070031 OVERVIEW:
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +053032
Jeff Johnson295189b2012-06-20 16:38:30 -070033 This software unit holds the implementation of the WLAN SAP modules
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +053034 functions for channel selection.
Jeff Johnson295189b2012-06-20 16:38:30 -070035
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +053036 DEPENDENCIES:
Jeff Johnson295189b2012-06-20 16:38:30 -070037
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +053038 Are listed for each API below.
Jeff Johnson295189b2012-06-20 16:38:30 -070039===========================================================================*/
40
41/*===========================================================================
42
43 EDIT HISTORY FOR FILE
44
45
46 This section contains comments describing changes made to the module.
47 Notice that changes are listed in reverse chronological order.
48
49
50
51 when who what, where, why
52---------- --- --------------------------------------------------------
532010-03-15 SOFTAP Created module
54
55===========================================================================*/
56
57
58/*--------------------------------------------------------------------------
59 Include Files
60------------------------------------------------------------------------*/
61#include "vos_trace.h"
62#include "csrApi.h"
63#include "sme_Api.h"
64#include "sapChSelect.h"
65#include "sapInternal.h"
Mahesh Kumar Kalikot Veetil2aad8d82013-02-07 12:31:28 -080066#ifdef ANI_OS_TYPE_QNX
67#include "stdio.h"
68#endif
Peng Xuafc34e32014-09-25 13:23:55 +053069#include "wlan_hdd_main.h"
Jeff Johnson295189b2012-06-20 16:38:30 -070070
71/*--------------------------------------------------------------------------
72 Function definitions
73--------------------------------------------------------------------------*/
74
75/*--------------------------------------------------------------------------
76 Defines
77--------------------------------------------------------------------------*/
78#define SAP_DEBUG
79
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -070080#define IS_RSSI_VALID( extRssi, rssi ) \
81( \
82 ((extRssi < rssi)?eANI_BOOLEAN_TRUE:eANI_BOOLEAN_FALSE) \
83)
84
Leo Chang0b0e45a2013-12-15 15:18:55 -080085#ifdef FEATURE_WLAN_CH_AVOID
86extern safeChannelType safeChannels[];
87#endif /* FEATURE_WLAN_CH_AVOID */
88
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -070089/*==========================================================================
90 FUNCTION sapCleanupChannelList
91
92 DESCRIPTION
93 Function sapCleanupChannelList frees up the memory allocated to the channel list.
94
95 DEPENDENCIES
96 NA.
97
98 PARAMETERS
99
100 IN
101 NULL
102
103 RETURN VALUE
104 NULL
105============================================================================*/
106
107void sapCleanupChannelList(void)
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700108{
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700109 v_PVOID_t pvosGCtx = vos_get_global_context(VOS_MODULE_ID_SAP, NULL);
Gopichand Nakkala936715f2013-03-18 19:48:10 +0530110 ptSapContext pSapCtx;
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700111
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700112 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
113 "Cleaning up the channel list structure");
114
Gopichand Nakkala936715f2013-03-18 19:48:10 +0530115 if (NULL == pvosGCtx)
116 {
117 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL,
118 "SAP Global Context is NULL");
119 return ;
120 }
121
122 pSapCtx = VOS_GET_SAP_CB(pvosGCtx);
123 if (NULL == pSapCtx)
124 {
125 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL,
126 "SAP Context is NULL");
127 return ;
128 }
129
130 pSapCtx->SapChnlList.numChannel = 0;
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700131 vos_mem_free(pSapCtx->SapChnlList.channelList);
132 pSapCtx->SapChnlList.channelList = NULL;
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700133}
134
Peng Xu7d410f42014-09-09 12:15:47 +0530135typedef struct
136{
137 v_U16_t chStartNum;
138 v_U32_t weight;
139} sapAcsChannelInfo;
140
141#define ACS_WEIGHT_MAX 4444
142
Peng Xu117eab42014-09-25 13:33:27 +0530143sapAcsChannelInfo acsHT40Channels5G[ ] = {
Peng Xu7d410f42014-09-09 12:15:47 +0530144 {36, ACS_WEIGHT_MAX},
145 {44, ACS_WEIGHT_MAX},
146 {52, ACS_WEIGHT_MAX},
147 {60, ACS_WEIGHT_MAX},
148 {100, ACS_WEIGHT_MAX},
149 {108, ACS_WEIGHT_MAX},
150 {116, ACS_WEIGHT_MAX},
151 {124, ACS_WEIGHT_MAX},
152 {132, ACS_WEIGHT_MAX},
153 {140, ACS_WEIGHT_MAX},
154 {149, ACS_WEIGHT_MAX},
155 {157, ACS_WEIGHT_MAX},
156};
157
158sapAcsChannelInfo acsHT80Channels[ ] = {
159 {36, ACS_WEIGHT_MAX},
160 {52, ACS_WEIGHT_MAX},
161 {100, ACS_WEIGHT_MAX},
162 {116, ACS_WEIGHT_MAX},
163 {132, ACS_WEIGHT_MAX},
164 {149, ACS_WEIGHT_MAX},
165};
166
Rajesh Babu Prathipatiff748c02014-09-09 13:19:57 +0530167sapAcsChannelInfo acsHT40Channels24G[ ] = {
168 {1, ACS_WEIGHT_MAX},
169 {2, ACS_WEIGHT_MAX},
170 {3, ACS_WEIGHT_MAX},
171 {4, ACS_WEIGHT_MAX},
172 {9, ACS_WEIGHT_MAX},
173};
174
Peng Xu117eab42014-09-25 13:33:27 +0530175typedef enum {
176 CHWIDTH_HT20,
177 CHWIDTH_HT40,
178 CHWIDTH_HT80,
179} eChannelWidthInfo;
180
181#define CHANNEL_165 165
182
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700183/*==========================================================================
184 FUNCTION sapSetPreferredChannel
185
186 DESCRIPTION
187 Function sapSetPreferredChannel sets the channel list which has been configured
188 into sap context (pSapCtx) which will be used at the time of best channel selection.
189
190 DEPENDENCIES
191 NA.
192
193 PARAMETERS
194
195 IN
196 *ptr: pointer having the command followed by the arguments in string format
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700197
198 RETURN VALUE
199 int: return 0 when success else returns error code.
200============================================================================*/
201
Mahesh Kumar Kalikot Veetil2aad8d82013-02-07 12:31:28 -0800202int sapSetPreferredChannel(tANI_U8* ptr)
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700203{
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700204
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700205 v_PVOID_t pvosGCtx = vos_get_global_context(VOS_MODULE_ID_SAP, NULL);
Gopichand Nakkala936715f2013-03-18 19:48:10 +0530206 ptSapContext pSapCtx;
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700207 tANI_U8* param;
208 int tempInt;
209 int j;
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700210
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700211 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700212 "Enter: %s", __func__);
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700213
Gopichand Nakkala936715f2013-03-18 19:48:10 +0530214 if (NULL == pvosGCtx)
215 {
216 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL,
217 "SAP Global Context is NULL");
218 return -EINVAL;
219 }
220
221 pSapCtx = VOS_GET_SAP_CB(pvosGCtx);
222 if (NULL == pSapCtx)
223 {
224 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL,
225 "SAP Context is NULL");
226 return -EINVAL;
227 }
228
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700229 if (NULL != pSapCtx->SapChnlList.channelList)
230 {
231 sapCleanupChannelList();
232 }
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700233
Mahesh Kumar Kalikot Veetil2aad8d82013-02-07 12:31:28 -0800234 param = strchr(ptr, ' ');
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700235 /*no argument after the command*/
Mahesh Kumar Kalikot Veetil2aad8d82013-02-07 12:31:28 -0800236 if (NULL == param)
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700237 {
Mahesh Kumar Kalikot Veetil2aad8d82013-02-07 12:31:28 -0800238 return -EINVAL;
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700239 }
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700240
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700241 /*no space after the command*/
Mahesh Kumar Kalikot Veetil2aad8d82013-02-07 12:31:28 -0800242 else if (SPACE_ASCII_VALUE != *param)
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700243 {
Mahesh Kumar Kalikot Veetil2aad8d82013-02-07 12:31:28 -0800244 return -EINVAL;
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700245 }
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700246
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700247 param++;
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700248
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700249 /*removing empty spaces*/
250 while((SPACE_ASCII_VALUE == *param)&& ('\0' != *param) ) param++;
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700251
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700252 /*no argument followed by spaces*/
253 if('\0' == *param)
254 {
255 return -EINVAL;
256 }
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700257
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700258 /*getting the first argument ie the number of channels*/
Mingcheng Zhuc7608ae2013-11-04 15:11:01 -0800259 if (sscanf(param, "%d ", &tempInt) != 1)
260 {
261 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
Jeff Johnsona47e9922013-11-05 12:01:42 -0800262 "%s: Cannot get number of channels from input", __func__);
Mingcheng Zhuc7608ae2013-11-04 15:11:01 -0800263 return -EINVAL;
264 }
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700265
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700266 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
Jeff Johnsona47e9922013-11-05 12:01:42 -0800267 "%s: Number of channel added are: %d", __func__, tempInt);
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700268
Mingcheng Zhuc7608ae2013-11-04 15:11:01 -0800269 if (tempInt <= 0 || tempInt > 255)
270 {
271 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
Jeff Johnsona47e9922013-11-05 12:01:42 -0800272 "%s: Invalid Number of channel received", __func__);
Mingcheng Zhuc7608ae2013-11-04 15:11:01 -0800273 return -EINVAL;
274 }
275
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700276 /*allocating space for the desired number of channels*/
Gopichand Nakkala936715f2013-03-18 19:48:10 +0530277 pSapCtx->SapChnlList.channelList = (v_U8_t *)vos_mem_malloc(tempInt);
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700278
Gopichand Nakkala936715f2013-03-18 19:48:10 +0530279 if (NULL == pSapCtx->SapChnlList.channelList)
280 {
281 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
282 "In %s, VOS_MALLOC_ERR", __func__);
283 return -EINVAL;
284 }
285
286 pSapCtx->SapChnlList.numChannel = tempInt;
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700287 for(j=0;j<pSapCtx->SapChnlList.numChannel;j++)
288 {
289
290 /*param pointing to the beginning of first space after number of channels*/
291 param = strpbrk( param, " " );
292 /*no channel list after the number of channels argument*/
293 if (NULL == param)
294 {
295 sapCleanupChannelList();
296 return -EINVAL;
297 }
298
299 param++;
300
301 /*removing empty space*/
302 while((SPACE_ASCII_VALUE == *param) && ('\0' != *param) ) param++;
303
304 /*no channel list after the number of channels argument and spaces*/
305 if( '\0' == *param )
306 {
307 sapCleanupChannelList();
308 return -EINVAL;
309 }
310
Mingcheng Zhuc7608ae2013-11-04 15:11:01 -0800311 if (sscanf(param, "%d ", &tempInt) != 1)
312 {
313 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
Jeff Johnsona47e9922013-11-05 12:01:42 -0800314 "%s: Cannot read channel number", __func__);
Mingcheng Zhuc7608ae2013-11-04 15:11:01 -0800315 sapCleanupChannelList();
316 return -EINVAL;
317 }
318 if (tempInt < 0 || tempInt > 255)
319 {
320 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
Jeff Johnsona47e9922013-11-05 12:01:42 -0800321 "%s: Invalid channel number received", __func__);
Mingcheng Zhuc7608ae2013-11-04 15:11:01 -0800322 sapCleanupChannelList();
323 return -EINVAL;
324 }
325
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700326 pSapCtx->SapChnlList.channelList[j] = tempInt;
327
328 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
Jeff Johnsona47e9922013-11-05 12:01:42 -0800329 "%s: Channel %d added to preferred channel list",
330 __func__, pSapCtx->SapChnlList.channelList[j] );
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700331
332 }
333
334 /*extra arguments check*/
335 param = strpbrk( param, " " );
336 if (NULL != param)
337 {
338 while((SPACE_ASCII_VALUE == *param) && ('\0' != *param) ) param++;
339
340 if('\0' != *param)
341 {
342 sapCleanupChannelList();
343 return -EINVAL;
344 }
345 }
346
347 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700348 "Exit: %s", __func__);
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700349
350 return 0;
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700351}
352
353/*==========================================================================
354 FUNCTION sapSelectPreferredChannelFromChannelList
355
356 DESCRIPTION
357 Function sapSelectPreferredChannelFromChannelList calculates the best channel
358 among the configured channel list. If channel list not configured then returns
359 the best channel calculated among all the channel list.
360
361 DEPENDENCIES
362 NA.
363
364 PARAMETERS
365
366 IN
367 *pSpectInfoParams : Pointer to tSapChSelSpectInfo structure
368 bestChNum: best channel already calculated among all the chanels
369 pSapCtx: having info of channel list from which best channel is selected
370
371 RETURN VALUE
372 v_U8_t: best channel
373============================================================================*/
374v_U8_t sapSelectPreferredChannelFromChannelList(v_U8_t bestChNum,
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700375 ptSapContext pSapCtx,
376 tSapChSelSpectInfo *pSpectInfoParams)
377{
378 v_U8_t j = 0;
379 v_U8_t count = 0;
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700380
381 //If Channel List is not Configured don't do anything
382 //Else return the Best Channel from the Channel List
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700383 if((NULL == pSapCtx->SapChnlList.channelList) ||
384 (NULL == pSpectInfoParams) ||
385 (0 == pSapCtx->SapChnlList.numChannel))
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700386 {
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700387 return bestChNum;
388 }
389
390 if (bestChNum > 0 && bestChNum <= 252)
391 {
392 for(count=0; count < pSpectInfoParams->numSpectChans ; count++)
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700393 {
394 bestChNum = (v_U8_t)pSpectInfoParams->pSpectCh[count].chNum;
395 // Select the best channel from allowed list
396 for(j=0;j< pSapCtx->SapChnlList.numChannel;j++)
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700397 {
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700398 if( (pSapCtx->SapChnlList.channelList[j]) == bestChNum)
399 {
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700400 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
401 "Best channel computed from Channel List is: %d",
402 bestChNum);
403 return bestChNum;
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700404 }
405 }
Madan Mohan Koyyalamudi1bed5982012-10-22 14:38:06 -0700406 }
407
408 return SAP_CHANNEL_NOT_SELECTED;
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -0700409 }
410 else
411 return SAP_CHANNEL_NOT_SELECTED;
412}
413
414
Jeff Johnson295189b2012-06-20 16:38:30 -0700415/*==========================================================================
416 FUNCTION sapChanSelInit
417
418 DESCRIPTION
419 Function sapChanSelInit allocates the memory, intializes the
420 structures used by the channel selection algorithm
421
422 DEPENDENCIES
423 NA.
424
425 PARAMETERS
426
427 IN
428 *pSpectInfoParams : Pointer to tSapChSelSpectInfo structure
429
430 RETURN VALUE
431 v_BOOL_t: Success or FAIL
432
433 SIDE EFFECTS
434============================================================================*/
435v_BOOL_t sapChanSelInit(tHalHandle halHandle, tSapChSelSpectInfo *pSpectInfoParams)
436{
437 tSapSpectChInfo *pSpectCh = NULL;
438 v_U8_t *pChans = NULL;
439 v_U16_t channelnum = 0;
440 tpAniSirGlobal pMac = PMAC_STRUCT(halHandle);
Leo Chang0b0e45a2013-12-15 15:18:55 -0800441#ifdef FEATURE_WLAN_CH_AVOID
442 v_U16_t i;
443 v_BOOL_t chSafe = VOS_TRUE;
444#endif /* FEATURE_WLAN_CH_AVOID */
Jeff Johnson295189b2012-06-20 16:38:30 -0700445
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700446 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700447
448 // Channels for that 2.4GHz band
449 //Considered only for 2.4GHz need to change in future to support 5GHz support
450 pSpectInfoParams->numSpectChans = pMac->scan.base20MHzChannels.numChannels;
451
452 // Allocate memory for weight computation of 2.4GHz
453 pSpectCh = (tSapSpectChInfo *)vos_mem_malloc((pSpectInfoParams->numSpectChans) * sizeof(*pSpectCh));
454
455 if(pSpectCh == NULL) {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700456 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, "In %s, VOS_MALLOC_ERR", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -0700457 return eSAP_FALSE;
458 }
459
460 vos_mem_zero(pSpectCh, (pSpectInfoParams->numSpectChans) * sizeof(*pSpectCh));
461
462 // Initialize the pointers in the DfsParams to the allocated memory
463 pSpectInfoParams->pSpectCh = pSpectCh;
464
465 pChans = pMac->scan.base20MHzChannels.channelList;
466
467 // Fill the channel number in the spectrum in the operating freq band
468 for (channelnum = 0; channelnum < pSpectInfoParams->numSpectChans; channelnum++) {
Leo Chang0b0e45a2013-12-15 15:18:55 -0800469#ifdef FEATURE_WLAN_CH_AVOID
470 chSafe = VOS_TRUE;
471 for(i = 0; i < NUM_20MHZ_RF_CHANNELS; i++)
472 {
473 if((safeChannels[i].channelNumber == *pChans) &&
474 (VOS_FALSE == safeChannels[i].isSafe))
475 {
476 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
477 "%s : CH %d is not safe", __func__, *pChans);
478 chSafe = VOS_FALSE;
479 break;
480 }
481 }
482#endif /* FEATURE_WLAN_CH_AVOID */
Jeff Johnson295189b2012-06-20 16:38:30 -0700483
484 if(*pChans == 14 ) //OFDM rates are not supported on channel 14
Abhishek Singhb51853c2014-03-13 18:26:41 +0530485 {
486 pChans++;
Kaushik, Sushante054e472014-09-26 19:45:48 +0530487 pSpectCh++;
Jeff Johnson295189b2012-06-20 16:38:30 -0700488 continue;
Abhishek Singhb51853c2014-03-13 18:26:41 +0530489 }
Leo Chang0b0e45a2013-12-15 15:18:55 -0800490#ifdef FEATURE_WLAN_CH_AVOID
491 if (VOS_TRUE == chSafe)
492 {
493#endif /* FEATURE_WLAN_CH_AVOID */
494 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_DEBUG,
495 "%s : Available Ch %d",
496 __func__, *pChans);
497 pSpectCh->chNum = *pChans;
498 pSpectCh->valid = eSAP_TRUE;
499 // Initialise for all channels
500 pSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
501 // Initialise 20MHz for all the Channels
502 pSpectCh->channelWidth = SOFTAP_HT20_CHANNELWIDTH;
Leo Chang0b0e45a2013-12-15 15:18:55 -0800503#ifdef FEATURE_WLAN_CH_AVOID
504 }
505#endif /* FEATURE_WLAN_CH_AVOID */
Kaushik, Sushante054e472014-09-26 19:45:48 +0530506 pSpectCh++;
Jeff Johnson295189b2012-06-20 16:38:30 -0700507 pChans++;
508 }
509 return eSAP_TRUE;
510}
511
512/*==========================================================================
513 FUNCTION sapweightRssiCount
514
515 DESCRIPTION
516 Function weightRssiCount calculates the channel weight due to rssi
517 and data count(here number of BSS observed)
518
519 DEPENDENCIES
520 NA.
521
522 PARAMETERS
523
524 IN
525 rssi : Max signal strength receieved from a BSS for the channel
526 count : Number of BSS observed in the channel
527
528 RETURN VALUE
529 v_U32_t : Calculated channel weight based on above two
530
531 SIDE EFFECTS
532============================================================================*/
533v_U32_t sapweightRssiCount(v_S7_t rssi, v_U16_t count)
534{
535 v_S31_t rssiWeight=0;
536 v_S31_t countWeight=0;
537 v_U32_t rssicountWeight=0;
538
539 // Weight from RSSI
540 rssiWeight = SOFTAP_RSSI_WEIGHT * (rssi - SOFTAP_MIN_RSSI)
541 /(SOFTAP_MAX_RSSI - SOFTAP_MIN_RSSI);
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530542
Jeff Johnson295189b2012-06-20 16:38:30 -0700543 if(rssiWeight > SOFTAP_RSSI_WEIGHT)
544 rssiWeight = SOFTAP_RSSI_WEIGHT;
545 else if (rssiWeight < 0)
546 rssiWeight = 0;
547
548 // Weight from data count
549 countWeight = SOFTAP_COUNT_WEIGHT * (count - SOFTAP_MIN_COUNT)
550 /(SOFTAP_MAX_COUNT - SOFTAP_MIN_COUNT);
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530551
Jeff Johnson295189b2012-06-20 16:38:30 -0700552 if(countWeight > SOFTAP_COUNT_WEIGHT)
553 countWeight = SOFTAP_COUNT_WEIGHT;
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530554
Jeff Johnson295189b2012-06-20 16:38:30 -0700555 rssicountWeight = rssiWeight + countWeight;
556
557 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, rssiWeight=%d, countWeight=%d, rssicountWeight=%d",
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -0700558 __func__, rssiWeight, countWeight, rssicountWeight);
Jeff Johnson295189b2012-06-20 16:38:30 -0700559
560 return(rssicountWeight);
561}
562
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -0800563
564/*==========================================================================
565 FUNCTION sapInterferenceRssiCount
566
567 DESCRIPTION
568 Function sapInterferenceRssiCount Considers the Adjacent channel rssi
569 and data count(here number of BSS observed)
570
571 DEPENDENCIES
572 NA.
573
574 PARAMETERS
575
576 pSpectCh : Channel Information
577
578 RETURN VALUE
579 NA.
580
581 SIDE EFFECTS
582============================================================================*/
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530583void sapInterferenceRssiCount(tSapSpectChInfo *pSpectCh,
584 tSapSpectChInfo *spect_ch_strt_addr,
585 tSapSpectChInfo *spect_ch_end_addr)
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -0800586{
587 tSapSpectChInfo *pExtSpectCh = NULL;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -0700588 v_S31_t rssi;
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530589
Abhishek Singh4eb79062014-04-10 14:48:14 +0530590 if (NULL == pSpectCh)
591 {
592 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
593 "%s: pSpectCh is NULL", __func__);
594 return;
595 }
596
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -0800597 switch(pSpectCh->chNum)
598 {
599 case CHANNEL_1:
600 pExtSpectCh = (pSpectCh + 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530601 if (pExtSpectCh != NULL &&
602 (pExtSpectCh >= spect_ch_strt_addr &&
603 pExtSpectCh < spect_ch_end_addr))
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -0800604 {
605 ++pExtSpectCh->bssCount;
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530606 rssi = pSpectCh->rssiAgr +
607 SAP_24GHZ_FIRST_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -0700608 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
609 {
610 pExtSpectCh->rssiAgr = rssi;
611 }
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530612 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -0800613 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
614 }
615 pExtSpectCh = (pSpectCh + 2);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530616 if (pExtSpectCh != NULL &&
617 (pExtSpectCh >= spect_ch_strt_addr &&
618 pExtSpectCh < spect_ch_end_addr))
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -0800619 {
620 ++pExtSpectCh->bssCount;
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530621 rssi = pSpectCh->rssiAgr +
622 SAP_24GHZ_SEC_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -0700623 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
624 {
625 pExtSpectCh->rssiAgr = rssi;
626 }
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -0800627 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
628 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
629 }
630 pExtSpectCh = (pSpectCh + 3);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530631 if (pExtSpectCh != NULL &&
632 (pExtSpectCh >= spect_ch_strt_addr &&
633 pExtSpectCh < spect_ch_end_addr))
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -0800634 {
635 ++pExtSpectCh->bssCount;
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530636 rssi = pSpectCh->rssiAgr +
637 SAP_24GHZ_THIRD_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -0700638 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
639 {
640 pExtSpectCh->rssiAgr = rssi;
641 }
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -0800642 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
643 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
644 }
645 pExtSpectCh = (pSpectCh + 4);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530646 if (pExtSpectCh != NULL &&
647 (pExtSpectCh >= spect_ch_strt_addr &&
648 pExtSpectCh < spect_ch_end_addr))
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -0800649 {
650 ++pExtSpectCh->bssCount;
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530651 rssi = pSpectCh->rssiAgr +
652 SAP_24GHZ_FOURTH_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -0700653 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
654 {
655 pExtSpectCh->rssiAgr = rssi;
656 }
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530657 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -0800658 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
659 }
660 break;
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530661
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -0800662 case CHANNEL_2:
663 pExtSpectCh = (pSpectCh - 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530664 if (pExtSpectCh != NULL &&
665 (pExtSpectCh >= spect_ch_strt_addr &&
666 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530667 {
668 ++pExtSpectCh->bssCount;
669 rssi = pSpectCh->rssiAgr +
670 SAP_24GHZ_FIRST_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
671 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
672 {
673 pExtSpectCh->rssiAgr = rssi;
674 }
675 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
676 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
677 }
678 pExtSpectCh = (pSpectCh + 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530679 if (pExtSpectCh != NULL &&
680 (pExtSpectCh >= spect_ch_strt_addr &&
681 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530682 {
683 ++pExtSpectCh->bssCount;
684 rssi = pSpectCh->rssiAgr +
685 SAP_24GHZ_FIRST_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
686 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
687 {
688 pExtSpectCh->rssiAgr = rssi;
689 }
690 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
691 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
692 }
693 pExtSpectCh = (pSpectCh + 2);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530694 if (pExtSpectCh != NULL &&
695 (pExtSpectCh >= spect_ch_strt_addr &&
696 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530697 {
698 ++pExtSpectCh->bssCount;
699 rssi = pSpectCh->rssiAgr +
700 SAP_24GHZ_SEC_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
701 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
702 {
703 pExtSpectCh->rssiAgr = rssi;
704 }
705 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
706 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
707 }
708 pExtSpectCh = (pSpectCh + 3);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530709 if (pExtSpectCh != NULL &&
710 (pExtSpectCh >= spect_ch_strt_addr &&
711 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530712 {
713 ++pExtSpectCh->bssCount;
714 rssi = pSpectCh->rssiAgr +
715 SAP_24GHZ_THIRD_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
716 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
717 {
718 pExtSpectCh->rssiAgr = rssi;
719 }
720 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
721 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
722 }
723 pExtSpectCh = (pSpectCh + 4);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530724 if (pExtSpectCh != NULL &&
725 (pExtSpectCh >= spect_ch_strt_addr &&
726 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530727 {
728 ++pExtSpectCh->bssCount;
729 rssi = pSpectCh->rssiAgr +
730 SAP_24GHZ_THIRD_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
731 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
732 {
733 pExtSpectCh->rssiAgr = rssi;
734 }
735 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
736 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
737 }
738 break;
739 case CHANNEL_3:
740 pExtSpectCh = (pSpectCh - 2);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530741 if (pExtSpectCh != NULL &&
742 (pExtSpectCh >= spect_ch_strt_addr &&
743 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530744 {
745 ++pExtSpectCh->bssCount;
746 rssi = pSpectCh->rssiAgr +
747 SAP_24GHZ_SEC_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
748 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
749 {
750 pExtSpectCh->rssiAgr = rssi;
751 }
752 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
753 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
754 }
755 pExtSpectCh = (pSpectCh - 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530756 if (pExtSpectCh != NULL &&
757 (pExtSpectCh >= spect_ch_strt_addr &&
758 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530759 {
760 ++pExtSpectCh->bssCount;
761 rssi = pSpectCh->rssiAgr +
762 SAP_24GHZ_FIRST_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
763 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
764 {
765 pExtSpectCh->rssiAgr = rssi;
766 }
767 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
768 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
769 }
770 pExtSpectCh = (pSpectCh + 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530771 if (pExtSpectCh != NULL &&
772 (pExtSpectCh >= spect_ch_strt_addr &&
773 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530774 {
775 ++pExtSpectCh->bssCount;
776 rssi = pSpectCh->rssiAgr +
777 SAP_24GHZ_FIRST_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
778 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
779 {
780 pExtSpectCh->rssiAgr = rssi;
781 }
782 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
783 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
784 }
785 pExtSpectCh = (pSpectCh + 2);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530786 if (pExtSpectCh != NULL &&
787 (pExtSpectCh >= spect_ch_strt_addr &&
788 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530789 {
790 ++pExtSpectCh->bssCount;
791 rssi = pSpectCh->rssiAgr +
792 SAP_24GHZ_SEC_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
793 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
794 {
795 pExtSpectCh->rssiAgr = rssi;
796 }
797 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
798 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
799 }
800 pExtSpectCh = (pSpectCh + 3);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530801 if (pExtSpectCh != NULL &&
802 (pExtSpectCh >= spect_ch_strt_addr &&
803 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530804 {
805 ++pExtSpectCh->bssCount;
806 rssi = pSpectCh->rssiAgr +
807 SAP_24GHZ_THIRD_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
808 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
809 {
810 pExtSpectCh->rssiAgr = rssi;
811 }
812 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
813 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
814 }
815 pExtSpectCh = (pSpectCh + 4);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530816 if (pExtSpectCh != NULL &&
817 (pExtSpectCh >= spect_ch_strt_addr &&
818 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530819 {
820 ++pExtSpectCh->bssCount;
821 rssi = pSpectCh->rssiAgr +
822 SAP_24GHZ_FOURTH_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
823 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
824 {
825 pExtSpectCh->rssiAgr = rssi;
826 }
827 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
828 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
829 }
830 break;
831 case CHANNEL_4:
832 pExtSpectCh = (pSpectCh - 3);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530833 if (pExtSpectCh != NULL &&
834 (pExtSpectCh >= spect_ch_strt_addr &&
835 pExtSpectCh < spect_ch_end_addr))
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -0800836 {
837 ++pExtSpectCh->bssCount;
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530838 rssi = pSpectCh->rssiAgr +
839 SAP_24GHZ_THIRD_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
840 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
841 {
842 pExtSpectCh->rssiAgr = rssi;
843 }
844 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
845 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
846 }
847 pExtSpectCh = (pSpectCh - 2);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530848 if (pExtSpectCh != NULL &&
849 (pExtSpectCh >= spect_ch_strt_addr &&
850 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530851 {
852 ++pExtSpectCh->bssCount;
853 rssi = pSpectCh->rssiAgr +
854 SAP_24GHZ_SEC_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
855 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
856 {
857 pExtSpectCh->rssiAgr = rssi;
858 }
859 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
860 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
861 }
862 pExtSpectCh = (pSpectCh - 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530863 if (pExtSpectCh != NULL &&
864 (pExtSpectCh >= spect_ch_strt_addr &&
865 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530866 {
867 ++pExtSpectCh->bssCount;
868 rssi = pSpectCh->rssiAgr +
869 SAP_24GHZ_FIRST_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -0700870 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
871 {
872 pExtSpectCh->rssiAgr = rssi;
873 }
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -0800874 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
875 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
876 }
877 pExtSpectCh = (pSpectCh + 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530878 if (pExtSpectCh != NULL &&
879 (pExtSpectCh >= spect_ch_strt_addr &&
880 pExtSpectCh < spect_ch_end_addr))
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -0800881 {
882 ++pExtSpectCh->bssCount;
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530883 rssi = pSpectCh->rssiAgr +
884 SAP_24GHZ_FIRST_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
885 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
886 {
887 pExtSpectCh->rssiAgr = rssi;
888 }
889 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
890 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
891 }
892 pExtSpectCh = (pSpectCh + 2);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530893 if (pExtSpectCh != NULL &&
894 (pExtSpectCh >= spect_ch_strt_addr &&
895 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530896 {
897 ++pExtSpectCh->bssCount;
898 rssi = pSpectCh->rssiAgr +
899 SAP_24GHZ_SEC_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
900 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
901 {
902 pExtSpectCh->rssiAgr = rssi;
903 }
904 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
905 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
906 }
907 pExtSpectCh = (pSpectCh + 3);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530908 if (pExtSpectCh != NULL &&
909 (pExtSpectCh >= spect_ch_strt_addr &&
910 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530911 {
912 ++pExtSpectCh->bssCount;
913 rssi = pSpectCh->rssiAgr +
914 SAP_24GHZ_THIRD_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
915 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
916 {
917 pExtSpectCh->rssiAgr = rssi;
918 }
919 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
920 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
921 }
922 pExtSpectCh = (pSpectCh + 4);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530923 if (pExtSpectCh != NULL &&
924 (pExtSpectCh >= spect_ch_strt_addr &&
925 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530926 {
927 ++pExtSpectCh->bssCount;
928 rssi = pSpectCh->rssiAgr +
929 SAP_24GHZ_FOURTH_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
930 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
931 {
932 pExtSpectCh->rssiAgr = rssi;
933 }
934 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
935 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
936 }
937 break;
938
939 case CHANNEL_5:
940 case CHANNEL_6:
941 case CHANNEL_7:
942 pExtSpectCh = (pSpectCh - 4);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530943 if (pExtSpectCh != NULL &&
944 (pExtSpectCh >= spect_ch_strt_addr &&
945 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530946 {
947 ++pExtSpectCh->bssCount;
948 rssi = pSpectCh->rssiAgr +
949 SAP_24GHZ_FOURTH_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -0700950 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
951 {
952 pExtSpectCh->rssiAgr = rssi;
953 }
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -0800954 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
955 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
956 }
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530957 pExtSpectCh = (pSpectCh - 3);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530958 if (pExtSpectCh != NULL &&
959 (pExtSpectCh >= spect_ch_strt_addr &&
960 pExtSpectCh < spect_ch_end_addr))
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -0800961 {
962 ++pExtSpectCh->bssCount;
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530963 rssi = pSpectCh->rssiAgr +
964 SAP_24GHZ_THIRD_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -0700965 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
966 {
967 pExtSpectCh->rssiAgr = rssi;
968 }
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -0800969 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
970 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
971 }
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530972 pExtSpectCh = (pSpectCh - 2);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530973 if (pExtSpectCh != NULL &&
974 (pExtSpectCh >= spect_ch_strt_addr &&
975 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530976 {
977 ++pExtSpectCh->bssCount;
978 rssi = pSpectCh->rssiAgr +
979 SAP_24GHZ_SEC_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
980 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
981 {
982 pExtSpectCh->rssiAgr = rssi;
983 }
984 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
985 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
986 }
987 pExtSpectCh = (pSpectCh - 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +0530988 if (pExtSpectCh != NULL &&
989 (pExtSpectCh >= spect_ch_strt_addr &&
990 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +0530991 {
992 ++pExtSpectCh->bssCount;
993 rssi = pSpectCh->rssiAgr +
994 SAP_24GHZ_FIRST_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
995 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
996 {
997 pExtSpectCh->rssiAgr = rssi;
998 }
999 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1000 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1001 }
1002 pExtSpectCh = (pSpectCh + 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301003 if (pExtSpectCh != NULL &&
1004 (pExtSpectCh >= spect_ch_strt_addr &&
1005 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301006 {
1007 ++pExtSpectCh->bssCount;
1008 rssi = pSpectCh->rssiAgr +
1009 SAP_24GHZ_FIRST_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1010 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1011 {
1012 pExtSpectCh->rssiAgr = rssi;
1013 }
1014 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1015 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1016 }
1017 pExtSpectCh = (pSpectCh + 2);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301018 if (pExtSpectCh != NULL &&
1019 (pExtSpectCh >= spect_ch_strt_addr &&
1020 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301021 {
1022 ++pExtSpectCh->bssCount;
1023 rssi = pSpectCh->rssiAgr +
1024 SAP_24GHZ_SEC_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1025 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1026 {
1027 pExtSpectCh->rssiAgr = rssi;
1028 }
1029 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1030 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1031 }
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -08001032 pExtSpectCh = (pSpectCh + 3);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301033 if (pExtSpectCh != NULL &&
1034 (pExtSpectCh >= spect_ch_strt_addr &&
1035 pExtSpectCh < spect_ch_end_addr))
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -08001036 {
1037 ++pExtSpectCh->bssCount;
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301038 rssi = pSpectCh->rssiAgr +
1039 SAP_24GHZ_THIRD_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1040 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1041 {
1042 pExtSpectCh->rssiAgr = rssi;
1043 }
1044 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1045 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1046 }
1047 pExtSpectCh = (pSpectCh + 4);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301048 if (pExtSpectCh != NULL &&
1049 (pExtSpectCh >= spect_ch_strt_addr &&
1050 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301051 {
1052 ++pExtSpectCh->bssCount;
1053 rssi = pSpectCh->rssiAgr +
1054 SAP_24GHZ_FOURTH_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -07001055 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1056 {
1057 pExtSpectCh->rssiAgr = rssi;
1058 }
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -08001059 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1060 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1061 }
1062 break;
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301063
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -08001064 case CHANNEL_8:
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -08001065 pExtSpectCh = (pSpectCh - 4);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301066 if (pExtSpectCh != NULL &&
1067 (pExtSpectCh >= spect_ch_strt_addr &&
1068 pExtSpectCh < spect_ch_end_addr))
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -08001069 {
1070 ++pExtSpectCh->bssCount;
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301071 rssi = pSpectCh->rssiAgr +
1072 SAP_24GHZ_FOURTH_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1073 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1074 {
1075 pExtSpectCh->rssiAgr = rssi;
1076 }
1077 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1078 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1079 }
1080
1081 pExtSpectCh = (pSpectCh - 3);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301082 if (pExtSpectCh != NULL &&
1083 (pExtSpectCh >= spect_ch_strt_addr &&
1084 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301085 {
1086 ++pExtSpectCh->bssCount;
1087 rssi = pSpectCh->rssiAgr +
1088 SAP_24GHZ_THIRD_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1089 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1090 {
1091 pExtSpectCh->rssiAgr = rssi;
1092 }
1093 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1094 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1095 }
1096 pExtSpectCh = (pSpectCh - 2);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301097 if (pExtSpectCh != NULL &&
1098 (pExtSpectCh >= spect_ch_strt_addr &&
1099 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301100 {
1101 ++pExtSpectCh->bssCount;
1102 rssi = pSpectCh->rssiAgr +
1103 SAP_24GHZ_SEC_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1104 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1105 {
1106 pExtSpectCh->rssiAgr = rssi;
1107 }
1108 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1109 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1110 }
1111 pExtSpectCh = (pSpectCh - 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301112 if (pExtSpectCh != NULL &&
1113 (pExtSpectCh >= spect_ch_strt_addr &&
1114 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301115 {
1116 ++pExtSpectCh->bssCount;
1117 rssi = pSpectCh->rssiAgr +
1118 SAP_24GHZ_FIRST_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1119 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1120 {
1121 pExtSpectCh->rssiAgr = rssi;
1122 }
1123 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1124 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1125 }
1126 pExtSpectCh = (pSpectCh + 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301127 if (pExtSpectCh != NULL &&
1128 (pExtSpectCh >= spect_ch_strt_addr &&
1129 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301130 {
1131 ++pExtSpectCh->bssCount;
1132 rssi = pSpectCh->rssiAgr +
1133 SAP_24GHZ_FIRST_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1134 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1135 {
1136 pExtSpectCh->rssiAgr = rssi;
1137 }
1138 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1139 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1140 }
1141 pExtSpectCh = (pSpectCh + 2);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301142 if (pExtSpectCh != NULL &&
1143 (pExtSpectCh >= spect_ch_strt_addr &&
1144 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301145 {
1146 ++pExtSpectCh->bssCount;
1147 rssi = pSpectCh->rssiAgr +
1148 SAP_24GHZ_SEC_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1149 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1150 {
1151 pExtSpectCh->rssiAgr = rssi;
1152 }
1153 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1154 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1155 }
1156 pExtSpectCh = (pSpectCh + 3);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301157 if (pExtSpectCh != NULL &&
1158 (pExtSpectCh >= spect_ch_strt_addr &&
1159 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301160 {
1161 ++pExtSpectCh->bssCount;
1162 rssi = pSpectCh->rssiAgr +
1163 SAP_24GHZ_THIRD_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1164 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1165 {
1166 pExtSpectCh->rssiAgr = rssi;
1167 }
1168 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1169 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1170 }
1171 break;
1172
1173 case CHANNEL_9:
1174 pExtSpectCh = (pSpectCh - 4);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301175 if (pExtSpectCh != NULL &&
1176 (pExtSpectCh >= spect_ch_strt_addr &&
1177 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301178 {
1179 ++pExtSpectCh->bssCount;
1180 rssi = pSpectCh->rssiAgr +
1181 SAP_24GHZ_FOURTH_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -07001182 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1183 {
1184 pExtSpectCh->rssiAgr = rssi;
1185 }
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -08001186 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1187 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1188 }
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301189
1190 pExtSpectCh = (pSpectCh - 3);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301191 if (pExtSpectCh != NULL &&
1192 (pExtSpectCh >= spect_ch_strt_addr &&
1193 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301194 {
1195 ++pExtSpectCh->bssCount;
1196 rssi = pSpectCh->rssiAgr +
1197 SAP_24GHZ_THIRD_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1198 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1199 {
1200 pExtSpectCh->rssiAgr = rssi;
1201 }
1202 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1203 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1204 }
1205 pExtSpectCh = (pSpectCh - 2);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301206 if (pExtSpectCh != NULL &&
1207 (pExtSpectCh >= spect_ch_strt_addr &&
1208 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301209 {
1210 ++pExtSpectCh->bssCount;
1211 rssi = pSpectCh->rssiAgr +
1212 SAP_24GHZ_SEC_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1213 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1214 {
1215 pExtSpectCh->rssiAgr = rssi;
1216 }
1217 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1218 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1219 }
1220 pExtSpectCh = (pSpectCh - 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301221 if (pExtSpectCh != NULL &&
1222 (pExtSpectCh >= spect_ch_strt_addr &&
1223 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301224 {
1225 ++pExtSpectCh->bssCount;
1226 rssi = pSpectCh->rssiAgr +
1227 SAP_24GHZ_FIRST_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1228 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1229 {
1230 pExtSpectCh->rssiAgr = rssi;
1231 }
1232 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1233 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1234 }
1235 pExtSpectCh = (pSpectCh + 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301236 if (pExtSpectCh != NULL &&
1237 (pExtSpectCh >= spect_ch_strt_addr &&
1238 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301239 {
1240 ++pExtSpectCh->bssCount;
1241 rssi = pSpectCh->rssiAgr +
1242 SAP_24GHZ_FIRST_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1243 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1244 {
1245 pExtSpectCh->rssiAgr = rssi;
1246 }
1247 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1248 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1249 }
1250 pExtSpectCh = (pSpectCh + 2);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301251 if (pExtSpectCh != NULL &&
1252 (pExtSpectCh >= spect_ch_strt_addr &&
1253 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301254 {
1255 ++pExtSpectCh->bssCount;
1256 rssi = pSpectCh->rssiAgr +
1257 SAP_24GHZ_SEC_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1258 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1259 {
1260 pExtSpectCh->rssiAgr = rssi;
1261 }
1262 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1263 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1264 }
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -08001265 break;
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301266
1267 case CHANNEL_10:
1268 pExtSpectCh = (pSpectCh - 4);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301269 if (pExtSpectCh != NULL &&
1270 (pExtSpectCh >= spect_ch_strt_addr &&
1271 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301272 {
1273 ++pExtSpectCh->bssCount;
1274 rssi = pSpectCh->rssiAgr +
1275 SAP_24GHZ_FOURTH_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1276 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1277 {
1278 pExtSpectCh->rssiAgr = rssi;
1279 }
1280 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1281 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1282 }
1283
1284 pExtSpectCh = (pSpectCh - 3);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301285 if (pExtSpectCh != NULL &&
1286 (pExtSpectCh >= spect_ch_strt_addr &&
1287 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301288 {
1289 ++pExtSpectCh->bssCount;
1290 rssi = pSpectCh->rssiAgr +
1291 SAP_24GHZ_THIRD_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1292 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1293 {
1294 pExtSpectCh->rssiAgr = rssi;
1295 }
1296 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1297 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1298 }
1299 pExtSpectCh = (pSpectCh - 2);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301300 if (pExtSpectCh != NULL &&
1301 (pExtSpectCh >= spect_ch_strt_addr &&
1302 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301303 {
1304 ++pExtSpectCh->bssCount;
1305 rssi = pSpectCh->rssiAgr +
1306 SAP_24GHZ_SEC_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1307 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1308 {
1309 pExtSpectCh->rssiAgr = rssi;
1310 }
1311 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1312 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1313 }
1314 pExtSpectCh = (pSpectCh - 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301315 if (pExtSpectCh != NULL &&
1316 (pExtSpectCh >= spect_ch_strt_addr &&
1317 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301318 {
1319 ++pExtSpectCh->bssCount;
1320 rssi = pSpectCh->rssiAgr +
1321 SAP_24GHZ_FIRST_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1322 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1323 {
1324 pExtSpectCh->rssiAgr = rssi;
1325 }
1326 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1327 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1328 }
1329 pExtSpectCh = (pSpectCh + 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301330 if (pExtSpectCh != NULL &&
1331 (pExtSpectCh >= spect_ch_strt_addr &&
1332 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301333 {
1334 ++pExtSpectCh->bssCount;
1335 rssi = pSpectCh->rssiAgr +
1336 SAP_24GHZ_FIRST_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1337 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1338 {
1339 pExtSpectCh->rssiAgr = rssi;
1340 }
1341 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1342 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1343 }
1344 break;
1345
1346 case CHANNEL_11:
1347 pExtSpectCh = (pSpectCh - 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301348 if (pExtSpectCh != NULL &&
1349 (pExtSpectCh >= spect_ch_strt_addr &&
1350 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301351 {
1352 ++pExtSpectCh->bssCount;
1353 rssi = pSpectCh->rssiAgr +
1354 SAP_24GHZ_FIRST_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1355 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1356 {
1357 pExtSpectCh->rssiAgr = rssi;
1358 }
1359 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1360 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1361 }
1362 pExtSpectCh = (pSpectCh - 2);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301363 if (pExtSpectCh != NULL &&
1364 (pExtSpectCh >= spect_ch_strt_addr &&
1365 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301366 {
1367 ++pExtSpectCh->bssCount;
1368 rssi = pSpectCh->rssiAgr +
1369 SAP_24GHZ_SEC_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1370 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1371 {
1372 pExtSpectCh->rssiAgr = rssi;
1373 }
1374 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1375 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1376 }
1377 pExtSpectCh = (pSpectCh - 3);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301378 if (pExtSpectCh != NULL &&
1379 (pExtSpectCh >= spect_ch_strt_addr &&
1380 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301381 {
1382 ++pExtSpectCh->bssCount;
1383 rssi = pSpectCh->rssiAgr +
1384 SAP_24GHZ_THIRD_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1385 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1386 {
1387 pExtSpectCh->rssiAgr = rssi;
1388 }
1389 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1390 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1391 }
1392 pExtSpectCh = (pSpectCh - 4);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301393 if (pExtSpectCh != NULL &&
1394 (pExtSpectCh >= spect_ch_strt_addr &&
1395 pExtSpectCh < spect_ch_end_addr))
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301396 {
1397 ++pExtSpectCh->bssCount;
1398 rssi = pSpectCh->rssiAgr +
1399 SAP_24GHZ_FOURTH_OVERLAP_CHAN_RSSI_EFFECT_PRIMARY;
1400 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1401 {
1402 pExtSpectCh->rssiAgr = rssi;
1403 }
1404 if (pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1405 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1406 }
1407 break;
1408
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -08001409 default:
1410 break;
1411 }
1412}
1413
Jeff Johnson295189b2012-06-20 16:38:30 -07001414/*==========================================================================
1415 FUNCTION sapComputeSpectWeight
1416
1417 DESCRIPTION
1418 Main function for computing the weight of each channel in the
1419 spectrum based on the RSSI value of the BSSes on the channel
1420 and number of BSS
1421
1422 DEPENDENCIES
1423 NA.
1424
1425 PARAMETERS
1426
1427 IN
1428 pSpectInfoParams : Pointer to the tSpectInfoParams structure
1429 halHandle : Pointer to HAL handle
1430 pResult : Pointer to tScanResultHandle
1431
1432 RETURN VALUE
1433 void : NULL
1434
1435 SIDE EFFECTS
1436============================================================================*/
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301437void sapComputeSpectWeight( tSapChSelSpectInfo* pSpectInfoParams,
1438 tHalHandle halHandle, tScanResultHandle pResult)
Jeff Johnson295189b2012-06-20 16:38:30 -07001439{
1440 v_S7_t rssi = 0;
1441 v_U8_t chn_num = 0;
1442 v_U8_t channel_id = 0;
1443
1444 tCsrScanResultInfo *pScanResult;
1445 tSapSpectChInfo *pSpectCh = pSpectInfoParams->pSpectCh;
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001446 v_U32_t operatingBand;
Prathyusha Kuntupalli7b8f6aa2012-12-10 13:17:35 -08001447 v_U16_t channelWidth;
1448 v_U16_t secondaryChannelOffset;
1449 v_U16_t centerFreq;
1450 v_U16_t vhtSupport;
1451 v_U32_t ieLen = 0;
1452 tSirProbeRespBeacon *pBeaconStruct;
1453 tpAniSirGlobal pMac = (tpAniSirGlobal) halHandle;
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301454 tSapSpectChInfo *pSpectChStartAddr = pSpectInfoParams->pSpectCh;
1455 tSapSpectChInfo *pSpectChEndAddr =
1456 pSpectInfoParams->pSpectCh + pSpectInfoParams->numSpectChans;
Jeff Johnson295189b2012-06-20 16:38:30 -07001457
Bansidhar Gopalachari0a96a382013-07-24 16:55:34 +05301458 pBeaconStruct = vos_mem_malloc(sizeof(tSirProbeRespBeacon));
1459 if ( NULL == pBeaconStruct )
Prathyusha Kuntupalli7b8f6aa2012-12-10 13:17:35 -08001460 {
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301461 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
Sushant Kaushik87787972015-09-11 16:05:00 +05301462 "Unable to allocate memory in sapComputeSpectWeight");
Prathyusha Kuntupalli7b8f6aa2012-12-10 13:17:35 -08001463 return;
1464 }
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001465 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, Computing spectral weight", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001466
1467 /**
1468 * Soft AP specific channel weight calculation using DFS formula
1469 */
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001470 ccmCfgGetInt( halHandle, WNI_CFG_SAP_CHANNEL_SELECT_OPERATING_BAND, &operatingBand);
Jeff Johnson295189b2012-06-20 16:38:30 -07001471
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301472 pScanResult = sme_ScanResultGetFirst(halHandle, pResult);
Jeff Johnson295189b2012-06-20 16:38:30 -07001473
1474 while (pScanResult) {
1475 pSpectCh = pSpectInfoParams->pSpectCh;
Prathyusha Kuntupalli7b8f6aa2012-12-10 13:17:35 -08001476 // Defining the default values, so that any value will hold the default values
1477 channelWidth = eHT_CHANNEL_WIDTH_20MHZ;
1478 secondaryChannelOffset = PHY_SINGLE_CHANNEL_CENTERED;
1479 vhtSupport = 0;
1480 centerFreq = 0;
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301481
1482 if (pScanResult->BssDescriptor.ieFields != NULL)
Prathyusha Kuntupalli7b8f6aa2012-12-10 13:17:35 -08001483 {
Abhishek Singhbad2b322016-10-21 11:22:33 +05301484 ieLen = GET_IE_LEN_IN_BSS(pScanResult->BssDescriptor.length);
Bansidhar Gopalachari0a96a382013-07-24 16:55:34 +05301485 vos_mem_set((tANI_U8 *) pBeaconStruct, sizeof(tSirProbeRespBeacon), 0);
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301486
Prathyusha Kuntupalli7b8f6aa2012-12-10 13:17:35 -08001487 if ((sirParseBeaconIE(pMac, pBeaconStruct,(tANI_U8 *)( pScanResult->BssDescriptor.ieFields), ieLen)) == eSIR_SUCCESS)
1488 {
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301489 if (pBeaconStruct->HTCaps.present && pBeaconStruct->HTInfo.present)
Prathyusha Kuntupalli7b8f6aa2012-12-10 13:17:35 -08001490 {
1491 channelWidth = pBeaconStruct->HTCaps.supportedChannelWidthSet;
1492 secondaryChannelOffset = pBeaconStruct->HTInfo.secondaryChannelOffset;
1493 if(pBeaconStruct->VHTOperation.present)
1494 {
1495 vhtSupport = pBeaconStruct->VHTOperation.present;
1496 if(pBeaconStruct->VHTOperation.chanWidth > WNI_CFG_VHT_CHANNEL_WIDTH_20_40MHZ)
1497 {
1498 channelWidth = eHT_CHANNEL_WIDTH_80MHZ;
1499 centerFreq = pBeaconStruct->VHTOperation.chanCenterFreqSeg1;
1500 }
1501 }
1502 }
1503 }
1504 }
Madan Mohan Koyyalamudi1e02f7f2012-12-04 16:46:45 -08001505 // Processing for each tCsrScanResultInfo in the tCsrScanResult DLink list
Jeff Johnson295189b2012-06-20 16:38:30 -07001506 for (chn_num = 0; chn_num < pSpectInfoParams->numSpectChans; chn_num++) {
1507
1508 /*
1509 * if the Beacon has channel ID, use it other wise we will
1510 * rely on the channelIdSelf
1511 */
1512 if(pScanResult->BssDescriptor.channelId == 0)
1513 channel_id = pScanResult->BssDescriptor.channelIdSelf;
1514 else
1515 channel_id = pScanResult->BssDescriptor.channelId;
1516
krunal sonic39d9592014-02-04 11:54:24 -08001517 if (pSpectCh && (channel_id == pSpectCh->chNum)) {
Jeff Johnson295189b2012-06-20 16:38:30 -07001518 if (pSpectCh->rssiAgr < pScanResult->BssDescriptor.rssi)
1519 pSpectCh->rssiAgr = pScanResult->BssDescriptor.rssi;
1520
1521 ++pSpectCh->bssCount; // Increment the count of BSS
1522
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001523 if(operatingBand) // Connsidering the Extension Channel only in a channels
1524 {
1525 /* Updating the received ChannelWidth */
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301526 if (pSpectCh->channelWidth != channelWidth)
1527 pSpectCh->channelWidth = channelWidth;
Madan Mohan Koyyalamudi1e02f7f2012-12-04 16:46:45 -08001528 /* If received ChannelWidth is other than HT20, we need to update the extension channel Params as well */
1529 /* channelWidth == 0, HT20 */
1530 /* channelWidth == 1, HT40 */
1531 /* channelWidth == 2, VHT80*/
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001532 switch(pSpectCh->channelWidth)
1533 {
1534 case eHT_CHANNEL_WIDTH_40MHZ: //HT40
Prathyusha Kuntupalli7b8f6aa2012-12-10 13:17:35 -08001535 switch( secondaryChannelOffset)
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001536 {
1537 tSapSpectChInfo *pExtSpectCh = NULL;
1538 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY: // Above the Primary Channel
1539 pExtSpectCh = (pSpectCh + 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301540 if( pExtSpectCh != NULL &&
1541 (pExtSpectCh >= pSpectChStartAddr &&
1542 pExtSpectCh < pSpectChEndAddr))
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001543 {
1544 ++pExtSpectCh->bssCount;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -07001545 rssi = pSpectCh->rssiAgr + SAP_SUBBAND1_RSSI_EFFECT_PRIMARY;
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001546 // REducing the rssi by -20 and assigning it to Extension channel
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -07001547 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1548 {
1549 pExtSpectCh->rssiAgr = rssi;
1550 }
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001551 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1552 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1553 }
1554 break;
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301555
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001556 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY: // Below the Primary channel
1557 pExtSpectCh = (pSpectCh - 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301558 if( pExtSpectCh != NULL &&
1559 (pExtSpectCh >= pSpectChStartAddr &&
1560 pExtSpectCh < pSpectChEndAddr))
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001561 {
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -07001562 rssi = pSpectCh->rssiAgr + SAP_SUBBAND1_RSSI_EFFECT_PRIMARY;
1563 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1564 {
1565 pExtSpectCh->rssiAgr = rssi;
1566 }
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001567 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1568 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1569 ++pExtSpectCh->bssCount;
1570 }
1571 break;
1572 }
1573 break;
1574 case eHT_CHANNEL_WIDTH_80MHZ: // VHT80
Prathyusha Kuntupalli7b8f6aa2012-12-10 13:17:35 -08001575 if((centerFreq - channel_id) == 6)
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001576 {
1577 tSapSpectChInfo *pExtSpectCh = NULL;
1578 pExtSpectCh = (pSpectCh + 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301579 if( pExtSpectCh != NULL &&
1580 (pExtSpectCh >= pSpectChStartAddr &&
1581 pExtSpectCh < pSpectChEndAddr))
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001582 {
1583 ++pExtSpectCh->bssCount;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -07001584 rssi = pSpectCh->rssiAgr + SAP_SUBBAND1_RSSI_EFFECT_PRIMARY;
1585 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1586 {
1587 pExtSpectCh->rssiAgr = rssi; // Reducing the rssi by -20 and assigning it to Subband 1
1588 }
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001589 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1590 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1591 }
1592 pExtSpectCh = (pSpectCh + 2);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301593 if( pExtSpectCh != NULL &&
1594 (pExtSpectCh >= pSpectChStartAddr &&
1595 pExtSpectCh < pSpectChEndAddr))
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001596 {
1597 ++pExtSpectCh->bssCount;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -07001598 rssi = pSpectCh->rssiAgr + SAP_SUBBAND2_RSSI_EFFECT_PRIMARY;
1599 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1600 {
1601 pExtSpectCh->rssiAgr = rssi; // Reducing the rssi by -30 and assigning it to Subband 2
1602 }
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001603 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1604 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1605 }
1606 pExtSpectCh = (pSpectCh + 3);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301607 if( pExtSpectCh != NULL &&
1608 (pExtSpectCh >= pSpectChStartAddr &&
1609 pExtSpectCh < pSpectChEndAddr))
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001610 {
1611 ++pExtSpectCh->bssCount;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -07001612 rssi = pSpectCh->rssiAgr + SAP_SUBBAND3_RSSI_EFFECT_PRIMARY;
1613 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1614 {
1615 pExtSpectCh->rssiAgr = rssi; // Reducing the rssi by -40 and assigning it to Subband 3
1616 }
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001617 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1618 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301619 }
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001620 }
Prathyusha Kuntupalli7b8f6aa2012-12-10 13:17:35 -08001621 else if((centerFreq - channel_id) == 2)
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001622 {
1623 tSapSpectChInfo *pExtSpectCh = NULL;
1624 pExtSpectCh = (pSpectCh - 1 );
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301625 if( pExtSpectCh != NULL &&
1626 (pExtSpectCh >= pSpectChStartAddr &&
1627 pExtSpectCh < pSpectChEndAddr))
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001628 {
1629 ++pExtSpectCh->bssCount;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -07001630 rssi = pSpectCh->rssiAgr + SAP_SUBBAND1_RSSI_EFFECT_PRIMARY;
1631 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1632 {
1633 pExtSpectCh->rssiAgr = rssi;
1634 }
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001635 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1636 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1637 }
1638 pExtSpectCh = (pSpectCh + 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301639 if( pExtSpectCh != NULL &&
1640 (pExtSpectCh >= pSpectChStartAddr &&
1641 pExtSpectCh < pSpectChEndAddr))
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001642 {
1643 ++pExtSpectCh->bssCount;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -07001644 rssi = pSpectCh->rssiAgr + SAP_SUBBAND1_RSSI_EFFECT_PRIMARY;
1645 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1646 {
1647 pExtSpectCh->rssiAgr = rssi;
1648 }
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001649 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1650 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1651 }
1652 pExtSpectCh = (pSpectCh + 2);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301653 if( pExtSpectCh != NULL &&
1654 (pExtSpectCh >= pSpectChStartAddr &&
1655 pExtSpectCh < pSpectChEndAddr))
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001656 {
1657 ++pExtSpectCh->bssCount;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -07001658 rssi = pSpectCh->rssiAgr + SAP_SUBBAND2_RSSI_EFFECT_PRIMARY;
1659 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1660 {
1661 pExtSpectCh->rssiAgr = rssi;
1662 }
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001663 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1664 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1665 }
1666 }
Prathyusha Kuntupalli7b8f6aa2012-12-10 13:17:35 -08001667 else if((centerFreq - channel_id) == -2)
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001668 {
1669 tSapSpectChInfo *pExtSpectCh = NULL;
1670 pExtSpectCh = (pSpectCh - 1 );
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301671 if( pExtSpectCh != NULL &&
1672 (pExtSpectCh >= pSpectChStartAddr &&
1673 pExtSpectCh < pSpectChEndAddr))
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001674 {
1675 ++pExtSpectCh->bssCount;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -07001676 rssi = pSpectCh->rssiAgr + SAP_SUBBAND1_RSSI_EFFECT_PRIMARY;
1677 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1678 {
1679 pExtSpectCh->rssiAgr = rssi;
1680 }
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001681 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1682 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1683 }
1684 pExtSpectCh = (pSpectCh - 2);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301685 if( pExtSpectCh != NULL &&
1686 (pExtSpectCh >= pSpectChStartAddr &&
1687 pExtSpectCh < pSpectChEndAddr))
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001688 {
1689 ++pExtSpectCh->bssCount;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -07001690 rssi = pSpectCh->rssiAgr + SAP_SUBBAND2_RSSI_EFFECT_PRIMARY;
1691 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1692 {
1693 pExtSpectCh->rssiAgr = rssi;
1694 }
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001695 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1696 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1697 }
1698 pExtSpectCh = (pSpectCh + 1);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301699 if( pExtSpectCh != NULL &&
1700 (pExtSpectCh >= pSpectChStartAddr &&
1701 pExtSpectCh < pSpectChEndAddr))
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001702 {
1703 ++pExtSpectCh->bssCount;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -07001704 rssi = pSpectCh->rssiAgr + SAP_SUBBAND1_RSSI_EFFECT_PRIMARY;
1705 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1706 {
1707 pExtSpectCh->rssiAgr = rssi;
1708 }
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001709 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1710 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1711 }
1712 }
Prathyusha Kuntupalli7b8f6aa2012-12-10 13:17:35 -08001713 else if((centerFreq - channel_id) == -6)
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001714 {
1715 tSapSpectChInfo *pExtSpectCh = NULL;
1716 pExtSpectCh = (pSpectCh - 1 );
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301717 if( pExtSpectCh != NULL &&
1718 (pExtSpectCh >= pSpectChStartAddr &&
1719 pExtSpectCh < pSpectChEndAddr))
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001720 {
1721 ++pExtSpectCh->bssCount;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -07001722 rssi = pSpectCh->rssiAgr + SAP_SUBBAND1_RSSI_EFFECT_PRIMARY;
1723 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1724 {
1725 pExtSpectCh->rssiAgr = rssi;
1726 }
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001727 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1728 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1729 }
1730 pExtSpectCh = (pSpectCh - 2);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301731 if( pExtSpectCh != NULL &&
1732 (pExtSpectCh >= pSpectChStartAddr &&
1733 pExtSpectCh < pSpectChEndAddr))
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001734 {
1735 ++pExtSpectCh->bssCount;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -07001736 rssi = pSpectCh->rssiAgr + SAP_SUBBAND2_RSSI_EFFECT_PRIMARY;
1737 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1738 {
1739 pExtSpectCh->rssiAgr = rssi;
1740 }
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001741 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1742 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1743 }
1744 pExtSpectCh = (pSpectCh - 3);
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301745 if( pExtSpectCh != NULL &&
1746 (pExtSpectCh >= pSpectChStartAddr &&
1747 pExtSpectCh < pSpectChEndAddr))
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001748 {
1749 ++pExtSpectCh->bssCount;
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -07001750 rssi = pSpectCh->rssiAgr + SAP_SUBBAND3_RSSI_EFFECT_PRIMARY;
1751 if (IS_RSSI_VALID(pExtSpectCh->rssiAgr, rssi))
1752 {
1753 pExtSpectCh->rssiAgr = rssi;
1754 }
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001755 if(pExtSpectCh->rssiAgr < SOFTAP_MIN_RSSI)
1756 pExtSpectCh->rssiAgr = SOFTAP_MIN_RSSI;
1757 }
1758 }
1759 break;
1760 }
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301761 }
Leela Venkata Kiran Kumar Reddy Chirala9f6566c2014-09-05 19:06:58 +05301762 else if(operatingBand == eSAP_RF_SUBBAND_2_4_GHZ)
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -08001763 {
gaurank kathpalia51a0d6c2017-11-27 14:40:58 +05301764 sapInterferenceRssiCount(pSpectCh, pSpectChStartAddr,
1765 pSpectChEndAddr);
Venkata Prathyusha Kuntupallie2e72082013-01-30 17:37:50 -08001766 }
Madan Mohan Koyyalamudi527935a2012-12-04 16:41:16 -08001767
Jeff Johnson295189b2012-06-20 16:38:30 -07001768 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
Jeff Johnson797280e2017-09-19 08:36:01 -07001769 "In %s, bssdes.ch_self=%d, bssdes.ch_ID=%d, bssdes.rssi=%d, SpectCh.bssCount=%d, pScanResult=%pK, ChannelWidth %d, secondaryChanOffset %d, center frequency %d ",
Prathyusha Kuntupalli7b8f6aa2012-12-10 13:17:35 -08001770 __func__, pScanResult->BssDescriptor.channelIdSelf, pScanResult->BssDescriptor.channelId, pScanResult->BssDescriptor.rssi, pSpectCh->bssCount, pScanResult,pSpectCh->channelWidth,secondaryChannelOffset,centerFreq);
Jeff Johnson295189b2012-06-20 16:38:30 -07001771 pSpectCh++;
1772 break;
1773 } else {
1774 pSpectCh++;
1775 }
1776 }
1777
1778 pScanResult = sme_ScanResultGetNext(halHandle, pResult);
1779 }
1780
1781 // Calculate the weights for all channels in the spectrum pSpectCh
1782 pSpectCh = pSpectInfoParams->pSpectCh;
1783
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07001784 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, Spectrum Channels Weight", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07001785
1786 for (chn_num = 0; chn_num < (pSpectInfoParams->numSpectChans); chn_num++) {
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301787
Jeff Johnson295189b2012-06-20 16:38:30 -07001788 /*
1789 rssi : Maximum received signal strength among all BSS on that channel
1790 bssCount : Number of BSS on that channel
1791 */
1792
1793 rssi = (v_S7_t)pSpectCh->rssiAgr;
1794
Abhishek Singh906b91f2015-07-02 12:25:52 +05301795 pSpectCh->weight =
1796 SAPDFS_NORMALISE_1000 * sapweightRssiCount(rssi, pSpectCh->bssCount);
1797 pSpectCh->weight_copy = pSpectCh->weight;
Madan Mohan Koyyalamudi8c8bb1e2013-08-26 23:13:07 +05301798 //------ Debug Info ------
1799 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
1800 "In %s, Chan=%d Weight= %d rssiAgr=%d bssCount=%d", __func__,
1801 pSpectCh->chNum, pSpectCh->weight,
1802 pSpectCh->rssiAgr, pSpectCh->bssCount);
1803 //------ Debug Info ------
Jeff Johnson295189b2012-06-20 16:38:30 -07001804 pSpectCh++;
1805 }
Bansidhar Gopalachari0a96a382013-07-24 16:55:34 +05301806 vos_mem_free(pBeaconStruct);
Jeff Johnson295189b2012-06-20 16:38:30 -07001807}
1808
1809/*==========================================================================
1810 FUNCTION sapChanSelExit
1811
1812 DESCRIPTION
1813 Exit function for free out the allocated memory, to be called
1814 at the end of the dfsSelectChannel function
1815
1816 DEPENDENCIES
1817 NA.
1818
1819 PARAMETERS
1820
1821 IN
1822 pSpectInfoParams : Pointer to the tSapChSelSpectInfo structure
1823
1824 RETURN VALUE
1825 void : NULL
1826
1827 SIDE EFFECTS
1828============================================================================*/
1829void sapChanSelExit( tSapChSelSpectInfo *pSpectInfoParams )
1830{
1831 // Free all the allocated memory
1832 vos_mem_free(pSpectInfoParams->pSpectCh);
1833}
1834
1835/*==========================================================================
1836 FUNCTION sapSortChlWeight
1837
1838 DESCRIPTION
1839 Funtion to sort the channels with the least weight first
1840
1841 DEPENDENCIES
1842 NA.
1843
1844 PARAMETERS
1845
1846 IN
1847 pSpectInfoParams : Pointer to the tSapChSelSpectInfo structure
1848
1849 RETURN VALUE
1850 void : NULL
1851
1852 SIDE EFFECTS
1853============================================================================*/
1854void sapSortChlWeight(tSapChSelSpectInfo *pSpectInfoParams)
1855{
1856 tSapSpectChInfo temp;
1857
1858 tSapSpectChInfo *pSpectCh = NULL;
1859 v_U32_t i = 0, j = 0, minWeightIndex = 0;
1860
1861 pSpectCh = pSpectInfoParams->pSpectCh;
Jeff Johnson295189b2012-06-20 16:38:30 -07001862 for (i = 0; i < pSpectInfoParams->numSpectChans; i++) {
1863 minWeightIndex = i;
1864 for( j = i + 1; j < pSpectInfoParams->numSpectChans; j++) {
1865 if(pSpectCh[j].weight < pSpectCh[minWeightIndex].weight) {
1866 minWeightIndex = j;
1867 }
1868 }
1869 if(minWeightIndex != i) {
1870 vos_mem_copy(&temp, &pSpectCh[minWeightIndex], sizeof(*pSpectCh));
1871 vos_mem_copy(&pSpectCh[minWeightIndex], &pSpectCh[i], sizeof(*pSpectCh));
1872 vos_mem_copy(&pSpectCh[i], &temp, sizeof(*pSpectCh));
1873 }
1874 }
Peng Xu7d410f42014-09-09 12:15:47 +05301875}
1876
1877/*==========================================================================
1878 FUNCTION sapSortChlWeightHT80
1879
1880 DESCRIPTION
1881 Funtion to sort the channels with the least weight first for HT80 channels
1882
1883 DEPENDENCIES
1884 NA.
1885
1886 PARAMETERS
1887
1888 IN
1889 pSpectInfoParams : Pointer to the tSapChSelSpectInfo structure
1890
1891 RETURN VALUE
1892 void : NULL
1893
1894 SIDE EFFECTS
1895============================================================================*/
1896void sapSortChlWeightHT80(tSapChSelSpectInfo *pSpectInfoParams)
1897{
Rajesh Babu Prathipatiaf5ceac2014-09-09 13:10:25 +05301898 v_U8_t i, j, n;
Peng Xu7d410f42014-09-09 12:15:47 +05301899 tSapSpectChInfo *pSpectInfo;
Rajesh Babu Prathipatiaf5ceac2014-09-09 13:10:25 +05301900 v_U8_t minIdx;
Peng Xu7d410f42014-09-09 12:15:47 +05301901
1902 pSpectInfo = pSpectInfoParams->pSpectCh;
Rajesh Babu Prathipatiaf5ceac2014-09-09 13:10:25 +05301903 /* for each HT80 channel, calculate the combined weight of the
1904 four 20MHz weight */
Peng Xu7d410f42014-09-09 12:15:47 +05301905 for (i = 0; i < ARRAY_SIZE(acsHT80Channels); i++)
1906 {
1907 for (j = 0; j < pSpectInfoParams->numSpectChans; j++)
1908 {
1909 if ( pSpectInfo[j].chNum == acsHT80Channels[i].chStartNum )
1910 break;
1911 }
Peng Xu117eab42014-09-25 13:33:27 +05301912 if (j == pSpectInfoParams->numSpectChans)
1913 continue;
Peng Xu7d410f42014-09-09 12:15:47 +05301914
1915 /*found the channel, add the 4 adjacent channels' weight*/
1916 if (((pSpectInfo[j].chNum +4) == pSpectInfo[j+1].chNum) &&
1917 ((pSpectInfo[j].chNum +8) == pSpectInfo[j+2].chNum) &&
1918 ((pSpectInfo[j].chNum +12) == pSpectInfo[j+3].chNum))
1919 {
1920 acsHT80Channels[i].weight = pSpectInfo[j].weight +
1921 pSpectInfo[j+1].weight +
1922 pSpectInfo[j+2].weight +
1923 pSpectInfo[j+3].weight;
Rajesh Babu Prathipatiaf5ceac2014-09-09 13:10:25 +05301924 /* find best channel among 4 channels as the primary channel */
Rajesh Babu Prathipati32ddabf2014-09-11 16:08:59 +05301925 if ((pSpectInfo[j].weight + pSpectInfo[j+1].weight) <
1926 (pSpectInfo[j+2].weight + pSpectInfo[j+3].weight))
Rajesh Babu Prathipatiaf5ceac2014-09-09 13:10:25 +05301927 {
Rajesh Babu Prathipati32ddabf2014-09-11 16:08:59 +05301928 /* lower 2 channels are better choice */
1929 if (pSpectInfo[j].weight < pSpectInfo[j+1].weight)
1930 minIdx = 0;
1931 else
1932 minIdx = 1;
1933 }
1934 else
1935 {
1936 /* upper 2 channels are better choice */
1937 if (pSpectInfo[j+2].weight <= pSpectInfo[j+3].weight)
1938 minIdx = 2;
1939 else
1940 minIdx = 3;
Rajesh Babu Prathipatiaf5ceac2014-09-09 13:10:25 +05301941 }
1942
1943 /* set all 4 channels to max value first, then reset the
1944 best channel as the selected primary channel, update its
1945 weightage with the combined weight value */
1946 for (n=0; n<4; n++)
Abhishek Singh906b91f2015-07-02 12:25:52 +05301947 pSpectInfo[j+n].weight = ACS_WEIGHT_MAX * 4;
Rajesh Babu Prathipatiaf5ceac2014-09-09 13:10:25 +05301948
1949 pSpectInfo[j+minIdx].weight = acsHT80Channels[i].weight;
Peng Xu7d410f42014-09-09 12:15:47 +05301950 }
Rajesh Babu Prathipati2bc30592014-09-09 13:05:26 +05301951 else
1952 {
1953 /* some channels does not exist in pSectInfo array,
1954 skip this channel and those in the same HT80 width*/
Abhishek Singh906b91f2015-07-02 12:25:52 +05301955 pSpectInfo[j].weight = ACS_WEIGHT_MAX * 4;
Rajesh Babu Prathipati2bc30592014-09-09 13:05:26 +05301956 if ((pSpectInfo[j].chNum +4) == pSpectInfo[j+1].chNum)
Abhishek Singh906b91f2015-07-02 12:25:52 +05301957 pSpectInfo[j+1].weight = ACS_WEIGHT_MAX * 4;
Rajesh Babu Prathipati2bc30592014-09-09 13:05:26 +05301958 if ((pSpectInfo[j].chNum +8) == pSpectInfo[j+2].chNum)
Abhishek Singh906b91f2015-07-02 12:25:52 +05301959 pSpectInfo[j+2].weight = ACS_WEIGHT_MAX * 4;
Rajesh Babu Prathipati2bc30592014-09-09 13:05:26 +05301960 if ((pSpectInfo[j].chNum +12) == pSpectInfo[j+3].chNum)
Abhishek Singh906b91f2015-07-02 12:25:52 +05301961 pSpectInfo[j+3].weight = ACS_WEIGHT_MAX * 4;
Rajesh Babu Prathipati2bc30592014-09-09 13:05:26 +05301962 }
Peng Xu7d410f42014-09-09 12:15:47 +05301963 }
1964
1965 pSpectInfo = pSpectInfoParams->pSpectCh;
1966 for (j = 0; j < pSpectInfoParams->numSpectChans; j++)
1967 {
Peng Xu117eab42014-09-25 13:33:27 +05301968 if ( CHANNEL_165 == pSpectInfo[j].chNum )
Peng Xu7d410f42014-09-09 12:15:47 +05301969 {
Abhishek Singh906b91f2015-07-02 12:25:52 +05301970 pSpectInfo[j].weight = ACS_WEIGHT_MAX * 4;
Peng Xu7d410f42014-09-09 12:15:47 +05301971 break;
1972 }
1973 }
1974
Rajesh Babu Prathipati2bc30592014-09-09 13:05:26 +05301975 pSpectInfo = pSpectInfoParams->pSpectCh;
1976 for (j = 0; j < (pSpectInfoParams->numSpectChans); j++) {
1977 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
1978 "In %s, Channel=%d Weight= %d rssi=%d bssCount=%d",
1979 __func__, pSpectInfo->chNum, pSpectInfo->weight,
1980 pSpectInfo->rssiAgr, pSpectInfo->bssCount);
1981 pSpectInfo++;
1982 }
1983
Peng Xu7d410f42014-09-09 12:15:47 +05301984 sapSortChlWeight(pSpectInfoParams);
1985}
1986
1987/*==========================================================================
Rajesh Babu Prathipatiff748c02014-09-09 13:19:57 +05301988 FUNCTION sapSortChlWeightHT40_24G
Peng Xu7d410f42014-09-09 12:15:47 +05301989
1990 DESCRIPTION
1991 Funtion to sort the channels with the least weight first for 20MHz channels
1992
1993 DEPENDENCIES
1994 NA.
1995
1996 PARAMETERS
1997
1998 IN
1999 pSpectInfoParams : Pointer to the tSapChSelSpectInfo structure
2000
2001 RETURN VALUE
2002 void : NULL
2003
2004 SIDE EFFECTS
2005============================================================================*/
Rajesh Babu Prathipatiff748c02014-09-09 13:19:57 +05302006void sapSortChlWeightHT40_24G(tSapChSelSpectInfo *pSpectInfoParams)
2007{
2008 v_U8_t i, j;
2009 tSapSpectChInfo *pSpectInfo;
2010 v_U32_t tmpWeight1, tmpWeight2;
2011
2012 pSpectInfo = pSpectInfoParams->pSpectCh;
2013 /*for each HT40 channel, calculate the combined weight of the
2014 two 20MHz weight */
2015 for (i = 0; i < ARRAY_SIZE(acsHT40Channels24G); i++)
2016 {
2017 for (j = 0; j < pSpectInfoParams->numSpectChans; j++)
2018 {
2019 if (pSpectInfo[j].chNum == acsHT40Channels24G[i].chStartNum)
2020 break;
2021 }
2022 if (j == pSpectInfoParams->numSpectChans)
2023 continue;
2024
2025 if ((pSpectInfo[j].chNum +4) == pSpectInfo[j+4].chNum)
2026 {
2027 /* check if there is another channel combination possiblity
2028 e.g., {1, 5} & {5, 9} */
2029 if ((pSpectInfo[j+4].chNum + 4)== pSpectInfo[j+8].chNum)
2030 {
2031 /* need to compare two channel pairs */
2032 tmpWeight1 = pSpectInfo[j].weight + pSpectInfo[j+4].weight;
2033 tmpWeight2 = pSpectInfo[j+4].weight + pSpectInfo[j+8].weight;
2034 if (tmpWeight1 <= tmpWeight2)
2035 {
2036 if (pSpectInfo[j].weight <= pSpectInfo[j+4].weight)
2037 {
2038 pSpectInfo[j].weight = tmpWeight1;
Abhishek Singh906b91f2015-07-02 12:25:52 +05302039 pSpectInfo[j+4].weight = ACS_WEIGHT_MAX * 2;
2040 pSpectInfo[j+8].weight = ACS_WEIGHT_MAX * 2;
Rajesh Babu Prathipatiff748c02014-09-09 13:19:57 +05302041 }
2042 else
2043 {
2044 pSpectInfo[j+4].weight = tmpWeight1;
Abhishek Singh906b91f2015-07-02 12:25:52 +05302045 pSpectInfo[j].weight = ACS_WEIGHT_MAX * 2;
2046 pSpectInfo[j+8].weight = ACS_WEIGHT_MAX * 2;
Rajesh Babu Prathipatiff748c02014-09-09 13:19:57 +05302047 }
2048 }
2049 else
2050 {
2051 if (pSpectInfo[j+4].weight <= pSpectInfo[j+8].weight)
2052 {
2053 pSpectInfo[j+4].weight = tmpWeight2;
Abhishek Singh906b91f2015-07-02 12:25:52 +05302054 pSpectInfo[j].weight = ACS_WEIGHT_MAX * 2;
2055 pSpectInfo[j+8].weight = ACS_WEIGHT_MAX * 2;
Rajesh Babu Prathipatiff748c02014-09-09 13:19:57 +05302056 }
2057 else
2058 {
2059 pSpectInfo[j+8].weight = tmpWeight2;
Abhishek Singh906b91f2015-07-02 12:25:52 +05302060 pSpectInfo[j].weight = ACS_WEIGHT_MAX * 2;
2061 pSpectInfo[j+4].weight = ACS_WEIGHT_MAX * 2;
Rajesh Babu Prathipatiff748c02014-09-09 13:19:57 +05302062 }
2063 }
2064 }
2065 else
2066 {
2067 tmpWeight1 = pSpectInfo[j].weight + pSpectInfo[j+4].weight;
2068 if (pSpectInfo[j].weight <= pSpectInfo[j+4].weight)
2069 {
2070 pSpectInfo[j].weight = tmpWeight1;
Abhishek Singh906b91f2015-07-02 12:25:52 +05302071 pSpectInfo[j+4].weight = ACS_WEIGHT_MAX * 2;
Rajesh Babu Prathipatiff748c02014-09-09 13:19:57 +05302072 }
2073 else
2074 {
2075 pSpectInfo[j+4].weight = tmpWeight1;
Abhishek Singh906b91f2015-07-02 12:25:52 +05302076 pSpectInfo[j].weight = ACS_WEIGHT_MAX * 2;
Rajesh Babu Prathipatiff748c02014-09-09 13:19:57 +05302077 }
2078 }
2079 }
2080 else
Abhishek Singh906b91f2015-07-02 12:25:52 +05302081 pSpectInfo[j].weight = ACS_WEIGHT_MAX * 2;
Rajesh Babu Prathipatiff748c02014-09-09 13:19:57 +05302082 }
Rajesh Babu Prathipati684ad722014-09-11 16:14:05 +05302083
2084 sapSortChlWeight(pSpectInfoParams);
Rajesh Babu Prathipatiff748c02014-09-09 13:19:57 +05302085}
2086
2087
2088/*==========================================================================
2089 FUNCTION sapSortChlWeightHT40_5G
2090
2091 DESCRIPTION
2092 Funtion to sort the channels with the least weight first for HT40 channels
2093
2094 DEPENDENCIES
2095 NA.
2096
2097 PARAMETERS
2098
2099 IN
2100 pSpectInfoParams : Pointer to the tSapChSelSpectInfo structure
2101
2102 RETURN VALUE
2103 void : NULL
2104
2105 SIDE EFFECTS
2106============================================================================*/
2107void sapSortChlWeightHT40_5G(tSapChSelSpectInfo *pSpectInfoParams)
Peng Xu7d410f42014-09-09 12:15:47 +05302108{
2109 v_U8_t i, j;
2110 tSapSpectChInfo *pSpectInfo;
2111
2112 pSpectInfo = pSpectInfoParams->pSpectCh;
2113 /*for each HT40 channel, calculate the combined weight of the
2114 two 20MHz weight */
Peng Xu117eab42014-09-25 13:33:27 +05302115 for (i = 0; i < ARRAY_SIZE(acsHT40Channels5G); i++)
Peng Xu7d410f42014-09-09 12:15:47 +05302116 {
2117 for (j = 0; j < pSpectInfoParams->numSpectChans; j++)
2118 {
Peng Xu117eab42014-09-25 13:33:27 +05302119 if (pSpectInfo[j].chNum == acsHT40Channels5G[i].chStartNum)
Peng Xu7d410f42014-09-09 12:15:47 +05302120 break;
2121 }
Peng Xu117eab42014-09-25 13:33:27 +05302122 if (j == pSpectInfoParams->numSpectChans)
2123 continue;
Peng Xu7d410f42014-09-09 12:15:47 +05302124
2125 /* found the channel, add the two adjacent channels' weight */
2126 if ( (pSpectInfo[j].chNum +4) == pSpectInfo[j+1].chNum)
2127 {
Peng Xu117eab42014-09-25 13:33:27 +05302128 acsHT40Channels5G[i].weight = pSpectInfo[j].weight +
Peng Xu7d410f42014-09-09 12:15:47 +05302129 pSpectInfo[j+1].weight;
Rajesh Babu Prathipatiaf5ceac2014-09-09 13:10:25 +05302130 /* select better of the adjact channel as the primary channel */
2131 if (pSpectInfo[j].weight <= pSpectInfo[j+1].weight)
2132 {
2133 pSpectInfo[j].weight = acsHT40Channels5G[i].weight;
2134 /* mark the adjacent channel's weight as max value so
2135 that it will be sorted to the bottom */
Abhishek Singh906b91f2015-07-02 12:25:52 +05302136 pSpectInfo[j+1].weight = ACS_WEIGHT_MAX * 2;
Rajesh Babu Prathipatiaf5ceac2014-09-09 13:10:25 +05302137 }
2138 else
2139 {
2140 pSpectInfo[j+1].weight = acsHT40Channels5G[i].weight;
2141 /* mark the adjacent channel's weight as max value so
2142 that it will be sorted to the bottom */
Abhishek Singh906b91f2015-07-02 12:25:52 +05302143 pSpectInfo[j].weight = ACS_WEIGHT_MAX * 2;
Rajesh Babu Prathipatiaf5ceac2014-09-09 13:10:25 +05302144 }
2145
Peng Xu7d410f42014-09-09 12:15:47 +05302146 }
Rajesh Babu Prathipati2bc30592014-09-09 13:05:26 +05302147 else
Abhishek Singh906b91f2015-07-02 12:25:52 +05302148 pSpectInfo[j].weight = ACS_WEIGHT_MAX * 2;
Peng Xu7d410f42014-09-09 12:15:47 +05302149 }
2150
2151 /* avoid channel 165 by setting its weight to max */
2152 pSpectInfo = pSpectInfoParams->pSpectCh;
2153 for (j = 0; j < pSpectInfoParams->numSpectChans; j++)
2154 {
Peng Xu117eab42014-09-25 13:33:27 +05302155 if ( CHANNEL_165 == pSpectInfo[j].chNum )
Peng Xu7d410f42014-09-09 12:15:47 +05302156 {
Abhishek Singh906b91f2015-07-02 12:25:52 +05302157 pSpectInfo[j].weight = ACS_WEIGHT_MAX * 2;
Peng Xu7d410f42014-09-09 12:15:47 +05302158 break;
2159 }
2160 }
2161
Peng Xu117eab42014-09-25 13:33:27 +05302162 pSpectInfo = pSpectInfoParams->pSpectCh;
2163 for (j = 0; j < (pSpectInfoParams->numSpectChans); j++) {
2164 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
2165 "In %s, Channel=%d Weight= %d rssi=%d bssCount=%d",
2166 __func__, pSpectInfo->chNum, pSpectInfo->weight,
2167 pSpectInfo->rssiAgr, pSpectInfo->bssCount);
2168 pSpectInfo++;
2169 }
2170
Peng Xu7d410f42014-09-09 12:15:47 +05302171 sapSortChlWeight(pSpectInfoParams);
2172}
2173
2174/*==========================================================================
2175 FUNCTION sapSortChlWeightAll
2176
2177 DESCRIPTION
2178 Funtion to sort the channels with the least weight first
2179
2180 DEPENDENCIES
2181 NA.
2182
2183 PARAMETERS
2184
2185 IN
2186 ptSapContext : Pointer to the ptSapContext structure
2187 pSpectInfoParams : Pointer to the tSapChSelSpectInfo structure
2188
2189 RETURN VALUE
2190 void : NULL
2191
2192 SIDE EFFECTS
2193============================================================================*/
2194void sapSortChlWeightAll(ptSapContext pSapCtx,
Peng Xu117eab42014-09-25 13:33:27 +05302195 tSapChSelSpectInfo *pSpectInfoParams,
2196 eChannelWidthInfo chWidth,
2197 v_U32_t operatingBand)
Peng Xu7d410f42014-09-09 12:15:47 +05302198{
2199 tSapSpectChInfo *pSpectCh = NULL;
2200 v_U32_t j = 0;
2201#ifndef SOFTAP_CHANNEL_RANGE
2202 v_U32_t i = 0;
2203#endif
2204
2205 pSpectCh = pSpectInfoParams->pSpectCh;
2206#ifdef SOFTAP_CHANNEL_RANGE
2207
Peng Xu117eab42014-09-25 13:33:27 +05302208 switch (chWidth)
2209 {
2210 case CHWIDTH_HT40:
Rajesh Babu Prathipatiff748c02014-09-09 13:19:57 +05302211 if (eSAP_RF_SUBBAND_2_4_GHZ == operatingBand)
2212 sapSortChlWeightHT40_24G(pSpectInfoParams);
2213 else
2214 sapSortChlWeightHT40_5G(pSpectInfoParams);
Peng Xu117eab42014-09-25 13:33:27 +05302215 break;
2216
2217 case CHWIDTH_HT80:
Peng Xu7d410f42014-09-09 12:15:47 +05302218 sapSortChlWeightHT80(pSpectInfoParams);
Peng Xu117eab42014-09-25 13:33:27 +05302219 break;
2220
2221 case CHWIDTH_HT20:
2222 default:
Peng Xu7d410f42014-09-09 12:15:47 +05302223 /* Sorting the channels as per weights as 20MHz channels */
2224 sapSortChlWeight(pSpectInfoParams);
2225 }
Peng Xu117eab42014-09-25 13:33:27 +05302226
Jeff Johnson295189b2012-06-20 16:38:30 -07002227#else
Peng Xu7d410f42014-09-09 12:15:47 +05302228 /* Sorting the channels as per weights */
Jeff Johnson295189b2012-06-20 16:38:30 -07002229 for (i = 0; i < SPECT_24GHZ_CH_COUNT; i++) {
2230 minWeightIndex = i;
2231 for( j = i + 1; j < SPECT_24GHZ_CH_COUNT; j++) {
2232 if(pSpectCh[j].weight < pSpectCh[minWeightIndex].weight) {
2233 minWeightIndex = j;
2234 }
2235 }
2236 if(minWeightIndex != i) {
2237 vos_mem_copy(&temp, &pSpectCh[minWeightIndex], sizeof(*pSpectCh));
Peng Xu7d410f42014-09-09 12:15:47 +05302238 vos_mem_copy(&pSpectCh[minWeightIndex], &pSpectCh[i],
2239 sizeof(*pSpectCh));
Jeff Johnson295189b2012-06-20 16:38:30 -07002240 vos_mem_copy(&pSpectCh[i], &temp, sizeof(*pSpectCh));
2241 }
2242 }
2243#endif
2244
2245 /* For testing */
Peng Xu7d410f42014-09-09 12:15:47 +05302246 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
2247 "In %s, Sorted Spectrum Channels Weight", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002248 pSpectCh = pSpectInfoParams->pSpectCh;
2249 for (j = 0; j < (pSpectInfoParams->numSpectChans); j++) {
Peng Xu7d410f42014-09-09 12:15:47 +05302250 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
2251 "In %s, Channel=%d Weight= %d rssi=%d bssCount=%d",
2252 __func__, pSpectCh->chNum, pSpectCh->weight,
2253 pSpectCh->rssiAgr, pSpectCh->bssCount);
Jeff Johnson295189b2012-06-20 16:38:30 -07002254 pSpectCh++;
2255 }
2256
2257}
2258
Peng Xu117eab42014-09-25 13:33:27 +05302259eChannelWidthInfo sapGetChannelWidthInfo(tHalHandle halHandle, ptSapContext pSapCtx,
2260 v_U32_t operatingBand, eSapPhyMode phyMode)
2261{
2262 v_U32_t cbMode;
2263 eChannelWidthInfo chWidth = CHWIDTH_HT20;
2264
Hardik Kantilal Pateldd107952014-11-20 15:24:52 +05302265#ifdef WLAN_FEATURE_AP_HT40_24G
Peng Xu117eab42014-09-25 13:33:27 +05302266 if (eSAP_RF_SUBBAND_2_4_GHZ == operatingBand)
2267 cbMode = sme_GetChannelBondingMode24G(halHandle);
2268 else
Hardik Kantilal Pateldd107952014-11-20 15:24:52 +05302269#endif
Peng Xu117eab42014-09-25 13:33:27 +05302270 cbMode = sme_GetChannelBondingMode5G(halHandle);
2271
2272 if (phyMode == eSAP_DOT11_MODE_11n ||
2273 phyMode == eSAP_DOT11_MODE_11n_ONLY)
2274 {
2275 if (cbMode)
2276 chWidth = CHWIDTH_HT40;
2277 else
2278 chWidth = CHWIDTH_HT20;
2279 }
2280 else if (pSapCtx->csrRoamProfile.phyMode == eSAP_DOT11_MODE_11ac ||
2281 pSapCtx->csrRoamProfile.phyMode == eSAP_DOT11_MODE_11ac_ONLY) {
2282 chWidth = CHWIDTH_HT80;
2283 }
2284 else {
2285 /* Sorting the channels as per weights as 20MHz channels */
2286 chWidth = CHWIDTH_HT20;
2287 }
2288
2289 return chWidth;
2290}
Jeff Johnson295189b2012-06-20 16:38:30 -07002291/*==========================================================================
2292 FUNCTION sapSelectChannel
2293
2294 DESCRIPTION
2295 Runs a algorithm to select the best channel to operate in based on BSS
2296 rssi and bss count on each channel
2297
2298 DEPENDENCIES
2299 NA.
2300
2301 PARAMETERS
2302
2303 IN
2304 halHandle : Pointer to HAL handle
2305 pResult : Pointer to tScanResultHandle
2306
2307 RETURN VALUE
2308 v_U8_t : Success - channel number, Fail - zero
2309
2310 SIDE EFFECTS
2311============================================================================*/
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -07002312v_U8_t sapSelectChannel(tHalHandle halHandle, ptSapContext pSapCtx, tScanResultHandle pScanResult)
Jeff Johnson295189b2012-06-20 16:38:30 -07002313{
2314 // DFS param object holding all the data req by the algo
2315 tSapChSelSpectInfo oSpectInfoParams = {NULL,0};
2316 tSapChSelSpectInfo *pSpectInfoParams = &oSpectInfoParams; // Memory? NB
Peng Xuafc34e32014-09-25 13:23:55 +05302317 v_U8_t bestChNum = SAP_CHANNEL_NOT_SELECTED;
Jeff Johnson295189b2012-06-20 16:38:30 -07002318#ifdef SOFTAP_CHANNEL_RANGE
2319 v_U32_t startChannelNum;
2320 v_U32_t endChannelNum;
Gopichand Nakkala936715f2013-03-18 19:48:10 +05302321 v_U32_t operatingBand = 0;
Peng Xuafc34e32014-09-25 13:23:55 +05302322 v_U32_t tmpChNum;
2323 v_U8_t count;
Peng Xu117eab42014-09-25 13:33:27 +05302324 eChannelWidthInfo chWidth;
Peng Xuafc34e32014-09-25 13:23:55 +05302325#endif
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002326 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, Running SAP Ch Select", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002327
Jeff Johnson295189b2012-06-20 16:38:30 -07002328 // Initialize the structure pointed by pSpectInfoParams
2329 if(sapChanSelInit( halHandle, pSpectInfoParams) != eSAP_TRUE ) {
Madan Mohan Koyyalamudi87054ba2012-11-02 13:24:12 -07002330 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, "In %s, Ch Select initialization failed", __func__);
Jeff Johnson295189b2012-06-20 16:38:30 -07002331 return SAP_CHANNEL_NOT_SELECTED;
2332 }
2333
2334 // Compute the weight of the entire spectrum in the operating band
2335 sapComputeSpectWeight( pSpectInfoParams, halHandle, pScanResult);
2336
Jeff Johnson295189b2012-06-20 16:38:30 -07002337#ifdef SOFTAP_CHANNEL_RANGE
Peng Xufc6ad8e2014-09-25 13:16:43 +05302338 if (eCSR_BAND_ALL == pSapCtx->scanBandPreference)
Peng Xu2446a892014-09-05 17:21:18 +05302339 {
Peng Xuafc34e32014-09-25 13:23:55 +05302340 ccmCfgGetInt( halHandle, WNI_CFG_SAP_CHANNEL_SELECT_START_CHANNEL,
2341 &startChannelNum);
2342 ccmCfgGetInt( halHandle, WNI_CFG_SAP_CHANNEL_SELECT_END_CHANNEL,
2343 &endChannelNum);
2344 ccmCfgGetInt( halHandle, WNI_CFG_SAP_CHANNEL_SELECT_OPERATING_BAND,
2345 &operatingBand);
Peng Xufc6ad8e2014-09-25 13:16:43 +05302346 }
2347 else
2348 {
2349 if (eCSR_BAND_24 == pSapCtx->currentPreferredBand)
2350 {
Peng Xu2446a892014-09-05 17:21:18 +05302351 startChannelNum = rfChannels[RF_CHAN_1].channelNum;
2352 endChannelNum = rfChannels[RF_CHAN_14].channelNum;
Leela Venkata Kiran Kumar Reddy Chirala9f6566c2014-09-05 19:06:58 +05302353 operatingBand = eSAP_RF_SUBBAND_2_4_GHZ;
Peng Xufc6ad8e2014-09-25 13:16:43 +05302354 }
2355 else
2356 {
Peng Xu2446a892014-09-05 17:21:18 +05302357 startChannelNum = rfChannels[RF_CHAN_36].channelNum;
2358 endChannelNum = rfChannels[RF_CHAN_165].channelNum;
Deepthi Gowri7db41f32014-10-13 17:02:29 +05302359 operatingBand = eSAP_RF_SUBBAND_5_ALL_GHZ;
Peng Xufc6ad8e2014-09-25 13:16:43 +05302360 }
2361 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002362
Peng Xuafc34e32014-09-25 13:23:55 +05302363 pSapCtx->acsBestChannelInfo.channelNum = 0;
2364 pSapCtx->acsBestChannelInfo.weight = CFG_ACS_BAND_SWITCH_THRESHOLD_MAX;
Peng Xu117eab42014-09-25 13:33:27 +05302365 /* find the channel width info */
2366 chWidth = sapGetChannelWidthInfo(halHandle, pSapCtx, operatingBand, pSapCtx->csrRoamProfile.phyMode);
2367 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
2368 "In %s, chWidth=%u", __func__, chWidth);
2369
2370 /* Sort the channel list as per the computed weights, lesser weight first.*/
2371 sapSortChlWeightAll(pSapCtx, pSpectInfoParams, chWidth, operatingBand);
Peng Xuafc34e32014-09-25 13:23:55 +05302372
Jeff Johnson295189b2012-06-20 16:38:30 -07002373 /*Loop till get the best channel in the given range */
2374 for(count=0; count < pSpectInfoParams->numSpectChans ; count++)
2375 {
2376 if((startChannelNum <= pSpectInfoParams->pSpectCh[count].chNum)&&
2377 ( endChannelNum >= pSpectInfoParams->pSpectCh[count].chNum))
2378 {
Deepthi Gowri38c219d2014-08-05 19:34:08 +05302379 if (NV_CHANNEL_ENABLE !=
2380 vos_nv_getChannelEnabledState(pSpectInfoParams->pSpectCh[count].chNum))
2381 {
2382 continue; //skip this channel, continue to next channel
2383 }
Peng Xuafc34e32014-09-25 13:23:55 +05302384 if(bestChNum == SAP_CHANNEL_NOT_SELECTED)
Bansidhar Gopalachari1e56faa2013-07-25 19:30:20 +05302385 {
Peng Xuafc34e32014-09-25 13:23:55 +05302386 bestChNum = pSpectInfoParams->pSpectCh[count].chNum;
2387 /* check if bestChNum is in preferred channel list */
2388 bestChNum = sapSelectPreferredChannelFromChannelList(
2389 bestChNum, pSapCtx, pSpectInfoParams);
2390 if (bestChNum == SAP_CHANNEL_NOT_SELECTED)
2391 {
2392 /* not in preferred channel list, go to next best channel*/
2393 continue;
2394 }
2395
Abhishek Singh906b91f2015-07-02 12:25:52 +05302396 if (pSpectInfoParams->pSpectCh[count].weight_copy >
Peng Xuafc34e32014-09-25 13:23:55 +05302397 pSapCtx->acsBandSwitchThreshold)
2398 {
2399 /* the best channel exceeds the threshold
2400 check if need to scan next band */
2401 if ((eCSR_BAND_ALL != pSapCtx->scanBandPreference) &&
2402 !pSapCtx->allBandScanned)
2403 {
2404 /* store best channel for later comparison */
2405 pSapCtx->acsBestChannelInfo.channelNum = bestChNum;
2406 pSapCtx->acsBestChannelInfo.weight =
2407 pSpectInfoParams->pSpectCh[count].weight;
2408 bestChNum = SAP_CHANNEL_NOT_SELECTED;
2409 break;
2410 }
2411 else
2412 {
2413 /* all bands are scanned, compare current best channel
2414 with channel scanned previously */
Abhishek Singh906b91f2015-07-02 12:25:52 +05302415 if ( pSpectInfoParams->pSpectCh[count].weight_copy >
Peng Xuafc34e32014-09-25 13:23:55 +05302416 pSapCtx->acsBestChannelInfo.weight)
2417 {
2418 /* previous stored channel is better */
2419 bestChNum = pSapCtx->acsBestChannelInfo.channelNum;
2420 }
2421 else
2422 {
2423 pSapCtx->acsBestChannelInfo.channelNum = bestChNum;
2424 pSapCtx->acsBestChannelInfo.weight =
Abhishek Singh906b91f2015-07-02 12:25:52 +05302425 pSpectInfoParams->pSpectCh[count].weight_copy;
Peng Xuafc34e32014-09-25 13:23:55 +05302426 }
2427 }
2428 }
Bansidhar Gopalachari1e56faa2013-07-25 19:30:20 +05302429 }
2430 else
2431 {
2432 if(operatingBand == RF_SUBBAND_2_4_GHZ)
2433 {
2434 /* Give preference to Non-overlap channels */
2435 if(((pSpectInfoParams->pSpectCh[count].chNum == CHANNEL_1) ||
Peng Xuafc34e32014-09-25 13:23:55 +05302436 (pSpectInfoParams->pSpectCh[count].chNum == CHANNEL_6) ||
2437 (pSpectInfoParams->pSpectCh[count].chNum == CHANNEL_11))&&
Abhishek Singh906b91f2015-07-02 12:25:52 +05302438 (pSpectInfoParams->pSpectCh[count].weight_copy ==
Peng Xuafc34e32014-09-25 13:23:55 +05302439 pSapCtx->acsBestChannelInfo.weight))
2440 {
2441 tmpChNum = pSpectInfoParams->pSpectCh[count].chNum;
2442 tmpChNum =
2443 sapSelectPreferredChannelFromChannelList(tmpChNum,
2444 pSapCtx, pSpectInfoParams);
2445 if ( tmpChNum != SAP_CHANNEL_NOT_SELECTED)
2446 {
2447 bestChNum = tmpChNum;
2448 break;
2449 }
2450
2451 }
Bansidhar Gopalachari1e56faa2013-07-25 19:30:20 +05302452 }
2453 }
2454 }
2455 }
Jeff Johnson295189b2012-06-20 16:38:30 -07002456#else
Peng Xu117eab42014-09-25 13:33:27 +05302457 // Sort the channel list as per the computed weights, lesser weight first.
2458 sapSortChlWeightAll(pSapCtx, halHandle, pSpectInfoParams);
Jeff Johnson295189b2012-06-20 16:38:30 -07002459 // Get the first channel in sorted array as best 20M Channel
2460 bestChNum = (v_U8_t)pSpectInfoParams->pSpectCh[0].chNum;
Madan Mohan Koyyalamudi5aef2af2012-10-05 11:56:27 -07002461 //Select Best Channel from Channel List if Configured
Peng Xuafc34e32014-09-25 13:23:55 +05302462 bestChNum = sapSelectPreferredChannelFromChannelList(bestChNum,
2463 pSapCtx, pSpectInfoParams);
2464#endif
Jeff Johnson295189b2012-06-20 16:38:30 -07002465
2466 // Free all the allocated memory
2467 sapChanSelExit(pSpectInfoParams);
2468
2469 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, Running SAP Ch select Completed, Ch=%d",
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -07002470 __func__, bestChNum);
Jeff Johnson295189b2012-06-20 16:38:30 -07002471 if (bestChNum > 0 && bestChNum <= 252)
2472 return bestChNum;
2473 else
2474 return SAP_CHANNEL_NOT_SELECTED;
2475}
Venkata Prathyusha Kuntupalli5c9e4e82013-04-15 13:10:09 -07002476