Browse Source

qcacld-3.0: Move pre cac success code to pre cac component

Move pre cac success code to pre cac component.

Change-Id: I9d4f6c52ada96905e185fecef6556c59e05ab284
CRs-Fixed: 3199947
Dundi Raviteja 2 years ago
parent
commit
2bbdc1835e

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

@@ -28,6 +28,150 @@
 
 struct pre_cac_ops *glbl_pre_cac_ops;
 
+void pre_cac_set_freq(struct wlan_objmgr_vdev *vdev,
+		      qdf_freq_t freq)
+{
+	struct pre_cac_vdev_priv *vdev_priv;
+
+	vdev_priv = pre_cac_vdev_get_priv(vdev);
+	if (!vdev_priv)
+		return;
+
+	vdev_priv->pre_cac_freq = freq;
+}
+
+qdf_freq_t pre_cac_get_freq(struct wlan_objmgr_vdev *vdev)
+{
+	struct pre_cac_vdev_priv *vdev_priv;
+
+	vdev_priv = pre_cac_vdev_get_priv(vdev);
+	if (!vdev_priv)
+		return 0;
+
+	return vdev_priv->pre_cac_freq;
+}
+
+void pre_cac_set_freq_before_pre_cac(struct wlan_objmgr_vdev *vdev,
+				     qdf_freq_t freq)
+{
+	struct pre_cac_vdev_priv *vdev_priv;
+
+	vdev_priv = pre_cac_vdev_get_priv(vdev);
+	if (!vdev_priv)
+		return;
+
+	vdev_priv->freq_before_pre_cac = freq;
+}
+
+qdf_freq_t pre_cac_get_freq_before_pre_cac(struct wlan_objmgr_vdev *vdev)
+{
+	struct pre_cac_vdev_priv *vdev_priv;
+
+	vdev_priv = pre_cac_vdev_get_priv(vdev);
+	if (!vdev_priv)
+		return 0;
+
+	return vdev_priv->freq_before_pre_cac;
+}
+
+void pre_cac_adapter_set(struct wlan_objmgr_vdev *vdev,
+			 bool status)
+{
+	struct pre_cac_vdev_priv *vdev_priv;
+
+	if (!vdev) {
+		pre_cac_debug("vdev is NULL");
+		return;
+	}
+
+	vdev_priv = pre_cac_vdev_get_priv(vdev);
+	if (!vdev_priv)
+		return;
+
+	vdev_priv->is_pre_cac_adapter = status;
+}
+
+bool pre_cac_adapter_is_active(struct wlan_objmgr_vdev *vdev)
+{
+	struct pre_cac_vdev_priv *vdev_priv;
+
+	if (!vdev) {
+		pre_cac_debug("vdev is NULL");
+		return false;
+	}
+
+	vdev_priv = pre_cac_vdev_get_priv(vdev);
+	if (!vdev_priv)
+		return false;
+
+	return vdev_priv->is_pre_cac_adapter;
+}
+
+void pre_cac_complete_set(struct wlan_objmgr_vdev *vdev,
+			  bool status)
+{
+	struct pre_cac_vdev_priv *vdev_priv;
+
+	if (!vdev) {
+		pre_cac_debug("vdev is NULL");
+		return;
+	}
+
+	vdev_priv = pre_cac_vdev_get_priv(vdev);
+	if (!vdev_priv)
+		return;
+
+	vdev_priv->pre_cac_complete = status;
+}
+
+bool pre_cac_complete_get(struct wlan_objmgr_vdev *vdev)
+{
+	struct pre_cac_vdev_priv *vdev_priv;
+
+	vdev_priv = pre_cac_vdev_get_priv(vdev);
+	if (!vdev_priv)
+		return false;
+
+	return vdev_priv->pre_cac_complete;
+}
+
+static void pre_cac_complete(struct wlan_objmgr_vdev *vdev,
+			     QDF_STATUS status)
+{
+	if (glbl_pre_cac_ops &&
+	    glbl_pre_cac_ops->pre_cac_complete_cb)
+		glbl_pre_cac_ops->pre_cac_complete_cb(vdev, status);
+}
+
+static void pre_cac_handle_success(void *data)
+{
+	struct wlan_objmgr_vdev *vdev = (struct wlan_objmgr_vdev *)data;
+
+	pre_cac_complete(vdev, QDF_STATUS_SUCCESS);
+}
+
+static void pre_cac_conditional_csa_ind(struct wlan_objmgr_psoc *psoc,
+					uint8_t vdev_id, bool status)
+{
+	if (glbl_pre_cac_ops &&
+	    glbl_pre_cac_ops->pre_cac_conditional_csa_ind_cb)
+		glbl_pre_cac_ops->pre_cac_conditional_csa_ind_cb(psoc,
+							vdev_id, status);
+}
+
+void pre_cac_handle_cac_end(struct wlan_objmgr_vdev *vdev)
+{
+	struct wlan_objmgr_psoc *psoc = wlan_vdev_get_psoc(vdev);
+	struct pre_cac_psoc_priv *psoc_priv = pre_cac_psoc_get_priv(psoc);
+
+	pre_cac_conditional_csa_ind(psoc, vdev->vdev_objmgr.vdev_id, true);
+
+	qdf_create_work(0, &psoc_priv->pre_cac_work,
+			pre_cac_handle_success,
+			vdev);
+	qdf_sched_work(0, &psoc_priv->pre_cac_work);
+}
+
 static void pre_cac_get_vdev_id_handler(struct wlan_objmgr_psoc *psoc,
 					void *obj, void *args)
 {

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

@@ -61,9 +61,17 @@
 /**
  * struct pre_cac_vdev_priv - Private object to be stored in vdev
  * @is_pre_cac_on: status of pre_cac
+ * @pre_cac_complete: pre cac complete status
+ * @is_pre_cac_adapter: pre cac adapter status
+ * @freq_before_pre_cac: frequency before pre cac
+ * @pre_cac_freq: pre cac frequency
  */
 struct pre_cac_vdev_priv {
 	bool is_pre_cac_on;
+	bool pre_cac_complete;
+	bool is_pre_cac_adapter;
+	qdf_freq_t freq_before_pre_cac;
+	qdf_freq_t pre_cac_freq;
 };
 
 /**
@@ -225,4 +233,84 @@ QDF_STATUS pre_cac_set_status(struct wlan_objmgr_vdev *vdev, bool status);
  */
 void pre_cac_get_vdev_id(struct wlan_objmgr_psoc *psoc,
 			 uint8_t *vdev_id);
+
+/**
+ * pre_cac_handle_cac_end() - Handle pre cac end
+ * @vdev: vdev object manager
+ *
+ * Return: None
+ */
+void pre_cac_handle_cac_end(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * pre_cac_complete_set() - Set pre cac complete status
+ * @vdev: vdev object manager
+ * @status: status
+ *
+ * Return: None
+ */
+void pre_cac_complete_set(struct wlan_objmgr_vdev *vdev,
+			  bool status);
+
+/**
+ * pre_cac_complete_get() - Get pre cac complete status
+ * @vdev: vdev object manager
+ *
+ * Return: pre cac complete status
+ */
+bool pre_cac_complete_get(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * pre_cac_adapter_set() - Set pre cac adapter flag
+ * @vdev: vdev object manager
+ * @status: status
+ *
+ * Return: None
+ */
+void pre_cac_adapter_set(struct wlan_objmgr_vdev *vdev,
+			 bool status);
+
+/**
+ * pre_cac_adapter_is_active() - Get pre cac adapter status
+ * @vdev: vdev object manager
+ *
+ * Return: pre cac adapter status
+ */
+bool pre_cac_adapter_is_active(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * pre_cac_set_freq_before_pre_cac() - Set frequency before pre cac
+ * @vdev: vdev object manager
+ * @freq: frequency before pre cac
+ *
+ * Return: None
+ */
+void pre_cac_set_freq_before_pre_cac(struct wlan_objmgr_vdev *vdev,
+				     qdf_freq_t freq);
+
+/**
+ * pre_cac_get_freq_before_pre_cac() - Get frequency before pre cac
+ * @vdev: vdev object manager
+ *
+ * Return: frequency before pre cac
+ */
+qdf_freq_t pre_cac_get_freq_before_pre_cac(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * pre_cac_set_freq() - Set pre cac frequency
+ * @vdev: vdev object manager
+ * @freq: pre cac frequency
+ *
+ * Return: None
+ */
+void pre_cac_set_freq(struct wlan_objmgr_vdev *vdev,
+		      qdf_freq_t freq);
+
+/**
+ * pre_cac_get_freq() - Get pre cac frequency
+ * @vdev: vdev object manager
+ *
+ * Return: pre cac frequency
+ */
+qdf_freq_t pre_cac_get_freq(struct wlan_objmgr_vdev *vdev);
 #endif /* end of _WLAN_PRE_CAC_MAIN_H_ */

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

@@ -40,6 +40,51 @@ bool wlan_pre_cac_get_status(struct wlan_objmgr_psoc *psoc);
  * Return: QDF_STATUS
  */
 QDF_STATUS wlan_pre_cac_set_status(struct wlan_objmgr_vdev *vdev, bool status);
+
+/**
+ * wlan_pre_cac_handle_cac_end() - Handle pre cac end
+ * @vdev: vdev object manager
+ *
+ * Return: None
+ */
+void wlan_pre_cac_handle_cac_end(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * wlan_pre_cac_complete_set() - Set pre cac complete status
+ * @vdev: vdev object manager
+ * @status: status
+ *
+ * Return: None
+ */
+void wlan_pre_cac_complete_set(struct wlan_objmgr_vdev *vdev,
+			       bool status);
+
+/**
+ * wlan_pre_cac_complete_get() - Get pre cac complete status
+ * @vdev: vdev object manager
+ *
+ * Return: pre cac complete status
+ */
+bool wlan_pre_cac_complete_get(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * pre_cac_set_freq_before_pre_cac() - Set frequency before pre cac
+ * @vdev: vdev object manager
+ * @freq: frequency
+ *
+ * Return: None
+ */
+void wlan_pre_cac_set_freq_before_pre_cac(struct wlan_objmgr_vdev *vdev,
+					  qdf_freq_t freq);
+
+/**
+ * pre_cac_get_freq_before_pre_cac() - Get frequency before pre cac
+ * @vdev: vdev object manager
+ *
+ * Return: Frequency before pre cac
+ */
+qdf_freq_t
+wlan_pre_cac_get_freq_before_pre_cac(struct wlan_objmgr_vdev *vdev);
 #else
 static inline bool wlan_pre_cac_get_status(struct wlan_objmgr_psoc *psoc)
 {
@@ -51,5 +96,34 @@ wlan_pre_cac_set_status(struct wlan_objmgr_vdev *vdev, bool status)
 {
 	return false;
 }
+
+static inline void
+wlan_pre_cac_handle_cac_end(struct wlan_objmgr_vdev *vdev)
+{
+}
+
+static inline void
+wlan_pre_cac_complete_set(struct wlan_objmgr_vdev *vdev,
+			  bool status)
+{
+}
+
+static inline bool
+wlan_pre_cac_complete_get(struct wlan_objmgr_vdev *vdev)
+{
+	return false;
+}
+
+static inline void
+wlan_pre_cac_set_freq_before_pre_cac(struct wlan_objmgr_vdev *vdev,
+				     qdf_freq_t freq)
+{
+}
+
+static inline qdf_freq_t
+wlan_pre_cac_get_freq_before_pre_cac(struct wlan_objmgr_vdev *vdev)
+{
+	return 0;
+}
 #endif /* PRE_CAC_SUPPORT */
 #endif /* _WLAN_PRE_CAC_API_H_ */

+ 10 - 1
components/pre_cac/dispatcher/inc/wlan_pre_cac_public_struct.h

@@ -17,10 +17,19 @@
 #ifndef _WLAN_PRE_CAC_PUBLIC_STRUCT_H_
 #define _WLAN_PRE_CAC_PUBLIC_STRUCT_H_
 
+#include "wlan_objmgr_psoc_obj.h"
+
 /**
  * pre_cac_ops: pre cac osif callbacks
+ * @pre_cac_send_conditional_freq_switch_status: send conditional frequency
+ *                                               switch status
+ * @pre_cac_complete_cb: Pre cac complete callback
  */
 struct pre_cac_ops {
+	void (*pre_cac_conditional_csa_ind_cb)(
+			struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
+			bool status);
+	void (*pre_cac_complete_cb)(struct wlan_objmgr_vdev *vdev,
+				    QDF_STATUS status);
 };
-
 #endif /* _WLAN_PRE_CAC_PUBLIC_STRUCT_H_ */

+ 82 - 0
components/pre_cac/dispatcher/inc/wlan_pre_cac_ucfg_api.h

@@ -106,6 +106,70 @@ ucfg_pre_cac_set_status(struct wlan_objmgr_vdev *vdev, bool status)
  */
 void ucfg_pre_cac_get_vdev_id(struct wlan_objmgr_psoc *psoc,
 			      uint8_t *vdev_id);
+
+/**
+ * ucfg_pre_cac_adapter_set() - Set pre cac adapter flag
+ * @vdev: vdev object manager
+ * @status: status
+ *
+ * Return: None
+ */
+void ucfg_pre_cac_adapter_set(struct wlan_objmgr_vdev *vdev,
+			      bool status);
+
+/**
+ * ucfg_pre_cac_adapter_is_active() - Get pre cac adapter status
+ * @vdev: vdev object manager
+ *
+ * Return: pre cac complete status
+ */
+bool ucfg_pre_cac_adapter_is_active(struct wlan_objmgr_vdev *vdev);
+
+#if defined(FEATURE_SAP_COND_CHAN_SWITCH)
+/**
+ * pre_cac_set_freq_before_pre_cac() - Set frequency before pre cac
+ * @vdev: vdev object manager
+ * @freq: frequency
+ *
+ * Return: None
+ */
+void ucfg_pre_cac_set_freq_before_pre_cac(struct wlan_objmgr_vdev *vdev,
+					  qdf_freq_t freq);
+#else
+static inline void
+ucfg_pre_cac_set_freq_before_pre_cac(struct wlan_objmgr_vdev *vdev,
+				     qdf_freq_t freq)
+{
+}
+#endif
+
+/**
+ * ucfg_pre_cac_set_freq() - Set pre cac frequency
+ * @vdev: vdev object manager
+ * @freq: pre cac frequency
+ *
+ * Return: None
+ */
+void ucfg_pre_cac_set_freq(struct wlan_objmgr_vdev *vdev,
+			   qdf_freq_t freq);
+
+/**
+ * ucfg_pre_cac_get_freq() - Get pre cac frequency
+ * @vdev: vdev object manager
+ *
+ * Return: pre cac frequency
+ */
+qdf_freq_t ucfg_pre_cac_get_freq(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * ucfg_pre_cac_complete_set() - Set pre cac complete status
+ * @vdev: vdev object manager
+ * @status: status
+ *
+ * Return: None
+ */
+void ucfg_pre_cac_complete_set(struct wlan_objmgr_vdev *vdev,
+			       bool status);
 #else
 static inline
 QDF_STATUS ucfg_pre_cac_init(void)
@@ -148,5 +212,23 @@ ucfg_pre_cac_get_vdev_id(struct wlan_objmgr_psoc *psoc,
 			 uint8_t *vdev_id)
 {
 }
+
+static inline void
+ucfg_pre_cac_set_freq(struct wlan_objmgr_vdev *vdev,
+		      qdf_freq_t freq)
+{
+}
+
+static inline qdf_freq_t
+ucfg_pre_cac_get_freq(struct wlan_objmgr_vdev *vdev)
+{
+	return 0;
+}
+
+static inline void
+ucfg_pre_cac_complete_set(struct wlan_objmgr_vdev *vdev,
+			  bool status)
+{
+}
 #endif /* PRE_CAC_SUPPORT */
 #endif /* _WLAN_PRE_CAC_UCFG_API_H_ */

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

@@ -30,3 +30,31 @@ QDF_STATUS wlan_pre_cac_set_status(struct wlan_objmgr_vdev *vdev, bool status)
 {
 	return pre_cac_set_status(vdev, status);
 }
+
+void wlan_pre_cac_set_freq_before_pre_cac(struct wlan_objmgr_vdev *vdev,
+					  qdf_freq_t freq)
+{
+	pre_cac_set_freq_before_pre_cac(vdev, freq);
+}
+
+qdf_freq_t wlan_pre_cac_get_freq_before_pre_cac(struct wlan_objmgr_vdev *vdev)
+{
+	return pre_cac_get_freq_before_pre_cac(vdev);
+}
+
+void wlan_pre_cac_complete_set(struct wlan_objmgr_vdev *vdev,
+			       bool status)
+{
+	pre_cac_complete_set(vdev, status);
+}
+
+bool wlan_pre_cac_complete_get(struct wlan_objmgr_vdev *vdev)
+{
+	return pre_cac_complete_get(vdev);
+}
+
+void wlan_pre_cac_handle_cac_end(struct wlan_objmgr_vdev *vdev)
+{
+	pre_cac_handle_cac_end(vdev);
+}
+

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

@@ -21,6 +21,40 @@
 #include "../../core/src/wlan_pre_cac_main.h"
 #include "wlan_pre_cac_ucfg_api.h"
 
+void ucfg_pre_cac_complete_set(struct wlan_objmgr_vdev *vdev,
+			       bool status)
+{
+	pre_cac_complete_set(vdev, status);
+}
+
+void ucfg_pre_cac_set_freq(struct wlan_objmgr_vdev *vdev,
+			   qdf_freq_t freq)
+{
+	pre_cac_set_freq(vdev, freq);
+}
+
+qdf_freq_t ucfg_pre_cac_get_freq(struct wlan_objmgr_vdev *vdev)
+{
+	return pre_cac_get_freq(vdev);
+}
+
+void ucfg_pre_cac_set_freq_before_pre_cac(struct wlan_objmgr_vdev *vdev,
+					  qdf_freq_t freq)
+{
+	return pre_cac_set_freq_before_pre_cac(vdev, freq);
+}
+
+void ucfg_pre_cac_adapter_set(struct wlan_objmgr_vdev *vdev,
+			      bool status)
+{
+	pre_cac_adapter_set(vdev, status);
+}
+
+bool ucfg_pre_cac_adapter_is_active(struct wlan_objmgr_vdev *vdev)
+{
+	return pre_cac_adapter_is_active(vdev);
+}
+
 void ucfg_pre_cac_get_vdev_id(struct wlan_objmgr_psoc *psoc,
 			      uint8_t *vdev_id)
 {
@@ -35,10 +69,12 @@ int ucfg_pre_cac_validate_and_get_freq(struct wlan_objmgr_pdev *pdev,
 					     pre_cac_chan_freq);
 }
 
+#if defined(FEATURE_SAP_COND_CHAN_SWITCH)
 QDF_STATUS ucfg_pre_cac_set_status(struct wlan_objmgr_vdev *vdev, bool status)
 {
 	return pre_cac_set_status(vdev, status);
 }
+#endif
 
 bool ucfg_pre_cac_is_active(struct wlan_objmgr_psoc *psoc)
 {

+ 11 - 6
core/hdd/inc/wlan_hdd_main.h

@@ -1521,12 +1521,6 @@ struct hdd_adapter {
 	ol_txrx_tx_fp tx_fn;
 	/* debugfs entry */
 	struct dentry *debugfs_phy;
-	/*
-	 * The pre cac channel frequency is saved here and will be used when
-         * the SAP's channel needs to be moved from the existing 2.4GHz channel.
-	 */
-	uint32_t pre_cac_freq;
-
 	/*
 	 * Indicate if HO fails during disconnect so that
 	 * disconnect is not initiated by HDD as its already
@@ -1601,8 +1595,19 @@ struct hdd_adapter {
 	qdf_work_t netdev_features_update_work;
 	enum hdd_work_status netdev_features_update_work_status;
 	qdf_atomic_t net_dev_hold_ref_count[NET_DEV_HOLD_ID_MAX];
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	/* Flag to indicate whether it is a pre cac adapter or not */
 	bool is_pre_cac_adapter;
+	/*
+	 * The pre cac channel frequency is saved here and will be used when
+	 * the SAP's channel needs to be moved from the existing 2.4GHz channel.
+	 */
+	uint32_t pre_cac_freq;
+#endif
 	bool delete_in_progress;
 	bool is_virtual_iface;
 #ifdef WLAN_FEATURE_BIG_DATA_STATS

+ 26 - 0
core/hdd/inc/wlan_hdd_pre_cac.h

@@ -23,6 +23,11 @@
 /* default pre cac channel bandwidth */
 #define DEFAULT_PRE_CAC_BANDWIDTH CH_WIDTH_80MHZ
 
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 /**
  * wlan_hdd_sap_pre_cac_success() - Process the pre cac success
  * @data: AP adapter
@@ -30,6 +35,12 @@
  * Return: None
  */
 void wlan_hdd_sap_pre_cac_success(void *data);
+#else
+static inline void wlan_hdd_sap_pre_cac_success(void *data)
+{
+}
+#endif /* PRE_CAC_COMP */
+
 /**
  * wlan_hdd_sap_pre_cac_failure() - Process the pre cac failure
  * @data: AP adapter
@@ -88,6 +99,11 @@ void hdd_send_conditional_chan_switch_status(struct hdd_context *hdd_ctx,
  */
 void hdd_close_pre_cac_adapter(struct hdd_context *hdd_ctx);
 
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifdef PRE_CAC_COMP
 /**
  * hdd_pre_cac_register_cb() - Sets legacy callbacks to osif
  *
@@ -106,6 +122,16 @@ QDF_STATUS hdd_pre_cac_register_cb(void);
  */
 void hdd_pre_cac_unregister_cb(void);
 #else
+static inline QDF_STATUS hdd_pre_cac_register_cb(void)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline void hdd_pre_cac_unregister_cb(void)
+{
+}
+#endif /* PRE_CAC_COMP */
+#else
 static inline void wlan_hdd_sap_pre_cac_success(void *data)
 {
 }

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

@@ -2263,6 +2263,11 @@ QDF_STATUS hdd_hostapd_sap_event_cb(struct sap_event *sap_event,
 		qdf_sched_work(0, &hdd_ctx->sap_pre_cac_work);
 		hdd_son_deliver_cac_status_event(adapter, true);
 		break;
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	case eSAP_DFS_PRE_CAC_END:
 		hdd_debug("pre cac end notification received:%d",
 			adapter->vdev_id);
@@ -2278,6 +2283,7 @@ QDF_STATUS hdd_hostapd_sap_event_cb(struct sap_event *sap_event,
 				(void *)adapter);
 		qdf_sched_work(0, &hdd_ctx->sap_pre_cac_work);
 		break;
+#endif /* PRE_CAC_COMP */
 #endif
 	case eSAP_DFS_NO_AVAILABLE_CHANNEL:
 		wlan_hdd_send_svc_nlink_msg

+ 26 - 18
core/hdd/src/wlan_hdd_main.c

@@ -7901,7 +7901,15 @@ struct hdd_adapter *hdd_open_adapter(struct hdd_context *hdd_ctx,
 
 	hdd_periodic_sta_stats_init(adapter);
 
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	adapter->is_pre_cac_adapter = false;
+#else
+	ucfg_pre_cac_adapter_set(adapter->vdev, false);
+#endif
 
 	return adapter;
 
@@ -8307,6 +8315,11 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 
 		ucfg_ipa_flush(hdd_ctx->pdev);
 
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 		if (!adapter->is_pre_cac_adapter) {
 			/**
 			 * don't flush pre-cac destroy if we are destroying
@@ -8314,36 +8327,31 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 			 */
 			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_adapter_is_active(adapter->vdev)) {
+			/**
+			 * don't flush pre-cac destroy if we are destroying
+			 * pre-cac adapter
+			 */
+			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);
+
+			hdd_close_pre_cac_adapter(hdd_ctx);
+		} else {
 			if (ucfg_pre_cac_set_status(adapter->vdev, false))
 				hdd_err("Failed to set is_pre_cac_on to false");
-#endif
 		}
-
+#endif
 		/* fallthrough */
 
 	case QDF_P2P_GO_MODE:

+ 116 - 6
core/hdd/src/wlan_hdd_pre_cac.c

@@ -21,6 +21,7 @@
 #include <qdf_types.h>
 #include "osif_pre_cac.h"
 #include "wlan_pre_cac_ucfg_api.h"
+#include "wlan_ipa_ucfg_api.h"
 
 void hdd_send_conditional_chan_switch_status(struct hdd_context *hdd_ctx,
 					     struct wireless_dev *wdev,
@@ -55,6 +56,11 @@ void hdd_send_conditional_chan_switch_status(struct hdd_context *hdd_ctx,
 	cfg80211_vendor_event(event, GFP_KERNEL);
 }
 
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 /**
  * wlan_hdd_set_pre_cac_complete_status() - Set pre cac complete status
  * @ap_adapter: AP adapter
@@ -76,6 +82,7 @@ static int wlan_hdd_set_pre_cac_complete_status(struct hdd_adapter *ap_adapter,
 
 	return 0;
 }
+#endif
 
 /**
  * __wlan_hdd_sap_pre_cac_failure() - Process the pre cac failure
@@ -123,6 +130,11 @@ void wlan_hdd_sap_pre_cac_failure(void *data)
 	osif_vdev_sync_trans_stop(vdev_sync);
 }
 
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 /**
  * __wlan_hdd_sap_pre_cac_success() - Process the pre cac result
  * @adapter: AP adapter
@@ -133,11 +145,15 @@ void wlan_hdd_sap_pre_cac_failure(void *data)
  * Return: None
  */
 static void __wlan_hdd_sap_pre_cac_success(struct hdd_adapter *adapter)
+#else
+static void wlan_hdd_pre_cac_success(struct hdd_adapter *adapter)
+#endif
 {
 	struct hdd_adapter *ap_adapter;
 	int i;
 	struct hdd_context *hdd_ctx;
 	enum phy_ch_width pre_cac_ch_width;
+	qdf_freq_t chan_freq;
 
 	hdd_enter();
 
@@ -158,7 +174,11 @@ static void __wlan_hdd_sap_pre_cac_success(struct hdd_adapter *adapter)
 		hdd_err("failed to get SAP adapter, no restart on pre CAC channel");
 		return;
 	}
-
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	/*
 	 * Setting of the pre cac complete status will ensure that on channel
 	 * switch to the pre CAC DFS channel, there is no CAC again.
@@ -167,17 +187,41 @@ static void __wlan_hdd_sap_pre_cac_success(struct hdd_adapter *adapter)
 
 	wlan_hdd_set_sap_csa_reason(hdd_ctx->psoc, ap_adapter->vdev_id,
 				    CSA_REASON_PRE_CAC_SUCCESS);
+	chan_freq = ap_adapter->pre_cac_freq;
 	i = hdd_softap_set_channel_change(ap_adapter->dev,
-					  ap_adapter->pre_cac_freq,
+					  chan_freq,
 					  pre_cac_ch_width, false);
 	if (i) {
 		hdd_err("failed to change channel");
 		wlan_hdd_set_pre_cac_complete_status(ap_adapter, false);
 	}
+#else
+	/*
+	 * Setting of the pre cac complete status will ensure that on channel
+	 * switch to the pre CAC DFS channel, there is no CAC again.
+	 */
+	ucfg_pre_cac_complete_set(ap_adapter->vdev, true);
+
+	wlan_hdd_set_sap_csa_reason(hdd_ctx->psoc, ap_adapter->vdev_id,
+				    CSA_REASON_PRE_CAC_SUCCESS);
+	chan_freq = ucfg_pre_cac_get_freq(ap_adapter->vdev);
+	i = hdd_softap_set_channel_change(ap_adapter->dev,
+					  chan_freq,
+					  pre_cac_ch_width, false);
+	if (i) {
+		hdd_err("failed to change channel");
+		ucfg_pre_cac_complete_set(ap_adapter->vdev, false);
+	}
+#endif
 
 	hdd_exit();
 }
 
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 void wlan_hdd_sap_pre_cac_success(void *data)
 {
 	struct hdd_adapter *adapter = data;
@@ -192,6 +236,7 @@ void wlan_hdd_sap_pre_cac_success(void *data)
 
 	osif_vdev_sync_trans_stop(vdev_sync);
 }
+#endif /* PRE_CAC_COMP */
 
 void hdd_close_pre_cac_adapter(struct hdd_context *hdd_ctx)
 {
@@ -249,6 +294,11 @@ void hdd_clean_up_pre_cac_interface(struct hdd_context *hdd_ctx)
 #endif
 }
 
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 /**
  * wlan_hdd_set_chan_freq_before_pre_cac() - Save the channel before pre cac
  * @ap_adapter: AP adapter
@@ -274,6 +324,7 @@ wlan_hdd_set_chan_freq_before_pre_cac(struct hdd_adapter *ap_adapter,
 
 	return 0;
 }
+#endif
 
 static int wlan_set_def_pre_cac_chan(struct hdd_context *hdd_ctx,
 				     uint32_t pre_cac_ch_freq,
@@ -468,10 +519,10 @@ static int __wlan_hdd_request_pre_cac(struct hdd_context *hdd_ctx,
  */
 #ifndef PRE_CAC_COMP
 	bool val;
+	qdf_freq_t freq;
 #endif
 	enum phy_ch_width cac_ch_width;
 	struct hdd_adapter_create_param params = {0};
-	qdf_freq_t freq;
 
 	if (!policy_mgr_is_hw_dbs_capable(hdd_ctx->psoc)) {
 		hdd_debug("Pre CAC is not supported on non-dbs platforms");
@@ -706,9 +757,6 @@ static int __wlan_hdd_request_pre_cac(struct hdd_context *hdd_ctx,
  */
 #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;
@@ -724,7 +772,18 @@ static int __wlan_hdd_request_pre_cac(struct hdd_context *hdd_ctx,
 
 	ap_adapter->pre_cac_freq = pre_cac_chan_freq;
 	pre_cac_adapter->is_pre_cac_adapter = true;
+#else
+	ret = ucfg_pre_cac_set_status(pre_cac_adapter->vdev, true);
+	if (ret != 0) {
+		hdd_err("failed to set pre cac status");
+		goto stop_close_pre_cac_adapter;
+	}
 
+	ucfg_pre_cac_set_freq_before_pre_cac(ap_adapter->vdev,
+					     hdd_ap_ctx->operating_chan_freq);
+	ucfg_pre_cac_set_freq(ap_adapter->vdev, pre_cac_chan_freq);
+	ucfg_pre_cac_adapter_set(pre_cac_adapter->vdev, true);
+#endif
 	*out_adapter = pre_cac_adapter;
 
 	return 0;
@@ -810,7 +869,57 @@ destroy_sync:
 	return errno;
 }
 
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifdef PRE_CAC_COMP
+static void
+wlan_hdd_pre_cac_conditional_freq_switch_ind(struct wlan_objmgr_vdev *vdev,
+					     bool completed)
+{
+	struct wlan_objmgr_psoc *psoc = wlan_vdev_get_psoc(vdev);
+	struct hdd_adapter *adapter;
+	struct hdd_ap_ctx *ap_ctx;
+
+	if (completed) {
+		uint8_t vdev_id = vdev->vdev_objmgr.vdev_id;
+
+		adapter = wlan_hdd_get_adapter_from_vdev(psoc, vdev_id);
+		if (!adapter) {
+			hdd_err("Invalid adapter");
+			return;
+		}
+
+		ap_ctx = WLAN_HDD_GET_AP_CTX_PTR(adapter);
+		ap_ctx->dfs_cac_block_tx = false;
+		ucfg_ipa_set_dfs_cac_tx(adapter->hdd_ctx->pdev,
+					ap_ctx->dfs_cac_block_tx);
+		adapter->hdd_ctx->dev_dfs_cac_status = DFS_CAC_ALREADY_DONE;
+	}
+}
+
+static void
+wlan_hdd_pre_cac_complete(struct wlan_objmgr_vdev *vdev,
+			  QDF_STATUS status)
+{
+	struct wlan_objmgr_psoc *psoc = wlan_vdev_get_psoc(vdev);
+	uint8_t vdev_id = vdev->vdev_objmgr.vdev_id;
+	struct hdd_adapter *adapter;
+
+	adapter = wlan_hdd_get_adapter_from_vdev(psoc, vdev_id);
+	if (!adapter) {
+		hdd_err("Invalid adapter");
+		return;
+	}
+
+	wlan_hdd_pre_cac_success(adapter);
+}
+
 struct osif_pre_cac_legacy_ops pre_cac_legacy_ops = {
+	.conditional_csa_ind_legacy_cb =
+		wlan_hdd_pre_cac_conditional_freq_switch_ind,
+	.pre_cac_complete_legacy_cb = wlan_hdd_pre_cac_complete,
 };
 
 QDF_STATUS hdd_pre_cac_register_cb(void)
@@ -824,3 +933,4 @@ void hdd_pre_cac_unregister_cb(void)
 {
 	osif_pre_cac_reset_legacy_cb();
 }
+#endif /* PRE_CAC_COMP */

+ 22 - 22
core/sap/inc/sap_api.h

@@ -161,7 +161,13 @@ typedef enum {
 	eSAP_DFS_CAC_START,
 	eSAP_DFS_CAC_INTERRUPTED,
 	eSAP_DFS_CAC_END,
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	eSAP_DFS_PRE_CAC_END,
+#endif
 	eSAP_DFS_RADAR_DETECT,
 	eSAP_DFS_RADAR_DETECT_DURING_PRE_CAC,
 	/* No ch available after DFS RADAR detect */
@@ -855,12 +861,12 @@ QDF_STATUS wlan_sap_update_next_channel(struct sap_context *sap_ctx,
 					uint8_t channel,
 					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
+#if defined(FEATURE_SAP_COND_CHAN_SWITCH) && defined(PRE_CAC_SUPPORT)
 /**
  * wlan_sap_set_pre_cac_status() - Set the pre cac status
  * @sap_ctx: SAP context
@@ -872,7 +878,6 @@ 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
@@ -887,17 +892,11 @@ 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,
@@ -905,9 +904,15 @@ wlan_sap_set_chan_freq_before_pre_cac(struct sap_context *sap_ctx,
 {
 	return QDF_STATUS_SUCCESS;
 }
-#endif
+#endif /* FEATURE_SAP_COND_CHAN_SWITCH and PRE_CAC_SUPPORT */
+#endif /* PRE_CAC_COMP */
 
 #ifdef 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_complete_status() - Sets pre cac complete status
  * @sap_ctx: SAP context
@@ -920,11 +925,6 @@ 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
@@ -935,8 +935,13 @@ 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 */
+#endif
 #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_complete_status(struct sap_context *sap_ctx,
 				     bool status)
@@ -944,11 +949,6 @@ 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)
 {
@@ -959,8 +959,8 @@ static inline bool wlan_sap_is_pre_cac_active(mac_handle_t handle)
 {
 	return false;
 }
-#endif
-#endif
+#endif /* PRE_CAC_COMP */
+#endif /* PRE_CAC_SUPPORT */
 
 #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
 /**

+ 16 - 0
core/sap/src/sap_api_link_cntl.c

@@ -474,7 +474,15 @@ wlansap_roam_process_ch_change_success(struct mac_context *mac_ctx,
 
 	sap_ctx->chan_freq = target_chan_freq;
 	/* check if currently selected channel is a DFS channel */
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	if (is_ch_dfs && sap_ctx->pre_cac_complete) {
+#else
+	if (is_ch_dfs && wlan_pre_cac_complete_get(sap_ctx->vdev)) {
+#endif
 		/* Start beaconing on the new pre cac channel */
 		wlansap_start_beacon_req(sap_ctx);
 		sap_ctx->fsm_state = SAP_STARTING;
@@ -551,7 +559,15 @@ wlansap_roam_process_dfs_chansw_update(mac_handle_t mac_handle,
 		 * with no CSA IE will be sent to firmware.
 		 */
 		dfs_beacon_start_req = true;
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 		sap_ctx->pre_cac_complete = false;
+#else
+		wlan_pre_cac_complete_set(sap_ctx->vdev, false);
+#endif
 		*ret_status = sme_roam_start_beacon_req(mac_handle,
 							sap_ctx->bssid,
 							dfs_beacon_start_req);

+ 95 - 5
core/sap/src/sap_fsm.c

@@ -155,7 +155,13 @@ static uint8_t *sap_hdd_event_to_string(eSapHddEvent event)
 	CASE_RETURN_STRING(eSAP_DFS_CAC_START);
 	CASE_RETURN_STRING(eSAP_DFS_CAC_INTERRUPTED);
 	CASE_RETURN_STRING(eSAP_DFS_CAC_END);
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	CASE_RETURN_STRING(eSAP_DFS_PRE_CAC_END);
+#endif
 	CASE_RETURN_STRING(eSAP_DFS_RADAR_DETECT);
 	CASE_RETURN_STRING(eSAP_DFS_RADAR_DETECT_DURING_PRE_CAC);
 	CASE_RETURN_STRING(eSAP_DFS_NO_AVAILABLE_CHANNEL);
@@ -521,12 +527,32 @@ is_wlansap_cac_required_for_chan(struct mac_context *mac_ctx,
 	if (WLAN_REG_IS_6GHZ_CHAN_FREQ(chan_freq))
 		is_ch_dfs = false;
 
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	sap_debug("vdev id %d chan %d is_ch_dfs %d pre_cac_complete %d ignore_cac %d cac_state %d",
 		  sap_ctx->sessionId, chan_freq, is_ch_dfs,
 		  sap_ctx->pre_cac_complete, mac_ctx->sap.SapDfsInfo.ignore_cac,
 		  mac_ctx->sap.SapDfsInfo.cac_state);
+#else
+	sap_debug("vdev id %d chan %d is_ch_dfs %d pre_cac_complete %d ignore_cac %d cac_state %d",
+		  sap_ctx->sessionId, chan_freq, is_ch_dfs,
+		  wlan_pre_cac_complete_get(sap_ctx->vdev),
+		  mac_ctx->sap.SapDfsInfo.ignore_cac,
+		  mac_ctx->sap.SapDfsInfo.cac_state);
+#endif
 
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	if (!is_ch_dfs || sap_ctx->pre_cac_complete ||
+#else
+	if (!is_ch_dfs || wlan_pre_cac_complete_get(sap_ctx->vdev) ||
+#endif
 	    mac_ctx->sap.SapDfsInfo.ignore_cac ||
 	    mac_ctx->sap.SapDfsInfo.cac_state == eSAP_DFS_SKIP_CAC)
 		cac_required = false;
@@ -1482,11 +1508,13 @@ QDF_STATUS sap_set_session_param(mac_handle_t mac_handle,
  */
 #ifndef PRE_CAC_COMP
 	sapctx->is_pre_cac_on = false;
+	sapctx->pre_cac_complete = false;
+	sapctx->freq_before_pre_cac = 0;
 #else
 	wlan_pre_cac_set_status(sapctx->vdev, false);
+	wlan_pre_cac_complete_set(sapctx->vdev, false);
+	wlan_pre_cac_set_freq_before_pre_cac(sapctx->vdev, 0);
 #endif
-	sapctx->pre_cac_complete = false;
-	sapctx->freq_before_pre_cac = 0;
 
 	/* When SSR, SAP will restart, clear the old context,sessionId */
 	for (i = 0; i < SAP_MAX_NUM_SESSION; i++) {
@@ -2255,7 +2283,13 @@ QDF_STATUS sap_signal_hdd_event(struct sap_context *sap_ctx,
 	case eSAP_DFS_CAC_START:
 	case eSAP_DFS_CAC_INTERRUPTED:
 	case eSAP_DFS_CAC_END:
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	case eSAP_DFS_PRE_CAC_END:
+#endif
 	case eSAP_DFS_RADAR_DETECT:
 	case eSAP_DFS_RADAR_DETECT_DURING_PRE_CAC:
 	case eSAP_DFS_NO_AVAILABLE_CHANNEL:
@@ -2705,6 +2739,11 @@ static QDF_STATUS sap_cac_start_notify(mac_handle_t mac_handle)
 }
 
 #ifdef PRE_CAC_SUPPORT
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 /**
  * wlansap_update_pre_cac_end() - Update pre cac end to upper layer
  * @sap_context: SAP context
@@ -2735,6 +2774,29 @@ static QDF_STATUS wlansap_update_pre_cac_end(struct sap_context *sap_context,
 
 	return QDF_STATUS_SUCCESS;
 }
+#else
+/**
+ * wlansap_pre_cac_end_notify() - Update pre cac end to upper layer
+ * @sap_context: SAP context
+ * @mac: Global MAC structure
+ * @intf: Interface number
+ *
+ * Notifies pre cac end to upper layer
+ *
+ * Return: None
+ */
+static void wlansap_pre_cac_end_notify(struct sap_context *sap_context,
+				       struct mac_context *mac,
+				       uint8_t intf)
+{
+	sap_context->isCacEndNotified = true;
+	mac->sap.SapDfsInfo.sap_radar_found_status = false;
+	sap_context->fsm_state = SAP_STARTED;
+
+	sap_warn("pre cac end notify on %d: move to state SAP_STARTED", intf);
+	wlan_pre_cac_handle_cac_end(sap_context->vdev);
+}
+#endif /* PRE_CAC_COMP */
 
 QDF_STATUS sap_cac_end_notify(mac_handle_t mac_handle,
 			      struct csr_roam_info *roamInfo)
@@ -2777,9 +2839,6 @@ QDF_STATUS sap_cac_end_notify(mac_handle_t mac_handle,
  */
 #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))
@@ -2789,6 +2848,16 @@ QDF_STATUS sap_cac_end_notify(mac_handle_t mac_handle,
 				 */
 				break;
 			}
+#else
+			if (wlan_pre_cac_get_status(mac->psoc)) {
+				wlansap_pre_cac_end_notify(sap_context,
+							   mac, intf);
+				/* pre CAC is not allowed with any concurrency.
+				 * So, we can break from here.
+				 */
+				break;
+			}
+#endif
 
 			qdf_status = sap_signal_hdd_event(sap_context, NULL,
 							  eSAP_DFS_CAC_END,
@@ -3474,7 +3543,15 @@ static QDF_STATUS sap_fsm_state_starting(struct sap_context *sap_ctx,
 			if ((false == sap_dfs_info->ignore_cac) &&
 			    (eSAP_DFS_DO_NOT_SKIP_CAC ==
 			    sap_dfs_info->cac_state) &&
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 			    !sap_ctx->pre_cac_complete &&
+#else
+			    !wlan_pre_cac_complete_get(sap_ctx->vdev) &&
+#endif
 			    policy_mgr_get_dfs_master_dynamic_enabled(
 					mac_ctx->psoc,
 					sap_ctx->sessionId)) {
@@ -4263,11 +4340,24 @@ qdf_freq_t sap_indicate_radar(struct sap_context *sap_ctx)
 	/* set the Radar Found flag in SapDfsInfo */
 	mac->sap.SapDfsInfo.sap_radar_found_status = true;
 
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 	if (sap_ctx->freq_before_pre_cac) {
 		sap_info("sapdfs: set chan freq before pre cac %d as target chan",
 			 sap_ctx->freq_before_pre_cac);
 		return sap_ctx->freq_before_pre_cac;
 	}
+#else
+	chan_freq = wlan_pre_cac_get_freq_before_pre_cac(sap_ctx->vdev);
+	if (chan_freq) {
+		sap_info("sapdfs: set chan freq before pre cac %d as target chan",
+			 chan_freq);
+		return chan_freq;
+	}
+#endif
 
 	if (sap_ctx->vendor_acs_dfs_lte_enabled && (QDF_STATUS_SUCCESS ==
 	    sap_signal_hdd_event(sap_ctx, NULL, eSAP_DFS_NEXT_CHANNEL_REQ,

+ 2 - 2
core/sap/src/sap_internal.h

@@ -223,12 +223,12 @@ struct sap_context {
  */
 #ifndef PRE_CAC_COMP
 	bool is_pre_cac_on;
-#endif
 	bool pre_cac_complete;
+	qdf_freq_t freq_before_pre_cac;
+#endif
 	bool vendor_acs_dfs_lte_enabled;
 	uint8_t dfs_vendor_channel;
 	uint8_t dfs_vendor_chan_bw;
-	qdf_freq_t freq_before_pre_cac;
 	uint16_t beacon_tx_rate;
 	enum sap_acs_dfs_mode dfs_mode;
 	wlan_scan_requester req_id;

+ 16 - 8
core/sap/src/sap_module.c

@@ -57,6 +57,7 @@
 #include "wlan_mlme_ucfg_api.h"
 #include "wlan_mlme_vdev_mgr_interface.h"
 #include "pld_common.h"
+#include "wlan_pre_cac_api.h"
 
 #define SAP_DEBUG
 static struct sap_context *gp_sap_ctx[SAP_MAX_NUM_SESSION];
@@ -1659,12 +1660,12 @@ QDF_STATUS wlan_sap_update_next_channel(struct sap_context *sap_ctx,
 	return QDF_STATUS_SUCCESS;
 }
 
-#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
+#if defined(FEATURE_SAP_COND_CHAN_SWITCH) && defined(PRE_CAC_SUPPORT)
 QDF_STATUS wlan_sap_set_pre_cac_status(struct sap_context *sap_ctx,
 				       bool status)
 {
@@ -1678,7 +1679,6 @@ 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,
@@ -1693,8 +1693,14 @@ wlan_sap_set_chan_freq_before_pre_cac(struct sap_context *sap_ctx,
 	return QDF_STATUS_SUCCESS;
 }
 #endif /* FEATURE_SAP_COND_CHAN_SWITCH */
+#endif /* PRE_CAC_COMP */
 
 #ifdef 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_complete_status(struct sap_context *sap_ctx,
 						bool status)
 {
@@ -1704,18 +1710,12 @@ QDF_STATUS wlan_sap_set_pre_cac_complete_status(struct sap_context *sap_ctx,
 	}
 
 	sap_ctx->pre_cac_complete = status;
-
 	sap_debug("pre cac complete status:%d session:%d",
 		  status, sap_ctx->sessionId);
 
 	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;
@@ -2003,7 +2003,15 @@ QDF_STATUS wlansap_start_beacon_req(struct sap_context *sap_ctx)
 	if (mac->sap.SapDfsInfo.sap_radar_found_status == false) {
 		/* CAC Wait done without any Radar Detection */
 		dfs_cac_wait_status = true;
+/*
+ * Code under PRE_CAC_COMP will be cleaned up
+ * once pre cac component is done
+ */
+#ifndef PRE_CAC_COMP
 		sap_ctx->pre_cac_complete = false;
+#else
+		wlan_pre_cac_complete_set(sap_ctx->vdev, false);
+#endif
 		status = sme_roam_start_beacon_req(MAC_HANDLE(mac),
 						   sap_ctx->bssid,
 						   dfs_cac_wait_status);

+ 31 - 0
os_if/pre_cac/inc/osif_pre_cac.h

@@ -17,11 +17,42 @@
 #ifndef _OSIF_PRE_CAC_H_
 #define _OSIF_PRE_CAC_H_
 
+#include "wlan_objmgr_vdev_obj.h"
+
 #ifdef PRE_CAC_SUPPORT
+
+/**
+ * typedef osif_conditional_csa_ind_legacy_cb - CSA indication callback
+ *
+ * This callback is to send conditional channel switch status
+ *
+ * Context: Any context.
+ * Return: QDF_STATUS
+ */
+typedef void
+	(*osif_conditional_csa_ind_legacy_cb)(struct wlan_objmgr_vdev *vdev,
+					      bool completed);
+
+/**
+ * typedef osif_pre_cac_complete_legacy_cb - pre cac complete callback
+ *
+ * This callback is used to indicate the pre cac complete status
+ *
+ * Context: Any context.
+ * Return: None
+ */
+typedef void
+	(*osif_pre_cac_complete_status_legacy_cb)(struct wlan_objmgr_vdev *vdev,
+						  QDF_STATUS status);
+
 /**
  * osif_pre_cac_ops: pre cac legacy callbacks
+ * @conditional_csa_ind_legacy_cb: Callback for CSA indication
+ * @pre_cac_complete_legacy_cb: Callback for pre cac complete status
  */
 struct osif_pre_cac_legacy_ops {
+	osif_conditional_csa_ind_legacy_cb conditional_csa_ind_legacy_cb;
+	osif_pre_cac_complete_status_legacy_cb pre_cac_complete_legacy_cb;
 };
 
 /**

+ 103 - 0
os_if/pre_cac/src/osif_pre_cac.c

@@ -18,9 +18,109 @@
 #include "osif_pre_cac.h"
 #include "wlan_pre_cac_public_struct.h"
 #include "wlan_pre_cac_ucfg_api.h"
+#include "wlan_cfg80211.h"
+#include "wlan_objmgr_vdev_obj.h"
+#include "wlan_osif_priv.h"
+#include "osif_vdev_sync.h"
 
 static struct osif_pre_cac_legacy_ops *osif_pre_cac_legacy_ops;
 
+static void
+osif_pre_cac_complete_legacy_cb(struct wlan_objmgr_vdev *vdev,
+				QDF_STATUS status)
+{
+	osif_pre_cac_complete_status_legacy_cb cb = NULL;
+
+	if (osif_pre_cac_legacy_ops)
+		cb = osif_pre_cac_legacy_ops->pre_cac_complete_legacy_cb;
+
+	if (cb)
+		cb(vdev, status);
+}
+
+static void osif_pre_cac_complete_cb(struct wlan_objmgr_vdev *vdev,
+				     QDF_STATUS status)
+{
+	struct vdev_osif_priv *osif_priv = wlan_vdev_get_ospriv(vdev);
+	struct osif_vdev_sync *vdev_sync;
+	int errno;
+
+	errno = osif_vdev_sync_trans_start_wait(osif_priv->wdev->netdev,
+						&vdev_sync);
+	if (errno)
+		return;
+
+	osif_pre_cac_complete_legacy_cb(vdev, status);
+
+	osif_vdev_sync_trans_stop(vdev_sync);
+}
+
+static void
+osif_pre_cac_conditional_csa_ind_legacy_cb(struct wlan_objmgr_vdev *vdev,
+					   bool completed)
+{
+	osif_conditional_csa_ind_legacy_cb cb = NULL;
+
+	if (osif_pre_cac_legacy_ops)
+		cb = osif_pre_cac_legacy_ops->conditional_csa_ind_legacy_cb;
+
+	if (cb)
+		cb(vdev, completed);
+}
+
+static void
+osif_pre_cac_send_conditional_freq_switch_status(struct wlan_objmgr_psoc *psoc,
+						 uint8_t vdev_id,
+						 bool status)
+{
+	struct vdev_osif_priv *osif_priv;
+	struct wlan_objmgr_vdev *vdev;
+	struct wireless_dev *wdev;
+	struct sk_buff *event;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+						    WLAN_PRE_CAC_ID);
+	if (!vdev) {
+		osif_err("vdev is null");
+		return;
+	}
+
+	osif_priv = wlan_vdev_get_ospriv(vdev);
+	if (!osif_priv) {
+		osif_err("osif_priv is null");
+		goto fail;
+	}
+
+	wdev = osif_priv->wdev;
+	if (!wdev) {
+		osif_err("wireless dev is null");
+		goto fail;
+	}
+
+	event = wlan_cfg80211_vendor_event_alloc(wdev->wiphy,
+		  wdev, sizeof(uint32_t) + NLMSG_HDRLEN,
+		  QCA_NL80211_VENDOR_SUBCMD_SAP_CONDITIONAL_CHAN_SWITCH_INDEX,
+		  GFP_KERNEL);
+	if (!event) {
+		osif_err("cfg80211_vendor_event_alloc failed");
+		goto fail;
+	}
+
+	if (nla_put_u32(event,
+			QCA_WLAN_VENDOR_ATTR_SAP_CONDITIONAL_CHAN_SWITCH_STATUS,
+			status)) {
+		osif_err("nla put failed");
+		kfree_skb(event);
+		goto fail;
+	}
+
+	wlan_cfg80211_vendor_event(event, GFP_KERNEL);
+	osif_pre_cac_conditional_csa_ind_legacy_cb(vdev, status);
+
+fail:
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PRE_CAC_ID);
+}
+
 void osif_pre_cac_set_legacy_cb(struct osif_pre_cac_legacy_ops *osif_legacy_ops)
 {
 	osif_pre_cac_legacy_ops = osif_legacy_ops;
@@ -32,6 +132,9 @@ void osif_pre_cac_reset_legacy_cb(void)
 }
 
 static struct pre_cac_ops pre_cac_ops = {
+	.pre_cac_conditional_csa_ind_cb =
+		osif_pre_cac_send_conditional_freq_switch_status,
+	.pre_cac_complete_cb = osif_pre_cac_complete_cb,
 };
 
 QDF_STATUS osif_pre_cac_register_cb(void)