Parcourir la source

qcacld-3.0: Move pre_cac start code to pre_cac component

Move pre_cac start code flow from hdd to pre_cac component.

Change-Id: Ia3bd7521bff9571dee18dbc20b28d08b76128944
CRs-Fixed: 3199948
Dundi Raviteja il y a 2 ans
Parent
commit
71fc4f3fd4

+ 13 - 0
components/mlme/dispatcher/inc/wlan_mlme_api.h

@@ -3508,6 +3508,19 @@ QDF_STATUS
 wlan_mlme_update_ratemask_params(struct wlan_objmgr_vdev *vdev,
 				 uint8_t num_ratemask,
 				 struct config_ratemask_params *rate_params);
+
+/**
+ * wlan_mlme_is_channel_valid() - validate channel frequency
+ * @psoc: psoc object manager
+ * @chan_freq: channel frequency
+ *
+ * This function validates channel frequency present in valid channel
+ * list or not.
+ *
+ * Return: true or false
+ */
+bool wlan_mlme_is_channel_valid(struct wlan_objmgr_psoc *psoc,
+				uint32_t chan_freq);
 #ifdef WLAN_FEATURE_MCC_QUOTA
 /**
  * wlan_mlme_set_user_mcc_quota() - set the user mcc quota in mlme

+ 13 - 0
components/mlme/dispatcher/src/wlan_mlme_api.c

@@ -5519,6 +5519,19 @@ wlan_mlme_update_ratemask_params(struct wlan_objmgr_vdev *vdev,
 	return QDF_STATUS_SUCCESS;
 }
 
+bool wlan_mlme_is_channel_valid(struct wlan_objmgr_psoc *psoc,
+				uint32_t chan_freq)
+{
+	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+
+	mlme_obj = mlme_get_psoc_ext_obj(psoc);
+	if (!mlme_obj)
+		return false;
+
+	return wlan_roam_is_channel_valid(&mlme_obj->cfg.reg,
+					  chan_freq);
+}
+
 #ifdef WLAN_FEATURE_MCC_QUOTA
 #define WLAN_MCC_MIN_QUOTA 10 /* in %age */
 #define WLAN_MCC_MAX_QUOTA 90 /* in %age */

+ 129 - 0
components/pre_cac/core/src/wlan_pre_cac_main.c

@@ -22,9 +22,138 @@
 
 #include "wlan_pre_cac_main.h"
 #include "wlan_objmgr_global_obj.h"
+#include "wlan_policy_mgr_api.h"
+#include "wlan_reg_services_api.h"
+#include "wlan_mlme_api.h"
 
 struct pre_cac_ops *glbl_pre_cac_ops;
 
+static void pre_cac_get_vdev_id_handler(struct wlan_objmgr_psoc *psoc,
+					void *obj, void *args)
+{
+	struct wlan_objmgr_vdev *vdev = (struct wlan_objmgr_vdev *)obj;
+	struct pre_cac_vdev_priv *vdev_priv;
+	uint8_t *vdev_id = (uint8_t *)args;
+
+	vdev_priv = pre_cac_vdev_get_priv(vdev);
+	if (!vdev_priv)
+		return;
+
+	if (vdev_priv->is_pre_cac_on)
+		*vdev_id = vdev->vdev_objmgr.vdev_id;
+}
+
+void pre_cac_get_vdev_id(struct wlan_objmgr_psoc *psoc,
+			 uint8_t *vdev_id)
+{
+	wlan_objmgr_iterate_obj_list(psoc, WLAN_VDEV_OP,
+				     pre_cac_get_vdev_id_handler,
+				     vdev_id, true, WLAN_PRE_CAC_ID);
+}
+
+int pre_cac_validate_and_get_freq(struct wlan_objmgr_pdev *pdev,
+				  uint32_t chan_freq,
+				  uint32_t *pre_cac_chan_freq)
+{
+	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
+	uint32_t len = CFG_VALID_CHANNEL_LIST_LEN;
+	uint8_t pcl_weights[NUM_CHANNELS] = {0};
+	uint32_t freq_list[NUM_CHANNELS] = {0};
+	uint32_t weight_len = 0;
+	QDF_STATUS status;
+	uint32_t i;
+
+	if (pre_cac_is_active(psoc)) {
+		pre_cac_err("pre cac is already in progress");
+		return -EINVAL;
+	}
+
+	if (!chan_freq) {
+		/* Channel is not obtained from PCL because PCL may not have
+		 * the entire channel list. For example: if SAP is up on
+		 * channel 6 and PCL is queried for the next SAP interface,
+		 * if SCC is preferred, the PCL will contain only the channel
+		 * 6. But, we are in need of a DFS channel. So, going with the
+		 * first channel from the valid channel list.
+		 */
+		status = policy_mgr_get_valid_chans(psoc,
+						    freq_list, &len);
+		if (QDF_IS_STATUS_ERROR(status)) {
+			pre_cac_err("Failed to get channel list");
+			return -EINVAL;
+		}
+
+		policy_mgr_update_with_safe_channel_list(psoc,
+							 freq_list, &len,
+							 pcl_weights,
+							 weight_len);
+		for (i = 0; i < len; i++) {
+			if (wlan_reg_is_dfs_for_freq(pdev,
+						     freq_list[i])) {
+				*pre_cac_chan_freq = freq_list[i];
+				break;
+			}
+		}
+
+		if (*pre_cac_chan_freq == 0) {
+			pre_cac_err("unable to find outdoor channel");
+			return -EINVAL;
+		}
+	} else {
+		/* Only when driver selects a channel, check is done for
+		 * unnsafe and NOL channels. When user provides a fixed channel
+		 * the user is expected to take care of this.
+		 */
+		if (!wlan_mlme_is_channel_valid(psoc, chan_freq) ||
+		    !wlan_reg_is_dfs_for_freq(pdev, chan_freq)) {
+			pre_cac_err("Invalid channel for pre cac:%d",
+				    chan_freq);
+			return -EINVAL;
+		}
+		*pre_cac_chan_freq = chan_freq;
+	}
+
+	pre_cac_debug("selected pre cac channel:%d", *pre_cac_chan_freq);
+	return 0;
+}
+
+QDF_STATUS pre_cac_set_status(struct wlan_objmgr_vdev *vdev, bool status)
+{
+	struct pre_cac_vdev_priv *vdev_priv;
+
+	vdev_priv = pre_cac_vdev_get_priv(vdev);
+	if (!vdev_priv)
+		return QDF_STATUS_E_INVAL;
+
+	vdev_priv->is_pre_cac_on = status;
+
+	return QDF_STATUS_SUCCESS;
+}
+
+static void pre_cac_is_active_vdev_handler(struct wlan_objmgr_psoc *psoc,
+					   void *obj, void *args)
+{
+	struct wlan_objmgr_vdev *vdev = (struct wlan_objmgr_vdev *)obj;
+	struct pre_cac_vdev_priv *vdev_priv;
+	bool *is_pre_cac_on = (bool *)args;
+
+	vdev_priv = pre_cac_vdev_get_priv(vdev);
+	if (!vdev_priv)
+		return;
+
+	*is_pre_cac_on = vdev_priv->is_pre_cac_on;
+}
+
+bool pre_cac_is_active(struct wlan_objmgr_psoc *psoc)
+{
+	bool is_pre_cac_on = false;
+
+	wlan_objmgr_iterate_obj_list(psoc, WLAN_VDEV_OP,
+				     pre_cac_is_active_vdev_handler,
+				     &is_pre_cac_on, true, WLAN_PRE_CAC_ID);
+	return is_pre_cac_on;
+}
+
 struct pre_cac_vdev_priv *
 pre_cac_vdev_get_priv_fl(struct wlan_objmgr_vdev *vdev,
 			 const char *func, uint32_t line)

+ 44 - 0
components/pre_cac/core/src/wlan_pre_cac_main.h

@@ -181,4 +181,48 @@ void pre_cac_deinit(void);
  * Return: None
  */
 void pre_cac_set_osif_cb(struct pre_cac_ops *osif_pre_cac_ops);
+
+/**
+ * pre_cac_is_active(): status of pre_cac
+ * @psoc: psoc pointer
+ *
+ * Return: status of pre_cac
+ */
+bool pre_cac_is_active(struct wlan_objmgr_psoc *psoc);
+
+/**
+ * pre_cac_validate_and_get_freq() - Validate and get pre cac frequency
+ * @pdev: pdev object manager
+ * @chan_freq: Channel frequency requested by userspace
+ * @pre_cac_chan_freq: Pointer to the pre CAC channel frequency storage
+ *
+ * Validates the channel provided by userspace. If user provided channel 0,
+ * a valid outdoor channel must be selected from the regulatory channel.
+ *
+ * Return: Zero on success and non zero value on error
+ */
+int pre_cac_validate_and_get_freq(struct wlan_objmgr_pdev *pdev,
+				  uint32_t chan_freq,
+				  uint32_t *pre_cac_chan_freq);
+
+/**
+ * pre_cac_set_status() - Set pre cac status
+ * @vdev: vdev object manager
+ * @status: status of pre_cac
+ *
+ * Sets pre_cac status
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS pre_cac_set_status(struct wlan_objmgr_vdev *vdev, bool status);
+
+/**
+ * pre_cac_get_vdev_id() - Get pre cac vdev id
+ * @psoc: psoc object manager
+ * @vdev_id: pointer to the pre cac vdev id
+ *
+ * Return: None
+ */
+void pre_cac_get_vdev_id(struct wlan_objmgr_psoc *psoc,
+			 uint8_t *vdev_id);
 #endif /* end of _WLAN_PRE_CAC_MAIN_H_ */

+ 31 - 0
components/pre_cac/dispatcher/inc/wlan_pre_cac_api.h

@@ -21,4 +21,35 @@
 #ifndef _WLAN_PRE_CAC_API_H_
 #define _WLAN_PRE_CAC_API_H_
 
+#ifdef PRE_CAC_SUPPORT
+/**
+ * wlan_pre_cac_get_status(): status of pre_cac
+ * @psoc: psoc object manager
+ *
+ * Return: status of pre_cac
+ */
+bool wlan_pre_cac_get_status(struct wlan_objmgr_psoc *psoc);
+
+/**
+ * wlan_pre_cac_set_status() - Set pre cac status
+ * @vdev: vdev object manager
+ * @status: status of pre_cac
+ *
+ * Sets pre_cac status
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS wlan_pre_cac_set_status(struct wlan_objmgr_vdev *vdev, bool status);
+#else
+static inline bool wlan_pre_cac_get_status(struct wlan_objmgr_psoc *psoc)
+{
+	return false;
+}
+
+static inline QDF_STATUS
+wlan_pre_cac_set_status(struct wlan_objmgr_vdev *vdev, bool status)
+{
+	return false;
+}
+#endif /* PRE_CAC_SUPPORT */
 #endif /* _WLAN_PRE_CAC_API_H_ */

+ 78 - 1
components/pre_cac/dispatcher/inc/wlan_pre_cac_ucfg_api.h

@@ -25,6 +25,7 @@
 #include <qdf_status.h>
 #include <qdf_types.h>
 #include "wlan_pre_cac_public_struct.h"
+#include "wlan_objmgr_psoc_obj.h"
 
 #ifdef PRE_CAC_SUPPORT
 /**
@@ -54,6 +55,57 @@ void ucfg_pre_cac_deinit(void);
  * Return: None
  */
 void ucfg_pre_cac_set_osif_cb(struct pre_cac_ops *pre_cac_ops);
+
+/**
+ * ucfg_pre_cac_is_active(): status of pre_cac
+ * @psoc: psoc object manager
+ *
+ * Return: status of pre_cac
+ */
+bool ucfg_pre_cac_is_active(struct wlan_objmgr_psoc *psoc);
+
+/**
+ * ucfg_pre_cac_validate_and_get_freq() - Validate and get pre cac frequency
+ * @pdev: pdev object manager
+ * @chan_freq: Channel frequency requested by userspace
+ * @pre_cac_chan_freq: Pointer to the pre CAC channel frequency storage
+ *
+ * Validates the channel provided by userspace. If user provided channel 0,
+ * a valid outdoor channel must be selected from the regulatory channel.
+ *
+ * Return: Zero on success and non zero value on error
+ */
+int ucfg_pre_cac_validate_and_get_freq(struct wlan_objmgr_pdev *pdev,
+				       uint32_t chan_freq,
+				       uint32_t *pre_cac_chan_freq);
+
+#if defined(FEATURE_SAP_COND_CHAN_SWITCH)
+/**
+ * ucfg_pre_cac_set_status() - Set pre cac status
+ * @vdev: vdev object manager
+ * @status: status of pre_cac
+ *
+ * Sets pre_cac status
+ *
+ * Return: Zero on success and non zero value on error
+ */
+QDF_STATUS ucfg_pre_cac_set_status(struct wlan_objmgr_vdev *vdev, bool status);
+#else
+static inline QDF_STATUS
+ucfg_pre_cac_set_status(struct wlan_objmgr_vdev *vdev, bool status)
+{
+}
+#endif
+
+/**
+ * ucfg_pre_cac_get_vdev_id() - Get pre cac vdev id
+ * @psoc: psoc object manager
+ * @vdev_id: pre cac vdev id
+ *
+ * Return: None
+ */
+void ucfg_pre_cac_get_vdev_id(struct wlan_objmgr_psoc *psoc,
+			      uint8_t *vdev_id);
 #else
 static inline
 QDF_STATUS ucfg_pre_cac_init(void)
@@ -70,6 +122,31 @@ static inline void
 ucfg_pre_cac_set_osif_cb(struct pre_cac_ops *pre_cac_ops)
 {
 }
+
+static inline bool
+ucfg_pre_cac_is_active(struct wlan_objmgr_psoc *psoc)
+{
+	return false;
+}
+
+static inline int
+ucfg_pre_cac_validate_and_get_freq(struct wlan_objmgr_pdev *pdev,
+				   uint32_t chan_freq,
+				   uint32_t *pre_cac_chan_freq)
+{
+	return 0;
+}
+
+static inline QDF_STATUS
+ucfg_pre_cac_set_status(struct wlan_objmgr_vdev *vdev, bool status)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline void
+ucfg_pre_cac_get_vdev_id(struct wlan_objmgr_psoc *psoc,
+			 uint8_t *vdev_id)
+{
+}
 #endif /* PRE_CAC_SUPPORT */
 #endif /* _WLAN_PRE_CAC_UCFG_API_H_ */
-

+ 13 - 0
components/pre_cac/dispatcher/src/wlan_pre_cac_api.c

@@ -17,3 +17,16 @@
 /**
  * DOC: Public API implementation of pre cac called from SAP module
  */
+
+#include "../../core/src/wlan_pre_cac_main.h"
+#include "wlan_pre_cac_api.h"
+
+bool wlan_pre_cac_get_status(struct wlan_objmgr_psoc *psoc)
+{
+	return pre_cac_is_active(psoc);
+}
+
+QDF_STATUS wlan_pre_cac_set_status(struct wlan_objmgr_vdev *vdev, bool status)
+{
+	return pre_cac_set_status(vdev, status);
+}

+ 24 - 0
components/pre_cac/dispatcher/src/wlan_pre_cac_ucfg_api.c

@@ -21,6 +21,30 @@
 #include "../../core/src/wlan_pre_cac_main.h"
 #include "wlan_pre_cac_ucfg_api.h"
 
+void ucfg_pre_cac_get_vdev_id(struct wlan_objmgr_psoc *psoc,
+			      uint8_t *vdev_id)
+{
+	pre_cac_get_vdev_id(psoc, vdev_id);
+}
+
+int ucfg_pre_cac_validate_and_get_freq(struct wlan_objmgr_pdev *pdev,
+				       uint32_t chan_freq,
+				       uint32_t *pre_cac_chan_freq)
+{
+	return pre_cac_validate_and_get_freq(pdev, chan_freq,
+					     pre_cac_chan_freq);
+}
+
+QDF_STATUS ucfg_pre_cac_set_status(struct wlan_objmgr_vdev *vdev, bool status)
+{
+	return pre_cac_set_status(vdev, status);
+}
+
+bool ucfg_pre_cac_is_active(struct wlan_objmgr_psoc *psoc)
+{
+	return pre_cac_is_active(psoc);
+}
+
 void ucfg_pre_cac_set_osif_cb(struct pre_cac_ops *osif_pre_cac_ops)
 {
 	pre_cac_set_osif_cb(osif_pre_cac_ops);

+ 10 - 0
core/hdd/src/wlan_hdd_hostapd.c

@@ -111,6 +111,7 @@
 #include "wlan_hdd_wds.h"
 #include "wlan_hdd_pre_cac.h"
 #include "wlan_osif_features.h"
+#include "wlan_pre_cac_ucfg_api.h"
 
 #define ACS_SCAN_EXPIRY_TIMEOUT_S 4
 
@@ -6625,8 +6626,17 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy,
 	mutex_unlock(&hdd_ctx->sap_lock);
 
 	mac_handle = hdd_ctx->mac_handle;
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	if (wlan_sap_is_pre_cac_active(mac_handle))
 		hdd_clean_up_pre_cac_interface(hdd_ctx);
+#else
+	if (ucfg_pre_cac_is_active(hdd_ctx->psoc))
+		hdd_clean_up_pre_cac_interface(hdd_ctx);
+#endif
 
 	if (status != QDF_STATUS_SUCCESS) {
 		hdd_err("Stopping the BSS");

+ 20 - 1
core/hdd/src/wlan_hdd_main.c

@@ -8313,16 +8313,35 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 			 * pre-cac adapter
 			 */
 			sap_ctx = WLAN_HDD_GET_SAP_CTX_PTR(adapter);
+
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 			if (!wlan_sap_is_pre_cac_context(sap_ctx) &&
 			    (hdd_ctx->sap_pre_cac_work.fn))
 				cds_flush_work(&hdd_ctx->sap_pre_cac_work);
-
+#else
+			if (!ucfg_pre_cac_is_active(hdd_ctx->psoc) &&
+			    hdd_ctx->sap_pre_cac_work.fn)
+				cds_flush_work(&hdd_ctx->sap_pre_cac_work);
+#endif
 			hdd_close_pre_cac_adapter(hdd_ctx);
 
 		} else {
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 			if (wlan_sap_set_pre_cac_status(
 				   WLAN_HDD_GET_SAP_CTX_PTR(adapter), false))
 				hdd_err("Failed to set is_pre_cac_on to false");
+#else
+			if (ucfg_pre_cac_set_status(adapter->vdev, false))
+				hdd_err("Failed to set is_pre_cac_on to false");
+#endif
 		}
 
 		/* fallthrough */

+ 10 - 0
core/hdd/src/wlan_hdd_p2p.c

@@ -55,6 +55,7 @@
 #include "wlan_pkt_capture_ucfg_api.h"
 #include "wlan_hdd_object_manager.h"
 #include "wlan_hdd_pre_cac.h"
+#include "wlan_pre_cac_ucfg_api.h"
 
 /* Ms to Time Unit Micro Sec */
 #define MS_TO_TU_MUS(x)   ((x) * 1024)
@@ -944,8 +945,17 @@ int __wlan_hdd_del_virtual_intf(struct wiphy *wiphy, struct wireless_dev *wdev)
 	if (errno)
 		return errno;
 
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	if (adapter->device_mode == QDF_SAP_MODE &&
 	    wlan_sap_is_pre_cac_active(hdd_ctx->mac_handle)) {
+#else
+	if (adapter->device_mode == QDF_SAP_MODE &&
+	    ucfg_pre_cac_is_active(hdd_ctx->psoc)) {
+#endif
 		hdd_clean_up_interface(hdd_ctx, adapter);
 		hdd_clean_up_pre_cac_interface(hdd_ctx);
 	} else if (wlan_hdd_is_session_type_monitor(

+ 131 - 77
core/hdd/src/wlan_hdd_pre_cac.c

@@ -20,6 +20,7 @@
 #include "wlan_hdd_pre_cac.h"
 #include <qdf_types.h>
 #include "osif_pre_cac.h"
+#include "wlan_pre_cac_ucfg_api.h"
 
 void hdd_send_conditional_chan_switch_status(struct hdd_context *hdd_ctx,
 					     struct wireless_dev *wdev,
@@ -220,6 +221,11 @@ void hdd_close_pre_cac_adapter(struct hdd_context *hdd_ctx)
 
 void hdd_clean_up_pre_cac_interface(struct hdd_context *hdd_ctx)
 {
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	uint8_t vdev_id;
 	QDF_STATUS status;
 	struct hdd_adapter *precac_adapter;
@@ -240,28 +246,7 @@ void hdd_clean_up_pre_cac_interface(struct hdd_context *hdd_ctx)
 			wlan_hdd_sap_pre_cac_failure,
 			(void *)precac_adapter);
 	qdf_sched_work(0, &hdd_ctx->sap_pre_cac_work);
-}
-
-/**
- * wlan_hdd_set_pre_cac_status() - Set the pre cac status
- * @pre_cac_adapter: AP adapter used for pre cac
- * @status: Status (true or false)
- *
- * Sets the status of pre cac i.e., whether the pre cac is active or not
- *
- * Return: Zero on success, non-zero on failure
- */
-static int wlan_hdd_set_pre_cac_status(struct hdd_adapter *pre_cac_adapter,
-				       bool status)
-{
-	QDF_STATUS ret;
-
-	ret = wlan_sap_set_pre_cac_status(
-		WLAN_HDD_GET_SAP_CTX_PTR(pre_cac_adapter), status);
-	if (QDF_IS_STATUS_ERROR(ret))
-		return -EINVAL;
-
-	return 0;
+#endif
 }
 
 /**
@@ -290,6 +275,73 @@ wlan_hdd_set_chan_freq_before_pre_cac(struct hdd_adapter *ap_adapter,
 	return 0;
 }
 
+static int wlan_set_def_pre_cac_chan(struct hdd_context *hdd_ctx,
+				     uint32_t pre_cac_ch_freq,
+				     struct cfg80211_chan_def *chandef,
+				     enum nl80211_channel_type *chantype,
+				     enum phy_ch_width *ch_width)
+{
+	enum nl80211_channel_type channel_type;
+	struct ieee80211_channel *ieee_chan;
+	struct ch_params ch_params = {0};
+
+	ieee_chan = ieee80211_get_channel(hdd_ctx->wiphy,
+					  pre_cac_ch_freq);
+	if (!ieee_chan) {
+		hdd_err("channel converion failed %d", pre_cac_ch_freq);
+		return -EINVAL;
+	}
+	ch_params.ch_width = *ch_width;
+	wlan_reg_set_channel_params_for_freq(hdd_ctx->pdev,
+					     pre_cac_ch_freq, 0,
+					     &ch_params);
+	switch (ch_params.sec_ch_offset) {
+	case HIGH_PRIMARY_CH:
+		channel_type = NL80211_CHAN_HT40MINUS;
+		break;
+	case LOW_PRIMARY_CH:
+		channel_type = NL80211_CHAN_HT40PLUS;
+		break;
+	default:
+		channel_type = NL80211_CHAN_HT20;
+		break;
+	}
+	cfg80211_chandef_create(chandef, ieee_chan, channel_type);
+	switch (ch_params.ch_width) {
+	case CH_WIDTH_80MHZ:
+		chandef->width = NL80211_CHAN_WIDTH_80;
+		break;
+	case CH_WIDTH_80P80MHZ:
+		chandef->width = NL80211_CHAN_WIDTH_80P80;
+		if (ch_params.mhz_freq_seg1)
+			chandef->center_freq2 = ch_params.mhz_freq_seg1;
+		break;
+	case CH_WIDTH_160MHZ:
+		chandef->width = NL80211_CHAN_WIDTH_160;
+		break;
+	default:
+		break;
+	}
+	if (ch_params.ch_width == CH_WIDTH_80MHZ ||
+	    ch_params.ch_width == CH_WIDTH_80P80MHZ ||
+	    ch_params.ch_width == CH_WIDTH_160MHZ) {
+		if (ch_params.mhz_freq_seg0)
+			chandef->center_freq1 = ch_params.mhz_freq_seg0;
+	}
+	*chantype = channel_type;
+	*ch_width = ch_params.ch_width;
+	hdd_debug("pre cac ch def: chan:%d width:%d freq1:%d freq2:%d",
+		  chandef->chan->center_freq, chandef->width,
+		  chandef->center_freq1, chandef->center_freq2);
+
+	return 0;
+}
+
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 /**
  * wlan_hdd_validate_and_get_pre_cac_ch() - Validate and get pre cac channel
  * @hdd_ctx: HDD context
@@ -361,67 +413,28 @@ static int wlan_hdd_validate_and_get_pre_cac_ch(struct hdd_context *hdd_ctx,
 	return 0;
 }
 
-static int wlan_set_def_pre_cac_chan(struct hdd_context *hdd_ctx,
-				     uint32_t pre_cac_ch_freq,
-				     struct cfg80211_chan_def *chandef,
-				     enum nl80211_channel_type *chantype,
-				     enum phy_ch_width *ch_width)
+/**
+ * wlan_hdd_set_pre_cac_status() - Set the pre cac status
+ * @pre_cac_adapter: AP adapter used for pre cac
+ * @status: Status (true or false)
+ *
+ * Sets the status of pre cac i.e., whether the pre cac is active or not
+ *
+ * Return: Zero on success, non-zero on failure
+ */
+static int wlan_hdd_set_pre_cac_status(struct hdd_adapter *pre_cac_adapter,
+				       bool status)
 {
-	enum nl80211_channel_type channel_type;
-	struct ieee80211_channel *ieee_chan;
-	struct ch_params ch_params = {0};
+	QDF_STATUS ret;
 
-	ieee_chan = ieee80211_get_channel(hdd_ctx->wiphy,
-					  pre_cac_ch_freq);
-	if (!ieee_chan) {
-		hdd_err("channel converion failed %d", pre_cac_ch_freq);
+	ret = wlan_sap_set_pre_cac_status(
+		WLAN_HDD_GET_SAP_CTX_PTR(pre_cac_adapter), status);
+	if (QDF_IS_STATUS_ERROR(ret))
 		return -EINVAL;
-	}
-	ch_params.ch_width = *ch_width;
-	wlan_reg_set_channel_params_for_freq(hdd_ctx->pdev,
-					     pre_cac_ch_freq, 0,
-					     &ch_params);
-	switch (ch_params.sec_ch_offset) {
-	case HIGH_PRIMARY_CH:
-		channel_type = NL80211_CHAN_HT40MINUS;
-		break;
-	case LOW_PRIMARY_CH:
-		channel_type = NL80211_CHAN_HT40PLUS;
-		break;
-	default:
-		channel_type = NL80211_CHAN_HT20;
-		break;
-	}
-	cfg80211_chandef_create(chandef, ieee_chan, channel_type);
-	switch (ch_params.ch_width) {
-	case CH_WIDTH_80MHZ:
-		chandef->width = NL80211_CHAN_WIDTH_80;
-		break;
-	case CH_WIDTH_80P80MHZ:
-		chandef->width = NL80211_CHAN_WIDTH_80P80;
-		if (ch_params.mhz_freq_seg1)
-			chandef->center_freq2 = ch_params.mhz_freq_seg1;
-		break;
-	case CH_WIDTH_160MHZ:
-		chandef->width = NL80211_CHAN_WIDTH_160;
-		break;
-	default:
-		break;
-	}
-	if (ch_params.ch_width == CH_WIDTH_80MHZ ||
-	    ch_params.ch_width == CH_WIDTH_80P80MHZ ||
-	    ch_params.ch_width == CH_WIDTH_160MHZ) {
-		if (ch_params.mhz_freq_seg0)
-			chandef->center_freq1 = ch_params.mhz_freq_seg0;
-	}
-	*chantype = channel_type;
-	*ch_width = ch_params.ch_width;
-	hdd_debug("pre cac ch def: chan:%d width:%d freq1:%d freq2:%d",
-		  chandef->chan->center_freq, chandef->width,
-		  chandef->center_freq1, chandef->center_freq2);
 
 	return 0;
 }
+#endif
 
 /**
  * __wlan_hdd_request_pre_cac() - Start pre CAC in the driver
@@ -449,7 +462,13 @@ static int __wlan_hdd_request_pre_cac(struct hdd_context *hdd_ctx,
 	struct cfg80211_chan_def chandef;
 	enum nl80211_channel_type channel_type;
 	mac_handle_t mac_handle;
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	bool val;
+#endif
 	enum phy_ch_width cac_ch_width;
 	struct hdd_adapter_create_param params = {0};
 	qdf_freq_t freq;
@@ -461,6 +480,11 @@ static int __wlan_hdd_request_pre_cac(struct hdd_context *hdd_ctx,
 
 	pre_cac_adapter = hdd_get_adapter_by_iface_name(hdd_ctx,
 							SAP_PRE_CAC_IFNAME);
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	if (pre_cac_adapter) {
 		/* Flush existing pre_cac work */
 		if (hdd_ctx->sap_pre_cac_work.fn)
@@ -471,6 +495,13 @@ static int __wlan_hdd_request_pre_cac(struct hdd_context *hdd_ctx,
 			return -EINVAL;
 		}
 	}
+#else
+	if (!pre_cac_adapter &&
+	    (policy_mgr_get_connection_count(hdd_ctx->psoc) > 1)) {
+		hdd_err("pre cac not allowed in concurrency");
+		return -EINVAL;
+	}
+#endif
 
 	ap_adapter = hdd_get_adapter(hdd_ctx, QDF_SAP_MODE);
 	if (!ap_adapter) {
@@ -484,11 +515,17 @@ static int __wlan_hdd_request_pre_cac(struct hdd_context *hdd_ctx,
 	}
 
 	mac_handle = hdd_ctx->mac_handle;
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	val = wlan_sap_is_pre_cac_active(mac_handle);
 	if (val) {
 		hdd_err("pre cac is already in progress");
 		return -EINVAL;
 	}
+#endif
 
 	hdd_ap_ctx = WLAN_HDD_GET_AP_CTX_PTR(ap_adapter);
 	if (!hdd_ap_ctx) {
@@ -511,8 +548,17 @@ static int __wlan_hdd_request_pre_cac(struct hdd_context *hdd_ctx,
 
 	hdd_debug("channel: %d", chan_freq);
 
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	ret = wlan_hdd_validate_and_get_pre_cac_ch(
 		hdd_ctx, ap_adapter, chan_freq, &pre_cac_chan_freq);
+#else
+	ret = ucfg_pre_cac_validate_and_get_freq(hdd_ctx->pdev, chan_freq,
+						 &pre_cac_chan_freq);
+#endif
 	if (ret != 0) {
 		hdd_err("can't validate pre-cac channel");
 		goto release_intf_addr_and_return_failure;
@@ -654,7 +700,15 @@ static int __wlan_hdd_request_pre_cac(struct hdd_context *hdd_ctx,
 	 * anywhere, since after the pre cac success/failure, the pre cac
 	 * adapter itself would be removed.
 	 */
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	ret = wlan_hdd_set_pre_cac_status(pre_cac_adapter, true);
+#else
+	ret = ucfg_pre_cac_set_status(pre_cac_adapter->vdev, true);
+#endif
 	if (ret != 0) {
 		hdd_err("failed to set pre cac status");
 		goto stop_close_pre_cac_adapter;

+ 24 - 0
core/sap/inc/sap_api.h

@@ -856,6 +856,11 @@ QDF_STATUS wlan_sap_update_next_channel(struct sap_context *sap_ctx,
 					enum phy_ch_width chan_bw);
 
 #if defined(FEATURE_SAP_COND_CHAN_SWITCH) && defined(PRE_CAC_SUPPORT)
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 /**
  * wlan_sap_set_pre_cac_status() - Set the pre cac status
  * @sap_ctx: SAP context
@@ -867,6 +872,7 @@ QDF_STATUS wlan_sap_update_next_channel(struct sap_context *sap_ctx,
  */
 QDF_STATUS wlan_sap_set_pre_cac_status(struct sap_context *sap_ctx,
 				       bool status);
+#endif
 
 /**
  * wlan_sap_set_chan_freq_before_pre_cac() - Save the channel before pre cac
@@ -881,11 +887,17 @@ QDF_STATUS
 wlan_sap_set_chan_freq_before_pre_cac(struct sap_context *sap_ctx,
 				      qdf_freq_t freq_before_pre_cac);
 #else
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 static inline QDF_STATUS
 wlan_sap_set_pre_cac_status(struct sap_context *sap_ctx, bool status)
 {
 	return QDF_STATUS_SUCCESS;
 }
+#endif
 
 static inline QDF_STATUS
 wlan_sap_set_chan_freq_before_pre_cac(struct sap_context *sap_ctx,
@@ -908,6 +920,11 @@ wlan_sap_set_chan_freq_before_pre_cac(struct sap_context *sap_ctx,
 QDF_STATUS wlan_sap_set_pre_cac_complete_status(struct sap_context *sap_ctx,
 						bool status);
 
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 /**
  * wlan_sap_is_pre_cac_context() - checks if @context is for a pre-cac adapter
  * @context: the SAP context to check
@@ -918,6 +935,7 @@ bool wlan_sap_is_pre_cac_context(struct sap_context *context);
 
 bool wlan_sap_is_pre_cac_active(mac_handle_t handle);
 QDF_STATUS wlan_sap_get_pre_cac_vdev_id(mac_handle_t handle, uint8_t *vdev_id);
+#endif /* PRE_CAC_COMP */
 #else
 static inline QDF_STATUS
 wlan_sap_set_pre_cac_complete_status(struct sap_context *sap_ctx,
@@ -926,6 +944,11 @@ wlan_sap_set_pre_cac_complete_status(struct sap_context *sap_ctx,
 	return QDF_STATUS_SUCCESS;
 }
 
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 static inline bool
 wlan_sap_is_pre_cac_context(struct sap_context *context)
 {
@@ -937,6 +960,7 @@ static inline bool wlan_sap_is_pre_cac_active(mac_handle_t handle)
 	return false;
 }
 #endif
+#endif
 
 #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
 /**

+ 12 - 2
core/sap/src/sap_api_link_cntl.c

@@ -52,6 +52,7 @@
 #include "wlan_reg_services_api.h"
 #include <wlan_scan_api.h>
 #include <wlan_scan_utils_api.h>
+#include "wlan_pre_cac_api.h"
 
 /* IF MGR API header file */
 #include "wlan_if_mgr_ucfg_api.h"
@@ -1123,12 +1124,21 @@ QDF_STATUS wlansap_roam_callback(void *ctx,
 				  sap_ctx->chan_freq);
 			goto EXIT;
 		}
-
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 		if (sap_ctx->is_pre_cac_on) {
 			wlan_sap_pre_cac_radar_ind(sap_ctx, mac_ctx);
 			break;
 		}
-
+#else
+		if (wlan_pre_cac_get_status(mac_ctx->psoc)) {
+			wlan_sap_pre_cac_radar_ind(sap_ctx, mac_ctx);
+			break;
+		}
+#endif
 		sap_debug("sapdfs: Indicate eSAP_DFS_RADAR_DETECT to HDD");
 		sap_signal_hdd_event(sap_ctx, NULL, eSAP_DFS_RADAR_DETECT,
 				     (void *) eSAP_STATUS_SUCCESS);

+ 17 - 0
core/sap/src/sap_fsm.c

@@ -60,6 +60,7 @@
 #include "cfg_ucfg_api.h"
 #include "wlan_mlme_vdev_mgr_interface.h"
 #include "wlan_vdev_mgr_utils_api.h"
+#include "wlan_pre_cac_api.h"
 
 /*----------------------------------------------------------------------------
  * Preprocessor Definitions and Constants
@@ -1475,7 +1476,15 @@ QDF_STATUS sap_set_session_param(mac_handle_t mac_handle,
 	int i;
 
 	sapctx->sessionId = session_id;
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	sapctx->is_pre_cac_on = false;
+#else
+	wlan_pre_cac_set_status(sapctx->vdev, false);
+#endif
 	sapctx->pre_cac_complete = false;
 	sapctx->freq_before_pre_cac = 0;
 
@@ -2762,7 +2771,15 @@ QDF_STATUS sap_cac_end_notify(mac_handle_t mac_handle,
 			 * temporary interface created for pre cac and switch
 			 * the original SAP to the pre CAC channel.
 			 */
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 			if (sap_context->is_pre_cac_on) {
+#else
+			if (wlan_pre_cac_get_status(mac->psoc)) {
+#endif
 				qdf_status = wlansap_update_pre_cac_end(
 						sap_context, mac, intf);
 				if (QDF_IS_STATUS_ERROR(qdf_status))

+ 6 - 0
core/sap/src/sap_internal.h

@@ -217,7 +217,13 @@ struct sap_context {
 	eSapHddEvent sap_state;
 	eSapStatus sap_status;
 	uint32_t roc_ind_scan_id;
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	bool is_pre_cac_on;
+#endif
 	bool pre_cac_complete;
 	bool vendor_acs_dfs_lte_enabled;
 	uint8_t dfs_vendor_channel;

+ 13 - 1
core/sap/src/sap_module.c

@@ -1660,6 +1660,11 @@ QDF_STATUS wlan_sap_update_next_channel(struct sap_context *sap_ctx,
 }
 
 #if defined(FEATURE_SAP_COND_CHAN_SWITCH) && defined(PRE_CAC_SUPPORT)
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 QDF_STATUS wlan_sap_set_pre_cac_status(struct sap_context *sap_ctx,
 				       bool status)
 {
@@ -1673,6 +1678,7 @@ QDF_STATUS wlan_sap_set_pre_cac_status(struct sap_context *sap_ctx,
 
 	return QDF_STATUS_SUCCESS;
 }
+#endif
 
 QDF_STATUS
 wlan_sap_set_chan_freq_before_pre_cac(struct sap_context *sap_ctx,
@@ -1705,6 +1711,11 @@ QDF_STATUS wlan_sap_set_pre_cac_complete_status(struct sap_context *sap_ctx,
 	return QDF_STATUS_SUCCESS;
 }
 
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 bool wlan_sap_is_pre_cac_context(struct sap_context *context)
 {
 	return context && context->is_pre_cac_on;
@@ -1769,7 +1780,8 @@ QDF_STATUS wlan_sap_get_pre_cac_vdev_id(mac_handle_t handle, uint8_t *vdev_id)
 	}
 	return QDF_STATUS_E_FAILURE;
 }
-#endif
+#endif /* PRE_CAC_COMP */
+#endif /* PRE_CAC_SUPPORT */
 
 void wlansap_get_sec_channel(uint8_t sec_ch_offset,
 			     uint32_t op_chan_freq,