diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index 1f9ac1359e..6e4a6ba187 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/components/mlme/core/src/wlan_mlme_main.c @@ -2332,6 +2332,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 a65ebd4ff2..793be88de9 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 fa939ef59c..dda406dd92 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_api.h @@ -2036,6 +2036,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 70ae27cce7..300ac228c5 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -2421,6 +2421,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; @@ -2440,6 +2441,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; }; #define IOT_AGGR_INFO_MAX_NUM 32 diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index 5663a6d00f..cb3db4a8bf 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_api.c @@ -3274,6 +3274,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 bba21cca9b..a37bcf323a 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 00d4d9ca5e..993c0ec159 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 c44700e32c..9a5b4f3d48 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); }