blob: d9018faa04d911f8d105ac515e55ce27cab92fc5 [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 } },
Kai Liue30491f2016-09-28 23:41:13 +0800301
302 {144,
303 {{36, SAP_TX_LEAKAGE_MAX}, {40, SAP_TX_LEAKAGE_MAX},
304 {44, SAP_TX_LEAKAGE_MAX}, {48, SAP_TX_LEAKAGE_MAX},
305 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
306 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
307 {100, SAP_TX_LEAKAGE_MIN}, {104, SAP_TX_LEAKAGE_MIN},
308 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
309 {116, SAP_TX_LEAKAGE_MIN}, {120, SAP_TX_LEAKAGE_MIN},
310 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
311 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
312 {144, SAP_TX_LEAKAGE_MIN}
313 } },
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800314};
315
316/* channel tx leakage table - ht40 */
317tSapChanMatrixInfo ht40_chan[] = {
318 {52,
319 {{36, SAP_TX_LEAKAGE_AUTO_MIN}, {40, SAP_TX_LEAKAGE_AUTO_MIN},
320 {44, 230}, {48, 230},
321 {52, SAP_TX_LEAKAGE_MIN}, {56, SAP_TX_LEAKAGE_MIN},
322 {60, SAP_TX_LEAKAGE_AUTO_MIN}, {64, SAP_TX_LEAKAGE_AUTO_MIN},
323 {100, 625}, {104, 323},
324 {108, 646}, {112, 646},
325 {116, SAP_TX_LEAKAGE_MAX}, {120, SAP_TX_LEAKAGE_MAX},
326 {124, SAP_TX_LEAKAGE_MAX}, {128, SAP_TX_LEAKAGE_MAX},
327 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
328 {140, SAP_TX_LEAKAGE_MAX},
329 {144, SAP_TX_LEAKAGE_MIN}
330 } },
331
332 {56,
333 {{36, SAP_TX_LEAKAGE_AUTO_MIN}, {40, SAP_TX_LEAKAGE_AUTO_MIN},
334 {44, SAP_TX_LEAKAGE_AUTO_MIN}, {48, SAP_TX_LEAKAGE_AUTO_MIN},
335 {52, SAP_TX_LEAKAGE_MIN}, {56, SAP_TX_LEAKAGE_MIN},
336 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
337 {100, 611}, {104, 611},
338 {108, 617}, {112, 617},
339 {116, SAP_TX_LEAKAGE_MAX}, {120, SAP_TX_LEAKAGE_MAX},
340 {124, SAP_TX_LEAKAGE_MAX}, {128, SAP_TX_LEAKAGE_MAX},
341 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
342 {140, SAP_TX_LEAKAGE_MAX},
343 {144, SAP_TX_LEAKAGE_MIN}
344 } },
345
346 {60,
347 {{36, SAP_TX_LEAKAGE_AUTO_MIN}, {40, SAP_TX_LEAKAGE_AUTO_MIN},
348 {44, SAP_TX_LEAKAGE_AUTO_MIN}, {48, SAP_TX_LEAKAGE_AUTO_MIN},
349 {52, 190}, {56, 190},
350 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
351 {100, 608}, {104, 608},
352 {108, 623}, {112, 623},
353 {116, SAP_TX_LEAKAGE_MAX}, {120, SAP_TX_LEAKAGE_MAX},
354 {124, SAP_TX_LEAKAGE_MAX}, {128, SAP_TX_LEAKAGE_MAX},
355 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
356 {140, SAP_TX_LEAKAGE_MAX},
357 {144, SAP_TX_LEAKAGE_MIN}
358 } },
359
360 {64,
361 {{36, SAP_TX_LEAKAGE_AUTO_MIN}, {40, SAP_TX_LEAKAGE_AUTO_MIN},
362 {44, SAP_TX_LEAKAGE_AUTO_MIN}, {48, SAP_TX_LEAKAGE_AUTO_MIN},
363 {52, 295}, {56, 295},
364 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
365 {100, 594}, {104, 594},
366 {108, 625}, {112, 625},
367 {116, SAP_TX_LEAKAGE_MAX}, {120, SAP_TX_LEAKAGE_MAX},
368 {124, SAP_TX_LEAKAGE_MAX}, {128, SAP_TX_LEAKAGE_MAX},
369 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
370 {140, SAP_TX_LEAKAGE_MAX},
371 {144, SAP_TX_LEAKAGE_MIN}
372 } },
373
374 {100,
375 {{36, 618}, {40, 618},
376 {44, 604}, {48, 604},
377 {52, 596}, {56, 596},
378 {60, 584}, {64, 584},
379 {100, SAP_TX_LEAKAGE_MIN}, {104, SAP_TX_LEAKAGE_MIN},
380 {108, 299}, {112, 299},
381 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, SAP_TX_LEAKAGE_AUTO_MIN},
382 {124, SAP_TX_LEAKAGE_AUTO_MIN}, {128, SAP_TX_LEAKAGE_AUTO_MIN},
383 {132, 538}, {136, 538},
384 {140, 598},
385 {144, SAP_TX_LEAKAGE_MIN}
386 } },
387
388 {104,
389 {{36, 636}, {40, 636},
390 {44, 601}, {48, 601},
391 {52, 616}, {56, 616},
392 {60, 584}, {64, 584},
393 {100, SAP_TX_LEAKAGE_MIN}, {104, SAP_TX_LEAKAGE_MIN},
394 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
395 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, SAP_TX_LEAKAGE_AUTO_MIN},
396 {124, SAP_TX_LEAKAGE_AUTO_MIN}, {128, SAP_TX_LEAKAGE_AUTO_MIN},
397 {132, 553}, {136, 553},
398 {140, 568},
399 {144, SAP_TX_LEAKAGE_MIN}
400 } },
401
402 {108,
403 {{36, 600}, {40, 600},
404 {44, 627}, {48, 627},
405 {52, 611}, {56, 611},
406 {60, 611}, {64, 611},
407 {100, 214}, {104, 214},
408 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
409 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, SAP_TX_LEAKAGE_AUTO_MIN},
410 {124, SAP_TX_LEAKAGE_AUTO_MIN}, {128, SAP_TX_LEAKAGE_AUTO_MIN},
411 {132, SAP_TX_LEAKAGE_AUTO_MIN}, {136, SAP_TX_LEAKAGE_AUTO_MIN},
412 {140, 534},
413 {144, SAP_TX_LEAKAGE_MIN}
414 } },
415
416 {112,
417 {{36, 645}, {40, 645},
418 {44, 641}, {48, 641},
419 {52, 618}, {56, 618},
420 {60, 612}, {64, 612},
421 {100, 293}, {104, 293},
422 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
423 {116, SAP_TX_LEAKAGE_MIN}, {120, SAP_TX_LEAKAGE_MIN},
424 {124, SAP_TX_LEAKAGE_AUTO_MIN}, {128, SAP_TX_LEAKAGE_AUTO_MIN},
425 {132, SAP_TX_LEAKAGE_AUTO_MIN}, {136, SAP_TX_LEAKAGE_AUTO_MIN},
426 {140, 521},
427 {144, SAP_TX_LEAKAGE_MIN}
428 } },
429
430 {116,
431 {{36, 661}, {40, 661},
432 {44, 624}, {48, 624},
433 {52, 634}, {56, 634},
434 {60, 611}, {64, 611},
435 {100, SAP_TX_LEAKAGE_AUTO_MIN}, {104, SAP_TX_LEAKAGE_AUTO_MIN},
436 {108, 217}, {112, 217},
437 {116, SAP_TX_LEAKAGE_MIN}, {120, SAP_TX_LEAKAGE_MIN},
438 {124, SAP_TX_LEAKAGE_AUTO_MIN}, {128, SAP_TX_LEAKAGE_AUTO_MIN},
439 {132, SAP_TX_LEAKAGE_AUTO_MIN}, {136, SAP_TX_LEAKAGE_AUTO_MIN},
440 {140, SAP_TX_LEAKAGE_AUTO_MIN},
441 {144, SAP_TX_LEAKAGE_MIN}
442 } },
443
444 {120,
445 {{36, 667}, {40, 667},
446 {44, 645}, {48, 645},
447 {52, 633}, {56, 633},
448 {60, 619}, {64, 619},
449 {100, SAP_TX_LEAKAGE_AUTO_MIN}, {104, SAP_TX_LEAKAGE_AUTO_MIN},
450 {108, 291}, {112, 291},
451 {116, SAP_TX_LEAKAGE_MIN}, {120, SAP_TX_LEAKAGE_MIN},
452 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
453 {132, SAP_TX_LEAKAGE_AUTO_MIN}, {136, SAP_TX_LEAKAGE_AUTO_MIN},
454 {140, SAP_TX_LEAKAGE_AUTO_MIN},
455 {144, SAP_TX_LEAKAGE_MIN}
456 } },
457
458 {124,
459 {{36, 676}, {40, 676},
460 {44, 668}, {48, 668},
461 {52, 595}, {56, 595},
462 {60, 622}, {64, 622},
463 {100, SAP_TX_LEAKAGE_AUTO_MIN}, {104, SAP_TX_LEAKAGE_AUTO_MIN},
464 {108, SAP_TX_LEAKAGE_AUTO_MIN}, {112, SAP_TX_LEAKAGE_AUTO_MIN},
465 {116, 225}, {120, 225},
466 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
467 {132, SAP_TX_LEAKAGE_AUTO_MIN}, {136, SAP_TX_LEAKAGE_AUTO_MIN},
468 {140, SAP_TX_LEAKAGE_AUTO_MIN},
469 {144, SAP_TX_LEAKAGE_MIN}
470 } },
471
472 {128,
473 {{36, 678}, {40, 678},
474 {44, 664}, {48, 664},
475 {52, 651}, {56, 651},
476 {60, 643}, {64, 643},
477 {100, SAP_TX_LEAKAGE_AUTO_MIN}, {104, SAP_TX_LEAKAGE_AUTO_MIN},
478 {108, SAP_TX_LEAKAGE_AUTO_MIN}, {112, SAP_TX_LEAKAGE_AUTO_MIN},
479 {116, 293}, {120, 293},
480 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
481 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
482 {140, SAP_TX_LEAKAGE_AUTO_MIN},
483 {144, SAP_TX_LEAKAGE_MIN}
484 } },
485
486 {132,
487 {{36, 689}, {40, 689},
488 {44, 669}, {48, 669},
489 {52, 662}, {56, 662},
490 {60, 609}, {64, 609},
491 {100, 538}, {104, 538},
492 {108, SAP_TX_LEAKAGE_AUTO_MIN}, {112, SAP_TX_LEAKAGE_AUTO_MIN},
493 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, SAP_TX_LEAKAGE_AUTO_MIN},
494 {124, 247}, {128, 247},
495 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
496 {140, SAP_TX_LEAKAGE_MIN},
497 {144, SAP_TX_LEAKAGE_MIN}
498 } },
499
500 {136,
501 {{36, 703}, {40, 703},
502 {44, 688}, {48, SAP_TX_LEAKAGE_MIN},
503 {52, 671}, {56, 671},
504 {60, 658}, {64, 658},
505 {100, 504}, {104, 504},
506 {108, SAP_TX_LEAKAGE_AUTO_MIN}, {112, SAP_TX_LEAKAGE_AUTO_MIN},
507 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, SAP_TX_LEAKAGE_AUTO_MIN},
508 {124, 289}, {128, 289},
509 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
510 {140, SAP_TX_LEAKAGE_MIN},
511 {144, SAP_TX_LEAKAGE_MIN}
512 } },
513
514 {140,
515 {{36, 695}, {40, 695},
516 {44, 684}, {48, 684},
517 {52, 664}, {56, 664},
518 {60, 658}, {64, 658},
519 {100, 601}, {104, 601},
520 {108, 545}, {112, 545},
521 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, SAP_TX_LEAKAGE_AUTO_MIN},
522 {124, SAP_TX_LEAKAGE_AUTO_MIN}, {128, SAP_TX_LEAKAGE_AUTO_MIN},
523 {132, 262}, {136, 262},
524 {140, SAP_TX_LEAKAGE_MIN},
525 {144, SAP_TX_LEAKAGE_MIN}
526 } },
527
Kai Liue30491f2016-09-28 23:41:13 +0800528 {144,
529 {{36, 695}, {40, 695},
530 {44, 684}, {48, 684},
531 {52, 664}, {56, 664},
532 {60, 658}, {64, 658},
533 {100, 601}, {104, 601},
534 {108, 545}, {112, 545},
535 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, SAP_TX_LEAKAGE_AUTO_MIN},
536 {124, SAP_TX_LEAKAGE_AUTO_MIN}, {128, SAP_TX_LEAKAGE_AUTO_MIN},
537 {132, 262}, {136, 262},
538 {140, SAP_TX_LEAKAGE_MIN},
539 {144, SAP_TX_LEAKAGE_MIN}
540 } },
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800541};
542
543/* channel tx leakage table - ht20 */
544tSapChanMatrixInfo ht20_chan[] = {
545 {52,
546 {{36, SAP_TX_LEAKAGE_AUTO_MIN}, {40, 286},
547 {44, 225}, {48, 121},
548 {52, SAP_TX_LEAKAGE_MIN}, {56, SAP_TX_LEAKAGE_MIN},
549 {60, 300}, {64, SAP_TX_LEAKAGE_AUTO_MIN},
550 {100, 637}, {104, SAP_TX_LEAKAGE_MAX},
551 {108, SAP_TX_LEAKAGE_MAX}, {112, SAP_TX_LEAKAGE_MAX},
552 {116, SAP_TX_LEAKAGE_MAX}, {120, SAP_TX_LEAKAGE_MAX},
553 {124, SAP_TX_LEAKAGE_MAX}, {128, SAP_TX_LEAKAGE_MAX},
554 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
555 {140, SAP_TX_LEAKAGE_MAX},
556 {144, SAP_TX_LEAKAGE_MIN}
557 } },
558
559 {56,
560 {{36, 468}, {40, SAP_TX_LEAKAGE_AUTO_MIN},
561 {44, SAP_TX_LEAKAGE_AUTO_MIN}, {48, 206},
562 {52, SAP_TX_LEAKAGE_MIN}, {56, SAP_TX_LEAKAGE_MIN},
563 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
564 {100, SAP_TX_LEAKAGE_MAX}, {104, SAP_TX_LEAKAGE_MAX},
565 {108, SAP_TX_LEAKAGE_MAX}, {112, SAP_TX_LEAKAGE_MAX},
566 {116, SAP_TX_LEAKAGE_MAX}, {120, SAP_TX_LEAKAGE_MAX},
567 {124, SAP_TX_LEAKAGE_MAX}, {128, SAP_TX_LEAKAGE_MAX},
568 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
569 {140, SAP_TX_LEAKAGE_MAX},
570 {144, SAP_TX_LEAKAGE_MIN}
571 } },
572
573 {60,
574 {{36, 507}, {40, 440},
575 {44, SAP_TX_LEAKAGE_AUTO_MIN}, {48, 313},
576 {52, SAP_TX_LEAKAGE_MIN}, {56, SAP_TX_LEAKAGE_MIN},
577 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
578 {100, SAP_TX_LEAKAGE_MAX}, {104, SAP_TX_LEAKAGE_MAX},
579 {108, SAP_TX_LEAKAGE_MAX}, {112, SAP_TX_LEAKAGE_MAX},
580 {116, SAP_TX_LEAKAGE_MAX}, {120, SAP_TX_LEAKAGE_MAX},
581 {124, SAP_TX_LEAKAGE_MAX}, {128, SAP_TX_LEAKAGE_MAX},
582 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
583 {140, SAP_TX_LEAKAGE_MAX},
584 {144, SAP_TX_LEAKAGE_MIN}
585 } },
586
587 {64,
588 {{36, 516}, {40, 520},
589 {44, 506}, {48, SAP_TX_LEAKAGE_AUTO_MIN},
590 {52, 301}, {56, 258},
591 {60, SAP_TX_LEAKAGE_MIN}, {64, SAP_TX_LEAKAGE_MIN},
592 {100, 620}, {104, 617},
593 {108, SAP_TX_LEAKAGE_MAX}, {112, SAP_TX_LEAKAGE_MAX},
594 {116, SAP_TX_LEAKAGE_MAX}, {120, SAP_TX_LEAKAGE_MAX},
595 {124, SAP_TX_LEAKAGE_MAX}, {128, SAP_TX_LEAKAGE_MAX},
596 {132, SAP_TX_LEAKAGE_MAX}, {136, SAP_TX_LEAKAGE_MAX},
597 {140, SAP_TX_LEAKAGE_MAX},
598 {144, SAP_TX_LEAKAGE_MIN}
599 } },
600
601 {100,
602 {{36, 616}, {40, 601},
603 {44, 604}, {48, 589},
604 {52, 612}, {56, 592},
605 {60, 590}, {64, 582},
606 {100, SAP_TX_LEAKAGE_MIN}, {104, 131},
607 {108, SAP_TX_LEAKAGE_AUTO_MIN}, {112, SAP_TX_LEAKAGE_AUTO_MIN},
608 {116, SAP_TX_LEAKAGE_AUTO_MIN}, {120, 522},
609 {124, 571}, {128, 589},
610 {132, 593}, {136, 598},
611 {140, 594},
612 {144, SAP_TX_LEAKAGE_MIN},
613 } },
614
615 {104,
616 {{36, 622}, {40, 624},
617 {44, 618}, {48, 610},
618 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
619 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
620 {100, SAP_TX_LEAKAGE_MIN}, {104, SAP_TX_LEAKAGE_MIN},
621 {108, SAP_TX_LEAKAGE_MIN}, {112, 463},
622 {116, 483}, {120, 503},
623 {124, 523}, {128, 565},
624 {132, 570}, {136, 588},
625 {140, 585},
626 {144, SAP_TX_LEAKAGE_MIN},
627 } },
628
629 {108,
630 {{36, 620}, {40, 638},
631 {44, 611}, {48, 614},
632 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
633 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
634 {100, 477}, {104, SAP_TX_LEAKAGE_MIN},
635 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
636 {116, 477}, {120, 497},
637 {124, 517}, {128, 537},
638 {132, 557}, {136, 577},
639 {140, 603},
640 {144, SAP_TX_LEAKAGE_MIN},
641 } },
642
643 {112,
644 {{36, 636}, {40, 623},
645 {44, 638}, {48, 628},
646 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
647 {60, SAP_TX_LEAKAGE_MAX}, {64, 606},
648 {100, 501}, {104, 481},
649 {108, SAP_TX_LEAKAGE_MIN}, {112, SAP_TX_LEAKAGE_MIN},
650 {116, SAP_TX_LEAKAGE_MIN}, {120, 481},
651 {124, 501}, {128, 421},
652 {132, 541}, {136, 561},
653 {140, 583},
654 {144, SAP_TX_LEAKAGE_MIN},
655 } },
656
657 {116,
658 {{36, 646}, {40, 648},
659 {44, 633}, {48, 634},
660 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
661 {60, 615}, {64, 594},
662 {100, 575}, {104, 554},
663 {108, 534}, {112, SAP_TX_LEAKAGE_MIN},
664 {116, SAP_TX_LEAKAGE_MIN}, {120, SAP_TX_LEAKAGE_MIN},
665 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
666 {132, 534}, {136, 554},
667 {140, 574},
668 {144, SAP_TX_LEAKAGE_MIN},
669 } },
670
671 {120,
672 {{36, 643}, {40, 649},
673 {44, 654}, {48, 629},
674 {52, SAP_TX_LEAKAGE_MAX}, {56, 621},
675 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
676 {100, 565}, {104, 545},
677 {108, 525}, {112, 505},
678 {116, SAP_TX_LEAKAGE_MIN}, {120, SAP_TX_LEAKAGE_MIN},
679 {124, SAP_TX_LEAKAGE_MIN}, {128, 505},
680 {132, 525}, {136, 545},
681 {140, 565},
682 {144, SAP_TX_LEAKAGE_MIN},
683 } },
684
685 {124,
686 {{36, 638}, {40, 657},
687 {44, 663}, {48, 649},
688 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
689 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
690 {100, 581}, {104, 561},
691 {108, 541}, {112, 521},
692 {116, 499}, {120, SAP_TX_LEAKAGE_MIN},
693 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
694 {132, 499}, {136, 519},
695 {140, 539},
696 {144, SAP_TX_LEAKAGE_MIN}
697 } },
698
699 {128,
700 {{36, 651}, {40, 651},
701 {44, 674}, {48, 640},
702 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
703 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
704 {100, 603}, {104, 560},
705 {108, 540}, {112, 520},
706 {116, 499}, {120, 479},
707 {124, SAP_TX_LEAKAGE_MIN}, {128, SAP_TX_LEAKAGE_MIN},
708 {132, SAP_TX_LEAKAGE_MIN}, {136, 479},
709 {140, 499},
710 {144, SAP_TX_LEAKAGE_MIN}
711 } },
712
713 {132,
714 {{36, 643}, {40, 668},
715 {44, 651}, {48, 657},
716 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
717 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
718 {100, SAP_TX_LEAKAGE_MAX}, {104, 602},
719 {108, 578}, {112, 570},
720 {116, 550}, {120, 530},
721 {124, 510}, {128, SAP_TX_LEAKAGE_MIN},
722 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
723 {140, 490},
724 {144, SAP_TX_LEAKAGE_MIN}
725 } },
726
727 {136,
728 {{36, 654}, {40, 667},
729 {44, 666}, {48, 642},
730 {52, SAP_TX_LEAKAGE_MAX}, {56, SAP_TX_LEAKAGE_MAX},
731 {60, SAP_TX_LEAKAGE_MAX}, {64, SAP_TX_LEAKAGE_MAX},
732 {100, SAP_TX_LEAKAGE_MAX}, {104, SAP_TX_LEAKAGE_MAX},
733 {108, SAP_TX_LEAKAGE_MAX}, {112, 596},
734 {116, 555}, {120, 535},
735 {124, 515}, {128, 495},
736 {132, SAP_TX_LEAKAGE_MIN}, {136, SAP_TX_LEAKAGE_MIN},
737 {140, SAP_TX_LEAKAGE_MIN},
738 {144, SAP_TX_LEAKAGE_MIN}
739 } },
740
741 {140,
742 {{36, 679}, {40, 673},
743 {44, 667}, {48, 656},
744 {52, 634}, {56, 663},
745 {60, 662}, {64, 660},
746 {100, SAP_TX_LEAKAGE_MAX}, {104, SAP_TX_LEAKAGE_MAX},
747 {108, SAP_TX_LEAKAGE_MAX}, {112, 590},
748 {116, 573}, {120, 553},
749 {124, 533}, {128, 513},
750 {132, 490}, {136, SAP_TX_LEAKAGE_MIN},
751 {140, SAP_TX_LEAKAGE_MIN},
752 {144, SAP_TX_LEAKAGE_MIN}
753 } },
Kai Liue30491f2016-09-28 23:41:13 +0800754
755 {144,
756 {{36, 679}, {40, 673},
757 {44, 667}, {48, 656},
758 {52, 634}, {56, 663},
759 {60, 662}, {64, 660},
760 {100, SAP_TX_LEAKAGE_MAX}, {104, SAP_TX_LEAKAGE_MAX},
761 {108, SAP_TX_LEAKAGE_MAX}, {112, 590},
762 {116, 573}, {120, 553},
763 {124, 533}, {128, 513},
764 {132, 490}, {136, SAP_TX_LEAKAGE_MIN},
765 {140, SAP_TX_LEAKAGE_MIN},
766 {144, SAP_TX_LEAKAGE_MIN}
767 } },
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800768};
769#endif /* WLAN_ENABLE_CHNL_MATRIX_RESTRICTION */
770
771/*----------------------------------------------------------------------------
772 * Static Function Declarations and Definitions
773 * -------------------------------------------------------------------------*/
774#ifdef SOFTAP_CHANNEL_RANGE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530775static QDF_STATUS sap_get_channel_list(ptSapContext sapContext,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800776 uint8_t **channelList,
777 uint8_t *numberOfChannels);
778#endif
779
780/*==========================================================================
Kiran Kumar Lokere80897d82016-03-02 19:41:42 -0800781 FUNCTION sap_get_5ghz_channel_list
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800782
783 DESCRIPTION
784 Function for initializing list of 2.4/5 Ghz [NON-DFS/DFS] available
785 channels in the current regulatory domain.
786
787 DEPENDENCIES
788 NA.
789
790 PARAMETERS
791
792 IN
793 sapContext: SAP Context
794
795 RETURN VALUE
796 NA
797
798 SIDE EFFECTS
799 ============================================================================*/
Kiran Kumar Lokere80897d82016-03-02 19:41:42 -0800800static QDF_STATUS sap_get_5ghz_channel_list(ptSapContext sapContext);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800801
802/*==========================================================================
803 FUNCTION sapStopDfsCacTimer
804
805 DESCRIPTION
806 Function to sttop the DFS CAC timer when SAP is stopped
807 DEPENDENCIES
808 NA.
809
810 PARAMETERS
811
812 IN
813 sapContext: SAP Context
814 RETURN VALUE
815 DFS Timer start status
816 SIDE EFFECTS
817 ============================================================================*/
818
819static int sap_stop_dfs_cac_timer(ptSapContext sapContext);
820
821/*==========================================================================
822 FUNCTION sapStartDfsCacTimer
823
824 DESCRIPTION
825 Function to start the DFS CAC timer when SAP is started on DFS Channel
826 DEPENDENCIES
827 NA.
828
829 PARAMETERS
830
831 IN
832 sapContext: SAP Context
833 RETURN VALUE
834 DFS Timer start status
835 SIDE EFFECTS
836 ============================================================================*/
837
838int sap_start_dfs_cac_timer(ptSapContext sapContext);
839
840/** sap_hdd_event_to_string() - convert hdd event to string
841 * @event: eSapHddEvent event type
842 *
843 * This function converts eSapHddEvent into string
844 *
845 * Return: string for the @event.
846 */
847static uint8_t *sap_hdd_event_to_string(eSapHddEvent event)
848{
849 switch (event) {
850 CASE_RETURN_STRING(eSAP_START_BSS_EVENT);
851 CASE_RETURN_STRING(eSAP_STOP_BSS_EVENT);
852 CASE_RETURN_STRING(eSAP_STA_ASSOC_IND);
853 CASE_RETURN_STRING(eSAP_STA_ASSOC_EVENT);
854 CASE_RETURN_STRING(eSAP_STA_REASSOC_EVENT);
855 CASE_RETURN_STRING(eSAP_STA_DISASSOC_EVENT);
856 CASE_RETURN_STRING(eSAP_STA_SET_KEY_EVENT);
857 CASE_RETURN_STRING(eSAP_STA_MIC_FAILURE_EVENT);
858 CASE_RETURN_STRING(eSAP_ASSOC_STA_CALLBACK_EVENT);
859 CASE_RETURN_STRING(eSAP_GET_WPSPBC_SESSION_EVENT);
860 CASE_RETURN_STRING(eSAP_WPS_PBC_PROBE_REQ_EVENT);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800861 CASE_RETURN_STRING(eSAP_REMAIN_CHAN_READY);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800862 CASE_RETURN_STRING(eSAP_DISCONNECT_ALL_P2P_CLIENT);
863 CASE_RETURN_STRING(eSAP_MAC_TRIG_STOP_BSS_EVENT);
864 CASE_RETURN_STRING(eSAP_UNKNOWN_STA_JOIN);
865 CASE_RETURN_STRING(eSAP_MAX_ASSOC_EXCEEDED);
866 CASE_RETURN_STRING(eSAP_CHANNEL_CHANGE_EVENT);
867 CASE_RETURN_STRING(eSAP_DFS_CAC_START);
868 CASE_RETURN_STRING(eSAP_DFS_CAC_END);
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +0530869 CASE_RETURN_STRING(eSAP_DFS_PRE_CAC_END);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800870 CASE_RETURN_STRING(eSAP_DFS_RADAR_DETECT);
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +0530871 CASE_RETURN_STRING(eSAP_DFS_RADAR_DETECT_DURING_PRE_CAC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800872 CASE_RETURN_STRING(eSAP_DFS_NOL_GET);
873 CASE_RETURN_STRING(eSAP_DFS_NOL_SET);
874 CASE_RETURN_STRING(eSAP_DFS_NO_AVAILABLE_CHANNEL);
875#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
876 CASE_RETURN_STRING(eSAP_ACS_SCAN_SUCCESS_EVENT);
877#endif
878 CASE_RETURN_STRING(eSAP_ACS_CHANNEL_SELECTED);
879 default:
880 return "eSAP_HDD_EVENT_UNKNOWN";
881 }
882}
883
884/*----------------------------------------------------------------------------
885 * Externalized Function Definitions
886 * -------------------------------------------------------------------------*/
887
888/*----------------------------------------------------------------------------
889 * Function Declarations and Documentation
890 * -------------------------------------------------------------------------*/
891
892/*==========================================================================
893 FUNCTION sap_event_init
894
895 DESCRIPTION
896 Function for initializing sWLAN_SAPEvent structure
897
898 DEPENDENCIES
899 NA.
900
901 PARAMETERS
902
903 IN
904 sapEvent : State machine event
905
906 RETURN VALUE
907
908 None
909
910 SIDE EFFECTS
911 ============================================================================*/
912static inline void sap_event_init(ptWLAN_SAPEvent sapEvent)
913{
914 sapEvent->event = eSAP_MAC_SCAN_COMPLETE;
915 sapEvent->params = 0;
916 sapEvent->u1 = 0;
917 sapEvent->u2 = 0;
918}
919
920#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
921/*
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -0800922 * sap_find_target_channel_in_channel_matrix() - finds the leakage matrix
923 * @sapContext: Pointer to vos global context structure
924 * @ch_width: target channel width
925 * @NOL_channel: the NOL channel whose leakage matrix is required
926 * @pTarget_chnl_mtrx: pointer to target channel matrix returned.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800927 *
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -0800928 * This function gives the leakage matrix for given NOL channel and ch_width
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800929 *
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -0800930 * Return: TRUE or FALSE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800931 */
Jeff Johnson464f7ea2016-10-07 10:21:26 -0700932static bool
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800933sap_find_target_channel_in_channel_matrix(ptSapContext sapContext,
Kiran Kumar Lokere13644672016-02-29 15:40:10 -0800934 enum phy_ch_width ch_width,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800935 uint8_t NOL_channel,
936 tSapTxLeakInfo **pTarget_chnl_mtrx)
937{
938 tSapTxLeakInfo *target_chan_matrix = NULL;
939 tSapChanMatrixInfo *pchan_matrix = NULL;
940 uint32_t nchan_matrix;
941 int i = 0;
942
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -0800943 switch (ch_width) {
944 case CH_WIDTH_20MHZ:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800945 /* HT20 */
946 pchan_matrix = ht20_chan;
Anurag Chouhan6d760662016-02-20 16:05:43 +0530947 nchan_matrix = QDF_ARRAY_SIZE(ht20_chan);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800948 break;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -0800949 case CH_WIDTH_40MHZ:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800950 /* HT40 */
951 pchan_matrix = ht40_chan;
Anurag Chouhan6d760662016-02-20 16:05:43 +0530952 nchan_matrix = QDF_ARRAY_SIZE(ht40_chan);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800953 break;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -0800954 case CH_WIDTH_80MHZ:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800955 /* HT80 */
956 pchan_matrix = ht80_chan;
Anurag Chouhan6d760662016-02-20 16:05:43 +0530957 nchan_matrix = QDF_ARRAY_SIZE(ht80_chan);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800958 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800959 default:
960 /* handle exception and fall back to HT20 table */
961 pchan_matrix = ht20_chan;
Anurag Chouhan6d760662016-02-20 16:05:43 +0530962 nchan_matrix = QDF_ARRAY_SIZE(ht20_chan);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800963 break;
964 }
965
966 for (i = 0; i < nchan_matrix; i++) {
967 /* find the SAP channel to map the leakage matrix */
968 if (NOL_channel == pchan_matrix[i].channel) {
969 target_chan_matrix = pchan_matrix[i].chan_matrix;
970 break;
971 }
972 }
973
974 if (NULL == target_chan_matrix) {
975 return false;
976 } else {
977 *pTarget_chnl_mtrx = target_chan_matrix;
978 return true;
979 }
980}
981
982/**
Naveen Rawatb3264f02016-03-25 15:06:22 -0700983 * sap_mark_leaking_ch() - to mark channel leaking in to nol
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800984 * @sap_ctx: pointer to SAP context
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -0800985 * @ch_width: channel width
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800986 * @nol: nol info
987 * @temp_ch_lst_sz: the target channel list
988 * @temp_ch_lst: the target channel list
989 *
990 * This function removes the channels from temp channel list that
991 * (if selected as target channel) will cause leakage in one of
992 * the NOL channels
993 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530994 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800995 */
996
Jeff Johnson464f7ea2016-10-07 10:21:26 -0700997static QDF_STATUS
Naveen Rawatb3264f02016-03-25 15:06:22 -0700998sap_mark_leaking_ch(ptSapContext sap_ctx,
Kiran Kumar Lokere13644672016-02-29 15:40:10 -0800999 enum phy_ch_width ch_width,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001000 tSapDfsNolInfo *nol,
1001 uint8_t temp_ch_lst_sz,
1002 uint8_t *temp_ch_lst)
1003{
1004 tSapTxLeakInfo *target_chan_matrix = NULL;
Amar Singhalb8d4f152016-02-10 10:21:43 -08001005 uint32_t num_channel = (CHAN_ENUM_144 - CHAN_ENUM_36) + 1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001006 uint32_t i = 0;
1007 uint32_t j = 0;
1008 uint32_t k = 0;
1009 uint8_t dfs_nol_channel;
Yingying Tangb4832f72016-10-20 13:44:55 +08001010 tHalHandle hal = CDS_GET_HAL_CB(sap_ctx->pvosGCtx);
1011 tpAniSirGlobal mac;
1012
1013 if (NULL == hal) {
1014 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1015 "%s: Invalid hal pointer", __func__);
1016 return QDF_STATUS_E_FAULT;
1017 }
1018
1019 mac = PMAC_STRUCT(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001020
1021
1022 /* traverse target_chan_matrix and */
1023 for (i = 0; i < NUM_5GHZ_CHANNELS ; i++) {
1024 dfs_nol_channel = nol[i].dfs_channel_number;
1025 if (nol[i].radar_status_flag == eSAP_DFS_CHANNEL_USABLE ||
1026 nol[i].radar_status_flag == eSAP_DFS_CHANNEL_AVAILABLE) {
1027 /* not present in NOL */
1028 continue;
1029 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301030 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001031 FL("sapdfs: processing NOL channel: %d"),
1032 dfs_nol_channel);
1033 if (false == sap_find_target_channel_in_channel_matrix(
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001034 sap_ctx, ch_width, dfs_nol_channel,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001035 &target_chan_matrix)) {
1036 /*
1037 * should never happen, we should always find a table
1038 * here, if we don't, need a fix here!
1039 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301040 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001041 FL("Couldn't find target channel matrix!"));
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301042 QDF_ASSERT(0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301043 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001044 }
1045 /*
1046 * following is based on assumption that both temp_ch_lst
1047 * and target channel matrix are in increasing order of
Naveen Rawatb3264f02016-03-25 15:06:22 -07001048 * ch_id
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001049 */
1050 for (j = 0, k = 0; j < temp_ch_lst_sz && k < num_channel;) {
1051 if (temp_ch_lst[j] == 0) {
1052 j++;
1053 continue;
1054 }
1055 if (target_chan_matrix[k].leak_chan != temp_ch_lst[j]) {
1056 k++;
1057 continue;
1058 }
1059 /*
1060 * check leakage from candidate channel
1061 * to NOL channel
1062 */
1063 if (target_chan_matrix[k].leak_lvl <=
Yingying Tangb4832f72016-10-20 13:44:55 +08001064 mac->sap.SapDfsInfo.tx_leakage_threshold) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001065 /*
1066 * candidate channel will have
1067 * bad leakage in NOL channel,
1068 * remove from temp list
1069 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301070 QDF_TRACE(QDF_MODULE_ID_SAP,
1071 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001072 FL("sapdfs: channel: %d will have bad leakage due to channel: %d\n"),
1073 dfs_nol_channel, temp_ch_lst[j]);
1074 temp_ch_lst[j] = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001075 }
1076 j++;
1077 k++;
1078 }
1079 } /* end of loop that selects each NOL */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301080 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001081}
1082#endif /* end of WLAN_ENABLE_CHNL_MATRIX_RESTRICTION */
1083
1084/*
1085 * This function adds availabe channel to bitmap
1086 *
1087 * PARAMETERS
1088 * IN
1089 * pBitmap: bitmap to populate
1090 * channel: channel to set in bitmap
1091 */
1092static void sap_set_bitmap(chan_bonding_bitmap *pBitmap, uint8_t channel)
1093{
1094 int i = 0;
1095 int start_channel = 0;
1096 for (i = 0; i < MAX_80MHZ_BANDS; i++) {
1097 start_channel = pBitmap->chanBondingSet[i].startChannel;
1098 if (channel >= start_channel && channel <= start_channel + 12) {
1099 pBitmap->chanBondingSet[i].channelMap |=
1100 1 << ((channel - start_channel) / 4);
1101 return;
1102 }
1103 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301104 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001105 FL("Channel=%d is not in the bitmap"), channel);
1106}
1107
1108/**
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001109 * sap_populate_available_channels() - To populate available channel
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001110 * @bitmap: bitmap to populate
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001111 * @ch_width: channel width
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001112 * @avail_chnl: available channel list to populate
1113 *
1114 * This function reads the bitmap and populates available channel
1115 * list according to channel bonding mode. This will be called for
1116 * 80 MHz and 40 Mhz only. For 20 MHz no need for bitmap hence list
1117 * is directly created while parsing the main list
1118 *
1119 * Return: number of channels found
1120 */
1121static uint8_t sap_populate_available_channels(chan_bonding_bitmap *bitmap,
Kiran Kumar Lokere13644672016-02-29 15:40:10 -08001122 enum phy_ch_width ch_width,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001123 uint8_t *avail_chnl)
1124{
1125 uint8_t i = 0;
1126 uint8_t chnl_count = 0;
1127 uint8_t start_channel = 0;
1128
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001129 switch (ch_width) {
1130 /* VHT80 */
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001131 case CH_WIDTH_160MHZ:
1132 case CH_WIDTH_80P80MHZ:
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001133 case CH_WIDTH_80MHZ:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001134 for (i = 0; i < MAX_80MHZ_BANDS; i++) {
1135 start_channel = bitmap->chanBondingSet[i].startChannel;
1136 if (bitmap->chanBondingSet[i].channelMap ==
1137 SAP_80MHZ_MASK) {
1138 avail_chnl[chnl_count++] = start_channel;
1139 avail_chnl[chnl_count++] = start_channel + 4;
1140 avail_chnl[chnl_count++] = start_channel + 8;
1141 avail_chnl[chnl_count++] = start_channel + 12;
1142 }
1143 }
1144 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001145 /* HT40 */
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -08001146 case CH_WIDTH_40MHZ:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001147 for (i = 0; i < MAX_80MHZ_BANDS; i++) {
1148 start_channel = bitmap->chanBondingSet[i].startChannel;
1149 if ((bitmap->chanBondingSet[i].channelMap &
1150 SAP_40MHZ_MASK_L) == SAP_40MHZ_MASK_L) {
1151 avail_chnl[chnl_count++] = start_channel;
1152 avail_chnl[chnl_count++] = start_channel + 4;
Naveen Rawatb3264f02016-03-25 15:06:22 -07001153 }
1154 if ((bitmap->chanBondingSet[i].channelMap &
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001155 SAP_40MHZ_MASK_H) == SAP_40MHZ_MASK_H) {
1156 avail_chnl[chnl_count++] = start_channel + 8;
1157 avail_chnl[chnl_count++] = start_channel + 12;
1158 }
1159 }
1160 break;
1161 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301162 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001163 FL("Invalid case."));
1164 break;
1165 }
1166
1167 return chnl_count;
1168}
1169
1170/*
1171 * FUNCTION sap_dfs_is_w53_invalid
1172 *
1173 * DESCRIPTION Checks if the passed channel is W53 and returns if
1174 * SAP W53 opearation is allowed.
1175 *
1176 * DEPENDENCIES PARAMETERS
1177 * IN hHAL : HAL pointer
1178 * channelID: Channel Number to be verified
1179 *
1180 * RETURN VALUE : bool
1181 * true: If W53 operation is disabled
1182 * false: If W53 operation is enabled
1183 *
1184 * SIDE EFFECTS
1185 */
1186bool sap_dfs_is_w53_invalid(tHalHandle hHal, uint8_t channelID)
1187{
1188 tpAniSirGlobal pMac;
1189
1190 pMac = PMAC_STRUCT(hHal);
1191 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301192 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001193 FL("invalid pMac"));
1194 return false;
1195 }
1196
1197 /*
1198 * Check for JAPAN W53 Channel operation capability
1199 */
1200 if (true == pMac->sap.SapDfsInfo.is_dfs_w53_disabled &&
1201 true == IS_CHAN_JAPAN_W53(channelID)) {
1202 return true;
1203 }
1204
1205 return false;
1206}
1207
1208/*
1209 * FUNCTION sap_dfs_is_channel_in_preferred_location
1210 *
1211 * DESCRIPTION Checks if the passed channel is in accordance with preferred
1212 * Channel location settings.
1213 *
1214 * DEPENDENCIES PARAMETERS
1215 * IN hHAL : HAL pointer
1216 * channelID: Channel Number to be verified
1217 *
1218 * RETURN VALUE :bool
1219 * true:If Channel location is same as the preferred location
1220 * false:If Channel location is not same as the preferred location
1221 *
1222 * SIDE EFFECTS
1223 */
1224bool sap_dfs_is_channel_in_preferred_location(tHalHandle hHal, uint8_t channelID)
1225{
1226 tpAniSirGlobal pMac;
1227
1228 pMac = PMAC_STRUCT(hHal);
1229 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301230 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001231 FL("invalid pMac"));
1232 return true;
1233 }
1234 if ((SAP_CHAN_PREFERRED_INDOOR ==
1235 pMac->sap.SapDfsInfo.sap_operating_chan_preferred_location) &&
1236 (true == IS_CHAN_JAPAN_OUTDOOR(channelID))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301237 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001238 FL
1239 ("CHAN=%d is Outdoor so invalid,preferred Indoor only"),
1240 channelID);
1241 return false;
1242 } else if ((SAP_CHAN_PREFERRED_OUTDOOR ==
1243 pMac->sap.SapDfsInfo.sap_operating_chan_preferred_location)
1244 && (true == IS_CHAN_JAPAN_INDOOR(channelID))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301245 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001246 FL
1247 ("CHAN=%d is Indoor so invalid,preferred Outdoor only"),
1248 channelID);
1249 return false;
1250 }
1251
1252 return true;
1253}
1254
1255#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
1256/**
1257 * sap_check_in_avoid_ch_list() - checks if given channel present is channel
1258 * avoidance list
1259 *
1260 * @sap_ctx: sap context.
1261 * @channel: channel to be checked in sap_ctx's avoid ch list
1262 *
1263 * sap_ctx contains sap_avoid_ch_info strcut containing the list of channels on
1264 * which MDM device's AP with MCC was detected. This function checks if given
1265 * channel is present in that list.
1266 *
1267 * Return: true, if channel was present, false othersie.
1268 */
1269bool sap_check_in_avoid_ch_list(ptSapContext sap_ctx, uint8_t channel)
1270{
1271 uint8_t i = 0;
1272 struct sap_avoid_channels_info *ie_info =
1273 &sap_ctx->sap_detected_avoid_ch_ie;
1274 for (i = 0; i < sizeof(ie_info->channels); i++)
1275 if (ie_info->channels[i] == channel)
1276 return true;
1277 return false;
1278}
1279#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
1280
Naveen Rawatb3264f02016-03-25 15:06:22 -07001281/**
1282 * sap_apply_rules() - validates channels in sap_ctx channel list
1283 * @sap_ctx: sap context pointer
1284 *
1285 * This function takes the channel list in sap_ctx and marks invalid channel
1286 * based on following rules:
1287 * -> invalid due to different reg domain dfs channel list
1288 * -> already present in NOL
1289 * -> outside ACS range or not
1290 * -> not usable due to another SAP operating MCC mode in same channel
1291 * -> preferred location is indoors or outdoors
1292 *
1293 * Return: number of valid channels after applying all the rules
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001294 */
Naveen Rawatb3264f02016-03-25 15:06:22 -07001295static uint8_t sap_apply_rules(ptSapContext sap_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001296{
Amar Singhal604ba6cf2016-07-27 15:29:51 -07001297 uint8_t num_valid_ch, i = 0, ch_id;
Naveen Rawatb3264f02016-03-25 15:06:22 -07001298 tAll5GChannelList *sap_all_ch = &sap_ctx->SapAllChnlList;
1299 bool is_ch_nol = false;
1300 bool is_out_of_range = false;
1301 tpAniSirGlobal mac_ctx;
1302 tHalHandle hal = CDS_GET_HAL_CB(sap_ctx->p_cds_gctx);
1303 uint8_t preferred_location;
Amar Singhal604ba6cf2016-07-27 15:29:51 -07001304 enum dfs_region dfs_region;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001305
Naveen Rawatb3264f02016-03-25 15:06:22 -07001306 if (NULL == hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301307 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Naveen Rawatb3264f02016-03-25 15:06:22 -07001308 FL("hal pointer NULL"));
1309 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001310 }
1311
Naveen Rawatb3264f02016-03-25 15:06:22 -07001312 mac_ctx = PMAC_STRUCT(hal);
1313 if (NULL == mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301314 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Naveen Rawatb3264f02016-03-25 15:06:22 -07001315 FL("mac_ctx pointer NULL"));
1316 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001317 }
1318
Naveen Rawatb3264f02016-03-25 15:06:22 -07001319 preferred_location =
1320 mac_ctx->sap.SapDfsInfo.sap_operating_chan_preferred_location;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001321 cds_get_dfs_region(&dfs_region);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001322 /* loop to check ACS range or NOL channels */
Naveen Rawatb3264f02016-03-25 15:06:22 -07001323 num_valid_ch = sap_all_ch->numChannel;
1324 for (i = 0; i < sap_all_ch->numChannel; i++) {
1325 ch_id = sap_all_ch->channelList[i].channel;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001326
1327 /*
Amar Singhala7bb01b2016-01-27 11:31:59 -08001328 * IN MKK DFS REGION CHECK IF THE FOLLOWING TWO
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001329 * TWO RULES APPLY AND FILTER THE AVAILABLE CHANNELS
1330 * ACCORDINGLY.
1331 *
1332 * 1. If we are operating in Japan regulatory domain
1333 * Check if Japan W53 Channel operation is NOT
1334 * allowed and if its not allowed then mark all the
1335 * W53 channels as Invalid.
1336 *
1337 * 2. If we are operating in Japan regulatory domain
1338 * Check if channel switch between Indoor/Outdoor
1339 * is allowed. If it is not allowed then limit
1340 * the avaiable channels to Indoor or Outdoor
1341 * channels only based up on the SAP Channel location
1342 * indicated by "sap_operating_channel_location" param.
1343 */
Amar Singhala7bb01b2016-01-27 11:31:59 -08001344 if (DFS_MKK_REGION == dfs_region) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001345 /*
1346 * Check for JAPAN W53 Channel operation capability
1347 */
Naveen Rawatb3264f02016-03-25 15:06:22 -07001348 if (true == sap_dfs_is_w53_invalid(hal, ch_id)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301349 QDF_TRACE(QDF_MODULE_ID_SAP,
1350 QDF_TRACE_LEVEL_INFO_LOW,
Naveen Rawatb3264f02016-03-25 15:06:22 -07001351 FL("index:%d, Channel=%d Invalid,Japan W53 Disabled"),
1352 i, ch_id);
1353 sap_all_ch->channelList[i].valid = false;
1354 num_valid_ch--;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001355 continue;
1356 }
1357
1358 /*
1359 * If SAP's preferred channel location is Indoor
1360 * then set all the outdoor channels in the domain
1361 * to invalid.If the preferred channel location is
1362 * outdoor then set all the Indoor channels in the
1363 * domain to Invalid.
1364 */
1365 if (false ==
Naveen Rawatb3264f02016-03-25 15:06:22 -07001366 sap_dfs_is_channel_in_preferred_location(hal,
1367 ch_id)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301368 QDF_TRACE(QDF_MODULE_ID_SAP,
1369 QDF_TRACE_LEVEL_INFO_LOW,
Naveen Rawatb3264f02016-03-25 15:06:22 -07001370 FL("CHAN=%d is invalid,preferred Channel Location %d Only"),
1371 ch_id, preferred_location);
1372 sap_all_ch->channelList[i].valid = false;
1373 num_valid_ch--;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001374 continue;
1375 }
1376 }
1377
Naveen Rawatb3264f02016-03-25 15:06:22 -07001378 if (cds_get_channel_state(ch_id) == CHANNEL_STATE_DFS) {
1379 is_ch_nol = sap_dfs_is_channel_in_nol_list(sap_ctx,
1380 ch_id, PHY_SINGLE_CHANNEL_CENTERED);
1381 if (true == is_ch_nol) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001382 /*
1383 * Mark this channel invalid since it is still
1384 * in DFS Non-Occupancy-Period which is 30 mins.
1385 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301386 QDF_TRACE(QDF_MODULE_ID_SAP,
1387 QDF_TRACE_LEVEL_INFO_LOW,
Naveen Rawatb3264f02016-03-25 15:06:22 -07001388 FL("index: %d, Channel = %d Present in NOL LIST"),
1389 i, ch_id);
1390 sap_all_ch->channelList[i].valid = false;
1391 num_valid_ch--;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001392 continue;
1393 }
1394 }
1395
1396#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
1397 /* avoid ch on which another MDM AP in MCC mode is detected */
Naveen Rawatb3264f02016-03-25 15:06:22 -07001398 if (mac_ctx->sap.sap_channel_avoidance
1399 && sap_ctx->sap_detected_avoid_ch_ie.present) {
1400 if (sap_check_in_avoid_ch_list(sap_ctx, ch_id)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301401 QDF_TRACE(QDF_MODULE_ID_SAP,
1402 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001403 FL("index: %d, Channel = %d, avoided due to presence of another AP+AP MCC device in same channel."),
Naveen Rawatb3264f02016-03-25 15:06:22 -07001404 i, ch_id);
1405 sap_all_ch->channelList[i].valid = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001406 }
1407 }
1408#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
1409
1410 /* check if the channel is within ACS channel range */
Naveen Rawatb3264f02016-03-25 15:06:22 -07001411 is_out_of_range = sap_acs_channel_check(sap_ctx, ch_id);
1412 if (true == is_out_of_range) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001413 /*
1414 * mark this channel invalid since it is out of ACS
1415 * channel range
1416 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301417 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Naveen Rawatb3264f02016-03-25 15:06:22 -07001418 FL("index: %d, Channel = %d out of ACS channel range"),
1419 i, ch_id);
1420 sap_all_ch->channelList[i].valid = false;
1421 num_valid_ch--;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001422 continue;
1423 }
1424 } /* end of check for NOL or ACS channels */
Naveen Rawatb3264f02016-03-25 15:06:22 -07001425 return num_valid_ch;
1426}
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001427
Naveen Rawatb3264f02016-03-25 15:06:22 -07001428/**
1429 * select_rand_from_lst() - selects random channel from given list
1430 * @mac_ctx: mac context pointer
1431 * @ch_lst: channel list
1432 * @num_ch: number of channels
1433 *
1434 * Return: new target channel randomly selected
1435 */
1436static uint8_t select_rand_from_lst(tpAniSirGlobal mac_ctx, uint8_t *ch_lst,
1437 uint8_t num_ch)
1438{
1439 uint32_t rand_byte = 0;
1440 uint8_t i, target_channel, non_dfs_num_ch = 0, dfs_num_ch = 0;
1441 uint8_t dfs_ch[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0};
1442 uint8_t non_dfs_ch[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0};
1443 if (num_ch) {
1444 for (i = 0; i < num_ch; i++) {
1445 if (CDS_IS_DFS_CH(ch_lst[i]))
1446 dfs_ch[dfs_num_ch++] = ch_lst[i];
1447 else
1448 non_dfs_ch[non_dfs_num_ch++] = ch_lst[i];
1449 }
1450 } else {
1451 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
1452 FL("No target channel found"));
1453 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001454 }
1455
Naveen Rawatb3264f02016-03-25 15:06:22 -07001456 cds_rand_get_bytes(0, (uint8_t *)&rand_byte, 1);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001457
Naveen Rawatb3264f02016-03-25 15:06:22 -07001458 /* Give preference to non-DFS channel */
1459 if (!mac_ctx->f_prefer_non_dfs_on_radar) {
1460 i = (rand_byte + qdf_mc_timer_get_system_ticks()) % num_ch;
1461 target_channel = ch_lst[i];
1462 } else if (non_dfs_num_ch) {
1463 i = (rand_byte + qdf_mc_timer_get_system_ticks()) %
1464 non_dfs_num_ch;
1465 target_channel = non_dfs_ch[i];
1466 } else {
1467 i = (rand_byte + qdf_mc_timer_get_system_ticks()) % dfs_num_ch;
1468 target_channel = dfs_ch[i];
1469 }
1470
1471 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
1472 FL("sapdfs: New Channel width = %d"),
1473 mac_ctx->sap.SapDfsInfo.new_chanWidth);
1474 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
1475 FL("sapdfs: target_channel = %d"), target_channel);
1476
1477 return target_channel;
1478}
1479
1480/**
1481 * sap_find_ch_wh_fallback() - find given channel width from given list of
1482 * channels
1483 * @mac_ctx: mac context pointer
1484 * @ch_wd: channel width to find
1485 * @ch_lst: list of channels
1486 * @num_ch: number of channels
1487 *
1488 * This function tries to find given channel width and returns new target ch.
1489 * If not found updates ch_wd to next lower channel width.
1490 *
1491 * Return: new target channel if successful, 0 otherwise
1492 */
1493static uint8_t sap_find_ch_wh_fallback(tpAniSirGlobal mac_ctx,
1494 enum phy_ch_width *ch_wd,
1495 uint8_t *ch_lst,
1496 uint8_t num_ch)
1497{
1498 bool flag = false;
1499 uint32_t rand_byte = 0;
1500 chan_bonding_bitmap ch_map = { { {0} } };
1501 uint8_t count = 0, i, index = 0, final_cnt = 0, target_channel = 0;
1502 uint8_t primary_seg_start_ch = 0, sec_seg_ch = 0, new_160_start_ch = 0;
1503 uint8_t final_lst[WNI_CFG_VALID_CHANNEL_LIST_LEN] = {0};
1504
1505 /* initialize ch_map for all 80 MHz bands: we have 6 80MHz bands */
1506 ch_map.chanBondingSet[0].startChannel = 36;
1507 ch_map.chanBondingSet[1].startChannel = 52;
1508 ch_map.chanBondingSet[2].startChannel = 100;
1509 ch_map.chanBondingSet[3].startChannel = 116;
1510 ch_map.chanBondingSet[4].startChannel = 132;
1511 ch_map.chanBondingSet[5].startChannel = 149;
1512
1513 /* now loop through leakage free list */
1514 for (i = 0; i < num_ch; i++) {
1515 /* add tmp ch to bitmap */
1516 if (ch_lst[i] == 0)
1517 continue;
1518
1519 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
1520 FL("sapdfs: Channel=%d added to bitmap"),
1521 ch_lst[i]);
1522 sap_set_bitmap(&ch_map, ch_lst[i]);
1523 }
1524
1525 /* populate available channel list from bitmap */
1526 final_cnt = sap_populate_available_channels(&ch_map, *ch_wd, final_lst);
1527 /* If no valid ch bonding found, fallback */
1528 if (final_cnt == 0) {
1529 if ((*ch_wd == CH_WIDTH_160MHZ) ||
1530 (*ch_wd == CH_WIDTH_80P80MHZ) ||
1531 (*ch_wd == CH_WIDTH_80MHZ)) {
1532 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN,
1533 FL("sapdfs:Changing chanWidth from [%d] to 40Mhz"),
1534 *ch_wd);
1535 *ch_wd = CH_WIDTH_40MHZ;
1536 } else if (*ch_wd == CH_WIDTH_40MHZ) {
1537 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN,
1538 FL("sapdfs:No 40MHz cb found, falling to 20MHz"));
1539 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN,
1540 FL("sapdfs:Changing chanWidth from [%d] to [%d]"),
1541 *ch_wd, CH_WIDTH_20MHZ);
1542 *ch_wd = CH_WIDTH_20MHZ;
1543 }
1544 return 0;
1545 }
1546
1547 /* ch count should be > 8 to switch new channel in 160Mhz band */
1548 if (((*ch_wd == CH_WIDTH_160MHZ) || (*ch_wd == CH_WIDTH_80P80MHZ)) &&
1549 (final_cnt < SIR_DFS_MAX_20M_SUB_CH)) {
1550 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN,
1551 FL("sapdfs:Changing chanWidth from [%d] to [%d]"),
1552 *ch_wd, CH_WIDTH_80MHZ);
1553 *ch_wd = CH_WIDTH_80MHZ;
1554 return 0;
1555 }
1556 if (*ch_wd == CH_WIDTH_160MHZ) {
1557 /*
1558 * NA supports only 2 blocks for 160Mhz bandwidth i.e 36-64 &
1559 * 100-128 and all the channels in these blocks are continuous
1560 * and seperated by 4Mhz.
1561 */
1562 for (i = 1; ((i < final_cnt)); i++) {
1563 if ((final_lst[i] - final_lst[i-1]) == 4)
1564 count++;
1565 else
1566 count = 0;
1567 if (count == SIR_DFS_MAX_20M_SUB_CH - 1) {
1568 flag = true;
1569 new_160_start_ch = final_lst[i-7];
1570 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001571 }
1572 }
Naveen Rawatb3264f02016-03-25 15:06:22 -07001573 } else if (*ch_wd == CH_WIDTH_80P80MHZ) {
1574 flag = true;
1575 }
1576 if ((flag == false) && (*ch_wd > CH_WIDTH_80MHZ)) {
1577 *ch_wd = CH_WIDTH_80MHZ;
1578 return 0;
1579 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001580
Naveen Rawatb3264f02016-03-25 15:06:22 -07001581 if (*ch_wd == CH_WIDTH_160MHZ) {
1582 cds_rand_get_bytes(0, (uint8_t *)&rand_byte, 1);
1583 rand_byte = (rand_byte + qdf_mc_timer_get_system_ticks())
1584 % SIR_DFS_MAX_20M_SUB_CH;
1585 target_channel = new_160_start_ch + (rand_byte * 4);
1586 } else if (*ch_wd == CH_WIDTH_80P80MHZ) {
1587 cds_rand_get_bytes(0, (uint8_t *)&rand_byte, 1);
1588 index = (rand_byte + qdf_mc_timer_get_system_ticks()) %
1589 final_cnt;
1590 target_channel = final_lst[index];
1591 index -= (index % 4);
1592 primary_seg_start_ch = final_lst[index];
1593
1594 /* reset channels associate with primary 80Mhz */
1595 for (i = 0; i < 4; i++)
1596 final_lst[i + index] = 0;
1597 /* select and calculate center freq for secondary segement */
1598 for (i = 0; i < final_cnt / 4; i++) {
1599 if (final_lst[i * 4] &&
1600 (abs(primary_seg_start_ch - final_lst[i * 4]) >
1601 (SIR_DFS_MAX_20M_SUB_CH * 2))) {
1602 sec_seg_ch = final_lst[i * 4] +
1603 SIR_80MHZ_START_CENTER_CH_DIFF;
1604 break;
1605 }
1606 }
1607 if (!sec_seg_ch && (final_cnt == SIR_DFS_MAX_20M_SUB_CH))
1608 *ch_wd = CH_WIDTH_160MHZ;
1609 else if (!sec_seg_ch)
1610 *ch_wd = CH_WIDTH_80MHZ;
1611
1612 mac_ctx->sap.SapDfsInfo.new_ch_params.center_freq_seg1
1613 = sec_seg_ch;
1614
1615 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
1616 FL("sapdfs: New Center Freq Seg1 = %d"), sec_seg_ch);
1617 } else {
1618 target_channel = select_rand_from_lst(mac_ctx, final_lst,
1619 final_cnt);
1620 }
1621 return target_channel;
1622}
1623
1624/**
1625 * sap_random_channel_sel() - This function randomly pick up an available
1626 * channel
1627 * @sap_ctx: sap context.
1628 *
1629 * This function first eliminates invalid channel, then selects random channel
1630 * using following algorithm:
1631 * PASS: 1 - invalidate ch in sap_ctx->all_ch_lst as per rules
1632 * PASS: 2 - now mark channels that will leak into NOL
1633 * PASS: 3 - from leakage_adjusted_lst, either select random channel (for 20MHz)
1634 * or find given channel width possible. if not found fallback to
1635 * lower channel width and try again. once given channel width found
1636 * use random channel from give possibilities.
1637 * Return: channel number picked
1638 */
1639static uint8_t sap_random_channel_sel(ptSapContext sap_ctx)
1640{
1641 uint8_t j = 0, i = 0, final_cnt = 0, target_channel = 0;
1642 /* count and ch list after applying all rules */
1643 uint8_t rule_adjusted_cnt, *rule_adjusted_lst;
1644 /* ch list after invalidating channels leaking into NOL */
1645 uint8_t *leakage_adjusted_lst;
1646 /* final list of channel from which random channel will be selected */
Arif Hussain16f1dae2016-10-25 18:34:21 -07001647 uint8_t final_lst[QDF_MAX_NUM_CHAN] = {0};
Naveen Rawatb3264f02016-03-25 15:06:22 -07001648 tAll5GChannelList *all_ch = &sap_ctx->SapAllChnlList;
1649 tHalHandle hal = CDS_GET_HAL_CB(sap_ctx->p_cds_gctx);
1650 tpAniSirGlobal mac_ctx;
1651 /* channel width for current iteration */
1652 enum phy_ch_width ch_wd;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001653#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
Naveen Rawatb3264f02016-03-25 15:06:22 -07001654 tSapDfsNolInfo *nol;
1655#endif
1656
1657 if (NULL == hal) {
1658 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1659 FL("invalid hal"));
1660 return 0;
1661 }
1662
1663 mac_ctx = PMAC_STRUCT(hal);
1664 if (NULL == mac_ctx) {
1665 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1666 FL("invalid mac_ctx"));
1667 return 0;
1668 }
1669
1670 /*
1671 * Retrieve the original one and store it.
1672 * use the stored original value when you call this function next time
1673 * so fall back mechanism always starts with original ini value.
1674 */
1675 if (mac_ctx->sap.SapDfsInfo.orig_chanWidth == 0) {
1676 ch_wd = sap_ctx->ch_width_orig;
1677 mac_ctx->sap.SapDfsInfo.orig_chanWidth = ch_wd;
1678 } else {
1679 ch_wd = mac_ctx->sap.SapDfsInfo.orig_chanWidth;
1680 }
1681
1682 if (sap_get_5ghz_channel_list(sap_ctx)) {
1683 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
1684 FL("Getting 5Ghz channel list failed"));
1685 return 0;
1686 }
1687
1688 /* PASS: 1 - invalidate ch in sap_ctx->all_ch_lst as per rules */
1689 rule_adjusted_cnt = sap_apply_rules(sap_ctx);
1690 if (0 == rule_adjusted_cnt) {
1691 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1692 FL("No channels left after applying rules."));
1693 return 0;
1694 }
1695
1696 /* this is list we get after applying all rules */
1697 rule_adjusted_lst = qdf_mem_malloc(rule_adjusted_cnt);
1698
1699 /* list adjusted after leakage has been marked */
1700 leakage_adjusted_lst = qdf_mem_malloc(rule_adjusted_cnt);
1701 if (rule_adjusted_lst == NULL || leakage_adjusted_lst == NULL) {
1702 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1703 FL("sapdfs: memory alloc failed"));
1704 qdf_mem_free(rule_adjusted_lst);
1705 qdf_mem_free(leakage_adjusted_lst);
1706 return 0;
1707 }
1708
1709 /* copy valid ch from sap_ctx->all_ch_lst into rule_adjusted_lst */
1710 for (i = 0, j = 0; i < all_ch->numChannel; i++) {
1711 if (!all_ch->channelList[i].valid)
1712 continue;
1713 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
1714 FL("sapdfs: Adding Channel = %d to temp List"),
1715 all_ch->channelList[i].channel);
1716 rule_adjusted_lst[j++] = all_ch->channelList[i].channel;
1717 }
1718
1719 /*
1720 * do - while loop for fallback mechanism. at each channel width this
1721 * will try to find channel bonding, if not fall back to lower ch width
1722 */
1723 do {
1724 /* save rules adjusted lst */
1725 qdf_mem_copy(leakage_adjusted_lst, rule_adjusted_lst,
1726 rule_adjusted_cnt);
1727#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
1728 nol = mac_ctx->sap.SapDfsInfo.sapDfsChannelNolList;
1729 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1730 FL("sapdfs: Processing tmp ch list against NOL."));
1731 /* PASS: 2 - now mark channels that will leak into NOL */
1732 if (sap_mark_leaking_ch(sap_ctx, ch_wd, nol, rule_adjusted_cnt,
1733 leakage_adjusted_lst) != QDF_STATUS_SUCCESS) {
1734 qdf_mem_free(rule_adjusted_lst);
1735 qdf_mem_free(leakage_adjusted_lst);
1736 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001737 }
1738#endif
Naveen Rawatb3264f02016-03-25 15:06:22 -07001739 if (ch_wd == CH_WIDTH_20MHZ) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001740 /*
Naveen Rawatb3264f02016-03-25 15:06:22 -07001741 * PASS: 3 - from leakage_adjusted_lst, prepare valid
1742 * ch list and use random number from that
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001743 */
Naveen Rawatb3264f02016-03-25 15:06:22 -07001744 for (i = 0; i < rule_adjusted_cnt; i++) {
1745 if (leakage_adjusted_lst[i] == 0)
1746 continue;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301747 QDF_TRACE(QDF_MODULE_ID_SAP,
1748 QDF_TRACE_LEVEL_DEBUG,
Naveen Rawatb3264f02016-03-25 15:06:22 -07001749 FL("sapdfs: Channel=%d added to available list"),
1750 leakage_adjusted_lst[i]);
1751 final_lst[final_cnt] = leakage_adjusted_lst[i];
1752 final_cnt++;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001753 }
Naveen Rawatb3264f02016-03-25 15:06:22 -07001754 target_channel = select_rand_from_lst(mac_ctx,
1755 final_lst, final_cnt);
1756 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001757 }
1758
1759 /*
Naveen Rawatb3264f02016-03-25 15:06:22 -07001760 * PASS: 3 - following function will check from valid channels
1761 * left if given ch_wd can be supported. if not reduce ch_wd
1762 * (fallback), then continue with reduced ch_wd
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001763 */
Naveen Rawatb3264f02016-03-25 15:06:22 -07001764 target_channel = sap_find_ch_wh_fallback(mac_ctx, &ch_wd,
1765 leakage_adjusted_lst,
1766 rule_adjusted_cnt);
1767 /*
1768 * if target channel is 0, no channel bonding was found
1769 * ch_wd would have been updated for fallback
1770 */
1771 if (0 == target_channel)
1772 continue;
1773 else
1774 break;
1775 } while (true);
Sandeep Puligilla2111d3c2016-02-03 01:46:15 -08001776
Arif Hussain9dc47d32016-09-02 17:06:45 -07001777 if (target_channel) {
Naveen Rawatb3264f02016-03-25 15:06:22 -07001778 mac_ctx->sap.SapDfsInfo.new_chanWidth = ch_wd;
Arif Hussain9dc47d32016-09-02 17:06:45 -07001779 mac_ctx->sap.SapDfsInfo.new_ch_params.ch_width = ch_wd;
1780 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001781
Naveen Rawatb3264f02016-03-25 15:06:22 -07001782 qdf_mem_free(rule_adjusted_lst);
1783 qdf_mem_free(leakage_adjusted_lst);
1784 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
1785 FL("sapdfs: New Channel width = %d"),
1786 mac_ctx->sap.SapDfsInfo.new_chanWidth);
1787 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
1788 FL("sapdfs: target_channel = %d"),
1789 target_channel);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001790 return target_channel;
1791}
1792
1793bool sap_acs_channel_check(ptSapContext sapContext, uint8_t channelNumber)
1794{
1795 int i = 0;
1796 if (!sapContext->acs_cfg->acs_mode)
1797 return false;
1798
Arif Hussaina34700c2016-08-17 18:16:10 -07001799 if ((channelNumber >= sapContext->acs_cfg->start_ch) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001800 (channelNumber <= sapContext->acs_cfg->end_ch)) {
1801 if (!sapContext->acs_cfg->ch_list) {
1802 return false;
1803 } else {
1804 for (i = 0; i < sapContext->acs_cfg->ch_list_count; i++)
1805 if (channelNumber ==
1806 sapContext->acs_cfg->ch_list[i])
1807 return false;
1808 }
1809 }
1810 return true;
1811}
1812
1813/**
1814 * sap_mark_dfs_channels() - to mark dfs channel
1815 * @sapContext: pointer sap context
1816 * @channels: list of channels
1817 * @numChannels: number of channels
1818 * @time: time
1819 *
1820 * Mark the channels in NOL with time and eSAP_DFS_CHANNEL_UNAVAILABLE
1821 *
1822 * Return: none
1823 */
Jeff Johnson464f7ea2016-10-07 10:21:26 -07001824static void sap_mark_dfs_channels(ptSapContext sapContext, uint8_t *channels,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001825 uint8_t numChannels, uint64_t time)
1826{
1827 int i, j;
1828 tSapDfsNolInfo *psapDfsChannelNolList = NULL;
1829 uint8_t nRegDomainDfsChannels;
1830 tHalHandle hHal;
1831 tpAniSirGlobal pMac;
Yingying Tangaca4a222016-09-29 17:19:38 +08001832 uint64_t time_elapsed_since_last_radar;
1833 uint64_t time_when_radar_found;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001834
1835 hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
1836 if (NULL == channels)
1837 return;
1838 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301839 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001840 FL("invalid hHal"));
1841 return;
1842 }
1843 pMac = PMAC_STRUCT(hHal);
1844 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301845 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001846 FL("invalid pMac"));
1847 return;
1848 }
1849
1850 /*
1851 * Mark the current channel on which Radar is found
1852 * in the NOL list as eSAP_DFS_CHANNEL_UNAVAILABLE.
1853 */
1854 psapDfsChannelNolList = pMac->sap.SapDfsInfo.sapDfsChannelNolList;
1855 nRegDomainDfsChannels =
1856 pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels;
1857
1858 for (i = 0; i < numChannels; i++) {
1859 for (j = 0; j <= nRegDomainDfsChannels; j++) {
1860 if (!(psapDfsChannelNolList[j].dfs_channel_number ==
1861 channels[i]))
1862 continue;
Yingying Tangaca4a222016-09-29 17:19:38 +08001863
1864 time_when_radar_found =
1865 psapDfsChannelNolList[j].radar_found_timestamp;
1866 time_elapsed_since_last_radar = time -
1867 time_when_radar_found;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001868 /*
1869 * If channel is already in NOL, don't update it again.
1870 * This is useful when marking bonding channels which
1871 * are already unavailable.
1872 */
Yingying Tangaca4a222016-09-29 17:19:38 +08001873 if ((psapDfsChannelNolList[j].radar_status_flag ==
1874 eSAP_DFS_CHANNEL_UNAVAILABLE) &&
1875 (time_elapsed_since_last_radar <
1876 SAP_DFS_NON_OCCUPANCY_PERIOD)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301877 QDF_TRACE(QDF_MODULE_ID_SAP,
1878 QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001879 FL("Channel=%d already in NOL"),
1880 channels[i]);
1881 continue;
1882 }
1883 /*
1884 * Capture the Radar Found timestamp on the
1885 * Current Channel in ms.
1886 */
1887 psapDfsChannelNolList[j].radar_found_timestamp = time;
1888 /* Mark the Channel to be unavailble for next 30 mins */
1889 psapDfsChannelNolList[j].radar_status_flag =
1890 eSAP_DFS_CHANNEL_UNAVAILABLE;
1891
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301892 QDF_TRACE(QDF_MODULE_ID_SAP,
1893 QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001894 FL("Channel=%d Added to NOL LIST"),
1895 channels[i]);
1896 }
1897 }
1898}
1899
1900/*
1901 * This Function is to get bonding channels from primary channel.
1902 *
1903 */
Jeff Johnson464f7ea2016-10-07 10:21:26 -07001904static uint8_t sap_get_bonding_channels(ptSapContext sapContext,
1905 uint8_t channel,
1906 uint8_t *channels, uint8_t size,
1907 ePhyChanBondState chanBondState)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001908{
1909 tHalHandle hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
1910 tpAniSirGlobal pMac;
1911 uint8_t numChannel;
1912
1913 if (channels == NULL)
1914 return 0;
1915
1916 if (size < MAX_BONDED_CHANNELS)
1917 return 0;
1918
1919 if (NULL != hHal) {
1920 pMac = PMAC_STRUCT(hHal);
1921 } else
1922 return 0;
1923
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301924 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001925 FL("cbmode: %d, channel: %d"), chanBondState, channel);
1926
1927 switch (chanBondState) {
1928 case PHY_SINGLE_CHANNEL_CENTERED:
1929 numChannel = 1;
1930 channels[0] = channel;
1931 break;
1932 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
1933 numChannel = 2;
1934 channels[0] = channel - 4;
1935 channels[1] = channel;
1936 break;
1937 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
1938 numChannel = 2;
1939 channels[0] = channel;
1940 channels[1] = channel + 4;
1941 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001942 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
1943 numChannel = 4;
1944 channels[0] = channel;
1945 channels[1] = channel + 4;
1946 channels[2] = channel + 8;
1947 channels[3] = channel + 12;
1948 break;
1949 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
1950 numChannel = 4;
1951 channels[0] = channel - 4;
1952 channels[1] = channel;
1953 channels[2] = channel + 4;
1954 channels[3] = channel + 8;
1955 break;
1956 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
1957 numChannel = 4;
1958 channels[0] = channel - 8;
1959 channels[1] = channel - 4;
1960 channels[2] = channel;
1961 channels[3] = channel + 4;
1962 break;
1963 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
1964 numChannel = 4;
1965 channels[0] = channel - 12;
1966 channels[1] = channel - 8;
1967 channels[2] = channel - 4;
1968 channels[3] = channel;
1969 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001970 default:
1971 numChannel = 1;
1972 channels[0] = channel;
1973 break;
1974 }
1975
1976 return numChannel;
1977}
1978
1979/**
1980 * sap_dfs_check_if_channel_avaialable() - Check if a channel is out of NOL
1981 * @nol: Pointer to the Non-Occupancy List.
1982 *
1983 * This function Checks if a given channel is available or
1984 * usable or unavailable based on the time lapse since the
1985 * last radar time stamp.
1986 *
1987 * Return: true if channel available or usable, false if unavailable.
1988 */
1989static bool sap_dfs_check_if_channel_avaialable(tSapDfsNolInfo *nol)
1990{
1991 uint64_t time_since_last_radar, time_when_radar_found, current_time = 0;
1992 uint64_t max_jiffies;
1993
1994 if ((nol->radar_status_flag == eSAP_DFS_CHANNEL_USABLE) ||
1995 (nol->radar_status_flag == eSAP_DFS_CHANNEL_AVAILABLE)) {
1996 /*
1997 * Allow SAP operation on this channel
1998 * either the DFS channel has not been used
1999 * for SAP operation or it is available for
2000 * SAP operation since it is past
2001 * Non-Occupancy-Period so, return false.
2002 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302003 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002004 FL("Chan=%d not in NOL,CHAN AVAILABLE"),
2005 nol->dfs_channel_number);
2006 return true;
2007 } else if (nol->radar_status_flag == eSAP_DFS_CHANNEL_UNAVAILABLE) {
2008 /*
2009 * If a DFS Channel is UNAVAILABLE then
2010 * check to see if it is past
2011 * Non-occupancy-period
2012 * of 30 minutes. If it is past 30 mins then
2013 * mark the channel as AVAILABLE and return
2014 * false as the channel is not anymore in
2015 * NON-Occupancy-Period.
2016 */
2017 time_when_radar_found = nol->radar_found_timestamp;
2018 current_time = cds_get_monotonic_boottime();
2019 if (current_time < time_when_radar_found) {
2020 /* cds_get_monotonic_boottime() can overflow.
2021 * Jiffies is initialized such that 32 bit jiffies
2022 * value wrap 5 minutes after boot so jiffies wrap bugs
2023 * show up earlier
2024 */
2025 max_jiffies = (uint64_t)UINT_MAX * 1000;
2026 time_since_last_radar = (max_jiffies -
2027 time_when_radar_found) + (current_time);
2028 } else {
2029 time_since_last_radar = current_time -
2030 time_when_radar_found;
2031 }
2032 if (time_since_last_radar >= SAP_DFS_NON_OCCUPANCY_PERIOD) {
2033 nol->radar_status_flag = eSAP_DFS_CHANNEL_AVAILABLE;
2034 nol->radar_found_timestamp = 0;
2035
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302036 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002037 FL("Chan=%d not in NOL, Channel AVAILABLE"),
2038 nol->dfs_channel_number);
2039 return true;
2040 } else {
2041 /*
2042 * Channel is not still available for
2043 * SAP operation so return true; As the
2044 * Channel is still in
2045 * Non-occupancy-Period.
2046 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302047 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002048 FL("Chan=%d in NOL, Channel UNAVAILBLE"),
2049 nol->dfs_channel_number);
2050 return false;
2051 }
2052 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302053 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002054 FL("Invalid Radar Status Flag"));
2055 }
2056 return true;
2057}
2058
2059/**
2060 * sap_dfs_is_channel_in_nol_list() - given bonded channel is available
2061 * @sap_context: Handle to SAP context.
2062 * @channel_number: Channel on which availability should be checked.
2063 * @chan_bondState: The channel bonding mode of the passed channel.
2064 *
2065 * This function Checks if a given bonded channel is available or
2066 * usable for DFS operation.
2067 *
2068 * Return: false if channel is available, true if channel is in NOL.
2069 */
2070bool
2071sap_dfs_is_channel_in_nol_list(ptSapContext sap_context,
2072 uint8_t channel_number,
2073 ePhyChanBondState chan_bondState)
2074{
2075 int i, j;
2076 tHalHandle h_hal = CDS_GET_HAL_CB(sap_context->p_cds_gctx);
2077 tpAniSirGlobal mac_ctx;
2078 uint8_t channels[MAX_BONDED_CHANNELS];
2079 uint8_t num_channels;
2080 tSapDfsNolInfo *nol;
2081 tSapDfsInfo *dfs_info;
2082 bool channel_available;
2083
2084 if (NULL == h_hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302085 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002086 FL("invalid h_hal"));
2087 return false;
2088 } else {
2089 mac_ctx = PMAC_STRUCT(h_hal);
2090 }
2091
2092 dfs_info = &mac_ctx->sap.SapDfsInfo;
2093 if ((dfs_info->numCurrentRegDomainDfsChannels == 0) ||
2094 (dfs_info->numCurrentRegDomainDfsChannels >
2095 NUM_5GHZ_CHANNELS)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302096 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002097 FL("invalid dfs channel count %d"),
2098 dfs_info->numCurrentRegDomainDfsChannels);
2099 return false;
2100 }
2101
2102 /* get the bonded channels */
2103 num_channels = sap_get_bonding_channels(sap_context, channel_number,
2104 channels, MAX_BONDED_CHANNELS, chan_bondState);
2105
2106 /* check for NOL, first on will break the loop */
2107 for (j = 0; j < num_channels; j++) {
2108 for (i = 0; i < dfs_info->numCurrentRegDomainDfsChannels; i++) {
2109 nol = &dfs_info->sapDfsChannelNolList[i];
2110 if (nol->dfs_channel_number != channels[j])
2111 continue;
2112
2113 channel_available =
2114 sap_dfs_check_if_channel_avaialable(nol);
2115
2116 if (channel_available == false)
2117 break;
2118
2119 } /* loop for dfs channels */
2120
2121 if (i < dfs_info->numCurrentRegDomainDfsChannels)
2122 break;
2123
2124 } /* loop for bonded channels */
2125
2126 /*
2127 * if any of the channel is not available, mark all available channels
2128 * as unavailable with same time stamp.
2129 */
2130 if (j < num_channels &&
2131 i < dfs_info->numCurrentRegDomainDfsChannels) {
2132 if (num_channels > MAX_BONDED_CHANNELS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302133 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002134 FL("num_channel>MAX_BONDED_CHANNEL, reset"));
2135 num_channels = MAX_BONDED_CHANNELS;
2136 }
2137 nol = &dfs_info->sapDfsChannelNolList[i];
2138 sap_mark_dfs_channels(sap_context, channels, num_channels,
2139 nol->radar_found_timestamp);
2140
2141 /* set DFS-NOL back to keep it update-to-date in CNSS */
2142 sap_signal_hdd_event(sap_context, NULL, eSAP_DFS_NOL_SET,
2143 (void *) eSAP_STATUS_SUCCESS);
2144
2145 return true;
2146 }
2147
2148 return false;
2149}
2150
2151/**
Selvaraj, Sridhar9a9266e2016-09-16 14:19:43 +05302152 * sap_select_default_oper_chan() - Select operating channel based on acs hwmode
2153 * @hal: pointer to HAL
2154 * @acs_hwmode: HW mode of ACS
2155 *
2156 * Return: selected operating channel
2157 */
2158uint8_t sap_select_default_oper_chan(tHalHandle hal, uint32_t acs_hwmode)
2159{
2160 uint8_t channel;
2161
2162 if ((acs_hwmode == QCA_ACS_MODE_IEEE80211A) ||
2163 (acs_hwmode == QCA_ACS_MODE_IEEE80211AD))
2164 channel = SAP_DEFAULT_5GHZ_CHANNEL;
2165 else
2166 channel = SAP_DEFAULT_24GHZ_CHANNEL;
2167
2168 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
2169 FL("channel selected to start bss %d"), channel);
2170 return channel;
2171}
2172
2173/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002174 * sap_goto_channel_sel - Function for initiating scan request for SME
2175 * @sap_context: Sap Context value.
2176 * @sap_event: State machine event
2177 * @sap_do_acs_pre_start_bss: true, if ACS scan is issued pre start BSS
2178 * false, if ACS scan is issued post start BSS.
Manishekar Chandrasekaran1db3abe2016-06-24 03:27:07 +05302179 * @check_for_connection_update: true, check and wait for connection update
2180 * false, do not perform connection update
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002181 *
2182 * Initiates sme scan for ACS to pick a channel.
2183 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302184 * Return: The QDF_STATUS code associated with performing the operation.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002185 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302186QDF_STATUS sap_goto_channel_sel(ptSapContext sap_context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002187 ptWLAN_SAPEvent sap_event,
Manishekar Chandrasekaran1db3abe2016-06-24 03:27:07 +05302188 bool sap_do_acs_pre_start_bss,
2189 bool check_for_connection_update)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002190{
2191
2192 /* Initiate a SCAN request */
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302193 QDF_STATUS qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002194 /* To be initialised if scan is required */
2195 tCsrScanRequest scan_request;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302196 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Manishekar Chandrasekaran1db3abe2016-06-24 03:27:07 +05302197 tpAniSirGlobal mac_ctx;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002198
2199#ifdef SOFTAP_CHANNEL_RANGE
2200 uint8_t *channel_list = NULL;
2201 uint8_t num_of_channels = 0;
2202#endif
2203 tHalHandle h_hal;
2204 uint8_t con_ch;
2205
Anurag Chouhan6d760662016-02-20 16:05:43 +05302206 h_hal = cds_get_context(QDF_MODULE_ID_SME);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002207 if (NULL == h_hal) {
2208 /* we have a serious problem */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302209 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002210 FL("invalid h_hal"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302211 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002212 }
Ryan Hsu4252a2f2016-01-05 11:18:24 -08002213
Manishekar Chandrasekaran1db3abe2016-06-24 03:27:07 +05302214 mac_ctx = PMAC_STRUCT(h_hal);
2215 if (NULL == mac_ctx) {
2216 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2217 FL("Invalid MAC context"));
2218 return QDF_STATUS_E_FAILURE;
2219 }
2220
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002221 if (cds_concurrent_beaconing_sessions_running()) {
2222 con_ch =
2223 sme_get_concurrent_operation_channel(h_hal);
Ryan Hsu4252a2f2016-01-05 11:18:24 -08002224#ifdef FEATURE_WLAN_STA_AP_MODE_DFS_DISABLE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002225 if (con_ch && sap_context->channel == AUTO_CHANNEL_SELECT) {
2226 sap_context->dfs_ch_disable = true;
2227 } else if (con_ch && sap_context->channel != con_ch &&
2228 CDS_IS_DFS_CH(sap_context->channel)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302229 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002230 FL("MCC DFS not supported in AP_AP Mode"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302231 return QDF_STATUS_E_ABORTED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002232 }
Ryan Hsu4252a2f2016-01-05 11:18:24 -08002233#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002234#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
2235 if (sap_context->cc_switch_mode !=
Liangwei Dong9cfaa702016-10-17 01:20:44 -04002236 QDF_MCC_TO_SCC_SWITCH_DISABLE &&
2237 sap_context->channel) {
2238 /*
2239 * For ACS request ,the sapContext->channel is 0,
2240 * we skip below overlap checking. When the ACS
2241 * finish and SAPBSS start, the sapContext->channel
2242 * will not be 0. Then the overlap checking will be
2243 * reactivated.If we use sapContext->channel = 0
2244 * to perform the overlap checking, an invalid overlap
2245 * channel con_ch could becreated. That may cause
2246 * SAP start failed.
2247 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002248 con_ch = sme_check_concurrent_channel_overlap(h_hal,
2249 sap_context->channel,
2250 sap_context->csr_roamProfile.phyMode,
2251 sap_context->cc_switch_mode);
2252 if (con_ch) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302253 QDF_TRACE(QDF_MODULE_ID_SAP,
2254 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002255 "%s: Override ch %d to %d due to CC Intf",
2256 __func__, sap_context->channel, con_ch);
2257 sap_context->channel = con_ch;
Kiran Kumar Lokere9d41f612016-05-11 19:41:44 -07002258 cds_set_channel_params(sap_context->channel, 0,
2259 &sap_context->ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002260 }
2261 }
2262#endif
2263 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002264
Anurag Chouhan6d760662016-02-20 16:05:43 +05302265 if (cds_get_concurrency_mode() == (QDF_STA_MASK | QDF_SAP_MASK)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002266#ifdef FEATURE_WLAN_STA_AP_MODE_DFS_DISABLE
2267 if (sap_context->channel == AUTO_CHANNEL_SELECT)
2268 sap_context->dfs_ch_disable = true;
2269 else if (CDS_IS_DFS_CH(sap_context->channel)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302270 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002271 FL("DFS not supported in STA_AP Mode"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302272 return QDF_STATUS_E_ABORTED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002273 }
2274#endif
2275#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
2276 if (sap_context->cc_switch_mode !=
Liangwei Dong9cfaa702016-10-17 01:20:44 -04002277 QDF_MCC_TO_SCC_SWITCH_DISABLE &&
2278 sap_context->channel) {
Chandrasekaran Manishekar068e25e2016-03-07 11:51:07 +05302279 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
2280 FL("check for overlap: chan:%d mode:%d"),
2281 sap_context->channel,
2282 sap_context->csr_roamProfile.phyMode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002283 con_ch = sme_check_concurrent_channel_overlap(h_hal,
2284 sap_context->channel,
2285 sap_context->csr_roamProfile.phyMode,
2286 sap_context->cc_switch_mode);
2287 if (con_ch && !CDS_IS_DFS_CH(con_ch)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302288 QDF_TRACE(QDF_MODULE_ID_SAP,
2289 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002290 "%s: Override ch %d to %d due to CC Intf",
2291 __func__, sap_context->channel, con_ch);
2292 sap_context->channel = con_ch;
Kiran Kumar Lokere9d41f612016-05-11 19:41:44 -07002293 cds_set_channel_params(sap_context->channel, 0,
2294 &sap_context->ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002295 }
2296 }
2297#endif
2298 }
2299
2300 if (sap_context->channel == AUTO_CHANNEL_SELECT) {
2301#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302302 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002303 FL("%s skip_acs_status = %d "), __func__,
2304 sap_context->acs_cfg->skip_scan_status);
2305 if (sap_context->acs_cfg->skip_scan_status !=
2306 eSAP_SKIP_ACS_SCAN) {
2307#endif
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302308 qdf_mem_zero(&scan_request, sizeof(scan_request));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002309
2310 /*
2311 * Set scanType to Active scan. FW takes care of using passive
2312 * scan for DFS and active for non DFS channels.
2313 */
2314 scan_request.scanType = eSIR_ACTIVE_SCAN;
2315
2316 /* Set min and max channel time to zero */
2317 scan_request.minChnTime = 0;
2318 scan_request.maxChnTime = 0;
2319
2320 /* Set BSSType to default type */
2321 scan_request.BSSType = eCSR_BSS_TYPE_ANY;
2322
2323#ifndef SOFTAP_CHANNEL_RANGE
2324 /*Scan all the channels */
2325 scan_request.ChannelInfo.num_of_channels = 0;
2326
2327 scan_request.ChannelInfo.ChannelList = NULL;
2328
2329 scan_request.requestType = eCSR_SCAN_REQUEST_FULL_SCAN;
2330 /* eCSR_SCAN_REQUEST_11D_SCAN; */
2331
2332#else
2333
2334 sap_get_channel_list(sap_context, &channel_list,
2335 &num_of_channels);
2336#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
2337 if (num_of_channels != 0) {
2338#endif
2339 /*Scan the channels in the list */
2340 scan_request.ChannelInfo.numOfChannels =
2341 num_of_channels;
2342
2343 scan_request.ChannelInfo.ChannelList =
2344 channel_list;
2345
2346 scan_request.requestType =
2347 eCSR_SCAN_SOFTAP_CHANNEL_RANGE;
2348
2349 sap_context->channelList = channel_list;
Liangwei Dongaef84342016-10-21 05:28:00 -04002350 sap_context->num_of_channel = num_of_channels;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002351#endif
2352 /* Set requestType to Full scan */
2353
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302354 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002355 FL("calling sme_scan_request"));
2356#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
2357 if (sap_context->acs_cfg->skip_scan_status ==
2358 eSAP_DO_NEW_ACS_SCAN)
2359#endif
2360 sme_scan_flush_result(h_hal);
2361 if (true == sap_do_acs_pre_start_bss) {
2362 /*
2363 * when ID == 0 11D scan/active scan with callback,
2364 * min-maxChntime set in csrScanRequest()?
2365 * csrScanCompleteCallback callback
2366 * pContext scan_request_id filled up
2367 */
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302368 qdf_ret_status = sme_scan_request(h_hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002369 sap_context->sessionId,
2370 &scan_request,
2371 &wlansap_pre_start_bss_acs_scan_callback,
2372 sap_context);
2373 } else {
2374 /*
2375 * when ID == 0 11D scan/active scan with callback,
2376 * min-maxChntime set in csrScanRequest()?
2377 * csrScanCompleteCallback callback,
2378 * pContext scan_request_id filled up
2379 */
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302380 qdf_ret_status = sme_scan_request(h_hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002381 sap_context->sessionId,
2382 &scan_request,
2383 &wlansap_scan_callback,
2384 sap_context);
2385 }
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302386 if (QDF_STATUS_SUCCESS != qdf_ret_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302387 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002388 FL("sme_scan_request fail %d!!!"),
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302389 qdf_ret_status);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302390 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002391 FL("SAP Configuring default channel, Ch=%d"),
2392 sap_context->channel);
Selvaraj, Sridhar9a9266e2016-09-16 14:19:43 +05302393 sap_context->channel =
2394 sap_select_default_oper_chan(h_hal,
2395 sap_context->acs_cfg->hw_mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002396
2397#ifdef SOFTAP_CHANNEL_RANGE
2398 if (sap_context->channelList != NULL) {
2399 sap_context->channel =
2400 sap_context->channelList[0];
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302401 qdf_mem_free(sap_context->
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002402 channelList);
2403 sap_context->channelList = NULL;
Liangwei Dongaef84342016-10-21 05:28:00 -04002404 sap_context->num_of_channel = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002405 }
2406#endif
2407 if (true == sap_do_acs_pre_start_bss) {
2408 /*
2409 * In case of ACS req before start Bss,
2410 * return failure so that the calling
2411 * fucntion can use the default channel.
2412 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302413 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002414 } else {
2415 /* Fill in the event structure */
2416 sap_event_init(sap_event);
2417 /* Handle event */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302418 qdf_status = sap_fsm(sap_context, sap_event);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002419 }
2420 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302421 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002422 FL("return sme_ScanReq, scanID=%d, Ch=%d"),
2423 scan_request.scan_id, sap_context->channel);
2424 }
2425#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
2426 }
2427 } else {
2428 sap_context->acs_cfg->skip_scan_status = eSAP_SKIP_ACS_SCAN;
2429 }
2430
2431 if (sap_context->acs_cfg->skip_scan_status == eSAP_SKIP_ACS_SCAN) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302432 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002433 FL("## %s SKIPPED ACS SCAN"), __func__);
2434 wlansap_scan_callback(h_hal, sap_context,
2435 sap_context->sessionId, 0, eCSR_SCAN_SUCCESS);
2436 }
2437#endif
2438 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302439 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002440 FL("for configured channel, Ch= %d"),
2441 sap_context->channel);
Manishekar Chandrasekaran1db3abe2016-06-24 03:27:07 +05302442
Krunal Soni3091bcc2016-06-23 12:28:21 -07002443 if (check_for_connection_update) {
Manishekar Chandrasekaran1db3abe2016-06-24 03:27:07 +05302444 /* This wait happens in the hostapd context. The event
2445 * is set in the MC thread context.
2446 */
2447 qdf_status = cds_update_and_wait_for_connection_update(
2448 sap_context->sessionId,
2449 sap_context->channel,
2450 SIR_UPDATE_REASON_START_AP);
2451 if (QDF_IS_STATUS_ERROR(qdf_status))
2452 return qdf_status;
2453 }
2454
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002455 if (sap_do_acs_pre_start_bss == true) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302456 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002457 FL("ACS end due to Ch override. Sel Ch = %d"),
2458 sap_context->channel);
2459 sap_context->acs_cfg->pri_ch = sap_context->channel;
2460 sap_context->acs_cfg->ch_width =
2461 sap_context->ch_width_orig;
2462 sap_config_acs_result(h_hal, sap_context, 0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302463 return QDF_STATUS_E_CANCELED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002464 } else {
2465 /*
2466 * Fill in the event structure
2467 * Eventhough scan was not done,
2468 * means a user set channel was chosen
2469 */
2470 sap_event_init(sap_event);
2471 /* Handle event */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302472 qdf_status = sap_fsm(sap_context, sap_event);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002473 }
2474 }
2475
2476 /*
2477 * If scan failed, get default channel and advance state
2478 * machine as success with default channel
2479 *
2480 * Have to wait for the call back to be called to get the
2481 * channel cannot advance state machine here as said above
2482 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302483 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002484 FL("before exiting sap_goto_channel_sel channel=%d"),
2485 sap_context->channel);
2486
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302487 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002488}
2489
Peng Xu66162de2016-02-11 17:01:20 -08002490/**
2491 * sap_open_session() - Opens a SAP session
2492 * @hHal: Hal handle
2493 * @sapContext: Sap Context value
2494 * @session_id: Pointer to the session id
2495 *
2496 * Function for opening SME and SAP sessions when system is in SoftAP role
2497 *
2498 * Return: QDF_STATUS
2499 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002500
Manishekar Chandrasekaranf7a1dad2016-06-23 06:43:47 +05302501#define SAP_OPEN_SESSION_TIMEOUT 2000
Peng Xu66162de2016-02-11 17:01:20 -08002502QDF_STATUS sap_open_session(tHalHandle hHal, ptSapContext sapContext,
2503 uint32_t *session_id)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002504{
2505 uint32_t type, subType;
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302506 QDF_STATUS qdf_ret_status;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302507 QDF_STATUS status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002508 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
2509
Anurag Chouhan6d760662016-02-20 16:05:43 +05302510 if (sapContext->csr_roamProfile.csrPersona == QDF_P2P_GO_MODE)
2511 status = cds_get_vdev_types(QDF_P2P_GO_MODE, &type, &subType);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002512 else
Anurag Chouhan6d760662016-02-20 16:05:43 +05302513 status = cds_get_vdev_types(QDF_SAP_MODE, &type, &subType);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002514
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302515 if (QDF_STATUS_SUCCESS != status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302516 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002517 "failed to get vdev type");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302518 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002519 }
Peng Xu66162de2016-02-11 17:01:20 -08002520
2521 qdf_event_reset(&sapContext->sap_session_opened_evt);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002522 /* Open SME Session for Softap */
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302523 qdf_ret_status = sme_open_session(hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002524 &wlansap_roam_callback,
2525 sapContext,
2526 sapContext->self_mac_addr,
2527 &sapContext->sessionId, type, subType);
2528
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302529 if (QDF_STATUS_SUCCESS != qdf_ret_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302530 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002531 "Error: In %s calling sme_roam_connect status = %d",
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302532 __func__, qdf_ret_status);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002533
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302534 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002535 }
2536
Peng Xu66162de2016-02-11 17:01:20 -08002537 status = qdf_wait_single_event(&sapContext->sap_session_opened_evt,
2538 SAP_OPEN_SESSION_TIMEOUT);
2539
2540 if (!QDF_IS_STATUS_SUCCESS(status)) {
Sandeep Puligilladb1c5902016-12-06 16:37:54 -08002541 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2542 "wait for sap open session event timed out");
Peng Xu66162de2016-02-11 17:01:20 -08002543 return QDF_STATUS_E_FAILURE;
2544 }
2545
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002546 pMac->sap.sapCtxList[sapContext->sessionId].sessionID =
2547 sapContext->sessionId;
2548 pMac->sap.sapCtxList[sapContext->sessionId].pSapContext = sapContext;
2549 pMac->sap.sapCtxList[sapContext->sessionId].sapPersona =
2550 sapContext->csr_roamProfile.csrPersona;
Peng Xu66162de2016-02-11 17:01:20 -08002551 *session_id = sapContext->sessionId;
2552 sapContext->isSapSessionOpen = eSAP_TRUE;
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05302553 sapContext->is_pre_cac_on = false;
2554 sapContext->pre_cac_complete = false;
2555 sapContext->chan_before_pre_cac = 0;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302556 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002557}
2558
2559/*==========================================================================
2560 FUNCTION sapGotoStarting
2561
2562 DESCRIPTION
2563 Function for initiating start bss request for SME
2564
2565 DEPENDENCIES
2566 NA.
2567
2568 PARAMETERS
2569
2570 IN
2571 sapContext : Sap Context value
2572 sapEvent : State machine event
2573 bssType : Type of bss to start, INRA AP
2574 status : Return the SAP status here
2575
2576 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302577 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002578
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302579 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002580
2581 SIDE EFFECTS
2582 ============================================================================*/
Jeff Johnson464f7ea2016-10-07 10:21:26 -07002583static QDF_STATUS sap_goto_starting(ptSapContext sapContext,
2584 ptWLAN_SAPEvent sapEvent,
2585 eCsrRoamBssType bssType)
Peng Xu66162de2016-02-11 17:01:20 -08002586{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002587 /* tHalHandle */
2588 tHalHandle hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302589 QDF_STATUS qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002590
2591 /*- - - - - - - - TODO:once configs from hdd available - - - - - - - - -*/
2592 char key_material[32] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3,
2593 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, };
2594 sapContext->key_type = 0x05;
2595 sapContext->key_length = 32;
Peng Xu66162de2016-02-11 17:01:20 -08002596 /* Need a key size define */
2597 qdf_mem_copy(sapContext->key_material, key_material,
2598 sizeof(key_material));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002599
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302600 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, "In %s",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002601 __func__);
2602
2603 if (NULL == hHal) {
2604 /* we have a serious problem */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302605 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002606 "In %s, invalid hHal", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302607 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002608 }
2609
Peng Xu66162de2016-02-11 17:01:20 -08002610 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, "%s: session: %d",
2611 __func__, sapContext->sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002612
Peng Xu66162de2016-02-11 17:01:20 -08002613 qdf_ret_status = sme_roam_connect(hHal, sapContext->sessionId,
2614 &sapContext->csr_roamProfile,
2615 &sapContext->csr_roamId);
2616 if (QDF_STATUS_SUCCESS != qdf_ret_status)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302617 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xu66162de2016-02-11 17:01:20 -08002618 "%s: Failed to issue sme_roam_connect", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002619
Peng Xu66162de2016-02-11 17:01:20 -08002620 return qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002621} /* sapGotoStarting */
2622
2623/*==========================================================================
2624 FUNCTION sapGotoDisconnecting
2625
2626 DESCRIPTION
2627 Processing of SAP FSM Disconnecting state
2628
2629 DEPENDENCIES
2630 NA.
2631
2632 PARAMETERS
2633
2634 IN
2635 sapContext : Sap Context value
2636 status : Return the SAP status here
2637
2638 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302639 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002640
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302641 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002642
2643 SIDE EFFECTS
2644 ============================================================================*/
Jeff Johnson464f7ea2016-10-07 10:21:26 -07002645static QDF_STATUS sap_goto_disconnecting(ptSapContext sapContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002646{
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302647 QDF_STATUS qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002648 tHalHandle hHal;
2649
2650 hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
2651 if (NULL == hHal) {
2652 /* we have a serious problem */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302653 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002654 "In %s, invalid hHal", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302655 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002656 }
2657
2658 sap_free_roam_profile(&sapContext->csr_roamProfile);
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302659 qdf_ret_status = sme_roam_stop_bss(hHal, sapContext->sessionId);
2660 if (QDF_STATUS_SUCCESS != qdf_ret_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302661 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002662 "Error: In %s calling sme_roam_stop_bss status = %d",
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05302663 __func__, qdf_ret_status);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302664 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002665 }
2666
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302667 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002668}
2669
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302670static QDF_STATUS sap_roam_session_close_callback(void *pContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002671{
2672 ptSapContext sapContext = (ptSapContext) pContext;
Sandeep Puligilla9d81e7d2016-10-30 17:55:05 -07002673 QDF_STATUS status;
2674
2675 status = wlansap_context_get(pContext);
2676 if (status != QDF_STATUS_SUCCESS) {
2677 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2678 "%s: sap context has already been freed", __func__);
2679 return status;
2680 }
2681
2682 status = sap_signal_hdd_event(sapContext, NULL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002683 eSAP_STOP_BSS_EVENT,
2684 (void *) eSAP_STATUS_SUCCESS);
Sandeep Puligilla9d81e7d2016-10-30 17:55:05 -07002685
2686 wlansap_context_put(pContext);
2687 return status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002688}
2689
2690/*==========================================================================
2691 FUNCTION sapGotoDisconnected
2692
2693 DESCRIPTION
2694 Function for setting the SAP FSM to Disconnection state
2695
2696 DEPENDENCIES
2697 NA.
2698
2699 PARAMETERS
2700
2701 IN
2702 sapContext : Sap Context value
2703 sapEvent : State machine event
2704 status : Return the SAP status here
2705
2706 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302707 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002708
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302709 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002710
2711 SIDE EFFECTS
2712 ============================================================================*/
Jeff Johnson464f7ea2016-10-07 10:21:26 -07002713static QDF_STATUS sap_goto_disconnected(ptSapContext sapContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002714{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302715 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002716 tWLAN_SAPEvent sapEvent;
2717 /* Processing has to be coded */
2718 /* Clean up stations from TL etc as AP BSS is shut down then set event */
2719 sapEvent.event = eSAP_MAC_READY_FOR_CONNECTIONS; /* hardcoded */
2720 sapEvent.params = 0;
2721 sapEvent.u1 = 0;
2722 sapEvent.u2 = 0;
2723 /* Handle event */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302724 qdf_status = sap_fsm(sapContext, &sapEvent);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002725
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302726 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002727}
2728
Liangwei Dongaef84342016-10-21 05:28:00 -04002729#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
2730/**
2731 * sap_handle_acs_scan_event() - handle acs scan event for SAP
2732 * @sap_context: ptSapContext
2733 * @sap_event: tSap_Event
2734 * @status: status of acs scan
2735 *
2736 * The function is to handle the eSAP_ACS_SCAN_SUCCESS_EVENT event.
2737 *
2738 * Return: void
2739 */
2740static void sap_handle_acs_scan_event(ptSapContext sap_context,
2741 tSap_Event *sap_event, eSapStatus status)
2742{
2743 sap_event->sapHddEventCode = eSAP_ACS_SCAN_SUCCESS_EVENT;
2744 sap_event->sapevt.sap_acs_scan_comp.status = status;
2745 sap_event->sapevt.sap_acs_scan_comp.num_of_channels =
2746 sap_context->num_of_channel;
2747 sap_event->sapevt.sap_acs_scan_comp.channellist =
2748 sap_context->channelList;
2749}
2750#else
2751static void sap_handle_acs_scan_event(ptSapContext sap_context,
2752 tSap_Event *sap_event, eSapStatus status)
2753{
2754}
2755#endif
2756
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002757/**
2758 * sap_signal_hdd_event() - send event notification
2759 * @sap_ctx: Sap Context
2760 * @csr_roaminfo: Pointer to CSR roam information
2761 * @sap_hddevent: SAP HDD event
2762 * @context: to pass the element for future support
2763 *
2764 * Function for HDD to send the event notification using callback
2765 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302766 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002767 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302768QDF_STATUS sap_signal_hdd_event(ptSapContext sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002769 tCsrRoamInfo *csr_roaminfo, eSapHddEvent sap_hddevent,
2770 void *context)
2771{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302772 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002773 tSap_Event sap_ap_event; /* This now encodes ALL event types */
2774 tHalHandle hal = CDS_GET_HAL_CB(sap_ctx->p_cds_gctx);
2775 tpAniSirGlobal mac_ctx;
2776 tSirSmeChanInfo *chaninfo;
2777 tSap_StationAssocIndication *assoc_ind;
2778 tSap_StartBssCompleteEvent *bss_complete;
2779 struct sap_ch_selected_s *acs_selected;
2780 tSap_StationAssocReassocCompleteEvent *reassoc_complete;
2781 tSap_StationDisassocCompleteEvent *disassoc_comp;
2782 tSap_StationSetKeyCompleteEvent *key_complete;
2783 tSap_StationMICFailureEvent *mic_failure;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002784
2785 /* Format the Start BSS Complete event to return... */
2786 if (NULL == sap_ctx->pfnSapEventCallback) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302787 QDF_ASSERT(0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302788 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002789 }
2790 if (NULL == hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302791 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002792 FL("Invalid hal"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302793 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002794 }
2795 mac_ctx = PMAC_STRUCT(hal);
2796 if (NULL == mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302797 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002798 FL("Invalid MAC context"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302799 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002800 }
2801
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302802 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002803 FL("SAP event callback event = %s"),
2804 sap_hdd_event_to_string(sap_hddevent));
2805
2806 switch (sap_hddevent) {
2807 case eSAP_STA_ASSOC_IND:
Arif Hussain165aa4c2016-10-25 14:21:53 -07002808 if (!csr_roaminfo) {
2809 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2810 FL("Invalid CSR Roam Info"));
2811 return QDF_STATUS_E_INVAL;
2812 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002813 /* TODO - Indicate the assoc request indication to OS */
2814 sap_ap_event.sapHddEventCode = eSAP_STA_ASSOC_IND;
2815 assoc_ind = &sap_ap_event.sapevt.sapAssocIndication;
2816
Anurag Chouhanc5548422016-02-24 18:33:27 +05302817 qdf_copy_macaddr(&assoc_ind->staMac, &csr_roaminfo->peerMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002818 assoc_ind->staId = csr_roaminfo->staId;
2819 assoc_ind->status = 0;
2820 /* Required for indicating the frames to upper layer */
2821 assoc_ind->beaconLength = csr_roaminfo->beaconLength;
2822 assoc_ind->beaconPtr = csr_roaminfo->beaconPtr;
2823 assoc_ind->assocReqLength = csr_roaminfo->assocReqLength;
2824 assoc_ind->assocReqPtr = csr_roaminfo->assocReqPtr;
2825 assoc_ind->fWmmEnabled = csr_roaminfo->wmmEnabledSta;
2826 if (csr_roaminfo->u.pConnectedProfile != NULL) {
2827 assoc_ind->negotiatedAuthType =
2828 csr_roaminfo->u.pConnectedProfile->AuthType;
2829 assoc_ind->negotiatedUCEncryptionType =
2830 csr_roaminfo->u.pConnectedProfile->EncryptionType;
2831 assoc_ind->negotiatedMCEncryptionType =
2832 csr_roaminfo->u.pConnectedProfile->mcEncryptionType;
2833 assoc_ind->fAuthRequired = csr_roaminfo->fAuthRequired;
2834 }
2835 break;
2836 case eSAP_START_BSS_EVENT:
2837 sap_ap_event.sapHddEventCode = eSAP_START_BSS_EVENT;
2838 bss_complete = &sap_ap_event.sapevt.sapStartBssCompleteEvent;
2839
2840 bss_complete->status = (eSapStatus) context;
2841 if (csr_roaminfo != NULL)
2842 bss_complete->staId = csr_roaminfo->staId;
2843 else
2844 bss_complete->staId = 0;
2845
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302846 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002847 FL("(eSAP_START_BSS_EVENT): staId = %d"),
2848 bss_complete->staId);
2849
2850 bss_complete->operatingChannel = (uint8_t) sap_ctx->channel;
2851 bss_complete->sessionId = sap_ctx->sessionId;
2852 break;
2853 case eSAP_DFS_CAC_START:
2854 case eSAP_DFS_CAC_INTERRUPTED:
2855 case eSAP_DFS_CAC_END:
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05302856 case eSAP_DFS_PRE_CAC_END:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002857 case eSAP_DFS_RADAR_DETECT:
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05302858 case eSAP_DFS_RADAR_DETECT_DURING_PRE_CAC:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002859 case eSAP_DFS_NO_AVAILABLE_CHANNEL:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002860 sap_ap_event.sapHddEventCode = sap_hddevent;
2861 sap_ap_event.sapevt.sapStopBssCompleteEvent.status =
2862 (eSapStatus) context;
2863 break;
Liangwei Dongaef84342016-10-21 05:28:00 -04002864 case eSAP_ACS_SCAN_SUCCESS_EVENT:
2865 sap_handle_acs_scan_event(sap_ctx, &sap_ap_event,
2866 (eSapStatus)context);
2867 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002868 case eSAP_ACS_CHANNEL_SELECTED:
2869 sap_ap_event.sapHddEventCode = sap_hddevent;
2870 acs_selected = &sap_ap_event.sapevt.sap_ch_selected;
2871 if (eSAP_STATUS_SUCCESS == (eSapStatus)context) {
2872 acs_selected->pri_ch = sap_ctx->acs_cfg->pri_ch;
2873 acs_selected->ht_sec_ch = sap_ctx->acs_cfg->ht_sec_ch;
2874 acs_selected->ch_width = sap_ctx->acs_cfg->ch_width;
2875 acs_selected->vht_seg0_center_ch =
2876 sap_ctx->acs_cfg->vht_seg0_center_ch;
2877 acs_selected->vht_seg1_center_ch =
2878 sap_ctx->acs_cfg->vht_seg1_center_ch;
2879 } else if (eSAP_STATUS_FAILURE == (eSapStatus)context) {
2880 acs_selected->pri_ch = 0;
2881 }
2882 break;
2883
2884 case eSAP_STOP_BSS_EVENT:
2885 sap_ap_event.sapHddEventCode = eSAP_STOP_BSS_EVENT;
2886 sap_ap_event.sapevt.sapStopBssCompleteEvent.status =
2887 (eSapStatus) context;
2888 break;
2889
2890 case eSAP_STA_ASSOC_EVENT:
2891 case eSAP_STA_REASSOC_EVENT:
Arif Hussain165aa4c2016-10-25 14:21:53 -07002892
2893 if (!csr_roaminfo) {
2894 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2895 FL("Invalid CSR Roam Info"));
2896 return QDF_STATUS_E_INVAL;
2897 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002898 reassoc_complete =
2899 &sap_ap_event.sapevt.sapStationAssocReassocCompleteEvent;
2900
2901 if (csr_roaminfo->fReassocReq)
2902 sap_ap_event.sapHddEventCode = eSAP_STA_REASSOC_EVENT;
2903 else
2904 sap_ap_event.sapHddEventCode = eSAP_STA_ASSOC_EVENT;
2905
Anurag Chouhanc5548422016-02-24 18:33:27 +05302906 qdf_copy_macaddr(&reassoc_complete->staMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002907 &csr_roaminfo->peerMac);
2908 reassoc_complete->staId = csr_roaminfo->staId;
2909 reassoc_complete->statusCode = csr_roaminfo->statusCode;
2910 reassoc_complete->iesLen = csr_roaminfo->rsnIELen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302911 qdf_mem_copy(reassoc_complete->ies, csr_roaminfo->prsnIE,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002912 csr_roaminfo->rsnIELen);
2913
2914#ifdef FEATURE_WLAN_WAPI
2915 if (csr_roaminfo->wapiIELen) {
2916 uint8_t len = reassoc_complete->iesLen;
2917 reassoc_complete->iesLen += csr_roaminfo->wapiIELen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302918 qdf_mem_copy(&reassoc_complete->ies[len],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002919 csr_roaminfo->pwapiIE,
2920 csr_roaminfo->wapiIELen);
2921 }
2922#endif
2923 if (csr_roaminfo->addIELen) {
2924 uint8_t len = reassoc_complete->iesLen;
2925 reassoc_complete->iesLen += csr_roaminfo->addIELen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302926 qdf_mem_copy(&reassoc_complete->ies[len],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002927 csr_roaminfo->paddIE,
2928 csr_roaminfo->addIELen);
2929 }
2930
2931 /* also fill up the channel info from the csr_roamInfo */
2932 chaninfo = &reassoc_complete->chan_info;
2933
2934 chaninfo->chan_id = csr_roaminfo->chan_info.chan_id;
2935 chaninfo->mhz = csr_roaminfo->chan_info.mhz;
2936 chaninfo->info = csr_roaminfo->chan_info.info;
2937 chaninfo->band_center_freq1 =
2938 csr_roaminfo->chan_info.band_center_freq1;
2939 chaninfo->band_center_freq2 =
2940 csr_roaminfo->chan_info.band_center_freq2;
2941 chaninfo->reg_info_1 =
2942 csr_roaminfo->chan_info.reg_info_1;
2943 chaninfo->reg_info_2 =
2944 csr_roaminfo->chan_info.reg_info_2;
Kanchanapally, Vidyullathae3062812015-05-22 17:28:57 +05302945 chaninfo->nss = csr_roaminfo->chan_info.nss;
2946 chaninfo->rate_flags = csr_roaminfo->chan_info.rate_flags;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002947
2948 reassoc_complete->wmmEnabled = csr_roaminfo->wmmEnabledSta;
2949 reassoc_complete->status = (eSapStatus) context;
2950 reassoc_complete->timingMeasCap = csr_roaminfo->timingMeasCap;
2951 break;
2952
2953 case eSAP_STA_DISASSOC_EVENT:
Arif Hussain165aa4c2016-10-25 14:21:53 -07002954
2955 if (!csr_roaminfo) {
2956 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2957 FL("Invalid CSR Roam Info"));
2958 return QDF_STATUS_E_INVAL;
2959 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002960 sap_ap_event.sapHddEventCode = eSAP_STA_DISASSOC_EVENT;
2961 disassoc_comp =
2962 &sap_ap_event.sapevt.sapStationDisassocCompleteEvent;
2963
Anurag Chouhanc5548422016-02-24 18:33:27 +05302964 qdf_copy_macaddr(&disassoc_comp->staMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002965 &csr_roaminfo->peerMac);
2966 disassoc_comp->staId = csr_roaminfo->staId;
2967 if (csr_roaminfo->reasonCode == eCSR_ROAM_RESULT_FORCED)
2968 disassoc_comp->reason = eSAP_USR_INITATED_DISASSOC;
2969 else
2970 disassoc_comp->reason = eSAP_MAC_INITATED_DISASSOC;
2971
2972 disassoc_comp->statusCode = csr_roaminfo->statusCode;
2973 disassoc_comp->status = (eSapStatus) context;
2974 break;
2975
2976 case eSAP_STA_SET_KEY_EVENT:
Arif Hussain165aa4c2016-10-25 14:21:53 -07002977
2978 if (!csr_roaminfo) {
2979 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2980 FL("Invalid CSR Roam Info"));
2981 return QDF_STATUS_E_INVAL;
2982 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002983 sap_ap_event.sapHddEventCode = eSAP_STA_SET_KEY_EVENT;
2984 key_complete =
2985 &sap_ap_event.sapevt.sapStationSetKeyCompleteEvent;
2986 key_complete->status = (eSapStatus) context;
Anurag Chouhanc5548422016-02-24 18:33:27 +05302987 qdf_copy_macaddr(&key_complete->peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002988 &csr_roaminfo->peerMac);
2989 break;
2990
2991 case eSAP_STA_MIC_FAILURE_EVENT:
Arif Hussain165aa4c2016-10-25 14:21:53 -07002992
2993 if (!csr_roaminfo) {
2994 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2995 FL("Invalid CSR Roam Info"));
2996 return QDF_STATUS_E_INVAL;
2997 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002998 sap_ap_event.sapHddEventCode = eSAP_STA_MIC_FAILURE_EVENT;
2999 mic_failure = &sap_ap_event.sapevt.sapStationMICFailureEvent;
3000
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303001 qdf_mem_copy(&mic_failure->srcMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003002 csr_roaminfo->u.pMICFailureInfo->srcMacAddr,
3003 sizeof(tSirMacAddr));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303004 qdf_mem_copy(&mic_failure->staMac.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003005 csr_roaminfo->u.pMICFailureInfo->taMacAddr,
3006 sizeof(tSirMacAddr));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303007 qdf_mem_copy(&mic_failure->dstMacAddr.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003008 csr_roaminfo->u.pMICFailureInfo->dstMacAddr,
3009 sizeof(tSirMacAddr));
3010 mic_failure->multicast =
3011 csr_roaminfo->u.pMICFailureInfo->multicast;
3012 mic_failure->IV1 = csr_roaminfo->u.pMICFailureInfo->IV1;
3013 mic_failure->keyId = csr_roaminfo->u.pMICFailureInfo->keyId;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303014 qdf_mem_copy(mic_failure->TSC,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003015 csr_roaminfo->u.pMICFailureInfo->TSC,
3016 SIR_CIPHER_SEQ_CTR_SIZE);
3017 break;
3018
3019 case eSAP_ASSOC_STA_CALLBACK_EVENT:
3020 break;
3021
3022 case eSAP_WPS_PBC_PROBE_REQ_EVENT:
Arif Hussain165aa4c2016-10-25 14:21:53 -07003023
3024 if (!csr_roaminfo) {
3025 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
3026 FL("Invalid CSR Roam Info"));
3027 return QDF_STATUS_E_INVAL;
3028 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003029 sap_ap_event.sapHddEventCode = eSAP_WPS_PBC_PROBE_REQ_EVENT;
3030
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303031 qdf_mem_copy(&sap_ap_event.sapevt.sapPBCProbeReqEvent.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003032 WPSPBCProbeReq, csr_roaminfo->u.pWPSPBCProbeReq,
3033 sizeof(tSirWPSPBCProbeReq));
3034 break;
3035
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003036 case eSAP_REMAIN_CHAN_READY:
3037 sap_ap_event.sapHddEventCode = eSAP_REMAIN_CHAN_READY;
3038 sap_ap_event.sapevt.sap_roc_ind.scan_id =
3039 sap_ctx->roc_ind_scan_id;
3040 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003041
3042 case eSAP_DISCONNECT_ALL_P2P_CLIENT:
3043 sap_ap_event.sapHddEventCode = eSAP_DISCONNECT_ALL_P2P_CLIENT;
3044 sap_ap_event.sapevt.sapActionCnf.actionSendSuccess =
3045 (eSapStatus) context;
3046 break;
3047
3048 case eSAP_MAC_TRIG_STOP_BSS_EVENT:
3049 sap_ap_event.sapHddEventCode = eSAP_MAC_TRIG_STOP_BSS_EVENT;
3050 sap_ap_event.sapevt.sapActionCnf.actionSendSuccess =
3051 (eSapStatus) context;
3052 break;
3053
3054 case eSAP_UNKNOWN_STA_JOIN:
3055 sap_ap_event.sapHddEventCode = eSAP_UNKNOWN_STA_JOIN;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303056 qdf_mem_copy((void *) sap_ap_event.sapevt.sapUnknownSTAJoin.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003057 macaddr.bytes, (void *) context,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303058 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003059 break;
3060
3061 case eSAP_MAX_ASSOC_EXCEEDED:
Arif Hussain165aa4c2016-10-25 14:21:53 -07003062
3063 if (!csr_roaminfo) {
3064 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
3065 FL("Invalid CSR Roam Info"));
3066 return QDF_STATUS_E_INVAL;
3067 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003068 sap_ap_event.sapHddEventCode = eSAP_MAX_ASSOC_EXCEEDED;
Anurag Chouhanc5548422016-02-24 18:33:27 +05303069 qdf_copy_macaddr(&sap_ap_event.sapevt.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003070 sapMaxAssocExceeded.macaddr,
3071 &csr_roaminfo->peerMac);
3072 break;
3073
3074 case eSAP_CHANNEL_CHANGE_EVENT:
3075 /*
3076 * Reconfig ACS result info. For DFS AP-AP Mode Sec AP ACS
3077 * follows pri AP
3078 */
3079 sap_ctx->acs_cfg->pri_ch = sap_ctx->channel;
Manishekar Chandrasekaranec267592016-05-26 19:10:04 +05303080 sap_ctx->acs_cfg->ch_width =
3081 sap_ctx->csr_roamProfile.ch_params.ch_width;
3082 sap_config_acs_result(hal, sap_ctx,
3083 sap_ctx->csr_roamProfile.ch_params.sec_ch_offset);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003084
3085 sap_ap_event.sapHddEventCode = eSAP_CHANNEL_CHANGE_EVENT;
3086
3087 acs_selected = &sap_ap_event.sapevt.sap_ch_selected;
3088 acs_selected->pri_ch = sap_ctx->acs_cfg->pri_ch;
Manishekar Chandrasekaranec267592016-05-26 19:10:04 +05303089 acs_selected->ht_sec_ch =
3090 sap_ctx->csr_roamProfile.ch_params.sec_ch_offset;
3091 acs_selected->ch_width =
3092 sap_ctx->csr_roamProfile.ch_params.ch_width;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003093 acs_selected->vht_seg0_center_ch =
Manishekar Chandrasekaranec267592016-05-26 19:10:04 +05303094 sap_ctx->csr_roamProfile.ch_params.center_freq_seg0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003095 acs_selected->vht_seg1_center_ch =
Manishekar Chandrasekaranec267592016-05-26 19:10:04 +05303096 sap_ctx->csr_roamProfile.ch_params.center_freq_seg1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003097 break;
3098
3099 case eSAP_DFS_NOL_GET:
3100 sap_ap_event.sapHddEventCode = eSAP_DFS_NOL_GET;
3101 sap_ap_event.sapevt.sapDfsNolInfo.sDfsList =
3102 NUM_5GHZ_CHANNELS * sizeof(tSapDfsNolInfo);
3103 sap_ap_event.sapevt.sapDfsNolInfo.pDfsList = (void *)
3104 (&mac_ctx->sap.SapDfsInfo.sapDfsChannelNolList[0]);
3105 break;
3106
3107 case eSAP_DFS_NOL_SET:
3108 sap_ap_event.sapHddEventCode = eSAP_DFS_NOL_SET;
3109 sap_ap_event.sapevt.sapDfsNolInfo.sDfsList =
3110 mac_ctx->sap.SapDfsInfo.numCurrentRegDomainDfsChannels *
3111 sizeof(tSapDfsNolInfo);
3112 sap_ap_event.sapevt.sapDfsNolInfo.pDfsList = (void *)
3113 (&mac_ctx->sap.SapDfsInfo.sapDfsChannelNolList[0]);
3114 break;
Abhishek Singh518323d2015-10-19 17:42:01 +05303115 case eSAP_ECSA_CHANGE_CHAN_IND:
Arif Hussain165aa4c2016-10-25 14:21:53 -07003116
3117 if (!csr_roaminfo) {
3118 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
3119 FL("Invalid CSR Roam Info"));
3120 return QDF_STATUS_E_INVAL;
3121 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303122 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Abhishek Singh518323d2015-10-19 17:42:01 +05303123 "In %s, SAP event callback event = %s",
3124 __func__, "eSAP_ECSA_CHANGE_CHAN_IND");
3125 sap_ap_event.sapHddEventCode = eSAP_ECSA_CHANGE_CHAN_IND;
3126 sap_ap_event.sapevt.sap_chan_cng_ind.new_chan =
3127 csr_roaminfo->target_channel;
3128 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003129 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303130 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003131 FL("SAP Unknown callback event = %d"),
3132 sap_hddevent);
3133 break;
3134 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303135 qdf_status = (*sap_ctx->pfnSapEventCallback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003136 (&sap_ap_event, sap_ctx->pUsrContext);
3137
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303138 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003139
3140}
3141
3142/*==========================================================================
3143 FUNCTION sap_find_valid_concurrent_session
3144
3145 DESCRIPTION
3146 This function will return sapcontext of any valid sap session.
3147
3148 PARAMETERS
3149
3150 IN
3151 hHal : HAL pointer
3152
3153 RETURN VALUE
3154 ptSapContext : valid sap context
3155
3156 SIDE EFFECTS
3157 NA
3158 ============================================================================*/
Jeff Johnson464f7ea2016-10-07 10:21:26 -07003159static ptSapContext sap_find_valid_concurrent_session(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003160{
3161 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3162 uint8_t intf = 0;
Wu Gaod35bcb82016-11-09 17:19:15 +08003163 ptSapContext sapContext;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003164
3165 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
Anurag Chouhan6d760662016-02-20 16:05:43 +05303166 if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003167 ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05303168 (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona)) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003169 pMac->sap.sapCtxList[intf].pSapContext != NULL) {
Wu Gaod35bcb82016-11-09 17:19:15 +08003170 sapContext = pMac->sap.sapCtxList[intf].pSapContext;
3171 if (sapContext->sapsMachine != eSAP_DISCONNECTED)
3172 return sapContext;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003173 }
3174 }
3175
3176 return NULL;
3177}
3178
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303179/**
3180 * sap_find_cac_wait_session() - Get context of a SAP session in CAC wait state
3181 * @handle: Global MAC handle
3182 *
3183 * Finds and gets the context of a SAP session in CAC wait state.
3184 *
3185 * Return: Valid SAP context on success, else NULL
3186 */
Jeff Johnson464f7ea2016-10-07 10:21:26 -07003187static ptSapContext sap_find_cac_wait_session(tHalHandle handle)
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303188{
3189 tpAniSirGlobal mac = PMAC_STRUCT(handle);
3190 uint8_t i = 0;
3191 ptSapContext sapContext;
3192
3193 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
3194 "%s", __func__);
3195
3196 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
3197 sapContext = (ptSapContext) mac->sap.sapCtxList[i].pSapContext;
3198 if (((QDF_SAP_MODE == mac->sap.sapCtxList[i].sapPersona)
3199 ||
3200 (QDF_P2P_GO_MODE == mac->sap.sapCtxList[i].sapPersona)) &&
3201 (sapContext) &&
3202 (sapContext->sapsMachine == eSAP_DFS_CAC_WAIT)) {
3203 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
3204 "%s: found SAP in cac wait state", __func__);
3205 return sapContext;
3206 }
3207 if (sapContext) {
3208 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
3209 "sapdfs: mode:%d intf:%d state:%d",
3210 mac->sap.sapCtxList[i].sapPersona, i,
3211 sapContext->sapsMachine);
3212 }
3213 }
3214
3215 return NULL;
3216}
3217
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003218/*==========================================================================
3219 FUNCTION sap_close_session
3220
3221 DESCRIPTION
3222 This function will close all the sme sessions as well as zero-out the
3223 sap global structure
3224
3225 PARAMETERS
3226
3227 IN
3228 hHal : HAL pointer
3229 sapContext : Sap Context value
3230 callback : Roam Session close callback
3231 valid : Sap context is valid or no
3232
3233 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303234 The QDF_STATUS code associated with performing the operation
3235 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003236
3237 SIDE EFFECTS
3238 NA
3239 ============================================================================*/
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303240QDF_STATUS sap_close_session(tHalHandle hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003241 ptSapContext sapContext,
3242 csr_roamSessionCloseCallback callback, bool valid)
3243{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303244 QDF_STATUS qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003245 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3246
3247 if (false == valid) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303248 qdf_status = sme_close_session(hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003249 sapContext->sessionId,
3250 callback, NULL);
3251 } else {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303252 qdf_status = sme_close_session(hHal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003253 sapContext->sessionId,
3254 callback, sapContext);
3255 }
3256
3257 sapContext->isCacStartNotified = false;
3258 sapContext->isCacEndNotified = false;
3259 pMac->sap.sapCtxList[sapContext->sessionId].pSapContext = NULL;
Peng Xu66162de2016-02-11 17:01:20 -08003260 sapContext->isSapSessionOpen = false;
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303261 sapContext->pre_cac_complete = false;
3262 sapContext->is_pre_cac_on = false;
3263 sapContext->chan_before_pre_cac = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003264
3265 if (NULL == sap_find_valid_concurrent_session(hHal)) {
3266 /* If timer is running then stop the timer and destory it */
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 "sapdfs: no session are valid, so clearing dfs global structure");
3269 /*
3270 * CAC timer will be initiated and started only when SAP starts
3271 * on DFS channel and it will be stopped and destroyed
3272 * immediately once the radar detected or timedout. So
3273 * as per design CAC timer should be destroyed after stop
3274 */
3275 if (pMac->sap.SapDfsInfo.is_dfs_cac_timer_running) {
Anurag Chouhan210db072016-02-22 18:42:15 +05303276 qdf_mc_timer_stop(&pMac->sap.SapDfsInfo.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003277 sap_dfs_cac_timer);
3278 pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = 0;
Anurag Chouhan210db072016-02-22 18:42:15 +05303279 qdf_mc_timer_destroy(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003280 &pMac->sap.SapDfsInfo.sap_dfs_cac_timer);
3281 }
3282 pMac->sap.SapDfsInfo.cac_state = eSAP_DFS_DO_NOT_SKIP_CAC;
3283 sap_cac_reset_notify(hHal);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303284 qdf_mem_zero(&pMac->sap, sizeof(pMac->sap));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003285 }
3286
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303287 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003288}
3289
3290/*==========================================================================
3291 FUNCTION sap_cac_reset_notify
3292
3293 DESCRIPTION Function will be called up on stop bss indication to clean up
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303294 DFS global structure.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003295
3296 DEPENDENCIES PARAMETERS
3297 IN hHAL : HAL pointer
3298
3299 RETURN VALUE : void.
3300
3301 SIDE EFFECTS
3302 ============================================================================*/
3303void sap_cac_reset_notify(tHalHandle hHal)
3304{
3305 uint8_t intf = 0;
3306 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3307
3308 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
3309 ptSapContext pSapContext =
3310 (ptSapContext) pMac->sap.sapCtxList[intf].pSapContext;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303311 if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003312 ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05303313 (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003314 && pMac->sap.sapCtxList[intf].pSapContext != NULL) {
3315 pSapContext->isCacStartNotified = false;
3316 pSapContext->isCacEndNotified = false;
3317 }
3318 }
3319}
3320
3321/*==========================================================================
3322 FUNCTION sap_cac_start_notify
3323
3324 DESCRIPTION Function will be called to notify eSAP_DFS_CAC_START event
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303325 to HDD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003326
3327 DEPENDENCIES PARAMETERS
3328 IN hHAL : HAL pointer
3329
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303330 RETURN VALUE : QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003331
3332 SIDE EFFECTS
3333 ============================================================================*/
Jeff Johnson464f7ea2016-10-07 10:21:26 -07003334static QDF_STATUS sap_cac_start_notify(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003335{
3336 uint8_t intf = 0;
3337 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303338 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003339
3340 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
3341 ptSapContext pSapContext =
3342 (ptSapContext) pMac->sap.sapCtxList[intf].pSapContext;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303343 if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003344 ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05303345 (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003346 && pMac->sap.sapCtxList[intf].pSapContext != NULL &&
3347 (false == pSapContext->isCacStartNotified)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303348 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003349 "sapdfs: Signaling eSAP_DFS_CAC_START to HDD for sapctx[%p]",
3350 pSapContext);
3351
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303352 qdf_status = sap_signal_hdd_event(pSapContext, NULL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003353 eSAP_DFS_CAC_START,
3354 (void *)
3355 eSAP_STATUS_SUCCESS);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303356 if (QDF_STATUS_SUCCESS != qdf_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303357 QDF_TRACE(QDF_MODULE_ID_SAP,
3358 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003359 "In %s, failed setting isCacStartNotified on interface[%d]",
3360 __func__, intf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303361 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003362 }
3363 pSapContext->isCacStartNotified = true;
3364 }
3365 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303366 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003367}
3368
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303369/**
3370 * wlansap_update_pre_cac_end() - Update pre cac end to upper layer
3371 * @sap_context: SAP context
3372 * @mac: Global MAC structure
3373 * @intf: Interface number
3374 *
3375 * Notifies pre cac end to upper layer
3376 *
3377 * Return: QDF_STATUS
3378 */
3379static QDF_STATUS wlansap_update_pre_cac_end(ptSapContext sap_context,
3380 tpAniSirGlobal mac, uint8_t intf)
3381{
3382 QDF_STATUS qdf_status;
3383
3384 sap_context->isCacEndNotified = true;
3385 mac->sap.SapDfsInfo.sap_radar_found_status = false;
3386 sap_context->sapsMachine = eSAP_STARTED;
3387
3388 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
3389 "In %s, pre cac end notify on %d: from state %s => %s",
3390 __func__, intf, "eSAP_DFS_CAC_WAIT",
3391 "eSAP_STARTED");
3392
3393 qdf_status = sap_signal_hdd_event(sap_context,
3394 NULL, eSAP_DFS_PRE_CAC_END,
3395 (void *)eSAP_STATUS_SUCCESS);
3396 if (QDF_IS_STATUS_ERROR(qdf_status)) {
3397 QDF_TRACE(QDF_MODULE_ID_SAP,
3398 QDF_TRACE_LEVEL_ERROR,
3399 "In %s, pre cac notify failed on intf %d",
3400 __func__, intf);
3401 return qdf_status;
3402 }
3403
3404 return QDF_STATUS_SUCCESS;
3405}
3406
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003407/*==========================================================================
3408 FUNCTION sap_cac_end_notify
3409
3410 DESCRIPTION Function will be called to notify eSAP_DFS_CAC_END event
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303411 to HDD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003412
3413 DEPENDENCIES PARAMETERS
3414 IN hHAL : HAL pointer
3415
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303416 RETURN VALUE : QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003417
3418 SIDE EFFECTS
3419 ============================================================================*/
Jeff Johnson464f7ea2016-10-07 10:21:26 -07003420static QDF_STATUS sap_cac_end_notify(tHalHandle hHal, tCsrRoamInfo *roamInfo)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003421{
3422 uint8_t intf;
3423 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303424 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003425
3426 /*
3427 * eSAP_DFS_CHANNEL_CAC_END:
3428 * CAC Period elapsed and there was no radar
3429 * found so, SAP can continue beaconing.
3430 * sap_radar_found_status is set to 0
3431 */
3432 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
3433 ptSapContext pSapContext =
3434 (ptSapContext) pMac->sap.sapCtxList[intf].pSapContext;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303435 if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003436 ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05303437 (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003438 && pMac->sap.sapCtxList[intf].pSapContext != NULL &&
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303439 (false == pSapContext->isCacEndNotified) &&
3440 (pSapContext->sapsMachine == eSAP_DFS_CAC_WAIT)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003441 pSapContext = pMac->sap.sapCtxList[intf].pSapContext;
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303442
3443 /* If this is an end notification of a pre cac, the
3444 * SAP must not start beaconing and must delete the
3445 * temporary interface created for pre cac and switch
3446 * the original SAP to the pre CAC channel.
3447 */
3448 if (pSapContext->is_pre_cac_on) {
3449 qdf_status = wlansap_update_pre_cac_end(
3450 pSapContext, pMac, intf);
3451 if (QDF_IS_STATUS_ERROR(qdf_status))
3452 return qdf_status;
3453 /* pre CAC is not allowed with any concurrency.
3454 * So, we can break from here.
3455 */
3456 break;
3457 }
3458
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303459 qdf_status = sap_signal_hdd_event(pSapContext, NULL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003460 eSAP_DFS_CAC_END,
3461 (void *)
3462 eSAP_STATUS_SUCCESS);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303463 if (QDF_STATUS_SUCCESS != qdf_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303464 QDF_TRACE(QDF_MODULE_ID_SAP,
3465 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003466 "In %s, failed setting isCacEndNotified on interface[%d]",
3467 __func__, intf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303468 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003469 }
3470 pSapContext->isCacEndNotified = true;
3471 pMac->sap.SapDfsInfo.sap_radar_found_status = false;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303472 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003473 "sapdfs: Start beacon request on sapctx[%p]",
3474 pSapContext);
3475
3476 /* Start beaconing on the new channel */
3477 wlansap_start_beacon_req(pSapContext);
3478
3479 /* Transition from eSAP_STARTING to eSAP_STARTED
3480 * (both without substates)
3481 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303482 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003483 "sapdfs: channel[%d] from state %s => %s",
3484 pSapContext->channel, "eSAP_STARTING",
3485 "eSAP_STARTED");
3486
3487 pSapContext->sapsMachine = eSAP_STARTED;
3488
3489 /*Action code for transition */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303490 qdf_status = sap_signal_hdd_event(pSapContext, roamInfo,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003491 eSAP_START_BSS_EVENT,
3492 (void *)
3493 eSAP_STATUS_SUCCESS);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303494 if (QDF_STATUS_SUCCESS != qdf_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303495 QDF_TRACE(QDF_MODULE_ID_SAP,
3496 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003497 "In %s, failed setting isCacEndNotified on interface[%d]",
3498 __func__, intf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303499 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003500 }
3501
3502 /* Transition from eSAP_STARTING to eSAP_STARTED
3503 * (both without substates)
3504 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303505 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003506 "In %s, from state %s => %s",
3507 __func__, "eSAP_DFS_CAC_WAIT",
3508 "eSAP_STARTED");
3509 }
3510 }
3511 /*
3512 * All APs are done with CAC timer, all APs should start beaconing.
3513 * Lets assume AP1 and AP2 started beaconing on DFS channel, Now lets
3514 * say AP1 goes down and comes back on same DFS channel. In this case
3515 * AP1 shouldn't start CAC timer and start beacon immediately beacause
3516 * AP2 is already beaconing on this channel. This case will be handled
3517 * by checking against eSAP_DFS_SKIP_CAC while starting the timer.
3518 */
3519 pMac->sap.SapDfsInfo.cac_state = eSAP_DFS_SKIP_CAC;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303520 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003521}
3522
3523/**
3524 * sap_fsm_state_disconnected() - utility function called from sap fsm
3525 * @sap_ctx: SAP context
3526 * @sap_event: SAP event buffer
3527 * @mac_ctx: global MAC context
3528 * @hal: HAL handle
3529 *
3530 * This function is called for state transition from "eSAP_DISCONNECTED"
3531 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303532 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003533 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303534static QDF_STATUS sap_fsm_state_disconnected(ptSapContext sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003535 ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx,
3536 tHalHandle hal)
3537{
3538 uint32_t msg = sap_event->event;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303539 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003540
3541 if (msg == eSAP_HDD_START_INFRA_BSS) {
3542 /*
3543 * Transition from eSAP_DISCONNECTED to eSAP_CH_SELECT
3544 * (both without substates)
3545 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303546 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Peng Xu66162de2016-02-11 17:01:20 -08003547 FL("new from state %s => %s: session:%d"),
3548 "eSAP_DISCONNECTED", "eSAP_CH_SELECT",
3549 sap_ctx->sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003550
Peng Xu66162de2016-02-11 17:01:20 -08003551 if (sap_ctx->isSapSessionOpen == eSAP_FALSE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003552 uint32_t type, subtype;
Peng Xu66162de2016-02-11 17:01:20 -08003553 if (sap_ctx->csr_roamProfile.csrPersona ==
3554 QDF_P2P_GO_MODE)
3555 qdf_status = cds_get_vdev_types(QDF_P2P_GO_MODE,
3556 &type, &subtype);
3557 else
3558 qdf_status = cds_get_vdev_types(QDF_SAP_MODE,
3559 &type,
3560 &subtype);
3561
3562 if (QDF_STATUS_SUCCESS != qdf_status) {
3563 QDF_TRACE(QDF_MODULE_ID_SAP,
3564 QDF_TRACE_LEVEL_FATAL,
3565 "failed to get vdev type");
3566 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003567 }
Agrawal Ashish4c104382016-08-18 16:24:11 +05303568 qdf_status = sme_open_session(hal,
3569 &wlansap_roam_callback,
Peng Xu66162de2016-02-11 17:01:20 -08003570 sap_ctx, sap_ctx->self_mac_addr,
3571 &sap_ctx->sessionId, type, subtype);
3572 if (QDF_STATUS_SUCCESS != qdf_status) {
3573 QDF_TRACE(QDF_MODULE_ID_SAP,
3574 QDF_TRACE_LEVEL_ERROR,
3575 FL("Error: calling sme_open_session"));
3576 return QDF_STATUS_E_FAILURE;
3577 }
3578
3579 sap_ctx->isSapSessionOpen = eSAP_TRUE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003580 }
Peng Xu66162de2016-02-11 17:01:20 -08003581
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003582 /* init dfs channel nol */
3583 sap_init_dfs_channel_nol_list(sap_ctx);
3584
3585 /* Set SAP device role */
3586 sap_ctx->sapsMachine = eSAP_CH_SELECT;
3587
3588 /*
3589 * Perform sme_ScanRequest. This scan request is post start bss
3590 * request so, set the third to false.
3591 */
Manishekar Chandrasekaran1db3abe2016-06-24 03:27:07 +05303592 qdf_status = sap_goto_channel_sel(sap_ctx, sap_event, false,
3593 true);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003594 } else if (msg == eSAP_DFS_CHANNEL_CAC_START) {
3595 /*
3596 * No need of state check here, caller is expected to perform
3597 * the checks before sending the event
3598 */
3599 sap_ctx->sapsMachine = eSAP_DFS_CAC_WAIT;
3600
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303601 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003602 FL("from state eSAP_DISCONNECTED => SAP_DFS_CAC_WAIT"));
3603 if (mac_ctx->sap.SapDfsInfo.is_dfs_cac_timer_running != true) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303604 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003605 FL("sapdfs: starting dfs cac timer on sapctx[%p]"),
3606 sap_ctx);
3607 sap_start_dfs_cac_timer(sap_ctx);
3608 }
3609
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303610 qdf_status = sap_cac_start_notify(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003611 } else if (msg == eSAP_CHANNEL_SELECTION_RETRY) {
3612 /* Set SAP device role */
3613 sap_ctx->sapsMachine = eSAP_CH_SELECT;
3614
3615 /*
3616 * Perform sme_ScanRequest. This scan request is post start bss
3617 * request so, set the third to false.
3618 */
Manishekar Chandrasekaran1db3abe2016-06-24 03:27:07 +05303619 qdf_status = sap_goto_channel_sel(sap_ctx, sap_event, false,
3620 false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003621 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303622 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003623 FL("in state %s, event msg %d"),
3624 "eSAP_DISCONNECTED", msg);
3625 }
3626
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303627 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003628}
3629
3630/**
3631 * sap_fsm_state_ch_select() - utility function called from sap fsm
3632 * @sap_ctx: SAP context
3633 * @sap_event: SAP event buffer
3634 * @mac_ctx: global MAC context
3635 * @hal: HAL handle
3636 *
3637 * This function is called for state transition from "eSAP_CH_SELECT"
3638 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303639 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003640 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303641static QDF_STATUS sap_fsm_state_ch_select(ptSapContext sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003642 ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx,
3643 tHalHandle hal)
3644{
3645 uint32_t msg = sap_event->event;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303646 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003647 uint32_t cbmode;
3648 bool b_leak_chan = false;
3649#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
3650 uint8_t temp_chan;
3651 tSapDfsNolInfo *p_nol;
3652#endif
3653
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003654 if (msg == eSAP_MAC_SCAN_COMPLETE) {
3655 /* get the bonding mode */
3656 if (sap_ctx->channel <= 14)
3657 cbmode = sme_get_cb_phy_state_from_cb_ini_value(
3658 sme_get_channel_bonding_mode24_g(hal));
3659 else
3660 cbmode = sme_get_cb_phy_state_from_cb_ini_value(
3661 sme_get_channel_bonding_mode5_g(hal));
3662
3663#ifdef WLAN_ENABLE_CHNL_MATRIX_RESTRICTION
3664 temp_chan = sap_ctx->channel;
3665 p_nol = mac_ctx->sap.SapDfsInfo.sapDfsChannelNolList;
3666
Naveen Rawatb3264f02016-03-25 15:06:22 -07003667 sap_mark_leaking_ch(sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003668 cbmode, p_nol, 1, &temp_chan);
3669
3670 /*
3671 * if selelcted channel has leakage to channels
3672 * in NOL, the temp_chan will be reset
3673 */
3674 b_leak_chan = (temp_chan != sap_ctx->channel);
3675#endif
3676 /*
3677 * check if channel is in DFS_NOL or if the channel
3678 * has leakage to the channels in NOL
3679 */
3680 if (sap_dfs_is_channel_in_nol_list(sap_ctx, sap_ctx->channel,
3681 cbmode) || b_leak_chan) {
3682 uint8_t ch;
3683
3684 /* find a new available channel */
3685 ch = sap_random_channel_sel(sap_ctx);
3686 if (ch == 0) {
3687 /* No available channel found */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303688 QDF_TRACE(QDF_MODULE_ID_SAP,
3689 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003690 FL("No available channel found!!!"));
3691 sap_signal_hdd_event(sap_ctx, NULL,
3692 eSAP_DFS_NO_AVAILABLE_CHANNEL,
3693 (void *)eSAP_STATUS_SUCCESS);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303694 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003695 }
3696
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303697 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003698 FL("channel %d is in NOL, StartBss on new channel %d"),
3699 sap_ctx->channel, ch);
3700
3701 sap_ctx->channel = ch;
Sandeep Puligilla1cc23f62016-04-27 16:52:49 -07003702 cds_set_channel_params(sap_ctx->channel,
3703 sap_ctx->secondary_ch, &sap_ctx->ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003704 }
3705 if (sap_ctx->channel > 14 &&
3706 (sap_ctx->csr_roamProfile.phyMode == eCSR_DOT11_MODE_11g ||
3707 sap_ctx->csr_roamProfile.phyMode ==
3708 eCSR_DOT11_MODE_11g_ONLY))
3709 sap_ctx->csr_roamProfile.phyMode = eCSR_DOT11_MODE_11a;
3710
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003711 /*
3712 * when AP2 is started while AP1 is performing ACS, we may not
3713 * have the AP1 channel yet.So here after the completion of AP2
3714 * ACS check if AP1 ACS resulting channel is DFS and if yes
3715 * override AP2 ACS scan result with AP1 DFS channel
3716 */
3717 if (cds_concurrent_beaconing_sessions_running()) {
3718 uint16_t con_ch;
3719
3720 con_ch = sme_get_concurrent_operation_channel(hal);
3721 if (con_ch && CDS_IS_DFS_CH(con_ch))
3722 sap_ctx->channel = con_ch;
3723 }
Ryan Hsu4252a2f2016-01-05 11:18:24 -08003724
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003725 /*
3726 * Transition from eSAP_CH_SELECT to eSAP_STARTING
3727 * (both without substates)
3728 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303729 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003730 FL("from state %s => %s"),
3731 "eSAP_CH_SELECT", "eSAP_STARTING");
3732 /* Channel selected. Now can sap_goto_starting */
3733 sap_ctx->sapsMachine = eSAP_STARTING;
3734 /* Specify the channel */
3735 sap_ctx->csr_roamProfile.ChannelInfo.numOfChannels =
3736 1;
3737 sap_ctx->csr_roamProfile.ChannelInfo.ChannelList =
3738 &sap_ctx->csr_roamProfile.operationChannel;
3739 sap_ctx->csr_roamProfile.operationChannel =
3740 (uint8_t) sap_ctx->channel;
3741 sap_ctx->csr_roamProfile.ch_params.ch_width =
3742 sap_ctx->ch_params.ch_width;
3743 sap_ctx->csr_roamProfile.ch_params.center_freq_seg0 =
3744 sap_ctx->ch_params.center_freq_seg0;
3745 sap_ctx->csr_roamProfile.ch_params.center_freq_seg1 =
3746 sap_ctx->ch_params.center_freq_seg1;
3747 sap_ctx->csr_roamProfile.ch_params.sec_ch_offset =
3748 sap_ctx->ch_params.sec_ch_offset;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303749 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003750 FL("notify hostapd about channel selection: %d"),
3751 sap_ctx->channel);
3752 sap_signal_hdd_event(sap_ctx, NULL,
3753 eSAP_CHANNEL_CHANGE_EVENT,
3754 (void *) eSAP_STATUS_SUCCESS);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303755 qdf_status = sap_goto_starting(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003756 eCSR_BSS_TYPE_INFRA_AP);
3757 } else if (msg == eSAP_CHANNEL_SELECTION_FAILED) {
3758 sap_ctx->sapsMachine = eSAP_DISCONNECTED;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303759 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003760 FL("Cannot start BSS, ACS Fail"));
3761 } else if (msg == eSAP_HDD_STOP_INFRA_BSS) {
3762 sap_ctx->sapsMachine = eSAP_DISCONNECTED;
3763 sap_signal_hdd_event(sap_ctx, NULL, eSAP_START_BSS_EVENT,
3764 (void *)eSAP_STATUS_FAILURE);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303765 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003766 "%s: BSS stopped when Ch select in Progress", __func__);
3767 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303768 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003769 FL("in state %s, invalid event msg %d"),
3770 "eSAP_CH_SELECT", msg);
3771 }
3772
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303773 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003774}
3775
3776/**
3777 * sap_fsm_state_dfs_cac_wait() - utility function called from sap fsm
3778 * @sap_ctx: SAP context
3779 * @sap_event: SAP event buffer
3780 * @mac_ctx: global MAC context
3781 * @hal: HAL handle
3782 *
3783 * This function is called for state transition from "eSAP_DFS_CAC_WAIT"
3784 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303785 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003786 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303787static QDF_STATUS sap_fsm_state_dfs_cac_wait(ptSapContext sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003788 ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx,
3789 tHalHandle hal)
3790{
3791 uint32_t msg = sap_event->event;
3792 tCsrRoamInfo *roam_info = (tCsrRoamInfo *) (sap_event->params);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303793 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003794
3795 if (msg == eSAP_DFS_CHANNEL_CAC_START) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303796 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003797 FL("from state %s => %s"),
3798 "eSAP_CH_SELECT", "eSAP_DFS_CAC_WAIT");
3799 if (mac_ctx->sap.SapDfsInfo.is_dfs_cac_timer_running != true)
3800 sap_start_dfs_cac_timer(sap_ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303801 qdf_status = sap_cac_start_notify(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003802 } else if (msg == eSAP_DFS_CHANNEL_CAC_RADAR_FOUND) {
3803 uint8_t intf;
3804 /*
3805 * Radar found while performing channel availability
3806 * check, need to switch the channel again
3807 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303808 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003809 "ENTERTRED CAC WAIT STATE-->eSAP_DISCONNECTING\n");
3810 if (mac_ctx->sap.SapDfsInfo.target_channel) {
Sandeep Puligilla1cc23f62016-04-27 16:52:49 -07003811 cds_set_channel_params(
3812 mac_ctx->sap.SapDfsInfo.target_channel, 0,
3813 &sap_ctx->ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003814 }
3815
3816 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
3817 ptSapContext t_sap_ctx;
Wu Gao03dd0f62016-11-16 10:51:06 +08003818 t_sap_ctx = mac_ctx->sap.sapCtxList[intf].pSapContext;
Anurag Chouhan6d760662016-02-20 16:05:43 +05303819 if (((QDF_SAP_MODE ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003820 mac_ctx->sap.sapCtxList[intf].sapPersona) ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05303821 (QDF_P2P_GO_MODE ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003822 mac_ctx->sap.sapCtxList[intf].sapPersona)) &&
Wu Gao03dd0f62016-11-16 10:51:06 +08003823 t_sap_ctx != NULL &&
3824 t_sap_ctx->sapsMachine != eSAP_DISCONNECTED) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003825 /* SAP to be moved to DISCONNECTING state */
3826 sap_ctx->sapsMachine = eSAP_DISCONNECTING;
3827 /*
3828 * eSAP_DFS_CHANNEL_CAC_RADAR_FOUND:
3829 * A Radar is found on current DFS Channel
3830 * while in CAC WAIT period So, do a channel
3831 * switch to randomly selected target channel.
3832 * Send the Channel change message to SME/PE.
3833 * sap_radar_found_status is set to 1
3834 */
3835 sap_signal_hdd_event(t_sap_ctx, NULL,
3836 eSAP_DFS_RADAR_DETECT,
3837 (void *)eSAP_STATUS_SUCCESS);
3838
3839 wlansap_channel_change_request(
3840 (void *)t_sap_ctx,
3841 mac_ctx->sap.SapDfsInfo.target_channel);
3842 }
3843 }
3844 } else if (msg == eSAP_DFS_CHANNEL_CAC_END) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303845 qdf_status = sap_cac_end_notify(hal, roam_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003846 } else if (msg == eSAP_HDD_STOP_INFRA_BSS) {
3847 /* Transition from eSAP_DFS_CAC_WAIT to eSAP_DISCONNECTING */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303848 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003849 FL("from state %s => %s"),
3850 "eSAP_DFS_CAC_WAIT", "eSAP_DISCONNECTING");
3851
3852 /*
3853 * Stop the CAC timer only in following conditions
3854 * single AP: if there is a single AP then stop the timer
3855 * mulitple APs: incase of multiple APs, make sure that
3856 * all APs are down.
3857 */
3858 if (NULL == sap_find_valid_concurrent_session(hal)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303859 QDF_TRACE(QDF_MODULE_ID_SAP,
3860 QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003861 FL("sapdfs: no sessions are valid, stopping timer"));
3862 sap_stop_dfs_cac_timer(sap_ctx);
3863 }
3864
3865 sap_ctx->sapsMachine = eSAP_DISCONNECTING;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303866 qdf_status = sap_goto_disconnecting(sap_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003867 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303868 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003869 FL("in state %s, invalid event msg %d"),
3870 "eSAP_DFS_CAC_WAIT", msg);
3871 }
3872
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303873 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003874}
3875
3876/**
3877 * sap_fsm_state_starting() - utility function called from sap fsm
3878 * @sap_ctx: SAP context
3879 * @sap_event: SAP event buffer
3880 * @mac_ctx: global MAC context
3881 * @hal: HAL handle
3882 *
3883 * This function is called for state transition from "eSAP_STARTING"
3884 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303885 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003886 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303887static QDF_STATUS sap_fsm_state_starting(ptSapContext sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003888 ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx,
3889 tHalHandle hal)
3890{
3891 uint32_t msg = sap_event->event;
3892 tCsrRoamInfo *roam_info = (tCsrRoamInfo *) (sap_event->params);
3893 tSapDfsInfo *sap_dfs_info;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303894 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Sandeep Puligilla949eaa72015-12-17 18:43:52 -08003895 uint8_t is_dfs = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003896
3897 if (msg == eSAP_MAC_START_BSS_SUCCESS) {
3898 /*
3899 * Transition from eSAP_STARTING to eSAP_STARTED
3900 * (both without substates)
3901 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303902 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Sandeep Puligilla949eaa72015-12-17 18:43:52 -08003903 FL("from state channel = %d %s => %s ch_width %d"),
3904 sap_ctx->channel, "eSAP_STARTING", "eSAP_STARTED",
3905 sap_ctx->ch_params.ch_width);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003906 sap_ctx->sapsMachine = eSAP_STARTED;
3907
3908 /* Action code for transition */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303909 qdf_status = sap_signal_hdd_event(sap_ctx, roam_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003910 eSAP_START_BSS_EVENT,
3911 (void *) eSAP_STATUS_SUCCESS);
3912
3913 /*
3914 * The upper layers have been informed that AP is up and
3915 * running, however, the AP is still not beaconing, until
3916 * CAC is done if the operating channel is DFS
3917 */
Sandeep Puligilla949eaa72015-12-17 18:43:52 -08003918 if (sap_ctx->ch_params.ch_width == CH_WIDTH_160MHZ) {
3919 is_dfs = true;
3920 } else if (sap_ctx->ch_params.ch_width == CH_WIDTH_80P80MHZ) {
3921 if (cds_get_channel_state(sap_ctx->channel) ==
3922 CHANNEL_STATE_DFS ||
3923 cds_get_channel_state(sap_ctx->
3924 ch_params.center_freq_seg1 -
3925 SIR_80MHZ_START_CENTER_CH_DIFF) ==
3926 CHANNEL_STATE_DFS)
3927 is_dfs = true;
3928 } else {
3929 if (cds_get_channel_state(sap_ctx->channel) ==
3930 CHANNEL_STATE_DFS)
3931 is_dfs = true;
3932 }
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303933
Sandeep Puligilla949eaa72015-12-17 18:43:52 -08003934 if (is_dfs) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003935 sap_dfs_info = &mac_ctx->sap.SapDfsInfo;
3936 if ((false == sap_dfs_info->ignore_cac) &&
3937 (eSAP_DFS_DO_NOT_SKIP_CAC ==
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303938 sap_dfs_info->cac_state) &&
3939 !sap_ctx->pre_cac_complete) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003940 /* Move the device in CAC_WAIT_STATE */
3941 sap_ctx->sapsMachine = eSAP_DFS_CAC_WAIT;
3942
3943 /*
3944 * Need to stop the OS transmit queues,
3945 * so that no traffic can flow down the stack
3946 */
3947
3948 /* Start CAC wait timer */
3949 if (sap_dfs_info->is_dfs_cac_timer_running !=
3950 true)
3951 sap_start_dfs_cac_timer(sap_ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303952 qdf_status = sap_cac_start_notify(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003953
3954 } else {
3955 wlansap_start_beacon_req(sap_ctx);
3956 }
3957 }
Kiran Kumar Lokere475c1772016-08-18 12:40:07 -07003958 } else if (msg == eSAP_MAC_START_FAILS ||
3959 msg == eSAP_HDD_STOP_INFRA_BSS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003960 /*
3961 * Transition from eSAP_STARTING to eSAP_DISCONNECTED
3962 * (both without substates)
3963 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303964 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003965 FL("from state %s => %s"),
3966 "eSAP_STARTING", "eSAP_DISCONNECTED");
3967
3968 /* Advance outer statevar */
3969 sap_ctx->sapsMachine = eSAP_DISCONNECTED;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303970 qdf_status = sap_signal_hdd_event(sap_ctx, NULL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003971 eSAP_START_BSS_EVENT,
3972 (void *) eSAP_STATUS_FAILURE);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303973 qdf_status = sap_goto_disconnected(sap_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003974 /* Close the SME session */
3975
3976 if (eSAP_TRUE == sap_ctx->isSapSessionOpen) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303977 if (QDF_STATUS_SUCCESS == sap_close_session(hal,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003978 sap_ctx, NULL, false))
3979 sap_ctx->isSapSessionOpen = eSAP_FALSE;
3980 }
3981 } else if (msg == eSAP_OPERATING_CHANNEL_CHANGED) {
3982 /* The operating channel has changed, update hostapd */
3983 sap_ctx->channel =
3984 (uint8_t) mac_ctx->sap.SapDfsInfo.target_channel;
3985
3986 sap_ctx->sapsMachine = eSAP_STARTED;
3987
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303988 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003989 FL("from state %s => %s"),
3990 "eSAP_STARTING", "eSAP_STARTED");
3991
3992 /* Indicate change in the state to upper layers */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303993 qdf_status = sap_signal_hdd_event(sap_ctx, roam_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003994 eSAP_START_BSS_EVENT,
3995 (void *)eSAP_STATUS_SUCCESS);
3996 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303997 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003998 FL("in state %s, invalid event msg %d"),
3999 "eSAP_STARTING", msg);
4000 }
4001
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304002 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004003}
4004
4005/**
4006 * sap_fsm_state_started() - utility function called from sap fsm
4007 * @sap_ctx: SAP context
4008 * @sap_event: SAP event buffer
4009 * @mac_ctx: global MAC context
4010 *
4011 * This function is called for state transition from "eSAP_STARTED"
4012 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304013 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004014 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304015static QDF_STATUS sap_fsm_state_started(ptSapContext sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004016 ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx)
4017{
4018 uint32_t msg = sap_event->event;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304019 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004020
4021 if (msg == eSAP_HDD_STOP_INFRA_BSS) {
4022 /*
4023 * Transition from eSAP_STARTED to eSAP_DISCONNECTING
4024 * (both without substates)
4025 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304026 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004027 FL("from state %s => %s"),
4028 "eSAP_STARTED", "eSAP_DISCONNECTING");
4029 sap_ctx->sapsMachine = eSAP_DISCONNECTING;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304030 qdf_status = sap_goto_disconnecting(sap_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004031 } else if (eSAP_DFS_CHNL_SWITCH_ANNOUNCEMENT_START == msg) {
4032 uint8_t intf;
4033 /*
4034 * Radar is seen on the current operating channel
4035 * send CSA IE for all associated stations
4036 * Request for CSA IE transmission
4037 */
4038 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
4039 ptSapContext temp_sap_ctx;
Anurag Chouhan6d760662016-02-20 16:05:43 +05304040 if (((QDF_SAP_MODE ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004041 mac_ctx->sap.sapCtxList[intf].sapPersona) ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05304042 (QDF_P2P_GO_MODE ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004043 mac_ctx->sap.sapCtxList[intf].sapPersona)) &&
4044 mac_ctx->sap.sapCtxList[intf].pSapContext != NULL) {
4045 temp_sap_ctx =
4046 mac_ctx->sap.sapCtxList[intf].pSapContext;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304047 QDF_TRACE(QDF_MODULE_ID_SAP,
4048 QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004049 FL("sapdfs: Sending CSAIE for sapctx[%p]"),
4050 temp_sap_ctx);
4051
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304052 qdf_status = wlansap_dfs_send_csa_ie_request(
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004053 (void *) temp_sap_ctx);
4054 }
4055 }
Chandrasekaran, Manishekar8104abd2016-01-29 18:10:27 +05304056 } else if (eSAP_CHANNEL_SWITCH_ANNOUNCEMENT_START == msg) {
4057 enum tQDF_ADAPTER_MODE persona;
4058
4059 if (!sap_ctx) {
4060 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
4061 FL("Invalid sap_ctx"));
4062 return qdf_status;
4063 }
4064
4065 persona = mac_ctx->sap.sapCtxList[sap_ctx->sessionId].
4066 sapPersona;
4067
4068 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
4069 FL("app trigger chan switch: mode:%d vdev:%d"),
4070 persona, sap_ctx->sessionId);
4071
4072 if ((QDF_SAP_MODE == persona) || (QDF_P2P_GO_MODE == persona))
4073 qdf_status = wlansap_dfs_send_csa_ie_request(
4074 (void *) sap_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004075 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304076 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004077 FL("in state %s, invalid event msg %d"),
4078 "eSAP_STARTED", msg);
4079 }
4080
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304081 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004082}
4083
4084/**
4085 * sap_fsm_state_disconnecting() - utility function called from sap fsm
4086 * @sap_ctx: SAP context
4087 * @sap_event: SAP event buffer
4088 * @mac_ctx: global MAC context
4089 *
4090 * This function is called for state transition from "eSAP_DISCONNECTING"
4091 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304092 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004093 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304094static QDF_STATUS sap_fsm_state_disconnecting(ptSapContext sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004095 ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx,
4096 tHalHandle hal)
4097{
4098 uint32_t msg = sap_event->event;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304099 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004100
4101 if (msg == eSAP_MAC_READY_FOR_CONNECTIONS) {
4102 /*
4103 * Transition from eSAP_DISCONNECTING to eSAP_DISCONNECTED
4104 * (both without substates)
4105 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304106 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004107 FL("from state %s => %s"),
4108 "eSAP_DISCONNECTING", "eSAP_DISCONNECTED");
4109 sap_ctx->sapsMachine = eSAP_DISCONNECTED;
4110
4111 /* Close the SME session */
4112 if (eSAP_TRUE == sap_ctx->isSapSessionOpen) {
4113 sap_ctx->isSapSessionOpen = eSAP_FALSE;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304114 qdf_status = sap_close_session(hal, sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004115 sap_roam_session_close_callback, true);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304116 if (!QDF_IS_STATUS_SUCCESS(qdf_status)) {
4117 qdf_status = sap_signal_hdd_event(sap_ctx, NULL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004118 eSAP_STOP_BSS_EVENT,
4119 (void *)eSAP_STATUS_SUCCESS);
4120 }
4121 }
4122 } else if (msg == eWNI_SME_CHANNEL_CHANGE_REQ) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304123 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004124 FL("sapdfs: Send channel change request on sapctx[%p]"),
4125 sap_ctx);
4126 /*
4127 * Most likely, radar has been detected and SAP wants to
4128 * change the channel
4129 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304130 qdf_status = wlansap_channel_change_request((void *) sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004131 mac_ctx->sap.SapDfsInfo.target_channel);
4132
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304133 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004134 FL("Sending DFS eWNI_SME_CHANNEL_CHANGE_REQ"));
Liangwei Dong87a1ecc2016-09-28 04:03:16 -04004135 } else if (msg == eWNI_SME_CHANNEL_CHANGE_RSP) {
4136 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
4137 FL("in state %s, event msg %d result %d"),
4138 "eSAP_DISCONNECTING ", msg, sap_event->u2);
4139 if (sap_event->u2 == eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE)
4140 qdf_status = sap_goto_disconnecting(sap_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004141 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304142 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004143 FL("in state %s, invalid event msg %d"),
4144 "eSAP_DISCONNECTING", msg);
4145 }
4146
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304147 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004148}
4149
4150/**
4151 * sap_fsm() - SAP statem machine entry function
4152 * @sap_ctx: SAP context
4153 * @sap_event: SAP event
4154 *
4155 * SAP statem machine entry function
4156 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304157 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004158 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304159QDF_STATUS sap_fsm(ptSapContext sap_ctx, ptWLAN_SAPEvent sap_event)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004160{
4161 /*
4162 * Retrieve the phy link state machine structure
4163 * from the sap_ctx value
4164 * state var that keeps track of state machine
4165 */
4166 eSapFsmStates_t state_var = sap_ctx->sapsMachine;
4167 uint32_t msg = sap_event->event; /* State machine input event message */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304168 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004169 tHalHandle hal = CDS_GET_HAL_CB(sap_ctx->p_cds_gctx);
4170 tpAniSirGlobal mac_ctx;
4171
4172 if (NULL == hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304173 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004174 FL("Invalid hal"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304175 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004176 }
4177
4178 mac_ctx = PMAC_STRUCT(hal);
4179 if (NULL == mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304180 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004181 FL("Invalid MAC context"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304182 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004183 }
4184
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304185 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004186 FL("sap_ctx=%p, state_var=%d, msg=0x%x"),
4187 sap_ctx, state_var, msg);
4188
4189 switch (state_var) {
4190 case eSAP_DISCONNECTED:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304191 qdf_status = sap_fsm_state_disconnected(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004192 mac_ctx, hal);
4193 break;
4194
4195 case eSAP_CH_SELECT:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304196 qdf_status = sap_fsm_state_ch_select(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004197 mac_ctx, hal);
4198 break;
4199
4200 case eSAP_DFS_CAC_WAIT:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304201 qdf_status = sap_fsm_state_dfs_cac_wait(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004202 mac_ctx, hal);
4203 break;
4204
4205 case eSAP_STARTING:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304206 qdf_status = sap_fsm_state_starting(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004207 mac_ctx, hal);
4208 break;
4209
4210 case eSAP_STARTED:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304211 qdf_status = sap_fsm_state_started(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004212 mac_ctx);
4213 break;
4214
4215 case eSAP_DISCONNECTING:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304216 qdf_status = sap_fsm_state_disconnecting(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004217 mac_ctx, hal);
4218 break;
4219 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304220 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004221}
4222
4223eSapStatus
4224sapconvert_to_csr_profile(tsap_Config_t *pconfig_params, eCsrRoamBssType bssType,
4225 tCsrRoamProfile *profile)
4226{
4227 /* Create Roam profile for SoftAP to connect */
4228 profile->BSSType = eCSR_BSS_TYPE_INFRA_AP;
4229 profile->SSIDs.numOfSSIDs = 1;
4230 profile->csrPersona = pconfig_params->persona;
4231 profile->disableDFSChSwitch = pconfig_params->disableDFSChSwitch;
4232
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304233 qdf_mem_zero(profile->SSIDs.SSIDList[0].SSID.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004234 sizeof(profile->SSIDs.SSIDList[0].SSID.ssId));
4235
4236 /* Flag to not broadcast the SSID information */
4237 profile->SSIDs.SSIDList[0].ssidHidden =
4238 pconfig_params->SSIDinfo.ssidHidden;
4239
4240 profile->SSIDs.SSIDList[0].SSID.length =
4241 pconfig_params->SSIDinfo.ssid.length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304242 qdf_mem_copy(&profile->SSIDs.SSIDList[0].SSID.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004243 pconfig_params->SSIDinfo.ssid.ssId,
4244 sizeof(pconfig_params->SSIDinfo.ssid.ssId));
4245
4246 profile->negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
4247
4248 if (pconfig_params->authType == eSAP_OPEN_SYSTEM) {
4249 profile->negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
4250 } else if (pconfig_params->authType == eSAP_SHARED_KEY) {
4251 profile->negotiatedAuthType = eCSR_AUTH_TYPE_SHARED_KEY;
4252 } else {
4253 profile->negotiatedAuthType = eCSR_AUTH_TYPE_AUTOSWITCH;
4254 }
4255
4256 profile->AuthType.numEntries = 1;
4257 profile->AuthType.authType[0] = eCSR_AUTH_TYPE_OPEN_SYSTEM;
4258
4259 /* Always set the Encryption Type */
4260 profile->EncryptionType.numEntries = 1;
4261 profile->EncryptionType.encryptionType[0] =
4262 pconfig_params->RSNEncryptType;
4263
4264 profile->mcEncryptionType.numEntries = 1;
4265 profile->mcEncryptionType.encryptionType[0] =
4266 pconfig_params->mcRSNEncryptType;
4267
4268 if (pconfig_params->privacy & eSAP_SHARED_KEY) {
4269 profile->AuthType.authType[0] = eCSR_AUTH_TYPE_SHARED_KEY;
4270 }
4271
4272 profile->privacy = pconfig_params->privacy;
4273 profile->fwdWPSPBCProbeReq = pconfig_params->fwdWPSPBCProbeReq;
4274
4275 if (pconfig_params->authType == eSAP_SHARED_KEY) {
4276 profile->csr80211AuthType = eSIR_SHARED_KEY;
4277 } else if (pconfig_params->authType == eSAP_OPEN_SYSTEM) {
4278 profile->csr80211AuthType = eSIR_OPEN_SYSTEM;
4279 } else {
4280 profile->csr80211AuthType = eSIR_AUTO_SWITCH;
4281 }
4282
4283 /* Initialize we are not going to use it */
4284 profile->pWPAReqIE = NULL;
4285 profile->nWPAReqIELength = 0;
4286
4287 /* set the RSN/WPA IE */
4288 profile->pRSNReqIE = NULL;
4289 profile->nRSNReqIELength = pconfig_params->RSNWPAReqIELength;
4290 if (pconfig_params->RSNWPAReqIELength) {
4291 profile->pRSNReqIE =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304292 qdf_mem_malloc(pconfig_params->RSNWPAReqIELength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004293 if (NULL == profile->pRSNReqIE) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304294 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004295 " %s Fail to alloc memory", __func__);
4296 return eSAP_STATUS_FAILURE;
4297 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304298 qdf_mem_copy(profile->pRSNReqIE, pconfig_params->RSNWPAReqIE,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004299 pconfig_params->RSNWPAReqIELength);
4300 profile->nRSNReqIELength = pconfig_params->RSNWPAReqIELength;
4301 }
4302 /* Turn off CB mode */
4303 profile->CBMode = eCSR_CB_OFF;
4304
4305 /* set the phyMode to accept anything */
4306 /* Best means everything because it covers all the things we support */
4307 /* eCSR_DOT11_MODE_BEST */
4308 profile->phyMode = pconfig_params->SapHw_mode;
4309
4310 /* Configure beaconInterval */
4311 profile->beaconInterval = (uint16_t) pconfig_params->beacon_int;
4312
4313 /* set DTIM period */
4314 profile->dtimPeriod = pconfig_params->dtim_period;
4315
4316 /* set Uapsd enable bit */
4317 profile->ApUapsdEnable = pconfig_params->UapsdEnable;
4318
4319 /* Enable protection parameters */
4320 profile->protEnabled = pconfig_params->protEnabled;
4321 profile->obssProtEnabled = pconfig_params->obssProtEnabled;
4322 profile->cfg_protection = pconfig_params->ht_capab;
4323
4324 /* country code */
4325 if (pconfig_params->countryCode[0])
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304326 qdf_mem_copy(profile->countryCode, pconfig_params->countryCode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004327 WNI_CFG_COUNTRY_CODE_LEN);
4328 profile->ieee80211d = pconfig_params->ieee80211d;
4329 /* wps config info */
4330 profile->wps_state = pconfig_params->wps_state;
4331
4332#ifdef WLAN_FEATURE_11W
4333 /* MFP capable/required */
4334 profile->MFPCapable = pconfig_params->mfpCapable ? 1 : 0;
4335 profile->MFPRequired = pconfig_params->mfpRequired ? 1 : 0;
4336#endif
4337
4338 if (pconfig_params->probeRespIEsBufferLen > 0 &&
4339 pconfig_params->pProbeRespIEsBuffer != NULL) {
4340 profile->addIeParams.probeRespDataLen =
4341 pconfig_params->probeRespIEsBufferLen;
4342 profile->addIeParams.probeRespData_buff =
4343 pconfig_params->pProbeRespIEsBuffer;
4344 } else {
4345 profile->addIeParams.probeRespDataLen = 0;
4346 profile->addIeParams.probeRespData_buff = NULL;
4347 }
4348 /*assoc resp IE */
4349 if (pconfig_params->assocRespIEsLen > 0 &&
4350 pconfig_params->pAssocRespIEsBuffer != NULL) {
4351 profile->addIeParams.assocRespDataLen =
4352 pconfig_params->assocRespIEsLen;
4353 profile->addIeParams.assocRespData_buff =
4354 pconfig_params->pAssocRespIEsBuffer;
4355 } else {
4356 profile->addIeParams.assocRespDataLen = 0;
4357 profile->addIeParams.assocRespData_buff = NULL;
4358 }
4359
4360 if (pconfig_params->probeRespBcnIEsLen > 0 &&
4361 pconfig_params->pProbeRespBcnIEsBuffer != NULL) {
4362 profile->addIeParams.probeRespBCNDataLen =
4363 pconfig_params->probeRespBcnIEsLen;
4364 profile->addIeParams.probeRespBCNData_buff =
4365 pconfig_params->pProbeRespBcnIEsBuffer;
4366 } else {
4367 profile->addIeParams.probeRespBCNDataLen = 0;
4368 profile->addIeParams.probeRespBCNData_buff = NULL;
4369 }
4370 profile->sap_dot11mc = pconfig_params->sap_dot11mc;
4371
Agrawal Ashish06e76d22016-08-18 16:44:48 +05304372 if (pconfig_params->supported_rates.numRates) {
4373 qdf_mem_copy(profile->supported_rates.rate,
4374 pconfig_params->supported_rates.rate,
4375 pconfig_params->supported_rates.numRates);
4376 profile->supported_rates.numRates =
4377 pconfig_params->supported_rates.numRates;
4378 }
4379
4380 if (pconfig_params->extended_rates.numRates) {
4381 qdf_mem_copy(profile->extended_rates.rate,
4382 pconfig_params->extended_rates.rate,
4383 pconfig_params->extended_rates.numRates);
4384 profile->extended_rates.numRates =
4385 pconfig_params->extended_rates.numRates;
4386 }
4387
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004388 return eSAP_STATUS_SUCCESS; /* Success. */
4389}
4390
4391void sap_free_roam_profile(tCsrRoamProfile *profile)
4392{
4393 if (profile->pRSNReqIE) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304394 qdf_mem_free(profile->pRSNReqIE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004395 profile->pRSNReqIE = NULL;
4396 }
4397}
4398
Anurag Chouhan6d760662016-02-20 16:05:43 +05304399void sap_sort_mac_list(struct qdf_mac_addr *macList, uint8_t size)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004400{
4401 uint8_t outer, inner;
Anurag Chouhan6d760662016-02-20 16:05:43 +05304402 struct qdf_mac_addr temp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004403 int32_t nRes = -1;
4404
4405 if ((NULL == macList) || (size > MAX_ACL_MAC_ADDRESS)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304406 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004407 FL("either buffer is NULL or size = %d is more"), size);
4408 return;
4409 }
4410
4411 for (outer = 0; outer < size; outer++) {
4412 for (inner = 0; inner < size - 1; inner++) {
4413 nRes =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304414 qdf_mem_cmp((macList + inner)->bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004415 (macList + inner + 1)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304416 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004417 if (nRes > 0) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304418 qdf_mem_copy(temp.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004419 (macList + inner + 1)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304420 QDF_MAC_ADDR_SIZE);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304421 qdf_mem_copy((macList + inner + 1)->bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004422 (macList + inner)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304423 QDF_MAC_ADDR_SIZE);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304424 qdf_mem_copy((macList + inner)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304425 temp.bytes, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004426 }
4427 }
4428 }
4429}
4430
4431eSapBool
Anurag Chouhan6d760662016-02-20 16:05:43 +05304432sap_search_mac_list(struct qdf_mac_addr *macList,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004433 uint8_t num_mac, uint8_t *peerMac,
4434 uint8_t *index)
4435{
4436 int32_t nRes = -1;
4437 int8_t nStart = 0, nEnd, nMiddle;
4438 nEnd = num_mac - 1;
4439
4440 if ((NULL == macList) || (num_mac > MAX_ACL_MAC_ADDRESS)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304441 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004442 FL("either buffer is NULL or size = %d is more."), num_mac);
4443 return eSAP_FALSE;
4444 }
4445
4446 while (nStart <= nEnd) {
4447 nMiddle = (nStart + nEnd) / 2;
4448 nRes =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304449 qdf_mem_cmp(&macList[nMiddle], peerMac,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304450 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004451
4452 if (0 == nRes) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304453 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004454 "search SUCC");
4455 /* "index equals NULL" means the caller does not need the */
4456 /* index value of the peerMac being searched */
4457 if (index != NULL) {
4458 *index = (uint8_t) nMiddle;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304459 QDF_TRACE(QDF_MODULE_ID_SAP,
4460 QDF_TRACE_LEVEL_INFO_HIGH, "index %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004461 *index);
4462 }
4463 return eSAP_TRUE;
4464 }
4465 if (nRes < 0)
4466 nStart = nMiddle + 1;
4467 else
4468 nEnd = nMiddle - 1;
4469 }
4470
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304471 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004472 "search not succ");
4473 return eSAP_FALSE;
4474}
4475
Anurag Chouhan6d760662016-02-20 16:05:43 +05304476void sap_add_mac_to_acl(struct qdf_mac_addr *macList,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004477 uint8_t *size, uint8_t *peerMac)
4478{
4479 int32_t nRes = -1;
4480 int i;
4481
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304482 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004483 "add acl entered");
4484
4485 if (NULL == macList || *size == 0 || *size > MAX_ACL_MAC_ADDRESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304486 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004487 FL("either buffer is NULL or size = %d is incorrect."),
4488 *size);
4489 return;
4490 }
4491
4492 for (i = ((*size) - 1); i >= 0; i--) {
4493 nRes =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304494 qdf_mem_cmp(&macList[i], peerMac, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004495 if (nRes > 0) {
4496 /* Move alphabetically greater mac addresses one index down to allow for insertion
4497 of new mac in sorted order */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304498 qdf_mem_copy((macList + i + 1)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304499 (macList + i)->bytes, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004500 } else {
4501 break;
4502 }
4503 }
4504 /* 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 +05304505 qdf_mem_copy((macList + i + 1)->bytes, peerMac, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004506 /* increment the list size */
4507 (*size)++;
4508}
4509
Anurag Chouhan6d760662016-02-20 16:05:43 +05304510void sap_remove_mac_from_acl(struct qdf_mac_addr *macList,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004511 uint8_t *size, uint8_t index)
4512{
4513 int i;
4514
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304515 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004516 "remove acl entered");
4517 /*
4518 * Return if the list passed is empty. Ideally this should never happen
4519 * since this funcn is always called after sap_search_mac_list to get
4520 * the index of the mac addr to be removed and this will only get
4521 * called if the search is successful. Still no harm in having the check
4522 */
4523 if ((macList == NULL) || (*size == 0) ||
4524 (*size > MAX_ACL_MAC_ADDRESS)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304525 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004526 FL("either buffer is NULL or size %d is incorrect."),
4527 *size);
4528 return;
4529 }
4530 for (i = index; i < ((*size) - 1); i++) {
4531 /* Move mac addresses starting from "index" passed one index up to delete the void
4532 created by deletion of a mac address in ACL */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304533 qdf_mem_copy((macList + i)->bytes, (macList + i + 1)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05304534 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004535 }
4536 /* The last space should be made empty since all mac addesses moved one step up */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304537 qdf_mem_zero((macList + (*size) - 1)->bytes, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004538 /* reduce the list size by 1 */
4539 (*size)--;
4540}
4541
Anurag Chouhan6d760662016-02-20 16:05:43 +05304542void sap_print_acl(struct qdf_mac_addr *macList, uint8_t size)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004543{
4544 int i;
4545 uint8_t *macArray;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304546 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004547 "print acl entered");
4548
4549 if ((NULL == macList) || (size == 0) || (size >= MAX_ACL_MAC_ADDRESS)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304550 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004551 "In %s, either buffer is NULL or size %d is incorrect.",
4552 __func__, size);
4553 return;
4554 }
4555
4556 for (i = 0; i < size; i++) {
4557 macArray = (macList + i)->bytes;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304558 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004559 "** ACL entry %i - " MAC_ADDRESS_STR, i,
4560 MAC_ADDR_ARRAY(macArray));
4561 }
4562 return;
4563}
4564
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304565QDF_STATUS sap_is_peer_mac_allowed(ptSapContext sapContext, uint8_t *peerMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004566{
4567 if (eSAP_ALLOW_ALL == sapContext->eSapMacAddrAclMode)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304568 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004569
4570 if (sap_search_mac_list
4571 (sapContext->acceptMacList, sapContext->nAcceptMac, peerMac, NULL))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304572 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004573
4574 if (sap_search_mac_list
4575 (sapContext->denyMacList, sapContext->nDenyMac, peerMac, NULL)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304576 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004577 "In %s, Peer " MAC_ADDRESS_STR " in deny list",
4578 __func__, MAC_ADDR_ARRAY(peerMac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304579 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004580 }
4581 /* A new station CAN associate, unless in deny list. Less stringent mode */
4582 if (eSAP_ACCEPT_UNLESS_DENIED == sapContext->eSapMacAddrAclMode)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304583 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004584
4585 /* A new station CANNOT associate, unless in accept list. More stringent mode */
4586 if (eSAP_DENY_UNLESS_ACCEPTED == sapContext->eSapMacAddrAclMode) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304587 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004588 "In %s, Peer " MAC_ADDRESS_STR
4589 " denied, Mac filter mode is eSAP_DENY_UNLESS_ACCEPTED",
4590 __func__, MAC_ADDR_ARRAY(peerMac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304591 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004592 }
4593
4594 /* The new STA is neither in accept list nor in deny list. In this case, deny the association
4595 * but send a wifi event notification indicating the mac address being denied
4596 */
4597 if (eSAP_SUPPORT_ACCEPT_AND_DENY == sapContext->eSapMacAddrAclMode) {
4598 sap_signal_hdd_event(sapContext, NULL, eSAP_UNKNOWN_STA_JOIN,
4599 (void *) peerMac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304600 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004601 "In %s, Peer " MAC_ADDRESS_STR
4602 " denied, Mac filter mode is eSAP_SUPPORT_ACCEPT_AND_DENY",
4603 __func__, MAC_ADDR_ARRAY(peerMac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304604 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004605 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304606 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004607}
4608
4609#ifdef SOFTAP_CHANNEL_RANGE
4610/**
4611 * sap_get_channel_list() - get the list of channels
4612 * @sap_ctx: sap context
4613 * @ch_list: pointer to channel list array
4614 * @num_ch: pointer to number of channels.
4615 *
4616 * This function populates the list of channels for scanning.
4617 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304618 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004619 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304620static QDF_STATUS sap_get_channel_list(ptSapContext sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004621 uint8_t **ch_list,
4622 uint8_t *num_ch)
4623{
4624 uint8_t loop_count;
4625 uint8_t *list;
4626 uint8_t ch_count;
4627 uint8_t start_ch_num, band_start_ch;
4628 uint8_t end_ch_num, band_end_ch;
4629 uint32_t en_lte_coex;
4630 tHalHandle hal = CDS_GET_HAL_CB(sap_ctx->p_cds_gctx);
Dustin Brown0ce56d32016-10-17 16:18:03 -07004631#ifdef FEATURE_WLAN_CH_AVOID
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004632 uint8_t i;
4633#endif
4634 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
4635
4636 if (NULL == hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304637 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004638 FL("Invalid HAL pointer from p_cds_gctx"));
4639 *num_ch = 0;
4640 *ch_list = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304641 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004642 }
4643
4644 start_ch_num = sap_ctx->acs_cfg->start_ch;
4645 end_ch_num = sap_ctx->acs_cfg->end_ch;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304646 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004647 FL("startChannel %d, EndChannel %d, HW:%d"),
4648 start_ch_num, end_ch_num,
4649 sap_ctx->acs_cfg->hw_mode);
4650
4651 wlansap_extend_to_acs_range(&start_ch_num, &end_ch_num,
4652 &band_start_ch, &band_end_ch);
4653
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304654 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004655 FL("expanded startChannel %d,EndChannel %d"),
4656 start_ch_num, end_ch_num);
4657
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304658 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004659 FL("band_start_ch %d, band_end_ch %d"),
4660 band_start_ch, band_end_ch);
4661
4662 sme_cfg_get_int(hal, WNI_CFG_ENABLE_LTE_COEX, &en_lte_coex);
4663
4664 /* Check if LTE coex is enabled and 2.4GHz is selected */
Amar Singhalb8d4f152016-02-10 10:21:43 -08004665 if (en_lte_coex && (band_start_ch == CHAN_ENUM_1) &&
4666 (band_end_ch == CHAN_ENUM_14)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004667 /* Set 2.4GHz upper limit to channel 9 for LTE COEX */
Amar Singhalb8d4f152016-02-10 10:21:43 -08004668 band_end_ch = CHAN_ENUM_9;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004669 }
4670
4671 /* Allocate the max number of channel supported */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304672 list = (uint8_t *) qdf_mem_malloc(NUM_5GHZ_CHANNELS +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004673 NUM_24GHZ_CHANNELS);
4674 if (NULL == list) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304675 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004676 FL("Unable to allocate channel list"));
4677 *num_ch = 0;
4678 *ch_list = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304679 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004680 }
4681
4682 /* Search for the Active channels in the given range */
4683 ch_count = 0;
4684 for (loop_count = band_start_ch; loop_count <= band_end_ch;
4685 loop_count++) {
4686 /* go to next channel if rf_channel is out of range */
Amar Singhal7a1726a2015-10-14 16:28:11 -07004687 if ((start_ch_num > CDS_CHANNEL_NUM(loop_count)) ||
4688 (end_ch_num < CDS_CHANNEL_NUM(loop_count)))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004689 continue;
4690 /*
4691 * go to next channel if none of these condition pass
4692 * - DFS scan enabled and chan not in CHANNEL_STATE_DISABLE
4693 * - DFS scan disable but chan in CHANNEL_STATE_ENABLE
4694 */
4695 if (!(((eSAP_TRUE == mac_ctx->scan.fEnableDFSChnlScan) &&
Amar Singhal7a1726a2015-10-14 16:28:11 -07004696 CDS_CHANNEL_STATE(loop_count)) ||
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004697 ((eSAP_FALSE == mac_ctx->scan.fEnableDFSChnlScan) &&
4698 (CHANNEL_STATE_ENABLE ==
Amar Singhal7a1726a2015-10-14 16:28:11 -07004699 CDS_CHANNEL_STATE(loop_count)))))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004700 continue;
4701
4702#ifdef FEATURE_WLAN_CH_AVOID
Amar Singhalb8d4f152016-02-10 10:21:43 -08004703 for (i = 0; i < NUM_CHANNELS; i++) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004704 if ((safe_channels[i].channelNumber ==
Amar Singhal7a1726a2015-10-14 16:28:11 -07004705 CDS_CHANNEL_NUM(loop_count))) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004706 /* Check if channel is safe */
4707 if (true == safe_channels[i].isSafe) {
4708#endif
4709#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
4710 uint8_t ch;
Amar Singhal7a1726a2015-10-14 16:28:11 -07004711 ch = CDS_CHANNEL_NUM(loop_count);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004712 if ((sap_ctx->acs_cfg->skip_scan_status ==
4713 eSAP_DO_PAR_ACS_SCAN)) {
4714 if ((ch >= sap_ctx->acs_cfg->skip_scan_range1_stch &&
4715 ch <= sap_ctx->acs_cfg->skip_scan_range1_endch) ||
4716 (ch >= sap_ctx->acs_cfg->skip_scan_range2_stch &&
4717 ch <= sap_ctx->acs_cfg->skip_scan_range2_endch)) {
4718 list[ch_count] =
Amar Singhal7a1726a2015-10-14 16:28:11 -07004719 CDS_CHANNEL_NUM(loop_count);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004720 ch_count++;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304721 QDF_TRACE(QDF_MODULE_ID_SAP,
4722 QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004723 FL("%d %d added to ACS ch range"),
4724 ch_count, ch);
4725 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304726 QDF_TRACE(QDF_MODULE_ID_SAP,
4727 QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004728 FL("%d %d skipped from ACS ch range"),
4729 ch_count, ch);
4730 }
4731 } else {
4732 list[ch_count] =
Amar Singhal7a1726a2015-10-14 16:28:11 -07004733 CDS_CHANNEL_NUM(loop_count);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004734 ch_count++;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304735 QDF_TRACE(QDF_MODULE_ID_SAP,
4736 QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004737 FL("%d %d added to ACS ch range"),
4738 ch_count, ch);
4739 }
4740#else
Amar Singhal7a1726a2015-10-14 16:28:11 -07004741 list[ch_count] = CDS_CHANNEL_NUM(loop_count);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004742 ch_count++;
4743#endif
4744#ifdef FEATURE_WLAN_CH_AVOID
4745 }
4746 break;
4747 }
4748 }
4749#endif
4750 }
4751 if (0 == ch_count) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304752 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004753 FL("No active channels present for the current region"));
4754 /*
4755 * LTE COEX: channel range outside the restricted 2.4GHz
4756 * band limits
4757 */
4758 if (en_lte_coex && (start_ch_num > band_end_ch))
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304759 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004760 FL("SAP can't be started as due to LTE COEX"));
4761 }
4762
4763 /* return the channel list and number of channels to scan */
4764 *num_ch = ch_count;
4765 if (ch_count != 0) {
4766 *ch_list = list;
4767 } else {
4768 *ch_list = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304769 qdf_mem_free(list);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004770 }
4771
4772 for (loop_count = 0; loop_count < ch_count; loop_count++) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304773 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004774 FL("channel number: %d"), list[loop_count]);
4775 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304776 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004777}
4778#endif
4779
4780/*
4781 * Function for initializing list of 2.4/5 Ghz [NON-DFS/DFS]
4782 * available channels in the current regulatory domain.
4783 */
Kiran Kumar Lokere80897d82016-03-02 19:41:42 -08004784static QDF_STATUS sap_get_5ghz_channel_list(ptSapContext sapContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004785{
4786 uint8_t count = 0;
4787 int i;
Kiran Kumar Lokere80897d82016-03-02 19:41:42 -08004788 struct sir_pcl_list pcl;
4789 QDF_STATUS status;
4790 enum channel_state ch_state;
4791 pcl.pcl_len = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004792 if (NULL == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304793 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004794 "Invalid sapContext pointer on sap_get_channel_list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304795 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004796 }
4797
4798 if (sapContext->SapAllChnlList.channelList) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304799 qdf_mem_free(sapContext->SapAllChnlList.channelList);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004800 sapContext->SapAllChnlList.channelList = NULL;
4801 }
4802
4803 sapContext->SapAllChnlList.channelList =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05304804 (tChannelInfo *) qdf_mem_malloc(WNI_CFG_VALID_CHANNEL_LIST_LEN *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004805 sizeof(tChannelInfo));
4806 if (NULL == sapContext->SapAllChnlList.channelList) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304807 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004808 " Memory Allocation failed sap_get_channel_list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304809 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004810 }
Krunal Soni35fc8ea2016-10-26 18:52:38 -07004811 if (cds_mode_specific_connection_count(CDS_SAP_MODE, NULL) == 0) {
4812 status = cds_get_pcl(CDS_SAP_MODE,
4813 pcl.pcl_list, &pcl.pcl_len, pcl.weight_list,
4814 QDF_ARRAY_SIZE(pcl.weight_list));
4815 } else {
4816 status = cds_get_pcl_for_existing_conn(CDS_SAP_MODE,
4817 pcl.pcl_list, &pcl.pcl_len, pcl.weight_list,
4818 QDF_ARRAY_SIZE(pcl.weight_list));
4819 }
Kiran Kumar Lokere80897d82016-03-02 19:41:42 -08004820 if (status != QDF_STATUS_SUCCESS) {
Sandeep Puligilladb1c5902016-12-06 16:37:54 -08004821 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
4822 "Get PCL failed");
Kiran Kumar Lokere80897d82016-03-02 19:41:42 -08004823 return status;
4824 }
4825 for (i = 0; i <= pcl.pcl_len; i++) {
4826 if (CDS_IS_CHANNEL_5GHZ(pcl.pcl_list[i])) {
4827 ch_state = cds_get_channel_state(pcl.pcl_list[i]);
4828 if (!(ch_state == CHANNEL_STATE_ENABLE ||
4829 ch_state == CHANNEL_STATE_DFS))
4830 continue;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004831 sapContext->SapAllChnlList.channelList[count].channel =
Kiran Kumar Lokere80897d82016-03-02 19:41:42 -08004832 pcl.pcl_list[i];
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304833 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004834 "%s[%d] CHANNEL = %d", __func__, __LINE__,
Kiran Kumar Lokere80897d82016-03-02 19:41:42 -08004835 pcl.pcl_list[i]);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004836 sapContext->SapAllChnlList.channelList[count].valid =
4837 true;
4838 count++;
4839 }
4840 }
4841
4842 sapContext->SapAllChnlList.numChannel = count;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304843 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004844 "%s[%d] NUMBER OF CHANNELS count = %d"
4845 "sapContext->SapAllChnlList.numChannel = %d",
4846 __func__, __LINE__, count,
4847 sapContext->SapAllChnlList.numChannel);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05304848 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004849}
4850
4851/*
4852 * This function randomly selects the channel to switch after the detection
4853 * of radar
4854 * param sapContext - sap context
4855 * dfs_event - Dfs information from DFS
4856 * return - channel to which AP wishes to switch
4857 */
4858uint8_t sap_indicate_radar(ptSapContext sapContext,
4859 tSirSmeDfsEventInd *dfs_event)
4860{
4861 uint8_t target_channel = 0;
4862 tHalHandle hHal;
4863 tpAniSirGlobal pMac;
4864
4865 if (NULL == sapContext || NULL == dfs_event) {
4866 /* Invalid sap context of dfs event passed */
4867 return 0;
4868 }
4869 hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
4870
4871 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304872 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004873 "In %s invalid hHal", __func__);
4874 return 0;
4875 }
4876 pMac = PMAC_STRUCT(hHal);
4877
4878 if (!dfs_event->dfs_radar_status) {
4879 /*dfs status does not indicate a radar on the channel-- False Alarm */
4880 return 0;
4881 }
4882
4883 /*
4884 * SAP needs to generate Channel Switch IE
4885 * if the radar is found in the STARTED state
4886 */
4887 if (eSAP_STARTED == sapContext->sapsMachine)
4888 pMac->sap.SapDfsInfo.csaIERequired = eSAP_TRUE;
4889
4890 if (sapContext->csr_roamProfile.disableDFSChSwitch) {
4891 return sapContext->channel;
4892 }
4893
4894 /* set the Radar Found flag in SapDfsInfo */
4895 pMac->sap.SapDfsInfo.sap_radar_found_status = true;
4896
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004897 if (dfs_event->chan_list.nchannels > SIR_DFS_MAX_20M_SUB_CH) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304898 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004899 FL("nchannels >SIR_DFS_MAX_20M_SUB_CH so resetting"));
4900 dfs_event->chan_list.nchannels = SIR_DFS_MAX_20M_SUB_CH;
4901 }
4902
4903 sap_mark_dfs_channels(sapContext, dfs_event->chan_list.channels,
4904 dfs_event->chan_list.nchannels,
4905 cds_get_monotonic_boottime());
4906
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05304907 if (sapContext->chan_before_pre_cac) {
4908 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
4909 FL("sapdfs: set chan before pre cac %d as target chan"),
4910 sapContext->chan_before_pre_cac);
4911 return sapContext->chan_before_pre_cac;
4912 }
4913
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004914 /*
4915 * (1) skip static turbo channel as it will require STA to be in
4916 * static turbo to work.
4917 * (2) skip channel which's marked with radar detction
4918 * (3) WAR: we allow user to config not to use any DFS channel
4919 * (4) When we pick a channel, skip excluded 11D channels
4920 * (5) Create the available channel list with the above rules
4921 */
4922
4923 target_channel = sap_random_channel_sel(sapContext);
4924 if (0 == target_channel) {
4925 sap_signal_hdd_event(sapContext, NULL,
4926 eSAP_DFS_NO_AVAILABLE_CHANNEL,
4927 (void *) eSAP_STATUS_SUCCESS);
4928 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304929 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004930 FL("sapdfs: New selected target channel is [%d]"),
4931 target_channel);
4932 return target_channel;
4933}
4934
4935/*
4936 * CAC timer callback function.
4937 * Post eSAP_DFS_CHANNEL_CAC_END event to sap_fsm().
4938 */
4939void sap_dfs_cac_timer_callback(void *data)
4940{
4941 ptSapContext sapContext;
4942 tWLAN_SAPEvent sapEvent;
4943 tHalHandle hHal = (tHalHandle) data;
4944 tpAniSirGlobal pMac;
4945
4946 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304947 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004948 "In %s invalid hHal", __func__);
4949 return;
4950 }
4951 pMac = PMAC_STRUCT(hHal);
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05304952 sapContext = sap_find_cac_wait_session(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004953 if (NULL == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304954 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05304955 "%s: no SAP contexts in wait state", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004956 return;
4957 }
4958
Naveen Rawat6de46452016-06-08 10:02:26 -07004959 /*
4960 * SAP may not be in CAC wait state, when the timer runs out.
4961 * if following flag is set, then timer is in initialized state,
4962 * destroy timer here.
4963 */
4964 if (pMac->sap.SapDfsInfo.is_dfs_cac_timer_running == true) {
Anurag Chouhan210db072016-02-22 18:42:15 +05304965 qdf_mc_timer_destroy(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004966 pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = false;
Naveen Rawat6de46452016-06-08 10:02:26 -07004967 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004968
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05304969 /*
4970 * CAC Complete, post eSAP_DFS_CHANNEL_CAC_END to sap_fsm
4971 */
4972 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
4973 "sapdfs: Sending eSAP_DFS_CHANNEL_CAC_END for target_channel = %d on sapctx[%p]",
4974 sapContext->channel, sapContext);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004975
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05304976 sapEvent.event = eSAP_DFS_CHANNEL_CAC_END;
4977 sapEvent.params = 0;
4978 sapEvent.u1 = 0;
4979 sapEvent.u2 = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004980
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05304981 sap_fsm(sapContext, &sapEvent);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004982}
4983
4984/*
4985 * Function to stop the DFS CAC Timer
4986 */
4987static int sap_stop_dfs_cac_timer(ptSapContext sapContext)
4988{
4989 tHalHandle hHal;
4990 tpAniSirGlobal pMac;
4991 if (sapContext == NULL)
4992 return 0;
4993
4994 hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
4995 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05304996 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08004997 "In %s invalid hHal", __func__);
4998 return 0;
4999 }
5000 pMac = PMAC_STRUCT(hHal);
5001
Anurag Chouhan210db072016-02-22 18:42:15 +05305002 if (QDF_TIMER_STATE_RUNNING !=
5003 qdf_mc_timer_get_current_state(&pMac->sap.SapDfsInfo.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005004 sap_dfs_cac_timer)) {
5005 return 0;
5006 }
5007
Anurag Chouhan210db072016-02-22 18:42:15 +05305008 qdf_mc_timer_stop(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005009 pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = 0;
Naveen Rawat6de46452016-06-08 10:02:26 -07005010 qdf_mc_timer_destroy(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005011
5012 return 0;
5013}
5014
5015
5016/**
5017 * sap_is_channel_bonding_etsi_weather_channel() - check weather chan bonding.
5018 * @sap_context: SAP context
5019 *
5020 * Check if the current SAP operating channel is bonded to weather radar
5021 * channel in ETSI domain.
5022 *
5023 * Return: True if bonded to weather channel in ETSI
5024 */
5025static bool
5026sap_is_channel_bonding_etsi_weather_channel(ptSapContext sap_context)
5027{
5028 if (IS_CH_BONDING_WITH_WEATHER_CH(sap_context->channel) &&
5029 (sap_context->ch_params.ch_width != CH_WIDTH_20MHZ))
5030 return true;
5031
5032 return false;
5033}
5034
5035/*
5036 * Function to start the DFS CAC Timer
5037 * when SAP is started on a DFS channel
5038 */
5039int sap_start_dfs_cac_timer(ptSapContext sapContext)
5040{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305041 QDF_STATUS status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005042 uint32_t cacTimeOut;
5043 tHalHandle hHal = NULL;
5044 tpAniSirGlobal pMac = NULL;
Amar Singhal604ba6cf2016-07-27 15:29:51 -07005045 enum dfs_region dfs_region;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005046
5047 if (sapContext == NULL) {
5048 return 0;
5049 }
5050 hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
5051
5052 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305053 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005054 "In %s invalid hHal", __func__);
5055 return 0;
5056 }
5057 pMac = PMAC_STRUCT(hHal);
5058
5059 if (pMac->sap.SapDfsInfo.ignore_cac) {
5060 /*
5061 * If User has set to ignore the CAC
5062 * so, continue without CAC Timer.
5063 */
5064 return 2;
5065 }
5066 cacTimeOut = DEFAULT_CAC_TIMEOUT;
5067
5068 cds_get_dfs_region(&dfs_region);
5069
Amar Singhala7bb01b2016-01-27 11:31:59 -08005070 if ((dfs_region == DFS_ETSI_REGION)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005071 && ((IS_ETSI_WEATHER_CH(sapContext->channel)) ||
5072 (sap_is_channel_bonding_etsi_weather_channel(sapContext)))) {
5073 cacTimeOut = ETSI_WEATHER_CH_CAC_TIMEOUT;
5074 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305075 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005076 "sapdfs: SAP_DFS_CHANNEL_CAC_START on CH - %d, CAC TIMEOUT - %d sec",
5077 sapContext->channel, cacTimeOut / 1000);
5078
Anurag Chouhan210db072016-02-22 18:42:15 +05305079 qdf_mc_timer_init(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer,
Anurag Chouhan6d760662016-02-20 16:05:43 +05305080 QDF_TIMER_TYPE_SW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005081 sap_dfs_cac_timer_callback, (void *) hHal);
5082
5083 /*Start the CAC timer */
5084 status =
Anurag Chouhan210db072016-02-22 18:42:15 +05305085 qdf_mc_timer_start(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005086 cacTimeOut);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305087 if (status == QDF_STATUS_SUCCESS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005088 pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = true;
5089 return 1;
5090 } else {
Naveen Rawat6de46452016-06-08 10:02:26 -07005091 pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = false;
5092 qdf_mc_timer_destroy(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005093 return 0;
5094 }
5095}
5096
5097/*
5098 * This function initializes the NOL list
5099 * parameters required to track the radar
5100 * found DFS channels in the current Reg. Domain .
5101 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305102QDF_STATUS sap_init_dfs_channel_nol_list(ptSapContext sapContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005103{
5104 uint8_t count = 0;
5105 int i;
5106 bool bFound = false;
5107 tHalHandle hHal;
5108 tpAniSirGlobal pMac;
5109
5110 if (NULL == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305111 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005112 "Invalid sapContext pointer on sap_init_dfs_channel_nol_list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305113 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005114 }
5115 hHal = CDS_GET_HAL_CB(sapContext->p_cds_gctx);
5116
5117 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305118 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005119 "In %s invalid hHal", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305120 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005121 }
5122 pMac = PMAC_STRUCT(hHal);
5123
5124 /* to indicate hdd to get cnss dfs nol */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305125 if (QDF_STATUS_SUCCESS == sap_signal_hdd_event(sapContext, NULL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005126 eSAP_DFS_NOL_GET,
5127 (void *)
5128 eSAP_STATUS_SUCCESS)) {
5129 bFound = true;
5130 }
5131
Amar Singhalb8d4f152016-02-10 10:21:43 -08005132 for (i = CHAN_ENUM_36; i <= CHAN_ENUM_165; i++) {
Amar Singhal7a1726a2015-10-14 16:28:11 -07005133 if (CDS_CHANNEL_STATE(i) == CHANNEL_STATE_DFS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005134 /* if dfs nol is not found, initialize it */
5135 if (!bFound) {
5136 pMac->sap.SapDfsInfo.sapDfsChannelNolList[count]
5137 .dfs_channel_number =
Amar Singhal7a1726a2015-10-14 16:28:11 -07005138 CDS_CHANNEL_NUM(i);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005139
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305140 QDF_TRACE(QDF_MODULE_ID_SAP,
5141 QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005142 "%s: CHANNEL = %d", __func__,
5143 pMac->sap.SapDfsInfo.
5144 sapDfsChannelNolList[count].
5145 dfs_channel_number);
5146
5147 pMac->sap.SapDfsInfo.sapDfsChannelNolList[count]
5148 .radar_status_flag =
5149 eSAP_DFS_CHANNEL_USABLE;
5150 pMac->sap.SapDfsInfo.sapDfsChannelNolList[count]
5151 .radar_found_timestamp = 0;
5152 }
5153 count++;
5154 }
5155 }
5156
5157 pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels = count;
5158
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305159 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005160 "%s[%d] NUMBER OF DFS CHANNELS = %d",
5161 __func__, __LINE__,
5162 pMac->sap.SapDfsInfo.numCurrentRegDomainDfsChannels);
5163
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05305164 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005165}
5166
5167/*
5168 * This function will calculate how many interfaces
5169 * have sap persona and returns total number of sap persona.
5170 */
5171uint8_t sap_get_total_number_sap_intf(tHalHandle hHal)
5172{
5173 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5174 uint8_t intf = 0;
5175 uint8_t intf_count = 0;
5176
5177 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
Anurag Chouhan6d760662016-02-20 16:05:43 +05305178 if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005179 ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05305180 (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005181 && pMac->sap.sapCtxList[intf].pSapContext != NULL) {
5182 intf_count++;
5183 }
5184 }
5185 return intf_count;
5186}
5187
5188/*
5189 * This function will find the concurrent sap context apart from
5190 * passed sap context and return its channel change ready status
5191 */
5192bool is_concurrent_sap_ready_for_channel_change(tHalHandle hHal,
5193 ptSapContext sapContext)
5194{
5195 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
5196 ptSapContext pSapContext;
5197 uint8_t intf = 0;
5198
5199 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
Anurag Chouhan6d760662016-02-20 16:05:43 +05305200 if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005201 ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05305202 (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005203 && pMac->sap.sapCtxList[intf].pSapContext != NULL) {
5204 pSapContext =
5205 (ptSapContext) pMac->sap.sapCtxList[intf].
5206 pSapContext;
5207 if (pSapContext == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305208 QDF_TRACE(QDF_MODULE_ID_SAP,
5209 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005210 FL("sapCtx matched [%p]"),
5211 sapContext);
5212 continue;
5213 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05305214 QDF_TRACE(QDF_MODULE_ID_SAP,
5215 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08005216 FL
5217 ("concurrent sapCtx[%p] didn't matche with [%p]"),
5218 pSapContext, sapContext);
5219 return pSapContext->is_sap_ready_for_chnl_chng;
5220 }
5221 }
5222 }
5223 return false;
5224}