Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1 | /* |
wadesong | c46581b | 2017-12-26 13:29:29 +0800 | [diff] [blame] | 2 | * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3 | * |
| 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 30 | s a p F s m . C |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 31 | |
| 32 | OVERVIEW: |
| 33 | |
| 34 | This software unit holds the implementation of the WLAN SAP Finite |
| 35 | State Machine modules |
| 36 | |
| 37 | DEPENDENCIES: |
| 38 | |
| 39 | Are listed for each API below. |
| 40 | ===========================================================================*/ |
| 41 | |
| 42 | /*---------------------------------------------------------------------------- |
| 43 | * Include Files |
| 44 | * -------------------------------------------------------------------------*/ |
| 45 | #include "sap_internal.h" |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 46 | #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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 50 | /* 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 Chouhan | c554842 | 2016-02-24 18:33:27 +0530 | [diff] [blame] | 56 | #include "qdf_util.h" |
Tushnim Bhattacharyya | 66348bd | 2017-03-09 15:02:10 -0800 | [diff] [blame] | 57 | #include "wlan_policy_mgr_api.h" |
Rachit Kankane | 2487f8f | 2017-04-19 14:30:19 +0530 | [diff] [blame] | 58 | #include "cfg_api.h" |
Sandeep Puligilla | 0806e0f | 2017-03-06 19:25:47 -0800 | [diff] [blame] | 59 | #include <wlan_objmgr_pdev_obj.h> |
| 60 | #include <wlan_objmgr_vdev_obj.h> |
| 61 | #include <wlan_utility.h> |
Tushnim Bhattacharyya | 45ed04f | 2017-03-15 10:15:05 -0700 | [diff] [blame] | 62 | #include <linux/netdevice.h> |
| 63 | #include <net/cfg80211.h> |
| 64 | #include <qca_vendor.h> |
| 65 | #include <wlan_scan_ucfg_api.h> |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 66 | #include "wlan_reg_services_api.h" |
Tushnim Bhattacharyya | 45ed04f | 2017-03-15 10:15:05 -0700 | [diff] [blame] | 67 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 68 | /*---------------------------------------------------------------------------- |
| 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 |
| 84 | extern sapSafeChannelType safe_channels[]; |
| 85 | #endif /* FEATURE_WLAN_CH_AVOID */ |
| 86 | |
| 87 | /*---------------------------------------------------------------------------- |
| 88 | * Static Variable Definitions |
| 89 | * -------------------------------------------------------------------------*/ |
| 90 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 91 | /*---------------------------------------------------------------------------- |
| 92 | * Static Function Declarations and Definitions |
| 93 | * -------------------------------------------------------------------------*/ |
| 94 | #ifdef SOFTAP_CHANNEL_RANGE |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 95 | static QDF_STATUS sap_get_channel_list(struct sap_context *sapContext, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 96 | uint8_t **channelList, |
| 97 | uint8_t *numberOfChannels); |
| 98 | #endif |
| 99 | |
| 100 | /*========================================================================== |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 101 | 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 Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 117 | static int sap_stop_dfs_cac_timer(struct sap_context *sapContext); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 118 | |
| 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 Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 136 | static int sap_start_dfs_cac_timer(struct sap_context *sapContext); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 137 | |
| 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 | */ |
| 145 | static 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 157 | CASE_RETURN_STRING(eSAP_WPS_PBC_PROBE_REQ_EVENT); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 158 | 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 Veetil | 8d3cbee | 2017-05-28 18:25:47 -0700 | [diff] [blame] | 164 | CASE_RETURN_STRING(eSAP_DFS_CAC_INTERRUPTED); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 165 | CASE_RETURN_STRING(eSAP_DFS_CAC_END); |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 166 | CASE_RETURN_STRING(eSAP_DFS_PRE_CAC_END); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 167 | CASE_RETURN_STRING(eSAP_DFS_RADAR_DETECT); |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 168 | CASE_RETURN_STRING(eSAP_DFS_RADAR_DETECT_DURING_PRE_CAC); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 169 | 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 Veetil | 8d3cbee | 2017-05-28 18:25:47 -0700 | [diff] [blame] | 174 | CASE_RETURN_STRING(eSAP_ECSA_CHANGE_CHAN_IND); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 175 | 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 | ============================================================================*/ |
| 208 | static 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 Gong | 01a2c63 | 2018-04-11 18:34:55 +0800 | [diff] [blame^] | 216 | #ifdef DFS_COMPONENT_ENABLE |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 217 | /** |
| 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 Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 227 | static uint8_t sap_random_channel_sel(struct sap_context *sap_ctx) |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 228 | { |
Arif Hussain | 4549efa | 2017-10-10 17:10:47 -0700 | [diff] [blame] | 229 | uint8_t ch; |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 230 | 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 Johnson | c0db384 | 2017-09-13 18:34:28 -0700 | [diff] [blame] | 238 | hal = CDS_GET_HAL_CB(); |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 239 | 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 Dong | fc26cda | 2018-01-24 05:08:51 -0500 | [diff] [blame] | 268 | 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 Hussain | 4549efa | 2017-10-10 17:10:47 -0700 | [diff] [blame] | 275 | if (QDF_IS_STATUS_ERROR(utils_dfs_get_random_channel( |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 276 | 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 | } |
bings | 1f55b66 | 2018-01-18 14:35:36 +0800 | [diff] [blame] | 285 | 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 Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 290 | return ch; |
| 291 | } |
Wen Gong | 01a2c63 | 2018-04-11 18:34:55 +0800 | [diff] [blame^] | 292 | #else |
| 293 | static uint8_t sap_random_channel_sel(struct sap_context *sap_ctx) |
| 294 | { |
| 295 | return 0; |
| 296 | } |
| 297 | #endif |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 298 | |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 299 | /** |
| 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 Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 308 | static bool |
| 309 | sap_is_channel_bonding_etsi_weather_channel(struct sap_context *sap_ctx) |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 310 | { |
| 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 | |
bings | d60c0b4 | 2017-09-07 01:30:29 +0800 | [diff] [blame] | 318 | /* |
| 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 | */ |
| 328 | static 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 Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 403 | /** |
Arif Hussain | 72edc59 | 2017-04-17 13:07:37 -0700 | [diff] [blame] | 404 | * 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 | */ |
| 410 | static 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 Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 465 | * 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 Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 474 | static void sap_get_cac_dur_dfs_region(struct sap_context *sap_ctx, |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 475 | uint32_t *cac_duration_ms, |
| 476 | uint32_t *dfs_region) |
| 477 | { |
Arif Hussain | 72edc59 | 2017-04-17 13:07:37 -0700 | [diff] [blame] | 478 | 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 Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 482 | tHalHandle hal = NULL; |
| 483 | tpAniSirGlobal mac = NULL; |
| 484 | |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 485 | 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 Johnson | c0db384 | 2017-09-13 18:34:28 -0700 | [diff] [blame] | 491 | hal = CDS_GET_HAL_CB(); |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 492 | 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 Singhal | 7f55e34 | 2017-05-24 15:23:06 -0700 | [diff] [blame] | 499 | wlan_reg_get_dfs_region(mac->pdev, dfs_region); |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 500 | 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 Hussain | 72edc59 | 2017-04-17 13:07:37 -0700 | [diff] [blame] | 506 | *cac_duration_ms = DEFAULT_CAC_TIMEOUT; |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 507 | |
Naveen Rawat | 9ec27ec | 2017-12-07 15:24:01 -0800 | [diff] [blame] | 508 | 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 Hussain | 72edc59 | 2017-04-17 13:07:37 -0700 | [diff] [blame] | 514 | if (sap_is_channel_bonding_etsi_weather_channel(sap_ctx)) { |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 515 | *cac_duration_ms = ETSI_WEATHER_CH_CAC_TIMEOUT; |
Arif Hussain | 72edc59 | 2017-04-17 13:07:37 -0700 | [diff] [blame] | 516 | 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 Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 533 | } |
| 534 | |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 535 | void sap_dfs_set_current_channel(void *ctx) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 536 | { |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 537 | struct sap_context *sap_ctx = ctx; |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 538 | uint32_t ic_flags = 0; |
| 539 | uint16_t ic_flagext = 0; |
| 540 | uint8_t ic_ieee = sap_ctx->channel; |
Arif Hussain | 4e9afac | 2017-04-25 23:36:15 -0700 | [diff] [blame] | 541 | uint16_t ic_freq = utils_dfs_chan_to_freq(sap_ctx->channel); |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 542 | 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; |
bings | 819bdea | 2017-12-27 16:05:44 +0800 | [diff] [blame] | 547 | uint32_t use_nol = 0; |
| 548 | int error; |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 549 | |
Jeff Johnson | c0db384 | 2017-09-13 18:34:28 -0700 | [diff] [blame] | 550 | hal = CDS_GET_HAL_CB(); |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 551 | if (!hal) { |
| 552 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 553 | FL("null hal")); |
| 554 | return; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 555 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 556 | |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 557 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 564 | |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 565 | switch (sap_ctx->csr_roamProfile.ch_params.ch_width) { |
| 566 | case CH_WIDTH_20MHZ: |
| 567 | ic_flags |= IEEE80211_CHAN_VHT20; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 568 | break; |
Kiran Kumar Lokere | 999e58c | 2016-01-07 02:18:39 -0800 | [diff] [blame] | 569 | case CH_WIDTH_40MHZ: |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 570 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 580 | break; |
| 581 | default: |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 582 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 583 | FL("Invalid channel width=%d"), |
| 584 | sap_ctx->csr_roamProfile.ch_params.ch_width); |
| 585 | return; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 586 | } |
| 587 | |
bings | 19bf84d | 2017-12-08 15:27:20 +0800 | [diff] [blame] | 588 | 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 Hussain | 4e9afac | 2017-04-25 23:36:15 -0700 | [diff] [blame] | 596 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
bings | 19bf84d | 2017-12-08 15:27:20 +0800 | [diff] [blame] | 597 | 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 Hussain | 4e9afac | 2017-04-25 23:36:15 -0700 | [diff] [blame] | 599 | |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 600 | tgt_dfs_set_current_channel(pdev, ic_freq, ic_flags, |
| 601 | ic_flagext, ic_ieee, vht_seg0, vht_seg1); |
bings | 19bf84d | 2017-12-08 15:27:20 +0800 | [diff] [blame] | 602 | |
| 603 | if (wlan_reg_is_dfs_ch(pdev, sap_ctx->channel)) { |
| 604 | tgt_dfs_get_radars(pdev); |
bings | 3fe5bc3 | 2018-03-14 11:45:36 +0800 | [diff] [blame] | 605 | tgt_dfs_set_phyerr_filter_offload(pdev); |
bings | 819bdea | 2017-12-27 16:05:44 +0800 | [diff] [blame] | 606 | if (sap_ctx->csr_roamProfile.disableDFSChSwitch) |
| 607 | tgt_dfs_control(pdev, DFS_SET_USENOL, &use_nol, |
| 608 | sizeof(uint32_t), NULL, NULL, &error); |
bings | 19bf84d | 2017-12-08 15:27:20 +0800 | [diff] [blame] | 609 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 610 | } |
| 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 | */ |
| 628 | bool 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 634 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 635 | 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 | */ |
| 666 | bool 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 672 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 673 | 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 679 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 680 | 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 687 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_LOW, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 688 | 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 Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 711 | bool sap_check_in_avoid_ch_list(struct sap_context *sap_ctx, uint8_t channel) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 712 | { |
| 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 723 | /** |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 724 | * 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 | */ |
| 734 | bool |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 735 | sap_dfs_is_channel_in_nol_list(struct sap_context *sap_context, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 736 | uint8_t channel_number, |
| 737 | ePhyChanBondState chan_bondState) |
| 738 | { |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 739 | int i; |
Jeff Johnson | c0db384 | 2017-09-13 18:34:28 -0700 | [diff] [blame] | 740 | tHalHandle h_hal = CDS_GET_HAL_CB(); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 741 | tpAniSirGlobal mac_ctx; |
| 742 | uint8_t channels[MAX_BONDED_CHANNELS]; |
| 743 | uint8_t num_channels; |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 744 | struct wlan_objmgr_pdev *pdev = NULL; |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 745 | enum channel_state ch_state; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 746 | |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 747 | if (!h_hal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 748 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 749 | FL("invalid h_hal")); |
| 750 | return false; |
| 751 | } else { |
| 752 | mac_ctx = PMAC_STRUCT(h_hal); |
| 753 | } |
| 754 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 755 | /* get the bonded channels */ |
bings | d60c0b4 | 2017-09-07 01:30:29 +0800 | [diff] [blame] | 756 | if (channel_number == sap_context->channel && chan_bondState >= |
| 757 | PHY_CHANNEL_BONDING_STATE_MAX) |
| 758 | num_channels = sap_ch_params_to_bonding_channels( |
bings | d1b43e5 | 2017-08-23 01:36:13 +0800 | [diff] [blame] | 759 | &sap_context->ch_params, channels); |
bings | d60c0b4 | 2017-09-07 01:30:29 +0800 | [diff] [blame] | 760 | else |
| 761 | num_channels = sap_get_bonding_channels(sap_context, |
| 762 | channel_number, channels, |
| 763 | MAX_BONDED_CHANNELS, chan_bondState); |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 764 | |
| 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 771 | |
| 772 | /* check for NOL, first on will break the loop */ |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 773 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 781 | } |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 782 | } /* loop for bonded channels */ |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 783 | |
| 784 | return false; |
| 785 | } |
| 786 | |
wadesong | 1795e14 | 2018-01-05 11:13:07 +0800 | [diff] [blame] | 787 | uint8_t sap_select_default_oper_chan(struct sap_acs_cfg *acs_cfg) |
Selvaraj, Sridhar | 9a9266e | 2016-09-16 14:19:43 +0530 | [diff] [blame] | 788 | { |
| 789 | uint8_t channel; |
| 790 | |
wadesong | c46581b | 2017-12-26 13:29:29 +0800 | [diff] [blame] | 791 | 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 | |
wadesong | 1795e14 | 2018-01-05 11:13:07 +0800 | [diff] [blame] | 798 | if (acs_cfg->hw_mode == eCSR_DOT11_MODE_11a) { |
Selvaraj, Sridhar | 9a9266e | 2016-09-16 14:19:43 +0530 | [diff] [blame] | 799 | channel = SAP_DEFAULT_5GHZ_CHANNEL; |
wadesong | 1795e14 | 2018-01-05 11:13:07 +0800 | [diff] [blame] | 800 | } 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)) { |
wadesong | c46581b | 2017-12-26 13:29:29 +0800 | [diff] [blame] | 806 | if (WLAN_REG_IS_5GHZ_CH(acs_cfg->start_ch)) |
| 807 | channel = SAP_DEFAULT_5GHZ_CHANNEL; |
| 808 | else |
| 809 | channel = SAP_DEFAULT_24GHZ_CHANNEL; |
wadesong | 1795e14 | 2018-01-05 11:13:07 +0800 | [diff] [blame] | 810 | } else { |
Selvaraj, Sridhar | 9a9266e | 2016-09-16 14:19:43 +0530 | [diff] [blame] | 811 | channel = SAP_DEFAULT_24GHZ_CHANNEL; |
wadesong | 1795e14 | 2018-01-05 11:13:07 +0800 | [diff] [blame] | 812 | } |
Selvaraj, Sridhar | 9a9266e | 2016-09-16 14:19:43 +0530 | [diff] [blame] | 813 | |
| 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 820 | * 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 Chandrasekaran | 1db3abe | 2016-06-24 03:27:07 +0530 | [diff] [blame] | 825 | * @check_for_connection_update: true, check and wait for connection update |
| 826 | * false, do not perform connection update |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 827 | * |
| 828 | * Initiates sme scan for ACS to pick a channel. |
| 829 | * |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 830 | * Return: The QDF_STATUS code associated with performing the operation. |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 831 | */ |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 832 | QDF_STATUS sap_goto_channel_sel(struct sap_context *sap_context, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 833 | ptWLAN_SAPEvent sap_event, |
Manishekar Chandrasekaran | 1db3abe | 2016-06-24 03:27:07 +0530 | [diff] [blame] | 834 | bool sap_do_acs_pre_start_bss, |
| 835 | bool check_for_connection_update) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 836 | { |
| 837 | |
| 838 | /* Initiate a SCAN request */ |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 839 | QDF_STATUS qdf_ret_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 840 | /* To be initialised if scan is required */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 841 | QDF_STATUS qdf_status = QDF_STATUS_SUCCESS; |
Manishekar Chandrasekaran | 1db3abe | 2016-06-24 03:27:07 +0530 | [diff] [blame] | 842 | tpAniSirGlobal mac_ctx; |
Sandeep Puligilla | 0806e0f | 2017-03-06 19:25:47 -0800 | [diff] [blame] | 843 | struct scan_start_request *req; |
| 844 | struct wlan_objmgr_vdev *vdev; |
| 845 | uint8_t i; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 846 | |
| 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 Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 854 | h_hal = cds_get_context(QDF_MODULE_ID_SME); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 855 | if (NULL == h_hal) { |
| 856 | /* we have a serious problem */ |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 857 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_FATAL, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 858 | FL("invalid h_hal")); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 859 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 860 | } |
Ryan Hsu | 4252a2f | 2016-01-05 11:18:24 -0800 | [diff] [blame] | 861 | |
Manishekar Chandrasekaran | 1db3abe | 2016-06-24 03:27:07 +0530 | [diff] [blame] | 862 | 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 Sreekumaran | 922477b | 2017-09-22 14:00:31 +0530 | [diff] [blame] | 868 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 875 | con_ch = |
| 876 | sme_get_concurrent_operation_channel(h_hal); |
Ryan Hsu | 4252a2f | 2016-01-05 11:18:24 -0800 | [diff] [blame] | 877 | #ifdef FEATURE_WLAN_STA_AP_MODE_DFS_DISABLE |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 878 | 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 Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 881 | wlan_reg_is_dfs_ch(mac_ctx->pdev, |
| 882 | sap_context->channel)) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 883 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 884 | FL("MCC DFS not supported in AP_AP Mode")); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 885 | return QDF_STATUS_E_ABORTED; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 886 | } |
Ryan Hsu | 4252a2f | 2016-01-05 11:18:24 -0800 | [diff] [blame] | 887 | #endif |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 888 | #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH |
| 889 | if (sap_context->cc_switch_mode != |
Liangwei Dong | 9cfaa70 | 2016-10-17 01:20:44 -0400 | [diff] [blame] | 890 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 902 | 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 Sreekumaran | 9f18042 | 2017-10-26 15:03:01 +0530 | [diff] [blame] | 906 | 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 910 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 911 | QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 912 | "%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 Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 915 | wlan_reg_set_channel_params(mac_ctx->pdev, |
| 916 | sap_context->channel, 0, |
Kiran Kumar Lokere | 9d41f61 | 2016-05-11 19:41:44 -0700 | [diff] [blame] | 917 | &sap_context->ch_params); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 918 | } |
| 919 | } |
| 920 | #endif |
| 921 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 922 | |
Ajit Pal Singh | 813383c | 2017-10-03 16:14:58 +0530 | [diff] [blame] | 923 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 927 | #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 Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 930 | else if (wlan_reg_is_dfs_ch(mac_ctx->pdev, |
| 931 | sap_context->channel)) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 932 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 933 | FL("DFS not supported in STA_AP Mode")); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 934 | return QDF_STATUS_E_ABORTED; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 935 | } |
| 936 | #endif |
| 937 | #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH |
| 938 | if (sap_context->cc_switch_mode != |
Liangwei Dong | 9cfaa70 | 2016-10-17 01:20:44 -0400 | [diff] [blame] | 939 | QDF_MCC_TO_SCC_SWITCH_DISABLE && |
| 940 | sap_context->channel) { |
Chandrasekaran Manishekar | 068e25e | 2016-03-07 11:51:07 +0530 | [diff] [blame] | 941 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 945 | 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 Sreekumaran | 9575dec | 2017-10-11 14:23:23 +0530 | [diff] [blame] | 949 | 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 Bhattacharyya | 9a92999 | 2017-06-18 00:59:09 -0700 | [diff] [blame] | 960 | } |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 961 | if (con_ch && !wlan_reg_is_dfs_ch(mac_ctx->pdev, |
| 962 | con_ch)) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 963 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 964 | QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 965 | "%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 Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 968 | wlan_reg_set_channel_params(mac_ctx->pdev, |
| 969 | sap_context->channel, 0, |
Kiran Kumar Lokere | 9d41f61 | 2016-05-11 19:41:44 -0700 | [diff] [blame] | 970 | &sap_context->ch_params); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 971 | } |
| 972 | } |
| 973 | #endif |
| 974 | } |
| 975 | |
| 976 | if (sap_context->channel == AUTO_CHANNEL_SELECT) { |
| 977 | #ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 978 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 979 | 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 Puligilla | 994f620 | 2017-06-19 18:29:05 -0700 | [diff] [blame] | 984 | |
Sandeep Puligilla | 0806e0f | 2017-03-06 19:25:47 -0800 | [diff] [blame] | 985 | 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 Hussain | 21ad434 | 2017-12-21 12:00:54 -0800 | [diff] [blame] | 995 | 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 Puligilla | 0806e0f | 2017-03-06 19:25:47 -0800 | [diff] [blame] | 1001 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1006 | 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 Puligilla | 0806e0f | 2017-03-06 19:25:47 -0800 | [diff] [blame] | 1011 | |
Abhishek Singh | a394b6c | 2017-11-03 17:14:58 +0530 | [diff] [blame] | 1012 | req->scan_req.chan_list.num_chan = num_of_channels; |
Sandeep Puligilla | 0806e0f | 2017-03-06 19:25:47 -0800 | [diff] [blame] | 1013 | for (i = 0; i < num_of_channels; i++) |
Abhishek Singh | a394b6c | 2017-11-03 17:14:58 +0530 | [diff] [blame] | 1014 | req->scan_req.chan_list.chan[i].freq = |
Sandeep Puligilla | 0806e0f | 2017-03-06 19:25:47 -0800 | [diff] [blame] | 1015 | wlan_chan_to_freq(channel_list[i]); |
gaurank kathpalia | 16a721a | 2017-12-19 20:57:55 +0530 | [diff] [blame] | 1016 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1021 | sap_context->channelList = channel_list; |
Liangwei Dong | aef8434 | 2016-10-21 05:28:00 -0400 | [diff] [blame] | 1022 | sap_context->num_of_channel = num_of_channels; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1023 | /* Set requestType to Full scan */ |
| 1024 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1025 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Sandeep Puligilla | 999ba33 | 2017-09-26 15:03:05 -0700 | [diff] [blame] | 1026 | FL("calling ucfg_scan_start")); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1027 | #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 Puligilla | 0806e0f | 2017-03-06 19:25:47 -0800 | [diff] [blame] | 1032 | sap_context->sap_acs_pre_start_bss = sap_do_acs_pre_start_bss; |
Sandeep Puligilla | 0806e0f | 2017-03-06 19:25:47 -0800 | [diff] [blame] | 1033 | qdf_ret_status = ucfg_scan_start(req); |
| 1034 | wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID); |
Sandeep Puligilla | 994f620 | 2017-06-19 18:29:05 -0700 | [diff] [blame] | 1035 | |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 1036 | if (QDF_STATUS_SUCCESS != qdf_ret_status) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1037 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Sandeep Puligilla | 999ba33 | 2017-09-26 15:03:05 -0700 | [diff] [blame] | 1038 | FL("scan request fail %d!!!"), |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 1039 | qdf_ret_status); |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1040 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1041 | FL("SAP Configuring default channel, Ch=%d"), |
| 1042 | sap_context->channel); |
wadesong | 1795e14 | 2018-01-05 11:13:07 +0800 | [diff] [blame] | 1043 | sap_context->channel = sap_select_default_oper_chan( |
wadesong | c46581b | 2017-12-26 13:29:29 +0800 | [diff] [blame] | 1044 | sap_context->acs_cfg); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1045 | |
| 1046 | #ifdef SOFTAP_CHANNEL_RANGE |
| 1047 | if (sap_context->channelList != NULL) { |
| 1048 | sap_context->channel = |
| 1049 | sap_context->channelList[0]; |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 1050 | qdf_mem_free(sap_context-> |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1051 | channelList); |
| 1052 | sap_context->channelList = NULL; |
Liangwei Dong | aef8434 | 2016-10-21 05:28:00 -0400 | [diff] [blame] | 1053 | sap_context->num_of_channel = 0; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1054 | } |
| 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1062 | return QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1063 | } else { |
| 1064 | /* Fill in the event structure */ |
| 1065 | sap_event_init(sap_event); |
| 1066 | /* Handle event */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1067 | qdf_status = sap_fsm(sap_context, sap_event); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1068 | } |
| 1069 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1070 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1071 | FL("return sme_ScanReq, scanID=%d, Ch=%d"), |
Sandeep Puligilla | 0806e0f | 2017-03-06 19:25:47 -0800 | [diff] [blame] | 1072 | req->scan_req.scan_id, |
Sandeep Puligilla | 0806e0f | 2017-03-06 19:25:47 -0800 | [diff] [blame] | 1073 | sap_context->channel); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1074 | } |
| 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1082 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1083 | FL("## %s SKIPPED ACS SCAN"), __func__); |
lifeng | c0fb61a | 2017-06-20 19:34:39 +0800 | [diff] [blame] | 1084 | |
| 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1092 | } |
| 1093 | #endif |
| 1094 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1095 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1096 | FL("for configured channel, Ch= %d"), |
| 1097 | sap_context->channel); |
Manishekar Chandrasekaran | 1db3abe | 2016-06-24 03:27:07 +0530 | [diff] [blame] | 1098 | |
Krunal Soni | 3091bcc | 2016-06-23 12:28:21 -0700 | [diff] [blame] | 1099 | if (check_for_connection_update) { |
Manishekar Chandrasekaran | 1db3abe | 2016-06-24 03:27:07 +0530 | [diff] [blame] | 1100 | /* This wait happens in the hostapd context. The event |
| 1101 | * is set in the MC thread context. |
| 1102 | */ |
Tushnim Bhattacharyya | 66348bd | 2017-03-09 15:02:10 -0800 | [diff] [blame] | 1103 | qdf_status = |
| 1104 | policy_mgr_update_and_wait_for_connection_update( |
| 1105 | mac_ctx->psoc, |
Manishekar Chandrasekaran | 1db3abe | 2016-06-24 03:27:07 +0530 | [diff] [blame] | 1106 | sap_context->sessionId, |
| 1107 | sap_context->channel, |
Tushnim Bhattacharyya | 3b99f4b | 2018-03-26 14:19:24 -0700 | [diff] [blame] | 1108 | POLICY_MGR_UPDATE_REASON_START_AP); |
Manishekar Chandrasekaran | 1db3abe | 2016-06-24 03:27:07 +0530 | [diff] [blame] | 1109 | if (QDF_IS_STATUS_ERROR(qdf_status)) |
| 1110 | return qdf_status; |
| 1111 | } |
| 1112 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1113 | if (sap_do_acs_pre_start_bss == true) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1114 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1115 | 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1121 | return QDF_STATUS_E_CANCELED; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1122 | } 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1130 | qdf_status = sap_fsm(sap_context, sap_event); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1131 | } |
| 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1141 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1142 | FL("before exiting sap_goto_channel_sel channel=%d"), |
| 1143 | sap_context->channel); |
| 1144 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1145 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1146 | } |
| 1147 | |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 1148 | /** |
Krunal Soni | b01de79 | 2017-04-14 11:44:39 -0700 | [diff] [blame] | 1149 | * 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 Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 1156 | static struct sap_context *sap_find_valid_concurrent_session(tHalHandle hal) |
Krunal Soni | b01de79 | 2017-04-14 11:44:39 -0700 | [diff] [blame] | 1157 | { |
| 1158 | tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); |
| 1159 | uint8_t intf = 0; |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 1160 | struct sap_context *sap_ctx; |
Krunal Soni | b01de79 | 2017-04-14 11:44:39 -0700 | [diff] [blame] | 1161 | |
| 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 | |
| 1177 | static QDF_STATUS sap_clear_global_dfs_param(tHalHandle hal) |
| 1178 | { |
| 1179 | tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); |
| 1180 | |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 1181 | 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 Soni | b01de79 | 2017-04-14 11:44:39 -0700 | [diff] [blame] | 1185 | } |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 1186 | /* |
| 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 Soni | b01de79 | 2017-04-14 11:44:39 -0700 | [diff] [blame] | 1201 | |
| 1202 | return QDF_STATUS_SUCCESS; |
| 1203 | } |
| 1204 | |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 1205 | QDF_STATUS sap_set_session_param(tHalHandle hal, struct sap_context *sapctx, |
Krunal Soni | b01de79 | 2017-04-14 11:44:39 -0700 | [diff] [blame] | 1206 | uint32_t session_id) |
| 1207 | { |
| 1208 | tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); |
| 1209 | |
| 1210 | sapctx->sessionId = session_id; |
Krunal Soni | b01de79 | 2017-04-14 11:44:39 -0700 | [diff] [blame] | 1211 | 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 Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 1219 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, |
Jeff Johnson | a7c0ddb | 2017-09-18 08:14:12 -0700 | [diff] [blame] | 1220 | "%s: Initializing sapContext = %pK with session = %d", __func__, |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 1221 | sapctx, session_id); |
Krunal Soni | b01de79 | 2017-04-14 11:44:39 -0700 | [diff] [blame] | 1222 | |
| 1223 | return QDF_STATUS_SUCCESS; |
| 1224 | } |
| 1225 | |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 1226 | QDF_STATUS sap_clear_session_param(tHalHandle hal, struct sap_context *sapctx, |
Krunal Soni | b01de79 | 2017-04-14 11:44:39 -0700 | [diff] [blame] | 1227 | uint32_t session_id) |
| 1228 | { |
| 1229 | tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); |
| 1230 | |
Sourav Mohapatra | ab088fa | 2018-01-08 16:25:05 +0530 | [diff] [blame] | 1231 | if (sapctx->sessionId >= SAP_MAX_NUM_SESSION) |
| 1232 | return QDF_STATUS_E_FAILURE; |
| 1233 | |
Krunal Soni | b01de79 | 2017-04-14 11:44:39 -0700 | [diff] [blame] | 1234 | mac_ctx->sap.sapCtxList[sapctx->sessionId].sessionID = |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 1235 | CSR_SESSION_ID_INVALID; |
Krunal Soni | b01de79 | 2017-04-14 11:44:39 -0700 | [diff] [blame] | 1236 | mac_ctx->sap.sapCtxList[sapctx->sessionId].pSapContext = NULL; |
| 1237 | mac_ctx->sap.sapCtxList[sapctx->sessionId].sapPersona = |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 1238 | QDF_MAX_NO_OF_MODE; |
Krunal Soni | b01de79 | 2017-04-14 11:44:39 -0700 | [diff] [blame] | 1239 | sap_clear_global_dfs_param(hal); |
Naveen Rawat | 09b96df | 2017-09-28 12:36:10 -0700 | [diff] [blame] | 1240 | sap_free_roam_profile(&sapctx->csr_roamProfile); |
Jeff Johnson | 6816303 | 2017-09-13 20:14:04 -0700 | [diff] [blame] | 1241 | qdf_mem_zero(sapctx, sizeof(*sapctx)); |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 1242 | sapctx->sessionId = CSR_SESSION_ID_INVALID; |
| 1243 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, |
Jeff Johnson | a7c0ddb | 2017-09-18 08:14:12 -0700 | [diff] [blame] | 1244 | "%s: Initializing State: %d, sapContext value = %pK", __func__, |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 1245 | sapctx->sapsMachine, sapctx); |
Krunal Soni | b01de79 | 2017-04-14 11:44:39 -0700 | [diff] [blame] | 1246 | |
| 1247 | return QDF_STATUS_SUCCESS; |
| 1248 | } |
| 1249 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1250 | /*========================================================================== |
| 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1268 | The QDF_STATUS code associated with performing the operation |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1269 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1270 | QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1271 | |
| 1272 | SIDE EFFECTS |
| 1273 | ============================================================================*/ |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 1274 | static QDF_STATUS sap_goto_starting(struct sap_context *sapContext, |
Jeff Johnson | 464f7ea | 2016-10-07 10:21:26 -0700 | [diff] [blame] | 1275 | ptWLAN_SAPEvent sapEvent, |
| 1276 | eCsrRoamBssType bssType) |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 1277 | { |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1278 | /* tHalHandle */ |
Jeff Johnson | c0db384 | 2017-09-13 18:34:28 -0700 | [diff] [blame] | 1279 | tHalHandle hHal = CDS_GET_HAL_CB(); |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 1280 | QDF_STATUS qdf_ret_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1281 | |
| 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 Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 1287 | /* Need a key size define */ |
| 1288 | qdf_mem_copy(sapContext->key_material, key_material, |
| 1289 | sizeof(key_material)); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1290 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1291 | if (NULL == hHal) { |
| 1292 | /* we have a serious problem */ |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1293 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_FATAL, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1294 | "In %s, invalid hHal", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1295 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1296 | } |
| 1297 | |
Srinivas Girigowda | 678586c | 2017-03-10 00:13:58 -0800 | [diff] [blame] | 1298 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, "%s: session: %d", |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 1299 | __func__, sapContext->sessionId); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1300 | |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 1301 | 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1305 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 1306 | "%s: Failed to issue sme_roam_connect", __func__); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1307 | |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 1308 | return qdf_ret_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1309 | } /* 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1327 | The QDF_STATUS code associated with performing the operation |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1328 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1329 | QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1330 | |
| 1331 | SIDE EFFECTS |
| 1332 | ============================================================================*/ |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 1333 | static QDF_STATUS sap_goto_disconnecting(struct sap_context *sapContext) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1334 | { |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 1335 | QDF_STATUS qdf_ret_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1336 | tHalHandle hHal; |
| 1337 | |
Jeff Johnson | c0db384 | 2017-09-13 18:34:28 -0700 | [diff] [blame] | 1338 | hHal = CDS_GET_HAL_CB(); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1339 | if (NULL == hHal) { |
| 1340 | /* we have a serious problem */ |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1341 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1342 | "In %s, invalid hHal", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1343 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1344 | } |
| 1345 | |
| 1346 | sap_free_roam_profile(&sapContext->csr_roamProfile); |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 1347 | qdf_ret_status = sme_roam_stop_bss(hHal, sapContext->sessionId); |
| 1348 | if (QDF_STATUS_SUCCESS != qdf_ret_status) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1349 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1350 | "Error: In %s calling sme_roam_stop_bss status = %d", |
Anurag Chouhan | f04e84f | 2016-03-03 10:12:12 +0530 | [diff] [blame] | 1351 | __func__, qdf_ret_status); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1352 | return QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1353 | } |
| 1354 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1355 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1356 | } |
| 1357 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1358 | /*========================================================================== |
| 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1375 | The QDF_STATUS code associated with performing the operation |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1376 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1377 | QDF_STATUS_SUCCESS: Success |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1378 | |
| 1379 | SIDE EFFECTS |
| 1380 | ============================================================================*/ |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 1381 | static QDF_STATUS sap_goto_disconnected(struct sap_context *sapContext) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1382 | { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1383 | QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1384 | 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1392 | qdf_status = sap_fsm(sapContext, &sapEvent); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1393 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1394 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1395 | } |
| 1396 | |
Liangwei Dong | aef8434 | 2016-10-21 05:28:00 -0400 | [diff] [blame] | 1397 | #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 Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 1408 | static void sap_handle_acs_scan_event(struct sap_context *sap_context, |
Liangwei Dong | aef8434 | 2016-10-21 05:28:00 -0400 | [diff] [blame] | 1409 | 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 Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 1419 | static void sap_handle_acs_scan_event(struct sap_context *sap_context, |
Liangwei Dong | aef8434 | 2016-10-21 05:28:00 -0400 | [diff] [blame] | 1420 | tSap_Event *sap_event, eSapStatus status) |
| 1421 | { |
| 1422 | } |
| 1423 | #endif |
| 1424 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1425 | /** |
| 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1434 | * Return: QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1435 | */ |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 1436 | QDF_STATUS sap_signal_hdd_event(struct sap_context *sap_ctx, |
Jeff Johnson | 172237b | 2017-11-07 15:32:59 -0800 | [diff] [blame] | 1437 | struct csr_roam_info *csr_roaminfo, eSapHddEvent sap_hddevent, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1438 | void *context) |
| 1439 | { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1440 | QDF_STATUS qdf_status = QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1441 | tSap_Event sap_ap_event; /* This now encodes ALL event types */ |
Jeff Johnson | c0db384 | 2017-09-13 18:34:28 -0700 | [diff] [blame] | 1442 | tHalHandle hal = CDS_GET_HAL_CB(); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1443 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1452 | |
| 1453 | /* Format the Start BSS Complete event to return... */ |
| 1454 | if (NULL == sap_ctx->pfnSapEventCallback) { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1455 | return QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1456 | } |
| 1457 | if (NULL == hal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1458 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1459 | FL("Invalid hal")); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1460 | return QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1461 | } |
| 1462 | mac_ctx = PMAC_STRUCT(hal); |
| 1463 | if (NULL == mac_ctx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1464 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1465 | FL("Invalid MAC context")); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1466 | return QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1467 | } |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1468 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1469 | 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 Hussain | 165aa4c | 2016-10-25 14:21:53 -0700 | [diff] [blame] | 1474 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1479 | /* 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 Chouhan | c554842 | 2016-02-24 18:33:27 +0530 | [diff] [blame] | 1483 | qdf_copy_macaddr(&assoc_ind->staMac, &csr_roaminfo->peerMac); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1484 | 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; |
gaolez | 7bb1e74 | 2017-03-21 16:37:38 +0800 | [diff] [blame] | 1492 | assoc_ind->ecsa_capable = csr_roaminfo->ecsa_capable; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1493 | 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; |
bings | 2972471 | 2017-03-15 01:40:50 +0800 | [diff] [blame] | 1508 | bss_complete->staId = sap_ctx->sap_sta_id; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1509 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1510 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1511 | 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 Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 1520 | case eSAP_DFS_PRE_CAC_END: |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1521 | case eSAP_DFS_RADAR_DETECT: |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 1522 | case eSAP_DFS_RADAR_DETECT_DURING_PRE_CAC: |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1523 | case eSAP_DFS_NO_AVAILABLE_CHANNEL: |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1524 | sap_ap_event.sapHddEventCode = sap_hddevent; |
| 1525 | sap_ap_event.sapevt.sapStopBssCompleteEvent.status = |
| 1526 | (eSapStatus) context; |
| 1527 | break; |
Liangwei Dong | aef8434 | 2016-10-21 05:28:00 -0400 | [diff] [blame] | 1528 | case eSAP_ACS_SCAN_SUCCESS_EVENT: |
| 1529 | sap_handle_acs_scan_event(sap_ctx, &sap_ap_event, |
| 1530 | (eSapStatus)context); |
| 1531 | break; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1532 | 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 Hussain | 165aa4c | 2016-10-25 14:21:53 -0700 | [diff] [blame] | 1556 | |
| 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 | } |
wadesong | a8637bb | 2018-01-23 15:11:19 +0800 | [diff] [blame] | 1562 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1568 | 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 Chouhan | c554842 | 2016-02-24 18:33:27 +0530 | [diff] [blame] | 1576 | qdf_copy_macaddr(&reassoc_complete->staMac, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1577 | &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 Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 1581 | qdf_mem_copy(reassoc_complete->ies, csr_roaminfo->prsnIE, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1582 | csr_roaminfo->rsnIELen); |
| 1583 | |
| 1584 | #ifdef FEATURE_WLAN_WAPI |
| 1585 | if (csr_roaminfo->wapiIELen) { |
| 1586 | uint8_t len = reassoc_complete->iesLen; |
Srinivas Girigowda | 4d65ebe | 2017-10-13 21:41:42 -0700 | [diff] [blame] | 1587 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1588 | reassoc_complete->iesLen += csr_roaminfo->wapiIELen; |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 1589 | qdf_mem_copy(&reassoc_complete->ies[len], |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1590 | csr_roaminfo->pwapiIE, |
| 1591 | csr_roaminfo->wapiIELen); |
| 1592 | } |
| 1593 | #endif |
| 1594 | if (csr_roaminfo->addIELen) { |
| 1595 | uint8_t len = reassoc_complete->iesLen; |
Srinivas Girigowda | 4d65ebe | 2017-10-13 21:41:42 -0700 | [diff] [blame] | 1596 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1597 | reassoc_complete->iesLen += csr_roaminfo->addIELen; |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 1598 | qdf_mem_copy(&reassoc_complete->ies[len], |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1599 | csr_roaminfo->paddIE, |
| 1600 | csr_roaminfo->addIELen); |
Naveen Rawat | 08db88f | 2017-09-08 15:07:48 -0700 | [diff] [blame] | 1601 | if (wlan_get_vendor_ie_ptr_from_oui( |
Rachit Kankane | 2487f8f | 2017-04-19 14:30:19 +0530 | [diff] [blame] | 1602 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1608 | } |
| 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, Vidyullatha | e306281 | 2015-05-22 17:28:57 +0530 | [diff] [blame] | 1624 | chaninfo->nss = csr_roaminfo->chan_info.nss; |
| 1625 | chaninfo->rate_flags = csr_roaminfo->chan_info.rate_flags; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1626 | |
| 1627 | reassoc_complete->wmmEnabled = csr_roaminfo->wmmEnabledSta; |
| 1628 | reassoc_complete->status = (eSapStatus) context; |
| 1629 | reassoc_complete->timingMeasCap = csr_roaminfo->timingMeasCap; |
Will Huang | 558f808 | 2017-05-31 16:22:24 +0800 | [diff] [blame] | 1630 | 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; |
gaolez | 7bb1e74 | 2017-03-21 16:37:38 +0800 | [diff] [blame] | 1641 | reassoc_complete->ecsa_capable = csr_roaminfo->ecsa_capable; |
Ashish Kumar Dhanotiya | 443d31f | 2017-10-13 12:41:19 +0530 | [diff] [blame] | 1642 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1647 | break; |
| 1648 | |
| 1649 | case eSAP_STA_DISASSOC_EVENT: |
Arif Hussain | 165aa4c | 2016-10-25 14:21:53 -0700 | [diff] [blame] | 1650 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1655 | sap_ap_event.sapHddEventCode = eSAP_STA_DISASSOC_EVENT; |
| 1656 | disassoc_comp = |
| 1657 | &sap_ap_event.sapevt.sapStationDisassocCompleteEvent; |
| 1658 | |
Anurag Chouhan | c554842 | 2016-02-24 18:33:27 +0530 | [diff] [blame] | 1659 | qdf_copy_macaddr(&disassoc_comp->staMac, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1660 | &csr_roaminfo->peerMac); |
| 1661 | disassoc_comp->staId = csr_roaminfo->staId; |
Ashish Kumar Dhanotiya | d39c8b5 | 2018-03-27 18:18:52 +0530 | [diff] [blame] | 1662 | if (csr_roaminfo->reasonCode == eCSR_ROAM_RESULT_FORCED) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1663 | 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 Dhanotiya | 443d31f | 2017-10-13 12:41:19 +0530 | [diff] [blame] | 1669 | 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 Dhanotiya | d39c8b5 | 2018-03-27 18:18:52 +0530 | [diff] [blame] | 1672 | disassoc_comp->reason_code = csr_roaminfo->disassoc_reason; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1673 | break; |
| 1674 | |
| 1675 | case eSAP_STA_SET_KEY_EVENT: |
Arif Hussain | 165aa4c | 2016-10-25 14:21:53 -0700 | [diff] [blame] | 1676 | |
| 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1682 | 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 Chouhan | c554842 | 2016-02-24 18:33:27 +0530 | [diff] [blame] | 1686 | qdf_copy_macaddr(&key_complete->peerMacAddr, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1687 | &csr_roaminfo->peerMac); |
| 1688 | break; |
| 1689 | |
| 1690 | case eSAP_STA_MIC_FAILURE_EVENT: |
Arif Hussain | 165aa4c | 2016-10-25 14:21:53 -0700 | [diff] [blame] | 1691 | |
| 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1697 | sap_ap_event.sapHddEventCode = eSAP_STA_MIC_FAILURE_EVENT; |
| 1698 | mic_failure = &sap_ap_event.sapevt.sapStationMICFailureEvent; |
| 1699 | |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 1700 | qdf_mem_copy(&mic_failure->srcMacAddr, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1701 | csr_roaminfo->u.pMICFailureInfo->srcMacAddr, |
| 1702 | sizeof(tSirMacAddr)); |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 1703 | qdf_mem_copy(&mic_failure->staMac.bytes, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1704 | csr_roaminfo->u.pMICFailureInfo->taMacAddr, |
| 1705 | sizeof(tSirMacAddr)); |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 1706 | qdf_mem_copy(&mic_failure->dstMacAddr.bytes, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1707 | 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 Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 1713 | qdf_mem_copy(mic_failure->TSC, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1714 | 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 Hussain | 165aa4c | 2016-10-25 14:21:53 -0700 | [diff] [blame] | 1722 | |
| 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1728 | sap_ap_event.sapHddEventCode = eSAP_WPS_PBC_PROBE_REQ_EVENT; |
| 1729 | |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 1730 | qdf_mem_copy(&sap_ap_event.sapevt.sapPBCProbeReqEvent. |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1731 | WPSPBCProbeReq, csr_roaminfo->u.pWPSPBCProbeReq, |
| 1732 | sizeof(tSirWPSPBCProbeReq)); |
| 1733 | break; |
| 1734 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1735 | 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 Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 1749 | qdf_mem_copy((void *) sap_ap_event.sapevt.sapUnknownSTAJoin. |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1750 | macaddr.bytes, (void *) context, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 1751 | QDF_MAC_ADDR_SIZE); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1752 | break; |
| 1753 | |
| 1754 | case eSAP_MAX_ASSOC_EXCEEDED: |
Arif Hussain | 165aa4c | 2016-10-25 14:21:53 -0700 | [diff] [blame] | 1755 | |
| 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1761 | sap_ap_event.sapHddEventCode = eSAP_MAX_ASSOC_EXCEEDED; |
Anurag Chouhan | c554842 | 2016-02-24 18:33:27 +0530 | [diff] [blame] | 1762 | qdf_copy_macaddr(&sap_ap_event.sapevt. |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1763 | 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 Chandrasekaran | ec26759 | 2016-05-26 19:10:04 +0530 | [diff] [blame] | 1773 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1777 | |
| 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; |
bings | 61d5bec | 2017-06-27 14:13:40 +0800 | [diff] [blame] | 1782 | acs_selected->ht_sec_ch = sap_ctx->acs_cfg->ht_sec_ch; |
Manishekar Chandrasekaran | ec26759 | 2016-05-26 19:10:04 +0530 | [diff] [blame] | 1783 | acs_selected->ch_width = |
| 1784 | sap_ctx->csr_roamProfile.ch_params.ch_width; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1785 | acs_selected->vht_seg0_center_ch = |
Manishekar Chandrasekaran | ec26759 | 2016-05-26 19:10:04 +0530 | [diff] [blame] | 1786 | sap_ctx->csr_roamProfile.ch_params.center_freq_seg0; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1787 | acs_selected->vht_seg1_center_ch = |
Manishekar Chandrasekaran | ec26759 | 2016-05-26 19:10:04 +0530 | [diff] [blame] | 1788 | sap_ctx->csr_roamProfile.ch_params.center_freq_seg1; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1789 | break; |
| 1790 | |
Abhishek Singh | 518323d | 2015-10-19 17:42:01 +0530 | [diff] [blame] | 1791 | case eSAP_ECSA_CHANGE_CHAN_IND: |
Arif Hussain | 165aa4c | 2016-10-25 14:21:53 -0700 | [diff] [blame] | 1792 | |
| 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1798 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Abhishek Singh | 518323d | 2015-10-19 17:42:01 +0530 | [diff] [blame] | 1799 | "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 Gupta | 8878ad9 | 2017-02-13 11:56:04 +0530 | [diff] [blame] | 1805 | 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 Soni | 2220839 | 2017-09-29 18:10:34 -0700 | [diff] [blame] | 1811 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1818 | default: |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1819 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1820 | FL("SAP Unknown callback event = %d"), |
| 1821 | sap_hddevent); |
| 1822 | break; |
| 1823 | } |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1824 | qdf_status = (*sap_ctx->pfnSapEventCallback) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1825 | (&sap_ap_event, sap_ctx->pUsrContext); |
| 1826 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1827 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1828 | |
| 1829 | } |
| 1830 | |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 1831 | /** |
| 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 Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 1839 | static struct sap_context *sap_find_cac_wait_session(tHalHandle handle) |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 1840 | { |
| 1841 | tpAniSirGlobal mac = PMAC_STRUCT(handle); |
| 1842 | uint8_t i = 0; |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 1843 | struct sap_context *sapContext; |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 1844 | |
| 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 Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 1849 | sapContext = mac->sap.sapCtxList[i].pSapContext; |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 1850 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1870 | /*========================================================================== |
| 1871 | FUNCTION sap_cac_reset_notify |
| 1872 | |
| 1873 | DESCRIPTION Function will be called up on stop bss indication to clean up |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1874 | DFS global structure. |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1875 | |
| 1876 | DEPENDENCIES PARAMETERS |
| 1877 | IN hHAL : HAL pointer |
| 1878 | |
| 1879 | RETURN VALUE : void. |
| 1880 | |
| 1881 | SIDE EFFECTS |
| 1882 | ============================================================================*/ |
| 1883 | void 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 Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 1889 | struct sap_context *pSapContext = |
| 1890 | pMac->sap.sapCtxList[intf].pSapContext; |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 1891 | if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1892 | || |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 1893 | (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona)) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1894 | && 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1905 | to HDD |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1906 | |
| 1907 | DEPENDENCIES PARAMETERS |
| 1908 | IN hHAL : HAL pointer |
| 1909 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1910 | RETURN VALUE : QDF_STATUS. |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1911 | |
| 1912 | SIDE EFFECTS |
| 1913 | ============================================================================*/ |
Jeff Johnson | 464f7ea | 2016-10-07 10:21:26 -0700 | [diff] [blame] | 1914 | static QDF_STATUS sap_cac_start_notify(tHalHandle hHal) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1915 | { |
| 1916 | uint8_t intf = 0; |
| 1917 | tpAniSirGlobal pMac = PMAC_STRUCT(hHal); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1918 | QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1919 | |
| 1920 | for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) { |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 1921 | struct sap_context *pSapContext = |
| 1922 | pMac->sap.sapCtxList[intf].pSapContext; |
Jeff Johnson | 66ee8a9 | 2018-03-17 15:24:26 -0700 | [diff] [blame] | 1923 | struct csr_roam_profile *profile; |
Krunal Soni | e8324ce | 2017-09-25 10:16:56 -0700 | [diff] [blame] | 1924 | |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 1925 | if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1926 | || |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 1927 | (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona)) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1928 | && pMac->sap.sapCtxList[intf].pSapContext != NULL && |
| 1929 | (false == pSapContext->isCacStartNotified)) { |
Krunal Soni | e8324ce | 2017-09-25 10:16:56 -0700 | [diff] [blame] | 1930 | /* 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1935 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED, |
Jeff Johnson | a7c0ddb | 2017-09-18 08:14:12 -0700 | [diff] [blame] | 1936 | "sapdfs: Signaling eSAP_DFS_CAC_START to HDD for sapctx[%pK]", |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1937 | pSapContext); |
| 1938 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1939 | qdf_status = sap_signal_hdd_event(pSapContext, NULL, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1940 | eSAP_DFS_CAC_START, |
| 1941 | (void *) |
| 1942 | eSAP_STATUS_SUCCESS); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1943 | if (QDF_STATUS_SUCCESS != qdf_status) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 1944 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 1945 | QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1946 | "In %s, failed setting isCacStartNotified on interface[%d]", |
| 1947 | __func__, intf); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1948 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1949 | } |
| 1950 | pSapContext->isCacStartNotified = true; |
| 1951 | } |
| 1952 | } |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1953 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1954 | } |
| 1955 | |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 1956 | /** |
| 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 Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 1966 | static QDF_STATUS wlansap_update_pre_cac_end(struct sap_context *sap_context, |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 1967 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1994 | /*========================================================================== |
| 1995 | FUNCTION sap_cac_end_notify |
| 1996 | |
| 1997 | DESCRIPTION Function will be called to notify eSAP_DFS_CAC_END event |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 1998 | to HDD |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 1999 | |
| 2000 | DEPENDENCIES PARAMETERS |
| 2001 | IN hHAL : HAL pointer |
| 2002 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2003 | RETURN VALUE : QDF_STATUS. |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2004 | |
| 2005 | SIDE EFFECTS |
| 2006 | ============================================================================*/ |
Jeff Johnson | 172237b | 2017-11-07 15:32:59 -0800 | [diff] [blame] | 2007 | static QDF_STATUS sap_cac_end_notify(tHalHandle hHal, |
| 2008 | struct csr_roam_info *roamInfo) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2009 | { |
| 2010 | uint8_t intf; |
| 2011 | tpAniSirGlobal pMac = PMAC_STRUCT(hHal); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2012 | QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2013 | |
| 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 Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 2021 | struct sap_context *pSapContext = |
| 2022 | pMac->sap.sapCtxList[intf].pSapContext; |
Jeff Johnson | 66ee8a9 | 2018-03-17 15:24:26 -0700 | [diff] [blame] | 2023 | struct csr_roam_profile *profile; |
Krunal Soni | e8324ce | 2017-09-25 10:16:56 -0700 | [diff] [blame] | 2024 | |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 2025 | if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2026 | || |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 2027 | (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona)) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2028 | && pMac->sap.sapCtxList[intf].pSapContext != NULL && |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 2029 | (false == pSapContext->isCacEndNotified) && |
| 2030 | (pSapContext->sapsMachine == eSAP_DFS_CAC_WAIT)) { |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2031 | pSapContext = pMac->sap.sapCtxList[intf].pSapContext; |
Krunal Soni | e8324ce | 2017-09-25 10:16:56 -0700 | [diff] [blame] | 2032 | /* 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 Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 2037 | |
| 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2054 | qdf_status = sap_signal_hdd_event(pSapContext, NULL, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2055 | eSAP_DFS_CAC_END, |
| 2056 | (void *) |
| 2057 | eSAP_STATUS_SUCCESS); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2058 | if (QDF_STATUS_SUCCESS != qdf_status) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2059 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 2060 | QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2061 | "In %s, failed setting isCacEndNotified on interface[%d]", |
| 2062 | __func__, intf); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2063 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2064 | } |
| 2065 | pSapContext->isCacEndNotified = true; |
| 2066 | pMac->sap.SapDfsInfo.sap_radar_found_status = false; |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2067 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED, |
Jeff Johnson | a7c0ddb | 2017-09-18 08:14:12 -0700 | [diff] [blame] | 2068 | "sapdfs: Start beacon request on sapctx[%pK]", |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2069 | 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2077 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2078 | "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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2085 | qdf_status = sap_signal_hdd_event(pSapContext, roamInfo, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2086 | eSAP_START_BSS_EVENT, |
| 2087 | (void *) |
| 2088 | eSAP_STATUS_SUCCESS); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2089 | if (QDF_STATUS_SUCCESS != qdf_status) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2090 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 2091 | QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2092 | "In %s, failed setting isCacEndNotified on interface[%d]", |
| 2093 | __func__, intf); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2094 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2095 | } |
| 2096 | |
| 2097 | /* Transition from eSAP_STARTING to eSAP_STARTED |
| 2098 | * (both without substates) |
| 2099 | */ |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2100 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2101 | "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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2115 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2116 | } |
| 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2127 | * Return: QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2128 | */ |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 2129 | static QDF_STATUS sap_fsm_state_disconnected(struct sap_context *sap_ctx, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2130 | ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx, |
| 2131 | tHalHandle hal) |
| 2132 | { |
| 2133 | uint32_t msg = sap_event->event; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2134 | QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2135 | |
| 2136 | if (msg == eSAP_HDD_START_INFRA_BSS) { |
| 2137 | /* |
| 2138 | * Transition from eSAP_DISCONNECTED to eSAP_CH_SELECT |
| 2139 | * (both without substates) |
| 2140 | */ |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2141 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Peng Xu | 66162de | 2016-02-11 17:01:20 -0800 | [diff] [blame] | 2142 | FL("new from state %s => %s: session:%d"), |
| 2143 | "eSAP_DISCONNECTED", "eSAP_CH_SELECT", |
| 2144 | sap_ctx->sessionId); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2145 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2146 | /* 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 Chandrasekaran | 1db3abe | 2016-06-24 03:27:07 +0530 | [diff] [blame] | 2156 | qdf_status = sap_goto_channel_sel(sap_ctx, sap_event, false, |
| 2157 | true); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2158 | } 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2165 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2166 | FL("from state eSAP_DISCONNECTED => SAP_DFS_CAC_WAIT")); |
| 2167 | if (mac_ctx->sap.SapDfsInfo.is_dfs_cac_timer_running != true) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2168 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED, |
Jeff Johnson | a7c0ddb | 2017-09-18 08:14:12 -0700 | [diff] [blame] | 2169 | FL("sapdfs: starting dfs cac timer on sapctx[%pK]"), |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2170 | sap_ctx); |
| 2171 | sap_start_dfs_cac_timer(sap_ctx); |
| 2172 | } |
| 2173 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2174 | qdf_status = sap_cac_start_notify(hal); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2175 | } 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 Chandrasekaran | 1db3abe | 2016-06-24 03:27:07 +0530 | [diff] [blame] | 2183 | qdf_status = sap_goto_channel_sel(sap_ctx, sap_event, false, |
| 2184 | false); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2185 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2186 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2187 | FL("in state %s, event msg %d"), |
| 2188 | "eSAP_DISCONNECTED", msg); |
| 2189 | } |
| 2190 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2191 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2192 | } |
| 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2203 | * Return: QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2204 | */ |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 2205 | static QDF_STATUS sap_fsm_state_ch_select(struct sap_context *sap_ctx, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2206 | ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx, |
| 2207 | tHalHandle hal) |
| 2208 | { |
| 2209 | uint32_t msg = sap_event->event; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2210 | QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2211 | bool b_leak_chan = false; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2212 | uint8_t temp_chan; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2213 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2214 | if (msg == eSAP_MAC_SCAN_COMPLETE) { |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2215 | temp_chan = sap_ctx->channel; |
bings | 1826d9c | 2018-01-23 16:14:01 +0800 | [diff] [blame] | 2216 | utils_dfs_mark_leaking_ch(mac_ctx->pdev, |
| 2217 | sap_ctx->ch_params.ch_width, |
| 2218 | 1, &temp_chan); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2219 | |
| 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2225 | /* |
| 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, |
bings | d60c0b4 | 2017-09-07 01:30:29 +0800 | [diff] [blame] | 2230 | PHY_CHANNEL_BONDING_STATE_MAX) || b_leak_chan) { |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2231 | 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2237 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 2238 | QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2239 | 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2243 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2244 | } |
| 2245 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2246 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2247 | FL("channel %d is in NOL, StartBss on new channel %d"), |
| 2248 | sap_ctx->channel, ch); |
| 2249 | |
| 2250 | sap_ctx->channel = ch; |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 2251 | wlan_reg_set_channel_params(mac_ctx->pdev, |
| 2252 | sap_ctx->channel, |
| 2253 | sap_ctx->secondary_ch, |
| 2254 | &sap_ctx->ch_params); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2255 | } |
| 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2262 | /* |
| 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 Bhattacharyya | 66348bd | 2017-03-09 15:02:10 -0800 | [diff] [blame] | 2268 | if (policy_mgr_concurrent_beaconing_sessions_running( |
| 2269 | mac_ctx->psoc)) { |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2270 | uint16_t con_ch; |
| 2271 | |
| 2272 | con_ch = sme_get_concurrent_operation_channel(hal); |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 2273 | if (con_ch && wlan_reg_is_dfs_ch(mac_ctx->pdev, con_ch)) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2274 | sap_ctx->channel = con_ch; |
| 2275 | } |
Ryan Hsu | 4252a2f | 2016-01-05 11:18:24 -0800 | [diff] [blame] | 2276 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2277 | /* |
| 2278 | * Transition from eSAP_CH_SELECT to eSAP_STARTING |
| 2279 | * (both without substates) |
| 2280 | */ |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2281 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2282 | 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 Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 2301 | sap_get_cac_dur_dfs_region(sap_ctx, |
| 2302 | &sap_ctx->csr_roamProfile.cac_duration_ms, |
| 2303 | &sap_ctx->csr_roamProfile.dfs_regdomain); |
Jiachao Wu | 712d4fd | 2017-08-23 16:52:34 +0800 | [diff] [blame] | 2304 | sap_ctx->csr_roamProfile.beacon_tx_rate = |
| 2305 | sap_ctx->beacon_tx_rate; |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2306 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2307 | 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 Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 2312 | sap_dfs_set_current_channel(sap_ctx); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2313 | qdf_status = sap_goto_starting(sap_ctx, sap_event, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2314 | eCSR_BSS_TYPE_INFRA_AP); |
| 2315 | } else if (msg == eSAP_CHANNEL_SELECTION_FAILED) { |
| 2316 | sap_ctx->sapsMachine = eSAP_DISCONNECTED; |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2317 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2318 | FL("Cannot start BSS, ACS Fail")); |
Ashish Kumar Dhanotiya | 48c6b6e | 2017-03-07 10:55:25 +0530 | [diff] [blame] | 2319 | sap_signal_hdd_event(sap_ctx, NULL, eSAP_START_BSS_EVENT, |
| 2320 | (void *)eSAP_STATUS_FAILURE); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2321 | } 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2325 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2326 | "%s: BSS stopped when Ch select in Progress", __func__); |
| 2327 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2328 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2329 | FL("in state %s, invalid event msg %d"), |
| 2330 | "eSAP_CH_SELECT", msg); |
| 2331 | } |
| 2332 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2333 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2334 | } |
| 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2345 | * Return: QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2346 | */ |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 2347 | static QDF_STATUS sap_fsm_state_dfs_cac_wait(struct sap_context *sap_ctx, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2348 | ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx, |
| 2349 | tHalHandle hal) |
| 2350 | { |
| 2351 | uint32_t msg = sap_event->event; |
Jeff Johnson | 172237b | 2017-11-07 15:32:59 -0800 | [diff] [blame] | 2352 | struct csr_roam_info *roam_info = |
| 2353 | (struct csr_roam_info *) (sap_event->params); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2354 | QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2355 | |
| 2356 | if (msg == eSAP_DFS_CHANNEL_CAC_START) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2357 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2358 | 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2362 | qdf_status = sap_cac_start_notify(hal); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2363 | } 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2369 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2370 | "ENTERTRED CAC WAIT STATE-->eSAP_DISCONNECTING\n"); |
| 2371 | if (mac_ctx->sap.SapDfsInfo.target_channel) { |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 2372 | wlan_reg_set_channel_params(mac_ctx->pdev, |
Sandeep Puligilla | 1cc23f6 | 2016-04-27 16:52:49 -0700 | [diff] [blame] | 2373 | mac_ctx->sap.SapDfsInfo.target_channel, 0, |
| 2374 | &sap_ctx->ch_params); |
bings | fe10dd1 | 2018-03-21 17:21:40 +0800 | [diff] [blame] | 2375 | } 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2380 | } |
| 2381 | |
| 2382 | for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) { |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 2383 | struct sap_context *t_sap_ctx; |
Jeff Johnson | 66ee8a9 | 2018-03-17 15:24:26 -0700 | [diff] [blame] | 2384 | struct csr_roam_profile *profile; |
Krunal Soni | e8324ce | 2017-09-25 10:16:56 -0700 | [diff] [blame] | 2385 | |
Wu Gao | 03dd0f6 | 2016-11-16 10:51:06 +0800 | [diff] [blame] | 2386 | t_sap_ctx = mac_ctx->sap.sapCtxList[intf].pSapContext; |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 2387 | if (((QDF_SAP_MODE == |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2388 | mac_ctx->sap.sapCtxList[intf].sapPersona) || |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 2389 | (QDF_P2P_GO_MODE == |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2390 | mac_ctx->sap.sapCtxList[intf].sapPersona)) && |
Wu Gao | 03dd0f6 | 2016-11-16 10:51:06 +0800 | [diff] [blame] | 2391 | t_sap_ctx != NULL && |
| 2392 | t_sap_ctx->sapsMachine != eSAP_DISCONNECTED) { |
Krunal Soni | e8324ce | 2017-09-25 10:16:56 -0700 | [diff] [blame] | 2393 | profile = &t_sap_ctx->csr_roamProfile; |
bings | 73e793e | 2017-12-08 15:11:09 +0800 | [diff] [blame] | 2394 | if (!wlan_reg_is_passive_or_disable_ch( |
| 2395 | mac_ctx->pdev, |
Krunal Soni | e8324ce | 2017-09-25 10:16:56 -0700 | [diff] [blame] | 2396 | profile->operationChannel)) |
| 2397 | continue; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2398 | /* SAP to be moved to DISCONNECTING state */ |
Krunal Soni | e8324ce | 2017-09-25 10:16:56 -0700 | [diff] [blame] | 2399 | t_sap_ctx->sapsMachine = eSAP_DISCONNECTING; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2400 | /* |
| 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2408 | wlansap_channel_change_request( |
Jeff Johnson | 164b3bb | 2017-09-25 19:34:14 -0700 | [diff] [blame] | 2409 | t_sap_ctx, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2410 | mac_ctx->sap.SapDfsInfo.target_channel); |
| 2411 | } |
| 2412 | } |
| 2413 | } else if (msg == eSAP_DFS_CHANNEL_CAC_END) { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2414 | qdf_status = sap_cac_end_notify(hal, roam_info); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2415 | } else if (msg == eSAP_HDD_STOP_INFRA_BSS) { |
| 2416 | /* Transition from eSAP_DFS_CAC_WAIT to eSAP_DISCONNECTING */ |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2417 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2418 | 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2428 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 2429 | QDF_TRACE_LEVEL_INFO_MED, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2430 | 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2435 | qdf_status = sap_goto_disconnecting(sap_ctx); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2436 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2437 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2438 | FL("in state %s, invalid event msg %d"), |
| 2439 | "eSAP_DFS_CAC_WAIT", msg); |
| 2440 | } |
| 2441 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2442 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2443 | } |
| 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2454 | * Return: QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2455 | */ |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 2456 | static QDF_STATUS sap_fsm_state_starting(struct sap_context *sap_ctx, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2457 | ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx, |
| 2458 | tHalHandle hal) |
| 2459 | { |
| 2460 | uint32_t msg = sap_event->event; |
Jeff Johnson | 172237b | 2017-11-07 15:32:59 -0800 | [diff] [blame] | 2461 | struct csr_roam_info *roam_info = |
| 2462 | (struct csr_roam_info *) (sap_event->params); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2463 | tSapDfsInfo *sap_dfs_info; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2464 | QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE; |
Sandeep Puligilla | 949eaa7 | 2015-12-17 18:43:52 -0800 | [diff] [blame] | 2465 | uint8_t is_dfs = false; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2466 | |
| 2467 | if (msg == eSAP_MAC_START_BSS_SUCCESS) { |
| 2468 | /* |
| 2469 | * Transition from eSAP_STARTING to eSAP_STARTED |
| 2470 | * (both without substates) |
| 2471 | */ |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2472 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Sandeep Puligilla | 949eaa7 | 2015-12-17 18:43:52 -0800 | [diff] [blame] | 2473 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2476 | sap_ctx->sapsMachine = eSAP_STARTED; |
| 2477 | |
| 2478 | /* Action code for transition */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2479 | qdf_status = sap_signal_hdd_event(sap_ctx, roam_info, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2480 | 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 Puligilla | 949eaa7 | 2015-12-17 18:43:52 -0800 | [diff] [blame] | 2488 | 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 Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 2491 | if (wlan_reg_get_channel_state(mac_ctx->pdev, |
| 2492 | sap_ctx->channel) == |
Sandeep Puligilla | 949eaa7 | 2015-12-17 18:43:52 -0800 | [diff] [blame] | 2493 | CHANNEL_STATE_DFS || |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 2494 | wlan_reg_get_channel_state(mac_ctx->pdev, |
| 2495 | sap_ctx->ch_params.center_freq_seg1 - |
Sandeep Puligilla | 949eaa7 | 2015-12-17 18:43:52 -0800 | [diff] [blame] | 2496 | SIR_80MHZ_START_CENTER_CH_DIFF) == |
| 2497 | CHANNEL_STATE_DFS) |
| 2498 | is_dfs = true; |
| 2499 | } else { |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 2500 | if (wlan_reg_get_channel_state(mac_ctx->pdev, |
| 2501 | sap_ctx->channel) == |
Sandeep Puligilla | 949eaa7 | 2015-12-17 18:43:52 -0800 | [diff] [blame] | 2502 | CHANNEL_STATE_DFS) |
| 2503 | is_dfs = true; |
| 2504 | } |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 2505 | |
Sandeep Puligilla | 949eaa7 | 2015-12-17 18:43:52 -0800 | [diff] [blame] | 2506 | if (is_dfs) { |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2507 | sap_dfs_info = &mac_ctx->sap.SapDfsInfo; |
| 2508 | if ((false == sap_dfs_info->ignore_cac) && |
| 2509 | (eSAP_DFS_DO_NOT_SKIP_CAC == |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 2510 | sap_dfs_info->cac_state) && |
| 2511 | !sap_ctx->pre_cac_complete) { |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2512 | /* 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2524 | qdf_status = sap_cac_start_notify(hal); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2525 | |
| 2526 | } else { |
| 2527 | wlansap_start_beacon_req(sap_ctx); |
| 2528 | } |
| 2529 | } |
Kiran Kumar Lokere | 475c177 | 2016-08-18 12:40:07 -0700 | [diff] [blame] | 2530 | } else if (msg == eSAP_MAC_START_FAILS || |
| 2531 | msg == eSAP_HDD_STOP_INFRA_BSS) { |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2532 | /* |
| 2533 | * Transition from eSAP_STARTING to eSAP_DISCONNECTED |
| 2534 | * (both without substates) |
| 2535 | */ |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2536 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2537 | FL("from state %s => %s"), |
| 2538 | "eSAP_STARTING", "eSAP_DISCONNECTED"); |
| 2539 | |
| 2540 | /* Advance outer statevar */ |
| 2541 | sap_ctx->sapsMachine = eSAP_DISCONNECTED; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2542 | qdf_status = sap_signal_hdd_event(sap_ctx, NULL, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2543 | eSAP_START_BSS_EVENT, |
| 2544 | (void *) eSAP_STATUS_FAILURE); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2545 | qdf_status = sap_goto_disconnected(sap_ctx); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2546 | /* Close the SME session */ |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2547 | } 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2554 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2555 | FL("from state %s => %s"), |
| 2556 | "eSAP_STARTING", "eSAP_STARTED"); |
| 2557 | |
| 2558 | /* Indicate change in the state to upper layers */ |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2559 | qdf_status = sap_signal_hdd_event(sap_ctx, roam_info, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2560 | eSAP_START_BSS_EVENT, |
| 2561 | (void *)eSAP_STATUS_SUCCESS); |
| 2562 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2563 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2564 | FL("in state %s, invalid event msg %d"), |
| 2565 | "eSAP_STARTING", msg); |
| 2566 | } |
| 2567 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2568 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2569 | } |
| 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2579 | * Return: QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2580 | */ |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 2581 | static QDF_STATUS sap_fsm_state_started(struct sap_context *sap_ctx, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2582 | ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx) |
| 2583 | { |
| 2584 | uint32_t msg = sap_event->event; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2585 | QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2586 | |
| 2587 | if (msg == eSAP_HDD_STOP_INFRA_BSS) { |
| 2588 | /* |
| 2589 | * Transition from eSAP_STARTED to eSAP_DISCONNECTING |
| 2590 | * (both without substates) |
| 2591 | */ |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2592 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2593 | FL("from state %s => %s"), |
| 2594 | "eSAP_STARTED", "eSAP_DISCONNECTING"); |
| 2595 | sap_ctx->sapsMachine = eSAP_DISCONNECTING; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2596 | qdf_status = sap_goto_disconnecting(sap_ctx); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2597 | } else if (eSAP_DFS_CHNL_SWITCH_ANNOUNCEMENT_START == msg) { |
| 2598 | uint8_t intf; |
bings | fe10dd1 | 2018-03-21 17:21:40 +0800 | [diff] [blame] | 2599 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2606 | /* |
| 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 Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 2612 | struct sap_context *temp_sap_ctx; |
Jeff Johnson | 66ee8a9 | 2018-03-17 15:24:26 -0700 | [diff] [blame] | 2613 | struct csr_roam_profile *profile; |
Krunal Soni | e8324ce | 2017-09-25 10:16:56 -0700 | [diff] [blame] | 2614 | |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 2615 | if (((QDF_SAP_MODE == |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2616 | mac_ctx->sap.sapCtxList[intf].sapPersona) || |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 2617 | (QDF_P2P_GO_MODE == |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2618 | 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 Soni | e8324ce | 2017-09-25 10:16:56 -0700 | [diff] [blame] | 2622 | /* |
| 2623 | * Radar won't come on non-dfs channel, so |
| 2624 | * no need to move them |
| 2625 | */ |
| 2626 | profile = &temp_sap_ctx->csr_roamProfile; |
bings | 73e793e | 2017-12-08 15:11:09 +0800 | [diff] [blame] | 2627 | if (!wlan_reg_is_passive_or_disable_ch( |
| 2628 | mac_ctx->pdev, |
Krunal Soni | e8324ce | 2017-09-25 10:16:56 -0700 | [diff] [blame] | 2629 | profile->operationChannel)) |
| 2630 | continue; |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2631 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 2632 | QDF_TRACE_LEVEL_INFO_MED, |
Jeff Johnson | a7c0ddb | 2017-09-18 08:14:12 -0700 | [diff] [blame] | 2633 | FL("sapdfs: Sending CSAIE for sapctx[%pK]"), |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2634 | temp_sap_ctx); |
| 2635 | |
Jeff Johnson | bfeafc6 | 2017-09-25 18:50:01 -0700 | [diff] [blame] | 2636 | qdf_status = |
| 2637 | wlansap_dfs_send_csa_ie_request(temp_sap_ctx); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2638 | } |
| 2639 | } |
Chandrasekaran, Manishekar | 8104abd | 2016-01-29 18:10:27 +0530 | [diff] [blame] | 2640 | } else if (eSAP_CHANNEL_SWITCH_ANNOUNCEMENT_START == msg) { |
Jeff Johnson | c1e6278 | 2017-11-09 09:50:17 -0800 | [diff] [blame] | 2641 | enum QDF_OPMODE persona; |
Chandrasekaran, Manishekar | 8104abd | 2016-01-29 18:10:27 +0530 | [diff] [blame] | 2642 | |
| 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 Johnson | bfeafc6 | 2017-09-25 18:50:01 -0700 | [diff] [blame] | 2657 | qdf_status = wlansap_dfs_send_csa_ie_request(sap_ctx); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2658 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2659 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2660 | FL("in state %s, invalid event msg %d"), |
| 2661 | "eSAP_STARTED", msg); |
| 2662 | } |
| 2663 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2664 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2665 | } |
| 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2675 | * Return: QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2676 | */ |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 2677 | static QDF_STATUS sap_fsm_state_disconnecting(struct sap_context *sap_ctx, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2678 | ptWLAN_SAPEvent sap_event, tpAniSirGlobal mac_ctx, |
| 2679 | tHalHandle hal) |
| 2680 | { |
| 2681 | uint32_t msg = sap_event->event; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2682 | QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2683 | |
| 2684 | if (msg == eSAP_MAC_READY_FOR_CONNECTIONS) { |
| 2685 | /* |
| 2686 | * Transition from eSAP_DISCONNECTING to eSAP_DISCONNECTED |
| 2687 | * (both without substates) |
| 2688 | */ |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2689 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2690 | FL("from state %s => %s"), |
| 2691 | "eSAP_DISCONNECTING", "eSAP_DISCONNECTED"); |
| 2692 | sap_ctx->sapsMachine = eSAP_DISCONNECTED; |
| 2693 | |
| 2694 | /* Close the SME session */ |
Krunal Soni | 074dd2c | 2017-04-14 14:57:34 -0700 | [diff] [blame] | 2695 | qdf_status = sap_signal_hdd_event(sap_ctx, NULL, |
| 2696 | eSAP_STOP_BSS_EVENT, |
| 2697 | (void *)eSAP_STATUS_SUCCESS); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2698 | } else if (msg == eWNI_SME_CHANNEL_CHANGE_REQ) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2699 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED, |
Jeff Johnson | a7c0ddb | 2017-09-18 08:14:12 -0700 | [diff] [blame] | 2700 | FL("sapdfs: Send channel change request on sapctx[%pK]"), |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2701 | sap_ctx); |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 2702 | |
| 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2706 | /* |
| 2707 | * Most likely, radar has been detected and SAP wants to |
| 2708 | * change the channel |
| 2709 | */ |
Jeff Johnson | 164b3bb | 2017-09-25 19:34:14 -0700 | [diff] [blame] | 2710 | qdf_status = wlansap_channel_change_request(sap_ctx, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2711 | mac_ctx->sap.SapDfsInfo.target_channel); |
| 2712 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2713 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2714 | FL("Sending DFS eWNI_SME_CHANNEL_CHANGE_REQ")); |
Liangwei Dong | 87a1ecc | 2016-09-28 04:03:16 -0400 | [diff] [blame] | 2715 | } 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 Puligilla | 20aa0c7 | 2017-10-30 12:24:06 -0700 | [diff] [blame] | 2721 | } 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 Viswanathan | 200f5c1 | 2018-02-27 14:01:59 +0530 | [diff] [blame] | 2727 | qdf_status = sap_goto_disconnecting(sap_ctx); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2728 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2729 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2730 | FL("in state %s, invalid event msg %d"), |
| 2731 | "eSAP_DISCONNECTING", msg); |
| 2732 | } |
| 2733 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2734 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2735 | } |
| 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2744 | * Return: QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2745 | */ |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 2746 | QDF_STATUS sap_fsm(struct sap_context *sap_ctx, ptWLAN_SAPEvent sap_event) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2747 | { |
| 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2755 | QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE; |
Jeff Johnson | c0db384 | 2017-09-13 18:34:28 -0700 | [diff] [blame] | 2756 | tHalHandle hal = CDS_GET_HAL_CB(); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2757 | tpAniSirGlobal mac_ctx; |
| 2758 | |
| 2759 | if (NULL == hal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2760 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2761 | FL("Invalid hal")); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2762 | return QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2763 | } |
| 2764 | |
| 2765 | mac_ctx = PMAC_STRUCT(hal); |
| 2766 | if (NULL == mac_ctx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2767 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2768 | FL("Invalid MAC context")); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2769 | return QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2770 | } |
| 2771 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2772 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, |
Jeff Johnson | a7c0ddb | 2017-09-18 08:14:12 -0700 | [diff] [blame] | 2773 | FL("sap_ctx=%pK, state_var=%d, msg=0x%x"), |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2774 | sap_ctx, state_var, msg); |
| 2775 | |
| 2776 | switch (state_var) { |
| 2777 | case eSAP_DISCONNECTED: |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2778 | qdf_status = sap_fsm_state_disconnected(sap_ctx, sap_event, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2779 | mac_ctx, hal); |
| 2780 | break; |
| 2781 | |
| 2782 | case eSAP_CH_SELECT: |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2783 | qdf_status = sap_fsm_state_ch_select(sap_ctx, sap_event, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2784 | mac_ctx, hal); |
| 2785 | break; |
| 2786 | |
| 2787 | case eSAP_DFS_CAC_WAIT: |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2788 | qdf_status = sap_fsm_state_dfs_cac_wait(sap_ctx, sap_event, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2789 | mac_ctx, hal); |
| 2790 | break; |
| 2791 | |
| 2792 | case eSAP_STARTING: |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2793 | qdf_status = sap_fsm_state_starting(sap_ctx, sap_event, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2794 | mac_ctx, hal); |
| 2795 | break; |
| 2796 | |
| 2797 | case eSAP_STARTED: |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2798 | qdf_status = sap_fsm_state_started(sap_ctx, sap_event, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2799 | mac_ctx); |
| 2800 | break; |
| 2801 | |
| 2802 | case eSAP_DISCONNECTING: |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2803 | qdf_status = sap_fsm_state_disconnecting(sap_ctx, sap_event, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2804 | mac_ctx, hal); |
| 2805 | break; |
| 2806 | } |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 2807 | return qdf_status; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2808 | } |
| 2809 | |
| 2810 | eSapStatus |
| 2811 | sapconvert_to_csr_profile(tsap_Config_t *pconfig_params, eCsrRoamBssType bssType, |
Jeff Johnson | 66ee8a9 | 2018-03-17 15:24:26 -0700 | [diff] [blame] | 2812 | struct csr_roam_profile *profile) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2813 | { |
| 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 Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 2820 | qdf_mem_zero(profile->SSIDs.SSIDList[0].SSID.ssId, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2821 | 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 Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 2829 | qdf_mem_copy(&profile->SSIDs.SSIDList[0].SSID.ssId, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2830 | 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 Rawat | 8021e45 | 2017-05-12 13:47:17 -0700 | [diff] [blame] | 2874 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2881 | /* set the RSN/WPA IE */ |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2882 | profile->nRSNReqIELength = pconfig_params->RSNWPAReqIELength; |
| 2883 | if (pconfig_params->RSNWPAReqIELength) { |
| 2884 | profile->pRSNReqIE = |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 2885 | qdf_mem_malloc(pconfig_params->RSNWPAReqIELength); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2886 | if (NULL == profile->pRSNReqIE) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 2887 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2888 | " %s Fail to alloc memory", __func__); |
| 2889 | return eSAP_STATUS_FAILURE; |
| 2890 | } |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 2891 | qdf_mem_copy(profile->pRSNReqIE, pconfig_params->RSNWPAReqIE, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2892 | pconfig_params->RSNWPAReqIELength); |
| 2893 | profile->nRSNReqIELength = pconfig_params->RSNWPAReqIELength; |
| 2894 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2895 | |
| 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 Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 2917 | qdf_mem_copy(profile->countryCode, pconfig_params->countryCode, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2918 | 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 Ashish | 06e76d2 | 2016-08-18 16:44:48 +0530 | [diff] [blame] | 2963 | 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 | |
hqu | 16d6e08 | 2017-09-04 10:52:31 +0800 | [diff] [blame] | 2979 | profile->chan_switch_hostapd_rate_enabled = |
| 2980 | pconfig_params->chan_switch_hostapd_rate_enabled; |
| 2981 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2982 | return eSAP_STATUS_SUCCESS; /* Success. */ |
| 2983 | } |
| 2984 | |
Jeff Johnson | 66ee8a9 | 2018-03-17 15:24:26 -0700 | [diff] [blame] | 2985 | void sap_free_roam_profile(struct csr_roam_profile *profile) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2986 | { |
| 2987 | if (profile->pRSNReqIE) { |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 2988 | qdf_mem_free(profile->pRSNReqIE); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2989 | profile->pRSNReqIE = NULL; |
| 2990 | } |
| 2991 | } |
| 2992 | |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 2993 | void sap_sort_mac_list(struct qdf_mac_addr *macList, uint8_t size) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2994 | { |
| 2995 | uint8_t outer, inner; |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 2996 | struct qdf_mac_addr temp; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 2997 | int32_t nRes = -1; |
| 2998 | |
| 2999 | if ((NULL == macList) || (size > MAX_ACL_MAC_ADDRESS)) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3000 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3001 | 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 Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3008 | qdf_mem_cmp((macList + inner)->bytes, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3009 | (macList + inner + 1)->bytes, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 3010 | QDF_MAC_ADDR_SIZE); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3011 | if (nRes > 0) { |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3012 | qdf_mem_copy(temp.bytes, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3013 | (macList + inner + 1)->bytes, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 3014 | QDF_MAC_ADDR_SIZE); |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3015 | qdf_mem_copy((macList + inner + 1)->bytes, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3016 | (macList + inner)->bytes, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 3017 | QDF_MAC_ADDR_SIZE); |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3018 | qdf_mem_copy((macList + inner)->bytes, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 3019 | temp.bytes, QDF_MAC_ADDR_SIZE); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3020 | } |
| 3021 | } |
| 3022 | } |
| 3023 | } |
| 3024 | |
Srinivas Girigowda | 74a66d6 | 2017-06-21 23:28:25 -0700 | [diff] [blame] | 3025 | bool |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 3026 | sap_search_mac_list(struct qdf_mac_addr *macList, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3027 | 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 Girigowda | 4d65ebe | 2017-10-13 21:41:42 -0700 | [diff] [blame] | 3032 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3033 | nEnd = num_mac - 1; |
| 3034 | |
| 3035 | if ((NULL == macList) || (num_mac > MAX_ACL_MAC_ADDRESS)) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3036 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3037 | FL("either buffer is NULL or size = %d is more."), num_mac); |
Srinivas Girigowda | 74a66d6 | 2017-06-21 23:28:25 -0700 | [diff] [blame] | 3038 | return false; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3039 | } |
| 3040 | |
| 3041 | while (nStart <= nEnd) { |
| 3042 | nMiddle = (nStart + nEnd) / 2; |
| 3043 | nRes = |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3044 | qdf_mem_cmp(&macList[nMiddle], peerMac, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 3045 | QDF_MAC_ADDR_SIZE); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3046 | |
| 3047 | if (0 == nRes) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3048 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3049 | "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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3054 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 3055 | QDF_TRACE_LEVEL_INFO_HIGH, "index %d", |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3056 | *index); |
| 3057 | } |
Srinivas Girigowda | 74a66d6 | 2017-06-21 23:28:25 -0700 | [diff] [blame] | 3058 | return true; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3059 | } |
| 3060 | if (nRes < 0) |
| 3061 | nStart = nMiddle + 1; |
| 3062 | else |
| 3063 | nEnd = nMiddle - 1; |
| 3064 | } |
| 3065 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3066 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3067 | "search not succ"); |
Srinivas Girigowda | 74a66d6 | 2017-06-21 23:28:25 -0700 | [diff] [blame] | 3068 | return false; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3069 | } |
| 3070 | |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 3071 | void sap_add_mac_to_acl(struct qdf_mac_addr *macList, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3072 | uint8_t *size, uint8_t *peerMac) |
| 3073 | { |
| 3074 | int32_t nRes = -1; |
| 3075 | int i; |
| 3076 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3077 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3078 | "add acl entered"); |
| 3079 | |
Arif Hussain | 2988e45 | 2016-12-21 13:36:39 -0800 | [diff] [blame] | 3080 | if (NULL == macList || *size > MAX_ACL_MAC_ADDRESS) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3081 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3082 | 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 Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3089 | qdf_mem_cmp(&macList[i], peerMac, QDF_MAC_ADDR_SIZE); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3090 | if (nRes > 0) { |
| 3091 | /* Move alphabetically greater mac addresses one index down to allow for insertion |
| 3092 | of new mac in sorted order */ |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3093 | qdf_mem_copy((macList + i + 1)->bytes, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 3094 | (macList + i)->bytes, QDF_MAC_ADDR_SIZE); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3095 | } 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 Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3100 | qdf_mem_copy((macList + i + 1)->bytes, peerMac, QDF_MAC_ADDR_SIZE); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3101 | /* increment the list size */ |
| 3102 | (*size)++; |
| 3103 | } |
| 3104 | |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 3105 | void sap_remove_mac_from_acl(struct qdf_mac_addr *macList, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3106 | uint8_t *size, uint8_t index) |
| 3107 | { |
| 3108 | int i; |
| 3109 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3110 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3111 | "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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3120 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3121 | 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 Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3128 | qdf_mem_copy((macList + i)->bytes, (macList + i + 1)->bytes, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 3129 | QDF_MAC_ADDR_SIZE); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3130 | } |
| 3131 | /* The last space should be made empty since all mac addesses moved one step up */ |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3132 | qdf_mem_zero((macList + (*size) - 1)->bytes, QDF_MAC_ADDR_SIZE); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3133 | /* reduce the list size by 1 */ |
| 3134 | (*size)--; |
| 3135 | } |
| 3136 | |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 3137 | void sap_print_acl(struct qdf_mac_addr *macList, uint8_t size) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3138 | { |
| 3139 | int i; |
| 3140 | uint8_t *macArray; |
Srinivas Girigowda | 4d65ebe | 2017-10-13 21:41:42 -0700 | [diff] [blame] | 3141 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3142 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3143 | "print acl entered"); |
| 3144 | |
| 3145 | if ((NULL == macList) || (size == 0) || (size >= MAX_ACL_MAC_ADDRESS)) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3146 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3147 | "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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3154 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3155 | "** ACL entry %i - " MAC_ADDRESS_STR, i, |
| 3156 | MAC_ADDR_ARRAY(macArray)); |
| 3157 | } |
| 3158 | return; |
| 3159 | } |
| 3160 | |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 3161 | QDF_STATUS sap_is_peer_mac_allowed(struct sap_context *sapContext, |
| 3162 | uint8_t *peerMac) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3163 | { |
| 3164 | if (eSAP_ALLOW_ALL == sapContext->eSapMacAddrAclMode) |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3165 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3166 | |
| 3167 | if (sap_search_mac_list |
| 3168 | (sapContext->acceptMacList, sapContext->nAcceptMac, peerMac, NULL)) |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3169 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3170 | |
| 3171 | if (sap_search_mac_list |
| 3172 | (sapContext->denyMacList, sapContext->nDenyMac, peerMac, NULL)) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3173 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3174 | "In %s, Peer " MAC_ADDRESS_STR " in deny list", |
| 3175 | __func__, MAC_ADDR_ARRAY(peerMac)); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3176 | return QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3177 | } |
| 3178 | /* A new station CAN associate, unless in deny list. Less stringent mode */ |
| 3179 | if (eSAP_ACCEPT_UNLESS_DENIED == sapContext->eSapMacAddrAclMode) |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3180 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3181 | |
| 3182 | /* A new station CANNOT associate, unless in accept list. More stringent mode */ |
| 3183 | if (eSAP_DENY_UNLESS_ACCEPTED == sapContext->eSapMacAddrAclMode) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3184 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3185 | "In %s, Peer " MAC_ADDRESS_STR |
| 3186 | " denied, Mac filter mode is eSAP_DENY_UNLESS_ACCEPTED", |
| 3187 | __func__, MAC_ADDR_ARRAY(peerMac)); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3188 | return QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3189 | } |
| 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3197 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3198 | "In %s, Peer " MAC_ADDRESS_STR |
| 3199 | " denied, Mac filter mode is eSAP_SUPPORT_ACCEPT_AND_DENY", |
| 3200 | __func__, MAC_ADDR_ARRAY(peerMac)); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3201 | return QDF_STATUS_E_FAILURE; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3202 | } |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3203 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3204 | } |
| 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 Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3215 | * Return: QDF_STATUS |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3216 | */ |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 3217 | static QDF_STATUS sap_get_channel_list(struct sap_context *sap_ctx, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3218 | 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 Johnson | c0db384 | 2017-09-13 18:34:28 -0700 | [diff] [blame] | 3227 | tHalHandle hal = CDS_GET_HAL_CB(); |
Dustin Brown | 0ce56d3 | 2016-10-17 16:18:03 -0700 | [diff] [blame] | 3228 | #ifdef FEATURE_WLAN_CH_AVOID |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3229 | uint8_t i; |
| 3230 | #endif |
| 3231 | tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal); |
Tushnim Bhattacharyya | 691680e | 2018-01-23 20:50:06 -0800 | [diff] [blame] | 3232 | tSapChSelSpectInfo spect_info_obj = { NULL, 0 }; |
Himanshu Agarwal | 91c5c0f | 2018-02-13 14:40:56 +0530 | [diff] [blame] | 3233 | uint16_t ch_width; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3234 | |
| 3235 | if (NULL == hal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3236 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3237 | FL("Invalid HAL pointer from p_cds_gctx")); |
| 3238 | *num_ch = 0; |
| 3239 | *ch_list = NULL; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3240 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3241 | } |
| 3242 | |
| 3243 | start_ch_num = sap_ctx->acs_cfg->start_ch; |
| 3244 | end_ch_num = sap_ctx->acs_cfg->end_ch; |
Himanshu Agarwal | 91c5c0f | 2018-02-13 14:40:56 +0530 | [diff] [blame] | 3245 | ch_width = sap_ctx->acs_cfg->ch_width; |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3246 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
Himanshu Agarwal | 91c5c0f | 2018-02-13 14:40:56 +0530 | [diff] [blame] | 3247 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3250 | |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 3251 | wlansap_extend_to_acs_range(hal, &start_ch_num, &end_ch_num, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3252 | &band_start_ch, &band_end_ch); |
| 3253 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3254 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3255 | FL("expanded startChannel %d,EndChannel %d"), |
| 3256 | start_ch_num, end_ch_num); |
| 3257 | |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3258 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3259 | 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 Singhal | b8d4f15 | 2016-02-10 10:21:43 -0800 | [diff] [blame] | 3265 | if (en_lte_coex && (band_start_ch == CHAN_ENUM_1) && |
| 3266 | (band_end_ch == CHAN_ENUM_14)) { |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3267 | /* Set 2.4GHz upper limit to channel 9 for LTE COEX */ |
Amar Singhal | b8d4f15 | 2016-02-10 10:21:43 -0800 | [diff] [blame] | 3268 | band_end_ch = CHAN_ENUM_9; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3269 | } |
| 3270 | |
| 3271 | /* Allocate the max number of channel supported */ |
Anurag Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3272 | list = (uint8_t *) qdf_mem_malloc(NUM_5GHZ_CHANNELS + |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3273 | NUM_24GHZ_CHANNELS); |
| 3274 | if (NULL == list) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3275 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3276 | FL("Unable to allocate channel list")); |
| 3277 | *num_ch = 0; |
| 3278 | *ch_list = NULL; |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3279 | return QDF_STATUS_E_NOMEM; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3280 | } |
| 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 Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 3287 | if ((start_ch_num > WLAN_REG_CH_NUM(loop_count)) || |
| 3288 | (end_ch_num < WLAN_REG_CH_NUM(loop_count))) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3289 | 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 Girigowda | 74a66d6 | 2017-06-21 23:28:25 -0700 | [diff] [blame] | 3295 | if (!(((true == mac_ctx->scan.fEnableDFSChnlScan) && |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 3296 | wlan_reg_get_channel_state(mac_ctx->pdev, loop_count)) || |
Srinivas Girigowda | 74a66d6 | 2017-06-21 23:28:25 -0700 | [diff] [blame] | 3297 | ((false == mac_ctx->scan.fEnableDFSChnlScan) && |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3298 | (CHANNEL_STATE_ENABLE == |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 3299 | wlan_reg_get_channel_state(mac_ctx->pdev, loop_count))))) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3300 | continue; |
| 3301 | |
Tushnim Bhattacharyya | 691680e | 2018-01-23 20:50:06 -0800 | [diff] [blame] | 3302 | /* |
| 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 Venkatesh | 82914ad | 2018-04-03 16:34:11 +0530 | [diff] [blame] | 3311 | /* 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 Bhattacharyya | 691680e | 2018-01-23 20:50:06 -0800 | [diff] [blame] | 3320 | |
Himanshu Agarwal | 91c5c0f | 2018-02-13 14:40:56 +0530 | [diff] [blame] | 3321 | /* |
| 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3341 | #ifdef FEATURE_WLAN_CH_AVOID |
Amar Singhal | b8d4f15 | 2016-02-10 10:21:43 -0800 | [diff] [blame] | 3342 | for (i = 0; i < NUM_CHANNELS; i++) { |
Srinivas Girigowda | f326dfe | 2017-08-03 11:28:32 -0700 | [diff] [blame] | 3343 | if (safe_channels[i].channelNumber == |
| 3344 | WLAN_REG_CH_NUM(loop_count)) { |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3345 | /* 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 Girigowda | 4d65ebe | 2017-10-13 21:41:42 -0700 | [diff] [blame] | 3350 | |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 3351 | ch = WLAN_REG_CH_NUM(loop_count); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3352 | 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 Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 3359 | WLAN_REG_CH_NUM(loop_count); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3360 | ch_count++; |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3361 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 3362 | QDF_TRACE_LEVEL_INFO, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3363 | FL("%d %d added to ACS ch range"), |
| 3364 | ch_count, ch); |
| 3365 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3366 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 3367 | QDF_TRACE_LEVEL_INFO_HIGH, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3368 | FL("%d %d skipped from ACS ch range"), |
| 3369 | ch_count, ch); |
| 3370 | } |
| 3371 | } else { |
| 3372 | list[ch_count] = |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 3373 | WLAN_REG_CH_NUM(loop_count); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3374 | ch_count++; |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3375 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 3376 | QDF_TRACE_LEVEL_INFO, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3377 | FL("%d %d added to ACS ch range"), |
| 3378 | ch_count, ch); |
| 3379 | } |
| 3380 | #else |
Kiran Kumar Lokere | a3de226 | 2017-04-12 12:15:04 -0700 | [diff] [blame] | 3381 | list[ch_count] = WLAN_REG_CH_NUM(loop_count); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3382 | ch_count++; |
| 3383 | #endif |
| 3384 | #ifdef FEATURE_WLAN_CH_AVOID |
| 3385 | } |
| 3386 | break; |
| 3387 | } |
| 3388 | } |
| 3389 | #endif |
| 3390 | } |
| 3391 | if (0 == ch_count) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3392 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3393 | 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3399 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_FATAL, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3400 | 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 Chouhan | 600c3a0 | 2016-03-01 10:33:54 +0530 | [diff] [blame] | 3409 | qdf_mem_free(list); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3410 | } |
| 3411 | |
| 3412 | for (loop_count = 0; loop_count < ch_count; loop_count++) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3413 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3414 | FL("channel number: %d"), list[loop_count]); |
| 3415 | } |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3416 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3417 | } |
| 3418 | #endif |
| 3419 | |
Wen Gong | 01a2c63 | 2018-04-11 18:34:55 +0800 | [diff] [blame^] | 3420 | #ifdef DFS_COMPONENT_ENABLE |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 3421 | uint8_t sap_indicate_radar(struct sap_context *sap_ctx) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3422 | { |
| 3423 | uint8_t target_channel = 0; |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3424 | tHalHandle hal; |
| 3425 | tpAniSirGlobal mac; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3426 | |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3427 | if (!sap_ctx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3428 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3429 | FL("null sap_ctx")); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3430 | return 0; |
| 3431 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3432 | |
Jeff Johnson | c0db384 | 2017-09-13 18:34:28 -0700 | [diff] [blame] | 3433 | hal = CDS_GET_HAL_CB(); |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3434 | if (!hal) { |
| 3435 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 3436 | FL("null hal")); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3437 | return 0; |
| 3438 | } |
| 3439 | |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3440 | mac = PMAC_STRUCT(hal); |
| 3441 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3442 | /* |
| 3443 | * SAP needs to generate Channel Switch IE |
| 3444 | * if the radar is found in the STARTED state |
| 3445 | */ |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3446 | if (eSAP_STARTED == sap_ctx->sapsMachine) |
Srinivas Girigowda | 74a66d6 | 2017-06-21 23:28:25 -0700 | [diff] [blame] | 3447 | mac->sap.SapDfsInfo.csaIERequired = true; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3448 | |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3449 | if (sap_ctx->csr_roamProfile.disableDFSChSwitch) |
| 3450 | return sap_ctx->channel; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3451 | |
| 3452 | /* set the Radar Found flag in SapDfsInfo */ |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3453 | mac->sap.SapDfsInfo.sap_radar_found_status = true; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3454 | |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3455 | if (sap_ctx->chan_before_pre_cac) { |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 3456 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO, |
| 3457 | FL("sapdfs: set chan before pre cac %d as target chan"), |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3458 | sap_ctx->chan_before_pre_cac); |
| 3459 | return sap_ctx->chan_before_pre_cac; |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 3460 | } |
| 3461 | |
Himanshu Agarwal | dfc4dca | 2017-08-29 19:49:05 +0530 | [diff] [blame] | 3462 | if (sap_ctx->vendor_acs_dfs_lte_enabled && (QDF_STATUS_SUCCESS == |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3463 | sap_signal_hdd_event(sap_ctx, NULL, eSAP_DFS_NEXT_CHANNEL_REQ, |
| 3464 | (void *) eSAP_STATUS_SUCCESS))) |
Himanshu Agarwal | dfc4dca | 2017-08-29 19:49:05 +0530 | [diff] [blame] | 3465 | return 0; |
Kapil Gupta | 8878ad9 | 2017-02-13 11:56:04 +0530 | [diff] [blame] | 3466 | |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3467 | 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 Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3472 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_WARN, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3473 | FL("sapdfs: New selected target channel is [%d]"), |
| 3474 | target_channel); |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3475 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3476 | return target_channel; |
| 3477 | } |
Wen Gong | 01a2c63 | 2018-04-11 18:34:55 +0800 | [diff] [blame^] | 3478 | #endif |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3479 | |
| 3480 | /* |
| 3481 | * CAC timer callback function. |
| 3482 | * Post eSAP_DFS_CHANNEL_CAC_END event to sap_fsm(). |
| 3483 | */ |
| 3484 | void sap_dfs_cac_timer_callback(void *data) |
| 3485 | { |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 3486 | struct sap_context *sapContext; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3487 | tWLAN_SAPEvent sapEvent; |
| 3488 | tHalHandle hHal = (tHalHandle) data; |
| 3489 | tpAniSirGlobal pMac; |
| 3490 | |
| 3491 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3492 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3493 | "In %s invalid hHal", __func__); |
| 3494 | return; |
| 3495 | } |
| 3496 | pMac = PMAC_STRUCT(hHal); |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 3497 | sapContext = sap_find_cac_wait_session(hHal); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3498 | if (NULL == sapContext) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3499 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 3500 | "%s: no SAP contexts in wait state", __func__); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3501 | return; |
| 3502 | } |
| 3503 | |
Naveen Rawat | 6de4645 | 2016-06-08 10:02:26 -0700 | [diff] [blame] | 3504 | /* |
| 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 Hussain | 759a023 | 2017-03-20 13:17:18 -0700 | [diff] [blame] | 3510 | if (!sapContext->dfs_cac_offload) |
| 3511 | qdf_mc_timer_destroy( |
| 3512 | &pMac->sap.SapDfsInfo.sap_dfs_cac_timer); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3513 | pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = false; |
Naveen Rawat | 6de4645 | 2016-06-08 10:02:26 -0700 | [diff] [blame] | 3514 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3515 | |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 3516 | /* |
| 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 Johnson | a7c0ddb | 2017-09-18 08:14:12 -0700 | [diff] [blame] | 3520 | "sapdfs: Sending eSAP_DFS_CHANNEL_CAC_END for target_channel = %d on sapctx[%pK]", |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 3521 | sapContext->channel, sapContext); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3522 | |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 3523 | sapEvent.event = eSAP_DFS_CHANNEL_CAC_END; |
| 3524 | sapEvent.params = 0; |
| 3525 | sapEvent.u1 = 0; |
| 3526 | sapEvent.u2 = 0; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3527 | |
Manishekar Chandrasekaran | 9e8c7be | 2016-08-03 14:57:14 +0530 | [diff] [blame] | 3528 | sap_fsm(sapContext, &sapEvent); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3529 | } |
| 3530 | |
| 3531 | /* |
| 3532 | * Function to stop the DFS CAC Timer |
| 3533 | */ |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 3534 | static int sap_stop_dfs_cac_timer(struct sap_context *sapContext) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3535 | { |
| 3536 | tHalHandle hHal; |
| 3537 | tpAniSirGlobal pMac; |
Srinivas Girigowda | 4d65ebe | 2017-10-13 21:41:42 -0700 | [diff] [blame] | 3538 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3539 | if (sapContext == NULL) |
| 3540 | return 0; |
| 3541 | |
Jeff Johnson | c0db384 | 2017-09-13 18:34:28 -0700 | [diff] [blame] | 3542 | hHal = CDS_GET_HAL_CB(); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3543 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3544 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3545 | "In %s invalid hHal", __func__); |
| 3546 | return 0; |
| 3547 | } |
| 3548 | pMac = PMAC_STRUCT(hHal); |
| 3549 | |
Arif Hussain | cd15163 | 2017-02-11 16:57:19 -0800 | [diff] [blame] | 3550 | if (sapContext->dfs_cac_offload) { |
| 3551 | pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = 0; |
| 3552 | return 0; |
| 3553 | } |
| 3554 | |
Anurag Chouhan | 210db07 | 2016-02-22 18:42:15 +0530 | [diff] [blame] | 3555 | if (QDF_TIMER_STATE_RUNNING != |
| 3556 | qdf_mc_timer_get_current_state(&pMac->sap.SapDfsInfo. |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3557 | sap_dfs_cac_timer)) { |
| 3558 | return 0; |
| 3559 | } |
| 3560 | |
Anurag Chouhan | 210db07 | 2016-02-22 18:42:15 +0530 | [diff] [blame] | 3561 | qdf_mc_timer_stop(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3562 | pMac->sap.SapDfsInfo.is_dfs_cac_timer_running = 0; |
Naveen Rawat | 6de4645 | 2016-06-08 10:02:26 -0700 | [diff] [blame] | 3563 | qdf_mc_timer_destroy(&pMac->sap.SapDfsInfo.sap_dfs_cac_timer); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3564 | |
| 3565 | return 0; |
| 3566 | } |
| 3567 | |
| 3568 | |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3569 | /* |
| 3570 | * Function to start the DFS CAC Timer |
| 3571 | * when SAP is started on a DFS channel |
| 3572 | */ |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 3573 | static int sap_start_dfs_cac_timer(struct sap_context *sap_ctx) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3574 | { |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3575 | QDF_STATUS status; |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 3576 | uint32_t cac_dur; |
| 3577 | tHalHandle hal = NULL; |
| 3578 | tpAniSirGlobal mac = NULL; |
Amar Singhal | 5cccafe | 2017-02-15 12:42:58 -0800 | [diff] [blame] | 3579 | enum dfs_reg dfs_region; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3580 | |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 3581 | if (!sap_ctx) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3582 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 3583 | "%s: null sap_ctx", __func__); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3584 | return 0; |
| 3585 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3586 | |
Jeff Johnson | c0db384 | 2017-09-13 18:34:28 -0700 | [diff] [blame] | 3587 | hal = CDS_GET_HAL_CB(); |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 3588 | if (!hal) { |
| 3589 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
| 3590 | "%s: null hal", __func__); |
| 3591 | return 0; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3592 | } |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3593 | |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 3594 | mac = PMAC_STRUCT(hal); |
Arif Hussain | 759a023 | 2017-03-20 13:17:18 -0700 | [diff] [blame] | 3595 | 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 Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 3602 | sap_get_cac_dur_dfs_region(sap_ctx, &cac_dur, &dfs_region); |
| 3603 | if (0 == cac_dur) |
| 3604 | return 0; |
Arif Hussain | 4d43b9b | 2017-01-20 18:33:00 -0800 | [diff] [blame] | 3605 | |
| 3606 | #ifdef QCA_WIFI_NAPIER_EMULATION |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 3607 | cac_dur = cac_dur / 100; |
Arif Hussain | 4d43b9b | 2017-01-20 18:33:00 -0800 | [diff] [blame] | 3608 | #endif |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3609 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO_MED, |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 3610 | "sapdfs: SAP_DFS_CHANNEL_CAC_START on CH-%d, CAC_DUR-%d sec", |
| 3611 | sap_ctx->channel, cac_dur / 1000); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3612 | |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 3613 | qdf_mc_timer_init(&mac->sap.SapDfsInfo.sap_dfs_cac_timer, |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 3614 | QDF_TIMER_TYPE_SW, |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 3615 | sap_dfs_cac_timer_callback, (void *)hal); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3616 | |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 3617 | /* Start the CAC timer */ |
| 3618 | status = qdf_mc_timer_start(&mac->sap.SapDfsInfo.sap_dfs_cac_timer, |
| 3619 | cac_dur); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3620 | if (status == QDF_STATUS_SUCCESS) { |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 3621 | mac->sap.SapDfsInfo.is_dfs_cac_timer_running = true; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3622 | return 1; |
| 3623 | } else { |
Arif Hussain | 671a190 | 2017-03-17 09:08:32 -0700 | [diff] [blame] | 3624 | 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3628 | 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 Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 3637 | QDF_STATUS sap_init_dfs_channel_nol_list(struct sap_context *sapContext) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3638 | { |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3639 | tHalHandle hHal; |
| 3640 | tpAniSirGlobal pMac; |
| 3641 | |
| 3642 | if (NULL == sapContext) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3643 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3644 | "Invalid sapContext pointer on sap_init_dfs_channel_nol_list"); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3645 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3646 | } |
Jeff Johnson | c0db384 | 2017-09-13 18:34:28 -0700 | [diff] [blame] | 3647 | hHal = CDS_GET_HAL_CB(); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3648 | |
| 3649 | if (NULL == hHal) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3650 | QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3651 | "In %s invalid hHal", __func__); |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3652 | return QDF_STATUS_E_FAULT; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3653 | } |
| 3654 | pMac = PMAC_STRUCT(hHal); |
| 3655 | |
bings | 02297ab | 2018-01-19 14:11:42 +0800 | [diff] [blame] | 3656 | utils_dfs_init_nol(pMac->pdev); |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3657 | |
Anurag Chouhan | fb54ab0 | 2016-02-18 18:00:46 +0530 | [diff] [blame] | 3658 | return QDF_STATUS_SUCCESS; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3659 | } |
| 3660 | |
| 3661 | /* |
| 3662 | * This function will calculate how many interfaces |
| 3663 | * have sap persona and returns total number of sap persona. |
| 3664 | */ |
| 3665 | uint8_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 Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 3672 | if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3673 | || |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 3674 | (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona)) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3675 | && pMac->sap.sapCtxList[intf].pSapContext != NULL) { |
| 3676 | intf_count++; |
| 3677 | } |
| 3678 | } |
| 3679 | return intf_count; |
| 3680 | } |
| 3681 | |
Krunal Soni | e8324ce | 2017-09-25 10:16:56 -0700 | [diff] [blame] | 3682 | /** |
| 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 Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3688 | * This function will find the concurrent sap context apart from |
| 3689 | * passed sap context and return its channel change ready status |
Krunal Soni | e8324ce | 2017-09-25 10:16:56 -0700 | [diff] [blame] | 3690 | * |
| 3691 | * |
| 3692 | * Return: true if other SAP personas are ready to channel switch else false |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3693 | */ |
| 3694 | bool is_concurrent_sap_ready_for_channel_change(tHalHandle hHal, |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 3695 | struct sap_context *sapContext) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3696 | { |
| 3697 | tpAniSirGlobal pMac = PMAC_STRUCT(hHal); |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 3698 | struct sap_context *pSapContext; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3699 | uint8_t intf = 0; |
| 3700 | |
| 3701 | for (intf = 0; intf < SAP_MAX_NUM_SESSION; intf++) { |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 3702 | if (((QDF_SAP_MODE == pMac->sap.sapCtxList[intf].sapPersona) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3703 | || |
Anurag Chouhan | 6d76066 | 2016-02-20 16:05:43 +0530 | [diff] [blame] | 3704 | (QDF_P2P_GO_MODE == pMac->sap.sapCtxList[intf].sapPersona)) |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3705 | && pMac->sap.sapCtxList[intf].pSapContext != NULL) { |
| 3706 | pSapContext = |
Jeff Johnson | f1cd3c7 | 2017-09-14 07:18:06 -0700 | [diff] [blame] | 3707 | pMac->sap.sapCtxList[intf].pSapContext; |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3708 | if (pSapContext == sapContext) { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3709 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 3710 | QDF_TRACE_LEVEL_ERROR, |
Jeff Johnson | a7c0ddb | 2017-09-18 08:14:12 -0700 | [diff] [blame] | 3711 | FL("sapCtx matched [%pK]"), |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3712 | sapContext); |
| 3713 | continue; |
| 3714 | } else { |
Anurag Chouhan | b2dc16f | 2016-02-25 11:47:37 +0530 | [diff] [blame] | 3715 | QDF_TRACE(QDF_MODULE_ID_SAP, |
| 3716 | QDF_TRACE_LEVEL_ERROR, |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3717 | FL |
Jeff Johnson | a7c0ddb | 2017-09-18 08:14:12 -0700 | [diff] [blame] | 3718 | ("concurrent sapCtx[%pK] didn't matche with [%pK]"), |
Prakash Dhavali | 7090c5f | 2015-11-02 17:55:19 -0800 | [diff] [blame] | 3719 | pSapContext, sapContext); |
| 3720 | return pSapContext->is_sap_ready_for_chnl_chng; |
| 3721 | } |
| 3722 | } |
| 3723 | } |
| 3724 | return false; |
| 3725 | } |
Krunal Soni | e8324ce | 2017-09-25 10:16:56 -0700 | [diff] [blame] | 3726 | |
| 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 | */ |
| 3738 | bool 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 | } |