blob: 3a258830910d038967bd89bd45007c9e10b2e042 [file] [log] [blame]
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07001/*
Ashish Kumar Goswami28a222a2017-01-31 14:13:03 +05302 * Copyright (c) 2012-2017 The Linux Foundation. All rights reserved.
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003 *
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.
20 */
21
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 */
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -080027
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -070028/*===========================================================================
29
30 s a p F s m . C
31
32 OVERVIEW:
33
34 This software unit holds the implementation of the WLAN SAP Finite
35 State Machine modules
36
37 DEPENDENCIES:
38
39 Are listed for each API below.
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -070040===========================================================================*/
41
42/*===========================================================================
43
44 EDIT HISTORY FOR FILE
45
46
47 This section contains comments describing changes made to the module.
48 Notice that changes are listed in reverse chronological order.
49
50
51
52 when who what, where, why
53---------- --- --------------------------------------------------------
542010-03-15 Created module
55
56===========================================================================*/
57
58
59/*----------------------------------------------------------------------------
60 * Include Files
61 * -------------------------------------------------------------------------*/
62#include "sapInternal.h"
63// Pick up the SME API definitions
64#include "sme_Api.h"
Manikandan Mohan2be12412015-06-25 17:53:44 -070065#include "smeInside.h"
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -070066// Pick up the PMC API definitions
67#include "pmcApi.h"
68#include "wlan_nv.h"
Kiran Kumar Lokere606c55f2014-11-14 14:18:13 -080069#include "vos_utils.h"
Ryan Hsuf9826cb2015-04-02 18:10:16 -070070#include "_ieee80211_common.h"
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -070071
72/*----------------------------------------------------------------------------
73 * Preprocessor Definitions and Constants
74 * -------------------------------------------------------------------------*/
75
76/*----------------------------------------------------------------------------
77 * Type Declarations
78 * -------------------------------------------------------------------------*/
79
80/*----------------------------------------------------------------------------
81 * Global Data Definitions
82 * -------------------------------------------------------------------------*/
83
84/*----------------------------------------------------------------------------
85 * External declarations for global context
86 * -------------------------------------------------------------------------*/
Xun Luoa18da142014-04-08 15:08:23 -070087#ifdef FEATURE_WLAN_CH_AVOID
88extern sapSafeChannelType safeChannels[];
89#endif /* FEATURE_WLAN_CH_AVOID */
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -070090
91/*----------------------------------------------------------------------------
92 * Static Variable Definitions
93 * -------------------------------------------------------------------------*/
94
Naveen Rawatd19871c2014-10-17 16:55:24 -070095#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
96/*
97 * TODO: At present SAP Channel leakage matrix for ch 144
98 * is not available from system's team. So to play it safe
99 * and avoid crash if channel 144 is request, in following
100 * matix channel 144 is added such that it will cause code
101 * to avoid selecting channel 144.
102 *
103 * THESE ENTRIES SHOULD BE REPLACED WITH CORRECT VALUES AS
104 * PROVIDED BY SYSTEM'S TEAM.
105 */
Ryan Hsu78b33242014-07-22 08:29:07 -0700106/* channel tx leakage table - ht80 */
107tSapChanMatrixInfo ht80_chan[] =
108{
109 {52,
110 {{36, 148}, {40, 199},
111 {44, 193}, {48, 197},
112 {52, SAP_TX_LEAKAGE_MIN}, {56, 153},
113 {60, 137}, {64, 134},
114 {100, 358}, {104, 350},
115 {108, 404}, {112, 344},
116 {116, 424}, {120, 429},
117 {124, 437}, {128, 435},
118 {132, SAP_TX_LEAKAGE_MAX},{136, SAP_TX_LEAKAGE_MAX},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700119 {140, SAP_TX_LEAKAGE_MAX}
120#ifdef FEATURE_WLAN_CH144
121 ,{144, SAP_TX_LEAKAGE_MIN}
122#endif
123}},
124
Ryan Hsu78b33242014-07-22 08:29:07 -0700125
126 {56,
127 {{36, 171}, {40, 178},
128 {44, 171}, {48, 178},
129 {52, SAP_TX_LEAKAGE_MIN}, {56, SAP_TX_LEAKAGE_MIN},
130 {60, SAP_TX_LEAKAGE_MIN}, {64, 280},
131 {100, 351}, {104, 376},
132 {108, 362}, {112, 362},
133 {116, 403}, {120, 397},
134 {124, SAP_TX_LEAKAGE_MAX},{128, SAP_TX_LEAKAGE_MAX},
135 {132, SAP_TX_LEAKAGE_MAX},{136, SAP_TX_LEAKAGE_MAX},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700136 {140, SAP_TX_LEAKAGE_MAX}
137#ifdef FEATURE_WLAN_CH144
138 ,{144, SAP_TX_LEAKAGE_MIN}
139#endif
140}},
Ryan Hsu78b33242014-07-22 08:29:07 -0700141
142 {60,
143 {{36, 156}, {40, 146},
144 {44, SAP_TX_LEAKAGE_MIN}, {48, SAP_TX_LEAKAGE_MIN},
145 {52, 180}, {56, SAP_TX_LEAKAGE_MIN},
146 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
147 {100, 376}, {104, 360},
148 {108, SAP_TX_LEAKAGE_MAX},{112, SAP_TX_LEAKAGE_MAX},
149 {116, 395}, {120, 399},
150 {124, SAP_TX_LEAKAGE_MAX},{128, SAP_TX_LEAKAGE_MAX},
151 {132, SAP_TX_LEAKAGE_MAX},{136, SAP_TX_LEAKAGE_MAX},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700152 {140, SAP_TX_LEAKAGE_MAX}
153#ifdef FEATURE_WLAN_CH144
154 ,{144, SAP_TX_LEAKAGE_MIN}
155#endif
156}},
Ryan Hsu78b33242014-07-22 08:29:07 -0700157
158 {64,
159 {{36, 217}, {40, 221},
160 {44, SAP_TX_LEAKAGE_MIN}, {48, SAP_TX_LEAKAGE_MIN},
161 {52, 176}, {56, 176},
162 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
163 {100, 384}, {104, 390},
164 {108, SAP_TX_LEAKAGE_MAX},{112, SAP_TX_LEAKAGE_MAX},
165 {116, 375}, {120, 374},
166 {124, SAP_TX_LEAKAGE_MAX},{128, SAP_TX_LEAKAGE_MAX},
167 {132, SAP_TX_LEAKAGE_MAX},{136, SAP_TX_LEAKAGE_MAX},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700168 {140, SAP_TX_LEAKAGE_MAX}
169#ifdef FEATURE_WLAN_CH144
170 ,{144, SAP_TX_LEAKAGE_MIN}
171#endif
172}},
Ryan Hsu78b33242014-07-22 08:29:07 -0700173
174 {100,
175 {{36, 357}, {40, 326},
176 {44, 321}, {48, 326},
177 {52, 378}, {56, 396},
178 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
179 {100, SAP_TX_LEAKAGE_MIN},{104, SAP_TX_LEAKAGE_MIN},
180 {108, 196}, {112, 116},
181 {116, 166}, {120, SAP_TX_LEAKAGE_MIN},
182 {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN},
183 {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700184 {140, SAP_TX_LEAKAGE_MIN}
185#ifdef FEATURE_WLAN_CH144
186 ,{144, SAP_TX_LEAKAGE_MIN}
187#endif
188}},
Ryan Hsu78b33242014-07-22 08:29:07 -0700189
190 {104,
191 {{36, 325}, {40, 325},
192 {44, 305}, {48, 352},
193 {52, 411}, {56, 411},
194 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
195 {100, SAP_TX_LEAKAGE_MIN},{104, SAP_TX_LEAKAGE_MIN},
196 {108, SAP_TX_LEAKAGE_MIN},{112, 460},
197 {116, 198}, {120, SAP_TX_LEAKAGE_MIN},
198 {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN},
199 {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700200 {140, SAP_TX_LEAKAGE_MIN}
201#ifdef FEATURE_WLAN_CH144
202 ,{144, SAP_TX_LEAKAGE_MIN}
203#endif
204}},
Ryan Hsu78b33242014-07-22 08:29:07 -0700205
206 {108,
207 {{36, 304}, {40, 332},
208 {44, 310}, {48, 335},
209 {52, 431}, {56, 391},
210 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
211 {100, 280}, {104, SAP_TX_LEAKAGE_MIN},
212 {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN},
213 {116, 185}, {120, SAP_TX_LEAKAGE_MIN},
214 {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN},
215 {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700216 {140, SAP_TX_LEAKAGE_MIN}
217#ifdef FEATURE_WLAN_CH144
218 ,{144, SAP_TX_LEAKAGE_MIN}
219#endif
220}},
Ryan Hsu78b33242014-07-22 08:29:07 -0700221
222 {112,
223 {{36, 327}, {40, 335},
224 {44, 331}, {48, 345},
225 {52, 367}, {56, 401},
226 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
227 {100, 131}, {104, 132},
228 {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN},
229 {116, 189}, {120, SAP_TX_LEAKAGE_MIN},
230 {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN},
231 {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700232 {140, SAP_TX_LEAKAGE_MIN}
233#ifdef FEATURE_WLAN_CH144
234 ,{144, SAP_TX_LEAKAGE_MIN}
235#endif
236}},
Ryan Hsu78b33242014-07-22 08:29:07 -0700237
238 {116,
239 {{36, 384}, {40, 372},
240 {44, 389}, {48, 396},
241 {52, 348}, {56, 336},
242 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
243 {100, 172}, {104, 169},
244 {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN},
245 {116, SAP_TX_LEAKAGE_MIN},{120, SAP_TX_LEAKAGE_MIN},
246 {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN},
247 {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700248 {140, SAP_TX_LEAKAGE_MIN}
249#ifdef FEATURE_WLAN_CH144
250 ,{144, SAP_TX_LEAKAGE_MIN}
251#endif
252}},
Ryan Hsu78b33242014-07-22 08:29:07 -0700253
254 {120,
255 {{36, 395}, {40, 419},
256 {44, 439}, {48, 407},
257 {52, 321}, {56, 334},
258 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
259 {100, 134}, {104, 186},
260 {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN},
261 {116, SAP_TX_LEAKAGE_MIN},{120, SAP_TX_LEAKAGE_MIN},
262 {124, SAP_TX_LEAKAGE_MIN},{128, 159},
263 {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700264 {140, SAP_TX_LEAKAGE_MIN}
265#ifdef FEATURE_WLAN_CH144
266 ,{144, SAP_TX_LEAKAGE_MIN}
267#endif
268}},
Ryan Hsu78b33242014-07-22 08:29:07 -0700269
270 {124,
271 {{36, 469}, {40, 433},
272 {44, 434}, {48, 435},
273 {52, 332}, {56, 345},
274 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
275 {100, 146}, {104, 177},
276 {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN},
277 {116, 350}, {120, SAP_TX_LEAKAGE_MIN},
278 {124, SAP_TX_LEAKAGE_MIN},{128, 138},
279 {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700280 {140, SAP_TX_LEAKAGE_MIN}
281#ifdef FEATURE_WLAN_CH144
282 ,{144, SAP_TX_LEAKAGE_MIN}
283#endif
284}},
Ryan Hsu78b33242014-07-22 08:29:07 -0700285
286 {128,
287 {{36, 408}, {40, 434},
288 {44, 449}, {48, 444},
289 {52, 341}, {56, 374},
290 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
291 {100, 205}, {104, 208},
292 {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN},
293 {116, 142}, {120, SAP_TX_LEAKAGE_MIN},
294 {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN},
295 {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700296 {140, SAP_TX_LEAKAGE_MIN}
297#ifdef FEATURE_WLAN_CH144
298 ,{144, SAP_TX_LEAKAGE_MIN}
299#endif
300}},
301
Ryan Hsu78b33242014-07-22 08:29:07 -0700302 {132,
303 {{36, SAP_TX_LEAKAGE_MAX }, {40, SAP_TX_LEAKAGE_MAX },
304 {44, SAP_TX_LEAKAGE_MAX }, {48, SAP_TX_LEAKAGE_MAX },
305 {52, SAP_TX_LEAKAGE_MAX }, {56, SAP_TX_LEAKAGE_MAX },
306 {60, SAP_TX_LEAKAGE_MIN }, {64, SAP_TX_LEAKAGE_MIN },
307 {100, SAP_TX_LEAKAGE_MIN },{104, SAP_TX_LEAKAGE_MIN },
308 {108, SAP_TX_LEAKAGE_MIN }, {112, SAP_TX_LEAKAGE_MIN },
309 {116, SAP_TX_LEAKAGE_MIN },{120, SAP_TX_LEAKAGE_MIN},
310 {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN},
311 {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700312 {140, SAP_TX_LEAKAGE_MIN }
313#ifdef FEATURE_WLAN_CH144
314 ,{144, SAP_TX_LEAKAGE_MIN}
315#endif
316}},
317
Ryan Hsu78b33242014-07-22 08:29:07 -0700318 {136,
319 {{36, SAP_TX_LEAKAGE_MAX }, {40, SAP_TX_LEAKAGE_MAX },
320 {44, SAP_TX_LEAKAGE_MAX }, {48, SAP_TX_LEAKAGE_MAX },
321 {52, SAP_TX_LEAKAGE_MAX }, {56, SAP_TX_LEAKAGE_MAX },
322 {60, SAP_TX_LEAKAGE_MIN }, {64, SAP_TX_LEAKAGE_MIN },
323 {100, SAP_TX_LEAKAGE_MIN },{104, SAP_TX_LEAKAGE_MIN },
324 {108, SAP_TX_LEAKAGE_MIN },{112, SAP_TX_LEAKAGE_MIN },
325 {116, SAP_TX_LEAKAGE_MIN }, {120, SAP_TX_LEAKAGE_MIN},
326 {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN},
327 {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700328 {140, SAP_TX_LEAKAGE_MIN }
329#ifdef FEATURE_WLAN_CH144
330 ,{144, SAP_TX_LEAKAGE_MIN}
331#endif
332}},
333
Ryan Hsu78b33242014-07-22 08:29:07 -0700334 {140,
335 {{36, SAP_TX_LEAKAGE_MAX }, {40, SAP_TX_LEAKAGE_MAX },
336 {44, SAP_TX_LEAKAGE_MAX }, {48, SAP_TX_LEAKAGE_MAX },
337 {52, SAP_TX_LEAKAGE_MAX }, {56, SAP_TX_LEAKAGE_MAX },
338 {60, SAP_TX_LEAKAGE_MIN }, {64, SAP_TX_LEAKAGE_MIN },
339 {100, SAP_TX_LEAKAGE_MIN },{104, SAP_TX_LEAKAGE_MIN },
340 {108, SAP_TX_LEAKAGE_MIN },{112, SAP_TX_LEAKAGE_MIN },
341 {116, SAP_TX_LEAKAGE_MIN }, {120, SAP_TX_LEAKAGE_MIN},
342 {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700343 {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN}
344#ifdef FEATURE_WLAN_CH144
345 ,{144, SAP_TX_LEAKAGE_MIN}
346#endif
347}},
kaliuec014272015-12-01 14:13:24 +0800348
349#ifdef FEATURE_WLAN_CH144
350 {144,
351 {{36, 695}, {40, 695 },
352 {44, 684}, {48, 684 },
353 {52, 664}, {56, 664 },
354 {60, 658}, {64, 658 },
355 {100, 601},{104, 601 },
356 {108, 545},{112, 545 },
357 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, SAP_TX_LEAKAGE_AUTO_MIN},
358 {124, SAP_TX_LEAKAGE_AUTO_MIN}, {128, SAP_TX_LEAKAGE_AUTO_MIN},
359 {132, 262},{136, 262},
360 {140, SAP_TX_LEAKAGE_MIN},
361 {144, SAP_TX_LEAKAGE_MIN}
362}},
363#endif
Ryan Hsu78b33242014-07-22 08:29:07 -0700364};
365
366/* channel tx leakage table - ht40 */
367tSapChanMatrixInfo ht40_chan[] =
368{
369 {52,
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700370 {{36, SAP_TX_LEAKAGE_AUTO_MIN}, {40, SAP_TX_LEAKAGE_AUTO_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700371 {44, 230}, {48, 230 },
Ryan Hsu78b33242014-07-22 08:29:07 -0700372 {52, SAP_TX_LEAKAGE_MIN}, {56, SAP_TX_LEAKAGE_MIN},
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700373 {60, SAP_TX_LEAKAGE_AUTO_MIN}, {64, SAP_TX_LEAKAGE_AUTO_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700374 {100, 625}, {104, 323 },
375 {108, 646},{112, 646 },
Ryan Hsu78b33242014-07-22 08:29:07 -0700376 {116, SAP_TX_LEAKAGE_MAX},{120, SAP_TX_LEAKAGE_MAX},
377 {124, SAP_TX_LEAKAGE_MAX},{128, SAP_TX_LEAKAGE_MAX},
378 {132, SAP_TX_LEAKAGE_MAX},{136, SAP_TX_LEAKAGE_MAX},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700379 {140, SAP_TX_LEAKAGE_MAX}
380#ifdef FEATURE_WLAN_CH144
381 ,{144, SAP_TX_LEAKAGE_MIN}
382#endif
383}},
384
Ryan Hsu78b33242014-07-22 08:29:07 -0700385 {56,
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700386 {{36, SAP_TX_LEAKAGE_AUTO_MIN}, {40, SAP_TX_LEAKAGE_AUTO_MIN},
387 {44, SAP_TX_LEAKAGE_AUTO_MIN}, {48, SAP_TX_LEAKAGE_AUTO_MIN},
Ryan Hsu78b33242014-07-22 08:29:07 -0700388 {52, SAP_TX_LEAKAGE_MIN}, {56, SAP_TX_LEAKAGE_MIN},
389 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700390 {100, 611},{104, 611 },
391 {108, 617},{112, 617 },
Ryan Hsu78b33242014-07-22 08:29:07 -0700392 {116, SAP_TX_LEAKAGE_MAX},{120, SAP_TX_LEAKAGE_MAX},
393 {124, SAP_TX_LEAKAGE_MAX},{128, SAP_TX_LEAKAGE_MAX},
394 {132, SAP_TX_LEAKAGE_MAX},{136, SAP_TX_LEAKAGE_MAX},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700395 {140, SAP_TX_LEAKAGE_MAX}
396#ifdef FEATURE_WLAN_CH144
397 ,{144, SAP_TX_LEAKAGE_MIN}
398#endif
399}},
400
Ryan Hsu78b33242014-07-22 08:29:07 -0700401 {60,
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700402 {{36, SAP_TX_LEAKAGE_AUTO_MIN}, {40,SAP_TX_LEAKAGE_AUTO_MIN},
403 {44, SAP_TX_LEAKAGE_AUTO_MIN}, {48, SAP_TX_LEAKAGE_AUTO_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700404 {52, 190}, {56, 190},
Ryan Hsu78b33242014-07-22 08:29:07 -0700405 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700406 {100, 608},{104, 608 },
407 {108, 623},{112, 623 },
Ryan Hsu78b33242014-07-22 08:29:07 -0700408 {116, SAP_TX_LEAKAGE_MAX},{120, SAP_TX_LEAKAGE_MAX},
409 {124, SAP_TX_LEAKAGE_MAX},{128, SAP_TX_LEAKAGE_MAX},
410 {132, SAP_TX_LEAKAGE_MAX},{136, SAP_TX_LEAKAGE_MAX},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700411 {140, SAP_TX_LEAKAGE_MAX}
412#ifdef FEATURE_WLAN_CH144
413 ,{144, SAP_TX_LEAKAGE_MIN}
414#endif
415}},
416
Ryan Hsu78b33242014-07-22 08:29:07 -0700417 {64,
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700418 {{36, SAP_TX_LEAKAGE_AUTO_MIN}, {40, SAP_TX_LEAKAGE_AUTO_MIN},
419 {44, SAP_TX_LEAKAGE_AUTO_MIN}, {48, SAP_TX_LEAKAGE_AUTO_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700420 {52, 295}, {56, 295 },
Ryan Hsu78b33242014-07-22 08:29:07 -0700421 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700422 {100, 594}, {104, 594 },
423 {108, 625},{112, 625 },
Ryan Hsu78b33242014-07-22 08:29:07 -0700424 {116, SAP_TX_LEAKAGE_MAX},{120, SAP_TX_LEAKAGE_MAX},
425 {124, SAP_TX_LEAKAGE_MAX},{128, SAP_TX_LEAKAGE_MAX},
426 {132, SAP_TX_LEAKAGE_MAX},{136, SAP_TX_LEAKAGE_MAX},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700427 {140, SAP_TX_LEAKAGE_MAX}
428#ifdef FEATURE_WLAN_CH144
429 ,{144, SAP_TX_LEAKAGE_MIN}
430#endif
431}},
Ryan Hsu78b33242014-07-22 08:29:07 -0700432
433 {100,
Naveen Rawatb885df62014-08-25 19:53:15 -0700434 {{36, 618}, {40, 618 },
435 {44, 604}, {48, 604 },
436 {52, 596}, {56, 596 },
437 {60, 584}, {64, 584 },
Ryan Hsu78b33242014-07-22 08:29:07 -0700438 {100, SAP_TX_LEAKAGE_MIN},{104, SAP_TX_LEAKAGE_MIN },
Naveen Rawatb885df62014-08-25 19:53:15 -0700439 {108, 299}, {112, 299 },
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700440 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, SAP_TX_LEAKAGE_AUTO_MIN},
441 {124, SAP_TX_LEAKAGE_AUTO_MIN}, {128, SAP_TX_LEAKAGE_AUTO_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700442 {132, 538}, {136, 538 },
Naveen Rawatd19871c2014-10-17 16:55:24 -0700443 {140, 598}
444#ifdef FEATURE_WLAN_CH144
445 ,{144, SAP_TX_LEAKAGE_MIN}
446#endif
447}},
448
Ryan Hsu78b33242014-07-22 08:29:07 -0700449 {104,
Naveen Rawatb885df62014-08-25 19:53:15 -0700450 {{36, 636}, {40, 636 },
451 {44, 601}, {48, 601 },
452 {52, 616}, {56, 616 },
453 {60, 584}, {64, 584 },
Ryan Hsu78b33242014-07-22 08:29:07 -0700454 {100, SAP_TX_LEAKAGE_MIN},{104, SAP_TX_LEAKAGE_MIN},
455 {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN},
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700456 {116, SAP_TX_LEAKAGE_AUTO_MIN},{120, SAP_TX_LEAKAGE_AUTO_MIN},
457 {124, SAP_TX_LEAKAGE_AUTO_MIN},{128, SAP_TX_LEAKAGE_AUTO_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700458 {132, 553}, {136, 553 },
Naveen Rawatd19871c2014-10-17 16:55:24 -0700459 {140, 568}
460#ifdef FEATURE_WLAN_CH144
461 ,{144, SAP_TX_LEAKAGE_MIN}
462#endif
463}},
464
Ryan Hsu78b33242014-07-22 08:29:07 -0700465 {108,
Naveen Rawatb885df62014-08-25 19:53:15 -0700466 {{36, 600}, {40, 600 },
467 {44, 627}, {48, 627 },
468 {52, 611}, {56, 611 },
469 {60, 611}, {64, 611 },
470 {100, 214},{104, 214},
Ryan Hsu78b33242014-07-22 08:29:07 -0700471 {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN},
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700472 {116, SAP_TX_LEAKAGE_AUTO_MIN},{120, SAP_TX_LEAKAGE_AUTO_MIN},
473 {124, SAP_TX_LEAKAGE_AUTO_MIN},{128, SAP_TX_LEAKAGE_AUTO_MIN},
474 {132, SAP_TX_LEAKAGE_AUTO_MIN},{136, SAP_TX_LEAKAGE_AUTO_MIN},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700475 {140, 534}
476#ifdef FEATURE_WLAN_CH144
477 ,{144, SAP_TX_LEAKAGE_MIN}
478#endif
479}},
480
Ryan Hsu78b33242014-07-22 08:29:07 -0700481 {112,
Naveen Rawatb885df62014-08-25 19:53:15 -0700482 {{36, 645}, {40, 645 },
483 {44, 641}, {48, 641 },
484 {52, 618}, {56, 618 },
485 {60, 612}, {64, 612 },
486 {100, 293},{104, 293},
Ryan Hsu78b33242014-07-22 08:29:07 -0700487 {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN},
488 {116, SAP_TX_LEAKAGE_MIN},{120, SAP_TX_LEAKAGE_MIN},
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700489 {124, SAP_TX_LEAKAGE_AUTO_MIN},{128, SAP_TX_LEAKAGE_AUTO_MIN},
490 {132, SAP_TX_LEAKAGE_AUTO_MIN},{136, SAP_TX_LEAKAGE_AUTO_MIN},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700491 {140, 521}
492#ifdef FEATURE_WLAN_CH144
493 ,{144, SAP_TX_LEAKAGE_MIN}
494#endif
495}},
496
Ryan Hsu78b33242014-07-22 08:29:07 -0700497 {116,
Naveen Rawatb885df62014-08-25 19:53:15 -0700498 {{36, 661}, {40, 661 },
499 {44, 624}, {48, 624 },
500 {52, 634}, {56, 634 },
501 {60, 611}, {64, 611 },
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700502 {100, SAP_TX_LEAKAGE_AUTO_MIN},{104, SAP_TX_LEAKAGE_AUTO_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700503 {108, 217},{112, 217 },
Ryan Hsu78b33242014-07-22 08:29:07 -0700504 {116, SAP_TX_LEAKAGE_MIN},{120, SAP_TX_LEAKAGE_MIN},
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700505 {124, SAP_TX_LEAKAGE_AUTO_MIN},{128, SAP_TX_LEAKAGE_AUTO_MIN},
506 {132, SAP_TX_LEAKAGE_AUTO_MIN},{136, SAP_TX_LEAKAGE_AUTO_MIN},
507 {140, SAP_TX_LEAKAGE_AUTO_MIN}
Naveen Rawatd19871c2014-10-17 16:55:24 -0700508#ifdef FEATURE_WLAN_CH144
509 ,{144, SAP_TX_LEAKAGE_MIN}
510#endif
511}},
512
Ryan Hsu78b33242014-07-22 08:29:07 -0700513 {120,
Naveen Rawatb885df62014-08-25 19:53:15 -0700514 {{36, 667}, {40, 667 },
515 {44, 645}, {48, 645 },
516 {52, 633}, {56, 633 },
517 {60, 619}, {64, 619 },
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700518 {100, SAP_TX_LEAKAGE_AUTO_MIN}, {104, SAP_TX_LEAKAGE_AUTO_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700519 {108, 291},{112, 291},
Ryan Hsu78b33242014-07-22 08:29:07 -0700520 {116, SAP_TX_LEAKAGE_MIN},{120, SAP_TX_LEAKAGE_MIN},
521 {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN},
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700522 {132, SAP_TX_LEAKAGE_AUTO_MIN},{136, SAP_TX_LEAKAGE_AUTO_MIN},
523 {140, SAP_TX_LEAKAGE_AUTO_MIN}
Naveen Rawatd19871c2014-10-17 16:55:24 -0700524#ifdef FEATURE_WLAN_CH144
525 ,{144, SAP_TX_LEAKAGE_MIN}
526#endif
527}},
528
Ryan Hsu78b33242014-07-22 08:29:07 -0700529 {124,
Naveen Rawatb885df62014-08-25 19:53:15 -0700530 {{36, 676}, {40, 676 },
531 {44, 668}, {48, 668 },
532 {52, 595}, {56, 595 },
533 {60, 622}, {64, 622 },
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700534 {100, SAP_TX_LEAKAGE_AUTO_MIN}, {104, SAP_TX_LEAKAGE_AUTO_MIN},
535 {108, SAP_TX_LEAKAGE_AUTO_MIN}, {112, SAP_TX_LEAKAGE_AUTO_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700536 {116, 225},{120, 225},
Ryan Hsu78b33242014-07-22 08:29:07 -0700537 {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN},
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700538 {132, SAP_TX_LEAKAGE_AUTO_MIN},{136, SAP_TX_LEAKAGE_AUTO_MIN},
539 {140, SAP_TX_LEAKAGE_AUTO_MIN}
Naveen Rawatd19871c2014-10-17 16:55:24 -0700540#ifdef FEATURE_WLAN_CH144
541 ,{144, SAP_TX_LEAKAGE_MIN}
542#endif
543}},
544
Ryan Hsu78b33242014-07-22 08:29:07 -0700545 {128,
Naveen Rawatb885df62014-08-25 19:53:15 -0700546 {{36, 678}, {40, 678 },
547 {44, 664}, {48, 664 },
548 {52, 651}, {56, 651 },
549 {60, 643}, {64, 643 },
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700550 {100, SAP_TX_LEAKAGE_AUTO_MIN}, {104, SAP_TX_LEAKAGE_AUTO_MIN},
551 {108, SAP_TX_LEAKAGE_AUTO_MIN}, {112, SAP_TX_LEAKAGE_AUTO_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700552 {116, 293},{120, 293},
Ryan Hsu78b33242014-07-22 08:29:07 -0700553 {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN},
554 {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN},
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700555 {140, SAP_TX_LEAKAGE_AUTO_MIN}
Naveen Rawatd19871c2014-10-17 16:55:24 -0700556#ifdef FEATURE_WLAN_CH144
557 ,{144, SAP_TX_LEAKAGE_MIN}
558#endif
559}},
560
Ryan Hsu78b33242014-07-22 08:29:07 -0700561 {132,
Naveen Rawatb885df62014-08-25 19:53:15 -0700562 {{36, 689}, {40, 689 },
563 {44, 669}, {48, 669 },
564 {52, 662}, {56, 662 },
565 {60, 609}, {64, 609 },
566 {100, 538},{104, 538 },
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700567 {108, SAP_TX_LEAKAGE_AUTO_MIN}, {112, SAP_TX_LEAKAGE_AUTO_MIN},
568 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, SAP_TX_LEAKAGE_AUTO_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700569 {124, 247},{128, 247},
Ryan Hsu78b33242014-07-22 08:29:07 -0700570 {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700571 {140, SAP_TX_LEAKAGE_MIN }
572#ifdef FEATURE_WLAN_CH144
573 ,{144, SAP_TX_LEAKAGE_MIN}
574#endif
575}},
576
Ryan Hsu78b33242014-07-22 08:29:07 -0700577 {136,
Naveen Rawatb885df62014-08-25 19:53:15 -0700578 {{36, 703}, {40, 703 },
Ryan Hsu78b33242014-07-22 08:29:07 -0700579 {44, 688}, {48, SAP_TX_LEAKAGE_MIN },
Naveen Rawatb885df62014-08-25 19:53:15 -0700580 {52, 671}, {56, 671 },
581 {60, 658}, {64, 658 },
582 {100, 504},{104, 504 },
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700583 {108, SAP_TX_LEAKAGE_AUTO_MIN},{112, SAP_TX_LEAKAGE_AUTO_MIN},
584 {116, SAP_TX_LEAKAGE_AUTO_MIN},{120, SAP_TX_LEAKAGE_AUTO_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700585 {124, 289},{128, 289},
Ryan Hsu78b33242014-07-22 08:29:07 -0700586 {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700587 {140, SAP_TX_LEAKAGE_MIN }
588#ifdef FEATURE_WLAN_CH144
589 ,{144, SAP_TX_LEAKAGE_MIN}
590#endif
591}},
592
Ryan Hsu78b33242014-07-22 08:29:07 -0700593 {140,
Naveen Rawatb885df62014-08-25 19:53:15 -0700594 {{36, 695}, {40, 695 },
595 {44, 684}, {48, 684 },
596 {52, 664}, {56, 664 },
597 {60, 658}, {64, 658 },
598 {100, 601},{104, 601 },
599 {108, 545},{112, 545 },
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700600 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, SAP_TX_LEAKAGE_AUTO_MIN},
601 {124, SAP_TX_LEAKAGE_AUTO_MIN}, {128, SAP_TX_LEAKAGE_AUTO_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700602 {132, 262},{136, 262},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700603 {140, SAP_TX_LEAKAGE_MIN }
604#ifdef FEATURE_WLAN_CH144
605 ,{144, SAP_TX_LEAKAGE_MIN}
606#endif
607}},
Ryan Hsu78b33242014-07-22 08:29:07 -0700608
kaliuec014272015-12-01 14:13:24 +0800609#ifdef FEATURE_WLAN_CH144
610 {144,
611 {{36, 695}, {40, 695 },
612 {44, 684}, {48, 684 },
613 {52, 664}, {56, 664 },
614 {60, 658}, {64, 658 },
615 {100, 601},{104, 601 },
616 {108, 545},{112, 545 },
617 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, SAP_TX_LEAKAGE_AUTO_MIN},
618 {124, SAP_TX_LEAKAGE_AUTO_MIN}, {128, SAP_TX_LEAKAGE_AUTO_MIN},
619 {132, 262},{136, 262},
620 {140, SAP_TX_LEAKAGE_MIN},
621 {144, SAP_TX_LEAKAGE_MIN}
622}},
623#endif
624};
Ryan Hsu78b33242014-07-22 08:29:07 -0700625
626/* channel tx leakage table - ht20 */
627tSapChanMatrixInfo ht20_chan[] =
628{
629 {52,
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700630 {{36, SAP_TX_LEAKAGE_AUTO_MIN}, {40, 286},
Ryan Hsu78b33242014-07-22 08:29:07 -0700631 {44, 225}, {48, 121},
632 {52, SAP_TX_LEAKAGE_MIN}, {56, SAP_TX_LEAKAGE_MIN},
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700633 {60, 300}, {64, SAP_TX_LEAKAGE_AUTO_MIN},
Ryan Hsu78b33242014-07-22 08:29:07 -0700634 {100, 637}, {104, SAP_TX_LEAKAGE_MAX},
635 {108, SAP_TX_LEAKAGE_MAX},{112, SAP_TX_LEAKAGE_MAX},
636 {116, SAP_TX_LEAKAGE_MAX},{120, SAP_TX_LEAKAGE_MAX},
637 {124, SAP_TX_LEAKAGE_MAX},{128, SAP_TX_LEAKAGE_MAX},
638 {132, SAP_TX_LEAKAGE_MAX},{136, SAP_TX_LEAKAGE_MAX},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700639 {140, SAP_TX_LEAKAGE_MAX}
640#ifdef FEATURE_WLAN_CH144
641 ,{144, SAP_TX_LEAKAGE_MIN}
642#endif
643}},
644
Ryan Hsu78b33242014-07-22 08:29:07 -0700645 {56,
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700646 {{36, 468}, {40, SAP_TX_LEAKAGE_AUTO_MIN},
647 {44, SAP_TX_LEAKAGE_AUTO_MIN}, {48, 206},
Ryan Hsu78b33242014-07-22 08:29:07 -0700648 {52, SAP_TX_LEAKAGE_MIN}, {56, SAP_TX_LEAKAGE_MIN},
649 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
650 {100, SAP_TX_LEAKAGE_MAX},{104, SAP_TX_LEAKAGE_MAX},
651 {108, SAP_TX_LEAKAGE_MAX},{112, SAP_TX_LEAKAGE_MAX},
652 {116, SAP_TX_LEAKAGE_MAX},{120, SAP_TX_LEAKAGE_MAX},
653 {124, SAP_TX_LEAKAGE_MAX},{128, SAP_TX_LEAKAGE_MAX},
654 {132, SAP_TX_LEAKAGE_MAX},{136, SAP_TX_LEAKAGE_MAX},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700655 {140, SAP_TX_LEAKAGE_MAX}
656#ifdef FEATURE_WLAN_CH144
657 ,{144, SAP_TX_LEAKAGE_MIN}
658#endif
659}},
660
Ryan Hsu78b33242014-07-22 08:29:07 -0700661 {60,
662 {{36, 507}, {40, 440},
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700663 {44, SAP_TX_LEAKAGE_AUTO_MIN}, {48, 313},
Ryan Hsu78b33242014-07-22 08:29:07 -0700664 {52, SAP_TX_LEAKAGE_MIN}, {56, SAP_TX_LEAKAGE_MIN},
665 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
666 {100, SAP_TX_LEAKAGE_MAX},{104, SAP_TX_LEAKAGE_MAX},
667 {108, SAP_TX_LEAKAGE_MAX},{112, SAP_TX_LEAKAGE_MAX},
668 {116, SAP_TX_LEAKAGE_MAX},{120, SAP_TX_LEAKAGE_MAX},
669 {124, SAP_TX_LEAKAGE_MAX},{128, SAP_TX_LEAKAGE_MAX},
670 {132, SAP_TX_LEAKAGE_MAX},{136, SAP_TX_LEAKAGE_MAX},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700671 {140, SAP_TX_LEAKAGE_MAX}
672#ifdef FEATURE_WLAN_CH144
673 ,{144, SAP_TX_LEAKAGE_MIN}
674#endif
675}},
676
Ryan Hsu78b33242014-07-22 08:29:07 -0700677 {64,
678 {{36, 516}, {40, 520},
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700679 {44, 506}, {48, SAP_TX_LEAKAGE_AUTO_MIN},
Ryan Hsu78b33242014-07-22 08:29:07 -0700680 {52, 301}, {56, 258},
681 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
682 {100, 620}, {104, 617},
683 {108, SAP_TX_LEAKAGE_MAX},{112, SAP_TX_LEAKAGE_MAX},
684 {116, SAP_TX_LEAKAGE_MAX},{120, SAP_TX_LEAKAGE_MAX},
685 {124, SAP_TX_LEAKAGE_MAX},{128, SAP_TX_LEAKAGE_MAX},
686 {132, SAP_TX_LEAKAGE_MAX},{136, SAP_TX_LEAKAGE_MAX},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700687 {140, SAP_TX_LEAKAGE_MAX}
688#ifdef FEATURE_WLAN_CH144
689 ,{144, SAP_TX_LEAKAGE_MIN}
690#endif
691}},
Ryan Hsu78b33242014-07-22 08:29:07 -0700692
693 {100,
694 {{36, 616}, {40, 601},
695 {44, 604}, {48, 589},
696 {52, 612}, {56, 592},
697 {60, 590}, {64, 582},
698 {100, SAP_TX_LEAKAGE_MIN},{104, 131},
Rakesh Sunki68b9d5d2015-08-07 16:49:40 -0700699 {108, SAP_TX_LEAKAGE_AUTO_MIN}, {112, SAP_TX_LEAKAGE_AUTO_MIN},
700 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, 522},
Ryan Hsu78b33242014-07-22 08:29:07 -0700701 {124, 571}, {128, 589},
702 {132, 593}, {136, 598},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700703 {140, 594}
704#ifdef FEATURE_WLAN_CH144
705 ,{144, SAP_TX_LEAKAGE_MIN}
706#endif
707}},
708
Ryan Hsu78b33242014-07-22 08:29:07 -0700709 {104,
710 {{36, 622}, {40, 624},
711 {44, 618}, {48, 610},
712 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
713 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
714 {100, SAP_TX_LEAKAGE_MIN},{104, SAP_TX_LEAKAGE_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700715 {108, SAP_TX_LEAKAGE_MIN},{112, 463},
716 {116, 483},{120, 503},
Ryan Hsu78b33242014-07-22 08:29:07 -0700717 {124, 523}, {128, 565},
718 {132, 570}, {136, 588},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700719 {140, 585}
720#ifdef FEATURE_WLAN_CH144
721 ,{144, SAP_TX_LEAKAGE_MIN}
722#endif
723}},
724
Ryan Hsu78b33242014-07-22 08:29:07 -0700725 {108,
726 {{36, 620}, {40, 638},
727 {44, 611}, {48, 614},
728 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
729 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
Naveen Rawatb885df62014-08-25 19:53:15 -0700730 {100, 477},{104, SAP_TX_LEAKAGE_MIN},
Ryan Hsu78b33242014-07-22 08:29:07 -0700731 {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700732 {116, 477},{120, 497},
733 {124, 517},{128, 537},
734 {132, 557},{136, 577},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700735 {140, 603}
736#ifdef FEATURE_WLAN_CH144
737 ,{144, SAP_TX_LEAKAGE_MIN}
738#endif
739}},
740
Ryan Hsu78b33242014-07-22 08:29:07 -0700741 {112,
742 {{36, 636}, {40, 623},
743 {44, 638}, {48, 628},
744 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
745 {60, SAP_TX_LEAKAGE_MAX}, {64, 606},
Naveen Rawatb885df62014-08-25 19:53:15 -0700746 {100, 501},{104, 481},
Ryan Hsu78b33242014-07-22 08:29:07 -0700747 {108, SAP_TX_LEAKAGE_MIN},{112, SAP_TX_LEAKAGE_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700748 {116, SAP_TX_LEAKAGE_MIN},{120, 481},
749 {124, 501},{128, 421},
750 {132, 541},{136, 561},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700751 {140, 583}
752#ifdef FEATURE_WLAN_CH144
753 ,{144, SAP_TX_LEAKAGE_MIN}
754#endif
755}},
756
Ryan Hsu78b33242014-07-22 08:29:07 -0700757 {116,
758 {{36, 646}, {40, 648},
759 {44, 633}, {48, 634},
760 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
Naveen Rawatb885df62014-08-25 19:53:15 -0700761 {60, 615}, {64, 594},
762 {100, 575},{104, 554},
763 {108, 534},{112, SAP_TX_LEAKAGE_MIN},
Ryan Hsu78b33242014-07-22 08:29:07 -0700764 {116, SAP_TX_LEAKAGE_MIN},{120, SAP_TX_LEAKAGE_MIN},
765 {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700766 {132, 534},{136, 554},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700767 {140, 574}
768#ifdef FEATURE_WLAN_CH144
769 ,{144, SAP_TX_LEAKAGE_MIN}
770#endif
771}},
772
Ryan Hsu78b33242014-07-22 08:29:07 -0700773 {120,
774 {{36, 643}, {40, 649},
775 {44, 654}, {48, 629},
776 {52, SAP_TX_LEAKAGE_MAX}, {56, 621},
777 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
Naveen Rawatb885df62014-08-25 19:53:15 -0700778 {100, 565}, {104, 545},
779 {108, 525},{112, 505},
Ryan Hsu78b33242014-07-22 08:29:07 -0700780 {116, SAP_TX_LEAKAGE_MIN},{120, SAP_TX_LEAKAGE_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700781 {124, SAP_TX_LEAKAGE_MIN},{128, 505},
782 {132, 525},{136, 545},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700783 {140, 565}
784#ifdef FEATURE_WLAN_CH144
785 ,{144, SAP_TX_LEAKAGE_MIN}
786#endif
787}},
788
Ryan Hsu78b33242014-07-22 08:29:07 -0700789 {124,
790 {{36, 638}, {40, 657},
791 {44, 663}, {48, 649},
792 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
793 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
Naveen Rawatb885df62014-08-25 19:53:15 -0700794 {100, 581}, {104, 561},
795 {108, 541},{112, 521},
796 {116, 499},{120, SAP_TX_LEAKAGE_MIN},
Ryan Hsu78b33242014-07-22 08:29:07 -0700797 {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700798 {132, 499},{136, 519},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700799 {140, 539}
800#ifdef FEATURE_WLAN_CH144
801 ,{144, SAP_TX_LEAKAGE_MIN}
802#endif
803}},
804
Ryan Hsu78b33242014-07-22 08:29:07 -0700805 {128,
806 {{36, 651}, {40, 651},
807 {44, 674}, {48, 640},
808 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
809 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
810 {100, 603}, {104, 560},
Naveen Rawatb885df62014-08-25 19:53:15 -0700811 {108, 540},{112, 520},
812 {116, 499},{120, 479},
Ryan Hsu78b33242014-07-22 08:29:07 -0700813 {124, SAP_TX_LEAKAGE_MIN},{128, SAP_TX_LEAKAGE_MIN},
Naveen Rawatb885df62014-08-25 19:53:15 -0700814 {132, SAP_TX_LEAKAGE_MIN},{136, 479},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700815 {140, 499}
816#ifdef FEATURE_WLAN_CH144
817 ,{144, SAP_TX_LEAKAGE_MIN}
818#endif
819}},
820
Ryan Hsu78b33242014-07-22 08:29:07 -0700821 {132,
822 {{36, 643}, {40, 668},
823 {44, 651}, {48, 657},
824 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
825 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
826 {100, SAP_TX_LEAKAGE_MAX},{104, 602},
827 {108, 578}, {112, 570},
Naveen Rawatb885df62014-08-25 19:53:15 -0700828 {116, 550},{120, 530},
829 {124, 510},{128, SAP_TX_LEAKAGE_MIN},
Ryan Hsu78b33242014-07-22 08:29:07 -0700830 {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700831 {140, 490}
832#ifdef FEATURE_WLAN_CH144
833 ,{144, SAP_TX_LEAKAGE_MIN}
834#endif
835}},
836
Ryan Hsu78b33242014-07-22 08:29:07 -0700837 {136,
838 {{36, 654}, {40, 667},
839 {44, 666}, {48, 642},
840 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
841 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
842 {100, SAP_TX_LEAKAGE_MAX},{104, SAP_TX_LEAKAGE_MAX},
843 {108, SAP_TX_LEAKAGE_MAX},{112, 596},
Naveen Rawatb885df62014-08-25 19:53:15 -0700844 {116, 555}, {120, 535},
845 {124, 515},{128, 495},
Ryan Hsu78b33242014-07-22 08:29:07 -0700846 {132, SAP_TX_LEAKAGE_MIN},{136, SAP_TX_LEAKAGE_MIN},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700847 {140, SAP_TX_LEAKAGE_MIN}
848#ifdef FEATURE_WLAN_CH144
849 ,{144, SAP_TX_LEAKAGE_MIN}
850#endif
851}},
852
Ryan Hsu78b33242014-07-22 08:29:07 -0700853 {140,
854 {{36, 679}, {40, 673},
855 {44, 667}, {48, 656},
856 {52, 634}, {56, 663},
Naveen Rawatb885df62014-08-25 19:53:15 -0700857 {60, 662}, {64, 660},
Ryan Hsu78b33242014-07-22 08:29:07 -0700858 {100, SAP_TX_LEAKAGE_MAX},{104, SAP_TX_LEAKAGE_MAX},
859 {108, SAP_TX_LEAKAGE_MAX},{112, 590},
Naveen Rawatb885df62014-08-25 19:53:15 -0700860 {116, 573}, {120, 553},
861 {124, 533},{128, 513},
862 {132, 490},{136, SAP_TX_LEAKAGE_MIN},
Naveen Rawatd19871c2014-10-17 16:55:24 -0700863 {140, SAP_TX_LEAKAGE_MIN}
864#ifdef FEATURE_WLAN_CH144
865 ,{144, SAP_TX_LEAKAGE_MIN}
866#endif
867}},
kaliuec014272015-12-01 14:13:24 +0800868
869#ifdef FEATURE_WLAN_CH144
870 {144,
871 {{36, 679}, {40, 673},
872 {44, 667}, {48, 656},
873 {52, 634}, {56, 663},
874 {60, 662}, {64, 660},
875 {100, SAP_TX_LEAKAGE_MAX},{104, SAP_TX_LEAKAGE_MAX},
876 {108, SAP_TX_LEAKAGE_MAX},{112, 590},
877 {116, 573}, {120, 553},
878 {124, 533},{128, 513},
879 {132, 490},{136, SAP_TX_LEAKAGE_MIN},
880 {140, SAP_TX_LEAKAGE_MIN},
881 {144, SAP_TX_LEAKAGE_MIN}
882}},
883#endif
Ryan Hsu78b33242014-07-22 08:29:07 -0700884};
Naveen Rawatd19871c2014-10-17 16:55:24 -0700885#endif //end of WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
Ryan Hsu78b33242014-07-22 08:29:07 -0700886
887
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -0700888/*----------------------------------------------------------------------------
889 * Static Function Declarations and Definitions
890 * -------------------------------------------------------------------------*/
891#ifdef SOFTAP_CHANNEL_RANGE
892static VOS_STATUS sapGetChannelList(ptSapContext sapContext, v_U8_t **channelList,
893 v_U8_t *numberOfChannels);
894#endif
Ravi Joshia02f1d72013-12-13 22:52:22 -0800895
896/*==========================================================================
897 FUNCTION sapGet5GHzChannelList
898
899 DESCRIPTION
900 Function for initializing list of 2.4/5 Ghz [NON-DFS/DFS] available
901 channels in the current regulatory domain.
902
903 DEPENDENCIES
904 NA.
905
906 PARAMETERS
907
908 IN
909 sapContext: SAP Context
910
911 RETURN VALUE
912 NA
913
914 SIDE EFFECTS
915============================================================================*/
916static VOS_STATUS sapGet5GHzChannelList(ptSapContext sapContext);
917
918/*==========================================================================
Ryan Hsuef962b32014-05-06 04:25:33 -0700919 FUNCTION sapStopDfsCacTimer
920
921 DESCRIPTION
922 Function to sttop the DFS CAC timer when SAP is stopped
923 DEPENDENCIES
924 NA.
925
926 PARAMETERS
927
928 IN
929 sapContext: SAP Context
930 RETURN VALUE
931 DFS Timer start status
932 SIDE EFFECTS
933============================================================================*/
934
935static int sapStopDfsCacTimer(ptSapContext sapContext);
936
937/*==========================================================================
Ravi Joshia02f1d72013-12-13 22:52:22 -0800938 FUNCTION sapStartDfsCacTimer
939
940 DESCRIPTION
941 Function to start the DFS CAC timer when SAP is started on DFS Channel
942 DEPENDENCIES
943 NA.
944
945 PARAMETERS
946
947 IN
948 sapContext: SAP Context
949 RETURN VALUE
950 DFS Timer start status
951 SIDE EFFECTS
952============================================================================*/
953
954int sapStartDfsCacTimer(ptSapContext sapContext);
955
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -0700956/*----------------------------------------------------------------------------
957 * Externalized Function Definitions
958* -------------------------------------------------------------------------*/
959
960/*----------------------------------------------------------------------------
961 * Function Declarations and Documentation
962 * -------------------------------------------------------------------------*/
963
964/*==========================================================================
965 FUNCTION sapEventInit
966
967 DESCRIPTION
968 Function for initializing sWLAN_SAPEvent structure
969
970 DEPENDENCIES
971 NA.
972
973 PARAMETERS
974
975 IN
976 sapEvent : State machine event
977
978 RETURN VALUE
979
980 None
981
982 SIDE EFFECTS
983============================================================================*/
984static inline void sapEventInit(ptWLAN_SAPEvent sapEvent)
985{
986 sapEvent->event = eSAP_MAC_SCAN_COMPLETE;
987 sapEvent->params = 0;
988 sapEvent->u1 = 0;
989 sapEvent->u2 = 0;
990}
991
Naveen Rawatd19871c2014-10-17 16:55:24 -0700992#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -0800993/*
Naveen Rawatd19871c2014-10-17 16:55:24 -0700994 * This function gives the leakage matrix for given NOL channel and cbMode
Ryan Hsu78b33242014-07-22 08:29:07 -0700995 *
996 * PARAMETERS
997 * IN
Naveen Rawatd19871c2014-10-17 16:55:24 -0700998 * sapContext : Pointer to vos global context structure
999 * cbMode : target channel bonding mode
1000 * NOL_channel : the NOL channel whose leakage matrix is required
1001 * pTarget_chnl_mtrx : pointer to target channel matrix returned.
Ryan Hsu78b33242014-07-22 08:29:07 -07001002 *
1003 * RETURN VALUE
Naveen Rawatd19871c2014-10-17 16:55:24 -07001004 * BOOLEAN
1005 * TRUE: leakage matrix was found
1006 * FALSE: leakage matrix was not found
Ryan Hsu78b33242014-07-22 08:29:07 -07001007 */
1008v_BOOL_t
Naveen Rawatd19871c2014-10-17 16:55:24 -07001009sapFindTargetChannelInChannelMatrix(ptSapContext sapContext,
1010 ePhyChanBondState cbMode,
1011 v_U8_t NOL_channel,
1012 tSapTxLeakInfo **pTarget_chnl_mtrx)
Ryan Hsu78b33242014-07-22 08:29:07 -07001013{
1014 tSapTxLeakInfo *target_chan_matrix = NULL;
1015 tSapChanMatrixInfo *pchan_matrix = NULL;
Ryan Hsu78b33242014-07-22 08:29:07 -07001016 v_U32_t nchan_matrix;
Ryan Hsu78b33242014-07-22 08:29:07 -07001017 int i = 0;
1018
Ryan Hsu78b33242014-07-22 08:29:07 -07001019 switch (cbMode) {
1020 case PHY_SINGLE_CHANNEL_CENTERED:
1021 /* HT20 */
1022 pchan_matrix = ht20_chan;
1023 nchan_matrix = sizeof(ht20_chan)/sizeof(tSapChanMatrixInfo);
1024 break;
1025 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
1026 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
1027 /* HT40 */
1028 pchan_matrix = ht40_chan;
1029 nchan_matrix = sizeof(ht40_chan)/sizeof(tSapChanMatrixInfo);
1030 break;
1031#ifdef WLAN_FEATURE_11AC
1032 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
1033 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
1034 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
1035 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
1036 /* HT80 */
1037 pchan_matrix = ht80_chan;
1038 nchan_matrix = sizeof(ht80_chan)/sizeof(tSapChanMatrixInfo);
1039 break;
1040#endif
1041 default:
1042 /* handle exception and fall back to HT20 table */
1043 pchan_matrix = ht20_chan;
1044 nchan_matrix = sizeof(ht20_chan)/sizeof(tSapChanMatrixInfo);
1045 break;
1046 }
1047
1048 for (i = 0; i < nchan_matrix; i++)
1049 {
1050 /* find the SAP channel to map the leakage matrix */
Naveen Rawatd19871c2014-10-17 16:55:24 -07001051 if (NOL_channel == pchan_matrix[i].channel)
Ryan Hsu78b33242014-07-22 08:29:07 -07001052 {
1053 target_chan_matrix = pchan_matrix[i].chan_matrix;
1054 break;
1055 }
1056 }
1057
1058 if (NULL == target_chan_matrix)
1059 {
Naveen Rawatd19871c2014-10-17 16:55:24 -07001060 return VOS_FALSE;
1061 } else {
1062 *pTarget_chnl_mtrx = target_chan_matrix;
1063 return VOS_TRUE;
1064 }
1065}
1066
1067/*
1068 * This function removes the channels from temp channel list that
1069 * (if selected as target channel) will cause leakage in one of
1070 * the NOL channels
1071 *
1072 * PARAMETERS
1073 * IN
1074 * sapContext : Pointer to vos global context structure
1075 * cbMode : target channel bonding mode
1076 * pNol : DFS NOL
1077 * pTempChannelList : the target channel list
1078 *
1079 * RETURN VALUE
1080 * VOS_STATUS code associated with performing the operation
1081 */
1082
1083VOS_STATUS
1084sapMarkChannelsLeakingIntoNOL(ptSapContext sapContext,
1085 ePhyChanBondState cbMode,
1086 tSapDfsNolInfo *pNol,
1087 v_U8_t tempChannelListSize,
1088 v_U8_t *pTempChannelList)
1089{
1090 tSapTxLeakInfo *target_chan_matrix = NULL;
1091#ifdef FEATURE_WLAN_CH144
1092 v_U32_t num_channel = (RF_CHAN_144 - RF_CHAN_36) + 1;
1093#else
1094 v_U32_t num_channel = (RF_CHAN_140 - RF_CHAN_36) + 1;
1095#endif
1096 v_U32_t i = 0;
1097 v_U32_t j = 0;
1098 v_U32_t k = 0;
1099 v_U8_t dfs_nol_channel;
Yingying Tangaafa8632015-12-23 16:09:15 +08001100 tHalHandle hal = VOS_GET_HAL_CB(sapContext->pvosGCtx);
1101 tpAniSirGlobal mac;
Naveen Rawatd19871c2014-10-17 16:55:24 -07001102
Yingying Tangaafa8632015-12-23 16:09:15 +08001103 if (NULL == hal) {
1104 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
1105 "%s: Invalid hal pointer", __func__);
1106 return VOS_STATUS_E_FAULT;
1107 }
1108
1109 mac = PMAC_STRUCT(hal);
Naveen Rawatd19871c2014-10-17 16:55:24 -07001110
1111 /* traverse target_chan_matrix and */
1112 for (i = 0; i < NUM_5GHZ_CHANNELS ; i++) {
1113 dfs_nol_channel = pNol[i].dfs_channel_number;
1114 if ( pNol[i].radar_status_flag == eSAP_DFS_CHANNEL_USABLE ||
1115 pNol[i].radar_status_flag == eSAP_DFS_CHANNEL_AVAILABLE ) {
1116 /* not present in NOL */
1117 continue;
1118 }
1119 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_DEBUG,
1120 FL("sapdfs: processing NOL channel: %d"),
1121 dfs_nol_channel );
1122 if (VOS_FALSE == sapFindTargetChannelInChannelMatrix(sapContext,
1123 cbMode,
1124 dfs_nol_channel,
1125 &target_chan_matrix))
1126 {
1127 /*
1128 * should never happen, we should always find a table here,
Ryan Hsu78b33242014-07-22 08:29:07 -07001129 * if we don't, need a fix here!
1130 */
Naveen Rawatd19871c2014-10-17 16:55:24 -07001131 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
1132 FL("Couldn't find target channel matrix!"));
1133 VOS_ASSERT(0);
1134 return VOS_STATUS_E_FAILURE;
Ryan Hsu78b33242014-07-22 08:29:07 -07001135 }
Ryan Hsu78b33242014-07-22 08:29:07 -07001136
Naveen Rawatd19871c2014-10-17 16:55:24 -07001137 /*
1138 * following is based on assumption that both pTempChannelList
1139 * and target channel matrix are in increasing order of channelID
1140 */
1141 for (j = 0, k = 0; j < tempChannelListSize &&
1142 k < num_channel; ) {
1143 if (pTempChannelList[j] == 0) {
1144 j++;
1145 } else {
1146 if (target_chan_matrix[k].leak_chan != pTempChannelList[j]) {
1147 k++;
1148 } else {
1149 /* check leakage from candidate channel to NOL channel */
Yingying Tangaafa8632015-12-23 16:09:15 +08001150 if (target_chan_matrix[k].leak_lvl <=
1151 mac->sap.SapDfsInfo.tx_leakage_threshold)
Naveen Rawatd19871c2014-10-17 16:55:24 -07001152 {
1153 /*
1154 * this means that candidate channel will have bad
1155 * leakage in NOL channel, remove the candidate channel
1156 * from temp list
1157 */
1158 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
1159 FL("sapdfs: channel: %d will have bad leakage"
1160 " due to channel: %d\n"),
1161 dfs_nol_channel,
1162 pTempChannelList[j]);
1163 pTempChannelList[j] = 0;
Naveen Rawatd19871c2014-10-17 16:55:24 -07001164 }
1165 j++;
1166 k++;
1167 }
1168 }
1169 } /* end of for loop checking temp channel list leakage into NOL */
1170 } /* end of loop that selects each NOL */
1171 return VOS_STATUS_SUCCESS;
Ryan Hsu78b33242014-07-22 08:29:07 -07001172}
1173
Naveen Rawatd19871c2014-10-17 16:55:24 -07001174#endif // end of WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
1175
Naveen Rawatb885df62014-08-25 19:53:15 -07001176/*
1177 * This function adds availabe channel to bitmap
1178 *
1179 * PARAMETERS
1180 * IN
1181 * pBitmap: bitmap to populate
1182 * channel: channel to set in bitmap
1183 */
1184static void sapSetBitmap(chan_bonding_bitmap *pBitmap, v_U8_t channel)
1185{
1186 int i = 0;
1187 int start_channel = 0;
1188 for ( i = 0; i < MAX_80MHZ_BANDS; i++ ) {
1189 start_channel = pBitmap->chanBondingSet[i].startChannel;
1190 if (channel >= start_channel && channel <= start_channel + 12) {
1191 pBitmap->chanBondingSet[i].channelMap |=
1192 1 << ((channel - start_channel)/4);
1193 return;
1194 }
1195 }
1196 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
1197 FL("Channel=%d is not in the bitmap"), channel);
1198}
1199
1200/*
1201 * This function reads the bitmap and populates available channel
1202 * list according to channel bonding mode. This will be called for
1203 * 80 MHz and 40 Mhz only. For 20 MHz no need for bitmap hence list
1204 * is directly created while parsing the main list
1205 *
1206 * PARAMETERS
1207 * IN
1208 * pBitmap: bitmap to populate
1209 * cbModeCurrent: cb mode to check for channel availability
1210 * availableChannels: available channel list to populate
1211 *
1212 * RETURN VALUE
1213 * number of channels found
1214 */
1215static v_U8_t sapPopulateAvailableChannels(chan_bonding_bitmap *pBitmap,
1216 ePhyChanBondState cbModeCurrent,
1217 v_U8_t *availableChannels)
1218{
1219 v_U8_t i = 0;
1220 v_U8_t channelCount = 0;
1221 v_U8_t start_channel = 0;
1222
1223 switch (cbModeCurrent) {
1224#ifdef WLAN_FEATURE_11AC
1225 /* HT80 */
1226 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
1227 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
1228 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
1229 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
1230 for ( i = 0; i < MAX_80MHZ_BANDS; i++ ) {
1231 start_channel = pBitmap->chanBondingSet[i].startChannel;
1232 if (pBitmap->chanBondingSet[i].channelMap == SAP_80MHZ_MASK) {
1233 availableChannels[channelCount++] = start_channel;
1234 availableChannels[channelCount++] = start_channel + 4;
1235 availableChannels[channelCount++] = start_channel + 8;
1236 availableChannels[channelCount++] = start_channel + 12;
1237 }
1238 }
1239 break;
1240#endif
1241 /* HT40 */
1242 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
1243 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
1244 for ( i = 0; i < MAX_80MHZ_BANDS; i++ ) {
1245 start_channel = pBitmap->chanBondingSet[i].startChannel;
1246 if ((pBitmap->chanBondingSet[i].channelMap & SAP_40MHZ_MASK_L)
1247 == SAP_40MHZ_MASK_L) {
1248 availableChannels[channelCount++] = start_channel;
1249 availableChannels[channelCount++] = start_channel + 4;
1250 } else {
1251 if ((pBitmap->chanBondingSet[i].channelMap &
1252 SAP_40MHZ_MASK_H) == SAP_40MHZ_MASK_H) {
1253 availableChannels[channelCount++] = start_channel + 8;
1254 availableChannels[channelCount++] = start_channel + 12;
1255 }
1256 }
1257 }
1258 break;
1259 default:
1260 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
1261 FL("Invalid case."));
1262 break;
1263 }
1264
1265 return channelCount;
1266}
Ryan Hsu78b33242014-07-22 08:29:07 -07001267
1268/*
Rakesh Sunkief87b502014-09-02 13:42:17 -07001269 * FUNCTION sapDfsIsW53Invalid
1270 *
1271 * DESCRIPTION Checks if the passed channel is W53 and returns if
1272 * SAP W53 opearation is allowed.
1273 *
1274 * DEPENDENCIES PARAMETERS
1275 * IN hHAL : HAL pointer
1276 * channelID: Channel Number to be verified
1277 *
1278 * RETURN VALUE : v_BOOL_t
1279 * VOS_TRUE: If W53 operation is disabled
1280 * VOS_FALSE: If W53 operation is enabled
1281 *
1282 * SIDE EFFECTS
1283 */
1284v_BOOL_t sapDfsIsW53Invalid(tHalHandle hHal, v_U8_t channelID)
1285{
1286 tpAniSirGlobal pMac;
1287
1288 pMac = PMAC_STRUCT(hHal);
1289 if (NULL == pMac)
1290 {
1291 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
1292 FL("invalid pMac"));
1293 return VOS_FALSE;
1294 }
1295
1296 /*
1297 * Check for JAPAN W53 Channel operation capability
1298 */
1299 if (VOS_TRUE == pMac->sap.SapDfsInfo.is_dfs_w53_disabled &&
1300 VOS_TRUE == IS_CHAN_JAPAN_W53(channelID))
1301 {
1302 return VOS_TRUE;
1303 }
1304
1305 return VOS_FALSE;
1306}
1307
1308/*
1309 * FUNCTION sapDfsIsChannelInPreferredLocation
1310 *
1311 * DESCRIPTION Checks if the passed channel is in accordance with preferred
1312 * Channel location settings.
1313 *
1314 * DEPENDENCIES PARAMETERS
1315 * IN hHAL : HAL pointer
1316 * channelID: Channel Number to be verified
1317 *
1318 * RETURN VALUE :v_BOOL_t
1319 * VOS_TRUE:If Channel location is same as the preferred location
1320 * VOS_FALSE:If Channel location is not same as the preferred location
1321 *
1322 * SIDE EFFECTS
1323 */
1324v_BOOL_t sapDfsIsChannelInPreferredLocation(tHalHandle hHal, v_U8_t channelID)
1325{
1326 tpAniSirGlobal pMac;
1327
1328 pMac = PMAC_STRUCT(hHal);
1329 if (NULL == pMac) {
1330 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
1331 FL("invalid pMac"));
1332 return VOS_TRUE;
1333 }
1334 if ( (SAP_CHAN_PREFERRED_INDOOR ==
1335 pMac->sap.SapDfsInfo.sap_operating_chan_preferred_location) &&
1336 (VOS_TRUE == IS_CHAN_JAPAN_OUTDOOR(channelID)) )
1337 {
1338 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
1339 FL("CHAN=%d is Outdoor so invalid,preferred Indoor only"),
1340 channelID);
1341 return VOS_FALSE;
1342 }
1343 else if ( (SAP_CHAN_PREFERRED_OUTDOOR ==
1344 pMac->sap.SapDfsInfo.sap_operating_chan_preferred_location) &&
1345 (VOS_TRUE == IS_CHAN_JAPAN_INDOOR(channelID)) )
1346 {
1347 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
1348 FL("CHAN=%d is Indoor so invalid,preferred Outdoor only"),
1349 channelID);
1350 return VOS_FALSE;
1351 }
1352
1353 return VOS_TRUE;
1354}
1355
Naveen Rawat3503dd42015-02-02 17:29:27 -08001356#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
1357/**
1358 * sap_check_in_avoid_ch_list() - checks if given channel present is channel
1359 * avoidance list
1360 * avoid_channels_info struct
1361 * @sap_ctx: sap context.
1362 * @channel: channel to be checked in sap_ctx's avoid ch list
1363 *
1364 * sap_ctx contains sap_avoid_ch_info strcut containing the list of channels on
1365 * which MDM device's AP with MCC was detected. This function checks if given
1366 * channel is present in that list.
1367 *
1368 * Return: true, if channel was present, false othersie.
1369 */
Sandeep Puligillae7f97712015-04-23 13:32:36 -07001370bool
Naveen Rawat3503dd42015-02-02 17:29:27 -08001371sap_check_in_avoid_ch_list(ptSapContext sap_ctx, uint8_t channel)
1372{
1373 uint8_t i = 0;
1374 struct sap_avoid_channels_info *ie_info =
1375 &sap_ctx->sap_detected_avoid_ch_ie;
1376
1377 for (i = 0; i < sizeof(ie_info->channels); i++) {
1378 if (ie_info->channels[i] == channel)
1379 return true;
1380 }
1381 return false;
1382}
1383#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
1384
Ashish Kumar Goswami28a222a2017-01-31 14:13:03 +05301385/**
1386 * sap_is_valid_acs_channel() - checks if given channel is in acs channel range
1387 * @sap_ctx: sap context.
1388 * @channel: channel to be checked in acs range
1389 *
1390 * Return: true, if channel is valid, false otherwise.
1391 */
1392static bool sap_is_valid_acs_channel(ptSapContext sap_ctx, uint8_t channel)
1393{
1394 int i = 0;
1395
1396 /* Check whether acs is enabled */
1397 if (!sap_ctx->acs_cfg->acs_mode)
1398 return true;
1399
1400 if ((channel < sap_ctx->acs_cfg->start_ch) ||
1401 (channel > sap_ctx->acs_cfg->end_ch)) {
1402 return false;
1403 }
1404 if (!sap_ctx->acs_cfg->ch_list) {
1405 /* List not present, return */
1406 return true;
1407 } else {
1408 for (i = 0; i < sap_ctx->acs_cfg->ch_list_count; i++)
1409 if (channel == sap_ctx->acs_cfg->ch_list[i])
1410 return true;
1411 }
1412
1413 return false;
1414}
1415
Rakesh Sunkief87b502014-09-02 13:42:17 -07001416/*
Ryan Hsu807a20e2014-05-08 02:08:33 -07001417 * This function randomly pick up an AVAILABLE channel
1418 */
1419static v_U8_t sapRandomChannelSel(ptSapContext sapContext)
1420{
Naveen Rawatb885df62014-08-25 19:53:15 -07001421 v_U32_t random_byte = 0;
1422 v_U8_t available_chnl_count = 0;
Chandrasekaran, Manishekar74dfc6d2015-02-09 14:16:02 +05301423 uint8_t avail_dfs_chan_count = 0;
1424 uint8_t avail_non_dfs_chan_count = 0;
Naveen Rawatd19871c2014-10-17 16:55:24 -07001425 v_U8_t valid_chnl_count = 0;
Naveen Rawatb885df62014-08-25 19:53:15 -07001426 v_U8_t availableChannels[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0,};
Chandrasekaran, Manishekar74dfc6d2015-02-09 14:16:02 +05301427 uint8_t avail_dfs_chan_list[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0,};
1428 uint8_t avail_non_dfs_chan_list[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0,};
Naveen Rawatb885df62014-08-25 19:53:15 -07001429 v_U8_t target_channel = 0;
Ryan Hsu807a20e2014-05-08 02:08:33 -07001430 v_BOOL_t isChannelNol = VOS_FALSE;
Ashish Kumar Goswami28a222a2017-01-31 14:13:03 +05301431 v_BOOL_t is_valid_acs_chan = VOS_FALSE;
Naveen Rawatb885df62014-08-25 19:53:15 -07001432 chan_bonding_bitmap channelBitmap;
1433 v_U8_t i = 0;
1434 v_U8_t channelID;
1435 tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx);
1436 tpAniSirGlobal pMac;
1437 tANI_U32 chanWidth;
1438 ePhyChanBondState cbModeCurrent;
Naveen Rawatd19871c2014-10-17 16:55:24 -07001439 v_U8_t *tempChannels = NULL;
Ryan Hsuf9826cb2015-04-02 18:10:16 -07001440 uint8_t dfs_region;
Naveen Rawatb885df62014-08-25 19:53:15 -07001441
1442 if (NULL == hHal) {
1443 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
1444 FL("invalid hHal"));
1445 return target_channel;
1446 }
1447
1448 pMac = PMAC_STRUCT(hHal);
1449 if (NULL == pMac) {
1450 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
1451 FL("invalid pMac"));
1452 return target_channel;
1453 }
1454
1455 /*
1456 * Retrieve the original one and store it.
1457 * use the stored original value when you call this function next time
1458 * so fall back mechanism always starts with original ini value.
1459 */
Manikandan Mohan32488a62015-04-05 20:15:03 -07001460
Naveen Rawatb885df62014-08-25 19:53:15 -07001461 if (pMac->sap.SapDfsInfo.orig_cbMode == 0)
1462 {
Manikandan Mohan32488a62015-04-05 20:15:03 -07001463 pMac->sap.SapDfsInfo.orig_cbMode = sme_SelectCBMode(hHal,
1464 sapContext->csrRoamProfile.phyMode,
1465 sapContext->channel,
Peng Xub5bebcf2015-07-14 14:49:45 -07001466 sapContext->secondary_ch,
Manikandan Mohan32488a62015-04-05 20:15:03 -07001467 &sapContext->vht_channel_width,
1468 sapContext->ch_width_orig);
Manikandan Mohan2be12412015-06-25 17:53:44 -07001469 pMac->sap.SapDfsInfo.orig_cbMode = csrConvertCBIniValueToPhyCBState(
1470 pMac->sap.SapDfsInfo.orig_cbMode);
Naveen Rawatb885df62014-08-25 19:53:15 -07001471 cbModeCurrent = pMac->sap.SapDfsInfo.orig_cbMode;
1472 }
1473 else
1474 {
1475 cbModeCurrent = pMac->sap.SapDfsInfo.orig_cbMode;
1476 }
1477
1478 /*
1479 * Retrieve the original one and store it.
1480 * use the stored original value when you call this function next time
1481 * so fall back mechanism always starts with original ini value.
1482 */
1483 if (pMac->sap.SapDfsInfo.orig_chanWidth == 0)
1484 {
1485 pMac->sap.SapDfsInfo.orig_chanWidth =
Manikandan Mohan32488a62015-04-05 20:15:03 -07001486 sapContext->ch_width_orig;
Naveen Rawatb885df62014-08-25 19:53:15 -07001487 chanWidth = pMac->sap.SapDfsInfo.orig_chanWidth;
1488 }
1489 else
1490 {
1491 chanWidth = pMac->sap.SapDfsInfo.orig_chanWidth;
1492 }
Ryan Hsu807a20e2014-05-08 02:08:33 -07001493
1494 if (sapGet5GHzChannelList(sapContext))
1495 {
1496 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
Naveen Rawatd19871c2014-10-17 16:55:24 -07001497 FL("Getting 5Ghz channel list failed"));
Naveen Rawatb885df62014-08-25 19:53:15 -07001498 return target_channel;
Ryan Hsu807a20e2014-05-08 02:08:33 -07001499 }
Ryan Hsu807a20e2014-05-08 02:08:33 -07001500
Ryan Hsuf9826cb2015-04-02 18:10:16 -07001501 vos_nv_get_dfs_region(&dfs_region);
Naveen Rawatb885df62014-08-25 19:53:15 -07001502
Naveen Rawatd19871c2014-10-17 16:55:24 -07001503 /*
1504 * valid_chnl_count will be used to find number of valid channels
1505 * after following for loop ends
1506 */
1507 valid_chnl_count = sapContext->SapAllChnlList.numChannel;
Naveen Rawatb885df62014-08-25 19:53:15 -07001508 /* loop to check ACS range or NOL channels */
1509 for (i = 0; i < sapContext->SapAllChnlList.numChannel; i++)
Ryan Hsu807a20e2014-05-08 02:08:33 -07001510 {
Naveen Rawatb885df62014-08-25 19:53:15 -07001511 channelID = sapContext->SapAllChnlList.channelList[i].channel;
Ryan Hsu807a20e2014-05-08 02:08:33 -07001512
Rakesh Sunkief87b502014-09-02 13:42:17 -07001513 /*
1514 * IN JAPAN REGULATORY DOMAIN CHECK IF THE FOLLOWING TWO
1515 * TWO RULES APPLY AND FILTER THE AVAILABLE CHANNELS
1516 * ACCORDINGLY.
1517 *
1518 * 1. If we are operating in Japan regulatory domain
1519 * Check if Japan W53 Channel operation is NOT
1520 * allowed and if its not allowed then mark all the
1521 * W53 channels as Invalid.
1522 *
1523 * 2. If we are operating in Japan regulatory domain
1524 * Check if channel switch between Indoor/Outdoor
1525 * is allowed. If it is not allowed then limit
1526 * the avaiable channels to Indoor or Outdoor
1527 * channels only based up on the SAP Channel location
1528 * indicated by "sap_operating_channel_location" param.
1529 */
Ryan Hsuf9826cb2015-04-02 18:10:16 -07001530 if (DFS_MKK4_DOMAIN == dfs_region)
Rakesh Sunkief87b502014-09-02 13:42:17 -07001531 {
1532 /*
1533 * Check for JAPAN W53 Channel operation capability
1534 */
1535 if (VOS_TRUE == sapDfsIsW53Invalid(hHal, channelID))
1536 {
1537 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
1538 FL("index:%d, Channel=%d Invalid,Japan W53 Disabled"),
1539 i, channelID);
1540 sapContext->SapAllChnlList.channelList[i].valid = VOS_FALSE;
Naveen Rawatd19871c2014-10-17 16:55:24 -07001541 valid_chnl_count--;
1542 continue;
Rakesh Sunkief87b502014-09-02 13:42:17 -07001543 }
1544
1545 /*
1546 * If SAP's preferred channel location is Indoor
1547 * then set all the outdoor channels in the domain
1548 * to invalid.If the preferred channel location is
1549 * outdoor then set all the Indoor channels in the
1550 * domain to Invalid.
1551 */
1552 if (VOS_FALSE ==
1553 sapDfsIsChannelInPreferredLocation(hHal, channelID))
1554 {
1555 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
1556 FL("CHAN=%d is invalid,preferred Channel Location %d Only"),
1557 channelID,
1558 pMac->sap.SapDfsInfo.sap_operating_chan_preferred_location);
1559 sapContext->SapAllChnlList.channelList[i].valid = VOS_FALSE;
Naveen Rawatd19871c2014-10-17 16:55:24 -07001560 valid_chnl_count--;
1561 continue;
Rakesh Sunkief87b502014-09-02 13:42:17 -07001562 }
1563 }
1564
Naveen Rawatb885df62014-08-25 19:53:15 -07001565 if (vos_nv_getChannelEnabledState(channelID) == NV_CHANNEL_DFS)
Ryan Hsu807a20e2014-05-08 02:08:33 -07001566 {
1567 isChannelNol = sapDfsIsChannelInNolList(sapContext,
Naveen Rawatb885df62014-08-25 19:53:15 -07001568 channelID,
1569 PHY_SINGLE_CHANNEL_CENTERED);
Ryan Hsu807a20e2014-05-08 02:08:33 -07001570 if (VOS_TRUE == isChannelNol)
1571 {
1572 /*
Naveen Rawatb885df62014-08-25 19:53:15 -07001573 * Mark this channel invalid since it is still in
Ryan Hsu807a20e2014-05-08 02:08:33 -07001574 * DFS Non-Occupancy-Period which is 30 mins.
1575 */
1576 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
Naveen Rawatd19871c2014-10-17 16:55:24 -07001577 FL("index: %d, Channel = %d Present in NOL"),
Naveen Rawatb885df62014-08-25 19:53:15 -07001578 i, channelID);
1579 sapContext->SapAllChnlList.channelList[i].valid = VOS_FALSE;
Naveen Rawatd19871c2014-10-17 16:55:24 -07001580 valid_chnl_count--;
1581 continue;
Ryan Hsu807a20e2014-05-08 02:08:33 -07001582 }
1583 }
Peng Xu7351a3b2014-06-19 19:48:06 -07001584
Naveen Rawat22f6c122014-12-17 15:24:23 -08001585#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
1586 /* avoid channels on which another MDM AP in MCC mode is detected. */
Naveen Rawata0250c52015-01-26 17:57:28 -08001587 if (pMac->sap.sap_channel_avoidance
1588 && sapContext->sap_detected_avoid_ch_ie.present) {
Naveen Rawat3503dd42015-02-02 17:29:27 -08001589 if (sap_check_in_avoid_ch_list(sapContext, channelID)) {
1590 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
1591 FL("index: %d, Channel = %d, avoided due to "
1592 "presence of another AP+AP MCC device in same "
1593 "channel."),
1594 i, channelID);
1595 sapContext->SapAllChnlList.channelList[i].valid = VOS_FALSE;
Naveen Rawat22f6c122014-12-17 15:24:23 -08001596 }
1597 }
1598#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
1599
Peng Xu7351a3b2014-06-19 19:48:06 -07001600 /* check if the channel is within ACS channel range */
Ashish Kumar Goswami28a222a2017-01-31 14:13:03 +05301601 is_valid_acs_chan = sap_is_valid_acs_channel(sapContext,
Naveen Rawatb885df62014-08-25 19:53:15 -07001602 channelID);
Ashish Kumar Goswami28a222a2017-01-31 14:13:03 +05301603 if (is_valid_acs_chan == false)
Peng Xu7351a3b2014-06-19 19:48:06 -07001604 {
1605 /*
Naveen Rawatb885df62014-08-25 19:53:15 -07001606 * mark this channel invalid since it is out of ACS channel range
Peng Xu7351a3b2014-06-19 19:48:06 -07001607 */
1608 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
Ashish Kumar Goswami28a222a2017-01-31 14:13:03 +05301609 FL("index: %d, Channel=%d out of ACS channel range %d-%d"),
1610 i, channelID, sapContext->acs_cfg->start_ch,
1611 sapContext->acs_cfg->end_ch);
Naveen Rawatb885df62014-08-25 19:53:15 -07001612 sapContext->SapAllChnlList.channelList[i].valid = VOS_FALSE;
Naveen Rawatd19871c2014-10-17 16:55:24 -07001613 valid_chnl_count--;
1614 continue;
Peng Xu7351a3b2014-06-19 19:48:06 -07001615 }
Naveen Rawatb885df62014-08-25 19:53:15 -07001616 } /* end of check for NOL or ACS channels */
Peng Xu7351a3b2014-06-19 19:48:06 -07001617
Naveen Rawatd19871c2014-10-17 16:55:24 -07001618 /* valid_chnl_count now have number of valid channels */
1619 tempChannels = vos_mem_malloc(valid_chnl_count);
1620 if (tempChannels == NULL) {
1621 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
1622 FL("sapdfs: memory alloc failed"));
1623 return target_channel;
1624 }
1625
Naveen Rawatb885df62014-08-25 19:53:15 -07001626 do
Ryan Hsu807a20e2014-05-08 02:08:33 -07001627 {
Naveen Rawatd19871c2014-10-17 16:55:24 -07001628 v_U8_t j = 0;
1629#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
1630 tSapDfsNolInfo *pNol = pMac->sap.SapDfsInfo.sapDfsChannelNolList;
1631#endif
1632
1633 /* prepare temp list of just the valid channels */
1634 for (i = 0; i < sapContext->SapAllChnlList.numChannel; i++) {
1635 if (sapContext->SapAllChnlList.channelList[i].valid) {
1636 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
1637 FL("sapdfs: Adding Channel = %d to temp List"),
1638 sapContext->SapAllChnlList.channelList[i].channel);
1639 tempChannels[j++] =
1640 sapContext->SapAllChnlList.channelList[i].channel;
1641 }
1642 }
1643
1644#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
1645 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
1646 FL("sapdfs: Processing temp channel list against NOL."));
1647 if (VOS_STATUS_SUCCESS != sapMarkChannelsLeakingIntoNOL(sapContext,
1648 cbModeCurrent,
1649 pNol,
1650 valid_chnl_count,
1651 tempChannels)) {
1652 vos_mem_free(tempChannels);
1653 return target_channel;
1654 }
1655#endif
1656 vos_mem_zero(availableChannels, sizeof(availableChannels));
Naveen Rawatb885df62014-08-25 19:53:15 -07001657 vos_mem_zero(&channelBitmap, sizeof(channelBitmap));
1658 channelBitmap.chanBondingSet[0].startChannel = 36;
1659 channelBitmap.chanBondingSet[1].startChannel = 52;
1660 channelBitmap.chanBondingSet[2].startChannel = 100;
1661 channelBitmap.chanBondingSet[3].startChannel = 116;
lifeng46e77862016-06-30 14:45:47 +08001662 channelBitmap.chanBondingSet[4].startChannel = 132;
1663 channelBitmap.chanBondingSet[5].startChannel = 149;
Naveen Rawatb885df62014-08-25 19:53:15 -07001664 /* now loop through whatever is left of channel list */
Naveen Rawatd19871c2014-10-17 16:55:24 -07001665 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
1666 FL("sapdfs: Moving temp channel list to final."));
1667 for (i = 0; i < valid_chnl_count; i++ ){
1668 /*
1669 * add channel from temp channel list to bitmap or fianl
1670 * channel list (in case of 20MHz width)
1671 */
1672 if (tempChannels[i] != 0) {
1673 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_DEBUG,
1674 FL("sapdfs: processing channel: %d "),
1675 tempChannels[i]);
1676 /* for 20MHz, directly create available channel list */
1677 if (cbModeCurrent == PHY_SINGLE_CHANNEL_CENTERED) {
1678 VOS_TRACE(VOS_MODULE_ID_SAP,
1679 VOS_TRACE_LEVEL_DEBUG,
1680 FL("sapdfs: Channel=%d added to available list"),
1681 tempChannels[i]);
1682 availableChannels[available_chnl_count++] =
1683 tempChannels[i];
1684 } else {
1685 VOS_TRACE(VOS_MODULE_ID_SAP,
1686 VOS_TRACE_LEVEL_DEBUG,
1687 FL("sapdfs: Channel=%d added to bitmap"),
1688 tempChannels[i]);
1689 sapSetBitmap(&channelBitmap, tempChannels[i]);
Naveen Rawatb885df62014-08-25 19:53:15 -07001690 }
1691 }
Naveen Rawatd19871c2014-10-17 16:55:24 -07001692 }
Naveen Rawatb885df62014-08-25 19:53:15 -07001693
1694 /* if 40 MHz or 80 MHz, populate available channel list from bitmap */
1695 if (cbModeCurrent != PHY_SINGLE_CHANNEL_CENTERED) {
1696 available_chnl_count = sapPopulateAvailableChannels(&channelBitmap,
1697 cbModeCurrent,
1698 availableChannels);
1699 /* if no valid channel bonding found, fallback to lower bandwidth */
1700 if (available_chnl_count == 0) {
1701 if (cbModeCurrent >=
1702 PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_CENTERED) {
1703 VOS_TRACE(VOS_MODULE_ID_SAP,
1704 VOS_TRACE_LEVEL_WARN,
1705 FL("sapdfs:No 80MHz cb found, falling to 40MHz"));
1706 VOS_TRACE(VOS_MODULE_ID_SAP,
1707 VOS_TRACE_LEVEL_WARN,
1708 FL("sapdfs:Changing chanWidth from [%d] to [%d]"),
1709 chanWidth, eHT_CHANNEL_WIDTH_40MHZ);
1710 VOS_TRACE(VOS_MODULE_ID_SAP,
1711 VOS_TRACE_LEVEL_WARN,
1712 FL("sapdfs:Changing CB mode from [%d] to [%d]"),
1713 cbModeCurrent, PHY_DOUBLE_CHANNEL_LOW_PRIMARY);
1714 cbModeCurrent = PHY_DOUBLE_CHANNEL_LOW_PRIMARY;
1715 chanWidth = eHT_CHANNEL_WIDTH_40MHZ;
1716 /* continue to start of do loop */
1717 continue;
1718 } else if (cbModeCurrent >=
1719 PHY_DOUBLE_CHANNEL_LOW_PRIMARY ) {
1720 VOS_TRACE(VOS_MODULE_ID_SAP,
1721 VOS_TRACE_LEVEL_WARN,
1722 FL("sapdfs:No 40MHz cb found, falling to 20MHz"));
1723 VOS_TRACE(VOS_MODULE_ID_SAP,
1724 VOS_TRACE_LEVEL_WARN,
1725 FL("sapdfs:Changing chanWidth from [%d] to [%d]"),
1726 chanWidth, eHT_CHANNEL_WIDTH_20MHZ);
1727 VOS_TRACE(VOS_MODULE_ID_SAP,
1728 VOS_TRACE_LEVEL_WARN,
1729 FL("sapdfs:Changing CB mode from [%d] to [%d]"),
1730 cbModeCurrent, PHY_SINGLE_CHANNEL_CENTERED);
1731 cbModeCurrent = PHY_SINGLE_CHANNEL_CENTERED;
1732 chanWidth = eHT_CHANNEL_WIDTH_20MHZ;
1733 /* continue to start of do loop */
1734 continue;
1735 }
1736 }
1737 }
Ryan Hsu807a20e2014-05-08 02:08:33 -07001738
1739 /*
Naveen Rawatb885df62014-08-25 19:53:15 -07001740 * by now, available channels list will be populated or
1741 * no channels are avaialbe
Ryan Hsu807a20e2014-05-08 02:08:33 -07001742 */
Naveen Rawatb885df62014-08-25 19:53:15 -07001743 if (available_chnl_count) {
Chandrasekaran, Manishekar74dfc6d2015-02-09 14:16:02 +05301744 for (i=0;i<available_chnl_count;i++) {
1745 if (VOS_IS_DFS_CH(availableChannels[i])) {
1746 avail_dfs_chan_list[avail_dfs_chan_count++] =
1747 availableChannels[i];
1748 } else {
1749 avail_non_dfs_chan_list[avail_non_dfs_chan_count++] =
1750 availableChannels[i];
1751 }
1752 }
1753 } else {
Naveen Rawatb885df62014-08-25 19:53:15 -07001754 VOS_TRACE(VOS_MODULE_ID_SAP,
1755 VOS_TRACE_LEVEL_INFO_LOW,
1756 FL("No target channel found"));
Chandrasekaran, Manishekar74dfc6d2015-02-09 14:16:02 +05301757 break;
Naveen Rawatb885df62014-08-25 19:53:15 -07001758 }
Chandrasekaran, Manishekar74dfc6d2015-02-09 14:16:02 +05301759
1760 vos_rand_get_bytes(0, (v_U8_t*)&random_byte, 1);
1761 /* Give preference to non-DFS channel */
1762 if (!pMac->f_prefer_non_dfs_on_radar) {
1763 i = (random_byte + vos_timer_get_system_ticks()) %
1764 available_chnl_count;
1765 target_channel = availableChannels[i];
1766 } else if (avail_non_dfs_chan_count) {
1767 i = (random_byte + vos_timer_get_system_ticks()) %
1768 avail_non_dfs_chan_count;
1769 target_channel = avail_non_dfs_chan_list[i];
1770 } else {
1771 i = (random_byte + vos_timer_get_system_ticks()) %
1772 avail_dfs_chan_count;
1773 target_channel = avail_dfs_chan_list[i];
1774 }
1775
1776 pMac->sap.SapDfsInfo.new_chanWidth = chanWidth;
1777 pMac->sap.SapDfsInfo.new_cbMode = cbModeCurrent;
1778 VOS_TRACE(VOS_MODULE_ID_SAP,
1779 VOS_TRACE_LEVEL_INFO_LOW,
1780 FL("sapdfs: New CB mode = %d"),
1781 pMac->sap.SapDfsInfo.new_cbMode);
1782 VOS_TRACE(VOS_MODULE_ID_SAP,
1783 VOS_TRACE_LEVEL_INFO_LOW,
1784 FL("sapdfs: New Channel width = %d"),
1785 pMac->sap.SapDfsInfo.new_chanWidth);
1786 VOS_TRACE(VOS_MODULE_ID_SAP,
1787 VOS_TRACE_LEVEL_INFO_LOW,
1788 FL("sapdfs: target_channel = %d"), target_channel);
Naveen Rawatb885df62014-08-25 19:53:15 -07001789 break;
1790 } while(1); /* this loop will iterate at max 3 times */
Ryan Hsu807a20e2014-05-08 02:08:33 -07001791
Naveen Rawatd19871c2014-10-17 16:55:24 -07001792 vos_mem_free(tempChannels);
Ryan Hsu807a20e2014-05-08 02:08:33 -07001793 return target_channel;
1794}
1795
Ryan Hsu807a20e2014-05-08 02:08:33 -07001796/*
Ryan Hsue9758412014-07-17 20:02:53 -07001797 * Mark the channels in NOL with time and eSAP_DFS_CHANNEL_UNAVAILABLE
1798 */
1799void sapMarkDfsChannels(ptSapContext sapContext, v_U8_t* channels,
1800 v_U8_t numChannels, v_U64_t time)
1801{
1802 int i, j;
1803 tSapDfsNolInfo *psapDfsChannelNolList = NULL;
1804 v_U8_t nRegDomainDfsChannels;
1805 tHalHandle hHal;
1806 tpAniSirGlobal pMac;
Yingying Tang2a7f0f82016-04-07 17:11:07 +08001807 v_U64_t time_elapsed_since_last_radar;
1808 v_U64_t time_when_radar_found;
Ryan Hsue9758412014-07-17 20:02:53 -07001809
1810 hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx);
1811
1812 if (NULL == channels)
1813 return;
1814
1815 if (NULL == hHal) {
1816 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
1817 FL("invalid hHal"));
1818 return;
1819 }
1820
1821 pMac = PMAC_STRUCT(hHal);
1822 if (NULL == pMac) {
1823 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
1824 FL("invalid pMac"));
1825 return;
1826 }
1827
1828 /*
1829 * Mark the current channel on which Radar is found
1830 * in the NOL list as eSAP_DFS_CHANNEL_UNAVAILABLE.
1831 */
1832
1833 psapDfsChannelNolList = pMac->sap.SapDfsInfo.sapDfsChannelNolList;
1834 nRegDomainDfsChannels = pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels;
1835
1836 for (i = 0; i < numChannels; i++) {
1837 for (j = 0; j <= nRegDomainDfsChannels; j++)
1838 {
1839 if (psapDfsChannelNolList[j].dfs_channel_number ==
1840 channels[i])
1841 {
Yingying Tang2a7f0f82016-04-07 17:11:07 +08001842 time_when_radar_found =
1843 psapDfsChannelNolList[j].radar_found_timestamp;
1844 time_elapsed_since_last_radar = time -
1845 time_when_radar_found;
Ryan Hsue9758412014-07-17 20:02:53 -07001846 /* If channel is already in NOL, don't update it again.
1847 * This is useful when marking bonding channels which are
1848 * already unavailable.
1849 */
Yingying Tang2a7f0f82016-04-07 17:11:07 +08001850 if ((psapDfsChannelNolList[j].radar_status_flag ==
1851 eSAP_DFS_CHANNEL_UNAVAILABLE)&&
1852 (time_elapsed_since_last_radar <
1853 SAP_DFS_NON_OCCUPANCY_PERIOD))
Ryan Hsue9758412014-07-17 20:02:53 -07001854 {
1855 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
1856 FL("Channel=%d already in NOL"),
1857 channels[i]);
1858 }
1859 else
1860 {
1861 /*
1862 * Capture the Radar Found timestamp on the Current
1863 * Channel in ms.
1864 */
1865 psapDfsChannelNolList[j].radar_found_timestamp = time;
1866 /* Mark the Channel to be UNAVAILABLE for next 30 mins */
1867 psapDfsChannelNolList[j].radar_status_flag =
1868 eSAP_DFS_CHANNEL_UNAVAILABLE;
1869
1870 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
1871 FL("Channel=%d Added to NOL LIST"),
1872 channels[i]);
1873 }
1874 }
1875 }
1876 }
1877}
1878
1879
1880/*
1881 * This Function is to get bonding channels from primary channel.
1882 *
1883 */
1884v_U8_t sapGetBondingChannels(ptSapContext sapContext, v_U8_t channel,
1885 v_U8_t* channels, v_U8_t size, ePhyChanBondState chanBondState)
1886{
1887 tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx);
1888 tpAniSirGlobal pMac;
1889 v_U8_t numChannel;
1890
1891 if(channels == NULL)
1892 return 0;
1893
1894 if(size < MAX_BONDED_CHANNELS) return 0;
1895
1896 if (NULL != hHal)
1897 {
1898 pMac = PMAC_STRUCT( hHal );
1899 }
1900 else
1901 return 0;
1902
1903 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
1904 FL("cbmode: %d, channel: %d"),
1905 chanBondState, channel);
1906
1907 switch (chanBondState) {
1908 case PHY_SINGLE_CHANNEL_CENTERED:
1909 numChannel = 1;
1910 channels[0] = channel;
1911 break;
1912 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
1913 numChannel = 2;
1914 channels[0] = channel - 4;
1915 channels[1] = channel;
1916 break;
1917 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
1918 numChannel = 2;
1919 channels[0] = channel;
1920 channels[1] = channel + 4;
1921 break;
1922#ifdef WLAN_FEATURE_11AC
1923 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
1924 numChannel = 4;
1925 channels[0] = channel;
1926 channels[1] = channel + 4;
1927 channels[2] = channel + 8;
1928 channels[3] = channel + 12;
1929 break;
1930 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
1931 numChannel = 4;
1932 channels[0] = channel - 4;
1933 channels[1] = channel;
1934 channels[2] = channel + 4;
1935 channels[3] = channel + 8;
1936 break;
1937 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
1938 numChannel = 4;
1939 channels[0] = channel - 8;
1940 channels[1] = channel - 4;
1941 channels[2] = channel;
1942 channels[3] = channel + 4;
1943 break;
1944 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
1945 numChannel = 4;
1946 channels[0] = channel - 12;
1947 channels[1] = channel - 8;
1948 channels[2] = channel - 4;
1949 channels[3] = channel;
1950 break;
1951#endif
1952 default:
1953 numChannel = 1;
1954 channels[0] = channel;
1955 break;
1956 }
1957
1958 return numChannel;
1959}
1960
1961/*
1962 * This Function Checks if a given bonded channel is AVAILABLE or USABLE
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08001963 * for DFS operation.
1964 */
Ryan Hsu807a20e2014-05-08 02:08:33 -07001965v_BOOL_t
Ryan Hsue9758412014-07-17 20:02:53 -07001966sapDfsIsChannelInNolList(ptSapContext sapContext, v_U8_t channelNumber,
1967 ePhyChanBondState chanBondState)
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08001968{
Srinivas Girigowda80b314c2017-03-21 15:19:01 -07001969 int i = 0, j;
Ryan Hsue9758412014-07-17 20:02:53 -07001970 v_U64_t timeElapsedSinceLastRadar,timeWhenRadarFound,currentTime = 0;
Chandrasekaran, Manishekar1d5b31a2015-07-01 18:21:02 +05301971 v_U64_t max_jiffies;
krunal sonib1a4f532014-06-18 16:19:49 -07001972 tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx);
1973 tpAniSirGlobal pMac;
Ryan Hsue9758412014-07-17 20:02:53 -07001974 v_U8_t channels[MAX_BONDED_CHANNELS];
1975 v_U8_t numChannels;
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08001976
krunal sonib1a4f532014-06-18 16:19:49 -07001977 if (NULL == hHal)
1978 {
1979 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
1980 "In %s invalid hHal", __func__);
1981 return VOS_FALSE;
1982 }
1983 else
1984 {
1985 pMac = PMAC_STRUCT( hHal );
1986 }
1987
1988 if ((pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels == 0) ||
1989 (pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels >
Ryan Hsu807a20e2014-05-08 02:08:33 -07001990 NUM_5GHZ_CHANNELS))
1991 {
1992 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
1993 "%s: invalid dfs channel count %d",
1994 __func__,
krunal sonib1a4f532014-06-18 16:19:49 -07001995 pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels);
Ryan Hsu807a20e2014-05-08 02:08:33 -07001996 return VOS_FALSE;
1997 }
1998
Ryan Hsue9758412014-07-17 20:02:53 -07001999 /* get the bonded channels */
2000 numChannels = sapGetBondingChannels(sapContext, channelNumber, channels,
2001 MAX_BONDED_CHANNELS, chanBondState );
2002
2003 /* check for NOL, first on will break the loop */
2004 for (j=0; j < numChannels; j++)
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08002005 {
Ryan Hsue9758412014-07-17 20:02:53 -07002006 for (i =0 ; i< pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels; i++)
2007 {
2008 if(pMac->sap.SapDfsInfo.sapDfsChannelNolList[i]
2009 .dfs_channel_number == channels[j])
2010 {
2011 if ( (pMac->sap.SapDfsInfo.sapDfsChannelNolList[i]
2012 .radar_status_flag == eSAP_DFS_CHANNEL_USABLE)
2013 ||
2014 (pMac->sap.SapDfsInfo.sapDfsChannelNolList[i]
2015 .radar_status_flag == eSAP_DFS_CHANNEL_AVAILABLE) )
2016 {
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08002017 /*
2018 * Allow SAP operation on this channel
2019 * either the DFS channel has not been used
2020 * for SAP operation or it is available for
2021 * SAP operation since it is past Non-Occupancy-Period
2022 * so, return FALSE.
2023 */
2024 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
Ryan Hsue9758412014-07-17 20:02:53 -07002025 FL("Channel = %d not in NOL, CHANNEL AVAILABLE"),
2026 pMac->sap.SapDfsInfo.sapDfsChannelNolList[i]
2027 .dfs_channel_number);
2028 }
2029 else if (pMac->sap.SapDfsInfo.sapDfsChannelNolList[i]
2030 .radar_status_flag == eSAP_DFS_CHANNEL_UNAVAILABLE)
2031 {
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08002032 /*
2033 * If a DFS Channel is UNAVAILABLE then
2034 * check to see if it is past Non-occupancy-period
2035 * of 30 minutes. If it is past 30 mins then
2036 * mark the channel as AVAILABLE and return FALSE
2037 * as the channel is not anymore in NON-Occupancy-Period.
2038 */
krunal sonib1a4f532014-06-18 16:19:49 -07002039 timeWhenRadarFound = pMac->sap.SapDfsInfo
Ryan Hsue9758412014-07-17 20:02:53 -07002040 .sapDfsChannelNolList[i]
2041 .radar_found_timestamp;
2042 currentTime = vos_get_monotonic_boottime();
Chandrasekaran, Manishekar1d5b31a2015-07-01 18:21:02 +05302043
2044 if (currentTime < timeWhenRadarFound) {
2045 /* vos_get_monotonic_boottime() can overflow. Jiffies is
2046 * initialized such that 32 bit jiffies value wrap 5 minutes
2047 * after boot so jiffies wrap bugs show up earlier.
2048 */
2049 max_jiffies = (v_U64_t)UINT_MAX * 1000;
2050 timeElapsedSinceLastRadar = (max_jiffies -
2051 timeWhenRadarFound) + (currentTime);
2052 } else {
2053 timeElapsedSinceLastRadar = currentTime -
2054 timeWhenRadarFound;
2055 }
Ryan Hsue9758412014-07-17 20:02:53 -07002056 if (timeElapsedSinceLastRadar >= SAP_DFS_NON_OCCUPANCY_PERIOD)
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08002057 {
Ryan Hsue9758412014-07-17 20:02:53 -07002058 pMac->sap.SapDfsInfo.sapDfsChannelNolList[i]
2059 .radar_status_flag = eSAP_DFS_CHANNEL_AVAILABLE;
2060 pMac->sap.SapDfsInfo.sapDfsChannelNolList[i]
2061 .radar_found_timestamp = 0;
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08002062
Ryan Hsue9758412014-07-17 20:02:53 -07002063 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
2064 FL("Channel=%d not in NOL, CHANNEL AVAILABLE"),
2065 pMac->sap.SapDfsInfo.sapDfsChannelNolList[i]
2066 .dfs_channel_number);
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08002067 }
2068 else
2069 {
Ryan Hsue9758412014-07-17 20:02:53 -07002070 /*
2071 * Channel is not still available for SAP operation
2072 * so return TRUE; As the Channel is still
2073 * in Non-occupancy-Period.
2074 */
2075 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
2076 FL("Channel=%d still in NOL, CHANNEL UNAVAILABLE"),
2077 pMac->sap.SapDfsInfo.sapDfsChannelNolList[i]
2078 .dfs_channel_number);
2079 break;
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08002080 }
Ryan Hsue9758412014-07-17 20:02:53 -07002081 }
2082 } /* if */
2083 } /* loop for dfs channels */
2084
2085 if (i < pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels)
2086 break;
2087
2088 } /* loop for bonded channels */
2089
2090 /* if any of the channel is not available, mark all available channels as
2091 * unavailable with same time stamp.
2092 */
2093 if (j < numChannels &&
2094 i < pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels)
2095 {
Rakesh Sunki39aa7252014-07-29 20:42:48 -07002096 if (numChannels > MAX_BONDED_CHANNELS) {
2097 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_WARN,
2098 FL( "numChannels > MAX_BONDED_CHANNELS so resetting"));
2099 numChannels = MAX_BONDED_CHANNELS;
2100 }
Ryan Hsue9758412014-07-17 20:02:53 -07002101 sapMarkDfsChannels(sapContext,
2102 channels,
2103 numChannels,
2104 pMac->sap.SapDfsInfo.sapDfsChannelNolList[i]
2105 .radar_found_timestamp);
2106
2107 /* set DFS-NOL back to keep it update-to-date in CNSS */
2108 sapSignalHDDevent(sapContext, NULL, eSAP_DFS_NOL_SET,
2109 (v_PVOID_t) eSAP_STATUS_SUCCESS);
2110
2111 return VOS_TRUE;
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08002112 }
Ryan Hsue9758412014-07-17 20:02:53 -07002113
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08002114 return VOS_FALSE;
2115}
2116
Selvaraj, Sridharf61b7f92016-09-03 18:07:00 +05302117/**
2118 * sap_select_default_oper_chan_ini() - Selects operating channel based on ini
2119 * @hal: pointer to HAL
2120 * @acs_11a: 11a acs cfg
2121 *
2122 * Return: selected operating channel
2123 */
2124uint8_t sap_select_default_oper_chan_ini(tHalHandle hal, uint32_t acs_11a)
2125{
2126 uint32_t operating_band = 0;
2127 uint8_t channel;
2128 ccmCfgGetInt(hal, WNI_CFG_SAP_CHANNEL_SELECT_OPERATING_BAND,
2129 &operating_band);
2130 if (acs_11a || operating_band == RF_SUBBAND_5_LOW_GHZ ||
2131 operating_band == RF_SUBBAND_5_MID_GHZ ||
2132 operating_band == RF_SUBBAND_5_HIGH_GHZ) {
2133 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
2134 FL("Default channel selection from band %d"),
2135 operating_band);
2136 if (operating_band)
2137 (operating_band == RF_SUBBAND_5_LOW_GHZ) ?
2138 (channel = SAP_DEFAULT_LOW_5GHZ_CHANNEL) :
2139 (operating_band == RF_SUBBAND_5_MID_GHZ) ?
2140 (channel = SAP_DEFAULT_MID_5GHZ_CHANNEL) :
2141 (operating_band == RF_SUBBAND_5_HIGH_GHZ) ?
2142 (channel = SAP_DEFAULT_HIGH_5GHZ_CHANNEL) : 0;
2143 else
2144 channel = SAP_DEFAULT_LOW_5GHZ_CHANNEL;
2145
2146 } else {
2147 channel = SAP_DEFAULT_24GHZ_CHANNEL;
2148 }
2149 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
2150 FL("channel selected to start bss %d"), channel);
2151 return channel;
2152}
Ryan Hsue9758412014-07-17 20:02:53 -07002153
Liangwei Dongac935ab2016-07-29 00:48:54 -04002154#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
2155/**
2156 * sap_create_session_info() - create session info based on
2157 * the input chan and phymode
2158 * @sap_context: ptSapContext ptr
2159 * @session_info: information returned.
2160 * @sap_ch: requesting channel number
2161 *
2162 * Return: TRUE if session info returned
2163 */
2164static v_BOOL_t sap_create_session_info(
2165 ptSapContext sap_context,
2166 session_info_t *session_info,
2167 v_U16_t sap_ch)
2168{
2169 tHalHandle hHal;
2170 eCsrPhyMode sap_phymode;
2171
2172 hHal = (tHalHandle)vos_get_context( VOS_MODULE_ID_SME,
2173 sap_context->pvosGCtx);
2174 if (NULL == hHal) {
2175 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL,
2176 "In %s, invalid hHal", __func__);
2177 return FALSE;
2178 }
2179
2180 sap_phymode = sap_context->csrRoamProfile.phyMode;
2181 return sme_create_sap_session_info(
2182 hHal, sap_phymode, sap_ch, session_info);
2183}
2184/**
2185 * sap_find_station_session_info() - get active station session info
2186 * @sap_context: ptSapContext ptr
2187 * @session_info: information returned.
2188 *
2189 * Return: TRUE if session info returned
2190 */
2191static v_BOOL_t sap_find_station_session_info(
2192 ptSapContext sap_context,
2193 session_info_t * session_info)
2194{
2195 tHalHandle hHal;
2196
2197 hHal = (tHalHandle)vos_get_context( VOS_MODULE_ID_SME,
2198 sap_context->pvosGCtx);
2199 if (NULL == hHal) {
2200 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL,
2201 "In %s, invalid hHal", __func__);
2202 return FALSE;
2203 }
2204 return sme_find_sta_session_info(hHal, session_info);
2205}
2206/**
2207 * sap_find_all_session_info() - get all active session info
2208 * @sap_context: ptSapContext ptr
2209 * @session_info: information returned.
2210 * @count: number of session returned.
2211 *
2212 * Return: TRUE if any session info returned
2213 */
2214static v_BOOL_t sap_find_all_session_info(
2215 ptSapContext sap_context,
2216 session_info_t *session_info,
2217 v_U8_t *count)
2218{
2219 tHalHandle hHal;
2220
2221 hHal = (tHalHandle)vos_get_context( VOS_MODULE_ID_SME,
2222 sap_context->pvosGCtx);
2223 if (NULL == hHal) {
2224 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL,
2225 "In %s, invalid hHal", __func__);
2226 return FALSE;
2227 }
2228 return sme_find_all_session_info(hHal, session_info, count);
2229}
2230/**
2231 * sap_overlap_check() - check channel overlap or not
2232 * @sap_context: ptSapContext ptr
2233 * @info_1: session info 1.
2234 * @info_2: session info 2.
2235 *
2236 * Return: TRUE if two session channels are overlap
2237 */
2238static v_BOOL_t sap_overlap_check(
2239 session_info_t *info_1,
2240 session_info_t *info_2)
2241{
2242 v_BOOL_t intf = TRUE;
2243 if (!(((info_1->lfreq >= info_2->lfreq
2244 && info_1->lfreq < info_2->hfreq) ||
2245 (info_1->hfreq > info_2->lfreq
2246 && info_1->hfreq <= info_2->hfreq))
2247 || ((info_2->lfreq >= info_1->lfreq
2248 && info_2->lfreq < info_1->hfreq) ||
2249 (info_2->hfreq > info_1->lfreq
2250 && info_2->hfreq <= info_1->hfreq))
2251 )) {
2252 intf = FALSE;
2253 }
2254
2255 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
2256 "%s:info_1 mode %d band %d och %d lf %d"
2257 "hf %d cf %d hbw %d",
2258 __func__, info_1->con_mode, info_1->band,
2259 info_1->och, info_1->lfreq, info_1->hfreq,
2260 info_1->cfreq, info_1->hbw);
2261 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
2262 "%s:info_2 mode %d band %d och %d lf %d"
2263 "hf %d cf %d hbw %d",
2264 __func__, info_2->con_mode, info_2->band,
2265 info_2->och, info_2->lfreq, info_2->hfreq,
2266 info_2->cfreq, info_2->hbw);
2267 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
2268 "%s:info_1 %s with info_2",
2269 __func__, intf ? "overlap" : "not overlap");
2270
2271 return intf;
2272}
2273/**
2274 * sap_check_mcc_valid() - check mcc violation or not
2275 * @sap_context: ptSapContext ptr
2276 * @chan: chan to check
2277 * @band: band of the channel
2278 * @session_info: session info array of all active sessions
2279 * @session_count: session counts
2280 *
2281 * Return: VOS_STATUS_SUCCESS if the new sap chan is valid.
2282 */
2283static VOS_STATUS sap_check_mcc_valid(
2284 ptSapContext sap_context,
2285 v_SINT_t chan,
2286 eCsrBand band,
2287 session_info_t *session_info,
2288 v_U8_t session_count)
2289{
2290 session_info_t *info;
2291 session_info_t sessions[VOS_MAX_CONCURRENCY_PERSONA + 1];
2292 v_U8_t i, j;
Liangwei Dong84e958b2017-09-06 01:30:31 -04002293 v_U8_t session_cnt[VOS_MAX_CONCURRENCY_PERSONA + 1];
2294 v_U32_t channels[VOS_MAX_CONCURRENCY_PERSONA + 1];
Liangwei Dongac935ab2016-07-29 00:48:54 -04002295 v_U8_t chan_cnt = 0;
2296
2297 if (session_count <= 0)
2298 return VOS_STATUS_SUCCESS;
2299 else if (session_count > VOS_MAX_CONCURRENCY_PERSONA) {
2300 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
2301 "%s: invalid session count %d", __func__,
2302 session_count);
2303 return VOS_STATUS_E_INVAL;
2304 }
2305 /*
2306 * create channel & session matrix
2307 */
2308 vos_mem_copy(sessions, session_info,
2309 sizeof(session_info_t) * session_count);
2310 info = &sessions[session_count];
2311 info->con_mode = VOS_STA_SAP_MODE;
2312 info->och = chan;
2313 session_count++;
Jingxiang Geb06485a2017-09-28 20:38:34 +08002314 for (i = 0; i < session_count &&
2315 chan_cnt < VOS_MAX_CONCURRENCY_PERSONA; i++) {
Liangwei Dongac935ab2016-07-29 00:48:54 -04002316 info = &sessions[i];
2317 for (j = 0; j < chan_cnt; j++) {
2318 if (info->och == channels[j]) {
2319 session_cnt[j]++;
2320 break;
2321 }
2322 }
Liangwei Dong84e958b2017-09-06 01:30:31 -04002323 if ((j >= chan_cnt) &&
2324 (chan_cnt < (VOS_MAX_CONCURRENCY_PERSONA + 1))) {
Liangwei Dongac935ab2016-07-29 00:48:54 -04002325 channels[chan_cnt] = info->och;
2326 session_cnt[chan_cnt] = 1;
2327 chan_cnt++;
2328 }
2329 }
2330 /*
2331 * 1 .FW doesn't support > 2 home channel MCC.
2332 */
2333 if (chan_cnt > MAX_CONCURRENCY_CHAN_COUNT) {
2334 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
2335 "%s: exceed 2 home chan in MCC (chan %d band %d)",
2336 __func__, chan, band);
2337 return VOS_STATUS_E_FAILURE;
2338 }
2339 /*
2340 * 2. FW doesn't support the MCC case in which >= 3 SAP sessions
2341 * on one channel, e.g. AP1 AP2 AP3 on channel A and AP4 on
2342 * channel B is not supported.
2343 */
2344 if (chan_cnt > 1) {
2345 for (j = 0; j < chan_cnt; j++) {
2346 if (session_cnt[j] >
2347 MAX_SESSSION_PER_CHAN_MCC) {
2348 VOS_TRACE( VOS_MODULE_ID_SAP,
2349 VOS_TRACE_LEVEL_ERROR,
2350 "%s: exceed 2 session in MCC "
2351 "(chan %d band %d)",
2352 __func__, chan, band);
2353 return VOS_STATUS_E_FAILURE;
2354 }
2355 }
2356 }
2357 /*
2358 * 3. Don't support MCC on DFS channel.
2359 */
2360 if (chan_cnt > 1) {
2361 for (j = 0; j < chan_cnt; j++) {
2362 if (channels[j] != 0
2363 && vos_nv_getChannelEnabledState(channels[j])
2364 == NV_CHANNEL_DFS) {
2365 VOS_TRACE( VOS_MODULE_ID_SAP,
2366 VOS_TRACE_LEVEL_ERROR,
2367 "%s: dfs not support in MCC dfs chan %d"
2368 "(chan %d band %d)",
2369 __func__, channels[j], chan, band);
2370 return VOS_STATUS_E_FAILURE;
2371 }
2372 }
2373 }
2374 return VOS_STATUS_SUCCESS;
2375}
2376
2377/**
2378* sap_concurrence_chan_override() - override SAP channel if necessary
2379* @sap_context: ptSapContext ptr
2380* @cc_switch_mode: override policy
2381* @con_ch: the override result channel
2382*
2383* This function will check and override sap channel based on configurated
2384* MCC to SCC policy :
2385* gWlanMccToSccSwitchMode = 0: disabled.
2386* gWlanMccToSccSwitchMode = 1: override to SCC if channel overlap in
2387* same band.
2388* gWlanMccToSccSwitchMode = 2: force to SCC in same band.
2389*
Ke Huangf2fe63e2017-10-26 10:16:27 +08002390* gWlanBandSwitchEnable = false: disabled.
2391* gWlanBandSwitchEnable = true: enable band switch for MCC to SCC
2392*
Liangwei Dongac935ab2016-07-29 00:48:54 -04002393* Return: VOS_STATUS_SUCCESS: Success
2394* other value will fail the sap start request
2395*/
2396static VOS_STATUS
2397sap_concurrency_chan_override(
2398 ptSapContext sap_context,
2399 v_U8_t cc_switch_mode,
2400 tANI_U8 *con_ch)
2401{
2402 v_U8_t i;
2403 v_SINT_t target_chan;
2404 eCsrBand target_band;
2405 session_info_t target_info;
2406 v_SINT_t candidate_chan = 0;
2407 v_SINT_t candidate[2 * VOS_MAX_CONCURRENCY_PERSONA + 1];
2408 v_U8_t candidate_count = 0;
2409 session_info_t session_info[VOS_MAX_CONCURRENCY_PERSONA];
2410 v_U8_t session_count = 0;
2411 VOS_STATUS status = VOS_STATUS_SUCCESS;
2412
2413 if (sap_context->channel == AUTO_CHANNEL_SELECT) {
2414 target_band = sap_context->target_band;
2415 target_chan = 0;
2416 candidate_chan = 0;
2417 } else {
2418 if (sap_context->channel > MAX_2_4GHZ_CHANNEL) {
2419 target_band = eCSR_BAND_5G;
2420 sap_context->target_band = eCSR_BAND_5G;
2421 } else {
2422 target_band = eCSR_BAND_24;
2423 sap_context->target_band = eCSR_BAND_24;
2424 }
2425 target_chan = sap_context->channel;
2426 candidate_chan = sap_context->channel;
2427 if (!sap_create_session_info(sap_context, &target_info,
2428 target_chan)) {
2429 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
2430 "Failed to create channel(%d) info", target_chan);
2431 return VOS_STATUS_E_FAILURE;
2432 }
2433 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
2434 "%s:curr sap mode %d band %d och %d lf %d hf"
2435 "%d cf %d hbw %d",
2436 __func__, target_info.con_mode, target_info.band,
2437 target_info.och, target_info.lfreq, target_info.hfreq,
2438 target_info.cfreq, target_info.hbw);
2439 }
2440
2441 /*
2442 * 1. find all active session info
2443 */
2444 sap_find_all_session_info(sap_context, session_info, &session_count);
2445 /*
2446 * 2. get candidate chan list from more preference to less preference
2447 */
2448 for (i = 0; i < session_count; i++) {
2449 session_info_t *info = &session_info[i];
2450 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
2451 "%s: mode %d band %d och %d lf %d hf %d cf %d hbw %d",
2452 __func__, info->con_mode, info->band, info->och,
2453 info->lfreq, info->hfreq, info->cfreq, info->hbw);
Ke Huangd32d2f12017-11-06 14:42:48 +08002454 if (info->band != target_band) {
2455 if (sap_context->band_switch_enable) {
2456 if (info->band == eCSR_BAND_5G) {
2457 sap_context->ch_width_orig =
2458 sap_context->ch_width_5g_orig;
2459 } else {
2460 sap_context->ch_width_orig =
2461 sap_context->ch_width_24g_orig;
2462 }
2463 } else {
2464 continue;
2465 }
Ke Huangf2fe63e2017-10-26 10:16:27 +08002466 }
Liangwei Dongac935ab2016-07-29 00:48:54 -04002467 if (cc_switch_mode == VOS_MCC_TO_SCC_SWITCH_ENABLE
2468 && target_chan != 0
2469 && sap_overlap_check(&target_info, info))
2470 candidate[candidate_count++] = info->och;
2471 else if (cc_switch_mode == VOS_MCC_TO_SCC_SWITCH_FORCE)
2472 candidate[candidate_count++] = info->och;
2473 }
2474 candidate[candidate_count++] = target_chan;
2475 if (cc_switch_mode == VOS_MCC_TO_SCC_SWITCH_ENABLE
2476 && target_chan == 0) {
2477 for (i = 0; i < session_count; i++) {
2478 session_info_t *info = &session_info[i];
2479 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
2480 "%s: mode %d band %d och %d lf %d"
2481 "hf %d cf %d hbw %d",
2482 __func__, info->con_mode, info->band,
2483 info->och, info->lfreq, info->hfreq,
2484 info->cfreq, info->hbw);
Ke Huangd32d2f12017-11-06 14:42:48 +08002485 if (info->band != target_band) {
2486 if (sap_context->band_switch_enable) {
2487 if (info->band == eCSR_BAND_5G) {
2488 sap_context->ch_width_orig =
2489 sap_context->ch_width_5g_orig;
2490 } else {
2491 sap_context->ch_width_orig =
2492 sap_context->ch_width_24g_orig;
2493 }
2494 } else {
2495 continue;
2496 }
Ke Huangf2fe63e2017-10-26 10:16:27 +08002497 }
Liangwei Dongac935ab2016-07-29 00:48:54 -04002498 candidate[candidate_count++] = info->och;
2499 }
2500 }
2501 /*
2502 * 3. check MCC violation and find the first good channel.
2503 */
2504 for (i = 0; i < candidate_count; i++) {
2505 status = sap_check_mcc_valid(sap_context, candidate[i],
2506 target_band,
2507 session_info,
2508 session_count);
2509 if (status == VOS_STATUS_SUCCESS) {
2510 candidate_chan = candidate[i];
2511 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
2512 "%s: found chan %d band %d",
2513 __func__, candidate_chan, target_band);
2514 break;
2515 }
2516 }
2517 if (status == VOS_STATUS_SUCCESS) {
2518 sap_context->channel = candidate_chan;
2519 *con_ch = sap_context->channel;
2520 if (target_chan != candidate_chan)
2521 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
2522 "In %s, override to chan %d band %d from %d",
2523 __func__, candidate_chan, target_band,
2524 target_chan);
2525 else
2526 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
2527 "In %s, no override chan %d band %d",
2528 __func__, target_chan, target_band);
2529 } else {
2530 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
2531 "In %s, mcc violation chan %d band %d",
2532 __func__, target_chan, target_band);
2533 }
2534 return status;
2535}
2536
2537/**
2538* sap_same_band_channel_switch_validate() -
2539* check target chan valid or not during chan switch
2540* @sap_context: ptSapContext ptr
2541* @target_chan: target chan to switch
2542*
2543* This function checks whether target chan violates the same band
2544* SCC policy.
2545*
2546* Return: TRUE: target chan doesn't violate the policy
2547*/
2548static bool
2549sap_same_band_channel_switch_validate(
2550 ptSapContext sap_context,
2551 v_U16_t target_chan)
2552{
2553 session_info_t station_info;
2554 v_SINT_t candidate_chan = 0;
2555 eCsrBand target_band;
2556
2557 if (target_chan == 0)
2558 return false;
2559
2560 if (target_chan > MAX_2_4GHZ_CHANNEL)
2561 target_band = eCSR_BAND_5G;
2562 else
2563 target_band = eCSR_BAND_24;
2564
2565 /*
2566 * find and check active station session on same band
2567 */
2568 if (sap_find_station_session_info(sap_context, &station_info)) {
2569 if (station_info.band == target_band)
2570 candidate_chan = station_info.och;
2571 }
2572 return candidate_chan == 0 || candidate_chan == target_chan;
2573}
2574/**
2575* sap_overlap_channel_switch_validate() -
2576* check target chan valid or not during chan switch
2577* @sap_context: ptSapContext ptr
2578* @target_chan: target chan to switch
2579*
2580* This function checks whether target chan violates the same band
2581* overlap policy.
2582*
2583* Return: TRUE: target chan doesn't violate the policy
2584*/
2585static bool
2586sap_overlap_channel_switch_validate(
2587 ptSapContext sap_context,
2588 v_U16_t target_chan)
2589{
2590 session_info_t station_info, target_info;
2591 v_SINT_t candidate_chan = 0;
2592
2593 if (target_chan == 0)
2594 return false;
2595
2596 if (!sap_create_session_info(sap_context, &target_info,
2597 target_chan))
2598 return false;
2599 /*
2600 * find and check active station session on same band
2601 */
2602 if (sap_find_station_session_info(sap_context, &station_info)) {
2603 if (station_info.band == target_info.band)
2604 if (sap_overlap_check(&target_info, &station_info))
2605 candidate_chan = station_info.och;
2606 }
2607 return candidate_chan == 0 || candidate_chan == target_chan;
2608}
2609/**
2610* sap_channel_switch_validate() -
2611* check target chan valid or not during chan switch
2612* @sap_context: ptSapContext ptr
2613* @target_chan: target chan to switch
2614*
2615* This function checks whether target chan violates the configurated MCC to
2616* SCC policy.
2617*
2618* Return: TRUE: target chan doesn't violate the policy
2619*/
2620bool
2621sap_channel_switch_validate(
2622 ptSapContext sap_context,
2623 tHalHandle hal,
2624 uint16_t target_channel,
2625 eCsrPhyMode sap_phy_mode,
2626 uint8_t cc_switch_mode,
2627 uint32_t session_id)
2628{
2629 if (sap_context->cc_switch_mode == VOS_MCC_TO_SCC_SWITCH_FORCE)
2630 return sap_same_band_channel_switch_validate(sap_context,
2631 target_channel);
2632 else if (sap_context->cc_switch_mode
2633 == VOS_MCC_TO_SCC_SWITCH_ENABLE)
2634 return sap_overlap_channel_switch_validate(sap_context,
2635 target_channel);
2636 else
2637 return true;
2638}
2639#endif
2640
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002641/*==========================================================================
2642 FUNCTION sapGotoChannelSel
2643
2644 DESCRIPTION
2645 Function for initiating scan request for SME
2646
2647 DEPENDENCIES
2648 NA.
2649
2650 PARAMETERS
2651
2652 IN
2653 sapContext : Sap Context value
2654 sapEvent : State machine event
Peng Xu9ef1cf52014-11-08 21:11:17 -08002655 sapDoAcsPreStartBss: VOS_TRUE, if ACS scan is issued pre start BSS.
2656 VOS_FALSE, if ACS scan is issued post start BSS.
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002657
2658 RETURN VALUE
2659 The VOS_STATUS code associated with performing the operation
2660
2661 VOS_STATUS_SUCCESS: Success
2662
2663 SIDE EFFECTS
2664============================================================================*/
2665VOS_STATUS
2666sapGotoChannelSel
2667(
2668 ptSapContext sapContext,
Peng Xu9ef1cf52014-11-08 21:11:17 -08002669 ptWLAN_SAPEvent sapEvent,
2670 v_BOOL_t sapDoAcsPreStartBss
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002671)
2672{
2673 /* Initiate a SCAN request */
2674 eHalStatus halStatus;
2675 tCsrScanRequest scanRequest;/* To be initialised if scan is required */
2676 v_U32_t scanRequestID = 0;
2677 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
2678
2679#ifdef SOFTAP_CHANNEL_RANGE
2680 v_U8_t *channelList = NULL;
2681 v_U8_t numOfChannels = 0 ;
2682#endif
2683 tHalHandle hHal;
Manikandan Mohanbdb1c392015-05-17 19:31:25 -07002684 tANI_U8 con_ch;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002685
2686 hHal = (tHalHandle)vos_get_context( VOS_MODULE_ID_SME, sapContext->pvosGCtx);
2687 if (NULL == hHal)
2688 {
2689 /* we have a serious problem */
2690 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL,
2691 "In %s, invalid hHal", __func__);
2692 return VOS_STATUS_E_FAULT;
2693 }
2694
Chandrasekaran, Manishekara9347172015-01-13 22:51:53 +05302695 if (vos_concurrent_beaconing_sessions_running()) {
Manikandan Mohanbdb1c392015-05-17 19:31:25 -07002696 con_ch = sme_GetConcurrentOperationChannel(hHal);
Nitesh Shaheeb52dd2016-06-01 16:37:53 +05302697#ifdef FEATURE_WLAN_STA_AP_MODE_DFS_DISABLE
Manikandan Mohanbdb1c392015-05-17 19:31:25 -07002698 if (con_ch && sapContext->channel == AUTO_CHANNEL_SELECT) {
Yun Parkbe85db52014-06-24 13:54:26 -07002699 sapContext->dfs_ch_disable = VOS_TRUE;
Manikandan Mohanbdb1c392015-05-17 19:31:25 -07002700 } else if (con_ch && sapContext->channel != con_ch &&
Yun Parkbe85db52014-06-24 13:54:26 -07002701 VOS_IS_DFS_CH(sapContext->channel)) {
2702 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_WARN,
2703 "In %s, MCC DFS not supported in AP_AP Mode", __func__);
2704 return VOS_STATUS_E_ABORTED;
2705 }
Nitesh Shaheeb52dd2016-06-01 16:37:53 +05302706#endif
Manikandan Mohanbdb1c392015-05-17 19:31:25 -07002707#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
Liangwei Dongac935ab2016-07-29 00:48:54 -04002708 vosStatus = sap_concurrency_chan_override(
2709 sapContext,
2710 sapContext->cc_switch_mode,
2711 &con_ch);
2712 if (vosStatus != VOS_STATUS_SUCCESS) {
2713 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
2714 "%s: invalid SAP channel(%d) configuration",
2715 __func__,sapContext->channel);
2716 return VOS_STATUS_E_ABORTED;
Manikandan Mohanbdb1c392015-05-17 19:31:25 -07002717 }
2718#endif
Yun Parkbe85db52014-06-24 13:54:26 -07002719 }
Yun Parkbe85db52014-06-24 13:54:26 -07002720
Ke Huangab402f72017-10-31 14:06:20 +08002721 if (vos_get_concurrency_mode() == VOS_STA_SAP)
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002722 {
Manikandan Mohanc07e6e02014-05-20 17:25:09 -07002723#ifdef FEATURE_WLAN_STA_AP_MODE_DFS_DISABLE
2724 if (sapContext->channel == AUTO_CHANNEL_SELECT)
2725 sapContext->dfs_ch_disable = VOS_TRUE;
2726 else if (VOS_IS_DFS_CH(sapContext->channel)) {
2727 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_WARN,
wadesong28e4ab82016-12-12 23:29:22 +08002728 "In %s, DFS not supported in STA_AP Mode, chan=%d",
2729 __func__, sapContext->channel);
Manikandan Mohanc07e6e02014-05-20 17:25:09 -07002730 return VOS_STATUS_E_ABORTED;
2731 }
2732#endif
Manikandan Mohanbdb1c392015-05-17 19:31:25 -07002733#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
Liangwei Dongac935ab2016-07-29 00:48:54 -04002734 vosStatus = sap_concurrency_chan_override(
2735 sapContext,
2736 sapContext->cc_switch_mode,
2737 &con_ch);
2738 if (vosStatus != VOS_STATUS_SUCCESS) {
2739 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
2740 "%s: invalid SAP channel(%d) configuration",
2741 __func__,sapContext->channel);
2742 return VOS_STATUS_E_ABORTED;
Manikandan Mohanbdb1c392015-05-17 19:31:25 -07002743 }
2744#else
Manikandan Mohanc07e6e02014-05-20 17:25:09 -07002745 /* If STA-AP concurrency is enabled take the concurrent connected
2746 * channel first. In other cases wpa_supplicant should take care */
Manikandan Mohanbdb1c392015-05-17 19:31:25 -07002747 con_ch = sme_GetConcurrentOperationChannel(hHal);
2748 if (con_ch)
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002749 { /*if a valid channel is returned then use concurrent channel.
2750 Else take whatever comes from configuartion*/
wadesong28e4ab82016-12-12 23:29:22 +08002751 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
2752 FL("Channel overridden due to MCC->SCC switch: %d -> %d"),
2753 sapContext->channel, con_ch);
Manikandan Mohanbdb1c392015-05-17 19:31:25 -07002754 sapContext->channel = con_ch;
Kiran Kumar Lokere51e89002014-12-17 16:40:39 -08002755 sme_SelectCBMode(hHal, sapContext->csrRoamProfile.phyMode,
Peng Xub5bebcf2015-07-14 14:49:45 -07002756 con_ch, 0, &sapContext->vht_channel_width,
Manikandan Mohan32488a62015-04-05 20:15:03 -07002757 sapContext->ch_width_orig);
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002758 }
Manikandan Mohan31f15242014-04-07 12:56:14 -07002759#endif
Manikandan Mohanc07e6e02014-05-20 17:25:09 -07002760 }
Ke Huangab402f72017-10-31 14:06:20 +08002761#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
2762 else if (sapContext->ap_p2pclient_concur_enable &&
2763 vos_get_concurrency_mode() == (VOS_SAP|VOS_P2P_CLIENT)) {
2764#ifdef FEATURE_WLAN_STA_AP_MODE_DFS_DISABLE
2765 if (sapContext->channel == AUTO_CHANNEL_SELECT)
2766 sapContext->dfs_ch_disable = VOS_TRUE;
2767 else if (VOS_IS_DFS_CH(sapContext->channel)) {
2768 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_WARN,
2769 "In %s, DFS not supported in STA_AP Mode, chan=%d",
2770 __func__, sapContext->channel);
2771 return VOS_STATUS_E_ABORTED;
2772 }
2773#endif
2774 vosStatus = sap_concurrency_chan_override(
2775 sapContext,
2776 sapContext->cc_switch_mode,
2777 &con_ch);
2778 if (vosStatus != VOS_STATUS_SUCCESS) {
2779 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
2780 "%s: invalid SAP channel(%d) configuration",
2781 __func__,sapContext->channel);
2782 return VOS_STATUS_E_ABORTED;
2783 }
2784 }
2785#endif
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002786
2787 if (sapContext->channel == AUTO_CHANNEL_SELECT)
2788 {
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302789#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
2790 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
Manikandan Mohan32488a62015-04-05 20:15:03 -07002791 "%s acs_cfg->skip_status = %d ", __func__,
2792 sapContext->acs_cfg->skip_scan_status);
2793 if (sapContext->acs_cfg->skip_scan_status != eSAP_SKIP_ACS_SCAN) {
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302794#endif
2795 vos_mem_zero(&scanRequest, sizeof(scanRequest));
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002796
Manikandan Mohanc433b6a2014-11-06 12:22:10 -08002797 /* Set scanType to Active scan. FW takes care of using passive
2798 * scan for DFS and active for non DFS channels.
2799 */
2800 scanRequest.scanType = eSIR_ACTIVE_SCAN;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002801
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302802 /* Set min and max channel time to zero */
2803 scanRequest.minChnTime = 0;
2804 scanRequest.maxChnTime = 0;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002805
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302806 /* Set BSSType to default type */
2807 scanRequest.BSSType = eCSR_BSS_TYPE_ANY;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002808
gaolezbad50512016-09-06 11:23:08 +08002809 if (ACS_FW_REPORT_PARAM_CONFIGURED)
2810 scanRequest.BSSType = eCSR_BSS_TYPE_INFRA_AP;
2811
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002812#ifndef SOFTAP_CHANNEL_RANGE
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302813 /*Scan all the channels */
2814 scanRequest.ChannelInfo.numOfChannels = 0;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002815
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302816 scanRequest.ChannelInfo.ChannelList = NULL;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002817
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302818 scanRequest.requestType = eCSR_SCAN_REQUEST_FULL_SCAN;
2819 //eCSR_SCAN_REQUEST_11D_SCAN;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002820
2821#else
2822
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302823 sapGetChannelList(sapContext, &channelList, &numOfChannels);
2824#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
2825 if (numOfChannels != 0) {
2826#endif
2827 /*Scan the channels in the list*/
2828 scanRequest.ChannelInfo.numOfChannels = numOfChannels;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002829
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302830 scanRequest.ChannelInfo.ChannelList = channelList;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002831
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302832 scanRequest.requestType = eCSR_SCAN_SOFTAP_CHANNEL_RANGE;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002833
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302834 sapContext->channelList = channelList;
Liangwei Dong02428a42016-09-27 03:58:27 -04002835 sapContext->num_of_channel = numOfChannels;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002836#endif
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302837 /* Set requestType to Full scan */
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002838
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302839 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
2840 "In %s, calling sme_ScanRequest", __func__);
2841#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
Manikandan Mohan32488a62015-04-05 20:15:03 -07002842 if (sapContext->acs_cfg->skip_scan_status == eSAP_DO_NEW_ACS_SCAN) {
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302843#endif
2844 sme_ScanFlushResult(hHal, sapContext->sessionId);
2845#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
2846 }
2847#endif
Peng Xu9ef1cf52014-11-08 21:11:17 -08002848
2849 if (VOS_TRUE == sapDoAcsPreStartBss)
2850 {
2851 halStatus = sme_ScanRequest(hHal,
2852 sapContext->sessionId,
2853 &scanRequest,
2854 /* when ID == 0 11D scan/active
2855 * scan with callback,
2856 * min-maxChntime set in csrScanRequest()?
2857 */
2858 &scanRequestID,
2859 /*csrScanCompleteCallback callback,*/
2860 &WLANSAP_PreStartBssAcsScanCallback,
2861 /* pContext scanRequestID filled up*/
2862 sapContext);
2863
2864 }
2865 else
2866 {
2867 halStatus = sme_ScanRequest(hHal,
2868 sapContext->sessionId,
2869 &scanRequest,
2870 /* when ID == 0 11D scan/active
2871 * scan with callback,
2872 * min-maxChntime set in csrScanRequest()?
2873 */
2874 &scanRequestID,
2875 /*csrScanCompleteCallback callback,*/
2876 &WLANSAP_ScanCallback,
2877 /* pContext scanRequestID filled up*/
2878 sapContext);
2879 }
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302880 if (eHAL_STATUS_SUCCESS != halStatus)
2881 {
2882 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
2883 "%s:sme_ScanRequest fail %d!!!", __func__, halStatus);
2884 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
2885 "SoftAP Configuring for default channel, Ch= %d",
2886 sapContext->channel);
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002887
Selvaraj, Sridharf61b7f92016-09-03 18:07:00 +05302888 sapContext->channel =
2889 sap_select_default_oper_chan_ini(hHal, 0);
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002890#ifdef SOFTAP_CHANNEL_RANGE
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302891 if(sapContext->channelList != NULL)
2892 {
Hanumantha Reddy Pothula16b65002016-03-31 16:04:19 +05302893 sapContext->channel = sapContext->channelList[0];
2894 vos_mem_free(sapContext->channelList);
2895 sapContext->channelList = NULL;
Liangwei Dong02428a42016-09-27 03:58:27 -04002896 sapContext->num_of_channel = 0;
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302897 }
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002898#endif
Peng Xu9ef1cf52014-11-08 21:11:17 -08002899 if (VOS_TRUE == sapDoAcsPreStartBss)
2900 {
2901 /*
2902 * In case of ACS req before start Bss,
2903 * return failure so that the calling
2904 * fucntion can use the default channel.
2905 */
2906 return VOS_STATUS_E_FAILURE;
2907 }
2908 else
2909 {
2910 /* Fill in the event structure */
2911 sapEventInit(sapEvent);
2912 /* Handle event */
2913 vosStatus = sapFsm(sapContext, sapEvent);
2914 }
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302915 }
2916 else
2917 {
2918 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
2919 "In %s, return from sme_ScanReq, scanID=%d, Ch= %d",
2920 __func__, scanRequestID, sapContext->channel);
2921 }
2922#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
2923 } else
Manikandan Mohan32488a62015-04-05 20:15:03 -07002924 sapContext->acs_cfg->skip_scan_status = eSAP_SKIP_ACS_SCAN;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002925 }
2926
Manikandan Mohan32488a62015-04-05 20:15:03 -07002927 if (sapContext->acs_cfg->skip_scan_status == eSAP_SKIP_ACS_SCAN) {
Manikandan Mohan9588d7a2014-09-17 22:06:55 +05302928 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302929 "## %s SKIPPED ACS SCAN", __func__);
Peng Xu9ef1cf52014-11-08 21:11:17 -08002930 if (VOS_TRUE == sapDoAcsPreStartBss)
2931 {
2932 WLANSAP_PreStartBssAcsScanCallback(hHal, sapContext,
2933 sapContext->sessionId,
2934 0,
2935 eCSR_SCAN_SUCCESS);
2936 }
2937 else
2938 {
2939 WLANSAP_ScanCallback(hHal, sapContext,
2940 sapContext->sessionId,
2941 0,
2942 eCSR_SCAN_SUCCESS);
2943 }
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302944 }
2945#endif
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002946 }
2947 else
2948 {
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05302949 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
2950 "In %s, for configured channel, Ch= %d",
2951 __func__, sapContext->channel);
Peng Xu9ef1cf52014-11-08 21:11:17 -08002952 if (VOS_TRUE == sapDoAcsPreStartBss)
2953 {
Manikandan Mohan1689e262015-07-10 19:45:57 -07002954 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
2955 "In %s, ACS end due to channel override, Selected Ch= %d",
2956 __func__, sapContext->channel);
Peng Xu9ef1cf52014-11-08 21:11:17 -08002957
Manikandan Mohan1689e262015-07-10 19:45:57 -07002958 sapContext->acs_cfg->pri_ch = sapContext->channel;
Manikandan Mohan1689e262015-07-10 19:45:57 -07002959 sap_config_acs_result(hHal, sapContext, 0);
2960 return VOS_STATUS_E_CANCELED;
Peng Xu9ef1cf52014-11-08 21:11:17 -08002961 }
2962 else
2963 {
2964 /* Fill in the event structure */
2965 // Eventhough scan was not done, means a user set channel was chosen
2966 sapEventInit(sapEvent);
2967 /* Handle event */
2968 vosStatus = sapFsm(sapContext, sapEvent);
2969 }
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002970 }
2971
2972 /* If scan failed, get default channel and advance state machine as success with default channel */
2973 /* Have to wait for the call back to be called to get the channel cannot advance state machine here as said above */
2974 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, before exiting sapGotoChannelSel channel=%d", __func__, sapContext->channel);
2975
2976 return VOS_STATUS_SUCCESS;
2977}// sapGotoChannelSel
Agrawal Ashish3ca03b32016-03-09 18:59:04 +05302978#define SAP_OPEN_SESSION_TIMEOUT 500
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07002979
Agrawal Ashish3ca03b32016-03-09 18:59:04 +05302980/**
2981 * sap_OpenSession() - Opens a SAP session
2982 * @hHal: Hal handle
2983 * @sapContext: Sap Context value
2984 * @session_id: Pointer to the session id
2985 *
2986 * Function for opening SME and SAP sessions when system is in SoftAP role
2987 *
2988 * Return: eHalStatus
2989 */
krunal sonib1a4f532014-06-18 16:19:49 -07002990
Agrawal Ashish3ca03b32016-03-09 18:59:04 +05302991eHalStatus
2992sap_OpenSession (tHalHandle hHal, ptSapContext sapContext,
2993 uint32_t *session_id)
krunal sonib1a4f532014-06-18 16:19:49 -07002994{
2995 tANI_U32 type, subType;
2996 eHalStatus halStatus;
2997 VOS_STATUS status = VOS_STATUS_E_FAILURE;
2998 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2999
3000 if (sapContext->csrRoamProfile.csrPersona == VOS_P2P_GO_MODE)
3001 status = vos_get_vdev_types(VOS_P2P_GO_MODE, &type, &subType);
3002 else
3003 status = vos_get_vdev_types(VOS_STA_SAP_MODE, &type, &subType);
3004
3005 if (VOS_STATUS_SUCCESS != status)
3006 {
3007 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL, "failed to get vdev type");
3008 return VOS_STATUS_E_FAILURE;
3009 }
Agrawal Ashish3ca03b32016-03-09 18:59:04 +05303010 vos_event_reset(&sapContext->sap_session_opened_evt);
krunal sonib1a4f532014-06-18 16:19:49 -07003011 /* Open SME Session for Softap */
3012 halStatus = sme_OpenSession(hHal,
3013 &WLANSAP_RoamCallback,
3014 sapContext,
3015 sapContext->self_mac_addr,
3016 &sapContext->sessionId,
3017 type, subType);
3018
3019 if(eHAL_STATUS_SUCCESS != halStatus )
3020 {
3021 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
3022 "Error: In %s calling sme_RoamConnect status = %d",
3023 __func__, halStatus);
3024
3025 return VOS_STATUS_E_FAILURE;
3026 }
3027
Sridhar Selvaraj02fe6b62017-07-25 10:25:38 +05303028 sme_set_allowed_action_frames(hHal,
3029 ALLOWED_ACTION_FRAMES_BITMAP0_SAP, false);
Agrawal Ashish3ca03b32016-03-09 18:59:04 +05303030 status = vos_wait_single_event(
3031 &sapContext->sap_session_opened_evt,
3032 SAP_OPEN_SESSION_TIMEOUT);
3033 if (!VOS_IS_STATUS_SUCCESS(status)) {
3034 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
3035 "wait for sap open session event timed out");
Anuj Kherab8602912017-10-27 10:22:59 +05303036 sme_CloseSession(hHal, sapContext->sessionId, NULL, FALSE);
Agrawal Ashish3ca03b32016-03-09 18:59:04 +05303037 return VOS_STATUS_E_FAILURE;
3038 }
Selvaraj, Sridhar71a36b12016-05-17 12:51:26 +05303039
krunal sonib1a4f532014-06-18 16:19:49 -07003040 pMac->sap.sapCtxList [ sapContext->sessionId ].sessionID =
3041 sapContext->sessionId;
3042 pMac->sap.sapCtxList [ sapContext->sessionId ].pSapContext = sapContext;
3043 pMac->sap.sapCtxList [ sapContext->sessionId ].sapPersona=
3044 sapContext->csrRoamProfile.csrPersona;
Agrawal Ashish3ca03b32016-03-09 18:59:04 +05303045 *session_id = sapContext->sessionId;
3046 sapContext->isSapSessionOpen = eSAP_TRUE;
krunal sonib1a4f532014-06-18 16:19:49 -07003047 return VOS_STATUS_SUCCESS;
3048}
3049
3050
3051/*==========================================================================
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003052 FUNCTION sapGotoStarting
3053
3054 DESCRIPTION
3055 Function for initiating start bss request for SME
3056
3057 DEPENDENCIES
3058 NA.
3059
3060 PARAMETERS
3061
3062 IN
3063 sapContext : Sap Context value
3064 sapEvent : State machine event
3065 bssType : Type of bss to start, INRA AP
3066 status : Return the SAP status here
3067
3068 RETURN VALUE
3069 The VOS_STATUS code associated with performing the operation
3070
3071 VOS_STATUS_SUCCESS: Success
3072
3073 SIDE EFFECTS
3074============================================================================*/
3075VOS_STATUS
3076sapGotoStarting
3077(
3078 ptSapContext sapContext,
3079 ptWLAN_SAPEvent sapEvent,
3080 eCsrRoamBssType bssType
3081)
3082{
3083 /* tHalHandle */
3084 tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx);
3085 eHalStatus halStatus;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003086
3087 /*- - - - - - - - TODO:once configs from hdd available - - - - - - - - -*/
3088 char key_material[32]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1,};
Prakash Dhavalia01db2a2013-12-29 02:34:07 -08003089 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003090 sapContext->key_type = 0x05;
3091 sapContext->key_length = 32;
3092 vos_mem_copy(sapContext->key_material, key_material, sizeof(key_material)); /* Need a key size define */
3093
3094 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s", __func__);
Yun Park3aa6f3b2014-03-03 09:56:08 -08003095
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003096 if (NULL == hHal)
3097 {
3098 /* we have a serious problem */
3099 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL,
3100 "In %s, invalid hHal", __func__);
3101 return VOS_STATUS_E_FAULT;
3102 }
3103
3104 /* No Need to Req for Power with power offload enabled */
3105 if(!pMac->psOffloadEnabled)
3106 {
3107 //TODO: What shall we do if failure????
3108 halStatus = pmcRequestFullPower( hHal,
3109 WLANSAP_pmcFullPwrReqCB,
3110 sapContext,
3111 eSME_REASON_OTHER);
3112 }
3113
Agrawal Ashish3ca03b32016-03-09 18:59:04 +05303114 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
3115 "%s: session: %d", __func__, sapContext->sessionId);
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003116
Agrawal Ashish3ca03b32016-03-09 18:59:04 +05303117 halStatus = sme_RoamConnect(hHal, sapContext->sessionId,
3118 &sapContext->csrRoamProfile,
3119 &sapContext->csrRoamId);
3120 if (eHAL_STATUS_SUCCESS != halStatus)
krunal sonib1a4f532014-06-18 16:19:49 -07003121 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
Agrawal Ashish3ca03b32016-03-09 18:59:04 +05303122 "%s: Failed to issue sme_RoamConnect", __func__);
3123 return halStatus;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003124
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003125}// sapGotoStarting
3126
3127/*==========================================================================
3128 FUNCTION sapGotoDisconnecting
3129
3130 DESCRIPTION
3131 Processing of SAP FSM Disconnecting state
3132
3133 DEPENDENCIES
3134 NA.
3135
3136 PARAMETERS
3137
3138 IN
3139 sapContext : Sap Context value
3140 status : Return the SAP status here
3141
3142 RETURN VALUE
3143 The VOS_STATUS code associated with performing the operation
3144
3145 VOS_STATUS_SUCCESS: Success
3146
3147 SIDE EFFECTS
3148============================================================================*/
3149VOS_STATUS
3150sapGotoDisconnecting
3151(
3152 ptSapContext sapContext
3153)
3154{
3155 eHalStatus halStatus;
3156 tHalHandle hHal;
3157
3158 hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx);
3159 if (NULL == hHal)
3160 {
3161 /* we have a serious problem */
3162 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
3163 "In %s, invalid hHal", __func__);
3164 return VOS_STATUS_E_FAULT;
3165 }
3166
3167 sapFreeRoamProfile(&sapContext->csrRoamProfile);
3168 halStatus = sme_RoamStopBss(hHal, sapContext->sessionId);
3169 if(eHAL_STATUS_SUCCESS != halStatus )
3170 {
3171 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, "Error: In %s calling sme_RoamStopBss status = %d", __func__, halStatus);
3172 return VOS_STATUS_E_FAILURE;
3173 }
3174
3175 return VOS_STATUS_SUCCESS;
3176}
3177
Raveendra Chennakesavulu8d008002017-03-30 17:06:59 +05303178eHalStatus sapRoamSessionCloseCallback(void *pContext)
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003179{
3180 ptSapContext sapContext = (ptSapContext)pContext;
3181 return sapSignalHDDevent(sapContext, NULL,
3182 eSAP_STOP_BSS_EVENT, (v_PVOID_t) eSAP_STATUS_SUCCESS);
3183}
3184
3185/*==========================================================================
3186 FUNCTION sapGotoDisconnected
3187
3188 DESCRIPTION
3189 Function for setting the SAP FSM to Disconnection state
3190
3191 DEPENDENCIES
3192 NA.
3193
3194 PARAMETERS
3195
3196 IN
3197 sapContext : Sap Context value
3198 sapEvent : State machine event
3199 status : Return the SAP status here
3200
3201 RETURN VALUE
3202 The VOS_STATUS code associated with performing the operation
3203
3204 VOS_STATUS_SUCCESS: Success
3205
3206 SIDE EFFECTS
3207============================================================================*/
3208VOS_STATUS
3209sapGotoDisconnected
3210(
3211 ptSapContext sapContext
3212)
3213{
3214 VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE;
3215 tWLAN_SAPEvent sapEvent;
3216 // Processing has to be coded
3217 // Clean up stations from TL etc as AP BSS is shut down then set event
3218 sapEvent.event = eSAP_MAC_READY_FOR_CONNECTIONS;// hardcoded
3219 sapEvent.params = 0;
3220 sapEvent.u1 = 0;
3221 sapEvent.u2 = 0;
3222 /* Handle event */
3223 vosStatus = sapFsm(sapContext, &sapEvent);
3224
3225 return vosStatus;
3226}
3227
Liangwei Dong02428a42016-09-27 03:58:27 -04003228#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
3229/**
3230 * sap_handle_acs_scan_event() - handle acs scan event for SAP
3231 * @sap_context: ptSapContext
3232 * @sap_event: tSap_Event
3233 * @status: status of acs scan
3234 *
3235 * The function is to handle the eSAP_ACS_SCAN_SUCCESS_EVENT event.
3236 *
3237 * Return: void
3238 */
3239static void sap_handle_acs_scan_event(ptSapContext sap_context,
3240 tSap_Event *sap_event, eSapStatus status)
3241{
3242 sap_event->sapHddEventCode = eSAP_ACS_SCAN_SUCCESS_EVENT;
3243 sap_event->sapevt.sap_acs_scan_comp.status = status;
3244 sap_event->sapevt.sap_acs_scan_comp.num_of_channels =
3245 sap_context->num_of_channel;
3246 sap_event->sapevt.sap_acs_scan_comp.channellist =
3247 sap_context->channelList;
3248}
3249#else
3250static void sap_handle_acs_scan_event(ptSapContext sap_context,
3251 tSap_Event *sap_event, eSapStatus status)
3252{
3253}
3254#endif
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003255/*==========================================================================
3256 FUNCTION sapSignalHDDevent
3257
3258 DESCRIPTION
3259 Function for HDD to send the event notification using callback
3260
3261 DEPENDENCIES
3262 NA.
3263
3264 PARAMETERS
3265
3266 IN
3267 sapContext : Sap Context value
3268 pCsrRoamInfo : Pointer to CSR roam information
3269 sapHddevent : SAP HDD event
3270 context : to pass the element for future support
3271
3272 RETURN VALUE
3273 The VOS_STATUS code associated with performing the operation
3274
3275 VOS_STATUS_SUCCESS: Success
3276
3277 SIDE EFFECTS
3278============================================================================*/
3279VOS_STATUS
3280sapSignalHDDevent
3281(
3282 ptSapContext sapContext, /* sapContext value */
3283 tCsrRoamInfo *pCsrRoamInfo,
3284 eSapHddEvent sapHddevent,
3285 void *context
3286)
3287{
3288 VOS_STATUS vosStatus = VOS_STATUS_SUCCESS;
3289 tSap_Event sapApAppEvent; /* This now encodes ALL event types */
krunal sonib1a4f532014-06-18 16:19:49 -07003290 tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx);
3291 tpAniSirGlobal pMac;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003292 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
3293
3294 /* Format the Start BSS Complete event to return... */
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08003295 if (NULL == sapContext->pfnSapEventCallback)
3296 {
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08003297 return VOS_STATUS_E_FAILURE;
3298 }
krunal sonib1a4f532014-06-18 16:19:49 -07003299 if (NULL == hHal)
3300 {
3301 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
3302 "In %s invalid hHal", __func__);
3303 return VOS_STATUS_E_FAILURE;
3304 }
3305 pMac = PMAC_STRUCT( hHal );
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003306
3307 switch (sapHddevent)
3308 {
3309 case eSAP_STA_ASSOC_IND:
3310 // TODO - Indicate the assoc request indication to OS
3311 sapApAppEvent.sapHddEventCode = eSAP_STA_ASSOC_IND;
3312
3313 vos_mem_copy( &sapApAppEvent.sapevt.sapAssocIndication.staMac, pCsrRoamInfo->peerMac,sizeof(tSirMacAddr));
3314 sapApAppEvent.sapevt.sapAssocIndication.staId = pCsrRoamInfo->staId;
3315 sapApAppEvent.sapevt.sapAssocIndication.status = 0;
3316 // Required for indicating the frames to upper layer
3317 sapApAppEvent.sapevt.sapAssocIndication.beaconLength = pCsrRoamInfo->beaconLength;
3318 sapApAppEvent.sapevt.sapAssocIndication.beaconPtr = pCsrRoamInfo->beaconPtr;
3319 sapApAppEvent.sapevt.sapAssocIndication.assocReqLength = pCsrRoamInfo->assocReqLength;
3320 sapApAppEvent.sapevt.sapAssocIndication.assocReqPtr = pCsrRoamInfo->assocReqPtr;
3321 sapApAppEvent.sapevt.sapAssocIndication.fWmmEnabled = pCsrRoamInfo->wmmEnabledSta;
gaolez1500ce02016-11-03 16:17:42 +08003322 sapApAppEvent.sapevt.sapAssocIndication.ecsa_capable =
3323 pCsrRoamInfo->ecsa_capable;
3324
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003325 if ( pCsrRoamInfo->u.pConnectedProfile != NULL )
3326 {
3327 sapApAppEvent.sapevt.sapAssocIndication.negotiatedAuthType = pCsrRoamInfo->u.pConnectedProfile->AuthType;
3328 sapApAppEvent.sapevt.sapAssocIndication.negotiatedUCEncryptionType = pCsrRoamInfo->u.pConnectedProfile->EncryptionType;
3329 sapApAppEvent.sapevt.sapAssocIndication.negotiatedMCEncryptionType = pCsrRoamInfo->u.pConnectedProfile->mcEncryptionType;
3330 sapApAppEvent.sapevt.sapAssocIndication.fAuthRequired = pCsrRoamInfo->fAuthRequired;
3331 }
3332 break;
3333 case eSAP_START_BSS_EVENT:
Agarwal Ashish8bd2e772015-08-03 15:13:36 +05303334 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
3335 FL("SAP event callback event = %s"),
3336 "eSAP_START_BSS_EVENT");
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003337 sapApAppEvent.sapHddEventCode = eSAP_START_BSS_EVENT;
3338 sapApAppEvent.sapevt.sapStartBssCompleteEvent.status = (eSapStatus )context;
3339 if(pCsrRoamInfo != NULL ){
3340 sapApAppEvent.sapevt.sapStartBssCompleteEvent.staId = pCsrRoamInfo->staId;
3341 }
3342 else
Yun Park3aa6f3b2014-03-03 09:56:08 -08003343 {
bingsbb363282016-12-02 10:55:41 +08003344 sapApAppEvent.sapevt.sapStartBssCompleteEvent.staId =
3345 tl_shim_get_sta_id_by_addr(sapContext->pvosGCtx,
3346 sapContext->self_mac_addr);
Yun Park3aa6f3b2014-03-03 09:56:08 -08003347 }
3348
3349 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "%s(eSAP_START_BSS_EVENT): staId = %d",
3350 __func__, sapApAppEvent.sapevt.sapStartBssCompleteEvent.staId);
3351
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003352 sapApAppEvent.sapevt.sapStartBssCompleteEvent.operatingChannel = (v_U8_t)sapContext->channel;
Prashanth Bhatta1d3edff2014-03-17 13:29:16 -07003353 sapApAppEvent.sapevt.sapStartBssCompleteEvent.sessionId =
3354 sapContext->sessionId;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003355 break;
3356
Manikandan Mohan547f5f12014-04-16 18:02:47 -07003357 case eSAP_DFS_CAC_START:
Chandrasekaran, Manishekarbc99b7c2015-05-20 17:05:01 +05303358 case eSAP_DFS_CAC_INTERRUPTED:
Manikandan Mohan547f5f12014-04-16 18:02:47 -07003359 case eSAP_DFS_CAC_END:
3360 case eSAP_DFS_RADAR_DETECT:
Yun Park3d4df6f2014-08-30 15:56:24 -07003361 case eSAP_DFS_NO_AVAILABLE_CHANNEL:
Manikandan Mohan547f5f12014-04-16 18:02:47 -07003362 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
3363 "In %s, SAP event callback event = %s : %d", __func__,
3364 "eSAP_DFS event", sapHddevent);
3365 sapApAppEvent.sapHddEventCode = sapHddevent;
3366 sapApAppEvent.sapevt.sapStopBssCompleteEvent.status =
Liangwei Dong02428a42016-09-27 03:58:27 -04003367 (eSapStatus )context;
Manikandan Mohan547f5f12014-04-16 18:02:47 -07003368 break;
Liangwei Dong02428a42016-09-27 03:58:27 -04003369 case eSAP_ACS_SCAN_SUCCESS_EVENT:
3370 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
3371 "In %s, SAP event callback event = %s : %d", __func__,
3372 "ACS Scan event", sapHddevent);
3373 sap_handle_acs_scan_event(sapContext, &sapApAppEvent,
3374 (eSapStatus)context);
3375 break;
Peng Xu9ef1cf52014-11-08 21:11:17 -08003376 case eSAP_ACS_CHANNEL_SELECTED:
3377 sapApAppEvent.sapHddEventCode = sapHddevent;
3378 if ( eSAP_STATUS_SUCCESS == (eSapStatus )context)
3379 {
Manikandan Mohan32488a62015-04-05 20:15:03 -07003380 sapApAppEvent.sapevt.sapChSelected.pri_ch =
3381 sapContext->acs_cfg->pri_ch;
3382 sapApAppEvent.sapevt.sapChSelected.ht_sec_ch =
3383 sapContext->acs_cfg->ht_sec_ch;
3384 sapApAppEvent.sapevt.sapChSelected.ch_width =
3385 sapContext->acs_cfg->ch_width;
3386 sapApAppEvent.sapevt.sapChSelected.vht_seg0_center_ch =
3387 sapContext->acs_cfg->vht_seg0_center_ch;
3388 sapApAppEvent.sapevt.sapChSelected.vht_seg1_center_ch =
3389 sapContext->acs_cfg->vht_seg1_center_ch;
Peng Xu9ef1cf52014-11-08 21:11:17 -08003390 }
3391 else if (eSAP_STATUS_FAILURE == (eSapStatus )context)
3392 {
Manikandan Mohan32488a62015-04-05 20:15:03 -07003393 sapApAppEvent.sapevt.sapChSelected.pri_ch = 0;
Peng Xu9ef1cf52014-11-08 21:11:17 -08003394 }
3395 break;
3396
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003397 case eSAP_STOP_BSS_EVENT:
Agarwal Ashish8bd2e772015-08-03 15:13:36 +05303398 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
3399 FL("SAP event callback event = %s"),
3400 "eSAP_STOP_BSS_EVENT");
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003401 sapApAppEvent.sapHddEventCode = eSAP_STOP_BSS_EVENT;
3402 sapApAppEvent.sapevt.sapStopBssCompleteEvent.status = (eSapStatus )context;
3403 break;
3404
3405 case eSAP_STA_ASSOC_EVENT:
Sachin Ahujadb2bb372014-04-01 19:12:40 +05303406 case eSAP_STA_REASSOC_EVENT:
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003407 {
Amar Singhal48d4cc82014-08-26 16:54:51 -07003408 tSirSmeChanInfo *pChanInfo;
gaolez1500ce02016-11-03 16:17:42 +08003409 tSap_StationAssocReassocCompleteEvent *sta_event_ptr;
3410
3411 sta_event_ptr =
3412 &sapApAppEvent.sapevt.sapStationAssocReassocCompleteEvent;
Agarwal Ashish8bd2e772015-08-03 15:13:36 +05303413 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
3414 FL("SAP event callback event = %s"),
3415 "eSAP_STA_ASSOC_EVENT");
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003416 if (pCsrRoamInfo->fReassocReq)
3417 sapApAppEvent.sapHddEventCode = eSAP_STA_REASSOC_EVENT;
3418 else
3419 sapApAppEvent.sapHddEventCode = eSAP_STA_ASSOC_EVENT;
3420
3421 //TODO: Need to fill the SET KEY information and pass to HDD
gbian0953f152016-12-29 14:51:18 +08003422 vos_mem_copy(&sta_event_ptr->staMac,
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003423 pCsrRoamInfo->peerMac,sizeof(tSirMacAddr));
gbian0953f152016-12-29 14:51:18 +08003424 sta_event_ptr->staId = pCsrRoamInfo->staId;
3425 sta_event_ptr->statusCode = pCsrRoamInfo->statusCode;
3426 sta_event_ptr->iesLen = pCsrRoamInfo->rsnIELen;
3427 vos_mem_copy(sta_event_ptr->ies, pCsrRoamInfo->prsnIE,
3428 pCsrRoamInfo->rsnIELen);
3429 sta_event_ptr->ampdu = pCsrRoamInfo->ampdu;
3430 sta_event_ptr->sgi_enable = pCsrRoamInfo->sgi_enable;
3431 sta_event_ptr->tx_stbc = pCsrRoamInfo->tx_stbc;
3432 sta_event_ptr->rx_stbc = pCsrRoamInfo->rx_stbc;
3433 sta_event_ptr->ch_width = pCsrRoamInfo->ch_width;
3434 sta_event_ptr->mode = pCsrRoamInfo->mode;
3435 sta_event_ptr->max_supp_idx = pCsrRoamInfo->max_supp_idx;
3436 sta_event_ptr->max_ext_idx = pCsrRoamInfo->max_ext_idx;
3437 sta_event_ptr->max_mcs_idx = pCsrRoamInfo->max_mcs_idx;
3438 sta_event_ptr->rx_mcs_map = pCsrRoamInfo->rx_mcs_map;
3439 sta_event_ptr->tx_mcs_map = pCsrRoamInfo->tx_mcs_map;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003440
Manikandan Mohanb4af05e2014-09-09 15:32:29 +05303441#ifdef FEATURE_WLAN_WAPI
3442 if(pCsrRoamInfo->wapiIELen)
3443 {
gbian0953f152016-12-29 14:51:18 +08003444 v_U8_t len = sta_event_ptr->iesLen;
3445 sta_event_ptr->iesLen
Manikandan Mohanb4af05e2014-09-09 15:32:29 +05303446 += pCsrRoamInfo->wapiIELen;
gbian0953f152016-12-29 14:51:18 +08003447 vos_mem_copy(&sta_event_ptr->ies[len],
Manikandan Mohanb4af05e2014-09-09 15:32:29 +05303448 pCsrRoamInfo->pwapiIE,
3449 pCsrRoamInfo->wapiIELen);
3450 }
3451#endif
3452
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003453 if(pCsrRoamInfo->addIELen)
3454 {
gbian0953f152016-12-29 14:51:18 +08003455 v_U8_t len = sta_event_ptr->iesLen;
3456 sta_event_ptr->iesLen
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003457 += pCsrRoamInfo->addIELen;
gbian0953f152016-12-29 14:51:18 +08003458 vos_mem_copy(&sta_event_ptr->ies[len], pCsrRoamInfo->paddIE,
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003459 pCsrRoamInfo->addIELen);
3460 }
3461
Amar Singhal48d4cc82014-08-26 16:54:51 -07003462 /* also fill up the channel info from the csrRoamInfo */
3463 pChanInfo =
gbian0953f152016-12-29 14:51:18 +08003464 &sta_event_ptr->chan_info;
Amar Singhal48d4cc82014-08-26 16:54:51 -07003465
3466 pChanInfo->chan_id = pCsrRoamInfo->chan_info.chan_id;
3467 pChanInfo->mhz = pCsrRoamInfo->chan_info.mhz;
3468 pChanInfo->info = pCsrRoamInfo->chan_info.info;
3469 pChanInfo->band_center_freq1 = pCsrRoamInfo->chan_info.band_center_freq1;
3470 pChanInfo->band_center_freq2 = pCsrRoamInfo->chan_info.band_center_freq2;
3471 pChanInfo->reg_info_1 = pCsrRoamInfo->chan_info.reg_info_1;
3472 pChanInfo->reg_info_2 = pCsrRoamInfo->chan_info.reg_info_2;
Kanchanapally, Vidyullathadc74b6b2015-04-29 21:23:33 +05303473 pChanInfo->nss = pCsrRoamInfo->chan_info.nss;
3474 pChanInfo->rate_flags = pCsrRoamInfo->chan_info.rate_flags;
gaoleze5d6dc62016-07-20 11:05:23 +08003475 pChanInfo->sub20_channelwidth =
3476 pCsrRoamInfo->chan_info.sub20_channelwidth;
gbian0953f152016-12-29 14:51:18 +08003477 sta_event_ptr->wmmEnabled = pCsrRoamInfo->wmmEnabledSta;
3478 sta_event_ptr->status = (eSapStatus )context;
3479 sta_event_ptr->timingMeasCap = pCsrRoamInfo->timingMeasCap;
gaolez1500ce02016-11-03 16:17:42 +08003480 sta_event_ptr->ecsa_capable = pCsrRoamInfo->ecsa_capable;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003481 //TODO: Need to fill sapAuthType
3482 //sapApAppEvent.sapevt.sapStationAssocReassocCompleteEvent.SapAuthType = pCsrRoamInfo->pProfile->negotiatedAuthType;
3483 break;
3484 }
3485
3486 case eSAP_STA_DISASSOC_EVENT:
Agarwal Ashish8bd2e772015-08-03 15:13:36 +05303487 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
3488 FL("SAP event callback event = %s"),
3489 "eSAP_STA_DISASSOC_EVENT");
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003490 sapApAppEvent.sapHddEventCode = eSAP_STA_DISASSOC_EVENT;
3491
3492 vos_mem_copy( &sapApAppEvent.sapevt.sapStationDisassocCompleteEvent.staMac,
3493 pCsrRoamInfo->peerMac, sizeof(tSirMacAddr));
3494 sapApAppEvent.sapevt.sapStationDisassocCompleteEvent.staId = pCsrRoamInfo->staId;
3495 if (pCsrRoamInfo->reasonCode == eCSR_ROAM_RESULT_FORCED)
3496 sapApAppEvent.sapevt.sapStationDisassocCompleteEvent.reason = eSAP_USR_INITATED_DISASSOC;
3497 else
3498 sapApAppEvent.sapevt.sapStationDisassocCompleteEvent.reason = eSAP_MAC_INITATED_DISASSOC;
3499
3500 sapApAppEvent.sapevt.sapStationDisassocCompleteEvent.statusCode = pCsrRoamInfo->statusCode;
3501 sapApAppEvent.sapevt.sapStationDisassocCompleteEvent.status = (eSapStatus )context;
3502 break;
3503
3504 case eSAP_STA_SET_KEY_EVENT:
Agarwal Ashish8bd2e772015-08-03 15:13:36 +05303505 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
3506 FL("SAP event callback event = %s"),
3507 "eSAP_STA_SET_KEY_EVENT");
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003508 sapApAppEvent.sapHddEventCode = eSAP_STA_SET_KEY_EVENT;
3509 sapApAppEvent.sapevt.sapStationSetKeyCompleteEvent.status = (eSapStatus )context;
3510 vos_mem_copy(&sapApAppEvent.sapevt.sapStationSetKeyCompleteEvent.peerMacAddr,
3511 pCsrRoamInfo->peerMac,sizeof(tSirMacAddr));
3512 break;
3513
3514 case eSAP_STA_DEL_KEY_EVENT :
Agarwal Ashish8bd2e772015-08-03 15:13:36 +05303515 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
3516 FL("SAP event callback event = %s"),
3517 "eSAP_STA_DEL_KEY_EVENT");
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003518 sapApAppEvent.sapHddEventCode = eSAP_STA_DEL_KEY_EVENT;
3519 sapApAppEvent.sapevt.sapStationDeleteKeyCompleteEvent.status = (eSapStatus )context;
3520 //TODO: Should we need to send the key information
3521 //sapApAppEvent.sapevt.sapStationDeleteKeyCompleteEvent.keyId = ;
3522 break;
3523
3524 case eSAP_STA_MIC_FAILURE_EVENT :
Agarwal Ashish8bd2e772015-08-03 15:13:36 +05303525 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
3526 FL("SAP event callback event = %s"),
3527 "eSAP_STA_MIC_FAILURE_EVENT");
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003528 sapApAppEvent.sapHddEventCode = eSAP_STA_MIC_FAILURE_EVENT;
3529 vos_mem_copy( &sapApAppEvent.sapevt.sapStationMICFailureEvent.srcMacAddr,
3530 pCsrRoamInfo->u.pMICFailureInfo->srcMacAddr,
3531 sizeof(tSirMacAddr));
3532 vos_mem_copy( &sapApAppEvent.sapevt.sapStationMICFailureEvent.staMac,
3533 pCsrRoamInfo->u.pMICFailureInfo->taMacAddr,
3534 sizeof(tSirMacAddr));
3535 vos_mem_copy( &sapApAppEvent.sapevt.sapStationMICFailureEvent.dstMacAddr,
3536 pCsrRoamInfo->u.pMICFailureInfo->dstMacAddr,
3537 sizeof(tSirMacAddr));
3538 sapApAppEvent.sapevt.sapStationMICFailureEvent.multicast = pCsrRoamInfo->u.pMICFailureInfo->multicast;
3539 sapApAppEvent.sapevt.sapStationMICFailureEvent.IV1 = pCsrRoamInfo->u.pMICFailureInfo->IV1;
3540 sapApAppEvent.sapevt.sapStationMICFailureEvent.keyId = pCsrRoamInfo->u.pMICFailureInfo->keyId;
3541 vos_mem_copy( sapApAppEvent.sapevt.sapStationMICFailureEvent.TSC,
3542 pCsrRoamInfo->u.pMICFailureInfo->TSC,
3543 SIR_CIPHER_SEQ_CTR_SIZE);
3544 break;
3545
3546 case eSAP_ASSOC_STA_CALLBACK_EVENT:
Agarwal Ashish8bd2e772015-08-03 15:13:36 +05303547 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
3548 FL("SAP event callback event = %s"),
3549 "eSAP_ASSOC_STA_CALLBACK_EVENT");
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003550 break;
3551
3552 case eSAP_WPS_PBC_PROBE_REQ_EVENT:
Agarwal Ashish8bd2e772015-08-03 15:13:36 +05303553 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
3554 FL("SAP event callback event = %s"),
3555 "eSAP_WPS_PBC_PROBE_REQ_EVENT");
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003556 sapApAppEvent.sapHddEventCode = eSAP_WPS_PBC_PROBE_REQ_EVENT;
3557
3558 vos_mem_copy( &sapApAppEvent.sapevt.sapPBCProbeReqEvent.WPSPBCProbeReq,
3559 pCsrRoamInfo->u.pWPSPBCProbeReq,
3560 sizeof(tSirWPSPBCProbeReq));
3561 break;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003562 case eSAP_REMAIN_CHAN_READY:
3563 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
Agarwal Ashish8bd2e772015-08-03 15:13:36 +05303564 FL("SAP event callback event = %s"),
3565 "eSAP_REMAIN_CHAN_READY");
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003566 sapApAppEvent.sapHddEventCode = eSAP_REMAIN_CHAN_READY;
3567 break;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003568
3569 case eSAP_DISCONNECT_ALL_P2P_CLIENT:
3570 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
Agarwal Ashish8bd2e772015-08-03 15:13:36 +05303571 FL("SAP event callback event = %s"),
3572 "eSAP_DISCONNECT_ALL_P2P_CLIENT");
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003573 sapApAppEvent.sapHddEventCode = eSAP_DISCONNECT_ALL_P2P_CLIENT;
3574 sapApAppEvent.sapevt.sapActionCnf.actionSendSuccess = (eSapStatus)context;
3575 break;
3576
3577 case eSAP_MAC_TRIG_STOP_BSS_EVENT :
3578 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
Agarwal Ashish8bd2e772015-08-03 15:13:36 +05303579 FL("SAP event callback event = %s"),
3580 "eSAP_MAC_TRIG_STOP_BSS_EVENT");
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003581 sapApAppEvent.sapHddEventCode = eSAP_MAC_TRIG_STOP_BSS_EVENT;
3582 sapApAppEvent.sapevt.sapActionCnf.actionSendSuccess = (eSapStatus)context;
3583 break;
3584
3585
3586 case eSAP_UNKNOWN_STA_JOIN:
3587 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
Agarwal Ashish8bd2e772015-08-03 15:13:36 +05303588 FL("SAP event callback event = %s"),
3589 "eSAP_UNKNOWN_STA_JOIN");
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003590 sapApAppEvent.sapHddEventCode = eSAP_UNKNOWN_STA_JOIN;
3591 vos_mem_copy((v_PVOID_t)sapApAppEvent.sapevt.sapUnknownSTAJoin.macaddr.bytes,
3592 (v_PVOID_t)context, sizeof(v_MACADDR_t));
3593 break;
3594
3595 case eSAP_MAX_ASSOC_EXCEEDED:
3596 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
Agarwal Ashish8bd2e772015-08-03 15:13:36 +05303597 FL("SAP event callback event = %s"),
3598 "eSAP_MAX_ASSOC_EXCEEDED");
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003599 sapApAppEvent.sapHddEventCode = eSAP_MAX_ASSOC_EXCEEDED;
3600 vos_mem_copy((v_PVOID_t)sapApAppEvent.sapevt.sapMaxAssocExceeded.macaddr.bytes,
3601 (v_PVOID_t)pCsrRoamInfo->peerMac, sizeof(v_MACADDR_t));
3602 break;
3603
Ravi Joshi308c88e2013-12-13 22:52:22 -08003604 case eSAP_CHANNEL_CHANGE_EVENT:
3605 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
3606 "In %s, SAP event callback event = %s",
3607 __func__, "eSAP_CHANNEL_CHANGE_EVENT");
Manikandan Mohan32488a62015-04-05 20:15:03 -07003608 /* Reconfig ACS result info. For DFS AP-AP Mode Sec AP ACS
3609 * follows pri AP
3610 */
3611 sapContext->acs_cfg->pri_ch = sapContext->channel;
3612 sapContext->acs_cfg->ch_width = sapContext->vht_channel_width;
Manikandan Mohan82c955d2015-08-05 13:21:21 -07003613 sap_config_acs_result(hHal, sapContext, sapContext->secondary_ch);
Manikandan Mohan32488a62015-04-05 20:15:03 -07003614
Ravi Joshi308c88e2013-12-13 22:52:22 -08003615 sapApAppEvent.sapHddEventCode = eSAP_CHANNEL_CHANGE_EVENT;
Manikandan Mohan32488a62015-04-05 20:15:03 -07003616 sapApAppEvent.sapevt.sapChSelected.pri_ch =
3617 sapContext->acs_cfg->pri_ch;
3618 sapApAppEvent.sapevt.sapChSelected.ht_sec_ch =
3619 sapContext->acs_cfg->ht_sec_ch;
3620 sapApAppEvent.sapevt.sapChSelected.ch_width =
3621 sapContext->acs_cfg->ch_width;
3622 sapApAppEvent.sapevt.sapChSelected.vht_seg0_center_ch =
3623 sapContext->acs_cfg->vht_seg0_center_ch;
3624 sapApAppEvent.sapevt.sapChSelected.vht_seg1_center_ch =
3625 sapContext->acs_cfg->vht_seg1_center_ch;
Ryan Hsu807a20e2014-05-08 02:08:33 -07003626 break;
3627
3628 case eSAP_DFS_NOL_GET:
3629 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
3630 "In %s, SAP event callback event = %s",
3631 __func__, "eSAP_DFS_NOL_GET");
3632 sapApAppEvent.sapHddEventCode = eSAP_DFS_NOL_GET;
3633 sapApAppEvent.sapevt.sapDfsNolInfo.sDfsList =
3634 NUM_5GHZ_CHANNELS * sizeof(tSapDfsNolInfo);
3635 sapApAppEvent.sapevt.sapDfsNolInfo.pDfsList =
krunal sonib1a4f532014-06-18 16:19:49 -07003636 (v_PVOID_t)(&pMac->sap.SapDfsInfo.sapDfsChannelNolList[0]);
Ryan Hsu807a20e2014-05-08 02:08:33 -07003637 break;
3638
3639 case eSAP_DFS_NOL_SET:
3640 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
3641 "In %s, SAP event callback event = %s",
3642 __func__, "eSAP_DFS_NOL_SET");
3643 sapApAppEvent.sapHddEventCode = eSAP_DFS_NOL_SET;
3644 sapApAppEvent.sapevt.sapDfsNolInfo.sDfsList =
krunal sonib1a4f532014-06-18 16:19:49 -07003645 pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels *
Ryan Hsu807a20e2014-05-08 02:08:33 -07003646 sizeof(tSapDfsNolInfo);
3647 sapApAppEvent.sapevt.sapDfsNolInfo.pDfsList =
krunal sonib1a4f532014-06-18 16:19:49 -07003648 (v_PVOID_t)(&pMac->sap.SapDfsInfo.sapDfsChannelNolList[0]);
Ryan Hsu807a20e2014-05-08 02:08:33 -07003649 break;
Abhishek Singh3c023412015-08-25 10:25:54 +05303650 case eSAP_ECSA_CHANGE_CHAN_IND:
3651 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
3652 "In %s, SAP event callback event = %s",
3653 __func__, "eSAP_ECSA_CHANGE_CHAN_IND");
3654 sapApAppEvent.sapHddEventCode = eSAP_ECSA_CHANGE_CHAN_IND;
3655 sapApAppEvent.sapevt.sap_chan_cng_ind.new_chan =
3656 pCsrRoamInfo->target_channel;
3657 break;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003658 default:
Agarwal Ashish8bd2e772015-08-03 15:13:36 +05303659 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
3660 FL("SAP Unknown callback event = %d"),
3661 sapHddevent);
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07003662 break;
3663 }
3664 vosStatus = (*sapContext->pfnSapEventCallback)
3665 (
3666 &sapApAppEvent,
3667 sapContext->pUsrContext//userdataforcallback - hdd opaque handle
3668 );
3669
3670 return vosStatus;
3671
3672} /* sapSignalApAppStartBssEvent */
3673
3674/*==========================================================================
krunal soni466ec4e2014-06-26 19:53:39 -07003675 FUNCTION sap_find_valid_concurrent_session
3676
3677 DESCRIPTION
3678 This function will return sapcontext of any valid sap session.
3679
3680 PARAMETERS
3681
3682 IN
3683 hHal : HAL pointer
3684
3685 RETURN VALUE
3686 ptSapContext : valid sap context
3687
3688 SIDE EFFECTS
3689 NA
3690============================================================================*/
3691ptSapContext sap_find_valid_concurrent_session (tHalHandle hHal)
3692{
3693 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3694 v_U8_t intf = 0;
3695
3696 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++)
3697 {
Chandrasekaran, Manishekara9347172015-01-13 22:51:53 +05303698 if (((VOS_STA_SAP_MODE == pMac->sap.sapCtxList [intf].sapPersona) ||
3699 (VOS_P2P_GO_MODE == pMac->sap.sapCtxList [intf].sapPersona)) &&
krunal soni466ec4e2014-06-26 19:53:39 -07003700 pMac->sap.sapCtxList[intf].pSapContext != NULL)
3701 {
3702 return pMac->sap.sapCtxList[intf].pSapContext;
3703 }
3704 }
3705
3706 return NULL;
3707}
3708
3709/*==========================================================================
krunal sonib1a4f532014-06-18 16:19:49 -07003710 FUNCTION sap_CloseSession
3711
3712 DESCRIPTION
3713 This function will close all the sme sessions as well as zero-out the
3714 sap global structure
3715
3716 PARAMETERS
3717
3718 IN
3719 hHal : HAL pointer
3720 sapContext : Sap Context value
3721 callback : Roam Session close callback
3722 valid : Sap context is valid or no
3723
3724 RETURN VALUE
3725 The eHalStatus code associated with performing the operation
3726 eHAL_STATUS_SUCCESS: Success
3727
3728 SIDE EFFECTS
3729 NA
3730============================================================================*/
3731eHalStatus sap_CloseSession(tHalHandle hHal,
3732 ptSapContext sapContext,
3733 csrRoamSessionCloseCallback callback,
3734 v_BOOL_t valid)
3735{
3736 eHalStatus halstatus;
3737 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3738
3739 if (FALSE == valid)
3740 {
3741 halstatus = sme_CloseSession(hHal,
3742 sapContext->sessionId,
3743 callback, NULL);
3744 }
3745 else
3746 {
3747 halstatus = sme_CloseSession(hHal,
3748 sapContext->sessionId,
3749 callback, sapContext);
3750 }
3751
krunal soni466ec4e2014-06-26 19:53:39 -07003752 sapContext->isCacStartNotified = VOS_FALSE;
3753 sapContext->isCacEndNotified = VOS_FALSE;
3754 pMac->sap.sapCtxList[sapContext->sessionId].pSapContext = NULL;
Agrawal Ashish3ca03b32016-03-09 18:59:04 +05303755 sapContext->isSapSessionOpen = false;
krunal soni466ec4e2014-06-26 19:53:39 -07003756
3757 if (NULL == sap_find_valid_concurrent_session(hHal))
krunal sonib1a4f532014-06-18 16:19:49 -07003758 {
krunal soni466ec4e2014-06-26 19:53:39 -07003759 /* If timer is running then stop the timer and destory
3760 * it
3761 */
3762 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_MED,
3763 "sapdfs: no session are valid, so clearing dfs global structure");
Sandeep Puligillac0c3f9d2015-05-11 00:15:58 -07003764 /* CAC timer will be initiated and started only when SAP starts on
3765 * DFS channel and it will be stopped and destroyed immediately once the
3766 * radar detected or timedout. So as per design CAC timer should be
3767 * destroyed after stop..*/
krunal soni466ec4e2014-06-26 19:53:39 -07003768 if (pMac->sap.SapDfsInfo.is_dfs_cac_timer_running)
3769 {
3770 vos_timer_stop(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer);
3771 pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = 0;
Sandeep Puligillac0c3f9d2015-05-11 00:15:58 -07003772 vos_timer_destroy(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer);
krunal soni466ec4e2014-06-26 19:53:39 -07003773 }
3774 pMac->sap.SapDfsInfo.cac_state = eSAP_DFS_DO_NOT_SKIP_CAC;
krunal soni466ec4e2014-06-26 19:53:39 -07003775 sap_CacResetNotify(hHal);
3776 vos_mem_zero(&pMac->sap, sizeof(pMac->sap));
Selvaraj, Sridhar71a36b12016-05-17 12:51:26 +05303777
3778 /*
3779 * No valid concurrent AP sessions(SAP/P2PGO), switch back the
3780 * allowed action frames bitmask to STA mode and set the same
3781 * to FW
3782 */
3783 sme_set_allowed_action_frames(hHal,
Sridhar Selvaraj02fe6b62017-07-25 10:25:38 +05303784 ALLOWED_ACTION_FRAMES_BITMAP0_STA, true);
krunal sonib1a4f532014-06-18 16:19:49 -07003785 }
krunal sonib1a4f532014-06-18 16:19:49 -07003786
3787 return halstatus;
3788}
3789
3790/*==========================================================================
3791 FUNCTION sap_CacResetNotify
3792
3793 DESCRIPTION Function will be called up on stop bss indication to clean up
3794 DFS global structure.
3795
3796 DEPENDENCIES PARAMETERS
3797 IN hHAL : HAL pointer
3798
3799 RETURN VALUE : void.
3800
3801 SIDE EFFECTS
3802============================================================================*/
3803void sap_CacResetNotify(tHalHandle hHal)
3804{
3805 v_U8_t intf = 0;
3806 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3807
3808 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++)
3809 {
3810 ptSapContext pSapContext =
3811 (ptSapContext)pMac->sap.sapCtxList [intf].pSapContext;
Chandrasekaran, Manishekara9347172015-01-13 22:51:53 +05303812 if (((VOS_STA_SAP_MODE == pMac->sap.sapCtxList [intf].sapPersona) ||
3813 (VOS_P2P_GO_MODE == pMac->sap.sapCtxList [intf].sapPersona)) &&
krunal sonib1a4f532014-06-18 16:19:49 -07003814 pMac->sap.sapCtxList [intf].pSapContext != NULL)
3815 {
3816 pSapContext->isCacStartNotified = VOS_FALSE;
3817 pSapContext->isCacEndNotified = VOS_FALSE;
3818 }
3819 }
3820}
3821
3822/*==========================================================================
3823 FUNCTION sap_CacStartNotify
3824
3825 DESCRIPTION Function will be called to Notify eSAP_DFS_CAC_START event
3826 to HDD
3827
3828 DEPENDENCIES PARAMETERS
3829 IN hHAL : HAL pointer
3830
3831 RETURN VALUE : VOS_STATUS.
3832
3833 SIDE EFFECTS
3834============================================================================*/
3835VOS_STATUS sap_CacStartNotify(tHalHandle hHal)
3836{
3837 v_U8_t intf = 0;
3838 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3839 VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE;
3840
3841 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++)
3842 {
3843 ptSapContext pSapContext =
3844 (ptSapContext)pMac->sap.sapCtxList [intf].pSapContext;
Chandrasekaran, Manishekara9347172015-01-13 22:51:53 +05303845 if (((VOS_STA_SAP_MODE == pMac->sap.sapCtxList [intf].sapPersona) ||
3846 (VOS_P2P_GO_MODE == pMac->sap.sapCtxList [intf].sapPersona)) &&
krunal sonib1a4f532014-06-18 16:19:49 -07003847 pMac->sap.sapCtxList [intf].pSapContext != NULL &&
3848 (VOS_FALSE == pSapContext->isCacStartNotified))
3849 {
3850 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_MED,
Jeff Johnson1c11fdf2017-09-18 11:02:47 -07003851 "sapdfs: Signaling eSAP_DFS_CAC_START to HDD for sapctx[%pK]",
krunal sonib1a4f532014-06-18 16:19:49 -07003852 pSapContext);
3853
3854 vosStatus = sapSignalHDDevent(pSapContext, NULL,
3855 eSAP_DFS_CAC_START,
3856 (v_PVOID_t) eSAP_STATUS_SUCCESS);
3857 if (VOS_STATUS_SUCCESS != vosStatus)
3858 {
3859 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
3860 "In %s, failed setting isCacStartNotified on interface[%d]",
3861 __func__, intf);
3862 return vosStatus;
3863 }
3864 pSapContext->isCacStartNotified = VOS_TRUE;
3865 }
3866 }
3867 return vosStatus;
3868}
3869
3870/*==========================================================================
3871 FUNCTION sap_CacEndNotify
3872
3873 DESCRIPTION Function will be called to Notify eSAP_DFS_CAC_END event
3874 to HDD
3875
3876 DEPENDENCIES PARAMETERS
3877 IN hHAL : HAL pointer
3878
3879 RETURN VALUE : VOS_STATUS.
3880
3881 SIDE EFFECTS
3882============================================================================*/
3883VOS_STATUS sap_CacEndNotify(tHalHandle hHal, tCsrRoamInfo *roamInfo)
3884{
3885 v_U8_t intf;
3886 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3887 VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE;
3888
3889 /*
3890 * eSAP_DFS_CHANNEL_CAC_END:
3891 * CAC Period elapsed and there was no radar
3892 * found so, SAP can continue beaconing.
3893 * sap_radar_found_status is set to 0
3894 */
3895 for ( intf = 0; intf < SAP_MAX_NUM_SESSION; intf++)
3896 {
3897 ptSapContext pSapContext =
3898 (ptSapContext)pMac->sap.sapCtxList [intf].pSapContext;
Chandrasekaran, Manishekara9347172015-01-13 22:51:53 +05303899 if (((VOS_STA_SAP_MODE == pMac->sap.sapCtxList [intf].sapPersona) ||
3900 (VOS_P2P_GO_MODE == pMac->sap.sapCtxList [intf].sapPersona)) &&
krunal sonib1a4f532014-06-18 16:19:49 -07003901 pMac->sap.sapCtxList [intf].pSapContext != NULL &&
3902 (VOS_FALSE == pSapContext->isCacEndNotified))
3903 {
3904 pSapContext = pMac->sap.sapCtxList [intf].pSapContext;
3905 vosStatus = sapSignalHDDevent(pSapContext, NULL,
3906 eSAP_DFS_CAC_END,
3907 (v_PVOID_t) eSAP_STATUS_SUCCESS);
3908 if (VOS_STATUS_SUCCESS != vosStatus)
3909 {
3910 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
3911 "In %s, failed setting isCacEndNotified on interface[%d]",
3912 __func__, intf);
3913 return vosStatus;
3914 }
3915 pSapContext->isCacEndNotified = VOS_TRUE;
3916 pMac->sap.SapDfsInfo.sap_radar_found_status = VOS_FALSE;
3917 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_MED,
Jeff Johnson1c11fdf2017-09-18 11:02:47 -07003918 "sapdfs: Start beacon request on sapctx[%pK]",
krunal sonib1a4f532014-06-18 16:19:49 -07003919 pSapContext);
3920
3921 /* Start beaconing on the new channel */
3922 WLANSAP_StartBeaconReq((v_PVOID_t)pSapContext);
3923
3924 /* Transition from eSAP_STARTING to eSAP_STARTED
3925 * (both without substates)
3926 */
3927 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_MED,
3928 "sapdfs: channel[%d] from state %s => %s",
3929 pSapContext->channel, "eSAP_STARTING",
3930 "eSAP_STARTED");
3931
3932 pSapContext->sapsMachine = eSAP_STARTED;
3933
3934 /*Action code for transition */
3935 vosStatus = sapSignalHDDevent(pSapContext, roamInfo,
3936 eSAP_START_BSS_EVENT,
3937 (v_PVOID_t)eSAP_STATUS_SUCCESS);
3938 if (VOS_STATUS_SUCCESS != vosStatus)
3939 {
3940 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
3941 "In %s, failed setting isCacEndNotified on interface[%d]",
3942 __func__, intf);
3943 return vosStatus;
3944 }
3945
3946 /* Transition from eSAP_STARTING to eSAP_STARTED
3947 * (both without substates)
3948 */
3949 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
3950 "In %s, from state %s => %s",
3951 __func__, "eSAP_DFS_CAC_WAIT", "eSAP_STARTED");
3952 }
3953 }
krunal soni466ec4e2014-06-26 19:53:39 -07003954 /*
3955 * All APs are done with CAC timer, all APs should start beaconing.
3956 * Lets assume AP1 and AP2 started beaconing on DFS channel, Now lets
3957 * say AP1 goes down and comes back on same DFS channel. In this case
3958 * AP1 shouldn't start CAC timer and start beacon immediately beacause
3959 * AP2 is already beaconing on this channel. This case will be handled
3960 * by checking against eSAP_DFS_SKIP_CAC while starting the timer.
3961 */
3962 pMac->sap.SapDfsInfo.cac_state = eSAP_DFS_SKIP_CAC;
krunal sonib1a4f532014-06-18 16:19:49 -07003963 return vosStatus;
3964}
3965
Hong Shid5049e92017-02-11 00:53:55 +08003966/**
3967 * sap_relaunch_acs_result_handler() - handle relaunched ACS result
3968 * @sap_context: pointer of ptSapContext
3969 * @roam_info: pointer to tCsrRoamInfo which contains result channel
3970 *
3971 * This function handle the relaunched ACS result and check if need to
3972 * trigger CSA.
3973 *
3974 * Return: VOS_STATUS
3975 */
3976VOS_STATUS
3977sap_relaunch_acs_result_handler(ptSapContext sap_context,
3978 tCsrRoamInfo *roam_info)
3979{
3980 VOS_STATUS vos_status;
3981
3982 vos_mem_zero(sap_context->acs_cfg,
3983 sizeof(struct sap_acs_cfg));
3984
3985 vos_status = sapSignalHDDevent(sap_context, NULL,
3986 eSAP_ACS_CHANNEL_SELECTED,
3987 (v_PVOID_t)eSAP_STATUS_SUCCESS);
3988
3989 if (!VOS_IS_STATUS_SUCCESS(vos_status))
3990 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
3991 FL("Failed to indicate ACS complete."));
3992
3993 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
3994 "In %s: acs_target_channel=%d cur_channel=%d",
3995 __func__,
3996 roam_info->target_channel,
3997 sap_context->channel);
3998
3999 if (!((roam_info->target_channel == sap_context->channel) ||
4000 (roam_info->target_channel == SAP_CHANNEL_NOT_SELECTED))) {
4001 vos_status = sapSignalHDDevent(sap_context, roam_info,
4002 eSAP_ECSA_CHANGE_CHAN_IND,
4003 (v_PVOID_t)NULL);
4004 if (!VOS_IS_STATUS_SUCCESS(vos_status))
4005 VOS_TRACE(VOS_MODULE_ID_SAP,
4006 VOS_TRACE_LEVEL_ERROR,
4007 FL("trigger channel switch failed"));
4008 }
4009
4010 return vos_status;
4011}
4012
krunal sonib1a4f532014-06-18 16:19:49 -07004013/*==========================================================================
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004014 FUNCTION sapFsm
4015
4016 DESCRIPTION
4017 SAP State machine entry function
4018
4019 DEPENDENCIES
4020 NA.
4021
4022 PARAMETERS
4023
4024 IN
4025 sapContext : Sap Context value
4026 sapEvent : State machine event
4027 status : Return the SAP status here
4028
4029 RETURN VALUE
4030 The VOS_STATUS code associated with performing the operation
4031
4032 VOS_STATUS_SUCCESS: Success
4033
4034 SIDE EFFECTS
4035============================================================================*/
4036VOS_STATUS
4037sapFsm
4038(
4039 ptSapContext sapContext, /* sapContext value */
4040 ptWLAN_SAPEvent sapEvent /* State machine event */
4041)
4042{
4043 /* Retrieve the phy link state machine structure
4044 * from the sapContext value
4045 */
4046 eSapFsmStates_t stateVar = sapContext->sapsMachine; /*state var that keeps track of state machine*/
4047 tCsrRoamInfo *roamInfo = (tCsrRoamInfo *)(sapEvent->params);
4048 v_U32_t msg = sapEvent->event; /* State machine input event message */
4049 VOS_STATUS vosStatus = VOS_STATUS_E_FAILURE;
krunal sonib1a4f532014-06-18 16:19:49 -07004050 tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx);
4051 tpAniSirGlobal pMac;
Ryan Hsue9758412014-07-17 20:02:53 -07004052 v_U32_t cbMode;
Ryan Hsua821f012014-11-13 16:50:09 -08004053 v_BOOL_t b_leak_chan = FALSE;
4054#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
4055 v_U8_t temp_chan;
4056 tSapDfsNolInfo *pNol;
4057#endif
krunal sonib1a4f532014-06-18 16:19:49 -07004058
4059 if (NULL == hHal)
4060 {
4061 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
4062 "In %s invalid hHal", __func__);
4063 return VOS_STATUS_E_FAILURE;
4064 }
4065 pMac = PMAC_STRUCT( hHal );
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004066
Jeff Johnson1c11fdf2017-09-18 11:02:47 -07004067 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_DEBUG, "%s: sapContext=%pK, stateVar=%d, msg=0x%x", __func__, sapContext, stateVar, msg);
Yun Park3aa6f3b2014-03-03 09:56:08 -08004068
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004069 switch (stateVar)
4070 {
4071 case eSAP_DISCONNECTED:
4072 if ((msg == eSAP_HDD_START_INFRA_BSS))
4073 {
4074 /* Transition from eSAP_DISCONNECTED to eSAP_CH_SELECT (both without substates) */
Agrawal Ashish3ca03b32016-03-09 18:59:04 +05304075 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, new from state %s => %s, session id %d",
4076 __func__, "eSAP_DISCONNECTED", "eSAP_CH_SELECT", sapContext->sessionId);
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004077
Agrawal Ashish3ca03b32016-03-09 18:59:04 +05304078 if (sapContext->isSapSessionOpen == eSAP_FALSE) {
4079 uint32_t type, subtype;
4080 if (sapContext->csrRoamProfile.csrPersona ==
4081 VOS_P2P_GO_MODE)
4082 vosStatus = vos_get_vdev_types(VOS_P2P_GO_MODE,
4083 &type, &subtype);
4084 else
4085 vosStatus = vos_get_vdev_types(VOS_STA_SAP_MODE,
4086 &type, &subtype);
4087 if (VOS_STATUS_SUCCESS != vosStatus) {
4088 VOS_TRACE(VOS_MODULE_ID_SAP,
4089 VOS_TRACE_LEVEL_FATAL,
4090 "failed to get vdev type");
4091 return VOS_STATUS_E_FAILURE;
4092 }
Agrawal Ashish40e386a2016-08-05 21:12:57 +05304093 vosStatus = sme_OpenSession(hHal, &WLANSAP_RoamCallback,
Agrawal Ashish3ca03b32016-03-09 18:59:04 +05304094 sapContext, sapContext->self_mac_addr,
4095 &sapContext->sessionId, type, subtype);
4096 if (VOS_STATUS_SUCCESS != vosStatus) {
4097 VOS_TRACE(VOS_MODULE_ID_SAP,
4098 VOS_TRACE_LEVEL_ERROR,
4099 FL("Error: calling sme_OpenSession"));
4100 return VOS_STATUS_E_FAILURE;
4101 }
4102 sapContext->isSapSessionOpen = eSAP_TRUE;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004103 }
4104
Ryan Hsu807a20e2014-05-08 02:08:33 -07004105 /* init dfs channel nol */
4106 sapInitDfsChannelNolList(sapContext);
4107
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004108 /* Set SAP device role */
4109 sapContext->sapsMachine = eSAP_CH_SELECT;
4110
Peng Xu9ef1cf52014-11-08 21:11:17 -08004111 /*
4112 * Perform sme_ScanRequest
4113 * This scan request is post start bss
4114 * request so, set the third to false.
4115 */
4116 vosStatus = sapGotoChannelSel(sapContext, sapEvent, VOS_FALSE);
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004117
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004118 }
Ryan Hsu807a20e2014-05-08 02:08:33 -07004119 else if (msg == eSAP_DFS_CHANNEL_CAC_START)
Ravi Joshi308c88e2013-12-13 22:52:22 -08004120 {
4121 /* No need of state check here, caller is expected to perform
4122 * the checks before sending the event
4123 */
4124 sapContext->sapsMachine = eSAP_DFS_CAC_WAIT;
4125
krunal sonib1a4f532014-06-18 16:19:49 -07004126 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_MED,
4127 "sapdfs: from state eSAP_DISCONNECTED => SAP_DFS_CAC_WAIT");
4128 if ( pMac->sap.SapDfsInfo.is_dfs_cac_timer_running != VOS_TRUE)
4129 {
4130 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_MED,
Jeff Johnson1c11fdf2017-09-18 11:02:47 -07004131 "sapdfs: starting dfs cac timer on sapctx[%pK]",
krunal sonib1a4f532014-06-18 16:19:49 -07004132 sapContext);
4133 sapStartDfsCacTimer(sapContext);
4134 }
4135
4136 vosStatus = sap_CacStartNotify(hHal);
Ravi Joshi308c88e2013-12-13 22:52:22 -08004137 }
Manikandan Mohan54fcad82014-11-17 12:25:40 -08004138 else if (msg == eSAP_CHANNEL_SELECTION_RETRY)
Peng Xudaa81292014-01-08 11:52:31 -08004139 {
4140 /* Set SAP device role */
4141 sapContext->sapsMachine = eSAP_CH_SELECT;
4142
Peng Xu9ef1cf52014-11-08 21:11:17 -08004143 /*
4144 * Perform sme_ScanRequest
4145 * This scan request is post start bss
4146 * request so, set the third to false.
4147 */
4148 vosStatus = sapGotoChannelSel(sapContext, sapEvent, VOS_FALSE);
Peng Xudaa81292014-01-08 11:52:31 -08004149 }
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004150 else
4151 {
4152 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, "In %s, in state %s, event msg %d",
4153 __func__, "eSAP_DISCONNECTED", msg);
4154 }
Ryan Hsu807a20e2014-05-08 02:08:33 -07004155
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004156 break;
4157
4158 case eSAP_CH_SELECT:
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004159
4160 if (msg == eSAP_MAC_SCAN_COMPLETE)
4161 {
Ryan Hsu807a20e2014-05-08 02:08:33 -07004162 tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx);
Krishna Kumaar Natarajan7c77e242014-06-10 14:58:39 -07004163 if (NULL == hHal)
Manikandan Mohan31f15242014-04-07 12:56:14 -07004164 {
Krishna Kumaar Natarajan7c77e242014-06-10 14:58:39 -07004165 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
4166 "In %s, NULL hHal in state %s, msg %d ", __func__,
4167 "eSAP_CH_SELECT", msg);
4168 return VOS_STATUS_E_FAULT;
4169 }
Manikandan Mohan32488a62015-04-05 20:15:03 -07004170 cbMode = sme_SelectCBMode(hHal,
4171 sapContext->csrRoamProfile.phyMode,
4172 sapContext->channel,
Peng Xub5bebcf2015-07-14 14:49:45 -07004173 sapContext->secondary_ch,
Manikandan Mohan32488a62015-04-05 20:15:03 -07004174 &sapContext->vht_channel_width,
4175 sapContext->ch_width_orig);
Ryan Hsue9758412014-07-17 20:02:53 -07004176
bings7c7afc02017-07-19 17:16:50 +08004177 cbMode = sme_GetCBPhyStateFromCBIniValue(cbMode);
Ryan Hsua821f012014-11-13 16:50:09 -08004178#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
4179 temp_chan = sapContext->channel;
4180 pNol = pMac->sap.SapDfsInfo.sapDfsChannelNolList;
4181
4182 sapMarkChannelsLeakingIntoNOL(sapContext,
4183 cbMode, pNol, 1, &temp_chan);
4184
4185 /* if selelcted channel has leakage to channels
4186 in NOL, the temp_chan will be reset */
4187 b_leak_chan = (temp_chan != sapContext->channel);
4188#endif
4189 /* check if channel is in DFS_NOL or
4190 if the channel has leakage to the channels in NOL */
Ryan Hsue9758412014-07-17 20:02:53 -07004191 if (sapDfsIsChannelInNolList(sapContext, sapContext->channel,
Ryan Hsua821f012014-11-13 16:50:09 -08004192 cbMode) || b_leak_chan)
Ryan Hsu807a20e2014-05-08 02:08:33 -07004193 {
4194 v_U8_t ch;
4195
4196 /* find a new available channel */
4197 ch = sapRandomChannelSel(sapContext);
Yun Park3d4df6f2014-08-30 15:56:24 -07004198 if (ch == 0) {
4199 /* No available channel found */
4200 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
4201 FL("No available channel found!!!"));
Naveen Rawatb885df62014-08-25 19:53:15 -07004202 sapSignalHDDevent(sapContext, NULL,
4203 eSAP_DFS_NO_AVAILABLE_CHANNEL,
4204 (v_PVOID_t) eSAP_STATUS_SUCCESS);
Yun Park3d4df6f2014-08-30 15:56:24 -07004205 return VOS_STATUS_E_FAULT;
4206 }
4207
Ryan Hsu807a20e2014-05-08 02:08:33 -07004208 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
Ryan Hsue9758412014-07-17 20:02:53 -07004209 FL("channel %d is in NOL, StartBss on new channel %d"),
4210 sapContext->channel, ch);
Ryan Hsu807a20e2014-05-08 02:08:33 -07004211
4212 sapContext->channel = ch;
Kiran Kumar Lokere51e89002014-12-17 16:40:39 -08004213 sme_SelectCBMode(hHal, sapContext->csrRoamProfile.phyMode,
4214 sapContext->channel,
Peng Xub5bebcf2015-07-14 14:49:45 -07004215 sapContext->secondary_ch,
Manikandan Mohan32488a62015-04-05 20:15:03 -07004216 &sapContext->vht_channel_width,
4217 sapContext->ch_width_orig);
Ryan Hsu807a20e2014-05-08 02:08:33 -07004218 }
Manikandan Mohan540515a2014-07-02 21:12:09 +05304219 if (sapContext->channel > 14 &&
4220 (sapContext->csrRoamProfile.phyMode ==
Krishna Kumaar Natarajan9f4ef202014-12-11 14:56:40 -08004221 eCSR_DOT11_MODE_11g ||
Manikandan Mohan540515a2014-07-02 21:12:09 +05304222 sapContext->csrRoamProfile.phyMode ==
Krishna Kumaar Natarajan9f4ef202014-12-11 14:56:40 -08004223 eCSR_DOT11_MODE_11g_ONLY))
4224 sapContext->csrRoamProfile.phyMode = eCSR_DOT11_MODE_11a;
Ryan Hsu807a20e2014-05-08 02:08:33 -07004225
Yun Parkbe85db52014-06-24 13:54:26 -07004226 /* when AP2 is started while AP1 is performing ACS, we may not
4227 * have the AP1 channel yet.So here after the completion of AP2
4228 * ACS check if AP1 ACS resulting channel is DFS and if yes
4229 * override AP2 ACS scan result with AP1 DFS channel
4230 */
Chandrasekaran, Manishekara9347172015-01-13 22:51:53 +05304231 if (vos_concurrent_beaconing_sessions_running()) {
Yun Parkbe85db52014-06-24 13:54:26 -07004232 v_U16_t con_ch;
4233
4234 con_ch = sme_GetConcurrentOperationChannel(hHal);
4235 if (con_ch && VOS_IS_DFS_CH(con_ch))
4236 sapContext->channel = con_ch;
4237 }
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004238 /* Transition from eSAP_CH_SELECT to eSAP_STARTING (both without substates) */
4239 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, from state %s => %s",
4240 __func__, "eSAP_CH_SELECT", "eSAP_STARTING");
4241 // Channel selected. Now can sapGotoStarting
4242 sapContext->sapsMachine = eSAP_STARTING;
4243 // Specify the channel
4244 sapContext->csrRoamProfile.ChannelInfo.numOfChannels = 1;
4245 sapContext->csrRoamProfile.ChannelInfo.ChannelList = &sapContext->csrRoamProfile.operationChannel;
4246 sapContext->csrRoamProfile.operationChannel = (tANI_U8)sapContext->channel;
Kiran Kumar Lokere51e89002014-12-17 16:40:39 -08004247 sapContext->csrRoamProfile.vht_channel_width =
4248 sapContext->vht_channel_width;
Ganesh Kondabattinie4cac852016-05-13 14:48:04 +05304249
4250 sapContext->csrRoamProfile.beacon_tx_rate =
4251 sapContext->beacon_tx_rate;
4252
Peng Xu65751502014-08-27 17:29:23 -07004253 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
4254 "%s: notify hostapd about channel selection: %d",
4255 __func__, sapContext->channel);
Manikandan Mohancdbc2062015-08-03 12:13:25 -07004256 sapSignalHDDevent(sapContext, NULL, eSAP_CHANNEL_CHANGE_EVENT,
Manikandan Mohan32488a62015-04-05 20:15:03 -07004257 (v_PVOID_t) eSAP_STATUS_SUCCESS);
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004258 vosStatus = sapGotoStarting( sapContext, sapEvent, eCSR_BSS_TYPE_INFRA_AP);
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004259 }
Manikandan Mohan54fcad82014-11-17 12:25:40 -08004260 else if (msg == eSAP_CHANNEL_SELECTION_FAILED) {
4261 sapContext->sapsMachine = eSAP_DISCONNECTED;
4262 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
4263 "\n\n***In %s, Cannot start BSS, ACS Fail***\n\n",
4264 __func__);
Ashish Kumar Dhanotiya42b8b6b2017-02-15 15:01:38 +05304265 sapSignalHDDevent(sapContext, NULL, eSAP_START_BSS_EVENT,
4266 (v_PVOID_t) eSAP_STATUS_FAILURE);
Manikandan Mohanc822d382015-10-08 17:29:50 -07004267 } else if (msg == eSAP_HDD_STOP_INFRA_BSS) {
4268 sapContext->sapsMachine = eSAP_DISCONNECTED;
4269 sapSignalHDDevent(sapContext, NULL, eSAP_START_BSS_EVENT,
4270 (v_PVOID_t)eSAP_STATUS_FAILURE);
4271 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
4272 "%s: BSS stopped during Ch select in Progress", __func__);
4273 } else {
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004274 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, "In %s, in state %s, invalid event msg %d",
4275 __func__, "eSAP_CH_SELECT", msg);
4276 }
4277 break;
4278
Ravi Joshia02f1d72013-12-13 22:52:22 -08004279 case eSAP_DFS_CAC_WAIT:
4280 if (msg == eSAP_DFS_CHANNEL_CAC_START)
4281 {
4282 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, from state %s => %s",
4283 __func__, "eSAP_CH_SELECT", "eSAP_DFS_CAC_WAIT");
krunal sonib1a4f532014-06-18 16:19:49 -07004284 if ( pMac->sap.SapDfsInfo.is_dfs_cac_timer_running != VOS_TRUE)
4285 sapStartDfsCacTimer(sapContext);
4286
4287 vosStatus = sap_CacStartNotify(hHal);
4288
Ravi Joshia02f1d72013-12-13 22:52:22 -08004289 }
4290 else if (msg == eSAP_DFS_CHANNEL_CAC_RADAR_FOUND)
4291 {
krunal soni466ec4e2014-06-26 19:53:39 -07004292 v_U8_t intf;
Ravi Joshia02f1d72013-12-13 22:52:22 -08004293 /* Radar found while performing channel availability
4294 * check, need to switch the channel again
4295 */
Krishna Kumaar Natarajan9f4ef202014-12-11 14:56:40 -08004296 eCsrPhyMode phyMode = sapContext->csrRoamProfile.phyMode;
Ravi Joshia02f1d72013-12-13 22:52:22 -08004297 tHalHandle hHal =
4298 (tHalHandle)vos_get_context(VOS_MODULE_ID_SME, sapContext->pvosGCtx);
4299
Ravi Joshia02f1d72013-12-13 22:52:22 -08004300
4301 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
4302 "ENTERTRED CAC WAIT STATE-->eSAP_DISCONNECTING\n");
Kalikinkar dhara00f3cd12014-03-25 18:22:00 -07004303 if (NULL == hHal)
4304 {
4305 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
4306 "In %s, NULL hHal in state %s, msg %d",
4307 __func__, "eSAP_DFS_CAC_WAIT", msg);
4308 }
krunal sonib1a4f532014-06-18 16:19:49 -07004309 else if (pMac->sap.SapDfsInfo.target_channel)
Kalikinkar dhara00f3cd12014-03-25 18:22:00 -07004310 {
4311 sme_SelectCBMode(hHal, phyMode,
Kiran Kumar Lokere606c55f2014-11-14 14:18:13 -08004312 pMac->sap.SapDfsInfo.target_channel,
Peng Xub5bebcf2015-07-14 14:49:45 -07004313 0, &sapContext->vht_channel_width,
Manikandan Mohan32488a62015-04-05 20:15:03 -07004314 sapContext->ch_width_orig);
Kalikinkar dhara00f3cd12014-03-25 18:22:00 -07004315 }
Ravi Joshia02f1d72013-12-13 22:52:22 -08004316
krunal soni466ec4e2014-06-26 19:53:39 -07004317 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++)
4318 {
4319 ptSapContext sapContext;
Wu Gaod55424a2016-09-14 14:46:37 +08004320 sapContext = pMac->sap.sapCtxList [intf].pSapContext;
Chandrasekaran, Manishekara9347172015-01-13 22:51:53 +05304321 if (((VOS_STA_SAP_MODE ==
4322 pMac->sap.sapCtxList[intf].sapPersona) ||
4323 (VOS_P2P_GO_MODE ==
4324 pMac->sap.sapCtxList[intf].sapPersona)) &&
Wu Gaod55424a2016-09-14 14:46:37 +08004325 sapContext != NULL &&
4326 sapContext->sapsMachine != eSAP_DISCONNECTED)
krunal soni466ec4e2014-06-26 19:53:39 -07004327 {
krunal soni466ec4e2014-06-26 19:53:39 -07004328 /* SAP to be moved to DISCONNECTING state */
4329 sapContext->sapsMachine = eSAP_DISCONNECTING;
4330 /*
4331 * eSAP_DFS_CHANNEL_CAC_RADAR_FOUND:
4332 * A Radar is found on current DFS Channel
4333 * while in CAC WAIT period So, do a channel switch
4334 * to randomly selected target channel.
4335 * Send the Channel change message to SME/PE.
4336 * sap_radar_found_status is set to 1
4337 */
4338 sapSignalHDDevent(sapContext, NULL,
4339 eSAP_DFS_RADAR_DETECT,
4340 (v_PVOID_t) eSAP_STATUS_SUCCESS);
Ravi Joshia02f1d72013-12-13 22:52:22 -08004341
krunal soni466ec4e2014-06-26 19:53:39 -07004342 WLANSAP_ChannelChangeRequest((v_PVOID_t)sapContext,
krunal sonib1a4f532014-06-18 16:19:49 -07004343 pMac->sap.SapDfsInfo.target_channel);
krunal soni466ec4e2014-06-26 19:53:39 -07004344 }
4345 }
Ravi Joshia02f1d72013-12-13 22:52:22 -08004346 }
4347 else if (msg == eSAP_DFS_CHANNEL_CAC_END)
4348 {
krunal sonib1a4f532014-06-18 16:19:49 -07004349 vosStatus = sap_CacEndNotify(hHal, roamInfo);
Ravi Joshia02f1d72013-12-13 22:52:22 -08004350 }
Ryan Hsuef962b32014-05-06 04:25:33 -07004351 else if (msg == eSAP_HDD_STOP_INFRA_BSS)
4352 {
Ryan Hsu78829cc2014-06-18 06:34:41 -07004353 /* Transition from eSAP_DFS_CAC_WAIT to eSAP_DISCONNECTING */
Ryan Hsuef962b32014-05-06 04:25:33 -07004354 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
4355 "In %s, from state %s => %s",
Ryan Hsu78829cc2014-06-18 06:34:41 -07004356 __func__,
4357 "eSAP_DFS_CAC_WAIT",
4358 "eSAP_DISCONNECTING");
Ryan Hsuef962b32014-05-06 04:25:33 -07004359
krunal soni466ec4e2014-06-26 19:53:39 -07004360 /*
4361 * Stop the CAC timer only in following conditions
4362 * single AP: if there is a single AP then stop the timer
4363 * mulitple APs: incase of multiple APs, make sure that
4364 * all APs are down.
4365 */
4366 if (NULL == sap_find_valid_concurrent_session(hHal))
krunal sonib1a4f532014-06-18 16:19:49 -07004367 {
krunal soni466ec4e2014-06-26 19:53:39 -07004368 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_MED,
4369 "sapdfs: no sessions are valid, stopping timer");
4370
4371 sapStopDfsCacTimer(sapContext);
krunal sonib1a4f532014-06-18 16:19:49 -07004372 }
krunal soni466ec4e2014-06-26 19:53:39 -07004373
4374 sapContext->sapsMachine = eSAP_DISCONNECTING;
4375 vosStatus = sapGotoDisconnecting(sapContext);
Ryan Hsuef962b32014-05-06 04:25:33 -07004376 }
Ravi Joshia02f1d72013-12-13 22:52:22 -08004377 else
4378 {
4379 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
4380 "In %s, in state %s, invalid event msg %d",
4381 __func__, "eSAP_DFS_CAC_WAIT", msg);
4382 }
4383 break;
4384
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004385 case eSAP_STARTING:
4386 if (msg == eSAP_MAC_START_BSS_SUCCESS )
4387 {
4388 /* Transition from eSAP_STARTING to eSAP_STARTED (both without substates) */
4389 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, from state channel = %d %s => %s",
4390 __func__,sapContext->channel, "eSAP_STARTING", "eSAP_STARTED");
4391
4392 sapContext->sapsMachine = eSAP_STARTED;
Ravi Joshi308c88e2013-12-13 22:52:22 -08004393
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004394 /*Action code for transition */
4395 vosStatus = sapSignalHDDevent( sapContext, roamInfo, eSAP_START_BSS_EVENT, (v_PVOID_t)eSAP_STATUS_SUCCESS);
4396
krunal sonib1a4f532014-06-18 16:19:49 -07004397 /* The upper layers have been informed that AP is up and
Ravi Joshi308c88e2013-12-13 22:52:22 -08004398 * running, however, the AP is still not beaconing, until
4399 * CAC is done if the operating channel is DFS
4400 */
krunal sonib1a4f532014-06-18 16:19:49 -07004401 if (NV_CHANNEL_DFS ==
Yun Parkbe85db52014-06-24 13:54:26 -07004402 vos_nv_getChannelEnabledState(sapContext->channel)
4403 )
Ravi Joshi308c88e2013-12-13 22:52:22 -08004404 {
krunal soni466ec4e2014-06-26 19:53:39 -07004405 if ((VOS_FALSE == pMac->sap.SapDfsInfo.ignore_cac) &&
4406 (eSAP_DFS_DO_NOT_SKIP_CAC ==
4407 pMac->sap.SapDfsInfo.cac_state))
krunal sonib1a4f532014-06-18 16:19:49 -07004408 {
4409 /* Move the device in CAC_WAIT_STATE */
4410 sapContext->sapsMachine = eSAP_DFS_CAC_WAIT;
Ravi Joshi308c88e2013-12-13 22:52:22 -08004411
krunal sonib1a4f532014-06-18 16:19:49 -07004412 /* TODO: Need to stop the OS transmit queues,
4413 * so that no traffic can flow down the stack
4414 */
Ravi Joshi308c88e2013-12-13 22:52:22 -08004415
krunal sonib1a4f532014-06-18 16:19:49 -07004416 /* Start CAC wait timer */
4417 if (pMac->sap.SapDfsInfo.is_dfs_cac_timer_running !=
4418 TRUE)
4419 sapStartDfsCacTimer(sapContext);
4420
4421 vosStatus = sap_CacStartNotify(hHal);
4422
4423 }
4424 else
4425 {
4426 WLANSAP_StartBeaconReq((v_PVOID_t)sapContext);
4427 }
Ravi Joshi308c88e2013-12-13 22:52:22 -08004428 }
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004429 }
kaliu497513f2016-07-18 18:31:47 +08004430 else if (msg == eSAP_HDD_STOP_INFRA_BSS)
4431 {
4432 /* Transition from eSAP_STARTING to eSAP_DISCONNECTPENDING */
4433 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, from state %s => %s",
4434 __func__, "eSAP_STARTING", "eSAP_DISCONNECTPENDING");
4435 sapContext->sapsMachine = eSAP_DISCONNECTPENDING;
4436 }
4437 else if (msg == eSAP_MAC_START_FAILS)
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004438 {
Ryan Hsu807a20e2014-05-08 02:08:33 -07004439 /*Transition from eSAP_STARTING to eSAP_DISCONNECTED (both without substates)*/
kaliu497513f2016-07-18 18:31:47 +08004440 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
4441 "In %s, from state %s => %s", __func__,
4442 "eSAP_STARTING", "eSAP_DISCONNECTED");
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004443
4444 /*Advance outer statevar */
4445 sapContext->sapsMachine = eSAP_DISCONNECTED;
kaliu497513f2016-07-18 18:31:47 +08004446 vosStatus = sapSignalHDDevent(sapContext, NULL,
4447 eSAP_START_BSS_EVENT,
4448 (v_PVOID_t)eSAP_STATUS_FAILURE);
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004449 vosStatus = sapGotoDisconnected(sapContext);
4450 /* Close the SME session*/
4451
4452 if (eSAP_TRUE == sapContext->isSapSessionOpen)
4453 {
4454 tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx);
4455 if (NULL == hHal)
4456 {
4457 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
4458 "In %s, NULL hHal in state %s, msg %d",
4459 __func__, "eSAP_STARTING", msg);
4460 }
4461 else if (eHAL_STATUS_SUCCESS ==
krunal sonib1a4f532014-06-18 16:19:49 -07004462 sap_CloseSession(hHal,
4463 sapContext, NULL, FALSE))
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004464 {
4465 sapContext->isSapSessionOpen = eSAP_FALSE;
4466 }
4467 }
4468 }
Ravi Joshi308c88e2013-12-13 22:52:22 -08004469 else if (msg == eSAP_OPERATING_CHANNEL_CHANGED)
4470 {
4471 /* The operating channel has changed, update hostapd */
4472 sapContext->channel =
krunal sonib1a4f532014-06-18 16:19:49 -07004473 (tANI_U8)pMac->sap.SapDfsInfo.target_channel;
Manikandan Mohan32488a62015-04-05 20:15:03 -07004474 sapContext->sapsMachine = eSAP_STARTED;
Ravi Joshi308c88e2013-12-13 22:52:22 -08004475
4476 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
4477 "In %s, from state %s => %s",
4478 __func__, "eSAP_STARTING", "eSAP_STARTED");
4479
4480 /* Indicate change in the state to upper layers */
4481 vosStatus = sapSignalHDDevent(sapContext, roamInfo,
4482 eSAP_START_BSS_EVENT,
4483 (v_PVOID_t)eSAP_STATUS_SUCCESS);
4484 }
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004485 else
4486 {
4487 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
4488 "In %s, in state %s, invalid event msg %d",
4489 __func__, "eSAP_STARTING", msg);
4490 /* Intentionally left blank */
4491 }
4492 break;
kaliu497513f2016-07-18 18:31:47 +08004493 case eSAP_DISCONNECTPENDING:
4494 /* eSAP_DISCONNECTPENDING is state for handling SAP Disconnection
4495 * when DUT is in eSAP_STARTING state. Should not used for OTHER
4496 * purpose.
4497 */
4498 if (msg == eSAP_MAC_START_BSS_SUCCESS) {
4499 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
4500 "In %s, from state %s => %s", __func__,
4501 "eSAP_DISCONNECTPENDING", "eSAP_DISCONNECTING");
4502 sapContext->sapsMachine = eSAP_DISCONNECTING;
4503 vosStatus = sapSignalHDDevent(sapContext, NULL,
4504 eSAP_START_BSS_EVENT,
4505 (v_PVOID_t)eSAP_STATUS_FAILURE);
4506 vosStatus = sapGotoDisconnecting(sapContext);
4507 } else if (msg == eSAP_MAC_START_FAILS) {
4508 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
4509 "In %s, from state %s => %s", __func__,
4510 "eSAP_DISCONNECTPENDING", "eSAP_DISCONNECTED");
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004511
kaliu497513f2016-07-18 18:31:47 +08004512 sapContext->sapsMachine = eSAP_DISCONNECTED;
4513 vosStatus = sapSignalHDDevent(sapContext, NULL,
4514 eSAP_START_BSS_EVENT,
4515 (v_PVOID_t)eSAP_STATUS_FAILURE);
4516 vosStatus = sapGotoDisconnected(sapContext);
4517 if (eSAP_TRUE == sapContext->isSapSessionOpen)
4518 {
4519 tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx);
4520 if (NULL == hHal)
4521 {
4522 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
4523 "In %s, NULL hHal in state %s, msg %d",
4524 __func__, "eSAP_DISCONNECTPENDING", msg);
4525 }
4526 else if (eHAL_STATUS_SUCCESS ==
4527 sap_CloseSession(hHal, sapContext, NULL, FALSE))
4528 {
4529 sapContext->isSapSessionOpen = eSAP_FALSE;
4530 }
4531 }
4532 } else {
4533 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
4534 "In %s, in state %s, invalid event msg %d",
4535 __func__, "eSAP_DISCONNECTPENDING", msg);
4536 }
4537 break;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004538 case eSAP_STARTED:
4539 if (msg == eSAP_HDD_STOP_INFRA_BSS)
4540 {
4541 /* Transition from eSAP_STARTED to eSAP_DISCONNECTING (both without substates) */
4542 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, from state %s => %s",
4543 __func__, "eSAP_STARTED", "eSAP_DISCONNECTING");
4544 sapContext->sapsMachine = eSAP_DISCONNECTING;
4545 vosStatus = sapGotoDisconnecting(sapContext);
4546 }
Ravi Joshi308c88e2013-12-13 22:52:22 -08004547 else if (eSAP_DFS_CHNL_SWITCH_ANNOUNCEMENT_START == msg)
4548 {
krunal sonib1a4f532014-06-18 16:19:49 -07004549 v_U8_t intf;
Ravi Joshi308c88e2013-12-13 22:52:22 -08004550 /* Radar is seen on the current operating channel
4551 * send CSA IE for all associated stations
4552 */
krunal sonib1a4f532014-06-18 16:19:49 -07004553 if (pMac != NULL)
4554 {
4555 /* Request for CSA IE transmission */
4556 for ( intf = 0; intf < SAP_MAX_NUM_SESSION; intf++)
4557 {
4558 ptSapContext pSapContext;
4559
Chandrasekaran, Manishekara9347172015-01-13 22:51:53 +05304560 if (((VOS_STA_SAP_MODE ==
4561 pMac->sap.sapCtxList [intf].sapPersona) ||
4562 (VOS_P2P_GO_MODE ==
4563 pMac->sap.sapCtxList [intf].sapPersona)) &&
krunal sonib1a4f532014-06-18 16:19:49 -07004564 pMac->sap.sapCtxList [intf].pSapContext != NULL )
4565 {
4566 pSapContext = pMac->sap.sapCtxList [intf].pSapContext;
4567 VOS_TRACE(VOS_MODULE_ID_SAP,
4568 VOS_TRACE_LEVEL_INFO_MED,
Jeff Johnson1c11fdf2017-09-18 11:02:47 -07004569 "sapdfs: Sending CSAIE for sapctx[%pK]",
krunal sonib1a4f532014-06-18 16:19:49 -07004570 pSapContext);
4571
4572 vosStatus =
4573 WLANSAP_DfsSendCSAIeRequest((v_PVOID_t)pSapContext);
4574 }
4575 }
4576 }
Hong Shid5049e92017-02-11 00:53:55 +08004577 } else if (eSAP_MAC_SCAN_COMPLETE == msg) {
4578 if (!sapContext->acs_cfg->acs_mode) {
4579 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
4580 "In %s, not a in ACS mode", __func__);
4581 return VOS_STATUS_E_INVAL;
4582 }
4583
4584 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
4585 "In %s, ACS scan complete in state %s",
4586 __func__,
4587 "eSAP_STARTED");
4588
4589 if (!roamInfo) {
4590 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
4591 "In %s, roam info can't be NULL",
4592 __func__);
4593 return VOS_STATUS_E_INVAL;
4594 }
4595
4596 vosStatus = sap_relaunch_acs_result_handler(sapContext,
4597 roamInfo);
Ravi Joshi308c88e2013-12-13 22:52:22 -08004598 }
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004599 else
4600 {
4601 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, "In %s, in state %s, invalid event msg %d",
4602 __func__, "eSAP_STARTED", msg);
4603 }
4604 break;
4605
4606 case eSAP_DISCONNECTING:
4607 if (msg == eSAP_MAC_READY_FOR_CONNECTIONS)
4608 {
4609 /* Transition from eSAP_DISCONNECTING to eSAP_DISCONNECTED (both without substates) */
4610 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH, "In %s, from state %s => %s",
4611 __func__, "eSAP_DISCONNECTING", "eSAP_DISCONNECTED");
4612
4613 sapContext->sapsMachine = eSAP_DISCONNECTED;
Ryan Hsu807a20e2014-05-08 02:08:33 -07004614
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004615 /* Close the SME session*/
4616 if (eSAP_TRUE == sapContext->isSapSessionOpen)
4617 {
4618 tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx);
4619
4620 if (NULL == hHal)
4621 {
4622 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
4623 "In %s, NULL hHal in state %s, msg %d",
4624 __func__, "eSAP_DISCONNECTING", msg);
4625 }
4626 else
4627 {
4628 sapContext->isSapSessionOpen = eSAP_FALSE;
Agrawal Ashish3ca03b32016-03-09 18:59:04 +05304629 if (!(eHAL_STATUS_SUCCESS ==
krunal sonib1a4f532014-06-18 16:19:49 -07004630 sap_CloseSession(hHal,
4631 sapContext,
4632 sapRoamSessionCloseCallback, TRUE)))
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004633 {
4634 vosStatus = sapSignalHDDevent(sapContext, NULL,
4635 eSAP_STOP_BSS_EVENT,
4636 (v_PVOID_t) eSAP_STATUS_SUCCESS);
4637 }
4638 }
4639 }
4640 }
Ravi Joshi308c88e2013-12-13 22:52:22 -08004641 else if (msg == eWNI_SME_CHANNEL_CHANGE_REQ)
4642 {
krunal sonib1a4f532014-06-18 16:19:49 -07004643 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_MED,
Jeff Johnson1c11fdf2017-09-18 11:02:47 -07004644 "sapdfs: Send channel change request on sapctx[%pK]",
krunal sonib1a4f532014-06-18 16:19:49 -07004645 sapContext);
Ravi Joshi308c88e2013-12-13 22:52:22 -08004646 /* Most likely, radar has been detected and SAP wants to
4647 * change the channel
4648 */
krunal sonib1a4f532014-06-18 16:19:49 -07004649 vosStatus = WLANSAP_ChannelChangeRequest((v_PVOID_t)sapContext,
4650 pMac->sap.SapDfsInfo.target_channel);
Ravi Joshi308c88e2013-12-13 22:52:22 -08004651
krunal sonib1a4f532014-06-18 16:19:49 -07004652 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
4653 "In %s, Sending DFS eWNI_SME_CHANNEL_CHANGE_REQ",
4654 __func__);
Ravi Joshi308c88e2013-12-13 22:52:22 -08004655 }
Liangwei Dong6a23bd02016-01-08 05:18:05 -05004656 else if (msg == eWNI_SME_CHANNEL_CHANGE_RSP)
4657 {
4658 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_MED,
4659 "In %s, in state %s, event msg %d result %d",
4660 __func__, "eSAP_DISCONNECTING ", msg, sapEvent->u2);
4661
4662 if (sapEvent->u2 == eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE)
4663 {
4664 vosStatus = sapGotoDisconnecting(sapContext);
4665 }
4666 }
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004667 else
4668 {
4669 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
4670 "In %s, in state %s, invalid event msg %d",
4671 __func__, "eSAP_DISCONNECTING", msg);
4672 }
4673 break;
4674 }
4675 return vosStatus;
4676}// sapFsm
4677
4678
4679eSapStatus
4680sapconvertToCsrProfile(tsap_Config_t *pconfig_params, eCsrRoamBssType bssType, tCsrRoamProfile *profile)
4681{
4682 //Create Roam profile for SoftAP to connect
4683 profile->BSSType = eCSR_BSS_TYPE_INFRA_AP;
4684 profile->SSIDs.numOfSSIDs = 1;
4685 profile->csrPersona = pconfig_params->persona;
Kiran Kumar Lokered51a9972014-01-09 13:36:51 -08004686 profile->disableDFSChSwitch = pconfig_params->disableDFSChSwitch;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004687
4688 vos_mem_zero(profile->SSIDs.SSIDList[0].SSID.ssId,
4689 sizeof(profile->SSIDs.SSIDList[0].SSID.ssId));
4690
4691 //Flag to not broadcast the SSID information
4692 profile->SSIDs.SSIDList[0].ssidHidden = pconfig_params->SSIDinfo.ssidHidden;
4693
4694 profile->SSIDs.SSIDList[0].SSID.length = pconfig_params->SSIDinfo.ssid.length;
4695 vos_mem_copy(&profile->SSIDs.SSIDList[0].SSID.ssId, pconfig_params->SSIDinfo.ssid.ssId,
4696 sizeof(pconfig_params->SSIDinfo.ssid.ssId));
4697
4698 profile->negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
4699
4700 if (pconfig_params->authType == eSAP_OPEN_SYSTEM)
4701 {
4702 profile->negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
4703 }
4704 else if (pconfig_params->authType == eSAP_SHARED_KEY)
4705 {
4706 profile->negotiatedAuthType = eCSR_AUTH_TYPE_SHARED_KEY;
4707 }
4708 else
4709 {
4710 profile->negotiatedAuthType = eCSR_AUTH_TYPE_AUTOSWITCH;
4711 }
4712
4713 profile->AuthType.numEntries = 1;
4714 profile->AuthType.authType[0] = eCSR_AUTH_TYPE_OPEN_SYSTEM;
4715
4716 //Always set the Encryption Type
4717 profile->EncryptionType.numEntries = 1;
4718 profile->EncryptionType.encryptionType[0] = pconfig_params->RSNEncryptType;
4719
4720 profile->mcEncryptionType.numEntries = 1;
4721 profile->mcEncryptionType.encryptionType[0] = pconfig_params->mcRSNEncryptType;
4722
4723 if (pconfig_params->privacy & eSAP_SHARED_KEY)
4724 {
4725 profile->AuthType.authType[0] = eCSR_AUTH_TYPE_SHARED_KEY;
4726 }
4727
4728 profile->privacy = pconfig_params->privacy;
4729 profile->fwdWPSPBCProbeReq = pconfig_params->fwdWPSPBCProbeReq;
4730
4731 if (pconfig_params->authType == eSAP_SHARED_KEY)
4732 {
4733 profile->csr80211AuthType = eSIR_SHARED_KEY;
4734 }
4735 else if (pconfig_params->authType == eSAP_OPEN_SYSTEM)
4736 {
4737 profile->csr80211AuthType = eSIR_OPEN_SYSTEM;
4738 }
4739 else
4740 {
4741 profile->csr80211AuthType = eSIR_AUTO_SWITCH;
4742 }
4743
4744 //Initialize we are not going to use it
4745 profile->pWPAReqIE = NULL;
4746 profile->nWPAReqIELength = 0;
4747
4748 //set the RSN/WPA IE
4749 profile->pRSNReqIE = NULL;
4750 profile->nRSNReqIELength = pconfig_params->RSNWPAReqIELength;
4751 if (pconfig_params->RSNWPAReqIELength)
4752 {
4753 profile->pRSNReqIE = vos_mem_malloc(pconfig_params->RSNWPAReqIELength);
4754 if( NULL == profile->pRSNReqIE )
4755 {
4756 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR, " %s Fail to alloc memory", __func__);
4757 return eSAP_STATUS_FAILURE;
4758 }
Mahesh Kumar Kalikot Veetil16ec4622014-05-28 11:26:42 -07004759 vos_mem_copy(profile->pRSNReqIE, pconfig_params->RSNWPAReqIE,
4760 pconfig_params->RSNWPAReqIELength);
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004761 profile->nRSNReqIELength = pconfig_params->RSNWPAReqIELength;
4762 }
4763
4764 // Turn off CB mode
4765 profile->CBMode = eCSR_CB_OFF;
4766
4767 //set the phyMode to accept anything
4768 //Best means everything because it covers all the things we support
Rakesh Sunkidacec202014-10-23 18:12:35 -07004769 /*eCSR_DOT11_MODE_BEST*/
Krishna Kumaar Natarajan9f4ef202014-12-11 14:56:40 -08004770 profile->phyMode = pconfig_params->SapHw_mode;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004771
4772 //Configure beaconInterval
4773 profile->beaconInterval = (tANI_U16)pconfig_params->beacon_int;
4774
4775 // set DTIM period
4776 profile->dtimPeriod = pconfig_params->dtim_period;
4777
4778 //set Uapsd enable bit
4779 profile->ApUapsdEnable = pconfig_params->UapsdEnable;
4780
4781 //Enable protection parameters
4782 profile->protEnabled = pconfig_params->protEnabled;
4783 profile->obssProtEnabled = pconfig_params->obssProtEnabled;
4784 profile->cfg_protection = pconfig_params->ht_capab;
4785
4786 //country code
4787 if (pconfig_params->countryCode[0])
4788 vos_mem_copy(profile->countryCode, pconfig_params->countryCode, WNI_CFG_COUNTRY_CODE_LEN);
4789 profile->ieee80211d = pconfig_params->ieee80211d;
4790 //wps config info
4791 profile->wps_state = pconfig_params->wps_state;
4792
krunal soni68458902014-03-24 11:45:13 -07004793#ifdef WLAN_FEATURE_11W
4794 // MFP capable/required
4795 profile->MFPCapable = pconfig_params->mfpCapable ? 1 : 0;
4796 profile->MFPRequired = pconfig_params->mfpRequired ? 1 : 0;
4797#endif
4798
Kalikinkar dharae282c3f2014-07-06 15:58:07 -07004799 if (pconfig_params->probeRespIEsBufferLen > 0 &&
4800 pconfig_params->pProbeRespIEsBuffer != NULL)
Kalikinkar dhara1aefffd2014-05-29 20:40:03 -07004801 {
Kalikinkar dharae282c3f2014-07-06 15:58:07 -07004802 profile->addIeParams.probeRespDataLen =
4803 pconfig_params->probeRespIEsBufferLen;
4804 profile->addIeParams.probeRespData_buff =
4805 pconfig_params->pProbeRespIEsBuffer;
Kalikinkar dhara1aefffd2014-05-29 20:40:03 -07004806 }
4807 else
4808 {
Kalikinkar dharae282c3f2014-07-06 15:58:07 -07004809 profile->addIeParams.probeRespDataLen = 0;
4810 profile->addIeParams.probeRespData_buff = NULL;
Kalikinkar dhara1aefffd2014-05-29 20:40:03 -07004811 }
Kalikinkar dharae282c3f2014-07-06 15:58:07 -07004812 /*assoc resp IE */
4813 if (pconfig_params->assocRespIEsLen > 0 &&
4814 pconfig_params->pAssocRespIEsBuffer != NULL)
4815 {
4816 profile->addIeParams.assocRespDataLen =
4817 pconfig_params->assocRespIEsLen;
4818 profile->addIeParams.assocRespData_buff =
4819 pconfig_params->pAssocRespIEsBuffer;
4820 }
4821 else
4822 {
4823 profile->addIeParams.assocRespDataLen = 0;
4824 profile->addIeParams.assocRespData_buff = NULL;
4825 }
4826
4827 if (pconfig_params->probeRespBcnIEsLen > 0 &&
4828 pconfig_params->pProbeRespBcnIEsBuffer!= NULL)
4829 {
4830 profile->addIeParams.probeRespBCNDataLen =
4831 pconfig_params->probeRespBcnIEsLen;
4832 profile->addIeParams.probeRespBCNData_buff =
4833 pconfig_params->pProbeRespBcnIEsBuffer;
4834 }
4835 else
4836 {
4837 profile->addIeParams.probeRespBCNDataLen = 0;
4838 profile->addIeParams.probeRespBCNData_buff = NULL;
4839 }
Krishna Kumaar Natarajan9da94792015-01-16 17:46:06 -08004840 profile->sap_dot11mc = pconfig_params->sap_dot11mc;
Kalikinkar dharae282c3f2014-07-06 15:58:07 -07004841
Agrawal Ashish329c3372016-05-23 18:07:17 +05304842 if (pconfig_params->supported_rates.numRates) {
4843 vos_mem_copy(profile->supported_rates.rate,
4844 pconfig_params->supported_rates.rate,
4845 pconfig_params->supported_rates.numRates);
4846 profile->supported_rates.numRates =
4847 pconfig_params->supported_rates.numRates;
4848 }
4849
4850 if (pconfig_params->extended_rates.numRates) {
4851 vos_mem_copy(profile->extended_rates.rate,
4852 pconfig_params->extended_rates.rate,
4853 pconfig_params->extended_rates.numRates);
4854 profile->extended_rates.numRates =
4855 pconfig_params->extended_rates.numRates;
4856 }
4857
Kalikinkar dharae282c3f2014-07-06 15:58:07 -07004858 return eSAP_STATUS_SUCCESS; /* Success. */
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004859}
4860
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004861void sapFreeRoamProfile(tCsrRoamProfile *profile)
4862{
4863 if(profile->pRSNReqIE)
4864 {
4865 vos_mem_free(profile->pRSNReqIE);
4866 profile->pRSNReqIE = NULL;
4867 }
4868}
4869
4870
4871void
4872sapSortMacList(v_MACADDR_t *macList, v_U8_t size)
4873{
4874 v_U8_t outer, inner;
4875 v_MACADDR_t temp;
4876 v_SINT_t nRes = -1;
4877
Krishna Kumaar Natarajan96634a22015-02-13 17:48:26 -08004878 if ((NULL == macList) || (size > MAX_ACL_MAC_ADDRESS)) {
4879 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
4880 FL("either buffer is NULL or size = %d is more."), size);
Kalikinkar dhara00f3cd12014-03-25 18:22:00 -07004881 return;
4882 }
4883
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004884 for(outer = 0; outer < size; outer++)
4885 {
4886 for(inner = 0; inner < size - 1; inner++)
4887 {
4888 nRes = vos_mem_compare2((macList + inner)->bytes, (macList + inner + 1)->bytes, sizeof(v_MACADDR_t));
4889 if (nRes > 0)
4890 {
4891 vos_mem_copy(temp.bytes, (macList + inner + 1)->bytes, sizeof(v_MACADDR_t));
4892 vos_mem_copy((macList + inner + 1)->bytes, (macList + inner)->bytes, sizeof(v_MACADDR_t));
4893 vos_mem_copy((macList + inner)->bytes, temp.bytes, sizeof(v_MACADDR_t));
4894 }
4895 }
4896 }
4897}
4898
4899eSapBool
4900sapSearchMacList(v_MACADDR_t *macList, v_U8_t num_mac, v_U8_t *peerMac, v_U8_t *index)
4901{
4902 v_SINT_t nRes = -1;
4903 v_S7_t nStart = 0, nEnd, nMiddle;
4904 nEnd = num_mac - 1;
4905
Krishna Kumaar Natarajan96634a22015-02-13 17:48:26 -08004906 if ((NULL == macList) || (num_mac > MAX_ACL_MAC_ADDRESS)) {
4907 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
4908 FL("either buffer is NULL or size = %d is more."),
4909 num_mac);
4910 return eSAP_FALSE;
4911 }
4912
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004913 while (nStart <= nEnd)
4914 {
4915 nMiddle = (nStart + nEnd) / 2;
4916 nRes = vos_mem_compare2(&macList[nMiddle], peerMac, sizeof(v_MACADDR_t));
4917
4918 if (0 == nRes)
4919 {
4920 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
4921 "search SUCC");
4922 // "index equals NULL" means the caller does not need the
4923 // index value of the peerMac being searched
4924 if (index != NULL)
4925 {
4926 *index = (v_U8_t) nMiddle;
4927 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
4928 "index %d", *index);
4929 }
4930 return eSAP_TRUE;
4931 }
4932 if (nRes < 0)
4933 nStart = nMiddle + 1;
4934 else
4935 nEnd = nMiddle - 1;
4936 }
4937
4938 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
4939 "search not succ");
4940 return eSAP_FALSE;
4941}
4942
4943void
4944sapAddMacToACL(v_MACADDR_t *macList, v_U8_t *size, v_U8_t *peerMac)
4945{
4946 v_SINT_t nRes = -1;
4947 int i;
Krishna Kumaar Natarajan96634a22015-02-13 17:48:26 -08004948
Mahesh A Saptasagarc04dfd02015-05-06 12:03:07 +05304949 if ((NULL == macList) || (*size > MAX_ACL_MAC_ADDRESS)) {
Krishna Kumaar Natarajan96634a22015-02-13 17:48:26 -08004950 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
4951 FL("either buffer is NULL or size = %d is incorrect."),
4952 *size);
4953 return;
4954 }
4955
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004956 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,"add acl entered");
4957 for (i=((*size)-1); i>=0; i--)
4958 {
4959 nRes = vos_mem_compare2(&macList[i], peerMac, sizeof(v_MACADDR_t));
4960 if (nRes > 0)
4961 {
4962 /* Move alphabetically greater mac addresses one index down to allow for insertion
4963 of new mac in sorted order */
4964 vos_mem_copy((macList+i+1)->bytes,(macList+i)->bytes, sizeof(v_MACADDR_t));
4965 }
4966 else
4967 {
4968 break;
4969 }
4970 }
4971 //This should also take care of if the element is the first to be added in the list
4972 vos_mem_copy((macList+i+1)->bytes, peerMac, sizeof(v_MACADDR_t));
4973 // increment the list size
4974 (*size)++;
4975}
4976
4977void
4978sapRemoveMacFromACL(v_MACADDR_t *macList, v_U8_t *size, v_U8_t index)
4979{
4980 int i;
4981 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,"remove acl entered");
4982 /* return if the list passed is empty. Ideally this should never happen since this funcn is always
4983 called after sapSearchMacList to get the index of the mac addr to be removed and this will
4984 only get called if the search is successful. Still no harm in having the check */
Krishna Kumaar Natarajan96634a22015-02-13 17:48:26 -08004985 if ((NULL == macList) || (*size == 0) || (*size > MAX_ACL_MAC_ADDRESS)) {
4986 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
4987 FL("either buffer is NULL or size = %d is incorrect"),
4988 *size);
Masti, Narayanraddi2d67c732015-02-16 16:38:42 +05304989 return;
4990 }
4991
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07004992 for (i=index; i<((*size)-1); i++)
4993 {
4994 /* Move mac addresses starting from "index" passed one index up to delete the void
4995 created by deletion of a mac address in ACL */
4996 vos_mem_copy((macList+i)->bytes,(macList+i+1)->bytes, sizeof(v_MACADDR_t));
4997 }
4998 // The last space should be made empty since all mac addesses moved one step up
4999 vos_mem_zero((macList+(*size)-1)->bytes, sizeof(v_MACADDR_t));
5000 //reduce the list size by 1
5001 (*size)--;
5002}
5003
5004void sapPrintACL(v_MACADDR_t *macList, v_U8_t size)
5005{
5006 int i;
Arif Hussain1905c732013-12-11 12:09:18 -08005007 v_BYTE_t *macArray;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07005008 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,"print acl entered");
Kalikinkar dhara00f3cd12014-03-25 18:22:00 -07005009
5010 if ((NULL == macList) || (size == 0) || (size >= MAX_ACL_MAC_ADDRESS))
5011 {
5012 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
5013 "In %s, either buffer is NULL or size %d is incorrect."
5014 , __func__, size);
5015 return;
5016 }
5017
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07005018 for (i=0; i<size; i++)
5019 {
Arif Hussain1905c732013-12-11 12:09:18 -08005020 macArray = (macList+i)->bytes;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07005021 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
Arif Hussain1905c732013-12-11 12:09:18 -08005022 "** ACL entry %i - "MAC_ADDRESS_STR, i,
5023 MAC_ADDR_ARRAY(macArray));
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07005024 }
5025 return;
5026}
5027
5028VOS_STATUS
5029sapIsPeerMacAllowed(ptSapContext sapContext, v_U8_t *peerMac)
5030{
5031 if (eSAP_ALLOW_ALL == sapContext->eSapMacAddrAclMode)
5032 return VOS_STATUS_SUCCESS;
5033
5034 if (sapSearchMacList(sapContext->acceptMacList, sapContext->nAcceptMac, peerMac, NULL))
5035 return VOS_STATUS_SUCCESS;
5036
5037 if (sapSearchMacList(sapContext->denyMacList, sapContext->nDenyMac, peerMac, NULL))
5038 {
Arif Hussain1905c732013-12-11 12:09:18 -08005039 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
5040 "In %s, Peer "MAC_ADDRESS_STR" in deny list",
5041 __func__, MAC_ADDR_ARRAY(peerMac));
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07005042 return VOS_STATUS_E_FAILURE;
5043 }
5044
5045 // A new station CAN associate, unless in deny list. Less stringent mode
5046 if (eSAP_ACCEPT_UNLESS_DENIED == sapContext->eSapMacAddrAclMode)
5047 return VOS_STATUS_SUCCESS;
5048
5049 // A new station CANNOT associate, unless in accept list. More stringent mode
5050 if (eSAP_DENY_UNLESS_ACCEPTED == sapContext->eSapMacAddrAclMode)
5051 {
Arif Hussain1905c732013-12-11 12:09:18 -08005052 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
5053 "In %s, Peer "MAC_ADDRESS_STR" denied, Mac filter mode is eSAP_DENY_UNLESS_ACCEPTED",
5054 __func__, MAC_ADDR_ARRAY(peerMac));
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07005055 return VOS_STATUS_E_FAILURE;
5056 }
5057
5058 /* The new STA is neither in accept list nor in deny list. In this case, deny the association
5059 * but send a wifi event notification indicating the mac address being denied
5060 */
5061 if (eSAP_SUPPORT_ACCEPT_AND_DENY == sapContext->eSapMacAddrAclMode)
5062 {
5063 sapSignalHDDevent(sapContext, NULL, eSAP_UNKNOWN_STA_JOIN, (v_PVOID_t)peerMac);
Arif Hussain1905c732013-12-11 12:09:18 -08005064 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_HIGH,
5065 "In %s, Peer "MAC_ADDRESS_STR" denied, Mac filter mode is eSAP_SUPPORT_ACCEPT_AND_DENY",
5066 __func__, MAC_ADDR_ARRAY(peerMac));
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07005067 return VOS_STATUS_E_FAILURE;
5068 }
5069 return VOS_STATUS_SUCCESS;
5070}
5071
5072#ifdef SOFTAP_CHANNEL_RANGE
5073static VOS_STATUS sapGetChannelList(ptSapContext sapContext,
5074 v_U8_t **channelList, v_U8_t *numberOfChannels)
5075{
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07005076 v_U8_t loopCount;
5077 v_U8_t *list;
5078 v_U8_t channelCount;
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05305079 v_U8_t startChannelNum, bandStartChannel;
5080 v_U8_t endChannelNum, bandEndChannel ;
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07005081 v_U32_t enableLTECoex;
5082 tHalHandle hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx);
Xun Luoa18da142014-04-08 15:08:23 -07005083#ifdef FEATURE_WLAN_CH_AVOID
5084 v_U8_t i;
5085#endif
Amar Singhal6ad16772014-10-06 12:21:32 -07005086 tpAniSirGlobal pmac = PMAC_STRUCT(hHal);
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07005087
5088 if (NULL == hHal)
5089 {
5090 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
5091 "Invalid HAL pointer from pvosGCtx on sapGetChannelList");
5092 *numberOfChannels = 0;
5093 *channelList = NULL;
5094 return VOS_STATUS_E_FAULT;
5095 }
5096
Peng Xudaa81292014-01-08 11:52:31 -08005097 if ( eCSR_BAND_ALL == sapContext->scanBandPreference)
5098 {
Manikandan Mohan32488a62015-04-05 20:15:03 -07005099 startChannelNum = sapContext->acs_cfg->start_ch;
5100 endChannelNum = sapContext->acs_cfg->end_ch;
5101 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
5102 "%s: startChannel %d, EndChannel %d, HW:%d",
5103 __func__, startChannelNum, endChannelNum,
5104 sapContext->acs_cfg->hw_mode);
5105
5106 WLANSAP_extend_to_acs_range(&startChannelNum, &endChannelNum,
5107 &bandStartChannel, &bandEndChannel);
Peng Xudaa81292014-01-08 11:52:31 -08005108
5109 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO,
Manikandan Mohan32488a62015-04-05 20:15:03 -07005110 "%s: expanded startChannel %d,EndChannel %d",
5111 __func__,startChannelNum,endChannelNum);
Peng Xudaa81292014-01-08 11:52:31 -08005112 }
5113 else
5114 {
5115 if ( sapContext->allBandScanned == eSAP_FALSE )
5116 {
5117 //first band scan
5118 sapContext->currentPreferredBand = sapContext->scanBandPreference;
5119 }
5120 else
5121 {
5122 //scan next band
5123 if ( eCSR_BAND_24 == sapContext->scanBandPreference )
5124 sapContext->currentPreferredBand = eCSR_BAND_5G;
5125 else
5126 sapContext->currentPreferredBand = eCSR_BAND_24;
5127 }
5128 switch(sapContext->currentPreferredBand)
5129 {
5130 case eCSR_BAND_24:
5131 bandStartChannel = RF_CHAN_1;
5132 bandEndChannel = RF_CHAN_14;
5133 startChannelNum = 1;
5134 endChannelNum = 14;
5135 break;
5136
5137 case eCSR_BAND_5G:
5138 bandStartChannel = RF_CHAN_36;
5139 bandEndChannel = RF_CHAN_165;
5140 startChannelNum = 36;
5141 endChannelNum = 165;
5142 break;
5143
5144 default:
5145 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
5146 "sapGetChannelList:bandPreference not valid ");
5147 /* assume 2.4 GHz */
5148 bandStartChannel = RF_CHAN_1;
5149 bandEndChannel = RF_CHAN_14;
5150 startChannelNum = 1;
5151 endChannelNum = 14;
5152 break;
5153 }
5154 }
5155
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07005156 ccmCfgGetInt(hHal, WNI_CFG_ENABLE_LTE_COEX, &enableLTECoex);
5157
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07005158 /*Check if LTE coex is enabled and 2.4GHz is selected*/
5159 if (enableLTECoex && (bandStartChannel == RF_CHAN_1)
5160 && (bandEndChannel == RF_CHAN_14))
5161 {
5162 /*Set 2.4GHz upper limit to channel 9 for LTE COEX*/
5163 bandEndChannel = RF_CHAN_9;
5164 }
5165 /* Allocate the max number of channel supported */
5166 list = (v_U8_t *)vos_mem_malloc(NUM_5GHZ_CHANNELS);
5167 if (NULL == list)
5168 {
5169 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
5170 "%s: Unable to allocate channel list", __func__);
5171 *numberOfChannels = 0;
5172 *channelList = NULL;
5173 return VOS_STATUS_E_RESOURCES;
5174 }
5175
5176 /*Search for the Active channels in the given range */
5177 channelCount = 0;
5178 for( loopCount = bandStartChannel; loopCount <= bandEndChannel; loopCount++ )
5179 {
5180 if((startChannelNum <= rfChannels[loopCount].channelNum)&&
5181 (endChannelNum >= rfChannels[loopCount].channelNum ))
5182 {
Amar Singhal6ad16772014-10-06 12:21:32 -07005183 if (((TRUE == pmac->scan.fEnableDFSChnlScan) &&
5184 (regChannels[loopCount].enabled)) ||
5185 ((FALSE == pmac->scan.fEnableDFSChnlScan) &&
5186 (NV_CHANNEL_ENABLE == regChannels[loopCount].enabled)))
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07005187 {
Xun Luoa18da142014-04-08 15:08:23 -07005188#ifdef FEATURE_WLAN_CH_AVOID
5189 for( i = 0; i < NUM_20MHZ_RF_CHANNELS; i++ )
5190 {
5191 if( (safeChannels[i].channelNumber ==
5192 rfChannels[loopCount].channelNum) )
5193 {
5194 /* Check if channel is safe */
5195 if(VOS_TRUE == safeChannels[i].isSafe)
5196 {
5197#endif
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05305198#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
5199 v_U8_t ch;
5200 ch = rfChannels[loopCount].channelNum;
Manikandan Mohan32488a62015-04-05 20:15:03 -07005201 if ((sapContext->acs_cfg->skip_scan_status
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05305202 == eSAP_DO_PAR_ACS_SCAN)) {
Manikandan Mohan32488a62015-04-05 20:15:03 -07005203 if ((ch >= sapContext->acs_cfg->skip_scan_range1_stch &&
5204 ch <= sapContext->acs_cfg->skip_scan_range1_endch) ||
5205 (ch >= sapContext->acs_cfg->skip_scan_range2_stch &&
5206 ch <= sapContext->acs_cfg->skip_scan_range2_endch)) {
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05305207
5208 list[channelCount] =
5209 rfChannels[loopCount].channelNum;
5210 channelCount++;
5211 VOS_TRACE( VOS_MODULE_ID_SAP,
5212 VOS_TRACE_LEVEL_INFO,
5213 "%s:%d %d added to ACS ch range",
5214 __func__, channelCount, ch);
5215 } else
5216 VOS_TRACE( VOS_MODULE_ID_SAP,
5217 VOS_TRACE_LEVEL_INFO_HIGH,
5218 "%s:%d %d skipped from ACS ch range",
5219 __func__, channelCount, ch);
5220
5221 } else {
5222 list[channelCount] =
5223 rfChannels[loopCount].channelNum;
5224 channelCount++;
5225 VOS_TRACE( VOS_MODULE_ID_SAP,
5226 VOS_TRACE_LEVEL_INFO,
5227 "%s:%d %d added to ACS ch range",
5228 __func__, channelCount, ch);
5229 }
5230#else
Xun Luoa18da142014-04-08 15:08:23 -07005231 list[channelCount] =
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05305232 rfChannels[loopCount].channelNum;
Xun Luoa18da142014-04-08 15:08:23 -07005233 channelCount++;
Manikandan Mohanc5eda1d2014-09-02 21:08:03 +05305234#endif
Xun Luoa18da142014-04-08 15:08:23 -07005235#ifdef FEATURE_WLAN_CH_AVOID
5236 }
5237 break;
5238 }
5239 }
5240#endif
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07005241 }
5242 }
5243 }
5244 if (0 == channelCount)
5245 {
5246 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
5247 "sapGetChannelList:No active channels present in the given range for the current region");
5248 /*LTE COEX: channel range outside the restricted 2.4GHz band limits*/
5249 if (enableLTECoex && (startChannelNum > bandEndChannel))
5250 {
5251 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_FATAL,
5252 "sapGetChannelList:SAP cannot be started as LTE COEX restricted 2.4GHz limits");
5253 }
5254 }
5255
5256 /* return the channel list and number of channels to scan*/
5257 *numberOfChannels = channelCount;
5258 if(channelCount != 0)
5259 {
5260 *channelList = list;
5261 }
5262 else
5263 {
5264 *channelList = NULL;
5265 vos_mem_free(list);
5266 }
Peng Xudaa81292014-01-08 11:52:31 -08005267
5268 for (loopCount = 0; loopCount <channelCount; loopCount ++ )
5269 {
5270 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_DEBUG,
5271 "%s: channel number: %d",
5272 __func__,list[loopCount]);
5273 }
Madan Mohan Koyyalamudie32d2192013-09-28 23:54:37 -07005274 return VOS_STATUS_SUCCESS;
5275}
5276#endif
Ravi Joshia02f1d72013-12-13 22:52:22 -08005277
5278/*
5279 * Function for initializing list of 2.4/5 Ghz [NON-DFS/DFS]
5280 * available channels in the current regulatory domain.
5281 */
5282static VOS_STATUS sapGet5GHzChannelList(ptSapContext sapContext)
5283{
5284 v_U8_t count = 0;
5285 int i;
5286 if (NULL == sapContext)
5287 {
5288 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
5289 "Invalid sapContext pointer on sapGetChannelList");
5290 return VOS_STATUS_E_FAULT;
5291 }
5292
Ryan Hsudfa9c232014-06-17 02:17:40 -07005293 if (sapContext->SapAllChnlList.channelList) {
5294 vos_mem_free(sapContext->SapAllChnlList.channelList);
5295 sapContext->SapAllChnlList.channelList = NULL;
5296 }
5297
Ravi Joshia02f1d72013-12-13 22:52:22 -08005298 sapContext->SapAllChnlList.channelList =
Naveen Rawatb885df62014-08-25 19:53:15 -07005299 (tChannelInfo *)vos_mem_malloc(WNI_CFG_VALID_CHANNEL_LIST_LEN *
5300 sizeof(tChannelInfo));
Ravi Joshia02f1d72013-12-13 22:52:22 -08005301 if (NULL == sapContext->SapAllChnlList.channelList)
5302 {
5303 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
5304 " Memory Allocation failed sapGetChannelList");
5305 return VOS_STATUS_E_FAULT;
5306 }
5307
5308 for( i = RF_CHAN_36; i <= RF_CHAN_165; i++ )
5309 {
5310 if( regChannels[i].enabled == NV_CHANNEL_ENABLE ||
5311 regChannels[i].enabled == NV_CHANNEL_DFS )
5312 {
Naveen Rawatb885df62014-08-25 19:53:15 -07005313 sapContext->SapAllChnlList.channelList[count].channel =
Ravi Joshia02f1d72013-12-13 22:52:22 -08005314 rfChannels[i].channelNum;
5315 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
5316 "%s[%d] CHANNEL = %d",__func__, __LINE__,
Naveen Rawatb885df62014-08-25 19:53:15 -07005317 sapContext->SapAllChnlList.channelList[count].channel);
5318 sapContext->SapAllChnlList.channelList[count].valid = VOS_TRUE;
Ravi Joshia02f1d72013-12-13 22:52:22 -08005319 count++;
5320 }
5321 }
5322
5323 sapContext->SapAllChnlList.numChannel = count;
5324 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
5325 "%s[%d] NUMBER OF CHANNELS count = %d"
5326 "sapContext->SapAllChnlList.numChannel = %d",
5327 __func__,__LINE__,count,sapContext->SapAllChnlList.numChannel);
5328 return VOS_STATUS_SUCCESS;
5329}
5330
5331/*
5332 * This function randomly selects the channel to switch after the detection
5333 * of radar
5334 * param sapContext - sap context
5335 * dfs_event - Dfs information from DFS
5336 * return - channel to which AP wishes to switch
5337 */
Prashanth Bhatta9d2eac02014-06-06 13:13:32 -07005338v_U8_t sapIndicateRadar(ptSapContext sapContext, tSirSmeDfsEventInd *dfs_event)
Ravi Joshia02f1d72013-12-13 22:52:22 -08005339{
Ravi Joshia02f1d72013-12-13 22:52:22 -08005340 v_U8_t target_channel = 0;
krunal sonib1a4f532014-06-18 16:19:49 -07005341 tHalHandle hHal;
5342 tpAniSirGlobal pMac;
Ravi Joshia02f1d72013-12-13 22:52:22 -08005343
5344 if (NULL == sapContext || NULL == dfs_event)
5345 {
5346 /* Invalid sap context of dfs event passed */
5347 return 0;
5348 }
krunal sonib1a4f532014-06-18 16:19:49 -07005349 hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx);
5350
5351 if (NULL == hHal)
5352 {
5353 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
5354 "In %s invalid hHal", __func__);
5355 return 0;
5356 }
5357 pMac = PMAC_STRUCT( hHal );
Ravi Joshia02f1d72013-12-13 22:52:22 -08005358
5359 if (!dfs_event->dfs_radar_status)
5360 {
5361 /*dfs status does not indicate a radar on the channel-- False Alarm*/
5362 return 0;
5363 }
5364
AnjaneeDevi Kapparapuf488c2e2015-01-27 15:23:43 -08005365 /*
5366 * SAP needs to generate Channel Switch IE
5367 * if the radar is found in the STARTED state
5368 */
5369 if (eSAP_STARTED == sapContext->sapsMachine)
5370 pMac->sap.SapDfsInfo.csaIERequired = VOS_TRUE;
5371
Kiran Kumar Lokeref6868862014-01-16 00:05:57 -08005372 if (sapContext->csrRoamProfile.disableDFSChSwitch)
5373 {
5374 return sapContext->channel;
5375 }
5376
Ravi Joshia02f1d72013-12-13 22:52:22 -08005377 /* set the Radar Found flag in SapDfsInfo */
krunal sonib1a4f532014-06-18 16:19:49 -07005378 pMac->sap.SapDfsInfo.sap_radar_found_status = VOS_TRUE;
Ravi Joshia02f1d72013-12-13 22:52:22 -08005379
Ravi Joshia02f1d72013-12-13 22:52:22 -08005380 sapGet5GHzChannelList(sapContext);
Ravi Joshia02f1d72013-12-13 22:52:22 -08005381
Rakesh Sunki39aa7252014-07-29 20:42:48 -07005382 if (dfs_event->chan_list.nchannels > SIR_DFS_MAX_20M_SUB_CH) {
5383 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_WARN,
5384 FL("nchannels >SIR_DFS_MAX_20M_SUB_CH so resetting"));
5385 dfs_event->chan_list.nchannels = SIR_DFS_MAX_20M_SUB_CH;
5386 }
5387
Ryan Hsue9758412014-07-17 20:02:53 -07005388 sapMarkDfsChannels(sapContext, dfs_event->chan_list.channels,
5389 dfs_event->chan_list.nchannels, vos_get_monotonic_boottime());
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08005390
5391 /*
Ravi Joshia02f1d72013-12-13 22:52:22 -08005392 * (1) skip static turbo channel as it will require STA to be in
5393 * static turbo to work.
5394 * (2) skip channel which's marked with radar detction
5395 * (3) WAR: we allow user to config not to use any DFS channel
5396 * (4) When we pick a channel, skip excluded 11D channels
5397 * (5) Create the available channel list with the above rules
5398 */
5399
Ryan Hsu807a20e2014-05-08 02:08:33 -07005400 target_channel = sapRandomChannelSel(sapContext);
Naveen Rawatb885df62014-08-25 19:53:15 -07005401 if (0 == target_channel)
5402 {
5403 sapSignalHDDevent(sapContext, NULL, eSAP_DFS_NO_AVAILABLE_CHANNEL,
5404 (v_PVOID_t) eSAP_STATUS_SUCCESS);
5405 }
5406 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_WARN,
5407 FL("sapdfs: New selected target channel is [%d]"),
5408 target_channel);
Ryan Hsu807a20e2014-05-08 02:08:33 -07005409 return target_channel;
Ravi Joshia02f1d72013-12-13 22:52:22 -08005410}
5411
5412/*
5413 * CAC timer callback function.
5414 * Post eSAP_DFS_CHANNEL_CAC_END event to sapFsm().
5415 */
5416void sapDfsCacTimerCallback(void *data)
5417{
krunal soni466ec4e2014-06-26 19:53:39 -07005418 ptSapContext sapContext;
Ravi Joshia02f1d72013-12-13 22:52:22 -08005419 tWLAN_SAPEvent sapEvent;
krunal soni466ec4e2014-06-26 19:53:39 -07005420 tHalHandle hHal = (tHalHandle)data;
krunal sonib1a4f532014-06-18 16:19:49 -07005421 tpAniSirGlobal pMac;
5422
krunal sonib1a4f532014-06-18 16:19:49 -07005423 if (NULL == hHal)
5424 {
5425 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
5426 "In %s invalid hHal", __func__);
5427 return;
5428 }
5429 pMac = PMAC_STRUCT( hHal );
krunal soni466ec4e2014-06-26 19:53:39 -07005430 sapContext = sap_find_valid_concurrent_session(hHal);
5431
5432 if (NULL == sapContext)
5433 {
5434 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
5435 "In %s no SAP contexts are found", __func__);
5436 return;
5437 }
Ravi Joshia02f1d72013-12-13 22:52:22 -08005438
Naveen Rawat341e76c2016-03-21 17:44:53 -07005439 /*
5440 * SAP may not be in CAC wait state, when the timer runs out.
5441 * if following flag is set, then timer is in initialized state,
5442 * destroy timer here.
5443 */
5444 if (pMac->sap.SapDfsInfo.is_dfs_cac_timer_running == true) {
5445 vos_timer_destroy(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer);
5446 pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = false;
5447 }
Ravi Joshia02f1d72013-12-13 22:52:22 -08005448 /* Check to ensure that SAP is in DFS WAIT state*/
Ravi Joshi308c88e2013-12-13 22:52:22 -08005449 if (sapContext->sapsMachine == eSAP_DFS_CAC_WAIT)
Ravi Joshia02f1d72013-12-13 22:52:22 -08005450 {
Ravi Joshia02f1d72013-12-13 22:52:22 -08005451 /*
5452 * CAC Complete, post eSAP_DFS_CHANNEL_CAC_END to sapFsm
5453 */
krunal sonib1a4f532014-06-18 16:19:49 -07005454 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_MED,
Jeff Johnson1c11fdf2017-09-18 11:02:47 -07005455 "sapdfs: Sending eSAP_DFS_CHANNEL_CAC_END for target_channel = %d on sapctx[%pK]",
krunal sonib1a4f532014-06-18 16:19:49 -07005456 sapContext->channel, sapContext);
5457
Ravi Joshi308c88e2013-12-13 22:52:22 -08005458 sapEvent.event = eSAP_DFS_CHANNEL_CAC_END;
5459 sapEvent.params = 0;
5460 sapEvent.u1 = 0;
5461 sapEvent.u2 = 0;
Ravi Joshi308c88e2013-12-13 22:52:22 -08005462
Manikandan Mohan547f5f12014-04-16 18:02:47 -07005463 sapFsm(sapContext, &sapEvent);
Ravi Joshia02f1d72013-12-13 22:52:22 -08005464 }
Ravi Joshi308c88e2013-12-13 22:52:22 -08005465
Ravi Joshia02f1d72013-12-13 22:52:22 -08005466}
5467
5468/*
Ryan Hsuef962b32014-05-06 04:25:33 -07005469 * Function to stop the DFS CAC Timer
5470 */
5471static int sapStopDfsCacTimer(ptSapContext sapContext)
5472{
krunal sonib1a4f532014-06-18 16:19:49 -07005473 tHalHandle hHal;
5474 tpAniSirGlobal pMac;
Ryan Hsuef962b32014-05-06 04:25:33 -07005475 if (sapContext == NULL)
5476 return 0;
5477
krunal sonib1a4f532014-06-18 16:19:49 -07005478 hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx);
5479 if (NULL == hHal)
5480 {
5481 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
5482 "In %s invalid hHal", __func__);
5483 return 0;
5484 }
Ryan Hsue9758412014-07-17 20:02:53 -07005485 pMac = PMAC_STRUCT(hHal);
krunal sonib1a4f532014-06-18 16:19:49 -07005486
Ryan Hsuef962b32014-05-06 04:25:33 -07005487 if (VOS_TIMER_STATE_RUNNING !=
5488 vos_timer_getCurrentState(
krunal sonib1a4f532014-06-18 16:19:49 -07005489 &pMac->sap.SapDfsInfo.sap_dfs_cac_timer)) {
Ryan Hsuef962b32014-05-06 04:25:33 -07005490 return 0;
5491 }
5492
krunal sonib1a4f532014-06-18 16:19:49 -07005493 vos_timer_stop(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer);
5494 pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = 0;
Naveen Rawat341e76c2016-03-21 17:44:53 -07005495 vos_timer_destroy(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer);
Ryan Hsuef962b32014-05-06 04:25:33 -07005496
Ryan Hsuef962b32014-05-06 04:25:33 -07005497 return 0;
5498}
5499
Rakesh Sunkicb087e52015-03-16 17:04:01 -07005500/**
5501 * sap_is_channel_bonding_etsi_weather_channel() - Routine to check if
5502 * sap channel is bonded to
5503 * weather radar channel.
5504 * @sap_context: SAP context
5505 *
5506 * Check if the current SAP operating channel is bonded to weather radar
5507 * channel in ETSI domain.
5508 *
5509 * Return: True if bonded to weather channel in ETSI
5510 */
5511static bool
5512sap_is_channel_bonding_etsi_weather_channel(ptSapContext sap_context)
5513{
5514 if(IS_CH_BONDING_WITH_WEATHER_CH(sap_context->channel) &&
5515 (sap_context->vht_channel_width != eHT_CHANNEL_WIDTH_20MHZ)) {
5516 return true;
5517 }
5518 return false;
5519}
5520
Ryan Hsuef962b32014-05-06 04:25:33 -07005521/*
Ravi Joshia02f1d72013-12-13 22:52:22 -08005522 * Function to start the DFS CAC Timer
5523 * when SAP is started on a DFS channel
5524 */
5525int sapStartDfsCacTimer(ptSapContext sapContext)
5526{
5527 VOS_STATUS status;
Kiran Kumar Lokereba634cd2014-01-12 17:10:31 -08005528 v_U32_t cacTimeOut;
krunal sonib1a4f532014-06-18 16:19:49 -07005529 tHalHandle hHal = NULL;
5530 tpAniSirGlobal pMac = NULL;
Ryan Hsuf9826cb2015-04-02 18:10:16 -07005531 uint8_t dfs_region;
krunal sonib1a4f532014-06-18 16:19:49 -07005532
Ravi Joshia02f1d72013-12-13 22:52:22 -08005533 if (sapContext == NULL)
5534 {
5535 return 0;
5536 }
krunal sonib1a4f532014-06-18 16:19:49 -07005537 hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx);
5538
5539 if (NULL == hHal)
5540 {
5541 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
5542 "In %s invalid hHal", __func__);
5543 return 0;
5544 }
5545 pMac = PMAC_STRUCT( hHal );
5546
5547 if (pMac->sap.SapDfsInfo.ignore_cac)
Ravi Joshia02f1d72013-12-13 22:52:22 -08005548 {
5549 /*
5550 * If User has set to ignore the CAC
5551 * so, continue without CAC Timer.
5552 */
5553 return 2;
5554 }
Kiran Kumar Lokereba634cd2014-01-12 17:10:31 -08005555 cacTimeOut = DEFAULT_CAC_TIMEOUT;
Ryan Hsuf9826cb2015-04-02 18:10:16 -07005556
5557 vos_nv_get_dfs_region(&dfs_region);
5558
5559 if ((dfs_region == DFS_ETSI_DOMAIN) &&
Rakesh Sunkicb087e52015-03-16 17:04:01 -07005560 ((IS_ETSI_WEATHER_CH(sapContext->channel)) ||
5561 (sap_is_channel_bonding_etsi_weather_channel(sapContext))))
Kiran Kumar Lokereba634cd2014-01-12 17:10:31 -08005562 {
5563 cacTimeOut = ETSI_WEATHER_CH_CAC_TIMEOUT;
5564 }
krunal sonib1a4f532014-06-18 16:19:49 -07005565 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_MED,
5566 "sapdfs: SAP_DFS_CHANNEL_CAC_START on CH - %d, CAC TIMEOUT - %d sec",
5567 sapContext->channel, cacTimeOut/1000);
Kiran Kumar Lokeref6868862014-01-16 00:05:57 -08005568
krunal sonib1a4f532014-06-18 16:19:49 -07005569 vos_timer_init(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer,
Ravi Joshia02f1d72013-12-13 22:52:22 -08005570 VOS_TIMER_TYPE_SW,
krunal soni466ec4e2014-06-26 19:53:39 -07005571 sapDfsCacTimerCallback, (v_PVOID_t)hHal);
Ravi Joshi308c88e2013-12-13 22:52:22 -08005572
Kiran Kumar Lokeref6868862014-01-16 00:05:57 -08005573 /*Start the CAC timer*/
krunal sonib1a4f532014-06-18 16:19:49 -07005574 status = vos_timer_start(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer, cacTimeOut);
Ravi Joshia02f1d72013-12-13 22:52:22 -08005575 if (status == VOS_STATUS_SUCCESS)
5576 {
Naveen Rawat341e76c2016-03-21 17:44:53 -07005577 pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = true;
Ravi Joshia02f1d72013-12-13 22:52:22 -08005578 return 1;
5579 }
5580 else
5581 {
Naveen Rawat341e76c2016-03-21 17:44:53 -07005582 pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = false;
5583 vos_timer_destroy(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer);
Ravi Joshia02f1d72013-12-13 22:52:22 -08005584 return 0;
5585 }
5586}
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08005587
5588/*
5589 * This function initializes the NOL list
5590 * parameters required to track the radar
5591 * found DFS channels in the current Reg. Domain .
5592 */
5593VOS_STATUS sapInitDfsChannelNolList(ptSapContext sapContext)
5594{
5595 v_U8_t count = 0;
5596 int i;
Ryan Hsu807a20e2014-05-08 02:08:33 -07005597 v_BOOL_t bFound = FALSE;
krunal sonib1a4f532014-06-18 16:19:49 -07005598 tHalHandle hHal;
5599 tpAniSirGlobal pMac;
Ryan Hsu807a20e2014-05-08 02:08:33 -07005600
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08005601 if (NULL == sapContext)
5602 {
5603 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
5604 "Invalid sapContext pointer on sapInitDfsChannelNolList");
5605 return VOS_STATUS_E_FAULT;
5606 }
krunal sonib1a4f532014-06-18 16:19:49 -07005607 hHal = VOS_GET_HAL_CB(sapContext->pvosGCtx);
5608
5609 if (NULL == hHal)
5610 {
5611 VOS_TRACE( VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
5612 "In %s invalid hHal", __func__);
5613 return VOS_STATUS_E_FAULT;
5614 }
5615 pMac = PMAC_STRUCT( hHal );
Ryan Hsu807a20e2014-05-08 02:08:33 -07005616
5617 /* to indicate hdd to get cnss dfs nol */
5618 if (VOS_STATUS_SUCCESS == sapSignalHDDevent(sapContext, NULL,
5619 eSAP_DFS_NOL_GET,
5620 (v_PVOID_t) eSAP_STATUS_SUCCESS))
5621 {
5622 bFound = TRUE;
5623 }
5624
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08005625 for ( i = RF_CHAN_36; i <= RF_CHAN_165; i++ )
5626 {
5627 if ( regChannels[i].enabled == NV_CHANNEL_DFS )
5628 {
Ryan Hsu807a20e2014-05-08 02:08:33 -07005629 /* if dfs nol is not found, initialize it */
5630 if (!bFound)
5631 {
krunal sonib1a4f532014-06-18 16:19:49 -07005632 pMac->sap.SapDfsInfo.sapDfsChannelNolList[count]
Ryan Hsu807a20e2014-05-08 02:08:33 -07005633 .dfs_channel_number = rfChannels[i].channelNum;
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08005634
Ryan Hsu807a20e2014-05-08 02:08:33 -07005635 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
5636 "%s: CHANNEL = %d", __func__,
krunal sonib1a4f532014-06-18 16:19:49 -07005637 pMac->sap.SapDfsInfo
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08005638 .sapDfsChannelNolList[count].dfs_channel_number);
5639
krunal sonib1a4f532014-06-18 16:19:49 -07005640 pMac->sap.SapDfsInfo.sapDfsChannelNolList[count]
Ryan Hsu807a20e2014-05-08 02:08:33 -07005641 .radar_status_flag = eSAP_DFS_CHANNEL_USABLE;
krunal sonib1a4f532014-06-18 16:19:49 -07005642 pMac->sap.SapDfsInfo.sapDfsChannelNolList[count]
Ryan Hsu807a20e2014-05-08 02:08:33 -07005643 .radar_found_timestamp = 0;
5644 }
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08005645 count++;
5646 }
5647 }
Ryan Hsu807a20e2014-05-08 02:08:33 -07005648
krunal sonib1a4f532014-06-18 16:19:49 -07005649 pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels = count;
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08005650
5651 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_INFO_LOW,
5652 "%s[%d] NUMBER OF DFS CHANNELS = %d",
5653 __func__, __LINE__,
krunal sonib1a4f532014-06-18 16:19:49 -07005654 pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels);
Rakesh Sunkiedddb3b2014-01-23 23:27:26 -08005655
5656 return VOS_STATUS_SUCCESS;
5657}
Krunal Soni8e9c0f72014-09-12 18:04:57 -07005658
5659/*
5660 * This function will calculate how many interfaces
5661 * have sap persona and returns total number of sap persona.
5662 */
5663v_U8_t sap_get_total_number_sap_intf(tHalHandle hHal)
5664{
5665 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5666 v_U8_t intf = 0;
5667 v_U8_t intf_count = 0;
5668
5669 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
Chandrasekaran, Manishekara9347172015-01-13 22:51:53 +05305670 if (((VOS_STA_SAP_MODE == pMac->sap.sapCtxList [intf].sapPersona) ||
5671 (VOS_P2P_GO_MODE == pMac->sap.sapCtxList [intf].sapPersona)) &&
Krunal Soni8e9c0f72014-09-12 18:04:57 -07005672 pMac->sap.sapCtxList[intf].pSapContext != NULL) {
5673 intf_count++;
5674 }
5675 }
5676 return intf_count;
5677}
5678
5679/*
5680 * This function will find the concurrent sap context apart from
5681 * passed sap context and return its channel change ready status
5682 */
5683tANI_BOOLEAN is_concurrent_sap_ready_for_channel_change(tHalHandle hHal,
5684 ptSapContext sapContext)
5685{
5686 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5687 ptSapContext pSapContext;
5688 v_U8_t intf = 0;
Liangwei Dongac935ab2016-07-29 00:48:54 -04005689 tANI_BOOLEAN is_ready_for_chng = VOS_TRUE;
Krunal Soni8e9c0f72014-09-12 18:04:57 -07005690
5691 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
Chandrasekaran, Manishekara9347172015-01-13 22:51:53 +05305692 if (((VOS_STA_SAP_MODE == pMac->sap.sapCtxList [intf].sapPersona) ||
5693 (VOS_P2P_GO_MODE == pMac->sap.sapCtxList [intf].sapPersona)) &&
Krunal Soni8e9c0f72014-09-12 18:04:57 -07005694 pMac->sap.sapCtxList[intf].pSapContext != NULL) {
5695 pSapContext =
5696 (ptSapContext)pMac->sap.sapCtxList [intf].pSapContext;
5697 if (pSapContext == sapContext) {
5698 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
Jeff Johnson1c11fdf2017-09-18 11:02:47 -07005699 FL("sapCtx matched [%pK]"), sapContext);
Krunal Soni8e9c0f72014-09-12 18:04:57 -07005700 continue;
5701 } else {
5702 VOS_TRACE(VOS_MODULE_ID_SAP, VOS_TRACE_LEVEL_ERROR,
Jeff Johnson1c11fdf2017-09-18 11:02:47 -07005703 FL("concurrent sapCtx[%pK] didn't matche with [%pK]"),
Krunal Soni8e9c0f72014-09-12 18:04:57 -07005704 pSapContext, sapContext);
Liangwei Dongac935ab2016-07-29 00:48:54 -04005705 is_ready_for_chng = is_ready_for_chng &&
5706 pSapContext->is_sap_ready_for_chnl_chng;
Krunal Soni8e9c0f72014-09-12 18:04:57 -07005707 }
5708 }
5709 }
Liangwei Dongac935ab2016-07-29 00:48:54 -04005710 return is_ready_for_chng;
Krunal Soni8e9c0f72014-09-12 18:04:57 -07005711}