Browse Source

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
Ashish Kumar Dhanotiya 3 years ago
parent
commit
cc3c67977d

+ 3 - 0
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);
 }
 

+ 24 - 0
components/mlme/dispatcher/inc/cfg_mlme_reg.h

@@ -102,6 +102,29 @@
 	CFG_VALUE_OR_DEFAULT, \
 	"enable/disable ETSI SRD channels in master mode")
 
+/*
+ * <ini>
+ * 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
+ *
+ * </ini>
+ */
+#define CFG_INDOOR_CHANNEL_SUPPORT_FOR_NAN CFG_INI_BOOL( \
+	"enable_nan_indoor_channel", \
+	0, \
+	"enable/disable indoor channels for NAN")
+
 /*
  * <ini>
  * 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) \

+ 11 - 0
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

+ 2 - 0
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

+ 18 - 0
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,

+ 18 - 0
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_ */

+ 23 - 1
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 <wlan_mlme_api.h>
 
 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;
+}

+ 1 - 11
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);
 }