blob: 0a9a57a3d2cd8bf364cae68ebd21c7e001f8f606 [file] [log] [blame]
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001/*
wadesongc46581b2017-12-26 13:29:29 +08002 * Copyright (c) 2012-2018 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"
Arif Hussaincd151632017-02-11 16:57:19 -080046#include <wlan_dfs_tgt_api.h>
47#include <wlan_dfs_utils_api.h>
48#include <wlan_dfs_public_struct.h>
49#include <wlan_reg_services_api.h>
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080050/* Pick up the SME API definitions */
51#include "sme_api.h"
52/* Pick up the PMC API definitions */
53#include "cds_utils.h"
54#include "cds_ieee80211_common_i.h"
55#include "cds_reg_service.h"
Anurag Chouhanc5548422016-02-24 18:33:27 +053056#include "qdf_util.h"
Tushnim Bhattacharyya66348bd2017-03-09 15:02:10 -080057#include "wlan_policy_mgr_api.h"
Rachit Kankane2487f8f2017-04-19 14:30:19 +053058#include "cfg_api.h"
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -080059#include <wlan_objmgr_pdev_obj.h>
60#include <wlan_objmgr_vdev_obj.h>
61#include <wlan_utility.h>
Tushnim Bhattacharyya45ed04f2017-03-15 10:15:05 -070062#include <linux/netdevice.h>
63#include <net/cfg80211.h>
64#include <qca_vendor.h>
65#include <wlan_scan_ucfg_api.h>
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -070066#include "wlan_reg_services_api.h"
Tushnim Bhattacharyya45ed04f2017-03-15 10:15:05 -070067
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080068/*----------------------------------------------------------------------------
69 * Preprocessor Definitions and Constants
70 * -------------------------------------------------------------------------*/
71
72/*----------------------------------------------------------------------------
73 * Type Declarations
74 * -------------------------------------------------------------------------*/
75
76/*----------------------------------------------------------------------------
77 * Global Data Definitions
78 * -------------------------------------------------------------------------*/
79
80/*----------------------------------------------------------------------------
81 * External declarations for global context
82 * -------------------------------------------------------------------------*/
83#ifdef FEATURE_WLAN_CH_AVOID
84extern sapSafeChannelType safe_channels[];
85#endif /* FEATURE_WLAN_CH_AVOID */
86
87/*----------------------------------------------------------------------------
88 * Static Variable Definitions
89 * -------------------------------------------------------------------------*/
90
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080091/*----------------------------------------------------------------------------
92 * Static Function Declarations and Definitions
93 * -------------------------------------------------------------------------*/
94#ifdef SOFTAP_CHANNEL_RANGE
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -070095static QDF_STATUS sap_get_channel_list(struct sap_context *sapContext,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -080096 uint8_t **channelList,
97 uint8_t *numberOfChannels);
98#endif
99
100/*==========================================================================
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800101 FUNCTION sapStopDfsCacTimer
102
103 DESCRIPTION
104 Function to sttop the DFS CAC timer when SAP is stopped
105 DEPENDENCIES
106 NA.
107
108 PARAMETERS
109
110 IN
111 sapContext: SAP Context
112 RETURN VALUE
113 DFS Timer start status
114 SIDE EFFECTS
115 ============================================================================*/
116
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700117static int sap_stop_dfs_cac_timer(struct sap_context *sapContext);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800118
119/*==========================================================================
120 FUNCTION sapStartDfsCacTimer
121
122 DESCRIPTION
123 Function to start the DFS CAC timer when SAP is started on DFS Channel
124 DEPENDENCIES
125 NA.
126
127 PARAMETERS
128
129 IN
130 sapContext: SAP Context
131 RETURN VALUE
132 DFS Timer start status
133 SIDE EFFECTS
134 ============================================================================*/
135
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700136static int sap_start_dfs_cac_timer(struct sap_context *sapContext);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800137
138/** sap_hdd_event_to_string() - convert hdd event to string
139 * @event: eSapHddEvent event type
140 *
141 * This function converts eSapHddEvent into string
142 *
143 * Return: string for the @event.
144 */
145static uint8_t *sap_hdd_event_to_string(eSapHddEvent event)
146{
147 switch (event) {
148 CASE_RETURN_STRING(eSAP_START_BSS_EVENT);
149 CASE_RETURN_STRING(eSAP_STOP_BSS_EVENT);
150 CASE_RETURN_STRING(eSAP_STA_ASSOC_IND);
151 CASE_RETURN_STRING(eSAP_STA_ASSOC_EVENT);
152 CASE_RETURN_STRING(eSAP_STA_REASSOC_EVENT);
153 CASE_RETURN_STRING(eSAP_STA_DISASSOC_EVENT);
154 CASE_RETURN_STRING(eSAP_STA_SET_KEY_EVENT);
155 CASE_RETURN_STRING(eSAP_STA_MIC_FAILURE_EVENT);
156 CASE_RETURN_STRING(eSAP_ASSOC_STA_CALLBACK_EVENT);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800157 CASE_RETURN_STRING(eSAP_WPS_PBC_PROBE_REQ_EVENT);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800158 CASE_RETURN_STRING(eSAP_DISCONNECT_ALL_P2P_CLIENT);
159 CASE_RETURN_STRING(eSAP_MAC_TRIG_STOP_BSS_EVENT);
160 CASE_RETURN_STRING(eSAP_UNKNOWN_STA_JOIN);
161 CASE_RETURN_STRING(eSAP_MAX_ASSOC_EXCEEDED);
162 CASE_RETURN_STRING(eSAP_CHANNEL_CHANGE_EVENT);
163 CASE_RETURN_STRING(eSAP_DFS_CAC_START);
Mahesh Kumar Kalikot Veetil8d3cbee2017-05-28 18:25:47 -0700164 CASE_RETURN_STRING(eSAP_DFS_CAC_INTERRUPTED);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800165 CASE_RETURN_STRING(eSAP_DFS_CAC_END);
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +0530166 CASE_RETURN_STRING(eSAP_DFS_PRE_CAC_END);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800167 CASE_RETURN_STRING(eSAP_DFS_RADAR_DETECT);
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +0530168 CASE_RETURN_STRING(eSAP_DFS_RADAR_DETECT_DURING_PRE_CAC);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800169 CASE_RETURN_STRING(eSAP_DFS_NO_AVAILABLE_CHANNEL);
170#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
171 CASE_RETURN_STRING(eSAP_ACS_SCAN_SUCCESS_EVENT);
172#endif
173 CASE_RETURN_STRING(eSAP_ACS_CHANNEL_SELECTED);
Mahesh Kumar Kalikot Veetil8d3cbee2017-05-28 18:25:47 -0700174 CASE_RETURN_STRING(eSAP_ECSA_CHANGE_CHAN_IND);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800175 default:
176 return "eSAP_HDD_EVENT_UNKNOWN";
177 }
178}
179
180/*----------------------------------------------------------------------------
181 * Externalized Function Definitions
182 * -------------------------------------------------------------------------*/
183
184/*----------------------------------------------------------------------------
185 * Function Declarations and Documentation
186 * -------------------------------------------------------------------------*/
187
188/*==========================================================================
189 FUNCTION sap_event_init
190
191 DESCRIPTION
192 Function for initializing sWLAN_SAPEvent structure
193
194 DEPENDENCIES
195 NA.
196
197 PARAMETERS
198
199 IN
200 sapEvent : State machine event
201
202 RETURN VALUE
203
204 None
205
206 SIDE EFFECTS
207 ============================================================================*/
208static inline void sap_event_init(ptWLAN_SAPEvent sapEvent)
209{
210 sapEvent->event = eSAP_MAC_SCAN_COMPLETE;
211 sapEvent->params = 0;
212 sapEvent->u1 = 0;
213 sapEvent->u2 = 0;
214}
215
Wen Gong01a2c632018-04-11 18:34:55 +0800216#ifdef DFS_COMPONENT_ENABLE
Arif Hussaincd151632017-02-11 16:57:19 -0800217/**
218 * sap_random_channel_sel() - This function randomly pick up an available
219 * channel
220 * @sap_ctx: sap context.
221 *
222 * This function first eliminates invalid channel, then selects random channel
223 * using following algorithm:
224 *
225 * Return: channel number picked
226 **/
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700227static uint8_t sap_random_channel_sel(struct sap_context *sap_ctx)
Arif Hussaincd151632017-02-11 16:57:19 -0800228{
Arif Hussain4549efa2017-10-10 17:10:47 -0700229 uint8_t ch;
Arif Hussaincd151632017-02-11 16:57:19 -0800230 uint8_t ch_wd;
231 struct wlan_objmgr_pdev *pdev = NULL;
232 tHalHandle hal;
233 struct ch_params *ch_params;
234 uint32_t hw_mode;
235 tpAniSirGlobal mac_ctx;
236 struct dfs_acs_info acs_info = {0};
237
Jeff Johnsonc0db3842017-09-13 18:34:28 -0700238 hal = CDS_GET_HAL_CB();
Arif Hussaincd151632017-02-11 16:57:19 -0800239 if (!hal) {
240 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
241 FL("null hal"));
242 return 0;
243 }
244
245 mac_ctx = PMAC_STRUCT(hal);
246 if (!mac_ctx) {
247 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
248 FL("null mac_ctx"));
249 return 0;
250 }
251
252 pdev = mac_ctx->pdev;
253 if (!pdev) {
254 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
255 FL("null pdev"));
256 return 0;
257 }
258
259 ch_params = &mac_ctx->sap.SapDfsInfo.new_ch_params;
260 if (mac_ctx->sap.SapDfsInfo.orig_chanWidth == 0) {
261 ch_wd = sap_ctx->ch_width_orig;
262 mac_ctx->sap.SapDfsInfo.orig_chanWidth = ch_wd;
263 } else {
264 ch_wd = mac_ctx->sap.SapDfsInfo.orig_chanWidth;
265 }
266
267 ch_params->ch_width = ch_wd;
Liangwei Dongfc26cda2018-01-24 05:08:51 -0500268 if (sap_ctx->acs_cfg) {
269 acs_info.acs_mode = sap_ctx->acs_cfg->acs_mode;
270 acs_info.start_ch = sap_ctx->acs_cfg->start_ch;
271 acs_info.end_ch = sap_ctx->acs_cfg->end_ch;
272 } else {
273 acs_info.acs_mode = false;
274 }
Arif Hussain4549efa2017-10-10 17:10:47 -0700275 if (QDF_IS_STATUS_ERROR(utils_dfs_get_random_channel(
Arif Hussaincd151632017-02-11 16:57:19 -0800276 pdev, 0, ch_params, &hw_mode, &ch, &acs_info))) {
277 /* No available channel found */
278 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
279 FL("No available channel found!!!"));
280 sap_signal_hdd_event(sap_ctx, NULL,
281 eSAP_DFS_NO_AVAILABLE_CHANNEL,
282 (void *)eSAP_STATUS_SUCCESS);
283 return 0;
284 }
bings1f55b662018-01-18 14:35:36 +0800285 mac_ctx->sap.SapDfsInfo.new_chanWidth = ch_params->ch_width;
286 sap_ctx->ch_params.ch_width = ch_params->ch_width;
287 sap_ctx->ch_params.sec_ch_offset = ch_params->sec_ch_offset;
288 sap_ctx->ch_params.center_freq_seg0 = ch_params->center_freq_seg0;
289 sap_ctx->ch_params.center_freq_seg1 = ch_params->center_freq_seg1;
Arif Hussaincd151632017-02-11 16:57:19 -0800290 return ch;
291}
Wen Gong01a2c632018-04-11 18:34:55 +0800292#else
293static uint8_t sap_random_channel_sel(struct sap_context *sap_ctx)
294{
295 return 0;
296}
297#endif
Arif Hussaincd151632017-02-11 16:57:19 -0800298
Arif Hussain671a1902017-03-17 09:08:32 -0700299/**
300 * sap_is_channel_bonding_etsi_weather_channel() - check weather chan bonding.
301 * @sap_ctx: sap context
302 *
303 * Check if the current SAP operating channel is bonded to weather radar
304 * channel in ETSI domain.
305 *
306 * Return: True if bonded to weather channel in ETSI
307 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700308static bool
309sap_is_channel_bonding_etsi_weather_channel(struct sap_context *sap_ctx)
Arif Hussain671a1902017-03-17 09:08:32 -0700310{
311 if (IS_CH_BONDING_WITH_WEATHER_CH(sap_ctx->channel) &&
312 (sap_ctx->ch_params.ch_width != CH_WIDTH_20MHZ))
313 return true;
314
315 return false;
316}
317
bingsd60c0b42017-09-07 01:30:29 +0800318/*
319 * sap_get_bonding_channels() - get bonding channels from primary channel.
320 * @sapContext: Handle to SAP context.
321 * @channel: Channel to get bonded channels.
322 * @channels: Bonded channel list
323 * @size: Max bonded channels
324 * @chanBondState: The channel bonding mode of the passed channel.
325 *
326 * Return: Number of sub channels
327 */
328static uint8_t sap_get_bonding_channels(struct sap_context *sapContext,
329 uint8_t channel,
330 uint8_t *channels, uint8_t size,
331 ePhyChanBondState chanBondState)
332{
333 tHalHandle hHal = CDS_GET_HAL_CB();
334 tpAniSirGlobal pMac;
335 uint8_t numChannel;
336
337 if (channels == NULL)
338 return 0;
339
340 if (size < MAX_BONDED_CHANNELS)
341 return 0;
342
343 if (NULL != hHal)
344 pMac = PMAC_STRUCT(hHal);
345 else
346 return 0;
347
348 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
349 FL("cbmode: %d, channel: %d"), chanBondState, channel);
350
351 switch (chanBondState) {
352 case PHY_SINGLE_CHANNEL_CENTERED:
353 numChannel = 1;
354 channels[0] = channel;
355 break;
356 case PHY_DOUBLE_CHANNEL_HIGH_PRIMARY:
357 numChannel = 2;
358 channels[0] = channel - 4;
359 channels[1] = channel;
360 break;
361 case PHY_DOUBLE_CHANNEL_LOW_PRIMARY:
362 numChannel = 2;
363 channels[0] = channel;
364 channels[1] = channel + 4;
365 break;
366 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_LOW:
367 numChannel = 4;
368 channels[0] = channel;
369 channels[1] = channel + 4;
370 channels[2] = channel + 8;
371 channels[3] = channel + 12;
372 break;
373 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_LOW:
374 numChannel = 4;
375 channels[0] = channel - 4;
376 channels[1] = channel;
377 channels[2] = channel + 4;
378 channels[3] = channel + 8;
379 break;
380 case PHY_QUADRUPLE_CHANNEL_20MHZ_LOW_40MHZ_HIGH:
381 numChannel = 4;
382 channels[0] = channel - 8;
383 channels[1] = channel - 4;
384 channels[2] = channel;
385 channels[3] = channel + 4;
386 break;
387 case PHY_QUADRUPLE_CHANNEL_20MHZ_HIGH_40MHZ_HIGH:
388 numChannel = 4;
389 channels[0] = channel - 12;
390 channels[1] = channel - 8;
391 channels[2] = channel - 4;
392 channels[3] = channel;
393 break;
394 default:
395 numChannel = 1;
396 channels[0] = channel;
397 break;
398 }
399
400 return numChannel;
401}
402
Arif Hussain671a1902017-03-17 09:08:32 -0700403/**
Arif Hussain72edc592017-04-17 13:07:37 -0700404 * sap_ch_params_to_bonding_channels() - get bonding channels from channel param
405 * @ch_params: channel params ( bw, pri and sec channel info)
406 * @channels: bonded channel list
407 *
408 * Return: Number of sub channels
409 */
410static uint8_t sap_ch_params_to_bonding_channels(
411 struct ch_params *ch_params,
412 uint8_t *channels)
413{
414 uint8_t center_chan = ch_params->center_freq_seg0;
415 uint8_t nchannels = 0;
416
417 switch (ch_params->ch_width) {
418 case CH_WIDTH_160MHZ:
419 nchannels = 8;
420 center_chan = ch_params->center_freq_seg1;
421 channels[0] = center_chan - 14;
422 channels[1] = center_chan - 10;
423 channels[2] = center_chan - 6;
424 channels[3] = center_chan - 2;
425 channels[4] = center_chan + 2;
426 channels[5] = center_chan + 6;
427 channels[6] = center_chan + 10;
428 channels[7] = center_chan + 14;
429 break;
430 case CH_WIDTH_80P80MHZ:
431 nchannels = 8;
432 channels[0] = center_chan - 6;
433 channels[1] = center_chan - 2;
434 channels[2] = center_chan + 2;
435 channels[3] = center_chan + 6;
436
437 center_chan = ch_params->center_freq_seg1;
438 channels[4] = center_chan - 6;
439 channels[5] = center_chan - 2;
440 channels[6] = center_chan + 2;
441 channels[7] = center_chan + 6;
442 break;
443 case CH_WIDTH_80MHZ:
444 nchannels = 4;
445 channels[0] = center_chan - 6;
446 channels[1] = center_chan - 2;
447 channels[2] = center_chan + 2;
448 channels[3] = center_chan + 6;
449 break;
450 case CH_WIDTH_40MHZ:
451 nchannels = 2;
452 channels[0] = center_chan - 2;
453 channels[1] = center_chan + 2;
454 break;
455 default:
456 nchannels = 1;
457 channels[0] = center_chan;
458 break;
459 }
460
461 return nchannels;
462}
463
464/**
Arif Hussain671a1902017-03-17 09:08:32 -0700465 * sap_get_cac_dur_dfs_region() - get cac duration and dfs region.
466 * @sap_ctxt: sap context
467 * @cac_duration_ms: pointer to cac duration
468 * @dfs_region: pointer to dfs region
469 *
470 * Get cac duration and dfs region.
471 *
472 * Return: None
473 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700474static void sap_get_cac_dur_dfs_region(struct sap_context *sap_ctx,
Arif Hussain671a1902017-03-17 09:08:32 -0700475 uint32_t *cac_duration_ms,
476 uint32_t *dfs_region)
477{
Arif Hussain72edc592017-04-17 13:07:37 -0700478 int i;
479 uint8_t channels[MAX_BONDED_CHANNELS];
480 uint8_t num_channels;
481 struct ch_params *ch_params = &sap_ctx->ch_params;
Arif Hussain671a1902017-03-17 09:08:32 -0700482 tHalHandle hal = NULL;
483 tpAniSirGlobal mac = NULL;
484
Arif Hussain671a1902017-03-17 09:08:32 -0700485 if (!sap_ctx) {
486 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
487 "%s: null sap_ctx", __func__);
488 return;
489 }
490
Jeff Johnsonc0db3842017-09-13 18:34:28 -0700491 hal = CDS_GET_HAL_CB();
Arif Hussain671a1902017-03-17 09:08:32 -0700492 if (!hal) {
493 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
494 "%s: null hal", __func__);
495 return;
496 }
497
498 mac = PMAC_STRUCT(hal);
Amar Singhal7f55e342017-05-24 15:23:06 -0700499 wlan_reg_get_dfs_region(mac->pdev, dfs_region);
Arif Hussain671a1902017-03-17 09:08:32 -0700500 if (mac->sap.SapDfsInfo.ignore_cac) {
501 *cac_duration_ms = 0;
502 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
503 "%s: ignore_cac is set", __func__);
504 return;
505 }
Arif Hussain72edc592017-04-17 13:07:37 -0700506 *cac_duration_ms = DEFAULT_CAC_TIMEOUT;
Arif Hussain671a1902017-03-17 09:08:32 -0700507
Naveen Rawat9ec27ec2017-12-07 15:24:01 -0800508 if (*dfs_region != DFS_ETSI_REG) {
509 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
510 FL("sapdfs: defult cac duration"));
511 return;
512 }
513
Arif Hussain72edc592017-04-17 13:07:37 -0700514 if (sap_is_channel_bonding_etsi_weather_channel(sap_ctx)) {
Arif Hussain671a1902017-03-17 09:08:32 -0700515 *cac_duration_ms = ETSI_WEATHER_CH_CAC_TIMEOUT;
Arif Hussain72edc592017-04-17 13:07:37 -0700516 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
517 FL("sapdfs: bonding_etsi_weather_channel"));
518 return;
519 }
520
521 qdf_mem_zero(channels, sizeof(channels));
522 num_channels = sap_ch_params_to_bonding_channels(ch_params, channels);
523 for (i = 0; i < num_channels; i++) {
524 if (IS_ETSI_WEATHER_CH(channels[i])) {
525 *cac_duration_ms = ETSI_WEATHER_CH_CAC_TIMEOUT;
526 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
527 FL("sapdfs: ch=%d is etsi weather channel"),
528 channels[i]);
529 return;
530 }
531 }
532
Arif Hussain671a1902017-03-17 09:08:32 -0700533}
534
Arif Hussaincd151632017-02-11 16:57:19 -0800535void sap_dfs_set_current_channel(void *ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800536{
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700537 struct sap_context *sap_ctx = ctx;
Arif Hussaincd151632017-02-11 16:57:19 -0800538 uint32_t ic_flags = 0;
539 uint16_t ic_flagext = 0;
540 uint8_t ic_ieee = sap_ctx->channel;
Arif Hussain4e9afac2017-04-25 23:36:15 -0700541 uint16_t ic_freq = utils_dfs_chan_to_freq(sap_ctx->channel);
Arif Hussaincd151632017-02-11 16:57:19 -0800542 uint8_t vht_seg0 = sap_ctx->csr_roamProfile.ch_params.center_freq_seg0;
543 uint8_t vht_seg1 = sap_ctx->csr_roamProfile.ch_params.center_freq_seg1;
544 struct wlan_objmgr_pdev *pdev;
545 tpAniSirGlobal mac_ctx;
546 tHalHandle hal;
bings819bdea2017-12-27 16:05:44 +0800547 uint32_t use_nol = 0;
548 int error;
Arif Hussaincd151632017-02-11 16:57:19 -0800549
Jeff Johnsonc0db3842017-09-13 18:34:28 -0700550 hal = CDS_GET_HAL_CB();
Arif Hussaincd151632017-02-11 16:57:19 -0800551 if (!hal) {
552 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
553 FL("null hal"));
554 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800555 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800556
Arif Hussaincd151632017-02-11 16:57:19 -0800557 mac_ctx = PMAC_STRUCT(hal);
558 pdev = mac_ctx->pdev;
559 if (!pdev) {
560 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
561 FL("null pdev"));
562 return;
563 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800564
Arif Hussaincd151632017-02-11 16:57:19 -0800565 switch (sap_ctx->csr_roamProfile.ch_params.ch_width) {
566 case CH_WIDTH_20MHZ:
567 ic_flags |= IEEE80211_CHAN_VHT20;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800568 break;
Kiran Kumar Lokere999e58c2016-01-07 02:18:39 -0800569 case CH_WIDTH_40MHZ:
Arif Hussaincd151632017-02-11 16:57:19 -0800570 ic_flags |= IEEE80211_CHAN_VHT40PLUS;
571 break;
572 case CH_WIDTH_80MHZ:
573 ic_flags |= IEEE80211_CHAN_VHT80;
574 break;
575 case CH_WIDTH_80P80MHZ:
576 ic_flags |= IEEE80211_CHAN_VHT80_80;
577 break;
578 case CH_WIDTH_160MHZ:
579 ic_flags |= IEEE80211_CHAN_VHT160;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800580 break;
581 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530582 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Arif Hussaincd151632017-02-11 16:57:19 -0800583 FL("Invalid channel width=%d"),
584 sap_ctx->csr_roamProfile.ch_params.ch_width);
585 return;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800586 }
587
bings19bf84d2017-12-08 15:27:20 +0800588 if (WLAN_REG_IS_24GHZ_CH(sap_ctx->channel))
589 ic_flags |= IEEE80211_CHAN_2GHZ;
590 else
591 ic_flags |= IEEE80211_CHAN_5GHZ;
592
593 if (wlan_reg_is_dfs_ch(pdev, sap_ctx->channel))
594 ic_flagext |= IEEE80211_CHAN_DFS;
595
Arif Hussain4e9afac2017-04-25 23:36:15 -0700596 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
bings19bf84d2017-12-08 15:27:20 +0800597 FL("freq=%d, channel=%d, seg0=%d, seg1=%d, flags=0x%x, ext flags=0x%x"),
598 ic_freq, ic_ieee, vht_seg0, vht_seg1, ic_flags, ic_flagext);
Arif Hussain4e9afac2017-04-25 23:36:15 -0700599
Arif Hussaincd151632017-02-11 16:57:19 -0800600 tgt_dfs_set_current_channel(pdev, ic_freq, ic_flags,
601 ic_flagext, ic_ieee, vht_seg0, vht_seg1);
bings19bf84d2017-12-08 15:27:20 +0800602
603 if (wlan_reg_is_dfs_ch(pdev, sap_ctx->channel)) {
604 tgt_dfs_get_radars(pdev);
bings3fe5bc32018-03-14 11:45:36 +0800605 tgt_dfs_set_phyerr_filter_offload(pdev);
bings819bdea2017-12-27 16:05:44 +0800606 if (sap_ctx->csr_roamProfile.disableDFSChSwitch)
607 tgt_dfs_control(pdev, DFS_SET_USENOL, &use_nol,
608 sizeof(uint32_t), NULL, NULL, &error);
bings19bf84d2017-12-08 15:27:20 +0800609 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800610}
611
612/*
613 * FUNCTION sap_dfs_is_w53_invalid
614 *
615 * DESCRIPTION Checks if the passed channel is W53 and returns if
616 * SAP W53 opearation is allowed.
617 *
618 * DEPENDENCIES PARAMETERS
619 * IN hHAL : HAL pointer
620 * channelID: Channel Number to be verified
621 *
622 * RETURN VALUE : bool
623 * true: If W53 operation is disabled
624 * false: If W53 operation is enabled
625 *
626 * SIDE EFFECTS
627 */
628bool sap_dfs_is_w53_invalid(tHalHandle hHal, uint8_t channelID)
629{
630 tpAniSirGlobal pMac;
631
632 pMac = PMAC_STRUCT(hHal);
633 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530634 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800635 FL("invalid pMac"));
636 return false;
637 }
638
639 /*
640 * Check for JAPAN W53 Channel operation capability
641 */
642 if (true == pMac->sap.SapDfsInfo.is_dfs_w53_disabled &&
643 true == IS_CHAN_JAPAN_W53(channelID)) {
644 return true;
645 }
646
647 return false;
648}
649
650/*
651 * FUNCTION sap_dfs_is_channel_in_preferred_location
652 *
653 * DESCRIPTION Checks if the passed channel is in accordance with preferred
654 * Channel location settings.
655 *
656 * DEPENDENCIES PARAMETERS
657 * IN hHAL : HAL pointer
658 * channelID: Channel Number to be verified
659 *
660 * RETURN VALUE :bool
661 * true:If Channel location is same as the preferred location
662 * false:If Channel location is not same as the preferred location
663 *
664 * SIDE EFFECTS
665 */
666bool sap_dfs_is_channel_in_preferred_location(tHalHandle hHal, uint8_t channelID)
667{
668 tpAniSirGlobal pMac;
669
670 pMac = PMAC_STRUCT(hHal);
671 if (NULL == pMac) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530672 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800673 FL("invalid pMac"));
674 return true;
675 }
676 if ((SAP_CHAN_PREFERRED_INDOOR ==
677 pMac->sap.SapDfsInfo.sap_operating_chan_preferred_location) &&
678 (true == IS_CHAN_JAPAN_OUTDOOR(channelID))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530679 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800680 FL
681 ("CHAN=%d is Outdoor so invalid,preferred Indoor only"),
682 channelID);
683 return false;
684 } else if ((SAP_CHAN_PREFERRED_OUTDOOR ==
685 pMac->sap.SapDfsInfo.sap_operating_chan_preferred_location)
686 && (true == IS_CHAN_JAPAN_INDOOR(channelID))) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530687 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800688 FL
689 ("CHAN=%d is Indoor so invalid,preferred Outdoor only"),
690 channelID);
691 return false;
692 }
693
694 return true;
695}
696
697#ifdef FEATURE_AP_MCC_CH_AVOIDANCE
698/**
699 * sap_check_in_avoid_ch_list() - checks if given channel present is channel
700 * avoidance list
701 *
702 * @sap_ctx: sap context.
703 * @channel: channel to be checked in sap_ctx's avoid ch list
704 *
705 * sap_ctx contains sap_avoid_ch_info strcut containing the list of channels on
706 * which MDM device's AP with MCC was detected. This function checks if given
707 * channel is present in that list.
708 *
709 * Return: true, if channel was present, false othersie.
710 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700711bool sap_check_in_avoid_ch_list(struct sap_context *sap_ctx, uint8_t channel)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800712{
713 uint8_t i = 0;
714 struct sap_avoid_channels_info *ie_info =
715 &sap_ctx->sap_detected_avoid_ch_ie;
716 for (i = 0; i < sizeof(ie_info->channels); i++)
717 if (ie_info->channels[i] == channel)
718 return true;
719 return false;
720}
721#endif /* FEATURE_AP_MCC_CH_AVOIDANCE */
722
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800723/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800724 * sap_dfs_is_channel_in_nol_list() - given bonded channel is available
725 * @sap_context: Handle to SAP context.
726 * @channel_number: Channel on which availability should be checked.
727 * @chan_bondState: The channel bonding mode of the passed channel.
728 *
729 * This function Checks if a given bonded channel is available or
730 * usable for DFS operation.
731 *
732 * Return: false if channel is available, true if channel is in NOL.
733 */
734bool
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700735sap_dfs_is_channel_in_nol_list(struct sap_context *sap_context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800736 uint8_t channel_number,
737 ePhyChanBondState chan_bondState)
738{
Arif Hussaincd151632017-02-11 16:57:19 -0800739 int i;
Jeff Johnsonc0db3842017-09-13 18:34:28 -0700740 tHalHandle h_hal = CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800741 tpAniSirGlobal mac_ctx;
742 uint8_t channels[MAX_BONDED_CHANNELS];
743 uint8_t num_channels;
Arif Hussaincd151632017-02-11 16:57:19 -0800744 struct wlan_objmgr_pdev *pdev = NULL;
Arif Hussaincd151632017-02-11 16:57:19 -0800745 enum channel_state ch_state;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800746
Arif Hussaincd151632017-02-11 16:57:19 -0800747 if (!h_hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530748 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800749 FL("invalid h_hal"));
750 return false;
751 } else {
752 mac_ctx = PMAC_STRUCT(h_hal);
753 }
754
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800755 /* get the bonded channels */
bingsd60c0b42017-09-07 01:30:29 +0800756 if (channel_number == sap_context->channel && chan_bondState >=
757 PHY_CHANNEL_BONDING_STATE_MAX)
758 num_channels = sap_ch_params_to_bonding_channels(
bingsd1b43e52017-08-23 01:36:13 +0800759 &sap_context->ch_params, channels);
bingsd60c0b42017-09-07 01:30:29 +0800760 else
761 num_channels = sap_get_bonding_channels(sap_context,
762 channel_number, channels,
763 MAX_BONDED_CHANNELS, chan_bondState);
Arif Hussaincd151632017-02-11 16:57:19 -0800764
765 pdev = mac_ctx->pdev;
766 if (!pdev) {
767 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
768 FL("null pdev"));
769 return false;
770 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800771
772 /* check for NOL, first on will break the loop */
Arif Hussaincd151632017-02-11 16:57:19 -0800773 for (i = 0; i < num_channels; i++) {
774 ch_state = wlan_reg_get_channel_state(pdev, channels[i]);
775 if (CHANNEL_STATE_ENABLE != ch_state &&
776 CHANNEL_STATE_DFS != ch_state) {
777 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
778 FL("Invalid ch num=%d, ch state=%d"),
779 channels[i], ch_state);
780 return true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800781 }
Arif Hussaincd151632017-02-11 16:57:19 -0800782 } /* loop for bonded channels */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800783
784 return false;
785}
786
wadesong1795e142018-01-05 11:13:07 +0800787uint8_t sap_select_default_oper_chan(struct sap_acs_cfg *acs_cfg)
Selvaraj, Sridhar9a9266e2016-09-16 14:19:43 +0530788{
789 uint8_t channel;
790
wadesongc46581b2017-12-26 13:29:29 +0800791 if (NULL == acs_cfg) {
792 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
793 "ACS config invalid!");
794 QDF_BUG(0);
795 return 0;
796 }
797
wadesong1795e142018-01-05 11:13:07 +0800798 if (acs_cfg->hw_mode == eCSR_DOT11_MODE_11a) {
Selvaraj, Sridhar9a9266e2016-09-16 14:19:43 +0530799 channel = SAP_DEFAULT_5GHZ_CHANNEL;
wadesong1795e142018-01-05 11:13:07 +0800800 } else if ((acs_cfg->hw_mode == eCSR_DOT11_MODE_11n) ||
801 (acs_cfg->hw_mode == eCSR_DOT11_MODE_11n_ONLY) ||
802 (acs_cfg->hw_mode == eCSR_DOT11_MODE_11ac) ||
803 (acs_cfg->hw_mode == eCSR_DOT11_MODE_11ac_ONLY) ||
804 (acs_cfg->hw_mode == eCSR_DOT11_MODE_11ax) ||
805 (acs_cfg->hw_mode == eCSR_DOT11_MODE_11ax_ONLY)) {
wadesongc46581b2017-12-26 13:29:29 +0800806 if (WLAN_REG_IS_5GHZ_CH(acs_cfg->start_ch))
807 channel = SAP_DEFAULT_5GHZ_CHANNEL;
808 else
809 channel = SAP_DEFAULT_24GHZ_CHANNEL;
wadesong1795e142018-01-05 11:13:07 +0800810 } else {
Selvaraj, Sridhar9a9266e2016-09-16 14:19:43 +0530811 channel = SAP_DEFAULT_24GHZ_CHANNEL;
wadesong1795e142018-01-05 11:13:07 +0800812 }
Selvaraj, Sridhar9a9266e2016-09-16 14:19:43 +0530813
814 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
815 FL("channel selected to start bss %d"), channel);
816 return channel;
817}
818
819/**
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800820 * sap_goto_channel_sel - Function for initiating scan request for SME
821 * @sap_context: Sap Context value.
822 * @sap_event: State machine event
823 * @sap_do_acs_pre_start_bss: true, if ACS scan is issued pre start BSS
824 * false, if ACS scan is issued post start BSS.
Manishekar Chandrasekaran1db3abe2016-06-24 03:27:07 +0530825 * @check_for_connection_update: true, check and wait for connection update
826 * false, do not perform connection update
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800827 *
828 * Initiates sme scan for ACS to pick a channel.
829 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530830 * Return: The QDF_STATUS code associated with performing the operation.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800831 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -0700832QDF_STATUS sap_goto_channel_sel(struct sap_context *sap_context,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800833 ptWLAN_SAPEvent sap_event,
Manishekar Chandrasekaran1db3abe2016-06-24 03:27:07 +0530834 bool sap_do_acs_pre_start_bss,
835 bool check_for_connection_update)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800836{
837
838 /* Initiate a SCAN request */
Anurag Chouhanf04e84f2016-03-03 10:12:12 +0530839 QDF_STATUS qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800840 /* To be initialised if scan is required */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530841 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Manishekar Chandrasekaran1db3abe2016-06-24 03:27:07 +0530842 tpAniSirGlobal mac_ctx;
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800843 struct scan_start_request *req;
844 struct wlan_objmgr_vdev *vdev;
845 uint8_t i;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800846
847#ifdef SOFTAP_CHANNEL_RANGE
848 uint8_t *channel_list = NULL;
849 uint8_t num_of_channels = 0;
850#endif
851 tHalHandle h_hal;
852 uint8_t con_ch;
853
Anurag Chouhan6d760662016-02-20 16:05:43 +0530854 h_hal = cds_get_context(QDF_MODULE_ID_SME);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800855 if (NULL == h_hal) {
856 /* we have a serious problem */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530857 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800858 FL("invalid h_hal"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530859 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800860 }
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800861
Manishekar Chandrasekaran1db3abe2016-06-24 03:27:07 +0530862 mac_ctx = PMAC_STRUCT(h_hal);
863 if (NULL == mac_ctx) {
864 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
865 FL("Invalid MAC context"));
866 return QDF_STATUS_E_FAILURE;
867 }
Jayachandran Sreekumaran922477b2017-09-22 14:00:31 +0530868 if (policy_mgr_concurrent_beaconing_sessions_running(mac_ctx->psoc) ||
869 ((sap_context->cc_switch_mode ==
870 QDF_MCC_TO_SCC_SWITCH_FORCE_PREFERRED_WITHOUT_DISCONNECTION) &&
871 (policy_mgr_mode_specific_connection_count(mac_ctx->psoc,
872 PM_SAP_MODE, NULL) ||
873 policy_mgr_mode_specific_connection_count(mac_ctx->psoc,
874 PM_P2P_GO_MODE, NULL)))) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800875 con_ch =
876 sme_get_concurrent_operation_channel(h_hal);
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800877#ifdef FEATURE_WLAN_STA_AP_MODE_DFS_DISABLE
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800878 if (con_ch && sap_context->channel == AUTO_CHANNEL_SELECT) {
879 sap_context->dfs_ch_disable = true;
880 } else if (con_ch && sap_context->channel != con_ch &&
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -0700881 wlan_reg_is_dfs_ch(mac_ctx->pdev,
882 sap_context->channel)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530883 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800884 FL("MCC DFS not supported in AP_AP Mode"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530885 return QDF_STATUS_E_ABORTED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800886 }
Ryan Hsu4252a2f2016-01-05 11:18:24 -0800887#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800888#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
889 if (sap_context->cc_switch_mode !=
Liangwei Dong9cfaa702016-10-17 01:20:44 -0400890 QDF_MCC_TO_SCC_SWITCH_DISABLE &&
891 sap_context->channel) {
892 /*
893 * For ACS request ,the sapContext->channel is 0,
894 * we skip below overlap checking. When the ACS
895 * finish and SAPBSS start, the sapContext->channel
896 * will not be 0. Then the overlap checking will be
897 * reactivated.If we use sapContext->channel = 0
898 * to perform the overlap checking, an invalid overlap
899 * channel con_ch could becreated. That may cause
900 * SAP start failed.
901 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800902 con_ch = sme_check_concurrent_channel_overlap(h_hal,
903 sap_context->channel,
904 sap_context->csr_roamProfile.phyMode,
905 sap_context->cc_switch_mode);
Jayachandran Sreekumaran9f180422017-10-26 15:03:01 +0530906 if (con_ch && !(wlan_reg_is_dfs_ch(mac_ctx->pdev,
907 con_ch) &&
908 sap_context->cc_switch_mode ==
909 QDF_MCC_TO_SCC_SWITCH_FORCE_PREFERRED_WITHOUT_DISCONNECTION)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530910 QDF_TRACE(QDF_MODULE_ID_SAP,
911 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800912 "%s: Override ch %d to %d due to CC Intf",
913 __func__, sap_context->channel, con_ch);
914 sap_context->channel = con_ch;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -0700915 wlan_reg_set_channel_params(mac_ctx->pdev,
916 sap_context->channel, 0,
Kiran Kumar Lokere9d41f612016-05-11 19:41:44 -0700917 &sap_context->ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800918 }
919 }
920#endif
921 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800922
Ajit Pal Singh813383c2017-10-03 16:14:58 +0530923 if ((policy_mgr_get_concurrency_mode(mac_ctx->psoc) ==
924 (QDF_STA_MASK | QDF_SAP_MASK)) ||
925 (policy_mgr_get_concurrency_mode(mac_ctx->psoc) ==
926 (QDF_STA_MASK | QDF_P2P_GO_MASK))) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800927#ifdef FEATURE_WLAN_STA_AP_MODE_DFS_DISABLE
928 if (sap_context->channel == AUTO_CHANNEL_SELECT)
929 sap_context->dfs_ch_disable = true;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -0700930 else if (wlan_reg_is_dfs_ch(mac_ctx->pdev,
931 sap_context->channel)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530932 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800933 FL("DFS not supported in STA_AP Mode"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +0530934 return QDF_STATUS_E_ABORTED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800935 }
936#endif
937#ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
938 if (sap_context->cc_switch_mode !=
Liangwei Dong9cfaa702016-10-17 01:20:44 -0400939 QDF_MCC_TO_SCC_SWITCH_DISABLE &&
940 sap_context->channel) {
Chandrasekaran Manishekar068e25e2016-03-07 11:51:07 +0530941 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
942 FL("check for overlap: chan:%d mode:%d"),
943 sap_context->channel,
944 sap_context->csr_roamProfile.phyMode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800945 con_ch = sme_check_concurrent_channel_overlap(h_hal,
946 sap_context->channel,
947 sap_context->csr_roamProfile.phyMode,
948 sap_context->cc_switch_mode);
Jayachandran Sreekumaran9575dec2017-10-11 14:23:23 +0530949 if (sap_context->cc_switch_mode !=
950 QDF_MCC_TO_SCC_SWITCH_FORCE_PREFERRED_WITHOUT_DISCONNECTION) {
951 if (QDF_IS_STATUS_ERROR(
952 policy_mgr_valid_sap_conc_channel_check(
953 mac_ctx->psoc, &con_ch,
954 sap_context->channel))) {
955 QDF_TRACE(QDF_MODULE_ID_SAP,
956 QDF_TRACE_LEVEL_WARN,
957 FL("SAP can't start (no MCC)"));
958 return QDF_STATUS_E_ABORTED;
959 }
Tushnim Bhattacharyya9a929992017-06-18 00:59:09 -0700960 }
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -0700961 if (con_ch && !wlan_reg_is_dfs_ch(mac_ctx->pdev,
962 con_ch)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530963 QDF_TRACE(QDF_MODULE_ID_SAP,
964 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800965 "%s: Override ch %d to %d due to CC Intf",
966 __func__, sap_context->channel, con_ch);
967 sap_context->channel = con_ch;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -0700968 wlan_reg_set_channel_params(mac_ctx->pdev,
969 sap_context->channel, 0,
Kiran Kumar Lokere9d41f612016-05-11 19:41:44 -0700970 &sap_context->ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800971 }
972 }
973#endif
974 }
975
976 if (sap_context->channel == AUTO_CHANNEL_SELECT) {
977#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +0530978 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -0800979 FL("%s skip_acs_status = %d "), __func__,
980 sap_context->acs_cfg->skip_scan_status);
981 if (sap_context->acs_cfg->skip_scan_status !=
982 eSAP_SKIP_ACS_SCAN) {
983#endif
Sandeep Puligilla994f6202017-06-19 18:29:05 -0700984
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -0800985 req = qdf_mem_malloc(sizeof(*req));
986 if (!req) {
987 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
988 FL("Failed to allocate memory"));
989 return QDF_STATUS_E_NOMEM;
990 }
991 vdev = wlan_objmgr_get_vdev_by_macaddr_from_psoc(
992 mac_ctx->psoc,
993 sap_context->self_mac_addr,
994 WLAN_LEGACY_SME_ID);
Arif Hussain21ad4342017-12-21 12:00:54 -0800995 if (!vdev) {
996 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
997 FL("Invalid vdev objmgr"));
998 return QDF_STATUS_E_INVAL;
999 }
1000
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -08001001 ucfg_scan_init_default_params(vdev, req);
1002 req->scan_req.dwell_time_active = 0;
1003 req->scan_req.scan_id = ucfg_scan_get_scan_id(mac_ctx->psoc);
1004 req->scan_req.vdev_id = wlan_vdev_get_id(vdev);
1005 req->scan_req.scan_req_id = sap_context->req_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001006 sap_get_channel_list(sap_context, &channel_list,
1007 &num_of_channels);
1008#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
1009 if (num_of_channels != 0) {
1010#endif
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -08001011
Abhishek Singha394b6c2017-11-03 17:14:58 +05301012 req->scan_req.chan_list.num_chan = num_of_channels;
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -08001013 for (i = 0; i < num_of_channels; i++)
Abhishek Singha394b6c2017-11-03 17:14:58 +05301014 req->scan_req.chan_list.chan[i].freq =
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -08001015 wlan_chan_to_freq(channel_list[i]);
gaurank kathpalia16a721a2017-12-19 20:57:55 +05301016 if (sap_context->channelList) {
1017 qdf_mem_free(sap_context->channelList);
1018 sap_context->channelList = NULL;
1019 sap_context->num_of_channel = 0;
1020 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001021 sap_context->channelList = channel_list;
Liangwei Dongaef84342016-10-21 05:28:00 -04001022 sap_context->num_of_channel = num_of_channels;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001023 /* Set requestType to Full scan */
1024
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301025 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Sandeep Puligilla999ba332017-09-26 15:03:05 -07001026 FL("calling ucfg_scan_start"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001027#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
1028 if (sap_context->acs_cfg->skip_scan_status ==
1029 eSAP_DO_NEW_ACS_SCAN)
1030#endif
1031 sme_scan_flush_result(h_hal);
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -08001032 sap_context->sap_acs_pre_start_bss = sap_do_acs_pre_start_bss;
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -08001033 qdf_ret_status = ucfg_scan_start(req);
1034 wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID);
Sandeep Puligilla994f6202017-06-19 18:29:05 -07001035
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301036 if (QDF_STATUS_SUCCESS != qdf_ret_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301037 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Sandeep Puligilla999ba332017-09-26 15:03:05 -07001038 FL("scan request fail %d!!!"),
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301039 qdf_ret_status);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301040 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001041 FL("SAP Configuring default channel, Ch=%d"),
1042 sap_context->channel);
wadesong1795e142018-01-05 11:13:07 +08001043 sap_context->channel = sap_select_default_oper_chan(
wadesongc46581b2017-12-26 13:29:29 +08001044 sap_context->acs_cfg);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001045
1046#ifdef SOFTAP_CHANNEL_RANGE
1047 if (sap_context->channelList != NULL) {
1048 sap_context->channel =
1049 sap_context->channelList[0];
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301050 qdf_mem_free(sap_context->
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001051 channelList);
1052 sap_context->channelList = NULL;
Liangwei Dongaef84342016-10-21 05:28:00 -04001053 sap_context->num_of_channel = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001054 }
1055#endif
1056 if (true == sap_do_acs_pre_start_bss) {
1057 /*
1058 * In case of ACS req before start Bss,
1059 * return failure so that the calling
1060 * fucntion can use the default channel.
1061 */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301062 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001063 } else {
1064 /* Fill in the event structure */
1065 sap_event_init(sap_event);
1066 /* Handle event */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301067 qdf_status = sap_fsm(sap_context, sap_event);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001068 }
1069 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301070 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001071 FL("return sme_ScanReq, scanID=%d, Ch=%d"),
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -08001072 req->scan_req.scan_id,
Sandeep Puligilla0806e0f2017-03-06 19:25:47 -08001073 sap_context->channel);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001074 }
1075#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
1076 }
1077 } else {
1078 sap_context->acs_cfg->skip_scan_status = eSAP_SKIP_ACS_SCAN;
1079 }
1080
1081 if (sap_context->acs_cfg->skip_scan_status == eSAP_SKIP_ACS_SCAN) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301082 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001083 FL("## %s SKIPPED ACS SCAN"), __func__);
lifengc0fb61a2017-06-20 19:34:39 +08001084
1085 if (true == sap_do_acs_pre_start_bss)
1086 wlansap_pre_start_bss_acs_scan_callback(h_hal,
1087 sap_context, sap_context->sessionId, 0,
1088 eCSR_SCAN_SUCCESS);
1089 else
1090 wlansap_scan_callback(h_hal, sap_context,
1091 sap_context->sessionId, 0, eCSR_SCAN_SUCCESS);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001092 }
1093#endif
1094 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301095 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001096 FL("for configured channel, Ch= %d"),
1097 sap_context->channel);
Manishekar Chandrasekaran1db3abe2016-06-24 03:27:07 +05301098
Krunal Soni3091bcc2016-06-23 12:28:21 -07001099 if (check_for_connection_update) {
Manishekar Chandrasekaran1db3abe2016-06-24 03:27:07 +05301100 /* This wait happens in the hostapd context. The event
1101 * is set in the MC thread context.
1102 */
Tushnim Bhattacharyya66348bd2017-03-09 15:02:10 -08001103 qdf_status =
1104 policy_mgr_update_and_wait_for_connection_update(
1105 mac_ctx->psoc,
Manishekar Chandrasekaran1db3abe2016-06-24 03:27:07 +05301106 sap_context->sessionId,
1107 sap_context->channel,
Tushnim Bhattacharyya3b99f4b2018-03-26 14:19:24 -07001108 POLICY_MGR_UPDATE_REASON_START_AP);
Manishekar Chandrasekaran1db3abe2016-06-24 03:27:07 +05301109 if (QDF_IS_STATUS_ERROR(qdf_status))
1110 return qdf_status;
1111 }
1112
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001113 if (sap_do_acs_pre_start_bss == true) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301114 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001115 FL("ACS end due to Ch override. Sel Ch = %d"),
1116 sap_context->channel);
1117 sap_context->acs_cfg->pri_ch = sap_context->channel;
1118 sap_context->acs_cfg->ch_width =
1119 sap_context->ch_width_orig;
1120 sap_config_acs_result(h_hal, sap_context, 0);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301121 return QDF_STATUS_E_CANCELED;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001122 } else {
1123 /*
1124 * Fill in the event structure
1125 * Eventhough scan was not done,
1126 * means a user set channel was chosen
1127 */
1128 sap_event_init(sap_event);
1129 /* Handle event */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301130 qdf_status = sap_fsm(sap_context, sap_event);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001131 }
1132 }
1133
1134 /*
1135 * If scan failed, get default channel and advance state
1136 * machine as success with default channel
1137 *
1138 * Have to wait for the call back to be called to get the
1139 * channel cannot advance state machine here as said above
1140 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301141 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001142 FL("before exiting sap_goto_channel_sel channel=%d"),
1143 sap_context->channel);
1144
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301145 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001146}
1147
Peng Xu66162de2016-02-11 17:01:20 -08001148/**
Krunal Sonib01de792017-04-14 11:44:39 -07001149 * sap_find_valid_concurrent_session() - to find valid concurrent session
1150 * @hal: pointer to hal abstration layer
1151 *
1152 * This API will check if any valid concurrent SAP session is present
1153 *
1154 * Return: pointer to sap context of valid concurrent session
1155 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001156static struct sap_context *sap_find_valid_concurrent_session(tHalHandle hal)
Krunal Sonib01de792017-04-14 11:44:39 -07001157{
1158 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
1159 uint8_t intf = 0;
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001160 struct sap_context *sap_ctx;
Krunal Sonib01de792017-04-14 11:44:39 -07001161
1162 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
1163 if (((QDF_SAP_MODE ==
1164 mac_ctx->sap.sapCtxList[intf].sapPersona) ||
1165 (QDF_P2P_GO_MODE ==
1166 mac_ctx->sap.sapCtxList[intf].sapPersona)) &&
1167 mac_ctx->sap.sapCtxList[intf].pSapContext != NULL) {
1168 sap_ctx = mac_ctx->sap.sapCtxList[intf].pSapContext;
1169 if (sap_ctx->sapsMachine != eSAP_DISCONNECTED)
1170 return sap_ctx;
1171 }
1172 }
1173
1174 return NULL;
1175}
1176
1177static QDF_STATUS sap_clear_global_dfs_param(tHalHandle hal)
1178{
1179 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
1180
Krunal Soni074dd2c2017-04-14 14:57:34 -07001181 if (NULL != sap_find_valid_concurrent_session(hal)) {
1182 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
1183 "conc session exists, no need to clear dfs struct");
1184 return QDF_STATUS_SUCCESS;
Krunal Sonib01de792017-04-14 11:44:39 -07001185 }
Krunal Soni074dd2c2017-04-14 14:57:34 -07001186 /*
1187 * CAC timer will be initiated and started only when SAP starts
1188 * on DFS channel and it will be stopped and destroyed
1189 * immediately once the radar detected or timedout. So
1190 * as per design CAC timer should be destroyed after stop
1191 */
1192 if (mac_ctx->sap.SapDfsInfo.is_dfs_cac_timer_running) {
1193 qdf_mc_timer_stop(&mac_ctx->sap.SapDfsInfo.sap_dfs_cac_timer);
1194 mac_ctx->sap.SapDfsInfo.is_dfs_cac_timer_running = 0;
1195 qdf_mc_timer_destroy(
1196 &mac_ctx->sap.SapDfsInfo.sap_dfs_cac_timer);
1197 }
1198 mac_ctx->sap.SapDfsInfo.cac_state = eSAP_DFS_DO_NOT_SKIP_CAC;
1199 sap_cac_reset_notify(hal);
1200 qdf_mem_zero(&mac_ctx->sap, sizeof(mac_ctx->sap));
Krunal Sonib01de792017-04-14 11:44:39 -07001201
1202 return QDF_STATUS_SUCCESS;
1203}
1204
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001205QDF_STATUS sap_set_session_param(tHalHandle hal, struct sap_context *sapctx,
Krunal Sonib01de792017-04-14 11:44:39 -07001206 uint32_t session_id)
1207{
1208 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
1209
1210 sapctx->sessionId = session_id;
Krunal Sonib01de792017-04-14 11:44:39 -07001211 sapctx->is_pre_cac_on = false;
1212 sapctx->pre_cac_complete = false;
1213 sapctx->chan_before_pre_cac = 0;
1214 mac_ctx->sap.sapCtxList[sapctx->sessionId].sessionID =
1215 sapctx->sessionId;
1216 mac_ctx->sap.sapCtxList[sapctx->sessionId].pSapContext = sapctx;
1217 mac_ctx->sap.sapCtxList[sapctx->sessionId].sapPersona =
1218 sapctx->csr_roamProfile.csrPersona;
Krunal Soni074dd2c2017-04-14 14:57:34 -07001219 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Jeff Johnsona7c0ddb2017-09-18 08:14:12 -07001220 "%s: Initializing sapContext = %pK with session = %d", __func__,
Krunal Soni074dd2c2017-04-14 14:57:34 -07001221 sapctx, session_id);
Krunal Sonib01de792017-04-14 11:44:39 -07001222
1223 return QDF_STATUS_SUCCESS;
1224}
1225
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001226QDF_STATUS sap_clear_session_param(tHalHandle hal, struct sap_context *sapctx,
Krunal Sonib01de792017-04-14 11:44:39 -07001227 uint32_t session_id)
1228{
1229 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
1230
Sourav Mohapatraab088fa2018-01-08 16:25:05 +05301231 if (sapctx->sessionId >= SAP_MAX_NUM_SESSION)
1232 return QDF_STATUS_E_FAILURE;
1233
Krunal Sonib01de792017-04-14 11:44:39 -07001234 mac_ctx->sap.sapCtxList[sapctx->sessionId].sessionID =
Krunal Soni074dd2c2017-04-14 14:57:34 -07001235 CSR_SESSION_ID_INVALID;
Krunal Sonib01de792017-04-14 11:44:39 -07001236 mac_ctx->sap.sapCtxList[sapctx->sessionId].pSapContext = NULL;
1237 mac_ctx->sap.sapCtxList[sapctx->sessionId].sapPersona =
Krunal Soni074dd2c2017-04-14 14:57:34 -07001238 QDF_MAX_NO_OF_MODE;
Krunal Sonib01de792017-04-14 11:44:39 -07001239 sap_clear_global_dfs_param(hal);
Naveen Rawat09b96df2017-09-28 12:36:10 -07001240 sap_free_roam_profile(&sapctx->csr_roamProfile);
Jeff Johnson68163032017-09-13 20:14:04 -07001241 qdf_mem_zero(sapctx, sizeof(*sapctx));
Krunal Soni074dd2c2017-04-14 14:57:34 -07001242 sapctx->sessionId = CSR_SESSION_ID_INVALID;
1243 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Jeff Johnsona7c0ddb2017-09-18 08:14:12 -07001244 "%s: Initializing State: %d, sapContext value = %pK", __func__,
Krunal Soni074dd2c2017-04-14 14:57:34 -07001245 sapctx->sapsMachine, sapctx);
Krunal Sonib01de792017-04-14 11:44:39 -07001246
1247 return QDF_STATUS_SUCCESS;
1248}
1249
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001250/*==========================================================================
1251 FUNCTION sapGotoStarting
1252
1253 DESCRIPTION
1254 Function for initiating start bss request for SME
1255
1256 DEPENDENCIES
1257 NA.
1258
1259 PARAMETERS
1260
1261 IN
1262 sapContext : Sap Context value
1263 sapEvent : State machine event
1264 bssType : Type of bss to start, INRA AP
1265 status : Return the SAP status here
1266
1267 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301268 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001269
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301270 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001271
1272 SIDE EFFECTS
1273 ============================================================================*/
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001274static QDF_STATUS sap_goto_starting(struct sap_context *sapContext,
Jeff Johnson464f7ea2016-10-07 10:21:26 -07001275 ptWLAN_SAPEvent sapEvent,
1276 eCsrRoamBssType bssType)
Peng Xu66162de2016-02-11 17:01:20 -08001277{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001278 /* tHalHandle */
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001279 tHalHandle hHal = CDS_GET_HAL_CB();
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301280 QDF_STATUS qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001281
1282 /*- - - - - - - - TODO:once configs from hdd available - - - - - - - - -*/
1283 char key_material[32] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3,
1284 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, };
1285 sapContext->key_type = 0x05;
1286 sapContext->key_length = 32;
Peng Xu66162de2016-02-11 17:01:20 -08001287 /* Need a key size define */
1288 qdf_mem_copy(sapContext->key_material, key_material,
1289 sizeof(key_material));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001290
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001291 if (NULL == hHal) {
1292 /* we have a serious problem */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301293 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001294 "In %s, invalid hHal", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301295 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001296 }
1297
Srinivas Girigowda678586c2017-03-10 00:13:58 -08001298 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, "%s: session: %d",
Peng Xu66162de2016-02-11 17:01:20 -08001299 __func__, sapContext->sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001300
Peng Xu66162de2016-02-11 17:01:20 -08001301 qdf_ret_status = sme_roam_connect(hHal, sapContext->sessionId,
1302 &sapContext->csr_roamProfile,
1303 &sapContext->csr_roamId);
1304 if (QDF_STATUS_SUCCESS != qdf_ret_status)
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301305 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Peng Xu66162de2016-02-11 17:01:20 -08001306 "%s: Failed to issue sme_roam_connect", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001307
Peng Xu66162de2016-02-11 17:01:20 -08001308 return qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001309} /* sapGotoStarting */
1310
1311/*==========================================================================
1312 FUNCTION sapGotoDisconnecting
1313
1314 DESCRIPTION
1315 Processing of SAP FSM Disconnecting state
1316
1317 DEPENDENCIES
1318 NA.
1319
1320 PARAMETERS
1321
1322 IN
1323 sapContext : Sap Context value
1324 status : Return the SAP status here
1325
1326 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301327 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001328
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301329 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001330
1331 SIDE EFFECTS
1332 ============================================================================*/
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001333static QDF_STATUS sap_goto_disconnecting(struct sap_context *sapContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001334{
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301335 QDF_STATUS qdf_ret_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001336 tHalHandle hHal;
1337
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001338 hHal = CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001339 if (NULL == hHal) {
1340 /* we have a serious problem */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301341 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001342 "In %s, invalid hHal", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301343 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001344 }
1345
1346 sap_free_roam_profile(&sapContext->csr_roamProfile);
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301347 qdf_ret_status = sme_roam_stop_bss(hHal, sapContext->sessionId);
1348 if (QDF_STATUS_SUCCESS != qdf_ret_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301349 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001350 "Error: In %s calling sme_roam_stop_bss status = %d",
Anurag Chouhanf04e84f2016-03-03 10:12:12 +05301351 __func__, qdf_ret_status);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301352 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001353 }
1354
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301355 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001356}
1357
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001358/*==========================================================================
1359 FUNCTION sapGotoDisconnected
1360
1361 DESCRIPTION
1362 Function for setting the SAP FSM to Disconnection state
1363
1364 DEPENDENCIES
1365 NA.
1366
1367 PARAMETERS
1368
1369 IN
1370 sapContext : Sap Context value
1371 sapEvent : State machine event
1372 status : Return the SAP status here
1373
1374 RETURN VALUE
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301375 The QDF_STATUS code associated with performing the operation
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001376
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301377 QDF_STATUS_SUCCESS: Success
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001378
1379 SIDE EFFECTS
1380 ============================================================================*/
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001381static QDF_STATUS sap_goto_disconnected(struct sap_context *sapContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001382{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301383 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001384 tWLAN_SAPEvent sapEvent;
1385 /* Processing has to be coded */
1386 /* Clean up stations from TL etc as AP BSS is shut down then set event */
1387 sapEvent.event = eSAP_MAC_READY_FOR_CONNECTIONS; /* hardcoded */
1388 sapEvent.params = 0;
1389 sapEvent.u1 = 0;
1390 sapEvent.u2 = 0;
1391 /* Handle event */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301392 qdf_status = sap_fsm(sapContext, &sapEvent);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001393
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301394 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001395}
1396
Liangwei Dongaef84342016-10-21 05:28:00 -04001397#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
1398/**
1399 * sap_handle_acs_scan_event() - handle acs scan event for SAP
1400 * @sap_context: ptSapContext
1401 * @sap_event: tSap_Event
1402 * @status: status of acs scan
1403 *
1404 * The function is to handle the eSAP_ACS_SCAN_SUCCESS_EVENT event.
1405 *
1406 * Return: void
1407 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001408static void sap_handle_acs_scan_event(struct sap_context *sap_context,
Liangwei Dongaef84342016-10-21 05:28:00 -04001409 tSap_Event *sap_event, eSapStatus status)
1410{
1411 sap_event->sapHddEventCode = eSAP_ACS_SCAN_SUCCESS_EVENT;
1412 sap_event->sapevt.sap_acs_scan_comp.status = status;
1413 sap_event->sapevt.sap_acs_scan_comp.num_of_channels =
1414 sap_context->num_of_channel;
1415 sap_event->sapevt.sap_acs_scan_comp.channellist =
1416 sap_context->channelList;
1417}
1418#else
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001419static void sap_handle_acs_scan_event(struct sap_context *sap_context,
Liangwei Dongaef84342016-10-21 05:28:00 -04001420 tSap_Event *sap_event, eSapStatus status)
1421{
1422}
1423#endif
1424
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001425/**
1426 * sap_signal_hdd_event() - send event notification
1427 * @sap_ctx: Sap Context
1428 * @csr_roaminfo: Pointer to CSR roam information
1429 * @sap_hddevent: SAP HDD event
1430 * @context: to pass the element for future support
1431 *
1432 * Function for HDD to send the event notification using callback
1433 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301434 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001435 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001436QDF_STATUS sap_signal_hdd_event(struct sap_context *sap_ctx,
Jeff Johnson172237b2017-11-07 15:32:59 -08001437 struct csr_roam_info *csr_roaminfo, eSapHddEvent sap_hddevent,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001438 void *context)
1439{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301440 QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001441 tSap_Event sap_ap_event; /* This now encodes ALL event types */
Jeff Johnsonc0db3842017-09-13 18:34:28 -07001442 tHalHandle hal = CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001443 tpAniSirGlobal mac_ctx;
1444 tSirSmeChanInfo *chaninfo;
1445 tSap_StationAssocIndication *assoc_ind;
1446 tSap_StartBssCompleteEvent *bss_complete;
1447 struct sap_ch_selected_s *acs_selected;
1448 tSap_StationAssocReassocCompleteEvent *reassoc_complete;
1449 tSap_StationDisassocCompleteEvent *disassoc_comp;
1450 tSap_StationSetKeyCompleteEvent *key_complete;
1451 tSap_StationMICFailureEvent *mic_failure;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001452
1453 /* Format the Start BSS Complete event to return... */
1454 if (NULL == sap_ctx->pfnSapEventCallback) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301455 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001456 }
1457 if (NULL == hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301458 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001459 FL("Invalid hal"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301460 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001461 }
1462 mac_ctx = PMAC_STRUCT(hal);
1463 if (NULL == mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301464 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001465 FL("Invalid MAC context"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301466 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001467 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301468 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001469 FL("SAP event callback event = %s"),
1470 sap_hdd_event_to_string(sap_hddevent));
1471
1472 switch (sap_hddevent) {
1473 case eSAP_STA_ASSOC_IND:
Arif Hussain165aa4c2016-10-25 14:21:53 -07001474 if (!csr_roaminfo) {
1475 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1476 FL("Invalid CSR Roam Info"));
1477 return QDF_STATUS_E_INVAL;
1478 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001479 /* TODO - Indicate the assoc request indication to OS */
1480 sap_ap_event.sapHddEventCode = eSAP_STA_ASSOC_IND;
1481 assoc_ind = &sap_ap_event.sapevt.sapAssocIndication;
1482
Anurag Chouhanc5548422016-02-24 18:33:27 +05301483 qdf_copy_macaddr(&assoc_ind->staMac, &csr_roaminfo->peerMac);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001484 assoc_ind->staId = csr_roaminfo->staId;
1485 assoc_ind->status = 0;
1486 /* Required for indicating the frames to upper layer */
1487 assoc_ind->beaconLength = csr_roaminfo->beaconLength;
1488 assoc_ind->beaconPtr = csr_roaminfo->beaconPtr;
1489 assoc_ind->assocReqLength = csr_roaminfo->assocReqLength;
1490 assoc_ind->assocReqPtr = csr_roaminfo->assocReqPtr;
1491 assoc_ind->fWmmEnabled = csr_roaminfo->wmmEnabledSta;
gaolez7bb1e742017-03-21 16:37:38 +08001492 assoc_ind->ecsa_capable = csr_roaminfo->ecsa_capable;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001493 if (csr_roaminfo->u.pConnectedProfile != NULL) {
1494 assoc_ind->negotiatedAuthType =
1495 csr_roaminfo->u.pConnectedProfile->AuthType;
1496 assoc_ind->negotiatedUCEncryptionType =
1497 csr_roaminfo->u.pConnectedProfile->EncryptionType;
1498 assoc_ind->negotiatedMCEncryptionType =
1499 csr_roaminfo->u.pConnectedProfile->mcEncryptionType;
1500 assoc_ind->fAuthRequired = csr_roaminfo->fAuthRequired;
1501 }
1502 break;
1503 case eSAP_START_BSS_EVENT:
1504 sap_ap_event.sapHddEventCode = eSAP_START_BSS_EVENT;
1505 bss_complete = &sap_ap_event.sapevt.sapStartBssCompleteEvent;
1506
1507 bss_complete->status = (eSapStatus) context;
bings29724712017-03-15 01:40:50 +08001508 bss_complete->staId = sap_ctx->sap_sta_id;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001509
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301510 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001511 FL("(eSAP_START_BSS_EVENT): staId = %d"),
1512 bss_complete->staId);
1513
1514 bss_complete->operatingChannel = (uint8_t) sap_ctx->channel;
1515 bss_complete->sessionId = sap_ctx->sessionId;
1516 break;
1517 case eSAP_DFS_CAC_START:
1518 case eSAP_DFS_CAC_INTERRUPTED:
1519 case eSAP_DFS_CAC_END:
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301520 case eSAP_DFS_PRE_CAC_END:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001521 case eSAP_DFS_RADAR_DETECT:
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301522 case eSAP_DFS_RADAR_DETECT_DURING_PRE_CAC:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001523 case eSAP_DFS_NO_AVAILABLE_CHANNEL:
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001524 sap_ap_event.sapHddEventCode = sap_hddevent;
1525 sap_ap_event.sapevt.sapStopBssCompleteEvent.status =
1526 (eSapStatus) context;
1527 break;
Liangwei Dongaef84342016-10-21 05:28:00 -04001528 case eSAP_ACS_SCAN_SUCCESS_EVENT:
1529 sap_handle_acs_scan_event(sap_ctx, &sap_ap_event,
1530 (eSapStatus)context);
1531 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001532 case eSAP_ACS_CHANNEL_SELECTED:
1533 sap_ap_event.sapHddEventCode = sap_hddevent;
1534 acs_selected = &sap_ap_event.sapevt.sap_ch_selected;
1535 if (eSAP_STATUS_SUCCESS == (eSapStatus)context) {
1536 acs_selected->pri_ch = sap_ctx->acs_cfg->pri_ch;
1537 acs_selected->ht_sec_ch = sap_ctx->acs_cfg->ht_sec_ch;
1538 acs_selected->ch_width = sap_ctx->acs_cfg->ch_width;
1539 acs_selected->vht_seg0_center_ch =
1540 sap_ctx->acs_cfg->vht_seg0_center_ch;
1541 acs_selected->vht_seg1_center_ch =
1542 sap_ctx->acs_cfg->vht_seg1_center_ch;
1543 } else if (eSAP_STATUS_FAILURE == (eSapStatus)context) {
1544 acs_selected->pri_ch = 0;
1545 }
1546 break;
1547
1548 case eSAP_STOP_BSS_EVENT:
1549 sap_ap_event.sapHddEventCode = eSAP_STOP_BSS_EVENT;
1550 sap_ap_event.sapevt.sapStopBssCompleteEvent.status =
1551 (eSapStatus) context;
1552 break;
1553
1554 case eSAP_STA_ASSOC_EVENT:
1555 case eSAP_STA_REASSOC_EVENT:
Arif Hussain165aa4c2016-10-25 14:21:53 -07001556
1557 if (!csr_roaminfo) {
1558 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1559 FL("Invalid CSR Roam Info"));
1560 return QDF_STATUS_E_INVAL;
1561 }
wadesonga8637bb2018-01-23 15:11:19 +08001562 if (eSAP_DISCONNECTING == sap_ctx->sapsMachine) {
1563 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1564 "SAP is disconnecting, not able to handle any incoming (re)assoc req");
1565 return QDF_STATUS_E_ABORTED;
1566 }
1567
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001568 reassoc_complete =
1569 &sap_ap_event.sapevt.sapStationAssocReassocCompleteEvent;
1570
1571 if (csr_roaminfo->fReassocReq)
1572 sap_ap_event.sapHddEventCode = eSAP_STA_REASSOC_EVENT;
1573 else
1574 sap_ap_event.sapHddEventCode = eSAP_STA_ASSOC_EVENT;
1575
Anurag Chouhanc5548422016-02-24 18:33:27 +05301576 qdf_copy_macaddr(&reassoc_complete->staMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001577 &csr_roaminfo->peerMac);
1578 reassoc_complete->staId = csr_roaminfo->staId;
1579 reassoc_complete->statusCode = csr_roaminfo->statusCode;
1580 reassoc_complete->iesLen = csr_roaminfo->rsnIELen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301581 qdf_mem_copy(reassoc_complete->ies, csr_roaminfo->prsnIE,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001582 csr_roaminfo->rsnIELen);
1583
1584#ifdef FEATURE_WLAN_WAPI
1585 if (csr_roaminfo->wapiIELen) {
1586 uint8_t len = reassoc_complete->iesLen;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07001587
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001588 reassoc_complete->iesLen += csr_roaminfo->wapiIELen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301589 qdf_mem_copy(&reassoc_complete->ies[len],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001590 csr_roaminfo->pwapiIE,
1591 csr_roaminfo->wapiIELen);
1592 }
1593#endif
1594 if (csr_roaminfo->addIELen) {
1595 uint8_t len = reassoc_complete->iesLen;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07001596
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001597 reassoc_complete->iesLen += csr_roaminfo->addIELen;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301598 qdf_mem_copy(&reassoc_complete->ies[len],
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001599 csr_roaminfo->paddIE,
1600 csr_roaminfo->addIELen);
Naveen Rawat08db88f2017-09-08 15:07:48 -07001601 if (wlan_get_vendor_ie_ptr_from_oui(
Rachit Kankane2487f8f2017-04-19 14:30:19 +05301602 SIR_MAC_P2P_OUI, SIR_MAC_P2P_OUI_SIZE,
1603 csr_roaminfo->paddIE, csr_roaminfo->addIELen)) {
1604 reassoc_complete->staType = eSTA_TYPE_P2P_CLI;
1605 } else {
1606 reassoc_complete->staType = eSTA_TYPE_INFRA;
1607 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001608 }
1609
1610 /* also fill up the channel info from the csr_roamInfo */
1611 chaninfo = &reassoc_complete->chan_info;
1612
1613 chaninfo->chan_id = csr_roaminfo->chan_info.chan_id;
1614 chaninfo->mhz = csr_roaminfo->chan_info.mhz;
1615 chaninfo->info = csr_roaminfo->chan_info.info;
1616 chaninfo->band_center_freq1 =
1617 csr_roaminfo->chan_info.band_center_freq1;
1618 chaninfo->band_center_freq2 =
1619 csr_roaminfo->chan_info.band_center_freq2;
1620 chaninfo->reg_info_1 =
1621 csr_roaminfo->chan_info.reg_info_1;
1622 chaninfo->reg_info_2 =
1623 csr_roaminfo->chan_info.reg_info_2;
Kanchanapally, Vidyullathae3062812015-05-22 17:28:57 +05301624 chaninfo->nss = csr_roaminfo->chan_info.nss;
1625 chaninfo->rate_flags = csr_roaminfo->chan_info.rate_flags;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001626
1627 reassoc_complete->wmmEnabled = csr_roaminfo->wmmEnabledSta;
1628 reassoc_complete->status = (eSapStatus) context;
1629 reassoc_complete->timingMeasCap = csr_roaminfo->timingMeasCap;
Will Huang558f8082017-05-31 16:22:24 +08001630 reassoc_complete->ampdu = csr_roaminfo->ampdu;
1631 reassoc_complete->sgi_enable = csr_roaminfo->sgi_enable;
1632 reassoc_complete->tx_stbc = csr_roaminfo->tx_stbc;
1633 reassoc_complete->rx_stbc = csr_roaminfo->rx_stbc;
1634 reassoc_complete->ch_width = csr_roaminfo->ch_width;
1635 reassoc_complete->mode = csr_roaminfo->mode;
1636 reassoc_complete->max_supp_idx = csr_roaminfo->max_supp_idx;
1637 reassoc_complete->max_ext_idx = csr_roaminfo->max_ext_idx;
1638 reassoc_complete->max_mcs_idx = csr_roaminfo->max_mcs_idx;
1639 reassoc_complete->rx_mcs_map = csr_roaminfo->rx_mcs_map;
1640 reassoc_complete->tx_mcs_map = csr_roaminfo->tx_mcs_map;
gaolez7bb1e742017-03-21 16:37:38 +08001641 reassoc_complete->ecsa_capable = csr_roaminfo->ecsa_capable;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05301642 if (csr_roaminfo->ht_caps.present)
1643 reassoc_complete->ht_caps = csr_roaminfo->ht_caps;
1644 if (csr_roaminfo->vht_caps.present)
1645 reassoc_complete->vht_caps = csr_roaminfo->vht_caps;
1646
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001647 break;
1648
1649 case eSAP_STA_DISASSOC_EVENT:
Arif Hussain165aa4c2016-10-25 14:21:53 -07001650 if (!csr_roaminfo) {
1651 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1652 FL("Invalid CSR Roam Info"));
1653 return QDF_STATUS_E_INVAL;
1654 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001655 sap_ap_event.sapHddEventCode = eSAP_STA_DISASSOC_EVENT;
1656 disassoc_comp =
1657 &sap_ap_event.sapevt.sapStationDisassocCompleteEvent;
1658
Anurag Chouhanc5548422016-02-24 18:33:27 +05301659 qdf_copy_macaddr(&disassoc_comp->staMac,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001660 &csr_roaminfo->peerMac);
1661 disassoc_comp->staId = csr_roaminfo->staId;
Ashish Kumar Dhanotiyad39c8b52018-03-27 18:18:52 +05301662 if (csr_roaminfo->reasonCode == eCSR_ROAM_RESULT_FORCED)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001663 disassoc_comp->reason = eSAP_USR_INITATED_DISASSOC;
1664 else
1665 disassoc_comp->reason = eSAP_MAC_INITATED_DISASSOC;
1666
1667 disassoc_comp->statusCode = csr_roaminfo->statusCode;
1668 disassoc_comp->status = (eSapStatus) context;
Ashish Kumar Dhanotiya443d31f2017-10-13 12:41:19 +05301669 disassoc_comp->rssi = csr_roaminfo->rssi;
1670 disassoc_comp->rx_rate = csr_roaminfo->rx_rate;
1671 disassoc_comp->tx_rate = csr_roaminfo->tx_rate;
Ashish Kumar Dhanotiyad39c8b52018-03-27 18:18:52 +05301672 disassoc_comp->reason_code = csr_roaminfo->disassoc_reason;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001673 break;
1674
1675 case eSAP_STA_SET_KEY_EVENT:
Arif Hussain165aa4c2016-10-25 14:21:53 -07001676
1677 if (!csr_roaminfo) {
1678 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1679 FL("Invalid CSR Roam Info"));
1680 return QDF_STATUS_E_INVAL;
1681 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001682 sap_ap_event.sapHddEventCode = eSAP_STA_SET_KEY_EVENT;
1683 key_complete =
1684 &sap_ap_event.sapevt.sapStationSetKeyCompleteEvent;
1685 key_complete->status = (eSapStatus) context;
Anurag Chouhanc5548422016-02-24 18:33:27 +05301686 qdf_copy_macaddr(&key_complete->peerMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001687 &csr_roaminfo->peerMac);
1688 break;
1689
1690 case eSAP_STA_MIC_FAILURE_EVENT:
Arif Hussain165aa4c2016-10-25 14:21:53 -07001691
1692 if (!csr_roaminfo) {
1693 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1694 FL("Invalid CSR Roam Info"));
1695 return QDF_STATUS_E_INVAL;
1696 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001697 sap_ap_event.sapHddEventCode = eSAP_STA_MIC_FAILURE_EVENT;
1698 mic_failure = &sap_ap_event.sapevt.sapStationMICFailureEvent;
1699
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301700 qdf_mem_copy(&mic_failure->srcMacAddr,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001701 csr_roaminfo->u.pMICFailureInfo->srcMacAddr,
1702 sizeof(tSirMacAddr));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301703 qdf_mem_copy(&mic_failure->staMac.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001704 csr_roaminfo->u.pMICFailureInfo->taMacAddr,
1705 sizeof(tSirMacAddr));
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301706 qdf_mem_copy(&mic_failure->dstMacAddr.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001707 csr_roaminfo->u.pMICFailureInfo->dstMacAddr,
1708 sizeof(tSirMacAddr));
1709 mic_failure->multicast =
1710 csr_roaminfo->u.pMICFailureInfo->multicast;
1711 mic_failure->IV1 = csr_roaminfo->u.pMICFailureInfo->IV1;
1712 mic_failure->keyId = csr_roaminfo->u.pMICFailureInfo->keyId;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301713 qdf_mem_copy(mic_failure->TSC,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001714 csr_roaminfo->u.pMICFailureInfo->TSC,
1715 SIR_CIPHER_SEQ_CTR_SIZE);
1716 break;
1717
1718 case eSAP_ASSOC_STA_CALLBACK_EVENT:
1719 break;
1720
1721 case eSAP_WPS_PBC_PROBE_REQ_EVENT:
Arif Hussain165aa4c2016-10-25 14:21:53 -07001722
1723 if (!csr_roaminfo) {
1724 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1725 FL("Invalid CSR Roam Info"));
1726 return QDF_STATUS_E_INVAL;
1727 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001728 sap_ap_event.sapHddEventCode = eSAP_WPS_PBC_PROBE_REQ_EVENT;
1729
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301730 qdf_mem_copy(&sap_ap_event.sapevt.sapPBCProbeReqEvent.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001731 WPSPBCProbeReq, csr_roaminfo->u.pWPSPBCProbeReq,
1732 sizeof(tSirWPSPBCProbeReq));
1733 break;
1734
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001735 case eSAP_DISCONNECT_ALL_P2P_CLIENT:
1736 sap_ap_event.sapHddEventCode = eSAP_DISCONNECT_ALL_P2P_CLIENT;
1737 sap_ap_event.sapevt.sapActionCnf.actionSendSuccess =
1738 (eSapStatus) context;
1739 break;
1740
1741 case eSAP_MAC_TRIG_STOP_BSS_EVENT:
1742 sap_ap_event.sapHddEventCode = eSAP_MAC_TRIG_STOP_BSS_EVENT;
1743 sap_ap_event.sapevt.sapActionCnf.actionSendSuccess =
1744 (eSapStatus) context;
1745 break;
1746
1747 case eSAP_UNKNOWN_STA_JOIN:
1748 sap_ap_event.sapHddEventCode = eSAP_UNKNOWN_STA_JOIN;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05301749 qdf_mem_copy((void *) sap_ap_event.sapevt.sapUnknownSTAJoin.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001750 macaddr.bytes, (void *) context,
Anurag Chouhan6d760662016-02-20 16:05:43 +05301751 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001752 break;
1753
1754 case eSAP_MAX_ASSOC_EXCEEDED:
Arif Hussain165aa4c2016-10-25 14:21:53 -07001755
1756 if (!csr_roaminfo) {
1757 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1758 FL("Invalid CSR Roam Info"));
1759 return QDF_STATUS_E_INVAL;
1760 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001761 sap_ap_event.sapHddEventCode = eSAP_MAX_ASSOC_EXCEEDED;
Anurag Chouhanc5548422016-02-24 18:33:27 +05301762 qdf_copy_macaddr(&sap_ap_event.sapevt.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001763 sapMaxAssocExceeded.macaddr,
1764 &csr_roaminfo->peerMac);
1765 break;
1766
1767 case eSAP_CHANNEL_CHANGE_EVENT:
1768 /*
1769 * Reconfig ACS result info. For DFS AP-AP Mode Sec AP ACS
1770 * follows pri AP
1771 */
1772 sap_ctx->acs_cfg->pri_ch = sap_ctx->channel;
Manishekar Chandrasekaranec267592016-05-26 19:10:04 +05301773 sap_ctx->acs_cfg->ch_width =
1774 sap_ctx->csr_roamProfile.ch_params.ch_width;
1775 sap_config_acs_result(hal, sap_ctx,
1776 sap_ctx->csr_roamProfile.ch_params.sec_ch_offset);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001777
1778 sap_ap_event.sapHddEventCode = eSAP_CHANNEL_CHANGE_EVENT;
1779
1780 acs_selected = &sap_ap_event.sapevt.sap_ch_selected;
1781 acs_selected->pri_ch = sap_ctx->acs_cfg->pri_ch;
bings61d5bec2017-06-27 14:13:40 +08001782 acs_selected->ht_sec_ch = sap_ctx->acs_cfg->ht_sec_ch;
Manishekar Chandrasekaranec267592016-05-26 19:10:04 +05301783 acs_selected->ch_width =
1784 sap_ctx->csr_roamProfile.ch_params.ch_width;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001785 acs_selected->vht_seg0_center_ch =
Manishekar Chandrasekaranec267592016-05-26 19:10:04 +05301786 sap_ctx->csr_roamProfile.ch_params.center_freq_seg0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001787 acs_selected->vht_seg1_center_ch =
Manishekar Chandrasekaranec267592016-05-26 19:10:04 +05301788 sap_ctx->csr_roamProfile.ch_params.center_freq_seg1;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001789 break;
1790
Abhishek Singh518323d2015-10-19 17:42:01 +05301791 case eSAP_ECSA_CHANGE_CHAN_IND:
Arif Hussain165aa4c2016-10-25 14:21:53 -07001792
1793 if (!csr_roaminfo) {
1794 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1795 FL("Invalid CSR Roam Info"));
1796 return QDF_STATUS_E_INVAL;
1797 }
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301798 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Abhishek Singh518323d2015-10-19 17:42:01 +05301799 "In %s, SAP event callback event = %s",
1800 __func__, "eSAP_ECSA_CHANGE_CHAN_IND");
1801 sap_ap_event.sapHddEventCode = eSAP_ECSA_CHANGE_CHAN_IND;
1802 sap_ap_event.sapevt.sap_chan_cng_ind.new_chan =
1803 csr_roaminfo->target_channel;
1804 break;
Kapil Gupta8878ad92017-02-13 11:56:04 +05301805 case eSAP_DFS_NEXT_CHANNEL_REQ:
1806 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
1807 "In %s, SAP event callback event = %s",
1808 __func__, "eSAP_DFS_NEXT_CHANNEL_REQ");
1809 sap_ap_event.sapHddEventCode = eSAP_DFS_NEXT_CHANNEL_REQ;
1810 break;
Krunal Soni22208392017-09-29 18:10:34 -07001811 case eSAP_STOP_BSS_DUE_TO_NO_CHNL:
1812 sap_ap_event.sapHddEventCode = eSAP_STOP_BSS_DUE_TO_NO_CHNL;
1813 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
1814 FL("stopping session_id:%d, bssid:%pM, channel:%d"),
1815 sap_ctx->sessionId, sap_ctx->self_mac_addr,
1816 sap_ctx->channel);
1817 break;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001818 default:
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301819 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001820 FL("SAP Unknown callback event = %d"),
1821 sap_hddevent);
1822 break;
1823 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301824 qdf_status = (*sap_ctx->pfnSapEventCallback)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001825 (&sap_ap_event, sap_ctx->pUsrContext);
1826
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301827 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001828
1829}
1830
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301831/**
1832 * sap_find_cac_wait_session() - Get context of a SAP session in CAC wait state
1833 * @handle: Global MAC handle
1834 *
1835 * Finds and gets the context of a SAP session in CAC wait state.
1836 *
1837 * Return: Valid SAP context on success, else NULL
1838 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001839static struct sap_context *sap_find_cac_wait_session(tHalHandle handle)
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301840{
1841 tpAniSirGlobal mac = PMAC_STRUCT(handle);
1842 uint8_t i = 0;
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001843 struct sap_context *sapContext;
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301844
1845 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
1846 "%s", __func__);
1847
1848 for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001849 sapContext = mac->sap.sapCtxList[i].pSapContext;
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301850 if (((QDF_SAP_MODE == mac->sap.sapCtxList[i].sapPersona)
1851 ||
1852 (QDF_P2P_GO_MODE == mac->sap.sapCtxList[i].sapPersona)) &&
1853 (sapContext) &&
1854 (sapContext->sapsMachine == eSAP_DFS_CAC_WAIT)) {
1855 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
1856 "%s: found SAP in cac wait state", __func__);
1857 return sapContext;
1858 }
1859 if (sapContext) {
1860 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
1861 "sapdfs: mode:%d intf:%d state:%d",
1862 mac->sap.sapCtxList[i].sapPersona, i,
1863 sapContext->sapsMachine);
1864 }
1865 }
1866
1867 return NULL;
1868}
1869
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001870/*==========================================================================
1871 FUNCTION sap_cac_reset_notify
1872
1873 DESCRIPTION Function will be called up on stop bss indication to clean up
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301874 DFS global structure.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001875
1876 DEPENDENCIES PARAMETERS
1877 IN hHAL : HAL pointer
1878
1879 RETURN VALUE : void.
1880
1881 SIDE EFFECTS
1882 ============================================================================*/
1883void sap_cac_reset_notify(tHalHandle hHal)
1884{
1885 uint8_t intf = 0;
1886 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
1887
1888 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001889 struct sap_context *pSapContext =
1890 pMac->sap.sapCtxList[intf].pSapContext;
Anurag Chouhan6d760662016-02-20 16:05:43 +05301891 if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001892 ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05301893 (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001894 && pMac->sap.sapCtxList[intf].pSapContext != NULL) {
1895 pSapContext->isCacStartNotified = false;
1896 pSapContext->isCacEndNotified = false;
1897 }
1898 }
1899}
1900
1901/*==========================================================================
1902 FUNCTION sap_cac_start_notify
1903
1904 DESCRIPTION Function will be called to notify eSAP_DFS_CAC_START event
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301905 to HDD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001906
1907 DEPENDENCIES PARAMETERS
1908 IN hHAL : HAL pointer
1909
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301910 RETURN VALUE : QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001911
1912 SIDE EFFECTS
1913 ============================================================================*/
Jeff Johnson464f7ea2016-10-07 10:21:26 -07001914static QDF_STATUS sap_cac_start_notify(tHalHandle hHal)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001915{
1916 uint8_t intf = 0;
1917 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301918 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001919
1920 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001921 struct sap_context *pSapContext =
1922 pMac->sap.sapCtxList[intf].pSapContext;
Jeff Johnson66ee8a92018-03-17 15:24:26 -07001923 struct csr_roam_profile *profile;
Krunal Sonie8324ce2017-09-25 10:16:56 -07001924
Anurag Chouhan6d760662016-02-20 16:05:43 +05301925 if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001926 ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05301927 (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001928 && pMac->sap.sapCtxList[intf].pSapContext != NULL &&
1929 (false == pSapContext->isCacStartNotified)) {
Krunal Sonie8324ce2017-09-25 10:16:56 -07001930 /* Don't start CAC for non-dfs channel, its violation */
1931 profile = &pSapContext->csr_roamProfile;
1932 if (!wlan_reg_is_dfs_ch(pMac->pdev,
1933 profile->operationChannel))
1934 continue;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301935 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Jeff Johnsona7c0ddb2017-09-18 08:14:12 -07001936 "sapdfs: Signaling eSAP_DFS_CAC_START to HDD for sapctx[%pK]",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001937 pSapContext);
1938
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301939 qdf_status = sap_signal_hdd_event(pSapContext, NULL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001940 eSAP_DFS_CAC_START,
1941 (void *)
1942 eSAP_STATUS_SUCCESS);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301943 if (QDF_STATUS_SUCCESS != qdf_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05301944 QDF_TRACE(QDF_MODULE_ID_SAP,
1945 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001946 "In %s, failed setting isCacStartNotified on interface[%d]",
1947 __func__, intf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301948 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001949 }
1950 pSapContext->isCacStartNotified = true;
1951 }
1952 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301953 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001954}
1955
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301956/**
1957 * wlansap_update_pre_cac_end() - Update pre cac end to upper layer
1958 * @sap_context: SAP context
1959 * @mac: Global MAC structure
1960 * @intf: Interface number
1961 *
1962 * Notifies pre cac end to upper layer
1963 *
1964 * Return: QDF_STATUS
1965 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07001966static QDF_STATUS wlansap_update_pre_cac_end(struct sap_context *sap_context,
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05301967 tpAniSirGlobal mac, uint8_t intf)
1968{
1969 QDF_STATUS qdf_status;
1970
1971 sap_context->isCacEndNotified = true;
1972 mac->sap.SapDfsInfo.sap_radar_found_status = false;
1973 sap_context->sapsMachine = eSAP_STARTED;
1974
1975 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
1976 "In %s, pre cac end notify on %d: from state %s => %s",
1977 __func__, intf, "eSAP_DFS_CAC_WAIT",
1978 "eSAP_STARTED");
1979
1980 qdf_status = sap_signal_hdd_event(sap_context,
1981 NULL, eSAP_DFS_PRE_CAC_END,
1982 (void *)eSAP_STATUS_SUCCESS);
1983 if (QDF_IS_STATUS_ERROR(qdf_status)) {
1984 QDF_TRACE(QDF_MODULE_ID_SAP,
1985 QDF_TRACE_LEVEL_ERROR,
1986 "In %s, pre cac notify failed on intf %d",
1987 __func__, intf);
1988 return qdf_status;
1989 }
1990
1991 return QDF_STATUS_SUCCESS;
1992}
1993
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001994/*==========================================================================
1995 FUNCTION sap_cac_end_notify
1996
1997 DESCRIPTION Function will be called to notify eSAP_DFS_CAC_END event
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05301998 to HDD
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08001999
2000 DEPENDENCIES PARAMETERS
2001 IN hHAL : HAL pointer
2002
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302003 RETURN VALUE : QDF_STATUS.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002004
2005 SIDE EFFECTS
2006 ============================================================================*/
Jeff Johnson172237b2017-11-07 15:32:59 -08002007static QDF_STATUS sap_cac_end_notify(tHalHandle hHal,
2008 struct csr_roam_info *roamInfo)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002009{
2010 uint8_t intf;
2011 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302012 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002013
2014 /*
2015 * eSAP_DFS_CHANNEL_CAC_END:
2016 * CAC Period elapsed and there was no radar
2017 * found so, SAP can continue beaconing.
2018 * sap_radar_found_status is set to 0
2019 */
2020 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07002021 struct sap_context *pSapContext =
2022 pMac->sap.sapCtxList[intf].pSapContext;
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002023 struct csr_roam_profile *profile;
Krunal Sonie8324ce2017-09-25 10:16:56 -07002024
Anurag Chouhan6d760662016-02-20 16:05:43 +05302025 if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002026 ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05302027 (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002028 && pMac->sap.sapCtxList[intf].pSapContext != NULL &&
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05302029 (false == pSapContext->isCacEndNotified) &&
2030 (pSapContext->sapsMachine == eSAP_DFS_CAC_WAIT)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002031 pSapContext = pMac->sap.sapCtxList[intf].pSapContext;
Krunal Sonie8324ce2017-09-25 10:16:56 -07002032 /* Don't check CAC for non-dfs channel */
2033 profile = &pSapContext->csr_roamProfile;
2034 if (!wlan_reg_is_dfs_ch(pMac->pdev,
2035 profile->operationChannel))
2036 continue;
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05302037
2038 /* If this is an end notification of a pre cac, the
2039 * SAP must not start beaconing and must delete the
2040 * temporary interface created for pre cac and switch
2041 * the original SAP to the pre CAC channel.
2042 */
2043 if (pSapContext->is_pre_cac_on) {
2044 qdf_status = wlansap_update_pre_cac_end(
2045 pSapContext, pMac, intf);
2046 if (QDF_IS_STATUS_ERROR(qdf_status))
2047 return qdf_status;
2048 /* pre CAC is not allowed with any concurrency.
2049 * So, we can break from here.
2050 */
2051 break;
2052 }
2053
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302054 qdf_status = sap_signal_hdd_event(pSapContext, NULL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002055 eSAP_DFS_CAC_END,
2056 (void *)
2057 eSAP_STATUS_SUCCESS);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302058 if (QDF_STATUS_SUCCESS != qdf_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302059 QDF_TRACE(QDF_MODULE_ID_SAP,
2060 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002061 "In %s, failed setting isCacEndNotified on interface[%d]",
2062 __func__, intf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302063 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002064 }
2065 pSapContext->isCacEndNotified = true;
2066 pMac->sap.SapDfsInfo.sap_radar_found_status = false;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302067 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Jeff Johnsona7c0ddb2017-09-18 08:14:12 -07002068 "sapdfs: Start beacon request on sapctx[%pK]",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002069 pSapContext);
2070
2071 /* Start beaconing on the new channel */
2072 wlansap_start_beacon_req(pSapContext);
2073
2074 /* Transition from eSAP_STARTING to eSAP_STARTED
2075 * (both without substates)
2076 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302077 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002078 "sapdfs: channel[%d] from state %s => %s",
2079 pSapContext->channel, "eSAP_STARTING",
2080 "eSAP_STARTED");
2081
2082 pSapContext->sapsMachine = eSAP_STARTED;
2083
2084 /*Action code for transition */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302085 qdf_status = sap_signal_hdd_event(pSapContext, roamInfo,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002086 eSAP_START_BSS_EVENT,
2087 (void *)
2088 eSAP_STATUS_SUCCESS);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302089 if (QDF_STATUS_SUCCESS != qdf_status) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302090 QDF_TRACE(QDF_MODULE_ID_SAP,
2091 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002092 "In %s, failed setting isCacEndNotified on interface[%d]",
2093 __func__, intf);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302094 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002095 }
2096
2097 /* Transition from eSAP_STARTING to eSAP_STARTED
2098 * (both without substates)
2099 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302100 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002101 "In %s, from state %s => %s",
2102 __func__, "eSAP_DFS_CAC_WAIT",
2103 "eSAP_STARTED");
2104 }
2105 }
2106 /*
2107 * All APs are done with CAC timer, all APs should start beaconing.
2108 * Lets assume AP1 and AP2 started beaconing on DFS channel, Now lets
2109 * say AP1 goes down and comes back on same DFS channel. In this case
2110 * AP1 shouldn't start CAC timer and start beacon immediately beacause
2111 * AP2 is already beaconing on this channel. This case will be handled
2112 * by checking against eSAP_DFS_SKIP_CAC while starting the timer.
2113 */
2114 pMac->sap.SapDfsInfo.cac_state = eSAP_DFS_SKIP_CAC;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302115 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002116}
2117
2118/**
2119 * sap_fsm_state_disconnected() - utility function called from sap fsm
2120 * @sap_ctx: SAP context
2121 * @sap_event: SAP event buffer
2122 * @mac_ctx: global MAC context
2123 * @hal: HAL handle
2124 *
2125 * This function is called for state transition from "eSAP_DISCONNECTED"
2126 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302127 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002128 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07002129static QDF_STATUS sap_fsm_state_disconnected(struct sap_context *sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002130 ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx,
2131 tHalHandle hal)
2132{
2133 uint32_t msg = sap_event->event;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302134 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002135
2136 if (msg == eSAP_HDD_START_INFRA_BSS) {
2137 /*
2138 * Transition from eSAP_DISCONNECTED to eSAP_CH_SELECT
2139 * (both without substates)
2140 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302141 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Peng Xu66162de2016-02-11 17:01:20 -08002142 FL("new from state %s => %s: session:%d"),
2143 "eSAP_DISCONNECTED", "eSAP_CH_SELECT",
2144 sap_ctx->sessionId);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002145
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002146 /* init dfs channel nol */
2147 sap_init_dfs_channel_nol_list(sap_ctx);
2148
2149 /* Set SAP device role */
2150 sap_ctx->sapsMachine = eSAP_CH_SELECT;
2151
2152 /*
2153 * Perform sme_ScanRequest. This scan request is post start bss
2154 * request so, set the third to false.
2155 */
Manishekar Chandrasekaran1db3abe2016-06-24 03:27:07 +05302156 qdf_status = sap_goto_channel_sel(sap_ctx, sap_event, false,
2157 true);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002158 } else if (msg == eSAP_DFS_CHANNEL_CAC_START) {
2159 /*
2160 * No need of state check here, caller is expected to perform
2161 * the checks before sending the event
2162 */
2163 sap_ctx->sapsMachine = eSAP_DFS_CAC_WAIT;
2164
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302165 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002166 FL("from state eSAP_DISCONNECTED => SAP_DFS_CAC_WAIT"));
2167 if (mac_ctx->sap.SapDfsInfo.is_dfs_cac_timer_running != true) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302168 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Jeff Johnsona7c0ddb2017-09-18 08:14:12 -07002169 FL("sapdfs: starting dfs cac timer on sapctx[%pK]"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002170 sap_ctx);
2171 sap_start_dfs_cac_timer(sap_ctx);
2172 }
2173
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302174 qdf_status = sap_cac_start_notify(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002175 } else if (msg == eSAP_CHANNEL_SELECTION_RETRY) {
2176 /* Set SAP device role */
2177 sap_ctx->sapsMachine = eSAP_CH_SELECT;
2178
2179 /*
2180 * Perform sme_ScanRequest. This scan request is post start bss
2181 * request so, set the third to false.
2182 */
Manishekar Chandrasekaran1db3abe2016-06-24 03:27:07 +05302183 qdf_status = sap_goto_channel_sel(sap_ctx, sap_event, false,
2184 false);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002185 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302186 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002187 FL("in state %s, event msg %d"),
2188 "eSAP_DISCONNECTED", msg);
2189 }
2190
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302191 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002192}
2193
2194/**
2195 * sap_fsm_state_ch_select() - utility function called from sap fsm
2196 * @sap_ctx: SAP context
2197 * @sap_event: SAP event buffer
2198 * @mac_ctx: global MAC context
2199 * @hal: HAL handle
2200 *
2201 * This function is called for state transition from "eSAP_CH_SELECT"
2202 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302203 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002204 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07002205static QDF_STATUS sap_fsm_state_ch_select(struct sap_context *sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002206 ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx,
2207 tHalHandle hal)
2208{
2209 uint32_t msg = sap_event->event;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302210 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002211 bool b_leak_chan = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002212 uint8_t temp_chan;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002213
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002214 if (msg == eSAP_MAC_SCAN_COMPLETE) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002215 temp_chan = sap_ctx->channel;
bings1826d9c2018-01-23 16:14:01 +08002216 utils_dfs_mark_leaking_ch(mac_ctx->pdev,
2217 sap_ctx->ch_params.ch_width,
2218 1, &temp_chan);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002219
2220 /*
2221 * if selelcted channel has leakage to channels
2222 * in NOL, the temp_chan will be reset
2223 */
2224 b_leak_chan = (temp_chan != sap_ctx->channel);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002225 /*
2226 * check if channel is in DFS_NOL or if the channel
2227 * has leakage to the channels in NOL
2228 */
2229 if (sap_dfs_is_channel_in_nol_list(sap_ctx, sap_ctx->channel,
bingsd60c0b42017-09-07 01:30:29 +08002230 PHY_CHANNEL_BONDING_STATE_MAX) || b_leak_chan) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002231 uint8_t ch;
2232
2233 /* find a new available channel */
2234 ch = sap_random_channel_sel(sap_ctx);
2235 if (ch == 0) {
2236 /* No available channel found */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302237 QDF_TRACE(QDF_MODULE_ID_SAP,
2238 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002239 FL("No available channel found!!!"));
2240 sap_signal_hdd_event(sap_ctx, NULL,
2241 eSAP_DFS_NO_AVAILABLE_CHANNEL,
2242 (void *)eSAP_STATUS_SUCCESS);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302243 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002244 }
2245
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302246 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002247 FL("channel %d is in NOL, StartBss on new channel %d"),
2248 sap_ctx->channel, ch);
2249
2250 sap_ctx->channel = ch;
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002251 wlan_reg_set_channel_params(mac_ctx->pdev,
2252 sap_ctx->channel,
2253 sap_ctx->secondary_ch,
2254 &sap_ctx->ch_params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002255 }
2256 if (sap_ctx->channel > 14 &&
2257 (sap_ctx->csr_roamProfile.phyMode == eCSR_DOT11_MODE_11g ||
2258 sap_ctx->csr_roamProfile.phyMode ==
2259 eCSR_DOT11_MODE_11g_ONLY))
2260 sap_ctx->csr_roamProfile.phyMode = eCSR_DOT11_MODE_11a;
2261
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002262 /*
2263 * when AP2 is started while AP1 is performing ACS, we may not
2264 * have the AP1 channel yet.So here after the completion of AP2
2265 * ACS check if AP1 ACS resulting channel is DFS and if yes
2266 * override AP2 ACS scan result with AP1 DFS channel
2267 */
Tushnim Bhattacharyya66348bd2017-03-09 15:02:10 -08002268 if (policy_mgr_concurrent_beaconing_sessions_running(
2269 mac_ctx->psoc)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002270 uint16_t con_ch;
2271
2272 con_ch = sme_get_concurrent_operation_channel(hal);
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002273 if (con_ch && wlan_reg_is_dfs_ch(mac_ctx->pdev, con_ch))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002274 sap_ctx->channel = con_ch;
2275 }
Ryan Hsu4252a2f2016-01-05 11:18:24 -08002276
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002277 /*
2278 * Transition from eSAP_CH_SELECT to eSAP_STARTING
2279 * (both without substates)
2280 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302281 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002282 FL("from state %s => %s"),
2283 "eSAP_CH_SELECT", "eSAP_STARTING");
2284 /* Channel selected. Now can sap_goto_starting */
2285 sap_ctx->sapsMachine = eSAP_STARTING;
2286 /* Specify the channel */
2287 sap_ctx->csr_roamProfile.ChannelInfo.numOfChannels =
2288 1;
2289 sap_ctx->csr_roamProfile.ChannelInfo.ChannelList =
2290 &sap_ctx->csr_roamProfile.operationChannel;
2291 sap_ctx->csr_roamProfile.operationChannel =
2292 (uint8_t) sap_ctx->channel;
2293 sap_ctx->csr_roamProfile.ch_params.ch_width =
2294 sap_ctx->ch_params.ch_width;
2295 sap_ctx->csr_roamProfile.ch_params.center_freq_seg0 =
2296 sap_ctx->ch_params.center_freq_seg0;
2297 sap_ctx->csr_roamProfile.ch_params.center_freq_seg1 =
2298 sap_ctx->ch_params.center_freq_seg1;
2299 sap_ctx->csr_roamProfile.ch_params.sec_ch_offset =
2300 sap_ctx->ch_params.sec_ch_offset;
Arif Hussain671a1902017-03-17 09:08:32 -07002301 sap_get_cac_dur_dfs_region(sap_ctx,
2302 &sap_ctx->csr_roamProfile.cac_duration_ms,
2303 &sap_ctx->csr_roamProfile.dfs_regdomain);
Jiachao Wu712d4fd2017-08-23 16:52:34 +08002304 sap_ctx->csr_roamProfile.beacon_tx_rate =
2305 sap_ctx->beacon_tx_rate;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302306 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002307 FL("notify hostapd about channel selection: %d"),
2308 sap_ctx->channel);
2309 sap_signal_hdd_event(sap_ctx, NULL,
2310 eSAP_CHANNEL_CHANGE_EVENT,
2311 (void *) eSAP_STATUS_SUCCESS);
Arif Hussaincd151632017-02-11 16:57:19 -08002312 sap_dfs_set_current_channel(sap_ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302313 qdf_status = sap_goto_starting(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002314 eCSR_BSS_TYPE_INFRA_AP);
2315 } else if (msg == eSAP_CHANNEL_SELECTION_FAILED) {
2316 sap_ctx->sapsMachine = eSAP_DISCONNECTED;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302317 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002318 FL("Cannot start BSS, ACS Fail"));
Ashish Kumar Dhanotiya48c6b6e2017-03-07 10:55:25 +05302319 sap_signal_hdd_event(sap_ctx, NULL, eSAP_START_BSS_EVENT,
2320 (void *)eSAP_STATUS_FAILURE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002321 } else if (msg == eSAP_HDD_STOP_INFRA_BSS) {
2322 sap_ctx->sapsMachine = eSAP_DISCONNECTED;
2323 sap_signal_hdd_event(sap_ctx, NULL, eSAP_START_BSS_EVENT,
2324 (void *)eSAP_STATUS_FAILURE);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302325 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002326 "%s: BSS stopped when Ch select in Progress", __func__);
2327 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302328 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002329 FL("in state %s, invalid event msg %d"),
2330 "eSAP_CH_SELECT", msg);
2331 }
2332
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302333 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002334}
2335
2336/**
2337 * sap_fsm_state_dfs_cac_wait() - utility function called from sap fsm
2338 * @sap_ctx: SAP context
2339 * @sap_event: SAP event buffer
2340 * @mac_ctx: global MAC context
2341 * @hal: HAL handle
2342 *
2343 * This function is called for state transition from "eSAP_DFS_CAC_WAIT"
2344 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302345 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002346 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07002347static QDF_STATUS sap_fsm_state_dfs_cac_wait(struct sap_context *sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002348 ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx,
2349 tHalHandle hal)
2350{
2351 uint32_t msg = sap_event->event;
Jeff Johnson172237b2017-11-07 15:32:59 -08002352 struct csr_roam_info *roam_info =
2353 (struct csr_roam_info *) (sap_event->params);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302354 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002355
2356 if (msg == eSAP_DFS_CHANNEL_CAC_START) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302357 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002358 FL("from state %s => %s"),
2359 "eSAP_CH_SELECT", "eSAP_DFS_CAC_WAIT");
2360 if (mac_ctx->sap.SapDfsInfo.is_dfs_cac_timer_running != true)
2361 sap_start_dfs_cac_timer(sap_ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302362 qdf_status = sap_cac_start_notify(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002363 } else if (msg == eSAP_DFS_CHANNEL_CAC_RADAR_FOUND) {
2364 uint8_t intf;
2365 /*
2366 * Radar found while performing channel availability
2367 * check, need to switch the channel again
2368 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302369 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002370 "ENTERTRED CAC WAIT STATE-->eSAP_DISCONNECTING\n");
2371 if (mac_ctx->sap.SapDfsInfo.target_channel) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002372 wlan_reg_set_channel_params(mac_ctx->pdev,
Sandeep Puligilla1cc23f62016-04-27 16:52:49 -07002373 mac_ctx->sap.SapDfsInfo.target_channel, 0,
2374 &sap_ctx->ch_params);
bingsfe10dd12018-03-21 17:21:40 +08002375 } else {
2376 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2377 FL("Invalid target channel %d"),
2378 mac_ctx->sap.SapDfsInfo.target_channel);
2379 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002380 }
2381
2382 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07002383 struct sap_context *t_sap_ctx;
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002384 struct csr_roam_profile *profile;
Krunal Sonie8324ce2017-09-25 10:16:56 -07002385
Wu Gao03dd0f62016-11-16 10:51:06 +08002386 t_sap_ctx = mac_ctx->sap.sapCtxList[intf].pSapContext;
Anurag Chouhan6d760662016-02-20 16:05:43 +05302387 if (((QDF_SAP_MODE ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002388 mac_ctx->sap.sapCtxList[intf].sapPersona) ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05302389 (QDF_P2P_GO_MODE ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002390 mac_ctx->sap.sapCtxList[intf].sapPersona)) &&
Wu Gao03dd0f62016-11-16 10:51:06 +08002391 t_sap_ctx != NULL &&
2392 t_sap_ctx->sapsMachine != eSAP_DISCONNECTED) {
Krunal Sonie8324ce2017-09-25 10:16:56 -07002393 profile = &t_sap_ctx->csr_roamProfile;
bings73e793e2017-12-08 15:11:09 +08002394 if (!wlan_reg_is_passive_or_disable_ch(
2395 mac_ctx->pdev,
Krunal Sonie8324ce2017-09-25 10:16:56 -07002396 profile->operationChannel))
2397 continue;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002398 /* SAP to be moved to DISCONNECTING state */
Krunal Sonie8324ce2017-09-25 10:16:56 -07002399 t_sap_ctx->sapsMachine = eSAP_DISCONNECTING;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002400 /*
2401 * eSAP_DFS_CHANNEL_CAC_RADAR_FOUND:
2402 * A Radar is found on current DFS Channel
2403 * while in CAC WAIT period So, do a channel
2404 * switch to randomly selected target channel.
2405 * Send the Channel change message to SME/PE.
2406 * sap_radar_found_status is set to 1
2407 */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002408 wlansap_channel_change_request(
Jeff Johnson164b3bb2017-09-25 19:34:14 -07002409 t_sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002410 mac_ctx->sap.SapDfsInfo.target_channel);
2411 }
2412 }
2413 } else if (msg == eSAP_DFS_CHANNEL_CAC_END) {
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302414 qdf_status = sap_cac_end_notify(hal, roam_info);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002415 } else if (msg == eSAP_HDD_STOP_INFRA_BSS) {
2416 /* Transition from eSAP_DFS_CAC_WAIT to eSAP_DISCONNECTING */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302417 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002418 FL("from state %s => %s"),
2419 "eSAP_DFS_CAC_WAIT", "eSAP_DISCONNECTING");
2420
2421 /*
2422 * Stop the CAC timer only in following conditions
2423 * single AP: if there is a single AP then stop the timer
2424 * mulitple APs: incase of multiple APs, make sure that
2425 * all APs are down.
2426 */
2427 if (NULL == sap_find_valid_concurrent_session(hal)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302428 QDF_TRACE(QDF_MODULE_ID_SAP,
2429 QDF_TRACE_LEVEL_INFO_MED,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002430 FL("sapdfs: no sessions are valid, stopping timer"));
2431 sap_stop_dfs_cac_timer(sap_ctx);
2432 }
2433
2434 sap_ctx->sapsMachine = eSAP_DISCONNECTING;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302435 qdf_status = sap_goto_disconnecting(sap_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002436 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302437 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002438 FL("in state %s, invalid event msg %d"),
2439 "eSAP_DFS_CAC_WAIT", msg);
2440 }
2441
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302442 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002443}
2444
2445/**
2446 * sap_fsm_state_starting() - utility function called from sap fsm
2447 * @sap_ctx: SAP context
2448 * @sap_event: SAP event buffer
2449 * @mac_ctx: global MAC context
2450 * @hal: HAL handle
2451 *
2452 * This function is called for state transition from "eSAP_STARTING"
2453 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302454 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002455 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07002456static QDF_STATUS sap_fsm_state_starting(struct sap_context *sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002457 ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx,
2458 tHalHandle hal)
2459{
2460 uint32_t msg = sap_event->event;
Jeff Johnson172237b2017-11-07 15:32:59 -08002461 struct csr_roam_info *roam_info =
2462 (struct csr_roam_info *) (sap_event->params);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002463 tSapDfsInfo *sap_dfs_info;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302464 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Sandeep Puligilla949eaa72015-12-17 18:43:52 -08002465 uint8_t is_dfs = false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002466
2467 if (msg == eSAP_MAC_START_BSS_SUCCESS) {
2468 /*
2469 * Transition from eSAP_STARTING to eSAP_STARTED
2470 * (both without substates)
2471 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302472 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Sandeep Puligilla949eaa72015-12-17 18:43:52 -08002473 FL("from state channel = %d %s => %s ch_width %d"),
2474 sap_ctx->channel, "eSAP_STARTING", "eSAP_STARTED",
2475 sap_ctx->ch_params.ch_width);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002476 sap_ctx->sapsMachine = eSAP_STARTED;
2477
2478 /* Action code for transition */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302479 qdf_status = sap_signal_hdd_event(sap_ctx, roam_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002480 eSAP_START_BSS_EVENT,
2481 (void *) eSAP_STATUS_SUCCESS);
2482
2483 /*
2484 * The upper layers have been informed that AP is up and
2485 * running, however, the AP is still not beaconing, until
2486 * CAC is done if the operating channel is DFS
2487 */
Sandeep Puligilla949eaa72015-12-17 18:43:52 -08002488 if (sap_ctx->ch_params.ch_width == CH_WIDTH_160MHZ) {
2489 is_dfs = true;
2490 } else if (sap_ctx->ch_params.ch_width == CH_WIDTH_80P80MHZ) {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002491 if (wlan_reg_get_channel_state(mac_ctx->pdev,
2492 sap_ctx->channel) ==
Sandeep Puligilla949eaa72015-12-17 18:43:52 -08002493 CHANNEL_STATE_DFS ||
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002494 wlan_reg_get_channel_state(mac_ctx->pdev,
2495 sap_ctx->ch_params.center_freq_seg1 -
Sandeep Puligilla949eaa72015-12-17 18:43:52 -08002496 SIR_80MHZ_START_CENTER_CH_DIFF) ==
2497 CHANNEL_STATE_DFS)
2498 is_dfs = true;
2499 } else {
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07002500 if (wlan_reg_get_channel_state(mac_ctx->pdev,
2501 sap_ctx->channel) ==
Sandeep Puligilla949eaa72015-12-17 18:43:52 -08002502 CHANNEL_STATE_DFS)
2503 is_dfs = true;
2504 }
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05302505
Sandeep Puligilla949eaa72015-12-17 18:43:52 -08002506 if (is_dfs) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002507 sap_dfs_info = &mac_ctx->sap.SapDfsInfo;
2508 if ((false == sap_dfs_info->ignore_cac) &&
2509 (eSAP_DFS_DO_NOT_SKIP_CAC ==
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05302510 sap_dfs_info->cac_state) &&
2511 !sap_ctx->pre_cac_complete) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002512 /* Move the device in CAC_WAIT_STATE */
2513 sap_ctx->sapsMachine = eSAP_DFS_CAC_WAIT;
2514
2515 /*
2516 * Need to stop the OS transmit queues,
2517 * so that no traffic can flow down the stack
2518 */
2519
2520 /* Start CAC wait timer */
2521 if (sap_dfs_info->is_dfs_cac_timer_running !=
2522 true)
2523 sap_start_dfs_cac_timer(sap_ctx);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302524 qdf_status = sap_cac_start_notify(hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002525
2526 } else {
2527 wlansap_start_beacon_req(sap_ctx);
2528 }
2529 }
Kiran Kumar Lokere475c1772016-08-18 12:40:07 -07002530 } else if (msg == eSAP_MAC_START_FAILS ||
2531 msg == eSAP_HDD_STOP_INFRA_BSS) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002532 /*
2533 * Transition from eSAP_STARTING to eSAP_DISCONNECTED
2534 * (both without substates)
2535 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302536 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002537 FL("from state %s => %s"),
2538 "eSAP_STARTING", "eSAP_DISCONNECTED");
2539
2540 /* Advance outer statevar */
2541 sap_ctx->sapsMachine = eSAP_DISCONNECTED;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302542 qdf_status = sap_signal_hdd_event(sap_ctx, NULL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002543 eSAP_START_BSS_EVENT,
2544 (void *) eSAP_STATUS_FAILURE);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302545 qdf_status = sap_goto_disconnected(sap_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002546 /* Close the SME session */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002547 } else if (msg == eSAP_OPERATING_CHANNEL_CHANGED) {
2548 /* The operating channel has changed, update hostapd */
2549 sap_ctx->channel =
2550 (uint8_t) mac_ctx->sap.SapDfsInfo.target_channel;
2551
2552 sap_ctx->sapsMachine = eSAP_STARTED;
2553
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302554 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002555 FL("from state %s => %s"),
2556 "eSAP_STARTING", "eSAP_STARTED");
2557
2558 /* Indicate change in the state to upper layers */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302559 qdf_status = sap_signal_hdd_event(sap_ctx, roam_info,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002560 eSAP_START_BSS_EVENT,
2561 (void *)eSAP_STATUS_SUCCESS);
2562 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302563 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002564 FL("in state %s, invalid event msg %d"),
2565 "eSAP_STARTING", msg);
2566 }
2567
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302568 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002569}
2570
2571/**
2572 * sap_fsm_state_started() - utility function called from sap fsm
2573 * @sap_ctx: SAP context
2574 * @sap_event: SAP event buffer
2575 * @mac_ctx: global MAC context
2576 *
2577 * This function is called for state transition from "eSAP_STARTED"
2578 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302579 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002580 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07002581static QDF_STATUS sap_fsm_state_started(struct sap_context *sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002582 ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx)
2583{
2584 uint32_t msg = sap_event->event;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302585 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002586
2587 if (msg == eSAP_HDD_STOP_INFRA_BSS) {
2588 /*
2589 * Transition from eSAP_STARTED to eSAP_DISCONNECTING
2590 * (both without substates)
2591 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302592 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002593 FL("from state %s => %s"),
2594 "eSAP_STARTED", "eSAP_DISCONNECTING");
2595 sap_ctx->sapsMachine = eSAP_DISCONNECTING;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302596 qdf_status = sap_goto_disconnecting(sap_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002597 } else if (eSAP_DFS_CHNL_SWITCH_ANNOUNCEMENT_START == msg) {
2598 uint8_t intf;
bingsfe10dd12018-03-21 17:21:40 +08002599 if (!mac_ctx->sap.SapDfsInfo.target_channel) {
2600 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2601 FL("Invalid target channel %d"),
2602 mac_ctx->sap.SapDfsInfo.target_channel);
2603 return qdf_status;
2604 }
2605
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002606 /*
2607 * Radar is seen on the current operating channel
2608 * send CSA IE for all associated stations
2609 * Request for CSA IE transmission
2610 */
2611 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07002612 struct sap_context *temp_sap_ctx;
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002613 struct csr_roam_profile *profile;
Krunal Sonie8324ce2017-09-25 10:16:56 -07002614
Anurag Chouhan6d760662016-02-20 16:05:43 +05302615 if (((QDF_SAP_MODE ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002616 mac_ctx->sap.sapCtxList[intf].sapPersona) ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05302617 (QDF_P2P_GO_MODE ==
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002618 mac_ctx->sap.sapCtxList[intf].sapPersona)) &&
2619 mac_ctx->sap.sapCtxList[intf].pSapContext != NULL) {
2620 temp_sap_ctx =
2621 mac_ctx->sap.sapCtxList[intf].pSapContext;
Krunal Sonie8324ce2017-09-25 10:16:56 -07002622 /*
2623 * Radar won't come on non-dfs channel, so
2624 * no need to move them
2625 */
2626 profile = &temp_sap_ctx->csr_roamProfile;
bings73e793e2017-12-08 15:11:09 +08002627 if (!wlan_reg_is_passive_or_disable_ch(
2628 mac_ctx->pdev,
Krunal Sonie8324ce2017-09-25 10:16:56 -07002629 profile->operationChannel))
2630 continue;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302631 QDF_TRACE(QDF_MODULE_ID_SAP,
2632 QDF_TRACE_LEVEL_INFO_MED,
Jeff Johnsona7c0ddb2017-09-18 08:14:12 -07002633 FL("sapdfs: Sending CSAIE for sapctx[%pK]"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002634 temp_sap_ctx);
2635
Jeff Johnsonbfeafc62017-09-25 18:50:01 -07002636 qdf_status =
2637 wlansap_dfs_send_csa_ie_request(temp_sap_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002638 }
2639 }
Chandrasekaran, Manishekar8104abd2016-01-29 18:10:27 +05302640 } else if (eSAP_CHANNEL_SWITCH_ANNOUNCEMENT_START == msg) {
Jeff Johnsonc1e62782017-11-09 09:50:17 -08002641 enum QDF_OPMODE persona;
Chandrasekaran, Manishekar8104abd2016-01-29 18:10:27 +05302642
2643 if (!sap_ctx) {
2644 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
2645 FL("Invalid sap_ctx"));
2646 return qdf_status;
2647 }
2648
2649 persona = mac_ctx->sap.sapCtxList[sap_ctx->sessionId].
2650 sapPersona;
2651
2652 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
2653 FL("app trigger chan switch: mode:%d vdev:%d"),
2654 persona, sap_ctx->sessionId);
2655
2656 if ((QDF_SAP_MODE == persona) || (QDF_P2P_GO_MODE == persona))
Jeff Johnsonbfeafc62017-09-25 18:50:01 -07002657 qdf_status = wlansap_dfs_send_csa_ie_request(sap_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002658 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302659 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002660 FL("in state %s, invalid event msg %d"),
2661 "eSAP_STARTED", msg);
2662 }
2663
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302664 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002665}
2666
2667/**
2668 * sap_fsm_state_disconnecting() - utility function called from sap fsm
2669 * @sap_ctx: SAP context
2670 * @sap_event: SAP event buffer
2671 * @mac_ctx: global MAC context
2672 *
2673 * This function is called for state transition from "eSAP_DISCONNECTING"
2674 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302675 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002676 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07002677static QDF_STATUS sap_fsm_state_disconnecting(struct sap_context *sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002678 ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx,
2679 tHalHandle hal)
2680{
2681 uint32_t msg = sap_event->event;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302682 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002683
2684 if (msg == eSAP_MAC_READY_FOR_CONNECTIONS) {
2685 /*
2686 * Transition from eSAP_DISCONNECTING to eSAP_DISCONNECTED
2687 * (both without substates)
2688 */
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302689 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002690 FL("from state %s => %s"),
2691 "eSAP_DISCONNECTING", "eSAP_DISCONNECTED");
2692 sap_ctx->sapsMachine = eSAP_DISCONNECTED;
2693
2694 /* Close the SME session */
Krunal Soni074dd2c2017-04-14 14:57:34 -07002695 qdf_status = sap_signal_hdd_event(sap_ctx, NULL,
2696 eSAP_STOP_BSS_EVENT,
2697 (void *)eSAP_STATUS_SUCCESS);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002698 } else if (msg == eWNI_SME_CHANNEL_CHANGE_REQ) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302699 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Jeff Johnsona7c0ddb2017-09-18 08:14:12 -07002700 FL("sapdfs: Send channel change request on sapctx[%pK]"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002701 sap_ctx);
Arif Hussain671a1902017-03-17 09:08:32 -07002702
2703 sap_get_cac_dur_dfs_region(sap_ctx,
2704 &sap_ctx->csr_roamProfile.cac_duration_ms,
2705 &sap_ctx->csr_roamProfile.dfs_regdomain);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002706 /*
2707 * Most likely, radar has been detected and SAP wants to
2708 * change the channel
2709 */
Jeff Johnson164b3bb2017-09-25 19:34:14 -07002710 qdf_status = wlansap_channel_change_request(sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002711 mac_ctx->sap.SapDfsInfo.target_channel);
2712
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302713 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002714 FL("Sending DFS eWNI_SME_CHANNEL_CHANGE_REQ"));
Liangwei Dong87a1ecc2016-09-28 04:03:16 -04002715 } else if (msg == eWNI_SME_CHANNEL_CHANGE_RSP) {
2716 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
2717 FL("in state %s, event msg %d result %d"),
2718 "eSAP_DISCONNECTING ", msg, sap_event->u2);
2719 if (sap_event->u2 == eCSR_ROAM_RESULT_CHANNEL_CHANGE_FAILURE)
2720 qdf_status = sap_goto_disconnecting(sap_ctx);
Sandeep Puligilla20aa0c72017-10-30 12:24:06 -07002721 } else if ((msg == eSAP_HDD_STOP_INFRA_BSS) &&
2722 (sap_ctx->is_chan_change_inprogress)) {
2723 /* stop bss is recieved while processing channel change */
2724 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
2725 FL("in state %s, event msg %d result %d"),
2726 "eSAP_DISCONNECTING ", msg, sap_event->u2);
Vignesh Viswanathan200f5c12018-02-27 14:01:59 +05302727 qdf_status = sap_goto_disconnecting(sap_ctx);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002728 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302729 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002730 FL("in state %s, invalid event msg %d"),
2731 "eSAP_DISCONNECTING", msg);
2732 }
2733
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302734 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002735}
2736
2737/**
2738 * sap_fsm() - SAP statem machine entry function
2739 * @sap_ctx: SAP context
2740 * @sap_event: SAP event
2741 *
2742 * SAP statem machine entry function
2743 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302744 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002745 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07002746QDF_STATUS sap_fsm(struct sap_context *sap_ctx, ptWLAN_SAPEvent sap_event)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002747{
2748 /*
2749 * Retrieve the phy link state machine structure
2750 * from the sap_ctx value
2751 * state var that keeps track of state machine
2752 */
2753 eSapFsmStates_t state_var = sap_ctx->sapsMachine;
2754 uint32_t msg = sap_event->event; /* State machine input event message */
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302755 QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE;
Jeff Johnsonc0db3842017-09-13 18:34:28 -07002756 tHalHandle hal = CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002757 tpAniSirGlobal mac_ctx;
2758
2759 if (NULL == hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302760 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002761 FL("Invalid hal"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302762 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002763 }
2764
2765 mac_ctx = PMAC_STRUCT(hal);
2766 if (NULL == mac_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302767 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002768 FL("Invalid MAC context"));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302769 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002770 }
2771
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302772 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Jeff Johnsona7c0ddb2017-09-18 08:14:12 -07002773 FL("sap_ctx=%pK, state_var=%d, msg=0x%x"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002774 sap_ctx, state_var, msg);
2775
2776 switch (state_var) {
2777 case eSAP_DISCONNECTED:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302778 qdf_status = sap_fsm_state_disconnected(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002779 mac_ctx, hal);
2780 break;
2781
2782 case eSAP_CH_SELECT:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302783 qdf_status = sap_fsm_state_ch_select(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002784 mac_ctx, hal);
2785 break;
2786
2787 case eSAP_DFS_CAC_WAIT:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302788 qdf_status = sap_fsm_state_dfs_cac_wait(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002789 mac_ctx, hal);
2790 break;
2791
2792 case eSAP_STARTING:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302793 qdf_status = sap_fsm_state_starting(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002794 mac_ctx, hal);
2795 break;
2796
2797 case eSAP_STARTED:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302798 qdf_status = sap_fsm_state_started(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002799 mac_ctx);
2800 break;
2801
2802 case eSAP_DISCONNECTING:
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302803 qdf_status = sap_fsm_state_disconnecting(sap_ctx, sap_event,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002804 mac_ctx, hal);
2805 break;
2806 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05302807 return qdf_status;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002808}
2809
2810eSapStatus
2811sapconvert_to_csr_profile(tsap_Config_t *pconfig_params, eCsrRoamBssType bssType,
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002812 struct csr_roam_profile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002813{
2814 /* Create Roam profile for SoftAP to connect */
2815 profile->BSSType = eCSR_BSS_TYPE_INFRA_AP;
2816 profile->SSIDs.numOfSSIDs = 1;
2817 profile->csrPersona = pconfig_params->persona;
2818 profile->disableDFSChSwitch = pconfig_params->disableDFSChSwitch;
2819
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302820 qdf_mem_zero(profile->SSIDs.SSIDList[0].SSID.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002821 sizeof(profile->SSIDs.SSIDList[0].SSID.ssId));
2822
2823 /* Flag to not broadcast the SSID information */
2824 profile->SSIDs.SSIDList[0].ssidHidden =
2825 pconfig_params->SSIDinfo.ssidHidden;
2826
2827 profile->SSIDs.SSIDList[0].SSID.length =
2828 pconfig_params->SSIDinfo.ssid.length;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302829 qdf_mem_copy(&profile->SSIDs.SSIDList[0].SSID.ssId,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002830 pconfig_params->SSIDinfo.ssid.ssId,
2831 sizeof(pconfig_params->SSIDinfo.ssid.ssId));
2832
2833 profile->negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
2834
2835 if (pconfig_params->authType == eSAP_OPEN_SYSTEM) {
2836 profile->negotiatedAuthType = eCSR_AUTH_TYPE_OPEN_SYSTEM;
2837 } else if (pconfig_params->authType == eSAP_SHARED_KEY) {
2838 profile->negotiatedAuthType = eCSR_AUTH_TYPE_SHARED_KEY;
2839 } else {
2840 profile->negotiatedAuthType = eCSR_AUTH_TYPE_AUTOSWITCH;
2841 }
2842
2843 profile->AuthType.numEntries = 1;
2844 profile->AuthType.authType[0] = eCSR_AUTH_TYPE_OPEN_SYSTEM;
2845
2846 /* Always set the Encryption Type */
2847 profile->EncryptionType.numEntries = 1;
2848 profile->EncryptionType.encryptionType[0] =
2849 pconfig_params->RSNEncryptType;
2850
2851 profile->mcEncryptionType.numEntries = 1;
2852 profile->mcEncryptionType.encryptionType[0] =
2853 pconfig_params->mcRSNEncryptType;
2854
2855 if (pconfig_params->privacy & eSAP_SHARED_KEY) {
2856 profile->AuthType.authType[0] = eCSR_AUTH_TYPE_SHARED_KEY;
2857 }
2858
2859 profile->privacy = pconfig_params->privacy;
2860 profile->fwdWPSPBCProbeReq = pconfig_params->fwdWPSPBCProbeReq;
2861
2862 if (pconfig_params->authType == eSAP_SHARED_KEY) {
2863 profile->csr80211AuthType = eSIR_SHARED_KEY;
2864 } else if (pconfig_params->authType == eSAP_OPEN_SYSTEM) {
2865 profile->csr80211AuthType = eSIR_OPEN_SYSTEM;
2866 } else {
2867 profile->csr80211AuthType = eSIR_AUTO_SWITCH;
2868 }
2869
2870 /* Initialize we are not going to use it */
2871 profile->pWPAReqIE = NULL;
2872 profile->nWPAReqIELength = 0;
2873
Naveen Rawat8021e452017-05-12 13:47:17 -07002874 if (profile->pRSNReqIE) {
2875 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
2876 FL("pRSNReqIE already allocated."));
2877 qdf_mem_free(profile->pRSNReqIE);
2878 profile->pRSNReqIE = NULL;
2879 }
2880
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002881 /* set the RSN/WPA IE */
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002882 profile->nRSNReqIELength = pconfig_params->RSNWPAReqIELength;
2883 if (pconfig_params->RSNWPAReqIELength) {
2884 profile->pRSNReqIE =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302885 qdf_mem_malloc(pconfig_params->RSNWPAReqIELength);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002886 if (NULL == profile->pRSNReqIE) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05302887 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002888 " %s Fail to alloc memory", __func__);
2889 return eSAP_STATUS_FAILURE;
2890 }
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302891 qdf_mem_copy(profile->pRSNReqIE, pconfig_params->RSNWPAReqIE,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002892 pconfig_params->RSNWPAReqIELength);
2893 profile->nRSNReqIELength = pconfig_params->RSNWPAReqIELength;
2894 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002895
2896 /* set the phyMode to accept anything */
2897 /* Best means everything because it covers all the things we support */
2898 /* eCSR_DOT11_MODE_BEST */
2899 profile->phyMode = pconfig_params->SapHw_mode;
2900
2901 /* Configure beaconInterval */
2902 profile->beaconInterval = (uint16_t) pconfig_params->beacon_int;
2903
2904 /* set DTIM period */
2905 profile->dtimPeriod = pconfig_params->dtim_period;
2906
2907 /* set Uapsd enable bit */
2908 profile->ApUapsdEnable = pconfig_params->UapsdEnable;
2909
2910 /* Enable protection parameters */
2911 profile->protEnabled = pconfig_params->protEnabled;
2912 profile->obssProtEnabled = pconfig_params->obssProtEnabled;
2913 profile->cfg_protection = pconfig_params->ht_capab;
2914
2915 /* country code */
2916 if (pconfig_params->countryCode[0])
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302917 qdf_mem_copy(profile->countryCode, pconfig_params->countryCode,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002918 WNI_CFG_COUNTRY_CODE_LEN);
2919 profile->ieee80211d = pconfig_params->ieee80211d;
2920 /* wps config info */
2921 profile->wps_state = pconfig_params->wps_state;
2922
2923#ifdef WLAN_FEATURE_11W
2924 /* MFP capable/required */
2925 profile->MFPCapable = pconfig_params->mfpCapable ? 1 : 0;
2926 profile->MFPRequired = pconfig_params->mfpRequired ? 1 : 0;
2927#endif
2928
2929 if (pconfig_params->probeRespIEsBufferLen > 0 &&
2930 pconfig_params->pProbeRespIEsBuffer != NULL) {
2931 profile->addIeParams.probeRespDataLen =
2932 pconfig_params->probeRespIEsBufferLen;
2933 profile->addIeParams.probeRespData_buff =
2934 pconfig_params->pProbeRespIEsBuffer;
2935 } else {
2936 profile->addIeParams.probeRespDataLen = 0;
2937 profile->addIeParams.probeRespData_buff = NULL;
2938 }
2939 /*assoc resp IE */
2940 if (pconfig_params->assocRespIEsLen > 0 &&
2941 pconfig_params->pAssocRespIEsBuffer != NULL) {
2942 profile->addIeParams.assocRespDataLen =
2943 pconfig_params->assocRespIEsLen;
2944 profile->addIeParams.assocRespData_buff =
2945 pconfig_params->pAssocRespIEsBuffer;
2946 } else {
2947 profile->addIeParams.assocRespDataLen = 0;
2948 profile->addIeParams.assocRespData_buff = NULL;
2949 }
2950
2951 if (pconfig_params->probeRespBcnIEsLen > 0 &&
2952 pconfig_params->pProbeRespBcnIEsBuffer != NULL) {
2953 profile->addIeParams.probeRespBCNDataLen =
2954 pconfig_params->probeRespBcnIEsLen;
2955 profile->addIeParams.probeRespBCNData_buff =
2956 pconfig_params->pProbeRespBcnIEsBuffer;
2957 } else {
2958 profile->addIeParams.probeRespBCNDataLen = 0;
2959 profile->addIeParams.probeRespBCNData_buff = NULL;
2960 }
2961 profile->sap_dot11mc = pconfig_params->sap_dot11mc;
2962
Agrawal Ashish06e76d22016-08-18 16:44:48 +05302963 if (pconfig_params->supported_rates.numRates) {
2964 qdf_mem_copy(profile->supported_rates.rate,
2965 pconfig_params->supported_rates.rate,
2966 pconfig_params->supported_rates.numRates);
2967 profile->supported_rates.numRates =
2968 pconfig_params->supported_rates.numRates;
2969 }
2970
2971 if (pconfig_params->extended_rates.numRates) {
2972 qdf_mem_copy(profile->extended_rates.rate,
2973 pconfig_params->extended_rates.rate,
2974 pconfig_params->extended_rates.numRates);
2975 profile->extended_rates.numRates =
2976 pconfig_params->extended_rates.numRates;
2977 }
2978
hqu16d6e082017-09-04 10:52:31 +08002979 profile->chan_switch_hostapd_rate_enabled =
2980 pconfig_params->chan_switch_hostapd_rate_enabled;
2981
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002982 return eSAP_STATUS_SUCCESS; /* Success. */
2983}
2984
Jeff Johnson66ee8a92018-03-17 15:24:26 -07002985void sap_free_roam_profile(struct csr_roam_profile *profile)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002986{
2987 if (profile->pRSNReqIE) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05302988 qdf_mem_free(profile->pRSNReqIE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002989 profile->pRSNReqIE = NULL;
2990 }
2991}
2992
Anurag Chouhan6d760662016-02-20 16:05:43 +05302993void sap_sort_mac_list(struct qdf_mac_addr *macList, uint8_t size)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002994{
2995 uint8_t outer, inner;
Anurag Chouhan6d760662016-02-20 16:05:43 +05302996 struct qdf_mac_addr temp;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08002997 int32_t nRes = -1;
2998
2999 if ((NULL == macList) || (size > MAX_ACL_MAC_ADDRESS)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303000 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003001 FL("either buffer is NULL or size = %d is more"), size);
3002 return;
3003 }
3004
3005 for (outer = 0; outer < size; outer++) {
3006 for (inner = 0; inner < size - 1; inner++) {
3007 nRes =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303008 qdf_mem_cmp((macList + inner)->bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003009 (macList + inner + 1)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303010 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003011 if (nRes > 0) {
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303012 qdf_mem_copy(temp.bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003013 (macList + inner + 1)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303014 QDF_MAC_ADDR_SIZE);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303015 qdf_mem_copy((macList + inner + 1)->bytes,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003016 (macList + inner)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303017 QDF_MAC_ADDR_SIZE);
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303018 qdf_mem_copy((macList + inner)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303019 temp.bytes, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003020 }
3021 }
3022 }
3023}
3024
Srinivas Girigowda74a66d62017-06-21 23:28:25 -07003025bool
Anurag Chouhan6d760662016-02-20 16:05:43 +05303026sap_search_mac_list(struct qdf_mac_addr *macList,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003027 uint8_t num_mac, uint8_t *peerMac,
3028 uint8_t *index)
3029{
3030 int32_t nRes = -1;
3031 int8_t nStart = 0, nEnd, nMiddle;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07003032
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003033 nEnd = num_mac - 1;
3034
3035 if ((NULL == macList) || (num_mac > MAX_ACL_MAC_ADDRESS)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303036 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003037 FL("either buffer is NULL or size = %d is more."), num_mac);
Srinivas Girigowda74a66d62017-06-21 23:28:25 -07003038 return false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003039 }
3040
3041 while (nStart <= nEnd) {
3042 nMiddle = (nStart + nEnd) / 2;
3043 nRes =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303044 qdf_mem_cmp(&macList[nMiddle], peerMac,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303045 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003046
3047 if (0 == nRes) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303048 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003049 "search SUCC");
3050 /* "index equals NULL" means the caller does not need the */
3051 /* index value of the peerMac being searched */
3052 if (index != NULL) {
3053 *index = (uint8_t) nMiddle;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303054 QDF_TRACE(QDF_MODULE_ID_SAP,
3055 QDF_TRACE_LEVEL_INFO_HIGH, "index %d",
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003056 *index);
3057 }
Srinivas Girigowda74a66d62017-06-21 23:28:25 -07003058 return true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003059 }
3060 if (nRes < 0)
3061 nStart = nMiddle + 1;
3062 else
3063 nEnd = nMiddle - 1;
3064 }
3065
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303066 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003067 "search not succ");
Srinivas Girigowda74a66d62017-06-21 23:28:25 -07003068 return false;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003069}
3070
Anurag Chouhan6d760662016-02-20 16:05:43 +05303071void sap_add_mac_to_acl(struct qdf_mac_addr *macList,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003072 uint8_t *size, uint8_t *peerMac)
3073{
3074 int32_t nRes = -1;
3075 int i;
3076
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303077 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003078 "add acl entered");
3079
Arif Hussain2988e452016-12-21 13:36:39 -08003080 if (NULL == macList || *size > MAX_ACL_MAC_ADDRESS) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303081 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003082 FL("either buffer is NULL or size = %d is incorrect."),
3083 *size);
3084 return;
3085 }
3086
3087 for (i = ((*size) - 1); i >= 0; i--) {
3088 nRes =
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303089 qdf_mem_cmp(&macList[i], peerMac, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003090 if (nRes > 0) {
3091 /* Move alphabetically greater mac addresses one index down to allow for insertion
3092 of new mac in sorted order */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303093 qdf_mem_copy((macList + i + 1)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303094 (macList + i)->bytes, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003095 } else {
3096 break;
3097 }
3098 }
3099 /* 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 +05303100 qdf_mem_copy((macList + i + 1)->bytes, peerMac, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003101 /* increment the list size */
3102 (*size)++;
3103}
3104
Anurag Chouhan6d760662016-02-20 16:05:43 +05303105void sap_remove_mac_from_acl(struct qdf_mac_addr *macList,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003106 uint8_t *size, uint8_t index)
3107{
3108 int i;
3109
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303110 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003111 "remove acl entered");
3112 /*
3113 * Return if the list passed is empty. Ideally this should never happen
3114 * since this funcn is always called after sap_search_mac_list to get
3115 * the index of the mac addr to be removed and this will only get
3116 * called if the search is successful. Still no harm in having the check
3117 */
3118 if ((macList == NULL) || (*size == 0) ||
3119 (*size > MAX_ACL_MAC_ADDRESS)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303120 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003121 FL("either buffer is NULL or size %d is incorrect."),
3122 *size);
3123 return;
3124 }
3125 for (i = index; i < ((*size) - 1); i++) {
3126 /* Move mac addresses starting from "index" passed one index up to delete the void
3127 created by deletion of a mac address in ACL */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303128 qdf_mem_copy((macList + i)->bytes, (macList + i + 1)->bytes,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303129 QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003130 }
3131 /* The last space should be made empty since all mac addesses moved one step up */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303132 qdf_mem_zero((macList + (*size) - 1)->bytes, QDF_MAC_ADDR_SIZE);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003133 /* reduce the list size by 1 */
3134 (*size)--;
3135}
3136
Anurag Chouhan6d760662016-02-20 16:05:43 +05303137void sap_print_acl(struct qdf_mac_addr *macList, uint8_t size)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003138{
3139 int i;
3140 uint8_t *macArray;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07003141
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303142 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003143 "print acl entered");
3144
3145 if ((NULL == macList) || (size == 0) || (size >= MAX_ACL_MAC_ADDRESS)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303146 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003147 "In %s, either buffer is NULL or size %d is incorrect.",
3148 __func__, size);
3149 return;
3150 }
3151
3152 for (i = 0; i < size; i++) {
3153 macArray = (macList + i)->bytes;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303154 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003155 "** ACL entry %i - " MAC_ADDRESS_STR, i,
3156 MAC_ADDR_ARRAY(macArray));
3157 }
3158 return;
3159}
3160
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07003161QDF_STATUS sap_is_peer_mac_allowed(struct sap_context *sapContext,
3162 uint8_t *peerMac)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003163{
3164 if (eSAP_ALLOW_ALL == sapContext->eSapMacAddrAclMode)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303165 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003166
3167 if (sap_search_mac_list
3168 (sapContext->acceptMacList, sapContext->nAcceptMac, peerMac, NULL))
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303169 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003170
3171 if (sap_search_mac_list
3172 (sapContext->denyMacList, sapContext->nDenyMac, peerMac, NULL)) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303173 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003174 "In %s, Peer " MAC_ADDRESS_STR " in deny list",
3175 __func__, MAC_ADDR_ARRAY(peerMac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303176 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003177 }
3178 /* A new station CAN associate, unless in deny list. Less stringent mode */
3179 if (eSAP_ACCEPT_UNLESS_DENIED == sapContext->eSapMacAddrAclMode)
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303180 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003181
3182 /* A new station CANNOT associate, unless in accept list. More stringent mode */
3183 if (eSAP_DENY_UNLESS_ACCEPTED == sapContext->eSapMacAddrAclMode) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303184 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003185 "In %s, Peer " MAC_ADDRESS_STR
3186 " denied, Mac filter mode is eSAP_DENY_UNLESS_ACCEPTED",
3187 __func__, MAC_ADDR_ARRAY(peerMac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303188 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003189 }
3190
3191 /* The new STA is neither in accept list nor in deny list. In this case, deny the association
3192 * but send a wifi event notification indicating the mac address being denied
3193 */
3194 if (eSAP_SUPPORT_ACCEPT_AND_DENY == sapContext->eSapMacAddrAclMode) {
3195 sap_signal_hdd_event(sapContext, NULL, eSAP_UNKNOWN_STA_JOIN,
3196 (void *) peerMac);
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303197 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003198 "In %s, Peer " MAC_ADDRESS_STR
3199 " denied, Mac filter mode is eSAP_SUPPORT_ACCEPT_AND_DENY",
3200 __func__, MAC_ADDR_ARRAY(peerMac));
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303201 return QDF_STATUS_E_FAILURE;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003202 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303203 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003204}
3205
3206#ifdef SOFTAP_CHANNEL_RANGE
3207/**
3208 * sap_get_channel_list() - get the list of channels
3209 * @sap_ctx: sap context
3210 * @ch_list: pointer to channel list array
3211 * @num_ch: pointer to number of channels.
3212 *
3213 * This function populates the list of channels for scanning.
3214 *
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303215 * Return: QDF_STATUS
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003216 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07003217static QDF_STATUS sap_get_channel_list(struct sap_context *sap_ctx,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003218 uint8_t **ch_list,
3219 uint8_t *num_ch)
3220{
3221 uint8_t loop_count;
3222 uint8_t *list;
3223 uint8_t ch_count;
3224 uint8_t start_ch_num, band_start_ch;
3225 uint8_t end_ch_num, band_end_ch;
3226 uint32_t en_lte_coex;
Jeff Johnsonc0db3842017-09-13 18:34:28 -07003227 tHalHandle hal = CDS_GET_HAL_CB();
Dustin Brown0ce56d32016-10-17 16:18:03 -07003228#ifdef FEATURE_WLAN_CH_AVOID
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003229 uint8_t i;
3230#endif
3231 tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
Tushnim Bhattacharyya691680e2018-01-23 20:50:06 -08003232 tSapChSelSpectInfo spect_info_obj = { NULL, 0 };
Himanshu Agarwal91c5c0f2018-02-13 14:40:56 +05303233 uint16_t ch_width;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003234
3235 if (NULL == hal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303236 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003237 FL("Invalid HAL pointer from p_cds_gctx"));
3238 *num_ch = 0;
3239 *ch_list = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303240 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003241 }
3242
3243 start_ch_num = sap_ctx->acs_cfg->start_ch;
3244 end_ch_num = sap_ctx->acs_cfg->end_ch;
Himanshu Agarwal91c5c0f2018-02-13 14:40:56 +05303245 ch_width = sap_ctx->acs_cfg->ch_width;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303246 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Himanshu Agarwal91c5c0f2018-02-13 14:40:56 +05303247 FL("startChannel %d, EndChannel %d, ch_width %d, HW:%d"),
3248 start_ch_num, end_ch_num, ch_width,
3249 sap_ctx->acs_cfg->hw_mode);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003250
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07003251 wlansap_extend_to_acs_range(hal, &start_ch_num, &end_ch_num,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003252 &band_start_ch, &band_end_ch);
3253
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303254 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003255 FL("expanded startChannel %d,EndChannel %d"),
3256 start_ch_num, end_ch_num);
3257
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303258 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003259 FL("band_start_ch %d, band_end_ch %d"),
3260 band_start_ch, band_end_ch);
3261
3262 sme_cfg_get_int(hal, WNI_CFG_ENABLE_LTE_COEX, &en_lte_coex);
3263
3264 /* Check if LTE coex is enabled and 2.4GHz is selected */
Amar Singhalb8d4f152016-02-10 10:21:43 -08003265 if (en_lte_coex && (band_start_ch == CHAN_ENUM_1) &&
3266 (band_end_ch == CHAN_ENUM_14)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003267 /* Set 2.4GHz upper limit to channel 9 for LTE COEX */
Amar Singhalb8d4f152016-02-10 10:21:43 -08003268 band_end_ch = CHAN_ENUM_9;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003269 }
3270
3271 /* Allocate the max number of channel supported */
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303272 list = (uint8_t *) qdf_mem_malloc(NUM_5GHZ_CHANNELS +
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003273 NUM_24GHZ_CHANNELS);
3274 if (NULL == list) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303275 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003276 FL("Unable to allocate channel list"));
3277 *num_ch = 0;
3278 *ch_list = NULL;
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303279 return QDF_STATUS_E_NOMEM;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003280 }
3281
3282 /* Search for the Active channels in the given range */
3283 ch_count = 0;
3284 for (loop_count = band_start_ch; loop_count <= band_end_ch;
3285 loop_count++) {
3286 /* go to next channel if rf_channel is out of range */
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07003287 if ((start_ch_num > WLAN_REG_CH_NUM(loop_count)) ||
3288 (end_ch_num < WLAN_REG_CH_NUM(loop_count)))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003289 continue;
3290 /*
3291 * go to next channel if none of these condition pass
3292 * - DFS scan enabled and chan not in CHANNEL_STATE_DISABLE
3293 * - DFS scan disable but chan in CHANNEL_STATE_ENABLE
3294 */
Srinivas Girigowda74a66d62017-06-21 23:28:25 -07003295 if (!(((true == mac_ctx->scan.fEnableDFSChnlScan) &&
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07003296 wlan_reg_get_channel_state(mac_ctx->pdev, loop_count)) ||
Srinivas Girigowda74a66d62017-06-21 23:28:25 -07003297 ((false == mac_ctx->scan.fEnableDFSChnlScan) &&
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003298 (CHANNEL_STATE_ENABLE ==
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07003299 wlan_reg_get_channel_state(mac_ctx->pdev, loop_count)))))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003300 continue;
3301
Tushnim Bhattacharyya691680e2018-01-23 20:50:06 -08003302 /*
3303 * Skip the channels which are not in ACS config from user
3304 * space
3305 */
3306 if (SAP_CHANNEL_NOT_SELECTED ==
3307 sap_channel_in_acs_channel_list(
3308 WLAN_REG_CH_NUM(loop_count),
3309 sap_ctx, &spect_info_obj))
3310 continue;
Bala Venkatesh82914ad2018-04-03 16:34:11 +05303311 /* Dont scan DFS channels in case of MCC disallowed
3312 * As it can result in SAP starting on DFS channel
3313 * resulting MCC on DFS channel
3314 */
3315 if (wlan_reg_is_dfs_ch(mac_ctx->pdev,
3316 WLAN_REG_CH_NUM(loop_count)) &&
3317 policy_mgr_disallow_mcc(mac_ctx->psoc,
3318 WLAN_REG_CH_NUM(loop_count)))
3319 continue;
Tushnim Bhattacharyya691680e2018-01-23 20:50:06 -08003320
Himanshu Agarwal91c5c0f2018-02-13 14:40:56 +05303321 /*
3322 * If we have any 5Ghz channel in the channel list
3323 * and bw is 40/80/160 Mhz then we don't want SAP to
3324 * come up in 2.4Ghz as for 40Mhz, 2.4Ghz channel is
3325 * not preferred and 80/160Mhz is not allowed for 2.4Ghz
3326 * band. So, don't even scan on 2.4Ghz channels if bw is
3327 * 40/80/160Mhz and channel list has any 5Ghz channel.
3328 */
3329 if (end_ch_num >= WLAN_REG_CH_NUM(CHAN_ENUM_36) &&
3330 ((ch_width == CH_WIDTH_40MHZ) ||
3331 (ch_width == CH_WIDTH_80MHZ) ||
3332 (ch_width == CH_WIDTH_80P80MHZ) ||
3333 (ch_width == CH_WIDTH_160MHZ))) {
3334 if (WLAN_REG_CH_NUM(loop_count) >=
3335 WLAN_REG_CH_NUM(CHAN_ENUM_1) &&
3336 WLAN_REG_CH_NUM(loop_count) <=
3337 WLAN_REG_CH_NUM(CHAN_ENUM_14))
3338 continue;
3339 }
3340
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003341#ifdef FEATURE_WLAN_CH_AVOID
Amar Singhalb8d4f152016-02-10 10:21:43 -08003342 for (i = 0; i < NUM_CHANNELS; i++) {
Srinivas Girigowdaf326dfe2017-08-03 11:28:32 -07003343 if (safe_channels[i].channelNumber ==
3344 WLAN_REG_CH_NUM(loop_count)) {
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003345 /* Check if channel is safe */
3346 if (true == safe_channels[i].isSafe) {
3347#endif
3348#ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE
3349 uint8_t ch;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07003350
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07003351 ch = WLAN_REG_CH_NUM(loop_count);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003352 if ((sap_ctx->acs_cfg->skip_scan_status ==
3353 eSAP_DO_PAR_ACS_SCAN)) {
3354 if ((ch >= sap_ctx->acs_cfg->skip_scan_range1_stch &&
3355 ch <= sap_ctx->acs_cfg->skip_scan_range1_endch) ||
3356 (ch >= sap_ctx->acs_cfg->skip_scan_range2_stch &&
3357 ch <= sap_ctx->acs_cfg->skip_scan_range2_endch)) {
3358 list[ch_count] =
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07003359 WLAN_REG_CH_NUM(loop_count);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003360 ch_count++;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303361 QDF_TRACE(QDF_MODULE_ID_SAP,
3362 QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003363 FL("%d %d added to ACS ch range"),
3364 ch_count, ch);
3365 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303366 QDF_TRACE(QDF_MODULE_ID_SAP,
3367 QDF_TRACE_LEVEL_INFO_HIGH,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003368 FL("%d %d skipped from ACS ch range"),
3369 ch_count, ch);
3370 }
3371 } else {
3372 list[ch_count] =
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07003373 WLAN_REG_CH_NUM(loop_count);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003374 ch_count++;
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303375 QDF_TRACE(QDF_MODULE_ID_SAP,
3376 QDF_TRACE_LEVEL_INFO,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003377 FL("%d %d added to ACS ch range"),
3378 ch_count, ch);
3379 }
3380#else
Kiran Kumar Lokerea3de2262017-04-12 12:15:04 -07003381 list[ch_count] = WLAN_REG_CH_NUM(loop_count);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003382 ch_count++;
3383#endif
3384#ifdef FEATURE_WLAN_CH_AVOID
3385 }
3386 break;
3387 }
3388 }
3389#endif
3390 }
3391 if (0 == ch_count) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303392 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003393 FL("No active channels present for the current region"));
3394 /*
3395 * LTE COEX: channel range outside the restricted 2.4GHz
3396 * band limits
3397 */
3398 if (en_lte_coex && (start_ch_num > band_end_ch))
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303399 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_FATAL,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003400 FL("SAP can't be started as due to LTE COEX"));
3401 }
3402
3403 /* return the channel list and number of channels to scan */
3404 *num_ch = ch_count;
3405 if (ch_count != 0) {
3406 *ch_list = list;
3407 } else {
3408 *ch_list = NULL;
Anurag Chouhan600c3a02016-03-01 10:33:54 +05303409 qdf_mem_free(list);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003410 }
3411
3412 for (loop_count = 0; loop_count < ch_count; loop_count++) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303413 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003414 FL("channel number: %d"), list[loop_count]);
3415 }
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303416 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003417}
3418#endif
3419
Wen Gong01a2c632018-04-11 18:34:55 +08003420#ifdef DFS_COMPONENT_ENABLE
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07003421uint8_t sap_indicate_radar(struct sap_context *sap_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003422{
3423 uint8_t target_channel = 0;
Arif Hussaincd151632017-02-11 16:57:19 -08003424 tHalHandle hal;
3425 tpAniSirGlobal mac;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003426
Arif Hussaincd151632017-02-11 16:57:19 -08003427 if (!sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303428 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Arif Hussaincd151632017-02-11 16:57:19 -08003429 FL("null sap_ctx"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003430 return 0;
3431 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003432
Jeff Johnsonc0db3842017-09-13 18:34:28 -07003433 hal = CDS_GET_HAL_CB();
Arif Hussaincd151632017-02-11 16:57:19 -08003434 if (!hal) {
3435 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
3436 FL("null hal"));
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003437 return 0;
3438 }
3439
Arif Hussaincd151632017-02-11 16:57:19 -08003440 mac = PMAC_STRUCT(hal);
3441
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003442 /*
3443 * SAP needs to generate Channel Switch IE
3444 * if the radar is found in the STARTED state
3445 */
Arif Hussaincd151632017-02-11 16:57:19 -08003446 if (eSAP_STARTED == sap_ctx->sapsMachine)
Srinivas Girigowda74a66d62017-06-21 23:28:25 -07003447 mac->sap.SapDfsInfo.csaIERequired = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003448
Arif Hussaincd151632017-02-11 16:57:19 -08003449 if (sap_ctx->csr_roamProfile.disableDFSChSwitch)
3450 return sap_ctx->channel;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003451
3452 /* set the Radar Found flag in SapDfsInfo */
Arif Hussaincd151632017-02-11 16:57:19 -08003453 mac->sap.SapDfsInfo.sap_radar_found_status = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003454
Arif Hussaincd151632017-02-11 16:57:19 -08003455 if (sap_ctx->chan_before_pre_cac) {
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303456 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
3457 FL("sapdfs: set chan before pre cac %d as target chan"),
Arif Hussaincd151632017-02-11 16:57:19 -08003458 sap_ctx->chan_before_pre_cac);
3459 return sap_ctx->chan_before_pre_cac;
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303460 }
3461
Himanshu Agarwaldfc4dca2017-08-29 19:49:05 +05303462 if (sap_ctx->vendor_acs_dfs_lte_enabled && (QDF_STATUS_SUCCESS ==
Arif Hussaincd151632017-02-11 16:57:19 -08003463 sap_signal_hdd_event(sap_ctx, NULL, eSAP_DFS_NEXT_CHANNEL_REQ,
3464 (void *) eSAP_STATUS_SUCCESS)))
Himanshu Agarwaldfc4dca2017-08-29 19:49:05 +05303465 return 0;
Kapil Gupta8878ad92017-02-13 11:56:04 +05303466
Arif Hussaincd151632017-02-11 16:57:19 -08003467 target_channel = sap_random_channel_sel(sap_ctx);
3468 if (!target_channel)
3469 sap_signal_hdd_event(sap_ctx, NULL,
3470 eSAP_DFS_NO_AVAILABLE_CHANNEL, (void *) eSAP_STATUS_SUCCESS);
3471
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303472 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003473 FL("sapdfs: New selected target channel is [%d]"),
3474 target_channel);
Arif Hussaincd151632017-02-11 16:57:19 -08003475
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003476 return target_channel;
3477}
Wen Gong01a2c632018-04-11 18:34:55 +08003478#endif
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003479
3480/*
3481 * CAC timer callback function.
3482 * Post eSAP_DFS_CHANNEL_CAC_END event to sap_fsm().
3483 */
3484void sap_dfs_cac_timer_callback(void *data)
3485{
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07003486 struct sap_context *sapContext;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003487 tWLAN_SAPEvent sapEvent;
3488 tHalHandle hHal = (tHalHandle) data;
3489 tpAniSirGlobal pMac;
3490
3491 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303492 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003493 "In %s invalid hHal", __func__);
3494 return;
3495 }
3496 pMac = PMAC_STRUCT(hHal);
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303497 sapContext = sap_find_cac_wait_session(hHal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003498 if (NULL == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303499 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303500 "%s: no SAP contexts in wait state", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003501 return;
3502 }
3503
Naveen Rawat6de46452016-06-08 10:02:26 -07003504 /*
3505 * SAP may not be in CAC wait state, when the timer runs out.
3506 * if following flag is set, then timer is in initialized state,
3507 * destroy timer here.
3508 */
3509 if (pMac->sap.SapDfsInfo.is_dfs_cac_timer_running == true) {
Arif Hussain759a0232017-03-20 13:17:18 -07003510 if (!sapContext->dfs_cac_offload)
3511 qdf_mc_timer_destroy(
3512 &pMac->sap.SapDfsInfo.sap_dfs_cac_timer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003513 pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = false;
Naveen Rawat6de46452016-06-08 10:02:26 -07003514 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003515
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303516 /*
3517 * CAC Complete, post eSAP_DFS_CHANNEL_CAC_END to sap_fsm
3518 */
3519 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Jeff Johnsona7c0ddb2017-09-18 08:14:12 -07003520 "sapdfs: Sending eSAP_DFS_CHANNEL_CAC_END for target_channel = %d on sapctx[%pK]",
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303521 sapContext->channel, sapContext);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003522
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303523 sapEvent.event = eSAP_DFS_CHANNEL_CAC_END;
3524 sapEvent.params = 0;
3525 sapEvent.u1 = 0;
3526 sapEvent.u2 = 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003527
Manishekar Chandrasekaran9e8c7be2016-08-03 14:57:14 +05303528 sap_fsm(sapContext, &sapEvent);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003529}
3530
3531/*
3532 * Function to stop the DFS CAC Timer
3533 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07003534static int sap_stop_dfs_cac_timer(struct sap_context *sapContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003535{
3536 tHalHandle hHal;
3537 tpAniSirGlobal pMac;
Srinivas Girigowda4d65ebe2017-10-13 21:41:42 -07003538
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003539 if (sapContext == NULL)
3540 return 0;
3541
Jeff Johnsonc0db3842017-09-13 18:34:28 -07003542 hHal = CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003543 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303544 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003545 "In %s invalid hHal", __func__);
3546 return 0;
3547 }
3548 pMac = PMAC_STRUCT(hHal);
3549
Arif Hussaincd151632017-02-11 16:57:19 -08003550 if (sapContext->dfs_cac_offload) {
3551 pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = 0;
3552 return 0;
3553 }
3554
Anurag Chouhan210db072016-02-22 18:42:15 +05303555 if (QDF_TIMER_STATE_RUNNING !=
3556 qdf_mc_timer_get_current_state(&pMac->sap.SapDfsInfo.
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003557 sap_dfs_cac_timer)) {
3558 return 0;
3559 }
3560
Anurag Chouhan210db072016-02-22 18:42:15 +05303561 qdf_mc_timer_stop(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003562 pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = 0;
Naveen Rawat6de46452016-06-08 10:02:26 -07003563 qdf_mc_timer_destroy(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003564
3565 return 0;
3566}
3567
3568
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003569/*
3570 * Function to start the DFS CAC Timer
3571 * when SAP is started on a DFS channel
3572 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07003573static int sap_start_dfs_cac_timer(struct sap_context *sap_ctx)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003574{
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303575 QDF_STATUS status;
Arif Hussain671a1902017-03-17 09:08:32 -07003576 uint32_t cac_dur;
3577 tHalHandle hal = NULL;
3578 tpAniSirGlobal mac = NULL;
Amar Singhal5cccafe2017-02-15 12:42:58 -08003579 enum dfs_reg dfs_region;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003580
Arif Hussain671a1902017-03-17 09:08:32 -07003581 if (!sap_ctx) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303582 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Arif Hussain671a1902017-03-17 09:08:32 -07003583 "%s: null sap_ctx", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003584 return 0;
3585 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003586
Jeff Johnsonc0db3842017-09-13 18:34:28 -07003587 hal = CDS_GET_HAL_CB();
Arif Hussain671a1902017-03-17 09:08:32 -07003588 if (!hal) {
3589 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
3590 "%s: null hal", __func__);
3591 return 0;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003592 }
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003593
Arif Hussain671a1902017-03-17 09:08:32 -07003594 mac = PMAC_STRUCT(hal);
Arif Hussain759a0232017-03-20 13:17:18 -07003595 if (sap_ctx->dfs_cac_offload) {
3596 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
3597 "%s: cac timer offloaded to firmware", __func__);
3598 mac->sap.SapDfsInfo.is_dfs_cac_timer_running = true;
3599 return 1;
3600 }
3601
Arif Hussain671a1902017-03-17 09:08:32 -07003602 sap_get_cac_dur_dfs_region(sap_ctx, &cac_dur, &dfs_region);
3603 if (0 == cac_dur)
3604 return 0;
Arif Hussain4d43b9b2017-01-20 18:33:00 -08003605
3606#ifdef QCA_WIFI_NAPIER_EMULATION
Arif Hussain671a1902017-03-17 09:08:32 -07003607 cac_dur = cac_dur / 100;
Arif Hussain4d43b9b2017-01-20 18:33:00 -08003608#endif
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303609 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED,
Arif Hussain671a1902017-03-17 09:08:32 -07003610 "sapdfs: SAP_DFS_CHANNEL_CAC_START on CH-%d, CAC_DUR-%d sec",
3611 sap_ctx->channel, cac_dur / 1000);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003612
Arif Hussain671a1902017-03-17 09:08:32 -07003613 qdf_mc_timer_init(&mac->sap.SapDfsInfo.sap_dfs_cac_timer,
Anurag Chouhan6d760662016-02-20 16:05:43 +05303614 QDF_TIMER_TYPE_SW,
Arif Hussain671a1902017-03-17 09:08:32 -07003615 sap_dfs_cac_timer_callback, (void *)hal);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003616
Arif Hussain671a1902017-03-17 09:08:32 -07003617 /* Start the CAC timer */
3618 status = qdf_mc_timer_start(&mac->sap.SapDfsInfo.sap_dfs_cac_timer,
3619 cac_dur);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303620 if (status == QDF_STATUS_SUCCESS) {
Arif Hussain671a1902017-03-17 09:08:32 -07003621 mac->sap.SapDfsInfo.is_dfs_cac_timer_running = true;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003622 return 1;
3623 } else {
Arif Hussain671a1902017-03-17 09:08:32 -07003624 mac->sap.SapDfsInfo.is_dfs_cac_timer_running = false;
3625 qdf_mc_timer_destroy(&mac->sap.SapDfsInfo.sap_dfs_cac_timer);
3626 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
3627 "%s: failed to start cac timer", __func__);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003628 return 0;
3629 }
3630}
3631
3632/*
3633 * This function initializes the NOL list
3634 * parameters required to track the radar
3635 * found DFS channels in the current Reg. Domain .
3636 */
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07003637QDF_STATUS sap_init_dfs_channel_nol_list(struct sap_context *sapContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003638{
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003639 tHalHandle hHal;
3640 tpAniSirGlobal pMac;
3641
3642 if (NULL == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303643 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003644 "Invalid sapContext pointer on sap_init_dfs_channel_nol_list");
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303645 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003646 }
Jeff Johnsonc0db3842017-09-13 18:34:28 -07003647 hHal = CDS_GET_HAL_CB();
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003648
3649 if (NULL == hHal) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303650 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003651 "In %s invalid hHal", __func__);
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303652 return QDF_STATUS_E_FAULT;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003653 }
3654 pMac = PMAC_STRUCT(hHal);
3655
bings02297ab2018-01-19 14:11:42 +08003656 utils_dfs_init_nol(pMac->pdev);
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003657
Anurag Chouhanfb54ab02016-02-18 18:00:46 +05303658 return QDF_STATUS_SUCCESS;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003659}
3660
3661/*
3662 * This function will calculate how many interfaces
3663 * have sap persona and returns total number of sap persona.
3664 */
3665uint8_t sap_get_total_number_sap_intf(tHalHandle hHal)
3666{
3667 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
3668 uint8_t intf = 0;
3669 uint8_t intf_count = 0;
3670
3671 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
Anurag Chouhan6d760662016-02-20 16:05:43 +05303672 if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003673 ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05303674 (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003675 && pMac->sap.sapCtxList[intf].pSapContext != NULL) {
3676 intf_count++;
3677 }
3678 }
3679 return intf_count;
3680}
3681
Krunal Sonie8324ce2017-09-25 10:16:56 -07003682/**
3683 * is_concurrent_sap_ready_for_channel_change() - to check all saps are ready
3684 * for channel change
3685 * @hHal: HAL pointer
3686 * @sapContext: sap context for which this function has been called
3687 *
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003688 * This function will find the concurrent sap context apart from
3689 * passed sap context and return its channel change ready status
Krunal Sonie8324ce2017-09-25 10:16:56 -07003690 *
3691 *
3692 * Return: true if other SAP personas are ready to channel switch else false
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003693 */
3694bool is_concurrent_sap_ready_for_channel_change(tHalHandle hHal,
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07003695 struct sap_context *sapContext)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003696{
3697 tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07003698 struct sap_context *pSapContext;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003699 uint8_t intf = 0;
3700
3701 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
Anurag Chouhan6d760662016-02-20 16:05:43 +05303702 if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona)
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003703 ||
Anurag Chouhan6d760662016-02-20 16:05:43 +05303704 (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona))
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003705 && pMac->sap.sapCtxList[intf].pSapContext != NULL) {
3706 pSapContext =
Jeff Johnsonf1cd3c72017-09-14 07:18:06 -07003707 pMac->sap.sapCtxList[intf].pSapContext;
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003708 if (pSapContext == sapContext) {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303709 QDF_TRACE(QDF_MODULE_ID_SAP,
3710 QDF_TRACE_LEVEL_ERROR,
Jeff Johnsona7c0ddb2017-09-18 08:14:12 -07003711 FL("sapCtx matched [%pK]"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003712 sapContext);
3713 continue;
3714 } else {
Anurag Chouhanb2dc16f2016-02-25 11:47:37 +05303715 QDF_TRACE(QDF_MODULE_ID_SAP,
3716 QDF_TRACE_LEVEL_ERROR,
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003717 FL
Jeff Johnsona7c0ddb2017-09-18 08:14:12 -07003718 ("concurrent sapCtx[%pK] didn't matche with [%pK]"),
Prakash Dhavali7090c5f2015-11-02 17:55:19 -08003719 pSapContext, sapContext);
3720 return pSapContext->is_sap_ready_for_chnl_chng;
3721 }
3722 }
3723 }
3724 return false;
3725}
Krunal Sonie8324ce2017-09-25 10:16:56 -07003726
3727/**
3728 * sap_is_conc_sap_doing_scc_dfs() - check if conc SAPs are doing SCC DFS
3729 * @hal: pointer to hal
3730 * @sap_context: current SAP persona's channel
3731 *
3732 * If provided SAP's channel is DFS then Loop through each SAP or GO persona and
3733 * check if other beaconing entity's channel is same DFS channel. If they are
3734 * same then concurrent sap is doing SCC DFS.
3735 *
3736 * Return: true if two or more beaconing entitity doing SCC DFS else false
3737 */
3738bool sap_is_conc_sap_doing_scc_dfs(tHalHandle hal,
3739 struct sap_context *given_sapctx)
3740{
3741 tpAniSirGlobal mac = PMAC_STRUCT(hal);
3742 struct sap_context *sap_ctx;
3743 uint8_t intf = 0, scc_dfs_counter = 0;
3744
3745 /*
3746 * current SAP persona's channel itself is not DFS, so no need to check
3747 * what other persona's channel is
3748 */
3749 if (!wlan_reg_is_dfs_ch(mac->pdev,
3750 given_sapctx->csr_roamProfile.operationChannel)) {
3751 QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG,
3752 FL("skip this loop as provided channel is non-dfs"));
3753 return false;
3754 }
3755
3756 for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) {
3757 if ((QDF_SAP_MODE != mac->sap.sapCtxList[intf].sapPersona) &&
3758 (QDF_P2P_GO_MODE != mac->sap.sapCtxList[intf].sapPersona))
3759 continue;
3760 if (!mac->sap.sapCtxList[intf].pSapContext)
3761 continue;
3762 sap_ctx = mac->sap.sapCtxList[intf].pSapContext;
3763 /* if same SAP contexts then skip to next context */
3764 if (sap_ctx == given_sapctx)
3765 continue;
3766 if (given_sapctx->csr_roamProfile.operationChannel ==
3767 sap_ctx->csr_roamProfile.operationChannel)
3768 scc_dfs_counter++;
3769 }
3770
3771 /* Found atleast two of the beaconing entities doing SCC DFS */
3772 if (scc_dfs_counter)
3773 return true;
3774
3775 return false;
3776}