blob: 8bbe02d4ae09b512e76c884270a087087b378316 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
Abhishek Singh7996eb72015-12-30 17:24:02 +05302 * Copyright (c) 2012-2016 The Linux Foundation. All rights reserved.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
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 */
27
28/*===========================================================================
29
Anurag Chouhanfb54ab02016-02-18 18:00:46 +053030 s a p F s m . C
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080031
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.
40 ===========================================================================*/
41
42/*----------------------------------------------------------------------------
43 * Include Files
44 * -------------------------------------------------------------------------*/
45#include "sap_internal.h"
46/* Pick up the SME API definitions */
47#include "sme_api.h"
48/* Pick up the PMC API definitions */
49#include "cds_utils.h"
50#include "cds_ieee80211_common_i.h"
51#include "cds_reg_service.h"
Anurag Chouhanc5548422016-02-24 18:33:27 +053052#include "qdf_util.h"
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080053#include "cds_concurrency.h"
54
55/*----------------------------------------------------------------------------
56 * Preprocessor Definitions and Constants
57 * -------------------------------------------------------------------------*/
58
59/*----------------------------------------------------------------------------
60 * Type Declarations
61 * -------------------------------------------------------------------------*/
62
63/*----------------------------------------------------------------------------
64 * Global Data Definitions
65 * -------------------------------------------------------------------------*/
66
67/*----------------------------------------------------------------------------
68 * External declarations for global context
69 * -------------------------------------------------------------------------*/
70#ifdef FEATURE_WLAN_CH_AVOID
71extern sapSafeChannelType safe_channels[];
72#endif /* FEATURE_WLAN_CH_AVOID */
73
74/*----------------------------------------------------------------------------
75 * Static Variable Definitions
76 * -------------------------------------------------------------------------*/
77
78#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
79/*
80 * TODO: At present SAP Channel leakage matrix for ch 144
81 * is not available from system's team. So to play it safe
82 * and avoid crash if channel 144 is request, in following
83 * matix channel 144 is added such that it will cause code
84 * to avoid selecting channel 144.
85 *
86 * THESE ENTRIES SHOULD BE REPLACED WITH CORRECT VALUES AS
87 * PROVIDED BY SYSTEM'S TEAM.
88 */
89
90/* channel tx leakage table - ht80 */
91tSapChanMatrixInfo ht80_chan[] = {
92 {52,
93 {{36, 148}, {40, 199},
94 {44, 193}, {48, 197},
95 {52, SAP_TX_LEAKAGE_MIN}, {56, 153},
96 {60, 137}, {64, 134},
97 {100, 358}, {104, 350},
98 {108, 404}, {112, 344},
99 {116, 424}, {120, 429},
100 {124, 437}, {128, 435},
101 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
102 {140, SAP_TX_LEAKAGE_MAX},
103 {144, SAP_TX_LEAKAGE_MIN}
104 } },
105
106
107 {56,
108 {{36, 171}, {40, 178},
109 {44, 171}, {48, 178},
110 {52, SAP_TX_LEAKAGE_MIN}, {56, SAP_TX_LEAKAGE_MIN},
111 {60, SAP_TX_LEAKAGE_MIN}, {64, 280},
112 {100, 351}, {104, 376},
113 {108, 362}, {112, 362},
114 {116, 403}, {120, 397},
115 {124, SAP_TX_LEAKAGE_MAX}, {128, SAP_TX_LEAKAGE_MAX},
116 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
117 {140, SAP_TX_LEAKAGE_MAX},
118 {144, SAP_TX_LEAKAGE_MIN}
119 } },
120
121 {60,
122 {{36, 156}, {40, 146},
123 {44, SAP_TX_LEAKAGE_MIN}, {48, SAP_TX_LEAKAGE_MIN},
124 {52, 180}, {56, SAP_TX_LEAKAGE_MIN},
125 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
126 {100, 376}, {104, 360},
127 {108, SAP_TX_LEAKAGE_MAX}, {112, SAP_TX_LEAKAGE_MAX},
128 {116, 395}, {120, 399},
129 {124, SAP_TX_LEAKAGE_MAX}, {128, SAP_TX_LEAKAGE_MAX},
130 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
131 {140, SAP_TX_LEAKAGE_MAX},
132 {144, SAP_TX_LEAKAGE_MIN}
133 } },
134
135 {64,
136 {{36, 217}, {40, 221},
137 {44, SAP_TX_LEAKAGE_MIN}, {48, SAP_TX_LEAKAGE_MIN},
138 {52, 176}, {56, 176},
139 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
140 {100, 384}, {104, 390},
141 {108, SAP_TX_LEAKAGE_MAX}, {112, SAP_TX_LEAKAGE_MAX},
142 {116, 375}, {120, 374},
143 {124, SAP_TX_LEAKAGE_MAX}, {128, SAP_TX_LEAKAGE_MAX},
144 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
145 {140, SAP_TX_LEAKAGE_MAX},
146 {144, SAP_TX_LEAKAGE_MIN}
147 } },
148
149 {100,
150 {{36, 357}, {40, 326},
151 {44, 321}, {48, 326},
152 {52, 378}, {56, 396},
153 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
154 {100, SAP_TX_LEAKAGE_MIN}, {104, SAP_TX_LEAKAGE_MIN},
155 {108, 196}, {112, 116},
156 {116, 166}, {120, SAP_TX_LEAKAGE_MIN},
157 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
158 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
159 {140, SAP_TX_LEAKAGE_MIN},
160 {144, SAP_TX_LEAKAGE_MIN}
161 } },
162
163 {104,
164 {{36, 325}, {40, 325},
165 {44, 305}, {48, 352},
166 {52, 411}, {56, 411},
167 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
168 {100, SAP_TX_LEAKAGE_MIN}, {104, SAP_TX_LEAKAGE_MIN},
169 {108, SAP_TX_LEAKAGE_MIN}, {112, 460},
170 {116, 198}, {120, SAP_TX_LEAKAGE_MIN},
171 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
172 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
173 {140, SAP_TX_LEAKAGE_MIN},
174 {144, SAP_TX_LEAKAGE_MIN}
175 } },
176
177 {108,
178 {{36, 304}, {40, 332},
179 {44, 310}, {48, 335},
180 {52, 431}, {56, 391},
181 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
182 {100, 280}, {104, SAP_TX_LEAKAGE_MIN},
183 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
184 {116, 185}, {120, SAP_TX_LEAKAGE_MIN},
185 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
186 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
187 {140, SAP_TX_LEAKAGE_MIN},
188 {144, SAP_TX_LEAKAGE_MIN}
189 } },
190
191 {112,
192 {{36, 327}, {40, 335},
193 {44, 331}, {48, 345},
194 {52, 367}, {56, 401},
195 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
196 {100, 131}, {104, 132},
197 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
198 {116, 189}, {120, SAP_TX_LEAKAGE_MIN},
199 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
200 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
201 {140, SAP_TX_LEAKAGE_MIN},
202 {144, SAP_TX_LEAKAGE_MIN}
203 } },
204
205 {116,
206 {{36, 384}, {40, 372},
207 {44, 389}, {48, 396},
208 {52, 348}, {56, 336},
209 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
210 {100, 172}, {104, 169},
211 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
212 {116, SAP_TX_LEAKAGE_MIN}, {120, SAP_TX_LEAKAGE_MIN},
213 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
214 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
215 {140, SAP_TX_LEAKAGE_MIN},
216 {144, SAP_TX_LEAKAGE_MIN}
217 } },
218
219 {120,
220 {{36, 395}, {40, 419},
221 {44, 439}, {48, 407},
222 {52, 321}, {56, 334},
223 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
224 {100, 134}, {104, 186},
225 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
226 {116, SAP_TX_LEAKAGE_MIN}, {120, SAP_TX_LEAKAGE_MIN},
227 {124, SAP_TX_LEAKAGE_MIN}, {128, 159},
228 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
229 {140, SAP_TX_LEAKAGE_MIN},
230 {144, SAP_TX_LEAKAGE_MIN}
231 } },
232
233 {124,
234 {{36, 469}, {40, 433},
235 {44, 434}, {48, 435},
236 {52, 332}, {56, 345},
237 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
238 {100, 146}, {104, 177},
239 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
240 {116, 350}, {120, SAP_TX_LEAKAGE_MIN},
241 {124, SAP_TX_LEAKAGE_MIN}, {128, 138},
242 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
243 {140, SAP_TX_LEAKAGE_MIN},
244 {144, SAP_TX_LEAKAGE_MIN}
245 } },
246
247 {128,
248 {{36, 408}, {40, 434},
249 {44, 449}, {48, 444},
250 {52, 341}, {56, 374},
251 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
252 {100, 205}, {104, 208},
253 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
254 {116, 142}, {120, SAP_TX_LEAKAGE_MIN},
255 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
256 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
257 {140, SAP_TX_LEAKAGE_MIN},
258 {144, SAP_TX_LEAKAGE_MIN}
259 } },
260
261 {132,
262 {{36, SAP_TX_LEAKAGE_MAX}, {40, SAP_TX_LEAKAGE_MAX},
263 {44, SAP_TX_LEAKAGE_MAX}, {48, SAP_TX_LEAKAGE_MAX},
264 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
265 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
266 {100, SAP_TX_LEAKAGE_MIN}, {104, SAP_TX_LEAKAGE_MIN},
267 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
268 {116, SAP_TX_LEAKAGE_MIN}, {120, SAP_TX_LEAKAGE_MIN},
269 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
270 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
271 {140, SAP_TX_LEAKAGE_MIN},
272 {144, SAP_TX_LEAKAGE_MIN}
273 } },
274
275 {136,
276 {{36, SAP_TX_LEAKAGE_MAX}, {40, SAP_TX_LEAKAGE_MAX},
277 {44, SAP_TX_LEAKAGE_MAX}, {48, SAP_TX_LEAKAGE_MAX},
278 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
279 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
280 {100, SAP_TX_LEAKAGE_MIN}, {104, SAP_TX_LEAKAGE_MIN},
281 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
282 {116, SAP_TX_LEAKAGE_MIN}, {120, SAP_TX_LEAKAGE_MIN},
283 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
284 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
285 {140, SAP_TX_LEAKAGE_MIN},
286 {144, SAP_TX_LEAKAGE_MIN}
287 } },
288
289 {140,
290 {{36, SAP_TX_LEAKAGE_MAX}, {40, SAP_TX_LEAKAGE_MAX},
291 {44, SAP_TX_LEAKAGE_MAX}, {48, SAP_TX_LEAKAGE_MAX},
292 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
293 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
294 {100, SAP_TX_LEAKAGE_MIN}, {104, SAP_TX_LEAKAGE_MIN},
295 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
296 {116, SAP_TX_LEAKAGE_MIN}, {120, SAP_TX_LEAKAGE_MIN},
297 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
298 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
299 {144, SAP_TX_LEAKAGE_MIN}
300 } },
301};
302
303/* channel tx leakage table - ht40 */
304tSapChanMatrixInfo ht40_chan[] = {
305 {52,
306 {{36, SAP_TX_LEAKAGE_AUTO_MIN}, {40, SAP_TX_LEAKAGE_AUTO_MIN},
307 {44, 230}, {48, 230},
308 {52, SAP_TX_LEAKAGE_MIN}, {56, SAP_TX_LEAKAGE_MIN},
309 {60, SAP_TX_LEAKAGE_AUTO_MIN}, {64, SAP_TX_LEAKAGE_AUTO_MIN},
310 {100, 625}, {104, 323},
311 {108, 646}, {112, 646},
312 {116, SAP_TX_LEAKAGE_MAX}, {120, SAP_TX_LEAKAGE_MAX},
313 {124, SAP_TX_LEAKAGE_MAX}, {128, SAP_TX_LEAKAGE_MAX},
314 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
315 {140, SAP_TX_LEAKAGE_MAX},
316 {144, SAP_TX_LEAKAGE_MIN}
317 } },
318
319 {56,
320 {{36, SAP_TX_LEAKAGE_AUTO_MIN}, {40, SAP_TX_LEAKAGE_AUTO_MIN},
321 {44, SAP_TX_LEAKAGE_AUTO_MIN}, {48, SAP_TX_LEAKAGE_AUTO_MIN},
322 {52, SAP_TX_LEAKAGE_MIN}, {56, SAP_TX_LEAKAGE_MIN},
323 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
324 {100, 611}, {104, 611},
325 {108, 617}, {112, 617},
326 {116, SAP_TX_LEAKAGE_MAX}, {120, SAP_TX_LEAKAGE_MAX},
327 {124, SAP_TX_LEAKAGE_MAX}, {128, SAP_TX_LEAKAGE_MAX},
328 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
329 {140, SAP_TX_LEAKAGE_MAX},
330 {144, SAP_TX_LEAKAGE_MIN}
331 } },
332
333 {60,
334 {{36, SAP_TX_LEAKAGE_AUTO_MIN}, {40, SAP_TX_LEAKAGE_AUTO_MIN},
335 {44, SAP_TX_LEAKAGE_AUTO_MIN}, {48, SAP_TX_LEAKAGE_AUTO_MIN},
336 {52, 190}, {56, 190},
337 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
338 {100, 608}, {104, 608},
339 {108, 623}, {112, 623},
340 {116, SAP_TX_LEAKAGE_MAX}, {120, SAP_TX_LEAKAGE_MAX},
341 {124, SAP_TX_LEAKAGE_MAX}, {128, SAP_TX_LEAKAGE_MAX},
342 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
343 {140, SAP_TX_LEAKAGE_MAX},
344 {144, SAP_TX_LEAKAGE_MIN}
345 } },
346
347 {64,
348 {{36, SAP_TX_LEAKAGE_AUTO_MIN}, {40, SAP_TX_LEAKAGE_AUTO_MIN},
349 {44, SAP_TX_LEAKAGE_AUTO_MIN}, {48, SAP_TX_LEAKAGE_AUTO_MIN},
350 {52, 295}, {56, 295},
351 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
352 {100, 594}, {104, 594},
353 {108, 625}, {112, 625},
354 {116, SAP_TX_LEAKAGE_MAX}, {120, SAP_TX_LEAKAGE_MAX},
355 {124, SAP_TX_LEAKAGE_MAX}, {128, SAP_TX_LEAKAGE_MAX},
356 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
357 {140, SAP_TX_LEAKAGE_MAX},
358 {144, SAP_TX_LEAKAGE_MIN}
359 } },
360
361 {100,
362 {{36, 618}, {40, 618},
363 {44, 604}, {48, 604},
364 {52, 596}, {56, 596},
365 {60, 584}, {64, 584},
366 {100, SAP_TX_LEAKAGE_MIN}, {104, SAP_TX_LEAKAGE_MIN},
367 {108, 299}, {112, 299},
368 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, SAP_TX_LEAKAGE_AUTO_MIN},
369 {124, SAP_TX_LEAKAGE_AUTO_MIN}, {128, SAP_TX_LEAKAGE_AUTO_MIN},
370 {132, 538}, {136, 538},
371 {140, 598},
372 {144, SAP_TX_LEAKAGE_MIN}
373 } },
374
375 {104,
376 {{36, 636}, {40, 636},
377 {44, 601}, {48, 601},
378 {52, 616}, {56, 616},
379 {60, 584}, {64, 584},
380 {100, SAP_TX_LEAKAGE_MIN}, {104, SAP_TX_LEAKAGE_MIN},
381 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
382 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, SAP_TX_LEAKAGE_AUTO_MIN},
383 {124, SAP_TX_LEAKAGE_AUTO_MIN}, {128, SAP_TX_LEAKAGE_AUTO_MIN},
384 {132, 553}, {136, 553},
385 {140, 568},
386 {144, SAP_TX_LEAKAGE_MIN}
387 } },
388
389 {108,
390 {{36, 600}, {40, 600},
391 {44, 627}, {48, 627},
392 {52, 611}, {56, 611},
393 {60, 611}, {64, 611},
394 {100, 214}, {104, 214},
395 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
396 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, SAP_TX_LEAKAGE_AUTO_MIN},
397 {124, SAP_TX_LEAKAGE_AUTO_MIN}, {128, SAP_TX_LEAKAGE_AUTO_MIN},
398 {132, SAP_TX_LEAKAGE_AUTO_MIN}, {136, SAP_TX_LEAKAGE_AUTO_MIN},
399 {140, 534},
400 {144, SAP_TX_LEAKAGE_MIN}
401 } },
402
403 {112,
404 {{36, 645}, {40, 645},
405 {44, 641}, {48, 641},
406 {52, 618}, {56, 618},
407 {60, 612}, {64, 612},
408 {100, 293}, {104, 293},
409 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
410 {116, SAP_TX_LEAKAGE_MIN}, {120, SAP_TX_LEAKAGE_MIN},
411 {124, SAP_TX_LEAKAGE_AUTO_MIN}, {128, SAP_TX_LEAKAGE_AUTO_MIN},
412 {132, SAP_TX_LEAKAGE_AUTO_MIN}, {136, SAP_TX_LEAKAGE_AUTO_MIN},
413 {140, 521},
414 {144, SAP_TX_LEAKAGE_MIN}
415 } },
416
417 {116,
418 {{36, 661}, {40, 661},
419 {44, 624}, {48, 624},
420 {52, 634}, {56, 634},
421 {60, 611}, {64, 611},
422 {100, SAP_TX_LEAKAGE_AUTO_MIN}, {104, SAP_TX_LEAKAGE_AUTO_MIN},
423 {108, 217}, {112, 217},
424 {116, SAP_TX_LEAKAGE_MIN}, {120, SAP_TX_LEAKAGE_MIN},
425 {124, SAP_TX_LEAKAGE_AUTO_MIN}, {128, SAP_TX_LEAKAGE_AUTO_MIN},
426 {132, SAP_TX_LEAKAGE_AUTO_MIN}, {136, SAP_TX_LEAKAGE_AUTO_MIN},
427 {140, SAP_TX_LEAKAGE_AUTO_MIN},
428 {144, SAP_TX_LEAKAGE_MIN}
429 } },
430
431 {120,
432 {{36, 667}, {40, 667},
433 {44, 645}, {48, 645},
434 {52, 633}, {56, 633},
435 {60, 619}, {64, 619},
436 {100, SAP_TX_LEAKAGE_AUTO_MIN}, {104, SAP_TX_LEAKAGE_AUTO_MIN},
437 {108, 291}, {112, 291},
438 {116, SAP_TX_LEAKAGE_MIN}, {120, SAP_TX_LEAKAGE_MIN},
439 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
440 {132, SAP_TX_LEAKAGE_AUTO_MIN}, {136, SAP_TX_LEAKAGE_AUTO_MIN},
441 {140, SAP_TX_LEAKAGE_AUTO_MIN},
442 {144, SAP_TX_LEAKAGE_MIN}
443 } },
444
445 {124,
446 {{36, 676}, {40, 676},
447 {44, 668}, {48, 668},
448 {52, 595}, {56, 595},
449 {60, 622}, {64, 622},
450 {100, SAP_TX_LEAKAGE_AUTO_MIN}, {104, SAP_TX_LEAKAGE_AUTO_MIN},
451 {108, SAP_TX_LEAKAGE_AUTO_MIN}, {112, SAP_TX_LEAKAGE_AUTO_MIN},
452 {116, 225}, {120, 225},
453 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
454 {132, SAP_TX_LEAKAGE_AUTO_MIN}, {136, SAP_TX_LEAKAGE_AUTO_MIN},
455 {140, SAP_TX_LEAKAGE_AUTO_MIN},
456 {144, SAP_TX_LEAKAGE_MIN}
457 } },
458
459 {128,
460 {{36, 678}, {40, 678},
461 {44, 664}, {48, 664},
462 {52, 651}, {56, 651},
463 {60, 643}, {64, 643},
464 {100, SAP_TX_LEAKAGE_AUTO_MIN}, {104, SAP_TX_LEAKAGE_AUTO_MIN},
465 {108, SAP_TX_LEAKAGE_AUTO_MIN}, {112, SAP_TX_LEAKAGE_AUTO_MIN},
466 {116, 293}, {120, 293},
467 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
468 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
469 {140, SAP_TX_LEAKAGE_AUTO_MIN},
470 {144, SAP_TX_LEAKAGE_MIN}
471 } },
472
473 {132,
474 {{36, 689}, {40, 689},
475 {44, 669}, {48, 669},
476 {52, 662}, {56, 662},
477 {60, 609}, {64, 609},
478 {100, 538}, {104, 538},
479 {108, SAP_TX_LEAKAGE_AUTO_MIN}, {112, SAP_TX_LEAKAGE_AUTO_MIN},
480 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, SAP_TX_LEAKAGE_AUTO_MIN},
481 {124, 247}, {128, 247},
482 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
483 {140, SAP_TX_LEAKAGE_MIN},
484 {144, SAP_TX_LEAKAGE_MIN}
485 } },
486
487 {136,
488 {{36, 703}, {40, 703},
489 {44, 688}, {48, SAP_TX_LEAKAGE_MIN},
490 {52, 671}, {56, 671},
491 {60, 658}, {64, 658},
492 {100, 504}, {104, 504},
493 {108, SAP_TX_LEAKAGE_AUTO_MIN}, {112, SAP_TX_LEAKAGE_AUTO_MIN},
494 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, SAP_TX_LEAKAGE_AUTO_MIN},
495 {124, 289}, {128, 289},
496 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
497 {140, SAP_TX_LEAKAGE_MIN},
498 {144, SAP_TX_LEAKAGE_MIN}
499 } },
500
501 {140,
502 {{36, 695}, {40, 695},
503 {44, 684}, {48, 684},
504 {52, 664}, {56, 664},
505 {60, 658}, {64, 658},
506 {100, 601}, {104, 601},
507 {108, 545}, {112, 545},
508 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, SAP_TX_LEAKAGE_AUTO_MIN},
509 {124, SAP_TX_LEAKAGE_AUTO_MIN}, {128, SAP_TX_LEAKAGE_AUTO_MIN},
510 {132, 262}, {136, 262},
511 {140, SAP_TX_LEAKAGE_MIN},
512 {144, SAP_TX_LEAKAGE_MIN}
513 } },
514
515};
516
517/* channel tx leakage table - ht20 */
518tSapChanMatrixInfo ht20_chan[] = {
519 {52,
520 {{36, SAP_TX_LEAKAGE_AUTO_MIN}, {40, 286},
521 {44, 225}, {48, 121},
522 {52, SAP_TX_LEAKAGE_MIN}, {56, SAP_TX_LEAKAGE_MIN},
523 {60, 300}, {64, SAP_TX_LEAKAGE_AUTO_MIN},
524 {100, 637}, {104, SAP_TX_LEAKAGE_MAX},
525 {108, SAP_TX_LEAKAGE_MAX}, {112, SAP_TX_LEAKAGE_MAX},
526 {116, SAP_TX_LEAKAGE_MAX}, {120, SAP_TX_LEAKAGE_MAX},
527 {124, SAP_TX_LEAKAGE_MAX}, {128, SAP_TX_LEAKAGE_MAX},
528 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
529 {140, SAP_TX_LEAKAGE_MAX},
530 {144, SAP_TX_LEAKAGE_MIN}
531 } },
532
533 {56,
534 {{36, 468}, {40, SAP_TX_LEAKAGE_AUTO_MIN},
535 {44, SAP_TX_LEAKAGE_AUTO_MIN}, {48, 206},
536 {52, SAP_TX_LEAKAGE_MIN}, {56, SAP_TX_LEAKAGE_MIN},
537 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
538 {100, SAP_TX_LEAKAGE_MAX}, {104, SAP_TX_LEAKAGE_MAX},
539 {108, SAP_TX_LEAKAGE_MAX}, {112, SAP_TX_LEAKAGE_MAX},
540 {116, SAP_TX_LEAKAGE_MAX}, {120, SAP_TX_LEAKAGE_MAX},
541 {124, SAP_TX_LEAKAGE_MAX}, {128, SAP_TX_LEAKAGE_MAX},
542 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
543 {140, SAP_TX_LEAKAGE_MAX},
544 {144, SAP_TX_LEAKAGE_MIN}
545 } },
546
547 {60,
548 {{36, 507}, {40, 440},
549 {44, SAP_TX_LEAKAGE_AUTO_MIN}, {48, 313},
550 {52, SAP_TX_LEAKAGE_MIN}, {56, SAP_TX_LEAKAGE_MIN},
551 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
552 {100, SAP_TX_LEAKAGE_MAX}, {104, SAP_TX_LEAKAGE_MAX},
553 {108, SAP_TX_LEAKAGE_MAX}, {112, SAP_TX_LEAKAGE_MAX},
554 {116, SAP_TX_LEAKAGE_MAX}, {120, SAP_TX_LEAKAGE_MAX},
555 {124, SAP_TX_LEAKAGE_MAX}, {128, SAP_TX_LEAKAGE_MAX},
556 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
557 {140, SAP_TX_LEAKAGE_MAX},
558 {144, SAP_TX_LEAKAGE_MIN}
559 } },
560
561 {64,
562 {{36, 516}, {40, 520},
563 {44, 506}, {48, SAP_TX_LEAKAGE_AUTO_MIN},
564 {52, 301}, {56, 258},
565 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
566 {100, 620}, {104, 617},
567 {108, SAP_TX_LEAKAGE_MAX}, {112, SAP_TX_LEAKAGE_MAX},
568 {116, SAP_TX_LEAKAGE_MAX}, {120, SAP_TX_LEAKAGE_MAX},
569 {124, SAP_TX_LEAKAGE_MAX}, {128, SAP_TX_LEAKAGE_MAX},
570 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
571 {140, SAP_TX_LEAKAGE_MAX},
572 {144, SAP_TX_LEAKAGE_MIN}
573 } },
574
575 {100,
576 {{36, 616}, {40, 601},
577 {44, 604}, {48, 589},
578 {52, 612}, {56, 592},
579 {60, 590}, {64, 582},
580 {100, SAP_TX_LEAKAGE_MIN}, {104, 131},
581 {108, SAP_TX_LEAKAGE_AUTO_MIN}, {112, SAP_TX_LEAKAGE_AUTO_MIN},
582 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, 522},
583 {124, 571}, {128, 589},
584 {132, 593}, {136, 598},
585 {140, 594},
586 {144, SAP_TX_LEAKAGE_MIN},
587 } },
588
589 {104,
590 {{36, 622}, {40, 624},
591 {44, 618}, {48, 610},
592 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
593 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
594 {100, SAP_TX_LEAKAGE_MIN}, {104, SAP_TX_LEAKAGE_MIN},
595 {108, SAP_TX_LEAKAGE_MIN}, {112, 463},
596 {116, 483}, {120, 503},
597 {124, 523}, {128, 565},
598 {132, 570}, {136, 588},
599 {140, 585},
600 {144, SAP_TX_LEAKAGE_MIN},
601 } },
602
603 {108,
604 {{36, 620}, {40, 638},
605 {44, 611}, {48, 614},
606 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
607 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
608 {100, 477}, {104, SAP_TX_LEAKAGE_MIN},
609 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
610 {116, 477}, {120, 497},
611 {124, 517}, {128, 537},
612 {132, 557}, {136, 577},
613 {140, 603},
614 {144, SAP_TX_LEAKAGE_MIN},
615 } },
616
617 {112,
618 {{36, 636}, {40, 623},
619 {44, 638}, {48, 628},
620 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
621 {60, SAP_TX_LEAKAGE_MAX}, {64, 606},
622 {100, 501}, {104, 481},
623 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
624 {116, SAP_TX_LEAKAGE_MIN}, {120, 481},
625 {124, 501}, {128, 421},
626 {132, 541}, {136, 561},
627 {140, 583},
628 {144, SAP_TX_LEAKAGE_MIN},
629 } },
630
631 {116,
632 {{36, 646}, {40, 648},
633 {44, 633}, {48, 634},
634 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
635 {60, 615}, {64, 594},
636 {100, 575}, {104, 554},
637 {108, 534}, {112, SAP_TX_LEAKAGE_MIN},
638 {116, SAP_TX_LEAKAGE_MIN}, {120, SAP_TX_LEAKAGE_MIN},
639 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
640 {132, 534}, {136, 554},
641 {140, 574},
642 {144, SAP_TX_LEAKAGE_MIN},
643 } },
644
645 {120,
646 {{36, 643}, {40, 649},
647 {44, 654}, {48, 629},
648 {52, SAP_TX_LEAKAGE_MAX}, {56, 621},
649 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
650 {100, 565}, {104, 545},
651 {108, 525}, {112, 505},
652 {116, SAP_TX_LEAKAGE_MIN}, {120, SAP_TX_LEAKAGE_MIN},
653 {124, SAP_TX_LEAKAGE_MIN}, {128, 505},
654 {132, 525}, {136, 545},
655 {140, 565},
656 {144, SAP_TX_LEAKAGE_MIN},
657 } },
658
659 {124,
660 {{36, 638}, {40, 657},
661 {44, 663}, {48, 649},
662 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
663 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
664 {100, 581}, {104, 561},
665 {108, 541}, {112, 521},
666 {116, 499}, {120, SAP_TX_LEAKAGE_MIN},
667 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
668 {132, 499}, {136, 519},
669 {140, 539},
670 {144, SAP_TX_LEAKAGE_MIN}
671 } },
672
673 {128,
674 {{36, 651}, {40, 651},
675 {44, 674}, {48, 640},
676 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
677 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
678 {100, 603}, {104, 560},
679 {108, 540}, {112, 520},
680 {116, 499}, {120, 479},
681 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
682 {132, SAP_TX_LEAKAGE_MIN}, {136, 479},
683 {140, 499},
684 {144, SAP_TX_LEAKAGE_MIN}
685 } },
686
687 {132,
688 {{36, 643}, {40, 668},
689 {44, 651}, {48, 657},
690 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
691 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
692 {100, SAP_TX_LEAKAGE_MAX}, {104, 602},
693 {108, 578}, {112, 570},
694 {116, 550}, {120, 530},
695 {124, 510}, {128, SAP_TX_LEAKAGE_MIN},
696 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
697 {140, 490},
698 {144, SAP_TX_LEAKAGE_MIN}
699 } },
700
701 {136,
702 {{36, 654}, {40, 667},
703 {44, 666}, {48, 642},
704 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
705 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
706 {100, SAP_TX_LEAKAGE_MAX}, {104, SAP_TX_LEAKAGE_MAX},
707 {108, SAP_TX_LEAKAGE_MAX}, {112, 596},
708 {116, 555}, {120, 535},
709 {124, 515}, {128, 495},
710 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
711 {140, SAP_TX_LEAKAGE_MIN},
712 {144, SAP_TX_LEAKAGE_MIN}
713 } },
714
715 {140,
716 {{36, 679}, {40, 673},
717 {44, 667}, {48, 656},
718 {52, 634}, {56, 663},
719 {60, 662}, {64, 660},
720 {100, SAP_TX_LEAKAGE_MAX}, {104, SAP_TX_LEAKAGE_MAX},
721 {108, SAP_TX_LEAKAGE_MAX}, {112, 590},
722 {116, 573}, {120, 553},
723 {124, 533}, {128, 513},
724 {132, 490}, {136, SAP_TX_LEAKAGE_MIN},
725 {140, SAP_TX_LEAKAGE_MIN},
726 {144, SAP_TX_LEAKAGE_MIN}
727 } },
728};
729#endif /* WLAN_ENABLE_CHNL_MATRIX_RESTRICTION */
730
731/*----------------------------------------------------------------------------
732 * Static Function Declarations and Definitions
733 * -------------------------------------------------------------------------*/
734#ifdef SOFTAP_CHANNEL_RANGE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530735static QDF_STATUS sap_get_channel_list(ptSapContext sapContext,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800736 uint8_t **channelList,
737 uint8_t *numberOfChannels);
738#endif
739
740/*==========================================================================
741 FUNCTION sapGet5GHzChannelList
742
743 DESCRIPTION
744 Function for initializing list of 2.4/5 Ghz [NON-DFS/DFS] available
745 channels in the current regulatory domain.
746
747 DEPENDENCIES
748 NA.
749
750 PARAMETERS
751
752 IN
753 sapContext: SAP Context
754
755 RETURN VALUE
756 NA
757
758 SIDE EFFECTS
759 ============================================================================*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530760static QDF_STATUS sap_get5_g_hz_channel_list(ptSapContext sapContext);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800761
762/*==========================================================================
763 FUNCTION sapStopDfsCacTimer
764
765 DESCRIPTION
766 Function to sttop the DFS CAC timer when SAP is stopped
767 DEPENDENCIES
768 NA.
769
770 PARAMETERS
771
772 IN
773 sapContext: SAP Context
774 RETURN VALUE
775 DFS Timer start status
776 SIDE EFFECTS
777 ============================================================================*/
778
779static int sap_stop_dfs_cac_timer(ptSapContext sapContext);
780
781/*==========================================================================
782 FUNCTION sapStartDfsCacTimer
783
784 DESCRIPTION
785 Function to start the DFS CAC timer when SAP is started on DFS Channel
786 DEPENDENCIES
787 NA.
788
789 PARAMETERS
790
791 IN
792 sapContext: SAP Context
793 RETURN VALUE
794 DFS Timer start status
795 SIDE EFFECTS
796 ============================================================================*/
797
798int sap_start_dfs_cac_timer(ptSapContext sapContext);
799
800/** sap_hdd_event_to_string() - convert hdd event to string
801 * @event: eSapHddEvent event type
802 *
803 * This function converts eSapHddEvent into string
804 *
805 * Return: string for the @event.
806 */
807static uint8_t *sap_hdd_event_to_string(eSapHddEvent event)
808{
809 switch (event) {
810 CASE_RETURN_STRING(eSAP_START_BSS_EVENT);
811 CASE_RETURN_STRING(eSAP_STOP_BSS_EVENT);
812 CASE_RETURN_STRING(eSAP_STA_ASSOC_IND);
813 CASE_RETURN_STRING(eSAP_STA_ASSOC_EVENT);
814 CASE_RETURN_STRING(eSAP_STA_REASSOC_EVENT);
815 CASE_RETURN_STRING(eSAP_STA_DISASSOC_EVENT);
816 CASE_RETURN_STRING(eSAP_STA_SET_KEY_EVENT);
817 CASE_RETURN_STRING(eSAP_STA_MIC_FAILURE_EVENT);
818 CASE_RETURN_STRING(eSAP_ASSOC_STA_CALLBACK_EVENT);
819 CASE_RETURN_STRING(eSAP_GET_WPSPBC_SESSION_EVENT);
820 CASE_RETURN_STRING(eSAP_WPS_PBC_PROBE_REQ_EVENT);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800821 CASE_RETURN_STRING(eSAP_REMAIN_CHAN_READY);
822 CASE_RETURN_STRING(eSAP_SEND_ACTION_CNF);
823 CASE_RETURN_STRING(eSAP_DISCONNECT_ALL_P2P_CLIENT);
824 CASE_RETURN_STRING(eSAP_MAC_TRIG_STOP_BSS_EVENT);
825 CASE_RETURN_STRING(eSAP_UNKNOWN_STA_JOIN);
826 CASE_RETURN_STRING(eSAP_MAX_ASSOC_EXCEEDED);
827 CASE_RETURN_STRING(eSAP_CHANNEL_CHANGE_EVENT);
828 CASE_RETURN_STRING(eSAP_DFS_CAC_START);
829 CASE_RETURN_STRING(eSAP_DFS_CAC_END);
830 CASE_RETURN_STRING(eSAP_DFS_RADAR_DETECT);
831 CASE_RETURN_STRING(eSAP_DFS_NOL_GET);
832 CASE_RETURN_STRING(eSAP_DFS_NOL_SET);
833 CASE_RETURN_STRING(eSAP_DFS_NO_AVAILABLE_CHANNEL);
834#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
835 CASE_RETURN_STRING(eSAP_ACS_SCAN_SUCCESS_EVENT);
836#endif
837 CASE_RETURN_STRING(eSAP_ACS_CHANNEL_SELECTED);
838 default:
839 return "eSAP_HDD_EVENT_UNKNOWN";
840 }
841}
842
843/*----------------------------------------------------------------------------
844 * Externalized Function Definitions
845 * -------------------------------------------------------------------------*/
846
847/*----------------------------------------------------------------------------
848 * Function Declarations and Documentation
849 * -------------------------------------------------------------------------*/
850
851/*==========================================================================
852 FUNCTION sap_event_init
853
854 DESCRIPTION
855 Function for initializing sWLAN_SAPEvent structure
856
857 DEPENDENCIES
858 NA.
859
860 PARAMETERS
861
862 IN
863 sapEvent : State machine event
864
865 RETURN VALUE
866
867 None
868
869 SIDE EFFECTS
870 ============================================================================*/
871static inline void sap_event_init(ptWLAN_SAPEvent sapEvent)
872{
873 sapEvent->event = eSAP_MAC_SCAN_COMPLETE;
874 sapEvent->params = 0;
875 sapEvent->u1 = 0;
876 sapEvent->u2 = 0;
877}
878
879#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
880/*
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -0800881 * sap_find_target_channel_in_channel_matrix() - finds the leakage matrix
882 * @sapContext: Pointer to vos global context structure
883 * @ch_width: target channel width
884 * @NOL_channel: the NOL channel whose leakage matrix is required
885 * @pTarget_chnl_mtrx: pointer to target channel matrix returned.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800886 *
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -0800887 * This function gives the leakage matrix for given NOL channel and ch_width
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800888 *
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -0800889 * Return: TRUE or FALSE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800890 */
891bool
892sap_find_target_channel_in_channel_matrix(ptSapContext sapContext,
Amar Singhale4f28ee2015-10-21 14:36:56 -0700893 enum ch_width ch_width,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800894 uint8_t NOL_channel,
895 tSapTxLeakInfo **pTarget_chnl_mtrx)
896{
897 tSapTxLeakInfo *target_chan_matrix = NULL;
898 tSapChanMatrixInfo *pchan_matrix = NULL;
899 uint32_t nchan_matrix;
900 int i = 0;
901
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -0800902 switch (ch_width) {
903 case CH_WIDTH_20MHZ:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800904 /* HT20 */
905 pchan_matrix = ht20_chan;
Anurag Chouhan6d760662016-02-20 16:05:43 +0530906 nchan_matrix = QDF_ARRAY_SIZE(ht20_chan);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800907 break;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -0800908 case CH_WIDTH_40MHZ:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800909 /* HT40 */
910 pchan_matrix = ht40_chan;
Anurag Chouhan6d760662016-02-20 16:05:43 +0530911 nchan_matrix = QDF_ARRAY_SIZE(ht40_chan);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800912 break;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -0800913 case CH_WIDTH_80MHZ:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800914 /* HT80 */
915 pchan_matrix = ht80_chan;
Anurag Chouhan6d760662016-02-20 16:05:43 +0530916 nchan_matrix = QDF_ARRAY_SIZE(ht80_chan);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800917 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800918 default:
919 /* handle exception and fall back to HT20 table */
920 pchan_matrix = ht20_chan;
Anurag Chouhan6d760662016-02-20 16:05:43 +0530921 nchan_matrix = QDF_ARRAY_SIZE(ht20_chan);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800922 break;
923 }
924
925 for (i = 0; i < nchan_matrix; i++) {
926 /* find the SAP channel to map the leakage matrix */
927 if (NOL_channel == pchan_matrix[i].channel) {
928 target_chan_matrix = pchan_matrix[i].chan_matrix;
929 break;
930 }
931 }
932
933 if (NULL == target_chan_matrix) {
934 return false;
935 } else {
936 *pTarget_chnl_mtrx = target_chan_matrix;
937 return true;
938 }
939}
940
941/**
942 * sap_mark_channels_leaking_into_nol() - to mark channel leaking in to nol
943 * @sap_ctx: pointer to SAP context
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -0800944 * @ch_width: channel width
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800945 * @nol: nol info
946 * @temp_ch_lst_sz: the target channel list
947 * @temp_ch_lst: the target channel list
948 *
949 * This function removes the channels from temp channel list that
950 * (if selected as target channel) will cause leakage in one of
951 * the NOL channels
952 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530953 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800954 */
955
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530956QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800957sap_mark_channels_leaking_into_nol(ptSapContext sap_ctx,
Amar Singhale4f28ee2015-10-21 14:36:56 -0700958 enum ch_width ch_width,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800959 tSapDfsNolInfo *nol,
960 uint8_t temp_ch_lst_sz,
961 uint8_t *temp_ch_lst)
962{
963 tSapTxLeakInfo *target_chan_matrix = NULL;
Amar Singhalb8d4f152016-02-10 10:21:43 -0800964 uint32_t num_channel = (CHAN_ENUM_144 - CHAN_ENUM_36) + 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800965 uint32_t i = 0;
966 uint32_t j = 0;
967 uint32_t k = 0;
968 uint8_t dfs_nol_channel;
969
970
971 /* traverse target_chan_matrix and */
972 for (i = 0; i < NUM_5GHZ_CHANNELS ; i++) {
973 dfs_nol_channel = nol[i].dfs_channel_number;
974 if (nol[i].radar_status_flag == eSAP_DFS_CHANNEL_USABLE ||
975 nol[i].radar_status_flag == eSAP_DFS_CHANNEL_AVAILABLE) {
976 /* not present in NOL */
977 continue;
978 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530979 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800980 FL("sapdfs: processing NOL channel: %d"),
981 dfs_nol_channel);
982 if (false == sap_find_target_channel_in_channel_matrix(
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -0800983 sap_ctx, ch_width, dfs_nol_channel,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800984 &target_chan_matrix)) {
985 /*
986 * should never happen, we should always find a table
987 * here, if we don't, need a fix here!
988 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530989 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800990 FL("Couldn't find target channel matrix!"));
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530991 QDF_ASSERT(0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530992 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800993 }
994 /*
995 * following is based on assumption that both temp_ch_lst
996 * and target channel matrix are in increasing order of
997 * channelID
998 */
999 for (j = 0, k = 0; j < temp_ch_lst_sz && k < num_channel;) {
1000 if (temp_ch_lst[j] == 0) {
1001 j++;
1002 continue;
1003 }
1004 if (target_chan_matrix[k].leak_chan != temp_ch_lst[j]) {
1005 k++;
1006 continue;
1007 }
1008 /*
1009 * check leakage from candidate channel
1010 * to NOL channel
1011 */
1012 if (target_chan_matrix[k].leak_lvl <=
1013 SAP_TX_LEAKAGE_THRES) {
1014 /*
1015 * candidate channel will have
1016 * bad leakage in NOL channel,
1017 * remove from temp list
1018 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301019 QDF_TRACE(QDF_MODULE_ID_SAP,
1020 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001021 FL("sapdfs: channel: %d will have bad leakage due to channel: %d\n"),
1022 dfs_nol_channel, temp_ch_lst[j]);
1023 temp_ch_lst[j] = 0;
1024 break;
1025 }
1026 j++;
1027 k++;
1028 }
1029 } /* end of loop that selects each NOL */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301030 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001031}
1032#endif /* end of WLAN_ENABLE_CHNL_MATRIX_RESTRICTION */
1033
1034/*
1035 * This function adds availabe channel to bitmap
1036 *
1037 * PARAMETERS
1038 * IN
1039 * pBitmap: bitmap to populate
1040 * channel: channel to set in bitmap
1041 */
1042static void sap_set_bitmap(chan_bonding_bitmap *pBitmap, uint8_t channel)
1043{
1044 int i = 0;
1045 int start_channel = 0;
1046 for (i = 0; i < MAX_80MHZ_BANDS; i++) {
1047 start_channel = pBitmap->chanBondingSet[i].startChannel;
1048 if (channel >= start_channel && channel <= start_channel + 12) {
1049 pBitmap->chanBondingSet[i].channelMap |=
1050 1 << ((channel - start_channel) / 4);
1051 return;
1052 }
1053 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301054 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001055 FL("Channel=%d is not in the bitmap"), channel);
1056}
1057
1058/**
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001059 * sap_populate_available_channels() - To populate available channel
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001060 * @bitmap: bitmap to populate
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001061 * @ch_width: channel width
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001062 * @avail_chnl: available channel list to populate
1063 *
1064 * This function reads the bitmap and populates available channel
1065 * list according to channel bonding mode. This will be called for
1066 * 80 MHz and 40 Mhz only. For 20 MHz no need for bitmap hence list
1067 * is directly created while parsing the main list
1068 *
1069 * Return: number of channels found
1070 */
1071static uint8_t sap_populate_available_channels(chan_bonding_bitmap *bitmap,
Amar Singhale4f28ee2015-10-21 14:36:56 -07001072 enum ch_width ch_width,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001073 uint8_t *avail_chnl)
1074{
1075 uint8_t i = 0;
1076 uint8_t chnl_count = 0;
1077 uint8_t start_channel = 0;
1078
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001079 switch (ch_width) {
1080 /* VHT80 */
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001081 case CH_WIDTH_160MHZ:
1082 case CH_WIDTH_80P80MHZ:
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001083 case CH_WIDTH_80MHZ:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001084 for (i = 0; i < MAX_80MHZ_BANDS; i++) {
1085 start_channel = bitmap->chanBondingSet[i].startChannel;
1086 if (bitmap->chanBondingSet[i].channelMap ==
1087 SAP_80MHZ_MASK) {
1088 avail_chnl[chnl_count++] = start_channel;
1089 avail_chnl[chnl_count++] = start_channel + 4;
1090 avail_chnl[chnl_count++] = start_channel + 8;
1091 avail_chnl[chnl_count++] = start_channel + 12;
1092 }
1093 }
1094 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001095 /* HT40 */
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001096 case CH_WIDTH_40MHZ:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001097 for (i = 0; i < MAX_80MHZ_BANDS; i++) {
1098 start_channel = bitmap->chanBondingSet[i].startChannel;
1099 if ((bitmap->chanBondingSet[i].channelMap &
1100 SAP_40MHZ_MASK_L) == SAP_40MHZ_MASK_L) {
1101 avail_chnl[chnl_count++] = start_channel;
1102 avail_chnl[chnl_count++] = start_channel + 4;
1103 } else if ((bitmap->chanBondingSet[i].channelMap &
1104 SAP_40MHZ_MASK_H) == SAP_40MHZ_MASK_H) {
1105 avail_chnl[chnl_count++] = start_channel + 8;
1106 avail_chnl[chnl_count++] = start_channel + 12;
1107 }
1108 }
1109 break;
1110 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301111 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001112 FL("Invalid case."));
1113 break;
1114 }
1115
1116 return chnl_count;
1117}
1118
1119/*
1120 * FUNCTION sap_dfs_is_w53_invalid
1121 *
1122 * DESCRIPTION Checks if the passed channel is W53 and returns if
1123 * SAP W53 opearation is allowed.
1124 *
1125 * DEPENDENCIES PARAMETERS
1126 * IN hHAL : HAL pointer
1127 * channelID: Channel Number to be verified
1128 *
1129 * RETURN VALUE : bool
1130 * true: If W53 operation is disabled
1131 * false: If W53 operation is enabled
1132 *
1133 * SIDE EFFECTS
1134 */
1135bool sap_dfs_is_w53_invalid(tHalHandle hHal, uint8_t channelID)
1136{
1137 tpAniSirGlobal pMac;
1138
1139 pMac = PMAC_STRUCT(hHal);
1140 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301141 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001142 FL("invalid pMac"));
1143 return false;
1144 }
1145
1146 /*
1147 * Check for JAPAN W53 Channel operation capability
1148 */
1149 if (true == pMac->sap.SapDfsInfo.is_dfs_w53_disabled &&
1150 true == IS_CHAN_JAPAN_W53(channelID)) {
1151 return true;
1152 }
1153
1154 return false;
1155}
1156
1157/*
1158 * FUNCTION sap_dfs_is_channel_in_preferred_location
1159 *
1160 * DESCRIPTION Checks if the passed channel is in accordance with preferred
1161 * Channel location settings.
1162 *
1163 * DEPENDENCIES PARAMETERS
1164 * IN hHAL : HAL pointer
1165 * channelID: Channel Number to be verified
1166 *
1167 * RETURN VALUE :bool
1168 * true:If Channel location is same as the preferred location
1169 * false:If Channel location is not same as the preferred location
1170 *
1171 * SIDE EFFECTS
1172 */
1173bool sap_dfs_is_channel_in_preferred_location(tHalHandle hHal, uint8_t channelID)
1174{
1175 tpAniSirGlobal pMac;
1176
1177 pMac = PMAC_STRUCT(hHal);
1178 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301179 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001180 FL("invalid pMac"));
1181 return true;
1182 }
1183 if ((SAP_CHAN_PREFERRED_INDOOR ==
1184 pMac->sap.SapDfsInfo.sap_operating_chan_preferred_location) &&
1185 (true == IS_CHAN_JAPAN_OUTDOOR(channelID))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301186 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001187 FL
1188 ("CHAN=%d is Outdoor so invalid,preferred Indoor only"),
1189 channelID);
1190 return false;
1191 } else if ((SAP_CHAN_PREFERRED_OUTDOOR ==
1192 pMac->sap.SapDfsInfo.sap_operating_chan_preferred_location)
1193 && (true == IS_CHAN_JAPAN_INDOOR(channelID))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301194 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001195 FL
1196 ("CHAN=%d is Indoor so invalid,preferred Outdoor only"),
1197 channelID);
1198 return false;
1199 }
1200
1201 return true;
1202}
1203
1204#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
1205/**
1206 * sap_check_in_avoid_ch_list() - checks if given channel present is channel
1207 * avoidance list
1208 *
1209 * @sap_ctx: sap context.
1210 * @channel: channel to be checked in sap_ctx's avoid ch list
1211 *
1212 * sap_ctx contains sap_avoid_ch_info strcut containing the list of channels on
1213 * which MDM device's AP with MCC was detected. This function checks if given
1214 * channel is present in that list.
1215 *
1216 * Return: true, if channel was present, false othersie.
1217 */
1218bool sap_check_in_avoid_ch_list(ptSapContext sap_ctx, uint8_t channel)
1219{
1220 uint8_t i = 0;
1221 struct sap_avoid_channels_info *ie_info =
1222 &sap_ctx->sap_detected_avoid_ch_ie;
1223 for (i = 0; i < sizeof(ie_info->channels); i++)
1224 if (ie_info->channels[i] == channel)
1225 return true;
1226 return false;
1227}
1228#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
1229
1230/*
1231 * This function randomly pick up an AVAILABLE channel
1232 */
1233static uint8_t sap_random_channel_sel(ptSapContext sapContext)
1234{
1235 uint32_t random_byte = 0;
1236 uint8_t available_ch_cnt = 0;
1237 uint8_t avail_dfs_chan_count = 0;
1238 uint8_t avail_non_dfs_chan_count = 0;
1239 uint8_t valid_chnl_count = 0;
1240 uint8_t availableChannels[WNI_CFG_VALID_CHANNEL_LIST_LEN] = { 0, };
1241 uint8_t avail_dfs_chan_list[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0,};
1242 uint8_t avail_non_dfs_chan_list[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0,};
1243 uint8_t target_channel = 0;
1244 bool isChannelNol = false;
1245 bool isOutOfRange = false;
1246 chan_bonding_bitmap channelBitmap;
1247 uint8_t i = 0;
1248 uint8_t channelID;
1249 tHalHandle hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
1250 tpAniSirGlobal pMac;
Amar Singhale4f28ee2015-10-21 14:36:56 -07001251 enum ch_width ch_width;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001252 uint8_t *tmp_ch_lst = NULL;
1253 uint8_t dfs_region;
1254
1255 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301256 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001257 FL("invalid hHal"));
1258 return target_channel;
1259 }
1260
1261 pMac = PMAC_STRUCT(hHal);
1262 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301263 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001264 FL("invalid pMac"));
1265 return target_channel;
1266 }
1267
1268 /*
1269 * Retrieve the original one and store it.
1270 * use the stored original value when you call this function next time
1271 * so fall back mechanism always starts with original ini value.
1272 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001273 if (pMac->sap.SapDfsInfo.orig_chanWidth == 0) {
1274 pMac->sap.SapDfsInfo.orig_chanWidth =
1275 sapContext->ch_width_orig;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001276 ch_width = pMac->sap.SapDfsInfo.orig_chanWidth;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001277 } else {
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001278 ch_width = pMac->sap.SapDfsInfo.orig_chanWidth;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001279 }
1280
1281 if (sap_get5_g_hz_channel_list(sapContext)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301282 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001283 FL("Getting 5Ghz channel list failed"));
1284 return target_channel;
1285 }
1286
1287 cds_get_dfs_region(&dfs_region);
1288
1289 /*
1290 * valid_chnl_count will be used to find number of valid channels
1291 * after following for loop ends
1292 */
1293 valid_chnl_count = sapContext->SapAllChnlList.numChannel;
1294 /* loop to check ACS range or NOL channels */
1295 for (i = 0; i < sapContext->SapAllChnlList.numChannel; i++) {
1296 channelID = sapContext->SapAllChnlList.channelList[i].channel;
1297
1298 /*
1299 * IN JAPAN REGULATORY DOMAIN CHECK IF THE FOLLOWING TWO
1300 * TWO RULES APPLY AND FILTER THE AVAILABLE CHANNELS
1301 * ACCORDINGLY.
1302 *
1303 * 1. If we are operating in Japan regulatory domain
1304 * Check if Japan W53 Channel operation is NOT
1305 * allowed and if its not allowed then mark all the
1306 * W53 channels as Invalid.
1307 *
1308 * 2. If we are operating in Japan regulatory domain
1309 * Check if channel switch between Indoor/Outdoor
1310 * is allowed. If it is not allowed then limit
1311 * the avaiable channels to Indoor or Outdoor
1312 * channels only based up on the SAP Channel location
1313 * indicated by "sap_operating_channel_location" param.
1314 */
1315 if (DFS_MKK4_DOMAIN == dfs_region) {
1316 /*
1317 * Check for JAPAN W53 Channel operation capability
1318 */
1319 if (true == sap_dfs_is_w53_invalid(hHal, channelID)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301320 QDF_TRACE(QDF_MODULE_ID_SAP,
1321 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001322 FL
1323 ("index:%d, Channel=%d Invalid,Japan W53 Disabled"),
1324 i, channelID);
1325 sapContext->SapAllChnlList.channelList[i].
1326 valid = false;
1327 valid_chnl_count--;
1328 continue;
1329 }
1330
1331 /*
1332 * If SAP's preferred channel location is Indoor
1333 * then set all the outdoor channels in the domain
1334 * to invalid.If the preferred channel location is
1335 * outdoor then set all the Indoor channels in the
1336 * domain to Invalid.
1337 */
1338 if (false ==
1339 sap_dfs_is_channel_in_preferred_location(hHal,
1340 channelID)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301341 QDF_TRACE(QDF_MODULE_ID_SAP,
1342 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001343 FL
1344 ("CHAN=%d is invalid,preferred Channel Location %d Only"),
1345 channelID,
1346 pMac->sap.SapDfsInfo.
1347 sap_operating_chan_preferred_location);
1348 sapContext->SapAllChnlList.channelList[i].
1349 valid = false;
1350 valid_chnl_count--;
1351 continue;
1352 }
1353 }
1354
1355 if (cds_get_channel_state(channelID) ==
1356 CHANNEL_STATE_DFS) {
1357 isChannelNol =
1358 sap_dfs_is_channel_in_nol_list(sapContext,
1359 channelID,
1360 PHY_SINGLE_CHANNEL_CENTERED);
1361 if (true == isChannelNol) {
1362 /*
1363 * Mark this channel invalid since it is still
1364 * in DFS Non-Occupancy-Period which is 30 mins.
1365 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301366 QDF_TRACE(QDF_MODULE_ID_SAP,
1367 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001368 FL
1369 ("index: %d, Channel = %d Present in NOL LIST"),
1370 i, channelID);
1371 sapContext->SapAllChnlList.channelList[i].
1372 valid = false;
1373 valid_chnl_count--;
1374 continue;
1375 }
1376 }
1377
1378#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
1379 /* avoid ch on which another MDM AP in MCC mode is detected */
1380 if (pMac->sap.sap_channel_avoidance
1381 && sapContext->sap_detected_avoid_ch_ie.present) {
1382 if (sap_check_in_avoid_ch_list(sapContext, channelID)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301383 QDF_TRACE(QDF_MODULE_ID_SAP,
1384 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001385 FL("index: %d, Channel = %d, avoided due to presence of another AP+AP MCC device in same channel."),
1386 i, channelID);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301387 sapContext->SapAllChnlList.channelList[i].
1388 valid = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001389 }
1390 }
1391#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
1392
1393 /* check if the channel is within ACS channel range */
1394 isOutOfRange = sap_acs_channel_check(sapContext, channelID);
1395 if (true == isOutOfRange) {
1396 /*
1397 * mark this channel invalid since it is out of ACS
1398 * channel range
1399 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301400 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001401 FL
1402 ("index: %d, Channel = %d out of ACS channel range"),
1403 i, channelID);
1404 sapContext->SapAllChnlList.channelList[i].valid = false;
1405 valid_chnl_count--;
1406 continue;
1407 }
1408 } /* end of check for NOL or ACS channels */
1409
1410 /* valid_chnl_count now have number of valid channels */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301411 tmp_ch_lst = qdf_mem_malloc(valid_chnl_count);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001412 if (tmp_ch_lst == NULL) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301413 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001414 FL("sapdfs: memory alloc failed"));
1415 return target_channel;
1416 }
1417
1418 do {
1419 uint8_t j = 0;
1420#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
1421 tSapDfsNolInfo *nol = pMac->sap.SapDfsInfo.sapDfsChannelNolList;
1422#endif
1423
1424 /* prepare temp list of just the valid channels */
1425 for (i = 0; i < sapContext->SapAllChnlList.numChannel; i++) {
1426 if (sapContext->SapAllChnlList.channelList[i].valid) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301427 QDF_TRACE(QDF_MODULE_ID_SAP,
1428 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001429 FL
1430 ("sapdfs: Adding Channel = %d to temp List"),
1431 sapContext->SapAllChnlList.
1432 channelList[i].channel);
1433 tmp_ch_lst[j++] = sapContext->SapAllChnlList.
1434 channelList[i].channel;
1435 }
1436 }
1437
1438#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301439 QDF_TRACE(QDF_MODULE_ID_SAP,
1440 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001441 FL
1442 ("sapdfs: Processing temp channel list against NOL.")
1443 );
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301444 if (QDF_STATUS_SUCCESS !=
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001445 sap_mark_channels_leaking_into_nol(sapContext,
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001446 ch_width,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001447 nol,
1448 valid_chnl_count,
1449 tmp_ch_lst)) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301450 qdf_mem_free(tmp_ch_lst);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001451 return target_channel;
1452 }
1453#endif
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301454 qdf_mem_zero(availableChannels, sizeof(availableChannels));
1455 qdf_mem_zero(&channelBitmap, sizeof(channelBitmap));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001456 channelBitmap.chanBondingSet[0].startChannel = 36;
1457 channelBitmap.chanBondingSet[1].startChannel = 52;
1458 channelBitmap.chanBondingSet[2].startChannel = 100;
1459 channelBitmap.chanBondingSet[3].startChannel = 116;
1460 channelBitmap.chanBondingSet[3].startChannel = 132;
1461 channelBitmap.chanBondingSet[4].startChannel = 149;
1462 /* now loop through whatever is left of channel list */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301463 QDF_TRACE(QDF_MODULE_ID_SAP,
1464 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001465 FL("sapdfs: Moving temp channel list to final."));
1466 for (i = 0; i < valid_chnl_count; i++) {
1467 /*
1468 * add channel from temp channel list to bitmap or fianl
1469 * channel list (in case of 20MHz width)
1470 */
1471 if (tmp_ch_lst[i] != 0) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301472 QDF_TRACE(QDF_MODULE_ID_SAP,
1473 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001474 FL("sapdfs: processing channel: %d "),
1475 tmp_ch_lst[i]);
1476 /*
1477 * for 20MHz, directly create available
1478 * channel list
1479 */
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001480 if (ch_width == CH_WIDTH_20MHZ) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301481 QDF_TRACE(QDF_MODULE_ID_SAP,
1482 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001483 FL
1484 ("sapdfs: Channel=%d added to available list"),
1485 tmp_ch_lst[i]);
1486 availableChannels[available_ch_cnt++] =
1487 tmp_ch_lst[i];
1488 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301489 QDF_TRACE(QDF_MODULE_ID_SAP,
1490 QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001491 FL("sapdfs: Channel=%d added to bitmap"),
1492 tmp_ch_lst[i]);
1493 sap_set_bitmap(&channelBitmap,
1494 tmp_ch_lst[i]);
1495 }
1496 }
1497 }
1498
1499 /*
1500 * if 40 MHz or 80 MHz, populate available
1501 * channel list from bitmap
1502 */
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001503 if (ch_width != CH_WIDTH_20MHZ) {
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001504 bool flag = false;
1505 uint8_t count = 0, new_160_startchannel = 0;
1506 uint8_t index = 0, sec_seg_ch = 0;
1507 uint8_t primary_seg_start_ch = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001508 available_ch_cnt =
1509 sap_populate_available_channels(&channelBitmap,
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001510 ch_width,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001511 availableChannels);
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001512
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001513 /*
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001514 * If no valid channel bonding found,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001515 * fallback to lower bandwidth
1516 */
1517 if (available_ch_cnt == 0) {
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001518 if ((ch_width == CH_WIDTH_160MHZ) ||
1519 (ch_width == CH_WIDTH_80P80MHZ) ||
1520 (ch_width == CH_WIDTH_80MHZ)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301521 QDF_TRACE(QDF_MODULE_ID_SAP,
1522 QDF_TRACE_LEVEL_WARN,
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001523 FL("sapdfs:Changing chanWidth from [%d] to 40Mhz"),
1524 ch_width);
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001525 ch_width = CH_WIDTH_40MHZ;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001526 continue;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001527 } else if (ch_width == CH_WIDTH_40MHZ) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301528 QDF_TRACE(QDF_MODULE_ID_SAP,
1529 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001530 FL
1531 ("sapdfs:No 40MHz cb found, falling to 20MHz"));
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301532 QDF_TRACE(QDF_MODULE_ID_SAP,
1533 QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001534 FL
1535 ("sapdfs:Changing chanWidth from [%d] to [%d]"),
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001536 ch_width,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001537 CH_WIDTH_20MHZ);
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001538 ch_width = CH_WIDTH_20MHZ;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001539 /* continue to start of do loop */
1540 continue;
1541 }
1542 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001543
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001544 /*
1545 * Number of channel count should be more than 8 to
1546 * switch new channel in 160Mhz band
1547 */
1548 if (((ch_width == CH_WIDTH_160MHZ) ||
1549 (ch_width == CH_WIDTH_80P80MHZ)) &&
1550 (available_ch_cnt < SIR_DFS_MAX_20M_SUB_CH)) {
1551 QDF_TRACE(QDF_MODULE_ID_SAP,
1552 QDF_TRACE_LEVEL_WARN,
1553 FL("sapdfs:Changing chanWidth from [%d] to [%d]"),
1554 ch_width, CH_WIDTH_80MHZ);
1555 ch_width = CH_WIDTH_80MHZ;
1556 continue;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001557 }
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001558 if (ch_width == CH_WIDTH_160MHZ) {
1559 /*
1560 * NA supports only 2 blocks for 160Mhz
1561 * bandwidth i.e 36-64 & 100-128 and
1562 * all the channels in these blocks are
1563 * continuous and seperated by 4Mhz.
1564 */
1565 for (i = 1; ((i < available_ch_cnt)); i++) {
1566 if ((availableChannels[i] -
1567 availableChannels[i-1]) == 4)
1568 count++;
1569 else
1570 count = 0;
1571 if (count ==
1572 SIR_DFS_MAX_20M_SUB_CH - 1) {
1573 flag = true;
1574 new_160_startchannel =
1575 availableChannels[i-7];
1576 break;
1577 }
1578 }
1579 } else if (ch_width == CH_WIDTH_80P80MHZ) {
1580 flag = true;
1581 }
1582 if ((flag == false) && (ch_width > CH_WIDTH_80MHZ)) {
1583 ch_width = CH_WIDTH_80MHZ;
1584 continue;
1585 }
1586
1587 if (ch_width == CH_WIDTH_160MHZ) {
1588 cds_rand_get_bytes(0, (uint8_t *)&random_byte,
1589 1);
1590 random_byte = (random_byte +
1591 qdf_mc_timer_get_system_ticks())
1592 % SIR_DFS_MAX_20M_SUB_CH;
1593 pMac->sap.SapDfsInfo.new_chanWidth = ch_width;
1594 target_channel = new_160_startchannel +
1595 (random_byte * 4);
1596 QDF_TRACE(QDF_MODULE_ID_SAP,
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301597 QDF_TRACE_LEVEL_INFO_LOW,
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001598 FL("sapdfs: New Channel width = %d"),
1599 pMac->sap.SapDfsInfo.new_chanWidth);
1600 QDF_TRACE(QDF_MODULE_ID_SAP,
1601 QDF_TRACE_LEVEL_INFO_LOW,
1602 FL("sapdfs: target_channel = %d"),
1603 target_channel);
1604
1605 qdf_mem_free(tmp_ch_lst);
1606 return target_channel;
1607 } else if (ch_width == CH_WIDTH_80P80MHZ) {
1608 cds_rand_get_bytes(0,
1609 (uint8_t *)&random_byte, 1);
1610 index = (random_byte +
1611 qdf_mc_timer_get_system_ticks()) %
1612 available_ch_cnt;
1613 target_channel = availableChannels[index];
1614 index -= (index % 4);
1615 primary_seg_start_ch = availableChannels[index];
1616
1617 /* reset channels associate with primary 80Mhz */
1618 for (i = 0; i < 4; i++)
1619 availableChannels[i + index] = 0;
1620 /*
1621 * select and calculate center frequency for
1622 * secondary segement
1623 */
1624 for (i = 0; i < available_ch_cnt / 4; i++) {
1625 if (availableChannels[i * 4] &&
1626 (abs(primary_seg_start_ch -
1627 availableChannels[i * 4]) >
1628 (SIR_DFS_MAX_20M_SUB_CH * 2))) {
1629
1630 sec_seg_ch =
1631 availableChannels[i * 4] +
1632 SIR_80MHZ_START_CENTER_CH_DIFF;
1633
1634 break;
1635 }
1636 }
1637 if (!sec_seg_ch &&
1638 (available_ch_cnt ==
1639 SIR_DFS_MAX_20M_SUB_CH))
1640 ch_width = CH_WIDTH_160MHZ;
1641 else if (!sec_seg_ch)
1642 ch_width = CH_WIDTH_80MHZ;
1643
1644 pMac->sap.SapDfsInfo.new_ch_params.center_freq_seg1
1645 = sec_seg_ch;
1646 pMac->sap.SapDfsInfo.new_chanWidth = ch_width;
1647
1648 QDF_TRACE(QDF_MODULE_ID_SAP,
1649 QDF_TRACE_LEVEL_INFO_LOW,
1650 FL("sapdfs: New Channel width = %d"),
1651 pMac->sap.SapDfsInfo.new_chanWidth);
1652 QDF_TRACE(QDF_MODULE_ID_SAP,
1653 QDF_TRACE_LEVEL_INFO_LOW,
1654 FL("sapdfs: New Center Freq Seg1 = %d"),
1655 sec_seg_ch);
1656 QDF_TRACE(QDF_MODULE_ID_SAP,
1657 QDF_TRACE_LEVEL_INFO_LOW,
1658 FL("sapdfs: target_channel = %d"),
1659 target_channel);
1660
1661 qdf_mem_free(tmp_ch_lst);
1662
1663 return target_channel;
1664 }
1665 /*
1666 * by now, available channels list will be populated or
1667 * no channels are avaialbe
1668 */
1669 if (available_ch_cnt) {
1670 for (i = 0; i < available_ch_cnt; i++) {
1671 if (CDS_IS_DFS_CH(availableChannels[i])) {
1672 avail_dfs_chan_list[
1673 avail_dfs_chan_count++] =
1674 availableChannels[i];
1675 } else {
1676 avail_non_dfs_chan_list[
1677 avail_non_dfs_chan_count++] =
1678 availableChannels[i];
1679 }
1680 }
1681 } else {
1682 QDF_TRACE(QDF_MODULE_ID_SAP,
1683 QDF_TRACE_LEVEL_INFO_LOW,
1684 FL("No target channel found"));
1685 }
1686
1687 cds_rand_get_bytes(0, (uint8_t *)&random_byte, 1);
1688
1689 /* Give preference to non-DFS channel */
1690 if (!pMac->f_prefer_non_dfs_on_radar) {
1691 i = (random_byte + qdf_mc_timer_get_system_ticks()) %
1692 available_ch_cnt;
1693 target_channel = availableChannels[i];
1694 } else if (avail_non_dfs_chan_count) {
1695 i = (random_byte + qdf_mc_timer_get_system_ticks()) %
1696 avail_non_dfs_chan_count;
1697 target_channel = avail_non_dfs_chan_list[i];
1698 } else {
1699 i = (random_byte + qdf_mc_timer_get_system_ticks()) %
1700 avail_dfs_chan_count;
1701 target_channel = avail_dfs_chan_list[i];
1702 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001703 }
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001704 pMac->sap.SapDfsInfo.new_chanWidth = ch_width;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301705 QDF_TRACE(QDF_MODULE_ID_SAP,
1706 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001707 FL("sapdfs: New Channel width = %d"),
1708 pMac->sap.SapDfsInfo.new_chanWidth);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301709 QDF_TRACE(QDF_MODULE_ID_SAP,
1710 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001711 FL("sapdfs: target_channel = %d"),
1712 target_channel);
1713 break;
1714 /* this loop will iterate at max 3 times */
1715 } while (1);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301716 qdf_mem_free(tmp_ch_lst);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001717 return target_channel;
1718}
1719
1720bool sap_acs_channel_check(ptSapContext sapContext, uint8_t channelNumber)
1721{
1722 int i = 0;
1723 if (!sapContext->acs_cfg->acs_mode)
1724 return false;
1725
1726 if ((channelNumber >= sapContext->acs_cfg->start_ch) ||
1727 (channelNumber <= sapContext->acs_cfg->end_ch)) {
1728 if (!sapContext->acs_cfg->ch_list) {
1729 return false;
1730 } else {
1731 for (i = 0; i < sapContext->acs_cfg->ch_list_count; i++)
1732 if (channelNumber ==
1733 sapContext->acs_cfg->ch_list[i])
1734 return false;
1735 }
1736 }
1737 return true;
1738}
1739
1740/**
1741 * sap_mark_dfs_channels() - to mark dfs channel
1742 * @sapContext: pointer sap context
1743 * @channels: list of channels
1744 * @numChannels: number of channels
1745 * @time: time
1746 *
1747 * Mark the channels in NOL with time and eSAP_DFS_CHANNEL_UNAVAILABLE
1748 *
1749 * Return: none
1750 */
1751void sap_mark_dfs_channels(ptSapContext sapContext, uint8_t *channels,
1752 uint8_t numChannels, uint64_t time)
1753{
1754 int i, j;
1755 tSapDfsNolInfo *psapDfsChannelNolList = NULL;
1756 uint8_t nRegDomainDfsChannels;
1757 tHalHandle hHal;
1758 tpAniSirGlobal pMac;
1759
1760 hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
1761 if (NULL == channels)
1762 return;
1763 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301764 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001765 FL("invalid hHal"));
1766 return;
1767 }
1768 pMac = PMAC_STRUCT(hHal);
1769 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301770 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001771 FL("invalid pMac"));
1772 return;
1773 }
1774
1775 /*
1776 * Mark the current channel on which Radar is found
1777 * in the NOL list as eSAP_DFS_CHANNEL_UNAVAILABLE.
1778 */
1779 psapDfsChannelNolList = pMac->sap.SapDfsInfo.sapDfsChannelNolList;
1780 nRegDomainDfsChannels =
1781 pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels;
1782
1783 for (i = 0; i < numChannels; i++) {
1784 for (j = 0; j <= nRegDomainDfsChannels; j++) {
1785 if (!(psapDfsChannelNolList[j].dfs_channel_number ==
1786 channels[i]))
1787 continue;
1788 /*
1789 * If channel is already in NOL, don't update it again.
1790 * This is useful when marking bonding channels which
1791 * are already unavailable.
1792 */
1793 if (psapDfsChannelNolList[j].radar_status_flag ==
1794 eSAP_DFS_CHANNEL_UNAVAILABLE) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301795 QDF_TRACE(QDF_MODULE_ID_SAP,
1796 QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001797 FL("Channel=%d already in NOL"),
1798 channels[i]);
1799 continue;
1800 }
1801 /*
1802 * Capture the Radar Found timestamp on the
1803 * Current Channel in ms.
1804 */
1805 psapDfsChannelNolList[j].radar_found_timestamp = time;
1806 /* Mark the Channel to be unavailble for next 30 mins */
1807 psapDfsChannelNolList[j].radar_status_flag =
1808 eSAP_DFS_CHANNEL_UNAVAILABLE;
1809
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301810 QDF_TRACE(QDF_MODULE_ID_SAP,
1811 QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001812 FL("Channel=%d Added to NOL LIST"),
1813 channels[i]);
1814 }
1815 }
1816}
1817
1818/*
1819 * This Function is to get bonding channels from primary channel.
1820 *
1821 */
1822uint8_t sap_get_bonding_channels(ptSapContext sapContext, uint8_t channel,
1823 uint8_t *channels, uint8_t size,
1824 ePhyChanBondState chanBondState)
1825{
1826 tHalHandle hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
1827 tpAniSirGlobal pMac;
1828 uint8_t numChannel;
1829
1830 if (channels == NULL)
1831 return 0;
1832
1833 if (size < MAX_BONDED_CHANNELS)
1834 return 0;
1835
1836 if (NULL != hHal) {
1837 pMac = PMAC_STRUCT(hHal);
1838 } else
1839 return 0;
1840
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301841 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001842 FL("cbmode: %d, channel: %d"), chanBondState, channel);
1843
1844 switch (chanBondState) {
1845 case PHY_SINGLE_CHANNEL_CENTERED:
1846 numChannel = 1;
1847 channels[0] = channel;
1848 break;
1849 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
1850 numChannel = 2;
1851 channels[0] = channel - 4;
1852 channels[1] = channel;
1853 break;
1854 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
1855 numChannel = 2;
1856 channels[0] = channel;
1857 channels[1] = channel + 4;
1858 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001859 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
1860 numChannel = 4;
1861 channels[0] = channel;
1862 channels[1] = channel + 4;
1863 channels[2] = channel + 8;
1864 channels[3] = channel + 12;
1865 break;
1866 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
1867 numChannel = 4;
1868 channels[0] = channel - 4;
1869 channels[1] = channel;
1870 channels[2] = channel + 4;
1871 channels[3] = channel + 8;
1872 break;
1873 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
1874 numChannel = 4;
1875 channels[0] = channel - 8;
1876 channels[1] = channel - 4;
1877 channels[2] = channel;
1878 channels[3] = channel + 4;
1879 break;
1880 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
1881 numChannel = 4;
1882 channels[0] = channel - 12;
1883 channels[1] = channel - 8;
1884 channels[2] = channel - 4;
1885 channels[3] = channel;
1886 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001887 default:
1888 numChannel = 1;
1889 channels[0] = channel;
1890 break;
1891 }
1892
1893 return numChannel;
1894}
1895
1896/**
1897 * sap_dfs_check_if_channel_avaialable() - Check if a channel is out of NOL
1898 * @nol: Pointer to the Non-Occupancy List.
1899 *
1900 * This function Checks if a given channel is available or
1901 * usable or unavailable based on the time lapse since the
1902 * last radar time stamp.
1903 *
1904 * Return: true if channel available or usable, false if unavailable.
1905 */
1906static bool sap_dfs_check_if_channel_avaialable(tSapDfsNolInfo *nol)
1907{
1908 uint64_t time_since_last_radar, time_when_radar_found, current_time = 0;
1909 uint64_t max_jiffies;
1910
1911 if ((nol->radar_status_flag == eSAP_DFS_CHANNEL_USABLE) ||
1912 (nol->radar_status_flag == eSAP_DFS_CHANNEL_AVAILABLE)) {
1913 /*
1914 * Allow SAP operation on this channel
1915 * either the DFS channel has not been used
1916 * for SAP operation or it is available for
1917 * SAP operation since it is past
1918 * Non-Occupancy-Period so, return false.
1919 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301920 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001921 FL("Chan=%d not in NOL,CHAN AVAILABLE"),
1922 nol->dfs_channel_number);
1923 return true;
1924 } else if (nol->radar_status_flag == eSAP_DFS_CHANNEL_UNAVAILABLE) {
1925 /*
1926 * If a DFS Channel is UNAVAILABLE then
1927 * check to see if it is past
1928 * Non-occupancy-period
1929 * of 30 minutes. If it is past 30 mins then
1930 * mark the channel as AVAILABLE and return
1931 * false as the channel is not anymore in
1932 * NON-Occupancy-Period.
1933 */
1934 time_when_radar_found = nol->radar_found_timestamp;
1935 current_time = cds_get_monotonic_boottime();
1936 if (current_time < time_when_radar_found) {
1937 /* cds_get_monotonic_boottime() can overflow.
1938 * Jiffies is initialized such that 32 bit jiffies
1939 * value wrap 5 minutes after boot so jiffies wrap bugs
1940 * show up earlier
1941 */
1942 max_jiffies = (uint64_t)UINT_MAX * 1000;
1943 time_since_last_radar = (max_jiffies -
1944 time_when_radar_found) + (current_time);
1945 } else {
1946 time_since_last_radar = current_time -
1947 time_when_radar_found;
1948 }
1949 if (time_since_last_radar >= SAP_DFS_NON_OCCUPANCY_PERIOD) {
1950 nol->radar_status_flag = eSAP_DFS_CHANNEL_AVAILABLE;
1951 nol->radar_found_timestamp = 0;
1952
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301953 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001954 FL("Chan=%d not in NOL, Channel AVAILABLE"),
1955 nol->dfs_channel_number);
1956 return true;
1957 } else {
1958 /*
1959 * Channel is not still available for
1960 * SAP operation so return true; As the
1961 * Channel is still in
1962 * Non-occupancy-Period.
1963 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301964 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001965 FL("Chan=%d in NOL, Channel UNAVAILBLE"),
1966 nol->dfs_channel_number);
1967 return false;
1968 }
1969 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301970 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001971 FL("Invalid Radar Status Flag"));
1972 }
1973 return true;
1974}
1975
1976/**
1977 * sap_dfs_is_channel_in_nol_list() - given bonded channel is available
1978 * @sap_context: Handle to SAP context.
1979 * @channel_number: Channel on which availability should be checked.
1980 * @chan_bondState: The channel bonding mode of the passed channel.
1981 *
1982 * This function Checks if a given bonded channel is available or
1983 * usable for DFS operation.
1984 *
1985 * Return: false if channel is available, true if channel is in NOL.
1986 */
1987bool
1988sap_dfs_is_channel_in_nol_list(ptSapContext sap_context,
1989 uint8_t channel_number,
1990 ePhyChanBondState chan_bondState)
1991{
1992 int i, j;
1993 tHalHandle h_hal = CDS_GET_HAL_CB(sap_context->p_cds_gctx);
1994 tpAniSirGlobal mac_ctx;
1995 uint8_t channels[MAX_BONDED_CHANNELS];
1996 uint8_t num_channels;
1997 tSapDfsNolInfo *nol;
1998 tSapDfsInfo *dfs_info;
1999 bool channel_available;
2000
2001 if (NULL == h_hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302002 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002003 FL("invalid h_hal"));
2004 return false;
2005 } else {
2006 mac_ctx = PMAC_STRUCT(h_hal);
2007 }
2008
2009 dfs_info = &mac_ctx->sap.SapDfsInfo;
2010 if ((dfs_info->numCurrentRegDomainDfsChannels == 0) ||
2011 (dfs_info->numCurrentRegDomainDfsChannels >
2012 NUM_5GHZ_CHANNELS)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302013 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002014 FL("invalid dfs channel count %d"),
2015 dfs_info->numCurrentRegDomainDfsChannels);
2016 return false;
2017 }
2018
2019 /* get the bonded channels */
2020 num_channels = sap_get_bonding_channels(sap_context, channel_number,
2021 channels, MAX_BONDED_CHANNELS, chan_bondState);
2022
2023 /* check for NOL, first on will break the loop */
2024 for (j = 0; j < num_channels; j++) {
2025 for (i = 0; i < dfs_info->numCurrentRegDomainDfsChannels; i++) {
2026 nol = &dfs_info->sapDfsChannelNolList[i];
2027 if (nol->dfs_channel_number != channels[j])
2028 continue;
2029
2030 channel_available =
2031 sap_dfs_check_if_channel_avaialable(nol);
2032
2033 if (channel_available == false)
2034 break;
2035
2036 } /* loop for dfs channels */
2037
2038 if (i < dfs_info->numCurrentRegDomainDfsChannels)
2039 break;
2040
2041 } /* loop for bonded channels */
2042
2043 /*
2044 * if any of the channel is not available, mark all available channels
2045 * as unavailable with same time stamp.
2046 */
2047 if (j < num_channels &&
2048 i < dfs_info->numCurrentRegDomainDfsChannels) {
2049 if (num_channels > MAX_BONDED_CHANNELS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302050 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002051 FL("num_channel>MAX_BONDED_CHANNEL, reset"));
2052 num_channels = MAX_BONDED_CHANNELS;
2053 }
2054 nol = &dfs_info->sapDfsChannelNolList[i];
2055 sap_mark_dfs_channels(sap_context, channels, num_channels,
2056 nol->radar_found_timestamp);
2057
2058 /* set DFS-NOL back to keep it update-to-date in CNSS */
2059 sap_signal_hdd_event(sap_context, NULL, eSAP_DFS_NOL_SET,
2060 (void *) eSAP_STATUS_SUCCESS);
2061
2062 return true;
2063 }
2064
2065 return false;
2066}
2067
2068/**
2069 * sap_goto_channel_sel - Function for initiating scan request for SME
2070 * @sap_context: Sap Context value.
2071 * @sap_event: State machine event
2072 * @sap_do_acs_pre_start_bss: true, if ACS scan is issued pre start BSS
2073 * false, if ACS scan is issued post start BSS.
2074 *
2075 * Initiates sme scan for ACS to pick a channel.
2076 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302077 * Return: The QDF_STATUS code associated with performing the operation.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002078 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302079QDF_STATUS sap_goto_channel_sel(ptSapContext sap_context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002080 ptWLAN_SAPEvent sap_event,
2081 bool sap_do_acs_pre_start_bss)
2082{
2083
2084 /* Initiate a SCAN request */
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302085 QDF_STATUS qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002086 /* To be initialised if scan is required */
2087 tCsrScanRequest scan_request;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302088 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002089
2090#ifdef SOFTAP_CHANNEL_RANGE
2091 uint8_t *channel_list = NULL;
2092 uint8_t num_of_channels = 0;
2093#endif
2094 tHalHandle h_hal;
2095 uint8_t con_ch;
2096
Anurag Chouhan6d760662016-02-20 16:05:43 +05302097 h_hal = cds_get_context(QDF_MODULE_ID_SME);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002098 if (NULL == h_hal) {
2099 /* we have a serious problem */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302100 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002101 FL("invalid h_hal"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302102 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002103 }
Ryan Hsu4252a2f2016-01-05 11:18:24 -08002104
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002105 if (cds_concurrent_beaconing_sessions_running()) {
2106 con_ch =
2107 sme_get_concurrent_operation_channel(h_hal);
Ryan Hsu4252a2f2016-01-05 11:18:24 -08002108#ifdef FEATURE_WLAN_STA_AP_MODE_DFS_DISABLE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002109 if (con_ch && sap_context->channel == AUTO_CHANNEL_SELECT) {
2110 sap_context->dfs_ch_disable = true;
2111 } else if (con_ch && sap_context->channel != con_ch &&
2112 CDS_IS_DFS_CH(sap_context->channel)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302113 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002114 FL("MCC DFS not supported in AP_AP Mode"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302115 return QDF_STATUS_E_ABORTED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002116 }
Ryan Hsu4252a2f2016-01-05 11:18:24 -08002117#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002118#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
2119 if (sap_context->cc_switch_mode !=
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302120 QDF_MCC_TO_SCC_SWITCH_DISABLE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002121 con_ch = sme_check_concurrent_channel_overlap(h_hal,
2122 sap_context->channel,
2123 sap_context->csr_roamProfile.phyMode,
2124 sap_context->cc_switch_mode);
2125 if (con_ch) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302126 QDF_TRACE(QDF_MODULE_ID_SAP,
2127 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002128 "%s: Override ch %d to %d due to CC Intf",
2129 __func__, sap_context->channel, con_ch);
2130 sap_context->channel = con_ch;
2131 }
2132 }
2133#endif
2134 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002135
Anurag Chouhan6d760662016-02-20 16:05:43 +05302136 if (cds_get_concurrency_mode() == (QDF_STA_MASK | QDF_SAP_MASK)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002137#ifdef FEATURE_WLAN_STA_AP_MODE_DFS_DISABLE
2138 if (sap_context->channel == AUTO_CHANNEL_SELECT)
2139 sap_context->dfs_ch_disable = true;
2140 else if (CDS_IS_DFS_CH(sap_context->channel)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302141 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002142 FL("DFS not supported in STA_AP Mode"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302143 return QDF_STATUS_E_ABORTED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002144 }
2145#endif
2146#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
2147 if (sap_context->cc_switch_mode !=
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302148 QDF_MCC_TO_SCC_SWITCH_DISABLE) {
Chandrasekaran Manishekar068e25e2016-03-07 11:51:07 +05302149 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
2150 FL("check for overlap: chan:%d mode:%d"),
2151 sap_context->channel,
2152 sap_context->csr_roamProfile.phyMode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002153 con_ch = sme_check_concurrent_channel_overlap(h_hal,
2154 sap_context->channel,
2155 sap_context->csr_roamProfile.phyMode,
2156 sap_context->cc_switch_mode);
2157 if (con_ch && !CDS_IS_DFS_CH(con_ch)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302158 QDF_TRACE(QDF_MODULE_ID_SAP,
2159 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002160 "%s: Override ch %d to %d due to CC Intf",
2161 __func__, sap_context->channel, con_ch);
2162 sap_context->channel = con_ch;
2163 }
2164 }
2165#endif
2166 }
2167
2168 if (sap_context->channel == AUTO_CHANNEL_SELECT) {
2169#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302170 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002171 FL("%s skip_acs_status = %d "), __func__,
2172 sap_context->acs_cfg->skip_scan_status);
2173 if (sap_context->acs_cfg->skip_scan_status !=
2174 eSAP_SKIP_ACS_SCAN) {
2175#endif
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302176 qdf_mem_zero(&scan_request, sizeof(scan_request));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002177
2178 /*
2179 * Set scanType to Active scan. FW takes care of using passive
2180 * scan for DFS and active for non DFS channels.
2181 */
2182 scan_request.scanType = eSIR_ACTIVE_SCAN;
2183
2184 /* Set min and max channel time to zero */
2185 scan_request.minChnTime = 0;
2186 scan_request.maxChnTime = 0;
2187
2188 /* Set BSSType to default type */
2189 scan_request.BSSType = eCSR_BSS_TYPE_ANY;
2190
2191#ifndef SOFTAP_CHANNEL_RANGE
2192 /*Scan all the channels */
2193 scan_request.ChannelInfo.num_of_channels = 0;
2194
2195 scan_request.ChannelInfo.ChannelList = NULL;
2196
2197 scan_request.requestType = eCSR_SCAN_REQUEST_FULL_SCAN;
2198 /* eCSR_SCAN_REQUEST_11D_SCAN; */
2199
2200#else
2201
2202 sap_get_channel_list(sap_context, &channel_list,
2203 &num_of_channels);
2204#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
2205 if (num_of_channels != 0) {
2206#endif
2207 /*Scan the channels in the list */
2208 scan_request.ChannelInfo.numOfChannels =
2209 num_of_channels;
2210
2211 scan_request.ChannelInfo.ChannelList =
2212 channel_list;
2213
2214 scan_request.requestType =
2215 eCSR_SCAN_SOFTAP_CHANNEL_RANGE;
2216
2217 sap_context->channelList = channel_list;
2218
2219#endif
2220 /* Set requestType to Full scan */
2221
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302222 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002223 FL("calling sme_scan_request"));
2224#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
2225 if (sap_context->acs_cfg->skip_scan_status ==
2226 eSAP_DO_NEW_ACS_SCAN)
2227#endif
2228 sme_scan_flush_result(h_hal);
2229 if (true == sap_do_acs_pre_start_bss) {
2230 /*
2231 * when ID == 0 11D scan/active scan with callback,
2232 * min-maxChntime set in csrScanRequest()?
2233 * csrScanCompleteCallback callback
2234 * pContext scan_request_id filled up
2235 */
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302236 qdf_ret_status = sme_scan_request(h_hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002237 sap_context->sessionId,
2238 &scan_request,
2239 &wlansap_pre_start_bss_acs_scan_callback,
2240 sap_context);
2241 } else {
2242 /*
2243 * when ID == 0 11D scan/active scan with callback,
2244 * min-maxChntime set in csrScanRequest()?
2245 * csrScanCompleteCallback callback,
2246 * pContext scan_request_id filled up
2247 */
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302248 qdf_ret_status = sme_scan_request(h_hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002249 sap_context->sessionId,
2250 &scan_request,
2251 &wlansap_scan_callback,
2252 sap_context);
2253 }
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302254 if (QDF_STATUS_SUCCESS != qdf_ret_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302255 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002256 FL("sme_scan_request fail %d!!!"),
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302257 qdf_ret_status);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302258 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002259 FL("SAP Configuring default channel, Ch=%d"),
2260 sap_context->channel);
2261 /* In case of error, switch to default channel */
2262 sap_context->channel = SAP_DEFAULT_24GHZ_CHANNEL;
2263
2264#ifdef SOFTAP_CHANNEL_RANGE
2265 if (sap_context->channelList != NULL) {
2266 sap_context->channel =
2267 sap_context->channelList[0];
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302268 qdf_mem_free(sap_context->
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002269 channelList);
2270 sap_context->channelList = NULL;
2271 }
2272#endif
2273 if (true == sap_do_acs_pre_start_bss) {
2274 /*
2275 * In case of ACS req before start Bss,
2276 * return failure so that the calling
2277 * fucntion can use the default channel.
2278 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302279 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002280 } else {
2281 /* Fill in the event structure */
2282 sap_event_init(sap_event);
2283 /* Handle event */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302284 qdf_status = sap_fsm(sap_context, sap_event);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002285 }
2286 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302287 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002288 FL("return sme_ScanReq, scanID=%d, Ch=%d"),
2289 scan_request.scan_id, sap_context->channel);
2290 }
2291#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
2292 }
2293 } else {
2294 sap_context->acs_cfg->skip_scan_status = eSAP_SKIP_ACS_SCAN;
2295 }
2296
2297 if (sap_context->acs_cfg->skip_scan_status == eSAP_SKIP_ACS_SCAN) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302298 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002299 FL("## %s SKIPPED ACS SCAN"), __func__);
2300 wlansap_scan_callback(h_hal, sap_context,
2301 sap_context->sessionId, 0, eCSR_SCAN_SUCCESS);
2302 }
2303#endif
2304 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302305 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002306 FL("for configured channel, Ch= %d"),
2307 sap_context->channel);
2308 if (sap_do_acs_pre_start_bss == true) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302309 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002310 FL("ACS end due to Ch override. Sel Ch = %d"),
2311 sap_context->channel);
2312 sap_context->acs_cfg->pri_ch = sap_context->channel;
2313 sap_context->acs_cfg->ch_width =
2314 sap_context->ch_width_orig;
2315 sap_config_acs_result(h_hal, sap_context, 0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302316 return QDF_STATUS_E_CANCELED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002317 } else {
2318 /*
2319 * Fill in the event structure
2320 * Eventhough scan was not done,
2321 * means a user set channel was chosen
2322 */
2323 sap_event_init(sap_event);
2324 /* Handle event */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302325 qdf_status = sap_fsm(sap_context, sap_event);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002326 }
2327 }
2328
2329 /*
2330 * If scan failed, get default channel and advance state
2331 * machine as success with default channel
2332 *
2333 * Have to wait for the call back to be called to get the
2334 * channel cannot advance state machine here as said above
2335 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302336 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002337 FL("before exiting sap_goto_channel_sel channel=%d"),
2338 sap_context->channel);
2339
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302340 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002341}
2342
Peng Xu66162de2016-02-11 17:01:20 -08002343/**
2344 * sap_open_session() - Opens a SAP session
2345 * @hHal: Hal handle
2346 * @sapContext: Sap Context value
2347 * @session_id: Pointer to the session id
2348 *
2349 * Function for opening SME and SAP sessions when system is in SoftAP role
2350 *
2351 * Return: QDF_STATUS
2352 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002353
Peng Xu66162de2016-02-11 17:01:20 -08002354#define SAP_OPEN_SESSION_TIMEOUT 500
2355QDF_STATUS sap_open_session(tHalHandle hHal, ptSapContext sapContext,
2356 uint32_t *session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002357{
2358 uint32_t type, subType;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302359 QDF_STATUS qdf_ret_status;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302360 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002361 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2362
Anurag Chouhan6d760662016-02-20 16:05:43 +05302363 if (sapContext->csr_roamProfile.csrPersona == QDF_P2P_GO_MODE)
2364 status = cds_get_vdev_types(QDF_P2P_GO_MODE, &type, &subType);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002365 else
Anurag Chouhan6d760662016-02-20 16:05:43 +05302366 status = cds_get_vdev_types(QDF_SAP_MODE, &type, &subType);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002367
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302368 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302369 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002370 "failed to get vdev type");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302371 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002372 }
Peng Xu66162de2016-02-11 17:01:20 -08002373
2374 qdf_event_reset(&sapContext->sap_session_opened_evt);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002375 /* Open SME Session for Softap */
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302376 qdf_ret_status = sme_open_session(hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002377 &wlansap_roam_callback,
2378 sapContext,
2379 sapContext->self_mac_addr,
2380 &sapContext->sessionId, type, subType);
2381
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302382 if (QDF_STATUS_SUCCESS != qdf_ret_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302383 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002384 "Error: In %s calling sme_roam_connect status = %d",
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302385 __func__, qdf_ret_status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002386
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302387 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002388 }
2389
Peng Xu66162de2016-02-11 17:01:20 -08002390 status = qdf_wait_single_event(&sapContext->sap_session_opened_evt,
2391 SAP_OPEN_SESSION_TIMEOUT);
2392
2393 if (!QDF_IS_STATUS_SUCCESS(status)) {
2394 cds_err("wait for sap open session event timed out");
2395 return QDF_STATUS_E_FAILURE;
2396 }
2397
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002398 pMac->sap.sapCtxList[sapContext->sessionId].sessionID =
2399 sapContext->sessionId;
2400 pMac->sap.sapCtxList[sapContext->sessionId].pSapContext = sapContext;
2401 pMac->sap.sapCtxList[sapContext->sessionId].sapPersona =
2402 sapContext->csr_roamProfile.csrPersona;
Peng Xu66162de2016-02-11 17:01:20 -08002403 *session_id = sapContext->sessionId;
2404 sapContext->isSapSessionOpen = eSAP_TRUE;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302405 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002406}
2407
2408/*==========================================================================
2409 FUNCTION sapGotoStarting
2410
2411 DESCRIPTION
2412 Function for initiating start bss request for SME
2413
2414 DEPENDENCIES
2415 NA.
2416
2417 PARAMETERS
2418
2419 IN
2420 sapContext : Sap Context value
2421 sapEvent : State machine event
2422 bssType : Type of bss to start, INRA AP
2423 status : Return the SAP status here
2424
2425 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302426 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002427
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302428 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002429
2430 SIDE EFFECTS
2431 ============================================================================*/
Peng Xu66162de2016-02-11 17:01:20 -08002432QDF_STATUS sap_goto_starting(ptSapContext sapContext, ptWLAN_SAPEvent sapEvent,
2433 eCsrRoamBssType bssType)
2434{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002435 /* tHalHandle */
2436 tHalHandle hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302437 QDF_STATUS qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002438
2439 /*- - - - - - - - TODO:once configs from hdd available - - - - - - - - -*/
2440 char key_material[32] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3,
2441 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, };
2442 sapContext->key_type = 0x05;
2443 sapContext->key_length = 32;
Peng Xu66162de2016-02-11 17:01:20 -08002444 /* Need a key size define */
2445 qdf_mem_copy(sapContext->key_material, key_material,
2446 sizeof(key_material));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002447
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302448 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, "In %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002449 __func__);
2450
2451 if (NULL == hHal) {
2452 /* we have a serious problem */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302453 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002454 "In %s, invalid hHal", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302455 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002456 }
2457
Peng Xu66162de2016-02-11 17:01:20 -08002458 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, "%s: session: %d",
2459 __func__, sapContext->sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002460
Peng Xu66162de2016-02-11 17:01:20 -08002461 qdf_ret_status = sme_roam_connect(hHal, sapContext->sessionId,
2462 &sapContext->csr_roamProfile,
2463 &sapContext->csr_roamId);
2464 if (QDF_STATUS_SUCCESS != qdf_ret_status)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302465 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xu66162de2016-02-11 17:01:20 -08002466 "%s: Failed to issue sme_roam_connect", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002467
Peng Xu66162de2016-02-11 17:01:20 -08002468 return qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002469} /* sapGotoStarting */
2470
2471/*==========================================================================
2472 FUNCTION sapGotoDisconnecting
2473
2474 DESCRIPTION
2475 Processing of SAP FSM Disconnecting state
2476
2477 DEPENDENCIES
2478 NA.
2479
2480 PARAMETERS
2481
2482 IN
2483 sapContext : Sap Context value
2484 status : Return the SAP status here
2485
2486 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302487 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002488
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302489 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002490
2491 SIDE EFFECTS
2492 ============================================================================*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302493QDF_STATUS sap_goto_disconnecting(ptSapContext sapContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002494{
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302495 QDF_STATUS qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002496 tHalHandle hHal;
2497
2498 hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
2499 if (NULL == hHal) {
2500 /* we have a serious problem */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302501 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002502 "In %s, invalid hHal", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302503 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002504 }
2505
2506 sap_free_roam_profile(&sapContext->csr_roamProfile);
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302507 qdf_ret_status = sme_roam_stop_bss(hHal, sapContext->sessionId);
2508 if (QDF_STATUS_SUCCESS != qdf_ret_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302509 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002510 "Error: In %s calling sme_roam_stop_bss status = %d",
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302511 __func__, qdf_ret_status);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302512 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002513 }
2514
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302515 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002516}
2517
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302518static QDF_STATUS sap_roam_session_close_callback(void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002519{
2520 ptSapContext sapContext = (ptSapContext) pContext;
2521 return sap_signal_hdd_event(sapContext, NULL,
2522 eSAP_STOP_BSS_EVENT,
2523 (void *) eSAP_STATUS_SUCCESS);
2524}
2525
2526/*==========================================================================
2527 FUNCTION sapGotoDisconnected
2528
2529 DESCRIPTION
2530 Function for setting the SAP FSM to Disconnection state
2531
2532 DEPENDENCIES
2533 NA.
2534
2535 PARAMETERS
2536
2537 IN
2538 sapContext : Sap Context value
2539 sapEvent : State machine event
2540 status : Return the SAP status here
2541
2542 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302543 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002544
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302545 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002546
2547 SIDE EFFECTS
2548 ============================================================================*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302549QDF_STATUS sap_goto_disconnected(ptSapContext sapContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002550{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302551 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002552 tWLAN_SAPEvent sapEvent;
2553 /* Processing has to be coded */
2554 /* Clean up stations from TL etc as AP BSS is shut down then set event */
2555 sapEvent.event = eSAP_MAC_READY_FOR_CONNECTIONS; /* hardcoded */
2556 sapEvent.params = 0;
2557 sapEvent.u1 = 0;
2558 sapEvent.u2 = 0;
2559 /* Handle event */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302560 qdf_status = sap_fsm(sapContext, &sapEvent);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002561
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302562 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002563}
2564
2565/**
2566 * sap_signal_hdd_event() - send event notification
2567 * @sap_ctx: Sap Context
2568 * @csr_roaminfo: Pointer to CSR roam information
2569 * @sap_hddevent: SAP HDD event
2570 * @context: to pass the element for future support
2571 *
2572 * Function for HDD to send the event notification using callback
2573 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302574 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002575 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302576QDF_STATUS sap_signal_hdd_event(ptSapContext sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002577 tCsrRoamInfo *csr_roaminfo, eSapHddEvent sap_hddevent,
2578 void *context)
2579{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302580 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002581 tSap_Event sap_ap_event; /* This now encodes ALL event types */
2582 tHalHandle hal = CDS_GET_HAL_CB(sap_ctx->p_cds_gctx);
2583 tpAniSirGlobal mac_ctx;
2584 tSirSmeChanInfo *chaninfo;
2585 tSap_StationAssocIndication *assoc_ind;
2586 tSap_StartBssCompleteEvent *bss_complete;
2587 struct sap_ch_selected_s *acs_selected;
2588 tSap_StationAssocReassocCompleteEvent *reassoc_complete;
2589 tSap_StationDisassocCompleteEvent *disassoc_comp;
2590 tSap_StationSetKeyCompleteEvent *key_complete;
2591 tSap_StationMICFailureEvent *mic_failure;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002592
2593 /* Format the Start BSS Complete event to return... */
2594 if (NULL == sap_ctx->pfnSapEventCallback) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302595 QDF_ASSERT(0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302596 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002597 }
2598 if (NULL == hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302599 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002600 FL("Invalid hal"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302601 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002602 }
2603 mac_ctx = PMAC_STRUCT(hal);
2604 if (NULL == mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302605 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002606 FL("Invalid MAC context"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302607 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002608 }
2609
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302610 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002611 FL("SAP event callback event = %s"),
2612 sap_hdd_event_to_string(sap_hddevent));
2613
2614 switch (sap_hddevent) {
2615 case eSAP_STA_ASSOC_IND:
2616 /* TODO - Indicate the assoc request indication to OS */
2617 sap_ap_event.sapHddEventCode = eSAP_STA_ASSOC_IND;
2618 assoc_ind = &sap_ap_event.sapevt.sapAssocIndication;
2619
Anurag Chouhanc5548422016-02-24 18:33:27 +05302620 qdf_copy_macaddr(&assoc_ind->staMac, &csr_roaminfo->peerMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002621 assoc_ind->staId = csr_roaminfo->staId;
2622 assoc_ind->status = 0;
2623 /* Required for indicating the frames to upper layer */
2624 assoc_ind->beaconLength = csr_roaminfo->beaconLength;
2625 assoc_ind->beaconPtr = csr_roaminfo->beaconPtr;
2626 assoc_ind->assocReqLength = csr_roaminfo->assocReqLength;
2627 assoc_ind->assocReqPtr = csr_roaminfo->assocReqPtr;
2628 assoc_ind->fWmmEnabled = csr_roaminfo->wmmEnabledSta;
2629 if (csr_roaminfo->u.pConnectedProfile != NULL) {
2630 assoc_ind->negotiatedAuthType =
2631 csr_roaminfo->u.pConnectedProfile->AuthType;
2632 assoc_ind->negotiatedUCEncryptionType =
2633 csr_roaminfo->u.pConnectedProfile->EncryptionType;
2634 assoc_ind->negotiatedMCEncryptionType =
2635 csr_roaminfo->u.pConnectedProfile->mcEncryptionType;
2636 assoc_ind->fAuthRequired = csr_roaminfo->fAuthRequired;
2637 }
2638 break;
2639 case eSAP_START_BSS_EVENT:
2640 sap_ap_event.sapHddEventCode = eSAP_START_BSS_EVENT;
2641 bss_complete = &sap_ap_event.sapevt.sapStartBssCompleteEvent;
2642
2643 bss_complete->status = (eSapStatus) context;
2644 if (csr_roaminfo != NULL)
2645 bss_complete->staId = csr_roaminfo->staId;
2646 else
2647 bss_complete->staId = 0;
2648
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302649 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002650 FL("(eSAP_START_BSS_EVENT): staId = %d"),
2651 bss_complete->staId);
2652
2653 bss_complete->operatingChannel = (uint8_t) sap_ctx->channel;
2654 bss_complete->sessionId = sap_ctx->sessionId;
2655 break;
2656 case eSAP_DFS_CAC_START:
2657 case eSAP_DFS_CAC_INTERRUPTED:
2658 case eSAP_DFS_CAC_END:
2659 case eSAP_DFS_RADAR_DETECT:
2660 case eSAP_DFS_NO_AVAILABLE_CHANNEL:
2661#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
2662 case eSAP_ACS_SCAN_SUCCESS_EVENT:
2663#endif
2664 sap_ap_event.sapHddEventCode = sap_hddevent;
2665 sap_ap_event.sapevt.sapStopBssCompleteEvent.status =
2666 (eSapStatus) context;
2667 break;
2668
2669 case eSAP_ACS_CHANNEL_SELECTED:
2670 sap_ap_event.sapHddEventCode = sap_hddevent;
2671 acs_selected = &sap_ap_event.sapevt.sap_ch_selected;
2672 if (eSAP_STATUS_SUCCESS == (eSapStatus)context) {
2673 acs_selected->pri_ch = sap_ctx->acs_cfg->pri_ch;
2674 acs_selected->ht_sec_ch = sap_ctx->acs_cfg->ht_sec_ch;
2675 acs_selected->ch_width = sap_ctx->acs_cfg->ch_width;
2676 acs_selected->vht_seg0_center_ch =
2677 sap_ctx->acs_cfg->vht_seg0_center_ch;
2678 acs_selected->vht_seg1_center_ch =
2679 sap_ctx->acs_cfg->vht_seg1_center_ch;
2680 } else if (eSAP_STATUS_FAILURE == (eSapStatus)context) {
2681 acs_selected->pri_ch = 0;
2682 }
2683 break;
2684
2685 case eSAP_STOP_BSS_EVENT:
2686 sap_ap_event.sapHddEventCode = eSAP_STOP_BSS_EVENT;
2687 sap_ap_event.sapevt.sapStopBssCompleteEvent.status =
2688 (eSapStatus) context;
2689 break;
2690
2691 case eSAP_STA_ASSOC_EVENT:
2692 case eSAP_STA_REASSOC_EVENT:
2693 reassoc_complete =
2694 &sap_ap_event.sapevt.sapStationAssocReassocCompleteEvent;
2695
2696 if (csr_roaminfo->fReassocReq)
2697 sap_ap_event.sapHddEventCode = eSAP_STA_REASSOC_EVENT;
2698 else
2699 sap_ap_event.sapHddEventCode = eSAP_STA_ASSOC_EVENT;
2700
Anurag Chouhanc5548422016-02-24 18:33:27 +05302701 qdf_copy_macaddr(&reassoc_complete->staMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002702 &csr_roaminfo->peerMac);
2703 reassoc_complete->staId = csr_roaminfo->staId;
2704 reassoc_complete->statusCode = csr_roaminfo->statusCode;
2705 reassoc_complete->iesLen = csr_roaminfo->rsnIELen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302706 qdf_mem_copy(reassoc_complete->ies, csr_roaminfo->prsnIE,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002707 csr_roaminfo->rsnIELen);
2708
2709#ifdef FEATURE_WLAN_WAPI
2710 if (csr_roaminfo->wapiIELen) {
2711 uint8_t len = reassoc_complete->iesLen;
2712 reassoc_complete->iesLen += csr_roaminfo->wapiIELen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302713 qdf_mem_copy(&reassoc_complete->ies[len],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002714 csr_roaminfo->pwapiIE,
2715 csr_roaminfo->wapiIELen);
2716 }
2717#endif
2718 if (csr_roaminfo->addIELen) {
2719 uint8_t len = reassoc_complete->iesLen;
2720 reassoc_complete->iesLen += csr_roaminfo->addIELen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302721 qdf_mem_copy(&reassoc_complete->ies[len],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002722 csr_roaminfo->paddIE,
2723 csr_roaminfo->addIELen);
2724 }
2725
2726 /* also fill up the channel info from the csr_roamInfo */
2727 chaninfo = &reassoc_complete->chan_info;
2728
2729 chaninfo->chan_id = csr_roaminfo->chan_info.chan_id;
2730 chaninfo->mhz = csr_roaminfo->chan_info.mhz;
2731 chaninfo->info = csr_roaminfo->chan_info.info;
2732 chaninfo->band_center_freq1 =
2733 csr_roaminfo->chan_info.band_center_freq1;
2734 chaninfo->band_center_freq2 =
2735 csr_roaminfo->chan_info.band_center_freq2;
2736 chaninfo->reg_info_1 =
2737 csr_roaminfo->chan_info.reg_info_1;
2738 chaninfo->reg_info_2 =
2739 csr_roaminfo->chan_info.reg_info_2;
Kanchanapally, Vidyullathae3062812015-05-22 17:28:57 +05302740 chaninfo->nss = csr_roaminfo->chan_info.nss;
2741 chaninfo->rate_flags = csr_roaminfo->chan_info.rate_flags;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002742
2743 reassoc_complete->wmmEnabled = csr_roaminfo->wmmEnabledSta;
2744 reassoc_complete->status = (eSapStatus) context;
2745 reassoc_complete->timingMeasCap = csr_roaminfo->timingMeasCap;
2746 break;
2747
2748 case eSAP_STA_DISASSOC_EVENT:
2749 sap_ap_event.sapHddEventCode = eSAP_STA_DISASSOC_EVENT;
2750 disassoc_comp =
2751 &sap_ap_event.sapevt.sapStationDisassocCompleteEvent;
2752
Anurag Chouhanc5548422016-02-24 18:33:27 +05302753 qdf_copy_macaddr(&disassoc_comp->staMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002754 &csr_roaminfo->peerMac);
2755 disassoc_comp->staId = csr_roaminfo->staId;
2756 if (csr_roaminfo->reasonCode == eCSR_ROAM_RESULT_FORCED)
2757 disassoc_comp->reason = eSAP_USR_INITATED_DISASSOC;
2758 else
2759 disassoc_comp->reason = eSAP_MAC_INITATED_DISASSOC;
2760
2761 disassoc_comp->statusCode = csr_roaminfo->statusCode;
2762 disassoc_comp->status = (eSapStatus) context;
2763 break;
2764
2765 case eSAP_STA_SET_KEY_EVENT:
2766 sap_ap_event.sapHddEventCode = eSAP_STA_SET_KEY_EVENT;
2767 key_complete =
2768 &sap_ap_event.sapevt.sapStationSetKeyCompleteEvent;
2769 key_complete->status = (eSapStatus) context;
Anurag Chouhanc5548422016-02-24 18:33:27 +05302770 qdf_copy_macaddr(&key_complete->peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002771 &csr_roaminfo->peerMac);
2772 break;
2773
2774 case eSAP_STA_MIC_FAILURE_EVENT:
2775 sap_ap_event.sapHddEventCode = eSAP_STA_MIC_FAILURE_EVENT;
2776 mic_failure = &sap_ap_event.sapevt.sapStationMICFailureEvent;
2777
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302778 qdf_mem_copy(&mic_failure->srcMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002779 csr_roaminfo->u.pMICFailureInfo->srcMacAddr,
2780 sizeof(tSirMacAddr));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302781 qdf_mem_copy(&mic_failure->staMac.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002782 csr_roaminfo->u.pMICFailureInfo->taMacAddr,
2783 sizeof(tSirMacAddr));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302784 qdf_mem_copy(&mic_failure->dstMacAddr.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002785 csr_roaminfo->u.pMICFailureInfo->dstMacAddr,
2786 sizeof(tSirMacAddr));
2787 mic_failure->multicast =
2788 csr_roaminfo->u.pMICFailureInfo->multicast;
2789 mic_failure->IV1 = csr_roaminfo->u.pMICFailureInfo->IV1;
2790 mic_failure->keyId = csr_roaminfo->u.pMICFailureInfo->keyId;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302791 qdf_mem_copy(mic_failure->TSC,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002792 csr_roaminfo->u.pMICFailureInfo->TSC,
2793 SIR_CIPHER_SEQ_CTR_SIZE);
2794 break;
2795
2796 case eSAP_ASSOC_STA_CALLBACK_EVENT:
2797 break;
2798
2799 case eSAP_WPS_PBC_PROBE_REQ_EVENT:
2800 sap_ap_event.sapHddEventCode = eSAP_WPS_PBC_PROBE_REQ_EVENT;
2801
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302802 qdf_mem_copy(&sap_ap_event.sapevt.sapPBCProbeReqEvent.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002803 WPSPBCProbeReq, csr_roaminfo->u.pWPSPBCProbeReq,
2804 sizeof(tSirWPSPBCProbeReq));
2805 break;
2806
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002807 case eSAP_REMAIN_CHAN_READY:
2808 sap_ap_event.sapHddEventCode = eSAP_REMAIN_CHAN_READY;
2809 sap_ap_event.sapevt.sap_roc_ind.scan_id =
2810 sap_ctx->roc_ind_scan_id;
2811 break;
2812 case eSAP_SEND_ACTION_CNF:
2813 sap_ap_event.sapHddEventCode = eSAP_SEND_ACTION_CNF;
2814 sap_ap_event.sapevt.sapActionCnf.actionSendSuccess =
2815 (eSapStatus) context;
2816 break;
2817
2818 case eSAP_DISCONNECT_ALL_P2P_CLIENT:
2819 sap_ap_event.sapHddEventCode = eSAP_DISCONNECT_ALL_P2P_CLIENT;
2820 sap_ap_event.sapevt.sapActionCnf.actionSendSuccess =
2821 (eSapStatus) context;
2822 break;
2823
2824 case eSAP_MAC_TRIG_STOP_BSS_EVENT:
2825 sap_ap_event.sapHddEventCode = eSAP_MAC_TRIG_STOP_BSS_EVENT;
2826 sap_ap_event.sapevt.sapActionCnf.actionSendSuccess =
2827 (eSapStatus) context;
2828 break;
2829
2830 case eSAP_UNKNOWN_STA_JOIN:
2831 sap_ap_event.sapHddEventCode = eSAP_UNKNOWN_STA_JOIN;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302832 qdf_mem_copy((void *) sap_ap_event.sapevt.sapUnknownSTAJoin.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002833 macaddr.bytes, (void *) context,
Anurag Chouhan6d760662016-02-20 16:05:43 +05302834 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002835 break;
2836
2837 case eSAP_MAX_ASSOC_EXCEEDED:
2838 sap_ap_event.sapHddEventCode = eSAP_MAX_ASSOC_EXCEEDED;
Anurag Chouhanc5548422016-02-24 18:33:27 +05302839 qdf_copy_macaddr(&sap_ap_event.sapevt.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002840 sapMaxAssocExceeded.macaddr,
2841 &csr_roaminfo->peerMac);
2842 break;
2843
2844 case eSAP_CHANNEL_CHANGE_EVENT:
2845 /*
2846 * Reconfig ACS result info. For DFS AP-AP Mode Sec AP ACS
2847 * follows pri AP
2848 */
2849 sap_ctx->acs_cfg->pri_ch = sap_ctx->channel;
2850 sap_ctx->acs_cfg->ch_width = sap_ctx->ch_params.ch_width;
2851 sap_config_acs_result(hal, sap_ctx, sap_ctx->secondary_ch);
2852
2853 sap_ap_event.sapHddEventCode = eSAP_CHANNEL_CHANGE_EVENT;
2854
2855 acs_selected = &sap_ap_event.sapevt.sap_ch_selected;
2856 acs_selected->pri_ch = sap_ctx->acs_cfg->pri_ch;
2857 acs_selected->ht_sec_ch = sap_ctx->acs_cfg->ht_sec_ch;
2858 acs_selected->ch_width = sap_ctx->acs_cfg->ch_width;
2859 acs_selected->vht_seg0_center_ch =
2860 sap_ctx->acs_cfg->vht_seg0_center_ch;
2861 acs_selected->vht_seg1_center_ch =
2862 sap_ctx->acs_cfg->vht_seg1_center_ch;
2863 break;
2864
2865 case eSAP_DFS_NOL_GET:
2866 sap_ap_event.sapHddEventCode = eSAP_DFS_NOL_GET;
2867 sap_ap_event.sapevt.sapDfsNolInfo.sDfsList =
2868 NUM_5GHZ_CHANNELS * sizeof(tSapDfsNolInfo);
2869 sap_ap_event.sapevt.sapDfsNolInfo.pDfsList = (void *)
2870 (&mac_ctx->sap.SapDfsInfo.sapDfsChannelNolList[0]);
2871 break;
2872
2873 case eSAP_DFS_NOL_SET:
2874 sap_ap_event.sapHddEventCode = eSAP_DFS_NOL_SET;
2875 sap_ap_event.sapevt.sapDfsNolInfo.sDfsList =
2876 mac_ctx->sap.SapDfsInfo.numCurrentRegDomainDfsChannels *
2877 sizeof(tSapDfsNolInfo);
2878 sap_ap_event.sapevt.sapDfsNolInfo.pDfsList = (void *)
2879 (&mac_ctx->sap.SapDfsInfo.sapDfsChannelNolList[0]);
2880 break;
Abhishek Singh518323d2015-10-19 17:42:01 +05302881 case eSAP_ECSA_CHANGE_CHAN_IND:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302882 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Abhishek Singh518323d2015-10-19 17:42:01 +05302883 "In %s, SAP event callback event = %s",
2884 __func__, "eSAP_ECSA_CHANGE_CHAN_IND");
2885 sap_ap_event.sapHddEventCode = eSAP_ECSA_CHANGE_CHAN_IND;
2886 sap_ap_event.sapevt.sap_chan_cng_ind.new_chan =
2887 csr_roaminfo->target_channel;
2888 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002889 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302890 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002891 FL("SAP Unknown callback event = %d"),
2892 sap_hddevent);
2893 break;
2894 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302895 qdf_status = (*sap_ctx->pfnSapEventCallback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002896 (&sap_ap_event, sap_ctx->pUsrContext);
2897
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302898 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002899
2900}
2901
2902/*==========================================================================
2903 FUNCTION sap_find_valid_concurrent_session
2904
2905 DESCRIPTION
2906 This function will return sapcontext of any valid sap session.
2907
2908 PARAMETERS
2909
2910 IN
2911 hHal : HAL pointer
2912
2913 RETURN VALUE
2914 ptSapContext : valid sap context
2915
2916 SIDE EFFECTS
2917 NA
2918 ============================================================================*/
2919ptSapContext sap_find_valid_concurrent_session(tHalHandle hHal)
2920{
2921 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2922 uint8_t intf = 0;
2923
2924 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
Anurag Chouhan6d760662016-02-20 16:05:43 +05302925 if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002926 ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05302927 (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona)) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002928 pMac->sap.sapCtxList[intf].pSapContext != NULL) {
2929 return pMac->sap.sapCtxList[intf].pSapContext;
2930 }
2931 }
2932
2933 return NULL;
2934}
2935
2936/*==========================================================================
2937 FUNCTION sap_close_session
2938
2939 DESCRIPTION
2940 This function will close all the sme sessions as well as zero-out the
2941 sap global structure
2942
2943 PARAMETERS
2944
2945 IN
2946 hHal : HAL pointer
2947 sapContext : Sap Context value
2948 callback : Roam Session close callback
2949 valid : Sap context is valid or no
2950
2951 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302952 The QDF_STATUS code associated with performing the operation
2953 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002954
2955 SIDE EFFECTS
2956 NA
2957 ============================================================================*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302958QDF_STATUS sap_close_session(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002959 ptSapContext sapContext,
2960 csr_roamSessionCloseCallback callback, bool valid)
2961{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302962 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002963 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2964
2965 if (false == valid) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302966 qdf_status = sme_close_session(hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002967 sapContext->sessionId,
2968 callback, NULL);
2969 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302970 qdf_status = sme_close_session(hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002971 sapContext->sessionId,
2972 callback, sapContext);
2973 }
2974
2975 sapContext->isCacStartNotified = false;
2976 sapContext->isCacEndNotified = false;
2977 pMac->sap.sapCtxList[sapContext->sessionId].pSapContext = NULL;
Peng Xu66162de2016-02-11 17:01:20 -08002978 sapContext->isSapSessionOpen = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002979
2980 if (NULL == sap_find_valid_concurrent_session(hHal)) {
2981 /* If timer is running then stop the timer and destory it */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302982 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002983 "sapdfs: no session are valid, so clearing dfs global structure");
2984 /*
2985 * CAC timer will be initiated and started only when SAP starts
2986 * on DFS channel and it will be stopped and destroyed
2987 * immediately once the radar detected or timedout. So
2988 * as per design CAC timer should be destroyed after stop
2989 */
2990 if (pMac->sap.SapDfsInfo.is_dfs_cac_timer_running) {
Anurag Chouhan210db072016-02-22 18:42:15 +05302991 qdf_mc_timer_stop(&pMac->sap.SapDfsInfo.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002992 sap_dfs_cac_timer);
2993 pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = 0;
Anurag Chouhan210db072016-02-22 18:42:15 +05302994 qdf_mc_timer_destroy(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002995 &pMac->sap.SapDfsInfo.sap_dfs_cac_timer);
2996 }
2997 pMac->sap.SapDfsInfo.cac_state = eSAP_DFS_DO_NOT_SKIP_CAC;
2998 sap_cac_reset_notify(hHal);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302999 qdf_mem_zero(&pMac->sap, sizeof(pMac->sap));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003000 }
3001
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303002 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003003}
3004
3005/*==========================================================================
3006 FUNCTION sap_cac_reset_notify
3007
3008 DESCRIPTION Function will be called up on stop bss indication to clean up
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303009 DFS global structure.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003010
3011 DEPENDENCIES PARAMETERS
3012 IN hHAL : HAL pointer
3013
3014 RETURN VALUE : void.
3015
3016 SIDE EFFECTS
3017 ============================================================================*/
3018void sap_cac_reset_notify(tHalHandle hHal)
3019{
3020 uint8_t intf = 0;
3021 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3022
3023 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
3024 ptSapContext pSapContext =
3025 (ptSapContext) pMac->sap.sapCtxList[intf].pSapContext;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303026 if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003027 ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05303028 (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003029 && pMac->sap.sapCtxList[intf].pSapContext != NULL) {
3030 pSapContext->isCacStartNotified = false;
3031 pSapContext->isCacEndNotified = false;
3032 }
3033 }
3034}
3035
3036/*==========================================================================
3037 FUNCTION sap_cac_start_notify
3038
3039 DESCRIPTION Function will be called to notify eSAP_DFS_CAC_START event
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303040 to HDD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003041
3042 DEPENDENCIES PARAMETERS
3043 IN hHAL : HAL pointer
3044
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303045 RETURN VALUE : QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003046
3047 SIDE EFFECTS
3048 ============================================================================*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303049QDF_STATUS sap_cac_start_notify(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003050{
3051 uint8_t intf = 0;
3052 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303053 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003054
3055 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
3056 ptSapContext pSapContext =
3057 (ptSapContext) pMac->sap.sapCtxList[intf].pSapContext;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303058 if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003059 ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05303060 (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003061 && pMac->sap.sapCtxList[intf].pSapContext != NULL &&
3062 (false == pSapContext->isCacStartNotified)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303063 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003064 "sapdfs: Signaling eSAP_DFS_CAC_START to HDD for sapctx[%p]",
3065 pSapContext);
3066
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303067 qdf_status = sap_signal_hdd_event(pSapContext, NULL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003068 eSAP_DFS_CAC_START,
3069 (void *)
3070 eSAP_STATUS_SUCCESS);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303071 if (QDF_STATUS_SUCCESS != qdf_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303072 QDF_TRACE(QDF_MODULE_ID_SAP,
3073 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003074 "In %s, failed setting isCacStartNotified on interface[%d]",
3075 __func__, intf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303076 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003077 }
3078 pSapContext->isCacStartNotified = true;
3079 }
3080 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303081 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003082}
3083
3084/*==========================================================================
3085 FUNCTION sap_cac_end_notify
3086
3087 DESCRIPTION Function will be called to notify eSAP_DFS_CAC_END event
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303088 to HDD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003089
3090 DEPENDENCIES PARAMETERS
3091 IN hHAL : HAL pointer
3092
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303093 RETURN VALUE : QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003094
3095 SIDE EFFECTS
3096 ============================================================================*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303097QDF_STATUS sap_cac_end_notify(tHalHandle hHal, tCsrRoamInfo *roamInfo)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003098{
3099 uint8_t intf;
3100 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303101 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003102
3103 /*
3104 * eSAP_DFS_CHANNEL_CAC_END:
3105 * CAC Period elapsed and there was no radar
3106 * found so, SAP can continue beaconing.
3107 * sap_radar_found_status is set to 0
3108 */
3109 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
3110 ptSapContext pSapContext =
3111 (ptSapContext) pMac->sap.sapCtxList[intf].pSapContext;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303112 if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003113 ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05303114 (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003115 && pMac->sap.sapCtxList[intf].pSapContext != NULL &&
3116 (false == pSapContext->isCacEndNotified)) {
3117 pSapContext = pMac->sap.sapCtxList[intf].pSapContext;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303118 qdf_status = sap_signal_hdd_event(pSapContext, NULL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003119 eSAP_DFS_CAC_END,
3120 (void *)
3121 eSAP_STATUS_SUCCESS);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303122 if (QDF_STATUS_SUCCESS != qdf_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303123 QDF_TRACE(QDF_MODULE_ID_SAP,
3124 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003125 "In %s, failed setting isCacEndNotified on interface[%d]",
3126 __func__, intf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303127 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003128 }
3129 pSapContext->isCacEndNotified = true;
3130 pMac->sap.SapDfsInfo.sap_radar_found_status = false;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303131 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003132 "sapdfs: Start beacon request on sapctx[%p]",
3133 pSapContext);
3134
3135 /* Start beaconing on the new channel */
3136 wlansap_start_beacon_req(pSapContext);
3137
3138 /* Transition from eSAP_STARTING to eSAP_STARTED
3139 * (both without substates)
3140 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303141 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003142 "sapdfs: channel[%d] from state %s => %s",
3143 pSapContext->channel, "eSAP_STARTING",
3144 "eSAP_STARTED");
3145
3146 pSapContext->sapsMachine = eSAP_STARTED;
3147
3148 /*Action code for transition */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303149 qdf_status = sap_signal_hdd_event(pSapContext, roamInfo,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003150 eSAP_START_BSS_EVENT,
3151 (void *)
3152 eSAP_STATUS_SUCCESS);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303153 if (QDF_STATUS_SUCCESS != qdf_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303154 QDF_TRACE(QDF_MODULE_ID_SAP,
3155 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003156 "In %s, failed setting isCacEndNotified on interface[%d]",
3157 __func__, intf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303158 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003159 }
3160
3161 /* Transition from eSAP_STARTING to eSAP_STARTED
3162 * (both without substates)
3163 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303164 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003165 "In %s, from state %s => %s",
3166 __func__, "eSAP_DFS_CAC_WAIT",
3167 "eSAP_STARTED");
3168 }
3169 }
3170 /*
3171 * All APs are done with CAC timer, all APs should start beaconing.
3172 * Lets assume AP1 and AP2 started beaconing on DFS channel, Now lets
3173 * say AP1 goes down and comes back on same DFS channel. In this case
3174 * AP1 shouldn't start CAC timer and start beacon immediately beacause
3175 * AP2 is already beaconing on this channel. This case will be handled
3176 * by checking against eSAP_DFS_SKIP_CAC while starting the timer.
3177 */
3178 pMac->sap.SapDfsInfo.cac_state = eSAP_DFS_SKIP_CAC;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303179 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003180}
3181
3182/**
3183 * sap_fsm_state_disconnected() - utility function called from sap fsm
3184 * @sap_ctx: SAP context
3185 * @sap_event: SAP event buffer
3186 * @mac_ctx: global MAC context
3187 * @hal: HAL handle
3188 *
3189 * This function is called for state transition from "eSAP_DISCONNECTED"
3190 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303191 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003192 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303193static QDF_STATUS sap_fsm_state_disconnected(ptSapContext sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003194 ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx,
3195 tHalHandle hal)
3196{
3197 uint32_t msg = sap_event->event;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303198 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003199
3200 if (msg == eSAP_HDD_START_INFRA_BSS) {
3201 /*
3202 * Transition from eSAP_DISCONNECTED to eSAP_CH_SELECT
3203 * (both without substates)
3204 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303205 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Peng Xu66162de2016-02-11 17:01:20 -08003206 FL("new from state %s => %s: session:%d"),
3207 "eSAP_DISCONNECTED", "eSAP_CH_SELECT",
3208 sap_ctx->sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003209
Peng Xu66162de2016-02-11 17:01:20 -08003210 if (sap_ctx->isSapSessionOpen == eSAP_FALSE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003211 uint32_t type, subtype;
Peng Xu66162de2016-02-11 17:01:20 -08003212 if (sap_ctx->csr_roamProfile.csrPersona ==
3213 QDF_P2P_GO_MODE)
3214 qdf_status = cds_get_vdev_types(QDF_P2P_GO_MODE,
3215 &type, &subtype);
3216 else
3217 qdf_status = cds_get_vdev_types(QDF_SAP_MODE,
3218 &type,
3219 &subtype);
3220
3221 if (QDF_STATUS_SUCCESS != qdf_status) {
3222 QDF_TRACE(QDF_MODULE_ID_SAP,
3223 QDF_TRACE_LEVEL_FATAL,
3224 "failed to get vdev type");
3225 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003226 }
Peng Xu66162de2016-02-11 17:01:20 -08003227 /* Open SME Session for scan */
3228 qdf_status = sme_open_session(hal, NULL,
3229 sap_ctx, sap_ctx->self_mac_addr,
3230 &sap_ctx->sessionId, type, subtype);
3231 if (QDF_STATUS_SUCCESS != qdf_status) {
3232 QDF_TRACE(QDF_MODULE_ID_SAP,
3233 QDF_TRACE_LEVEL_ERROR,
3234 FL("Error: calling sme_open_session"));
3235 return QDF_STATUS_E_FAILURE;
3236 }
3237
3238 sap_ctx->isSapSessionOpen = eSAP_TRUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003239 }
Peng Xu66162de2016-02-11 17:01:20 -08003240
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003241 /* init dfs channel nol */
3242 sap_init_dfs_channel_nol_list(sap_ctx);
3243
3244 /* Set SAP device role */
3245 sap_ctx->sapsMachine = eSAP_CH_SELECT;
3246
3247 /*
3248 * Perform sme_ScanRequest. This scan request is post start bss
3249 * request so, set the third to false.
3250 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303251 qdf_status = sap_goto_channel_sel(sap_ctx, sap_event, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003252
3253 /*
3254 * Transition from eSAP_DISCONNECTED to eSAP_CH_SELECT
3255 * (both without substates)
3256 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303257 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003258 FL("from state %s => %s"),
3259 "eSAP_DISCONNECTED", "eSAP_CH_SELECT");
3260 } else if (msg == eSAP_DFS_CHANNEL_CAC_START) {
3261 /*
3262 * No need of state check here, caller is expected to perform
3263 * the checks before sending the event
3264 */
3265 sap_ctx->sapsMachine = eSAP_DFS_CAC_WAIT;
3266
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303267 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003268 FL("from state eSAP_DISCONNECTED => SAP_DFS_CAC_WAIT"));
3269 if (mac_ctx->sap.SapDfsInfo.is_dfs_cac_timer_running != true) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303270 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003271 FL("sapdfs: starting dfs cac timer on sapctx[%p]"),
3272 sap_ctx);
3273 sap_start_dfs_cac_timer(sap_ctx);
3274 }
3275
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303276 qdf_status = sap_cac_start_notify(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003277 } else if (msg == eSAP_CHANNEL_SELECTION_RETRY) {
3278 /* Set SAP device role */
3279 sap_ctx->sapsMachine = eSAP_CH_SELECT;
3280
3281 /*
3282 * Perform sme_ScanRequest. This scan request is post start bss
3283 * request so, set the third to false.
3284 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303285 qdf_status = sap_goto_channel_sel(sap_ctx, sap_event, false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003286 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303287 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003288 FL("in state %s, event msg %d"),
3289 "eSAP_DISCONNECTED", msg);
3290 }
3291
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303292 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003293}
3294
3295/**
3296 * sap_fsm_state_ch_select() - utility function called from sap fsm
3297 * @sap_ctx: SAP context
3298 * @sap_event: SAP event buffer
3299 * @mac_ctx: global MAC context
3300 * @hal: HAL handle
3301 *
3302 * This function is called for state transition from "eSAP_CH_SELECT"
3303 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303304 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003305 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303306static QDF_STATUS sap_fsm_state_ch_select(ptSapContext sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003307 ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx,
3308 tHalHandle hal)
3309{
3310 uint32_t msg = sap_event->event;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303311 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003312 uint32_t cbmode;
3313 bool b_leak_chan = false;
3314#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
3315 uint8_t temp_chan;
3316 tSapDfsNolInfo *p_nol;
3317#endif
3318
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003319 if (msg == eSAP_MAC_SCAN_COMPLETE) {
3320 /* get the bonding mode */
3321 if (sap_ctx->channel <= 14)
3322 cbmode = sme_get_cb_phy_state_from_cb_ini_value(
3323 sme_get_channel_bonding_mode24_g(hal));
3324 else
3325 cbmode = sme_get_cb_phy_state_from_cb_ini_value(
3326 sme_get_channel_bonding_mode5_g(hal));
3327
3328#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
3329 temp_chan = sap_ctx->channel;
3330 p_nol = mac_ctx->sap.SapDfsInfo.sapDfsChannelNolList;
3331
3332 sap_mark_channels_leaking_into_nol(sap_ctx,
3333 cbmode, p_nol, 1, &temp_chan);
3334
3335 /*
3336 * if selelcted channel has leakage to channels
3337 * in NOL, the temp_chan will be reset
3338 */
3339 b_leak_chan = (temp_chan != sap_ctx->channel);
3340#endif
3341 /*
3342 * check if channel is in DFS_NOL or if the channel
3343 * has leakage to the channels in NOL
3344 */
3345 if (sap_dfs_is_channel_in_nol_list(sap_ctx, sap_ctx->channel,
3346 cbmode) || b_leak_chan) {
3347 uint8_t ch;
3348
3349 /* find a new available channel */
3350 ch = sap_random_channel_sel(sap_ctx);
3351 if (ch == 0) {
3352 /* No available channel found */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303353 QDF_TRACE(QDF_MODULE_ID_SAP,
3354 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003355 FL("No available channel found!!!"));
3356 sap_signal_hdd_event(sap_ctx, NULL,
3357 eSAP_DFS_NO_AVAILABLE_CHANNEL,
3358 (void *)eSAP_STATUS_SUCCESS);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303359 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003360 }
3361
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303362 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003363 FL("channel %d is in NOL, StartBss on new channel %d"),
3364 sap_ctx->channel, ch);
3365
3366 sap_ctx->channel = ch;
3367 sme_set_ch_params(hal, sap_ctx->csr_roamProfile.phyMode,
3368 sap_ctx->channel, sap_ctx->secondary_ch,
3369 &sap_ctx->ch_params);
3370 }
3371 if (sap_ctx->channel > 14 &&
3372 (sap_ctx->csr_roamProfile.phyMode == eCSR_DOT11_MODE_11g ||
3373 sap_ctx->csr_roamProfile.phyMode ==
3374 eCSR_DOT11_MODE_11g_ONLY))
3375 sap_ctx->csr_roamProfile.phyMode = eCSR_DOT11_MODE_11a;
3376
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003377 /*
3378 * when AP2 is started while AP1 is performing ACS, we may not
3379 * have the AP1 channel yet.So here after the completion of AP2
3380 * ACS check if AP1 ACS resulting channel is DFS and if yes
3381 * override AP2 ACS scan result with AP1 DFS channel
3382 */
3383 if (cds_concurrent_beaconing_sessions_running()) {
3384 uint16_t con_ch;
3385
3386 con_ch = sme_get_concurrent_operation_channel(hal);
3387 if (con_ch && CDS_IS_DFS_CH(con_ch))
3388 sap_ctx->channel = con_ch;
3389 }
Ryan Hsu4252a2f2016-01-05 11:18:24 -08003390
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003391 /*
3392 * Transition from eSAP_CH_SELECT to eSAP_STARTING
3393 * (both without substates)
3394 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303395 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003396 FL("from state %s => %s"),
3397 "eSAP_CH_SELECT", "eSAP_STARTING");
3398 /* Channel selected. Now can sap_goto_starting */
3399 sap_ctx->sapsMachine = eSAP_STARTING;
3400 /* Specify the channel */
3401 sap_ctx->csr_roamProfile.ChannelInfo.numOfChannels =
3402 1;
3403 sap_ctx->csr_roamProfile.ChannelInfo.ChannelList =
3404 &sap_ctx->csr_roamProfile.operationChannel;
3405 sap_ctx->csr_roamProfile.operationChannel =
3406 (uint8_t) sap_ctx->channel;
3407 sap_ctx->csr_roamProfile.ch_params.ch_width =
3408 sap_ctx->ch_params.ch_width;
3409 sap_ctx->csr_roamProfile.ch_params.center_freq_seg0 =
3410 sap_ctx->ch_params.center_freq_seg0;
3411 sap_ctx->csr_roamProfile.ch_params.center_freq_seg1 =
3412 sap_ctx->ch_params.center_freq_seg1;
3413 sap_ctx->csr_roamProfile.ch_params.sec_ch_offset =
3414 sap_ctx->ch_params.sec_ch_offset;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303415 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003416 FL("notify hostapd about channel selection: %d"),
3417 sap_ctx->channel);
3418 sap_signal_hdd_event(sap_ctx, NULL,
3419 eSAP_CHANNEL_CHANGE_EVENT,
3420 (void *) eSAP_STATUS_SUCCESS);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303421 qdf_status = sap_goto_starting(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003422 eCSR_BSS_TYPE_INFRA_AP);
3423 } else if (msg == eSAP_CHANNEL_SELECTION_FAILED) {
3424 sap_ctx->sapsMachine = eSAP_DISCONNECTED;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303425 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003426 FL("Cannot start BSS, ACS Fail"));
3427 } else if (msg == eSAP_HDD_STOP_INFRA_BSS) {
3428 sap_ctx->sapsMachine = eSAP_DISCONNECTED;
3429 sap_signal_hdd_event(sap_ctx, NULL, eSAP_START_BSS_EVENT,
3430 (void *)eSAP_STATUS_FAILURE);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303431 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003432 "%s: BSS stopped when Ch select in Progress", __func__);
3433 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303434 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003435 FL("in state %s, invalid event msg %d"),
3436 "eSAP_CH_SELECT", msg);
3437 }
3438
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303439 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003440}
3441
3442/**
3443 * sap_fsm_state_dfs_cac_wait() - utility function called from sap fsm
3444 * @sap_ctx: SAP context
3445 * @sap_event: SAP event buffer
3446 * @mac_ctx: global MAC context
3447 * @hal: HAL handle
3448 *
3449 * This function is called for state transition from "eSAP_DFS_CAC_WAIT"
3450 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303451 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003452 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303453static QDF_STATUS sap_fsm_state_dfs_cac_wait(ptSapContext sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003454 ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx,
3455 tHalHandle hal)
3456{
3457 uint32_t msg = sap_event->event;
3458 tCsrRoamInfo *roam_info = (tCsrRoamInfo *) (sap_event->params);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303459 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003460
3461 if (msg == eSAP_DFS_CHANNEL_CAC_START) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303462 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003463 FL("from state %s => %s"),
3464 "eSAP_CH_SELECT", "eSAP_DFS_CAC_WAIT");
3465 if (mac_ctx->sap.SapDfsInfo.is_dfs_cac_timer_running != true)
3466 sap_start_dfs_cac_timer(sap_ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303467 qdf_status = sap_cac_start_notify(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003468 } else if (msg == eSAP_DFS_CHANNEL_CAC_RADAR_FOUND) {
3469 uint8_t intf;
3470 /*
3471 * Radar found while performing channel availability
3472 * check, need to switch the channel again
3473 */
3474 eCsrPhyMode phymode = sap_ctx->csr_roamProfile.phyMode;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303475 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003476 "ENTERTRED CAC WAIT STATE-->eSAP_DISCONNECTING\n");
3477 if (mac_ctx->sap.SapDfsInfo.target_channel) {
3478 sme_set_ch_params(hal, phymode,
3479 mac_ctx->sap.SapDfsInfo.target_channel, 0,
3480 &sap_ctx->ch_params);
3481 }
3482
3483 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
3484 ptSapContext t_sap_ctx;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303485 if (((QDF_SAP_MODE ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003486 mac_ctx->sap.sapCtxList[intf].sapPersona) ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05303487 (QDF_P2P_GO_MODE ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003488 mac_ctx->sap.sapCtxList[intf].sapPersona)) &&
3489 mac_ctx->sap.sapCtxList[intf].pSapContext != NULL) {
3490 t_sap_ctx =
3491 mac_ctx->sap.sapCtxList[intf].pSapContext;
3492 /* SAP to be moved to DISCONNECTING state */
3493 sap_ctx->sapsMachine = eSAP_DISCONNECTING;
3494 /*
3495 * eSAP_DFS_CHANNEL_CAC_RADAR_FOUND:
3496 * A Radar is found on current DFS Channel
3497 * while in CAC WAIT period So, do a channel
3498 * switch to randomly selected target channel.
3499 * Send the Channel change message to SME/PE.
3500 * sap_radar_found_status is set to 1
3501 */
3502 sap_signal_hdd_event(t_sap_ctx, NULL,
3503 eSAP_DFS_RADAR_DETECT,
3504 (void *)eSAP_STATUS_SUCCESS);
3505
3506 wlansap_channel_change_request(
3507 (void *)t_sap_ctx,
3508 mac_ctx->sap.SapDfsInfo.target_channel);
3509 }
3510 }
3511 } else if (msg == eSAP_DFS_CHANNEL_CAC_END) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303512 qdf_status = sap_cac_end_notify(hal, roam_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003513 } else if (msg == eSAP_HDD_STOP_INFRA_BSS) {
3514 /* Transition from eSAP_DFS_CAC_WAIT to eSAP_DISCONNECTING */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303515 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003516 FL("from state %s => %s"),
3517 "eSAP_DFS_CAC_WAIT", "eSAP_DISCONNECTING");
3518
3519 /*
3520 * Stop the CAC timer only in following conditions
3521 * single AP: if there is a single AP then stop the timer
3522 * mulitple APs: incase of multiple APs, make sure that
3523 * all APs are down.
3524 */
3525 if (NULL == sap_find_valid_concurrent_session(hal)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303526 QDF_TRACE(QDF_MODULE_ID_SAP,
3527 QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003528 FL("sapdfs: no sessions are valid, stopping timer"));
3529 sap_stop_dfs_cac_timer(sap_ctx);
3530 }
3531
3532 sap_ctx->sapsMachine = eSAP_DISCONNECTING;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303533 qdf_status = sap_goto_disconnecting(sap_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003534 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303535 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003536 FL("in state %s, invalid event msg %d"),
3537 "eSAP_DFS_CAC_WAIT", msg);
3538 }
3539
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303540 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003541}
3542
3543/**
3544 * sap_fsm_state_starting() - utility function called from sap fsm
3545 * @sap_ctx: SAP context
3546 * @sap_event: SAP event buffer
3547 * @mac_ctx: global MAC context
3548 * @hal: HAL handle
3549 *
3550 * This function is called for state transition from "eSAP_STARTING"
3551 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303552 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003553 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303554static QDF_STATUS sap_fsm_state_starting(ptSapContext sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003555 ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx,
3556 tHalHandle hal)
3557{
3558 uint32_t msg = sap_event->event;
3559 tCsrRoamInfo *roam_info = (tCsrRoamInfo *) (sap_event->params);
3560 tSapDfsInfo *sap_dfs_info;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303561 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Sandeep Puligilla949eaa72015-12-17 18:43:52 -08003562 uint8_t is_dfs = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003563
3564 if (msg == eSAP_MAC_START_BSS_SUCCESS) {
3565 /*
3566 * Transition from eSAP_STARTING to eSAP_STARTED
3567 * (both without substates)
3568 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303569 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Sandeep Puligilla949eaa72015-12-17 18:43:52 -08003570 FL("from state channel = %d %s => %s ch_width %d"),
3571 sap_ctx->channel, "eSAP_STARTING", "eSAP_STARTED",
3572 sap_ctx->ch_params.ch_width);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003573 sap_ctx->sapsMachine = eSAP_STARTED;
3574
3575 /* Action code for transition */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303576 qdf_status = sap_signal_hdd_event(sap_ctx, roam_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003577 eSAP_START_BSS_EVENT,
3578 (void *) eSAP_STATUS_SUCCESS);
3579
3580 /*
3581 * The upper layers have been informed that AP is up and
3582 * running, however, the AP is still not beaconing, until
3583 * CAC is done if the operating channel is DFS
3584 */
Sandeep Puligilla949eaa72015-12-17 18:43:52 -08003585 if (sap_ctx->ch_params.ch_width == CH_WIDTH_160MHZ) {
3586 is_dfs = true;
3587 } else if (sap_ctx->ch_params.ch_width == CH_WIDTH_80P80MHZ) {
3588 if (cds_get_channel_state(sap_ctx->channel) ==
3589 CHANNEL_STATE_DFS ||
3590 cds_get_channel_state(sap_ctx->
3591 ch_params.center_freq_seg1 -
3592 SIR_80MHZ_START_CENTER_CH_DIFF) ==
3593 CHANNEL_STATE_DFS)
3594 is_dfs = true;
3595 } else {
3596 if (cds_get_channel_state(sap_ctx->channel) ==
3597 CHANNEL_STATE_DFS)
3598 is_dfs = true;
3599 }
3600 if (is_dfs) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003601 sap_dfs_info = &mac_ctx->sap.SapDfsInfo;
3602 if ((false == sap_dfs_info->ignore_cac) &&
3603 (eSAP_DFS_DO_NOT_SKIP_CAC ==
3604 sap_dfs_info->cac_state)) {
3605 /* Move the device in CAC_WAIT_STATE */
3606 sap_ctx->sapsMachine = eSAP_DFS_CAC_WAIT;
3607
3608 /*
3609 * Need to stop the OS transmit queues,
3610 * so that no traffic can flow down the stack
3611 */
3612
3613 /* Start CAC wait timer */
3614 if (sap_dfs_info->is_dfs_cac_timer_running !=
3615 true)
3616 sap_start_dfs_cac_timer(sap_ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303617 qdf_status = sap_cac_start_notify(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003618
3619 } else {
3620 wlansap_start_beacon_req(sap_ctx);
3621 }
3622 }
3623 } else if (msg == eSAP_MAC_START_FAILS) {
3624 /*
3625 * Transition from STARTING to DISCONNECTED
3626 * (both without substates)
3627 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303628 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003629 FL("from state %s => %s"),
3630 "eSAP_STARTING", "eSAP_DISCONNECTED");
3631
3632 /*Action code for transition */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303633 qdf_status = sap_signal_hdd_event(sap_ctx, NULL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003634 eSAP_START_BSS_EVENT,
3635 (void *) eSAP_STATUS_FAILURE);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303636 qdf_status = sap_goto_disconnected(sap_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003637 /* Advance outer statevar */
3638 sap_ctx->sapsMachine = eSAP_DISCONNECTED;
3639 } else if (msg == eSAP_HDD_STOP_INFRA_BSS) {
3640 /*
3641 * Transition from eSAP_STARTING to eSAP_DISCONNECTED
3642 * (both without substates)
3643 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303644 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003645 FL("from state %s => %s"),
3646 "eSAP_STARTING", "eSAP_DISCONNECTED");
3647
3648 /* Advance outer statevar */
3649 sap_ctx->sapsMachine = eSAP_DISCONNECTED;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303650 qdf_status = sap_signal_hdd_event(sap_ctx, NULL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003651 eSAP_START_BSS_EVENT,
3652 (void *) eSAP_STATUS_FAILURE);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303653 qdf_status = sap_goto_disconnected(sap_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003654 /* Close the SME session */
3655
3656 if (eSAP_TRUE == sap_ctx->isSapSessionOpen) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303657 if (QDF_STATUS_SUCCESS == sap_close_session(hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003658 sap_ctx, NULL, false))
3659 sap_ctx->isSapSessionOpen = eSAP_FALSE;
3660 }
3661 } else if (msg == eSAP_OPERATING_CHANNEL_CHANGED) {
3662 /* The operating channel has changed, update hostapd */
3663 sap_ctx->channel =
3664 (uint8_t) mac_ctx->sap.SapDfsInfo.target_channel;
3665
3666 sap_ctx->sapsMachine = eSAP_STARTED;
3667
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303668 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003669 FL("from state %s => %s"),
3670 "eSAP_STARTING", "eSAP_STARTED");
3671
3672 /* Indicate change in the state to upper layers */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303673 qdf_status = sap_signal_hdd_event(sap_ctx, roam_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003674 eSAP_START_BSS_EVENT,
3675 (void *)eSAP_STATUS_SUCCESS);
3676 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303677 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003678 FL("in state %s, invalid event msg %d"),
3679 "eSAP_STARTING", msg);
3680 }
3681
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303682 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003683}
3684
3685/**
3686 * sap_fsm_state_started() - utility function called from sap fsm
3687 * @sap_ctx: SAP context
3688 * @sap_event: SAP event buffer
3689 * @mac_ctx: global MAC context
3690 *
3691 * This function is called for state transition from "eSAP_STARTED"
3692 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303693 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003694 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303695static QDF_STATUS sap_fsm_state_started(ptSapContext sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003696 ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx)
3697{
3698 uint32_t msg = sap_event->event;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303699 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003700
3701 if (msg == eSAP_HDD_STOP_INFRA_BSS) {
3702 /*
3703 * Transition from eSAP_STARTED to eSAP_DISCONNECTING
3704 * (both without substates)
3705 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303706 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003707 FL("from state %s => %s"),
3708 "eSAP_STARTED", "eSAP_DISCONNECTING");
3709 sap_ctx->sapsMachine = eSAP_DISCONNECTING;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303710 qdf_status = sap_goto_disconnecting(sap_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003711 } else if (eSAP_DFS_CHNL_SWITCH_ANNOUNCEMENT_START == msg) {
3712 uint8_t intf;
3713 /*
3714 * Radar is seen on the current operating channel
3715 * send CSA IE for all associated stations
3716 * Request for CSA IE transmission
3717 */
3718 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
3719 ptSapContext temp_sap_ctx;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303720 if (((QDF_SAP_MODE ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003721 mac_ctx->sap.sapCtxList[intf].sapPersona) ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05303722 (QDF_P2P_GO_MODE ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003723 mac_ctx->sap.sapCtxList[intf].sapPersona)) &&
3724 mac_ctx->sap.sapCtxList[intf].pSapContext != NULL) {
3725 temp_sap_ctx =
3726 mac_ctx->sap.sapCtxList[intf].pSapContext;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303727 QDF_TRACE(QDF_MODULE_ID_SAP,
3728 QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003729 FL("sapdfs: Sending CSAIE for sapctx[%p]"),
3730 temp_sap_ctx);
3731
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303732 qdf_status = wlansap_dfs_send_csa_ie_request(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003733 (void *) temp_sap_ctx);
3734 }
3735 }
Chandrasekaran, Manishekar8104abd2016-01-29 18:10:27 +05303736 } else if (eSAP_CHANNEL_SWITCH_ANNOUNCEMENT_START == msg) {
3737 enum tQDF_ADAPTER_MODE persona;
3738
3739 if (!sap_ctx) {
3740 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
3741 FL("Invalid sap_ctx"));
3742 return qdf_status;
3743 }
3744
3745 persona = mac_ctx->sap.sapCtxList[sap_ctx->sessionId].
3746 sapPersona;
3747
3748 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
3749 FL("app trigger chan switch: mode:%d vdev:%d"),
3750 persona, sap_ctx->sessionId);
3751
3752 if ((QDF_SAP_MODE == persona) || (QDF_P2P_GO_MODE == persona))
3753 qdf_status = wlansap_dfs_send_csa_ie_request(
3754 (void *) sap_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003755 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303756 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003757 FL("in state %s, invalid event msg %d"),
3758 "eSAP_STARTED", msg);
3759 }
3760
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303761 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003762}
3763
3764/**
3765 * sap_fsm_state_disconnecting() - utility function called from sap fsm
3766 * @sap_ctx: SAP context
3767 * @sap_event: SAP event buffer
3768 * @mac_ctx: global MAC context
3769 *
3770 * This function is called for state transition from "eSAP_DISCONNECTING"
3771 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303772 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003773 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303774static QDF_STATUS sap_fsm_state_disconnecting(ptSapContext sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003775 ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx,
3776 tHalHandle hal)
3777{
3778 uint32_t msg = sap_event->event;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303779 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003780
3781 if (msg == eSAP_MAC_READY_FOR_CONNECTIONS) {
3782 /*
3783 * Transition from eSAP_DISCONNECTING to eSAP_DISCONNECTED
3784 * (both without substates)
3785 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303786 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003787 FL("from state %s => %s"),
3788 "eSAP_DISCONNECTING", "eSAP_DISCONNECTED");
3789 sap_ctx->sapsMachine = eSAP_DISCONNECTED;
3790
3791 /* Close the SME session */
3792 if (eSAP_TRUE == sap_ctx->isSapSessionOpen) {
3793 sap_ctx->isSapSessionOpen = eSAP_FALSE;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303794 qdf_status = sap_close_session(hal, sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003795 sap_roam_session_close_callback, true);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303796 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
3797 qdf_status = sap_signal_hdd_event(sap_ctx, NULL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003798 eSAP_STOP_BSS_EVENT,
3799 (void *)eSAP_STATUS_SUCCESS);
3800 }
3801 }
3802 } else if (msg == eWNI_SME_CHANNEL_CHANGE_REQ) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303803 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003804 FL("sapdfs: Send channel change request on sapctx[%p]"),
3805 sap_ctx);
3806 /*
3807 * Most likely, radar has been detected and SAP wants to
3808 * change the channel
3809 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303810 qdf_status = wlansap_channel_change_request((void *) sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003811 mac_ctx->sap.SapDfsInfo.target_channel);
3812
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303813 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003814 FL("Sending DFS eWNI_SME_CHANNEL_CHANGE_REQ"));
3815 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303816 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003817 FL("in state %s, invalid event msg %d"),
3818 "eSAP_DISCONNECTING", msg);
3819 }
3820
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303821 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003822}
3823
3824/**
3825 * sap_fsm() - SAP statem machine entry function
3826 * @sap_ctx: SAP context
3827 * @sap_event: SAP event
3828 *
3829 * SAP statem machine entry function
3830 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303831 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003832 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303833QDF_STATUS sap_fsm(ptSapContext sap_ctx, ptWLAN_SAPEvent sap_event)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003834{
3835 /*
3836 * Retrieve the phy link state machine structure
3837 * from the sap_ctx value
3838 * state var that keeps track of state machine
3839 */
3840 eSapFsmStates_t state_var = sap_ctx->sapsMachine;
3841 uint32_t msg = sap_event->event; /* State machine input event message */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303842 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003843 tHalHandle hal = CDS_GET_HAL_CB(sap_ctx->p_cds_gctx);
3844 tpAniSirGlobal mac_ctx;
3845
3846 if (NULL == hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303847 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003848 FL("Invalid hal"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303849 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003850 }
3851
3852 mac_ctx = PMAC_STRUCT(hal);
3853 if (NULL == mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303854 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003855 FL("Invalid MAC context"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303856 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003857 }
3858
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303859 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003860 FL("sap_ctx=%p, state_var=%d, msg=0x%x"),
3861 sap_ctx, state_var, msg);
3862
3863 switch (state_var) {
3864 case eSAP_DISCONNECTED:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303865 qdf_status = sap_fsm_state_disconnected(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003866 mac_ctx, hal);
3867 break;
3868
3869 case eSAP_CH_SELECT:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303870 qdf_status = sap_fsm_state_ch_select(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003871 mac_ctx, hal);
3872 break;
3873
3874 case eSAP_DFS_CAC_WAIT:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303875 qdf_status = sap_fsm_state_dfs_cac_wait(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003876 mac_ctx, hal);
3877 break;
3878
3879 case eSAP_STARTING:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303880 qdf_status = sap_fsm_state_starting(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003881 mac_ctx, hal);
3882 break;
3883
3884 case eSAP_STARTED:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303885 qdf_status = sap_fsm_state_started(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003886 mac_ctx);
3887 break;
3888
3889 case eSAP_DISCONNECTING:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303890 qdf_status = sap_fsm_state_disconnecting(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003891 mac_ctx, hal);
3892 break;
3893 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303894 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003895}
3896
3897eSapStatus
3898sapconvert_to_csr_profile(tsap_Config_t *pconfig_params, eCsrRoamBssType bssType,
3899 tCsrRoamProfile *profile)
3900{
3901 /* Create Roam profile for SoftAP to connect */
3902 profile->BSSType = eCSR_BSS_TYPE_INFRA_AP;
3903 profile->SSIDs.numOfSSIDs = 1;
3904 profile->csrPersona = pconfig_params->persona;
3905 profile->disableDFSChSwitch = pconfig_params->disableDFSChSwitch;
3906
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303907 qdf_mem_zero(profile->SSIDs.SSIDList[0].SSID.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003908 sizeof(profile->SSIDs.SSIDList[0].SSID.ssId));
3909
3910 /* Flag to not broadcast the SSID information */
3911 profile->SSIDs.SSIDList[0].ssidHidden =
3912 pconfig_params->SSIDinfo.ssidHidden;
3913
3914 profile->SSIDs.SSIDList[0].SSID.length =
3915 pconfig_params->SSIDinfo.ssid.length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303916 qdf_mem_copy(&profile->SSIDs.SSIDList[0].SSID.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003917 pconfig_params->SSIDinfo.ssid.ssId,
3918 sizeof(pconfig_params->SSIDinfo.ssid.ssId));
3919
3920 profile->negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
3921
3922 if (pconfig_params->authType == eSAP_OPEN_SYSTEM) {
3923 profile->negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
3924 } else if (pconfig_params->authType == eSAP_SHARED_KEY) {
3925 profile->negotiatedAuthType = eCSR_AUTH_TYPE_SHARED_KEY;
3926 } else {
3927 profile->negotiatedAuthType = eCSR_AUTH_TYPE_AUTOSWITCH;
3928 }
3929
3930 profile->AuthType.numEntries = 1;
3931 profile->AuthType.authType[0] = eCSR_AUTH_TYPE_OPEN_SYSTEM;
3932
3933 /* Always set the Encryption Type */
3934 profile->EncryptionType.numEntries = 1;
3935 profile->EncryptionType.encryptionType[0] =
3936 pconfig_params->RSNEncryptType;
3937
3938 profile->mcEncryptionType.numEntries = 1;
3939 profile->mcEncryptionType.encryptionType[0] =
3940 pconfig_params->mcRSNEncryptType;
3941
3942 if (pconfig_params->privacy & eSAP_SHARED_KEY) {
3943 profile->AuthType.authType[0] = eCSR_AUTH_TYPE_SHARED_KEY;
3944 }
3945
3946 profile->privacy = pconfig_params->privacy;
3947 profile->fwdWPSPBCProbeReq = pconfig_params->fwdWPSPBCProbeReq;
3948
3949 if (pconfig_params->authType == eSAP_SHARED_KEY) {
3950 profile->csr80211AuthType = eSIR_SHARED_KEY;
3951 } else if (pconfig_params->authType == eSAP_OPEN_SYSTEM) {
3952 profile->csr80211AuthType = eSIR_OPEN_SYSTEM;
3953 } else {
3954 profile->csr80211AuthType = eSIR_AUTO_SWITCH;
3955 }
3956
3957 /* Initialize we are not going to use it */
3958 profile->pWPAReqIE = NULL;
3959 profile->nWPAReqIELength = 0;
3960
3961 /* set the RSN/WPA IE */
3962 profile->pRSNReqIE = NULL;
3963 profile->nRSNReqIELength = pconfig_params->RSNWPAReqIELength;
3964 if (pconfig_params->RSNWPAReqIELength) {
3965 profile->pRSNReqIE =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303966 qdf_mem_malloc(pconfig_params->RSNWPAReqIELength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003967 if (NULL == profile->pRSNReqIE) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303968 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003969 " %s Fail to alloc memory", __func__);
3970 return eSAP_STATUS_FAILURE;
3971 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303972 qdf_mem_copy(profile->pRSNReqIE, pconfig_params->RSNWPAReqIE,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003973 pconfig_params->RSNWPAReqIELength);
3974 profile->nRSNReqIELength = pconfig_params->RSNWPAReqIELength;
3975 }
3976 /* Turn off CB mode */
3977 profile->CBMode = eCSR_CB_OFF;
3978
3979 /* set the phyMode to accept anything */
3980 /* Best means everything because it covers all the things we support */
3981 /* eCSR_DOT11_MODE_BEST */
3982 profile->phyMode = pconfig_params->SapHw_mode;
3983
3984 /* Configure beaconInterval */
3985 profile->beaconInterval = (uint16_t) pconfig_params->beacon_int;
3986
3987 /* set DTIM period */
3988 profile->dtimPeriod = pconfig_params->dtim_period;
3989
3990 /* set Uapsd enable bit */
3991 profile->ApUapsdEnable = pconfig_params->UapsdEnable;
3992
3993 /* Enable protection parameters */
3994 profile->protEnabled = pconfig_params->protEnabled;
3995 profile->obssProtEnabled = pconfig_params->obssProtEnabled;
3996 profile->cfg_protection = pconfig_params->ht_capab;
3997
3998 /* country code */
3999 if (pconfig_params->countryCode[0])
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304000 qdf_mem_copy(profile->countryCode, pconfig_params->countryCode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004001 WNI_CFG_COUNTRY_CODE_LEN);
4002 profile->ieee80211d = pconfig_params->ieee80211d;
4003 /* wps config info */
4004 profile->wps_state = pconfig_params->wps_state;
4005
4006#ifdef WLAN_FEATURE_11W
4007 /* MFP capable/required */
4008 profile->MFPCapable = pconfig_params->mfpCapable ? 1 : 0;
4009 profile->MFPRequired = pconfig_params->mfpRequired ? 1 : 0;
4010#endif
4011
4012 if (pconfig_params->probeRespIEsBufferLen > 0 &&
4013 pconfig_params->pProbeRespIEsBuffer != NULL) {
4014 profile->addIeParams.probeRespDataLen =
4015 pconfig_params->probeRespIEsBufferLen;
4016 profile->addIeParams.probeRespData_buff =
4017 pconfig_params->pProbeRespIEsBuffer;
4018 } else {
4019 profile->addIeParams.probeRespDataLen = 0;
4020 profile->addIeParams.probeRespData_buff = NULL;
4021 }
4022 /*assoc resp IE */
4023 if (pconfig_params->assocRespIEsLen > 0 &&
4024 pconfig_params->pAssocRespIEsBuffer != NULL) {
4025 profile->addIeParams.assocRespDataLen =
4026 pconfig_params->assocRespIEsLen;
4027 profile->addIeParams.assocRespData_buff =
4028 pconfig_params->pAssocRespIEsBuffer;
4029 } else {
4030 profile->addIeParams.assocRespDataLen = 0;
4031 profile->addIeParams.assocRespData_buff = NULL;
4032 }
4033
4034 if (pconfig_params->probeRespBcnIEsLen > 0 &&
4035 pconfig_params->pProbeRespBcnIEsBuffer != NULL) {
4036 profile->addIeParams.probeRespBCNDataLen =
4037 pconfig_params->probeRespBcnIEsLen;
4038 profile->addIeParams.probeRespBCNData_buff =
4039 pconfig_params->pProbeRespBcnIEsBuffer;
4040 } else {
4041 profile->addIeParams.probeRespBCNDataLen = 0;
4042 profile->addIeParams.probeRespBCNData_buff = NULL;
4043 }
4044 profile->sap_dot11mc = pconfig_params->sap_dot11mc;
4045
4046 return eSAP_STATUS_SUCCESS; /* Success. */
4047}
4048
4049void sap_free_roam_profile(tCsrRoamProfile *profile)
4050{
4051 if (profile->pRSNReqIE) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304052 qdf_mem_free(profile->pRSNReqIE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004053 profile->pRSNReqIE = NULL;
4054 }
4055}
4056
Anurag Chouhan6d760662016-02-20 16:05:43 +05304057void sap_sort_mac_list(struct qdf_mac_addr *macList, uint8_t size)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004058{
4059 uint8_t outer, inner;
Anurag Chouhan6d760662016-02-20 16:05:43 +05304060 struct qdf_mac_addr temp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004061 int32_t nRes = -1;
4062
4063 if ((NULL == macList) || (size > MAX_ACL_MAC_ADDRESS)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304064 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004065 FL("either buffer is NULL or size = %d is more"), size);
4066 return;
4067 }
4068
4069 for (outer = 0; outer < size; outer++) {
4070 for (inner = 0; inner < size - 1; inner++) {
4071 nRes =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304072 qdf_mem_cmp((macList + inner)->bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004073 (macList + inner + 1)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304074 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004075 if (nRes > 0) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304076 qdf_mem_copy(temp.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004077 (macList + inner + 1)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304078 QDF_MAC_ADDR_SIZE);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304079 qdf_mem_copy((macList + inner + 1)->bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004080 (macList + inner)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304081 QDF_MAC_ADDR_SIZE);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304082 qdf_mem_copy((macList + inner)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304083 temp.bytes, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004084 }
4085 }
4086 }
4087}
4088
4089eSapBool
Anurag Chouhan6d760662016-02-20 16:05:43 +05304090sap_search_mac_list(struct qdf_mac_addr *macList,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004091 uint8_t num_mac, uint8_t *peerMac,
4092 uint8_t *index)
4093{
4094 int32_t nRes = -1;
4095 int8_t nStart = 0, nEnd, nMiddle;
4096 nEnd = num_mac - 1;
4097
4098 if ((NULL == macList) || (num_mac > MAX_ACL_MAC_ADDRESS)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304099 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004100 FL("either buffer is NULL or size = %d is more."), num_mac);
4101 return eSAP_FALSE;
4102 }
4103
4104 while (nStart <= nEnd) {
4105 nMiddle = (nStart + nEnd) / 2;
4106 nRes =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304107 qdf_mem_cmp(&macList[nMiddle], peerMac,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304108 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004109
4110 if (0 == nRes) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304111 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004112 "search SUCC");
4113 /* "index equals NULL" means the caller does not need the */
4114 /* index value of the peerMac being searched */
4115 if (index != NULL) {
4116 *index = (uint8_t) nMiddle;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304117 QDF_TRACE(QDF_MODULE_ID_SAP,
4118 QDF_TRACE_LEVEL_INFO_HIGH, "index %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004119 *index);
4120 }
4121 return eSAP_TRUE;
4122 }
4123 if (nRes < 0)
4124 nStart = nMiddle + 1;
4125 else
4126 nEnd = nMiddle - 1;
4127 }
4128
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304129 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004130 "search not succ");
4131 return eSAP_FALSE;
4132}
4133
Anurag Chouhan6d760662016-02-20 16:05:43 +05304134void sap_add_mac_to_acl(struct qdf_mac_addr *macList,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004135 uint8_t *size, uint8_t *peerMac)
4136{
4137 int32_t nRes = -1;
4138 int i;
4139
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304140 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004141 "add acl entered");
4142
4143 if (NULL == macList || *size == 0 || *size > MAX_ACL_MAC_ADDRESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304144 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004145 FL("either buffer is NULL or size = %d is incorrect."),
4146 *size);
4147 return;
4148 }
4149
4150 for (i = ((*size) - 1); i >= 0; i--) {
4151 nRes =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304152 qdf_mem_cmp(&macList[i], peerMac, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004153 if (nRes > 0) {
4154 /* Move alphabetically greater mac addresses one index down to allow for insertion
4155 of new mac in sorted order */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304156 qdf_mem_copy((macList + i + 1)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304157 (macList + i)->bytes, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004158 } else {
4159 break;
4160 }
4161 }
4162 /* This should also take care of if the element is the first to be added in the list */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304163 qdf_mem_copy((macList + i + 1)->bytes, peerMac, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004164 /* increment the list size */
4165 (*size)++;
4166}
4167
Anurag Chouhan6d760662016-02-20 16:05:43 +05304168void sap_remove_mac_from_acl(struct qdf_mac_addr *macList,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004169 uint8_t *size, uint8_t index)
4170{
4171 int i;
4172
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304173 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004174 "remove acl entered");
4175 /*
4176 * Return if the list passed is empty. Ideally this should never happen
4177 * since this funcn is always called after sap_search_mac_list to get
4178 * the index of the mac addr to be removed and this will only get
4179 * called if the search is successful. Still no harm in having the check
4180 */
4181 if ((macList == NULL) || (*size == 0) ||
4182 (*size > MAX_ACL_MAC_ADDRESS)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304183 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004184 FL("either buffer is NULL or size %d is incorrect."),
4185 *size);
4186 return;
4187 }
4188 for (i = index; i < ((*size) - 1); i++) {
4189 /* Move mac addresses starting from "index" passed one index up to delete the void
4190 created by deletion of a mac address in ACL */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304191 qdf_mem_copy((macList + i)->bytes, (macList + i + 1)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304192 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004193 }
4194 /* The last space should be made empty since all mac addesses moved one step up */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304195 qdf_mem_zero((macList + (*size) - 1)->bytes, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004196 /* reduce the list size by 1 */
4197 (*size)--;
4198}
4199
Anurag Chouhan6d760662016-02-20 16:05:43 +05304200void sap_print_acl(struct qdf_mac_addr *macList, uint8_t size)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004201{
4202 int i;
4203 uint8_t *macArray;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304204 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004205 "print acl entered");
4206
4207 if ((NULL == macList) || (size == 0) || (size >= MAX_ACL_MAC_ADDRESS)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304208 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004209 "In %s, either buffer is NULL or size %d is incorrect.",
4210 __func__, size);
4211 return;
4212 }
4213
4214 for (i = 0; i < size; i++) {
4215 macArray = (macList + i)->bytes;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304216 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004217 "** ACL entry %i - " MAC_ADDRESS_STR, i,
4218 MAC_ADDR_ARRAY(macArray));
4219 }
4220 return;
4221}
4222
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304223QDF_STATUS sap_is_peer_mac_allowed(ptSapContext sapContext, uint8_t *peerMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004224{
4225 if (eSAP_ALLOW_ALL == sapContext->eSapMacAddrAclMode)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304226 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004227
4228 if (sap_search_mac_list
4229 (sapContext->acceptMacList, sapContext->nAcceptMac, peerMac, NULL))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304230 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004231
4232 if (sap_search_mac_list
4233 (sapContext->denyMacList, sapContext->nDenyMac, peerMac, NULL)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304234 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004235 "In %s, Peer " MAC_ADDRESS_STR " in deny list",
4236 __func__, MAC_ADDR_ARRAY(peerMac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304237 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004238 }
4239 /* A new station CAN associate, unless in deny list. Less stringent mode */
4240 if (eSAP_ACCEPT_UNLESS_DENIED == sapContext->eSapMacAddrAclMode)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304241 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004242
4243 /* A new station CANNOT associate, unless in accept list. More stringent mode */
4244 if (eSAP_DENY_UNLESS_ACCEPTED == sapContext->eSapMacAddrAclMode) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304245 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004246 "In %s, Peer " MAC_ADDRESS_STR
4247 " denied, Mac filter mode is eSAP_DENY_UNLESS_ACCEPTED",
4248 __func__, MAC_ADDR_ARRAY(peerMac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304249 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004250 }
4251
4252 /* The new STA is neither in accept list nor in deny list. In this case, deny the association
4253 * but send a wifi event notification indicating the mac address being denied
4254 */
4255 if (eSAP_SUPPORT_ACCEPT_AND_DENY == sapContext->eSapMacAddrAclMode) {
4256 sap_signal_hdd_event(sapContext, NULL, eSAP_UNKNOWN_STA_JOIN,
4257 (void *) peerMac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304258 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004259 "In %s, Peer " MAC_ADDRESS_STR
4260 " denied, Mac filter mode is eSAP_SUPPORT_ACCEPT_AND_DENY",
4261 __func__, MAC_ADDR_ARRAY(peerMac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304262 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004263 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304264 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004265}
4266
4267#ifdef SOFTAP_CHANNEL_RANGE
4268/**
4269 * sap_get_channel_list() - get the list of channels
4270 * @sap_ctx: sap context
4271 * @ch_list: pointer to channel list array
4272 * @num_ch: pointer to number of channels.
4273 *
4274 * This function populates the list of channels for scanning.
4275 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304276 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004277 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304278static QDF_STATUS sap_get_channel_list(ptSapContext sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004279 uint8_t **ch_list,
4280 uint8_t *num_ch)
4281{
4282 uint8_t loop_count;
4283 uint8_t *list;
4284 uint8_t ch_count;
4285 uint8_t start_ch_num, band_start_ch;
4286 uint8_t end_ch_num, band_end_ch;
4287 uint32_t en_lte_coex;
4288 tHalHandle hal = CDS_GET_HAL_CB(sap_ctx->p_cds_gctx);
4289#ifdef FEATURE_WLAN_CH_AVOID
4290 uint8_t i;
4291#endif
4292 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
4293
4294 if (NULL == hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304295 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004296 FL("Invalid HAL pointer from p_cds_gctx"));
4297 *num_ch = 0;
4298 *ch_list = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304299 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004300 }
4301
4302 start_ch_num = sap_ctx->acs_cfg->start_ch;
4303 end_ch_num = sap_ctx->acs_cfg->end_ch;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304304 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004305 FL("startChannel %d, EndChannel %d, HW:%d"),
4306 start_ch_num, end_ch_num,
4307 sap_ctx->acs_cfg->hw_mode);
4308
4309 wlansap_extend_to_acs_range(&start_ch_num, &end_ch_num,
4310 &band_start_ch, &band_end_ch);
4311
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304312 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004313 FL("expanded startChannel %d,EndChannel %d"),
4314 start_ch_num, end_ch_num);
4315
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304316 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004317 FL("band_start_ch %d, band_end_ch %d"),
4318 band_start_ch, band_end_ch);
4319
4320 sme_cfg_get_int(hal, WNI_CFG_ENABLE_LTE_COEX, &en_lte_coex);
4321
4322 /* Check if LTE coex is enabled and 2.4GHz is selected */
Amar Singhalb8d4f152016-02-10 10:21:43 -08004323 if (en_lte_coex && (band_start_ch == CHAN_ENUM_1) &&
4324 (band_end_ch == CHAN_ENUM_14)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004325 /* Set 2.4GHz upper limit to channel 9 for LTE COEX */
Amar Singhalb8d4f152016-02-10 10:21:43 -08004326 band_end_ch = CHAN_ENUM_9;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004327 }
4328
4329 /* Allocate the max number of channel supported */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304330 list = (uint8_t *) qdf_mem_malloc(NUM_5GHZ_CHANNELS +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004331 NUM_24GHZ_CHANNELS);
4332 if (NULL == list) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304333 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004334 FL("Unable to allocate channel list"));
4335 *num_ch = 0;
4336 *ch_list = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304337 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004338 }
4339
4340 /* Search for the Active channels in the given range */
4341 ch_count = 0;
4342 for (loop_count = band_start_ch; loop_count <= band_end_ch;
4343 loop_count++) {
4344 /* go to next channel if rf_channel is out of range */
Amar Singhal7a1726a2015-10-14 16:28:11 -07004345 if ((start_ch_num > CDS_CHANNEL_NUM(loop_count)) ||
4346 (end_ch_num < CDS_CHANNEL_NUM(loop_count)))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004347 continue;
4348 /*
4349 * go to next channel if none of these condition pass
4350 * - DFS scan enabled and chan not in CHANNEL_STATE_DISABLE
4351 * - DFS scan disable but chan in CHANNEL_STATE_ENABLE
4352 */
4353 if (!(((eSAP_TRUE == mac_ctx->scan.fEnableDFSChnlScan) &&
Amar Singhal7a1726a2015-10-14 16:28:11 -07004354 CDS_CHANNEL_STATE(loop_count)) ||
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004355 ((eSAP_FALSE == mac_ctx->scan.fEnableDFSChnlScan) &&
4356 (CHANNEL_STATE_ENABLE ==
Amar Singhal7a1726a2015-10-14 16:28:11 -07004357 CDS_CHANNEL_STATE(loop_count)))))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004358 continue;
4359
4360#ifdef FEATURE_WLAN_CH_AVOID
Amar Singhalb8d4f152016-02-10 10:21:43 -08004361 for (i = 0; i < NUM_CHANNELS; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004362 if ((safe_channels[i].channelNumber ==
Amar Singhal7a1726a2015-10-14 16:28:11 -07004363 CDS_CHANNEL_NUM(loop_count))) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004364 /* Check if channel is safe */
4365 if (true == safe_channels[i].isSafe) {
4366#endif
4367#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
4368 uint8_t ch;
Amar Singhal7a1726a2015-10-14 16:28:11 -07004369 ch = CDS_CHANNEL_NUM(loop_count);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004370 if ((sap_ctx->acs_cfg->skip_scan_status ==
4371 eSAP_DO_PAR_ACS_SCAN)) {
4372 if ((ch >= sap_ctx->acs_cfg->skip_scan_range1_stch &&
4373 ch <= sap_ctx->acs_cfg->skip_scan_range1_endch) ||
4374 (ch >= sap_ctx->acs_cfg->skip_scan_range2_stch &&
4375 ch <= sap_ctx->acs_cfg->skip_scan_range2_endch)) {
4376 list[ch_count] =
Amar Singhal7a1726a2015-10-14 16:28:11 -07004377 CDS_CHANNEL_NUM(loop_count);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004378 ch_count++;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304379 QDF_TRACE(QDF_MODULE_ID_SAP,
4380 QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004381 FL("%d %d added to ACS ch range"),
4382 ch_count, ch);
4383 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304384 QDF_TRACE(QDF_MODULE_ID_SAP,
4385 QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004386 FL("%d %d skipped from ACS ch range"),
4387 ch_count, ch);
4388 }
4389 } else {
4390 list[ch_count] =
Amar Singhal7a1726a2015-10-14 16:28:11 -07004391 CDS_CHANNEL_NUM(loop_count);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004392 ch_count++;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304393 QDF_TRACE(QDF_MODULE_ID_SAP,
4394 QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004395 FL("%d %d added to ACS ch range"),
4396 ch_count, ch);
4397 }
4398#else
Amar Singhal7a1726a2015-10-14 16:28:11 -07004399 list[ch_count] = CDS_CHANNEL_NUM(loop_count);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004400 ch_count++;
4401#endif
4402#ifdef FEATURE_WLAN_CH_AVOID
4403 }
4404 break;
4405 }
4406 }
4407#endif
4408 }
4409 if (0 == ch_count) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304410 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004411 FL("No active channels present for the current region"));
4412 /*
4413 * LTE COEX: channel range outside the restricted 2.4GHz
4414 * band limits
4415 */
4416 if (en_lte_coex && (start_ch_num > band_end_ch))
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304417 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004418 FL("SAP can't be started as due to LTE COEX"));
4419 }
4420
4421 /* return the channel list and number of channels to scan */
4422 *num_ch = ch_count;
4423 if (ch_count != 0) {
4424 *ch_list = list;
4425 } else {
4426 *ch_list = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304427 qdf_mem_free(list);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004428 }
4429
4430 for (loop_count = 0; loop_count < ch_count; loop_count++) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304431 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004432 FL("channel number: %d"), list[loop_count]);
4433 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304434 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004435}
4436#endif
4437
4438/*
4439 * Function for initializing list of 2.4/5 Ghz [NON-DFS/DFS]
4440 * available channels in the current regulatory domain.
4441 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304442static QDF_STATUS sap_get5_g_hz_channel_list(ptSapContext sapContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004443{
4444 uint8_t count = 0;
4445 int i;
4446 if (NULL == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304447 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004448 "Invalid sapContext pointer on sap_get_channel_list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304449 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004450 }
4451
4452 if (sapContext->SapAllChnlList.channelList) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304453 qdf_mem_free(sapContext->SapAllChnlList.channelList);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004454 sapContext->SapAllChnlList.channelList = NULL;
4455 }
4456
4457 sapContext->SapAllChnlList.channelList =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304458 (tChannelInfo *) qdf_mem_malloc(WNI_CFG_VALID_CHANNEL_LIST_LEN *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004459 sizeof(tChannelInfo));
4460 if (NULL == sapContext->SapAllChnlList.channelList) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304461 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004462 " Memory Allocation failed sap_get_channel_list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304463 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004464 }
4465
Amar Singhalb8d4f152016-02-10 10:21:43 -08004466 for (i = CHAN_ENUM_36; i <= CHAN_ENUM_165; i++) {
Amar Singhal7a1726a2015-10-14 16:28:11 -07004467 if (CDS_CHANNEL_STATE(i) == CHANNEL_STATE_ENABLE ||
4468 CDS_CHANNEL_STATE(i) == CHANNEL_STATE_DFS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004469 sapContext->SapAllChnlList.channelList[count].channel =
Amar Singhal7a1726a2015-10-14 16:28:11 -07004470 CDS_CHANNEL_NUM(i);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304471 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004472 "%s[%d] CHANNEL = %d", __func__, __LINE__,
4473 sapContext->SapAllChnlList.channelList[count].
4474 channel);
4475 sapContext->SapAllChnlList.channelList[count].valid =
4476 true;
4477 count++;
4478 }
4479 }
4480
4481 sapContext->SapAllChnlList.numChannel = count;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304482 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004483 "%s[%d] NUMBER OF CHANNELS count = %d"
4484 "sapContext->SapAllChnlList.numChannel = %d",
4485 __func__, __LINE__, count,
4486 sapContext->SapAllChnlList.numChannel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304487 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004488}
4489
4490/*
4491 * This function randomly selects the channel to switch after the detection
4492 * of radar
4493 * param sapContext - sap context
4494 * dfs_event - Dfs information from DFS
4495 * return - channel to which AP wishes to switch
4496 */
4497uint8_t sap_indicate_radar(ptSapContext sapContext,
4498 tSirSmeDfsEventInd *dfs_event)
4499{
4500 uint8_t target_channel = 0;
4501 tHalHandle hHal;
4502 tpAniSirGlobal pMac;
4503
4504 if (NULL == sapContext || NULL == dfs_event) {
4505 /* Invalid sap context of dfs event passed */
4506 return 0;
4507 }
4508 hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
4509
4510 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304511 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004512 "In %s invalid hHal", __func__);
4513 return 0;
4514 }
4515 pMac = PMAC_STRUCT(hHal);
4516
4517 if (!dfs_event->dfs_radar_status) {
4518 /*dfs status does not indicate a radar on the channel-- False Alarm */
4519 return 0;
4520 }
4521
4522 /*
4523 * SAP needs to generate Channel Switch IE
4524 * if the radar is found in the STARTED state
4525 */
4526 if (eSAP_STARTED == sapContext->sapsMachine)
4527 pMac->sap.SapDfsInfo.csaIERequired = eSAP_TRUE;
4528
4529 if (sapContext->csr_roamProfile.disableDFSChSwitch) {
4530 return sapContext->channel;
4531 }
4532
4533 /* set the Radar Found flag in SapDfsInfo */
4534 pMac->sap.SapDfsInfo.sap_radar_found_status = true;
4535
4536 sap_get5_g_hz_channel_list(sapContext);
4537
4538 if (dfs_event->chan_list.nchannels > SIR_DFS_MAX_20M_SUB_CH) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304539 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004540 FL("nchannels >SIR_DFS_MAX_20M_SUB_CH so resetting"));
4541 dfs_event->chan_list.nchannels = SIR_DFS_MAX_20M_SUB_CH;
4542 }
4543
4544 sap_mark_dfs_channels(sapContext, dfs_event->chan_list.channels,
4545 dfs_event->chan_list.nchannels,
4546 cds_get_monotonic_boottime());
4547
4548 /*
4549 * (1) skip static turbo channel as it will require STA to be in
4550 * static turbo to work.
4551 * (2) skip channel which's marked with radar detction
4552 * (3) WAR: we allow user to config not to use any DFS channel
4553 * (4) When we pick a channel, skip excluded 11D channels
4554 * (5) Create the available channel list with the above rules
4555 */
4556
4557 target_channel = sap_random_channel_sel(sapContext);
4558 if (0 == target_channel) {
4559 sap_signal_hdd_event(sapContext, NULL,
4560 eSAP_DFS_NO_AVAILABLE_CHANNEL,
4561 (void *) eSAP_STATUS_SUCCESS);
4562 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304563 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004564 FL("sapdfs: New selected target channel is [%d]"),
4565 target_channel);
4566 return target_channel;
4567}
4568
4569/*
4570 * CAC timer callback function.
4571 * Post eSAP_DFS_CHANNEL_CAC_END event to sap_fsm().
4572 */
4573void sap_dfs_cac_timer_callback(void *data)
4574{
4575 ptSapContext sapContext;
4576 tWLAN_SAPEvent sapEvent;
4577 tHalHandle hHal = (tHalHandle) data;
4578 tpAniSirGlobal pMac;
4579
4580 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304581 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004582 "In %s invalid hHal", __func__);
4583 return;
4584 }
4585 pMac = PMAC_STRUCT(hHal);
4586 sapContext = sap_find_valid_concurrent_session(hHal);
4587
4588 if (NULL == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304589 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004590 "In %s no SAP contexts are found", __func__);
4591 return;
4592 }
4593
4594 /* Check to ensure that SAP is in DFS WAIT state */
4595 if (sapContext->sapsMachine == eSAP_DFS_CAC_WAIT) {
Anurag Chouhan210db072016-02-22 18:42:15 +05304596 qdf_mc_timer_destroy(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004597 pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = false;
4598
4599 /*
4600 * CAC Complete, post eSAP_DFS_CHANNEL_CAC_END to sap_fsm
4601 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304602 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004603 "sapdfs: Sending eSAP_DFS_CHANNEL_CAC_END for target_channel = %d on sapctx[%p]",
4604 sapContext->channel, sapContext);
4605
4606 sapEvent.event = eSAP_DFS_CHANNEL_CAC_END;
4607 sapEvent.params = 0;
4608 sapEvent.u1 = 0;
4609 sapEvent.u2 = 0;
4610
4611 sap_fsm(sapContext, &sapEvent);
4612 }
4613
4614}
4615
4616/*
4617 * Function to stop the DFS CAC Timer
4618 */
4619static int sap_stop_dfs_cac_timer(ptSapContext sapContext)
4620{
4621 tHalHandle hHal;
4622 tpAniSirGlobal pMac;
4623 if (sapContext == NULL)
4624 return 0;
4625
4626 hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
4627 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304628 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004629 "In %s invalid hHal", __func__);
4630 return 0;
4631 }
4632 pMac = PMAC_STRUCT(hHal);
4633
Anurag Chouhan210db072016-02-22 18:42:15 +05304634 if (QDF_TIMER_STATE_RUNNING !=
4635 qdf_mc_timer_get_current_state(&pMac->sap.SapDfsInfo.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004636 sap_dfs_cac_timer)) {
4637 return 0;
4638 }
4639
Anurag Chouhan210db072016-02-22 18:42:15 +05304640 qdf_mc_timer_stop(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004641 pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = 0;
4642
4643 return 0;
4644}
4645
4646
4647/**
4648 * sap_is_channel_bonding_etsi_weather_channel() - check weather chan bonding.
4649 * @sap_context: SAP context
4650 *
4651 * Check if the current SAP operating channel is bonded to weather radar
4652 * channel in ETSI domain.
4653 *
4654 * Return: True if bonded to weather channel in ETSI
4655 */
4656static bool
4657sap_is_channel_bonding_etsi_weather_channel(ptSapContext sap_context)
4658{
4659 if (IS_CH_BONDING_WITH_WEATHER_CH(sap_context->channel) &&
4660 (sap_context->ch_params.ch_width != CH_WIDTH_20MHZ))
4661 return true;
4662
4663 return false;
4664}
4665
4666/*
4667 * Function to start the DFS CAC Timer
4668 * when SAP is started on a DFS channel
4669 */
4670int sap_start_dfs_cac_timer(ptSapContext sapContext)
4671{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304672 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004673 uint32_t cacTimeOut;
4674 tHalHandle hHal = NULL;
4675 tpAniSirGlobal pMac = NULL;
4676 uint8_t dfs_region;
4677
4678 if (sapContext == NULL) {
4679 return 0;
4680 }
4681 hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
4682
4683 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304684 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004685 "In %s invalid hHal", __func__);
4686 return 0;
4687 }
4688 pMac = PMAC_STRUCT(hHal);
4689
4690 if (pMac->sap.SapDfsInfo.ignore_cac) {
4691 /*
4692 * If User has set to ignore the CAC
4693 * so, continue without CAC Timer.
4694 */
4695 return 2;
4696 }
4697 cacTimeOut = DEFAULT_CAC_TIMEOUT;
4698
4699 cds_get_dfs_region(&dfs_region);
4700
4701 if ((dfs_region == DFS_ETSI_DOMAIN)
4702 && ((IS_ETSI_WEATHER_CH(sapContext->channel)) ||
4703 (sap_is_channel_bonding_etsi_weather_channel(sapContext)))) {
4704 cacTimeOut = ETSI_WEATHER_CH_CAC_TIMEOUT;
4705 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304706 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004707 "sapdfs: SAP_DFS_CHANNEL_CAC_START on CH - %d, CAC TIMEOUT - %d sec",
4708 sapContext->channel, cacTimeOut / 1000);
4709
Anurag Chouhan210db072016-02-22 18:42:15 +05304710 qdf_mc_timer_init(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304711 QDF_TIMER_TYPE_SW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004712 sap_dfs_cac_timer_callback, (void *) hHal);
4713
4714 /*Start the CAC timer */
4715 status =
Anurag Chouhan210db072016-02-22 18:42:15 +05304716 qdf_mc_timer_start(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004717 cacTimeOut);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304718 if (status == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004719 pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = true;
4720 return 1;
4721 } else {
4722 return 0;
4723 }
4724}
4725
4726/*
4727 * This function initializes the NOL list
4728 * parameters required to track the radar
4729 * found DFS channels in the current Reg. Domain .
4730 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304731QDF_STATUS sap_init_dfs_channel_nol_list(ptSapContext sapContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004732{
4733 uint8_t count = 0;
4734 int i;
4735 bool bFound = false;
4736 tHalHandle hHal;
4737 tpAniSirGlobal pMac;
4738
4739 if (NULL == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304740 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004741 "Invalid sapContext pointer on sap_init_dfs_channel_nol_list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304742 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004743 }
4744 hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
4745
4746 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304747 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004748 "In %s invalid hHal", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304749 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004750 }
4751 pMac = PMAC_STRUCT(hHal);
4752
4753 /* to indicate hdd to get cnss dfs nol */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304754 if (QDF_STATUS_SUCCESS == sap_signal_hdd_event(sapContext, NULL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004755 eSAP_DFS_NOL_GET,
4756 (void *)
4757 eSAP_STATUS_SUCCESS)) {
4758 bFound = true;
4759 }
4760
Amar Singhalb8d4f152016-02-10 10:21:43 -08004761 for (i = CHAN_ENUM_36; i <= CHAN_ENUM_165; i++) {
Amar Singhal7a1726a2015-10-14 16:28:11 -07004762 if (CDS_CHANNEL_STATE(i) == CHANNEL_STATE_DFS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004763 /* if dfs nol is not found, initialize it */
4764 if (!bFound) {
4765 pMac->sap.SapDfsInfo.sapDfsChannelNolList[count]
4766 .dfs_channel_number =
Amar Singhal7a1726a2015-10-14 16:28:11 -07004767 CDS_CHANNEL_NUM(i);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004768
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304769 QDF_TRACE(QDF_MODULE_ID_SAP,
4770 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004771 "%s: CHANNEL = %d", __func__,
4772 pMac->sap.SapDfsInfo.
4773 sapDfsChannelNolList[count].
4774 dfs_channel_number);
4775
4776 pMac->sap.SapDfsInfo.sapDfsChannelNolList[count]
4777 .radar_status_flag =
4778 eSAP_DFS_CHANNEL_USABLE;
4779 pMac->sap.SapDfsInfo.sapDfsChannelNolList[count]
4780 .radar_found_timestamp = 0;
4781 }
4782 count++;
4783 }
4784 }
4785
4786 pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels = count;
4787
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304788 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004789 "%s[%d] NUMBER OF DFS CHANNELS = %d",
4790 __func__, __LINE__,
4791 pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels);
4792
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304793 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004794}
4795
4796/*
4797 * This function will calculate how many interfaces
4798 * have sap persona and returns total number of sap persona.
4799 */
4800uint8_t sap_get_total_number_sap_intf(tHalHandle hHal)
4801{
4802 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4803 uint8_t intf = 0;
4804 uint8_t intf_count = 0;
4805
4806 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
Anurag Chouhan6d760662016-02-20 16:05:43 +05304807 if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004808 ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05304809 (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004810 && pMac->sap.sapCtxList[intf].pSapContext != NULL) {
4811 intf_count++;
4812 }
4813 }
4814 return intf_count;
4815}
4816
4817/*
4818 * This function will find the concurrent sap context apart from
4819 * passed sap context and return its channel change ready status
4820 */
4821bool is_concurrent_sap_ready_for_channel_change(tHalHandle hHal,
4822 ptSapContext sapContext)
4823{
4824 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
4825 ptSapContext pSapContext;
4826 uint8_t intf = 0;
4827
4828 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
Anurag Chouhan6d760662016-02-20 16:05:43 +05304829 if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004830 ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05304831 (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004832 && pMac->sap.sapCtxList[intf].pSapContext != NULL) {
4833 pSapContext =
4834 (ptSapContext) pMac->sap.sapCtxList[intf].
4835 pSapContext;
4836 if (pSapContext == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304837 QDF_TRACE(QDF_MODULE_ID_SAP,
4838 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004839 FL("sapCtx matched [%p]"),
4840 sapContext);
4841 continue;
4842 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304843 QDF_TRACE(QDF_MODULE_ID_SAP,
4844 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004845 FL
4846 ("concurrent sapCtx[%p] didn't matche with [%p]"),
4847 pSapContext, sapContext);
4848 return pSapContext->is_sap_ready_for_chnl_chng;
4849 }
4850 }
4851 }
4852 return false;
4853}