From f61fd3c4c591b3572fe648306e8cd83eb145eecb Mon Sep 17 00:00:00 2001 From: Ashish Kumar Dhanotiya Date: Tue, 18 May 2021 14:17:12 +0530 Subject: [PATCH] qcacld-3.0: Add ini support to enable NAN on indoor channels Currently there is no support to enable NAN on indoor channels, as per the new requirement add an ini support to enable NAN on indoor channels. Change-Id: Ia3acbc133cab4865d8ad69992e893be91439f50f CRs-Fixed: 2943668 --- components/mlme/core/src/wlan_mlme_main.c | 3 +++ components/mlme/dispatcher/inc/cfg_mlme_reg.h | 24 +++++++++++++++++++ .../mlme/dispatcher/inc/wlan_mlme_api.h | 11 +++++++++ .../dispatcher/inc/wlan_mlme_public_struct.h | 2 ++ .../mlme/dispatcher/src/wlan_mlme_api.c | 18 ++++++++++++++ components/nan/core/inc/wlan_nan_api.h | 18 ++++++++++++++ components/nan/core/src/nan_api.c | 24 ++++++++++++++++++- components/nan/dispatcher/src/nan_ucfg_api.c | 12 +--------- 8 files changed, 100 insertions(+), 12 deletions(-) diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index 6343aafd7e51..202b50d66b70 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/components/mlme/core/src/wlan_mlme_main.c @@ -2344,6 +2344,9 @@ static void mlme_init_reg_cfg(struct wlan_objmgr_psoc *psoc, reg->retain_nol_across_regdmn_update = cfg_get(psoc, CFG_RETAIN_NOL_ACROSS_REG_DOMAIN); + reg->enable_nan_on_indoor_channels = + cfg_get(psoc, CFG_INDOOR_CHANNEL_SUPPORT_FOR_NAN); + mlme_init_acs_avoid_freq_list(psoc, reg); } diff --git a/components/mlme/dispatcher/inc/cfg_mlme_reg.h b/components/mlme/dispatcher/inc/cfg_mlme_reg.h index b2c19526d130..c28c119db46b 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme_reg.h +++ b/components/mlme/dispatcher/inc/cfg_mlme_reg.h @@ -102,6 +102,29 @@ CFG_VALUE_OR_DEFAULT, \ "enable/disable ETSI SRD channels in master mode") +/* + * + * enable_nan_indoor_channel - Enable Indoor channels for NAN + * @Min: 0 + * @Max: 1 + * @Default: 0 + * + * This ini is used to support to indoor channels for NAN interface + * Customer can config this item to enable/disable NAN in indoor channel + * + * Related: None + * + * Supported Feature: NAN + * + * Usage: External + * + * + */ +#define CFG_INDOOR_CHANNEL_SUPPORT_FOR_NAN CFG_INI_BOOL( \ + "enable_nan_indoor_channel", \ + 0, \ + "enable/disable indoor channels for NAN") + /* * * fcc_5dot9_ghz_chan_in_master_mode - Enable/disable 5.9 GHz channels in @@ -315,6 +338,7 @@ CFG(CFG_ENABLE_PENDING_CHAN_LIST_REQ) \ CFG(CFG_ENABLE_11D_IN_WORLD_MODE) \ CFG(CFG_ETSI_SRD_CHAN_IN_MASTER_MODE) \ + CFG(CFG_INDOOR_CHANNEL_SUPPORT_FOR_NAN) \ CFG(CFG_FCC_5DOT9_GHZ_CHAN_IN_MASTER_MODE) \ CFG(CFG_RESTART_BEACONING_ON_CH_AVOID) \ CFG(CFG_INDOOR_CHANNEL_SUPPORT) \ diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h index 32711ee8c3b1..f7b2fcfe6ae7 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_api.h @@ -1965,6 +1965,17 @@ wlan_mlme_get_srd_master_mode_for_vdev(struct wlan_objmgr_psoc *psoc, enum QDF_OPMODE vdev_opmode, bool *value); +/** + * wlan_mlme_get_indoor_support_for_nan - Get indoor channel support for NAN + * @psoc: pointer to psoc object + * @value: pointer to the value which will be filled for the caller + * + * Return: QDF Status + */ +QDF_STATUS +wlan_mlme_get_indoor_support_for_nan(struct wlan_objmgr_psoc *psoc, + bool *value); + /** * wlan_mlme_get_force_sap_enabled() - Get the value of force SAP enabled * @psoc: psoc context diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index b0e4d023d02a..1cbdc5c05365 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -2321,6 +2321,7 @@ enum mlme_reg_srd_master_modes { * @enable_pending_chan_list_req: enables/disables scan channel * list command to FW till the current scan is complete. * @retain_nol_across_regdmn_update: Retain the NOL list across the regdomain. + * @enable_nan_on_indoor_channels: Enable nan on Indoor channels */ struct wlan_mlme_reg { uint32_t self_gen_frm_pwr; @@ -2340,6 +2341,7 @@ struct wlan_mlme_reg { bool ignore_fw_reg_offload_ind; bool enable_pending_chan_list_req; bool retain_nol_across_regdmn_update; + bool enable_nan_on_indoor_channels; }; /** diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index 351f17d42a6b..06d69458b1e0 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_api.c @@ -3103,6 +3103,24 @@ wlan_mlme_get_vht20_mcs9(struct wlan_objmgr_psoc *psoc, bool *value) return QDF_STATUS_SUCCESS; } +QDF_STATUS +wlan_mlme_get_indoor_support_for_nan(struct wlan_objmgr_psoc *psoc, + bool *value) +{ + struct wlan_mlme_psoc_ext_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_ext_obj(psoc); + if (!mlme_obj) { + *value = false; + mlme_legacy_err("Failed to get MLME Obj"); + return QDF_STATUS_E_INVAL; + } + + *value = mlme_obj->cfg.reg.enable_nan_on_indoor_channels; + + return QDF_STATUS_SUCCESS; +} + QDF_STATUS wlan_mlme_get_srd_master_mode_for_vdev(struct wlan_objmgr_psoc *psoc, enum QDF_OPMODE vdev_opmode, diff --git a/components/nan/core/inc/wlan_nan_api.h b/components/nan/core/inc/wlan_nan_api.h index bba21cca9b5b..a37bcf323afe 100644 --- a/components/nan/core/inc/wlan_nan_api.h +++ b/components/nan/core/inc/wlan_nan_api.h @@ -215,6 +215,18 @@ QDF_STATUS nan_disable_cleanup(struct wlan_objmgr_psoc *psoc); * Return: True if beamforming is supported, false if not. */ bool wlan_nan_is_beamforming_supported(struct wlan_objmgr_psoc *psoc); + +/** + * wlan_is_nan_allowed_on_freq() - Check if NAN is allowed on given freq + * @pdev: pdev context + * @freq: Frequency to be checked + * + * Check if NAN/NDP can be enabled on given frequency. + * + * Return: True if NAN is allowed on the given frequency + */ +bool wlan_is_nan_allowed_on_freq(struct wlan_objmgr_pdev *pdev, uint32_t freq); + #else /* WLAN_FEATURE_NAN */ static inline QDF_STATUS nan_init(void) { @@ -266,5 +278,11 @@ bool wlan_nan_is_beamforming_supported(struct wlan_objmgr_psoc *psoc) { return false; } + +static inline +bool wlan_is_nan_allowed_on_freq(struct wlan_objmgr_pdev *pdev, uint32_t freq) +{ + return false; +} #endif /* WLAN_FEATURE_NAN */ #endif /* _WLAN_NAN_API_H_ */ diff --git a/components/nan/core/src/nan_api.c b/components/nan/core/src/nan_api.c index 00d4d9ca5ec5..993c0ec159b5 100644 --- a/components/nan/core/src/nan_api.c +++ b/components/nan/core/src/nan_api.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -30,6 +30,7 @@ #include "wlan_objmgr_pdev_obj.h" #include "wlan_objmgr_vdev_obj.h" #include "nan_ucfg_api.h" +#include static QDF_STATUS nan_psoc_obj_created_notification( struct wlan_objmgr_psoc *psoc, void *arg_list) @@ -408,3 +409,24 @@ QDF_STATUS nan_psoc_disable(struct wlan_objmgr_psoc *psoc) return QDF_STATUS_SUCCESS; } + +bool wlan_is_nan_allowed_on_freq(struct wlan_objmgr_pdev *pdev, uint32_t freq) +{ + bool nan_allowed = true; + + /* Check for SRD channels */ + if (wlan_reg_is_etsi13_srd_chan_for_freq(pdev, freq)) + wlan_mlme_get_srd_master_mode_for_vdev(wlan_pdev_get_psoc(pdev), + QDF_NAN_DISC_MODE, + &nan_allowed); + + /* Check for Indoor channels */ + if (wlan_reg_is_freq_indoor(pdev, freq)) + wlan_mlme_get_indoor_support_for_nan(wlan_pdev_get_psoc(pdev), + &nan_allowed); + /* Check for dfs only if channel is not indoor */ + else if (wlan_reg_is_dfs_for_freq(pdev, freq)) + nan_allowed = false; + + return nan_allowed; +} diff --git a/components/nan/dispatcher/src/nan_ucfg_api.c b/components/nan/dispatcher/src/nan_ucfg_api.c index c44700e32c7d..9a5b4f3d48e7 100644 --- a/components/nan/dispatcher/src/nan_ucfg_api.c +++ b/components/nan/dispatcher/src/nan_ucfg_api.c @@ -1304,15 +1304,5 @@ QDF_STATUS ucfg_nan_disable_ind_to_userspace(struct wlan_objmgr_psoc *psoc) bool ucfg_is_nan_allowed_on_freq(struct wlan_objmgr_pdev *pdev, uint32_t freq) { - bool nan_allowed = false; - - /* Check for SRD channels only */ - if (!wlan_reg_is_etsi13_srd_chan_for_freq(pdev, freq)) - return true; - - wlan_mlme_get_srd_master_mode_for_vdev(wlan_pdev_get_psoc(pdev), - QDF_NAN_DISC_MODE, - &nan_allowed); - - return nan_allowed; + return wlan_is_nan_allowed_on_freq(pdev, freq); }