qcacmn: Callback functions for legacy spectral apis

Use table of function pointers for legacy api calls
instead of calling legacy apis directely

CRs-Fixed: 2146231
Change-Id: Ia5840208d0de5bd4e78c1d27b8ffdc0cf6cbf298
diff --git a/os_if/linux/spectral/src/wlan_cfg80211_spectral.c b/os_if/linux/spectral/src/wlan_cfg80211_spectral.c
index fdb160a..57e465f 100644
--- a/os_if/linux/spectral/src/wlan_cfg80211_spectral.c
+++ b/os_if/linux/spectral/src/wlan_cfg80211_spectral.c
@@ -28,9 +28,6 @@
 #include <wlan_cfg80211.h>
 #include <wlan_osif_priv.h>
 #include <qdf_mem.h>
-#ifdef WLAN_POLICY_MGR_ENABLE
-#include <wlan_policy_mgr_api.h>
-#endif
 #include <wlan_spectral_ucfg_api.h>
 #include <wlan_cfg80211_spectral.h>
 #include <spectral_ioctl.h>
@@ -105,7 +102,7 @@
 	config_req->ss_pwr_format =      SPECTRAL_PHYERR_PARAM_NOVAL;
 	config_req->ss_rpt_mode =        SPECTRAL_PHYERR_PARAM_NOVAL;
 	config_req->ss_bin_scale =       SPECTRAL_PHYERR_PARAM_NOVAL;
-	config_req->ss_dBm_adj =         SPECTRAL_PHYERR_PARAM_NOVAL;
+	config_req->ss_dbm_adj =         SPECTRAL_PHYERR_PARAM_NOVAL;
 	config_req->ss_chn_mask =        SPECTRAL_PHYERR_PARAM_NOVAL;
 }
 
@@ -378,7 +375,7 @@
 		   [QCA_WLAN_VENDOR_ATTR_SPECTRAL_SCAN_CONFIG_BIN_SCALE]);
 
 	if (tb[QCA_WLAN_VENDOR_ATTR_SPECTRAL_SCAN_CONFIG_DBM_ADJ])
-		config_req.ss_dBm_adj = nla_get_u32(tb
+		config_req.ss_dbm_adj = nla_get_u32(tb
 		   [QCA_WLAN_VENDOR_ATTR_SPECTRAL_SCAN_CONFIG_DBM_ADJ]);
 
 	if (tb[QCA_WLAN_VENDOR_ATTR_SPECTRAL_SCAN_CONFIG_CHN_MASK])
@@ -521,7 +518,7 @@
 			config_buf.ss_bin_scale) ||
 	    nla_put_u32(skb,
 			QCA_WLAN_VENDOR_ATTR_SPECTRAL_SCAN_CONFIG_DBM_ADJ,
-			config_buf.ss_dBm_adj) ||
+			config_buf.ss_dbm_adj) ||
 	    nla_put_u32(skb,
 			QCA_WLAN_VENDOR_ATTR_SPECTRAL_SCAN_CONFIG_CHN_MASK,
 			config_buf.ss_chn_mask) ||
diff --git a/spectral/core/spectral_cmn_api_i.h b/spectral/core/spectral_cmn_api_i.h
index 4436c0d..1fb7586 100644
--- a/spectral/core/spectral_cmn_api_i.h
+++ b/spectral/core/spectral_cmn_api_i.h
@@ -131,5 +131,56 @@
 	return sc;
 }
 
+/**
+ * spectral_get_spectral_ctx_from_pscoc() - API to get spectral context object
+ *                                         from psoc
+ * @psoc : Reference to psoc global object
+ *
+ * This API used to get spectral context object from global psoc reference.
+ * Null check should be done before invoking this inline function.
+ *
+ * Return : Reference to spectral_context object
+ */
+static inline
+struct spectral_context *spectral_get_spectral_ctx_from_psoc(
+	struct wlan_objmgr_psoc *psoc)
+{
+	struct spectral_context *sc = NULL;
+
+	if (psoc) {
+		sc = wlan_objmgr_psoc_get_comp_private_obj(
+			psoc,
+			WLAN_UMAC_COMP_SPECTRAL);
+	}
+
+	return sc;
+}
+
+/**
+ * spectral_get_spectral_ctx_from_vdev() - API to get spectral context object
+ *                                         from vdev
+ * @vdev : Reference to vdev global object
+ *
+ * This API used to get spectral context object from global vdev reference.
+ * Null check should be done before invoking this inline function.
+ *
+ * Return : Reference to spectral_context object
+ */
+static inline
+struct spectral_context *spectral_get_spectral_ctx_from_vdev(
+	struct wlan_objmgr_vdev *vdev)
+{
+	struct wlan_objmgr_psoc *psoc = NULL;
+	struct spectral_context *sc = NULL;
+
+	psoc = wlan_vdev_get_psoc(vdev);
+	if (psoc) {
+		sc = wlan_objmgr_psoc_get_comp_private_obj(
+			psoc,
+			WLAN_UMAC_COMP_SPECTRAL);
+	}
+
+	return sc;
+}
 #endif /* _SPECTRAL_CMN_API_I_H_*/
 
diff --git a/spectral/core/spectral_common.c b/spectral/core/spectral_common.c
index 07d228f..a0e6ee7 100644
--- a/spectral/core/spectral_common.c
+++ b/spectral/core/spectral_common.c
@@ -65,6 +65,7 @@
 	return vdev;
 }
 
+#ifndef CONFIG_MCL
 static void spectral_register_cfg80211_handlers(struct wlan_objmgr_pdev *pdev)
 {
 	wlan_cfg80211_register_spectral_cmd_handler(
@@ -92,6 +93,11 @@
 			SPECTRAL_SCAN_GET_STATUS_HANDLER_IDX,
 			wlan_cfg80211_spectral_scan_get_status);
 }
+#else
+static void spectral_register_cfg80211_handlers(struct wlan_objmgr_pdev *pdev)
+{
+}
+#endif
 
 int spectral_control_cmn(
 	struct wlan_objmgr_pdev *pdev,
@@ -433,7 +439,7 @@
 		if (!vdev)
 			return -ENOENT;
 
-		chan_width = wlan_vdev_get_ch_width(vdev);
+		chan_width = spectral_vdev_get_ch_width(vdev);
 		wlan_objmgr_vdev_release_ref(vdev, WLAN_SPECTRAL_ID);
 
 		if (!outdata || !outsize ||
diff --git a/spectral/core/spectral_defs_i.h b/spectral/core/spectral_defs_i.h
index 7d86bab..315e7ee 100644
--- a/spectral/core/spectral_defs_i.h
+++ b/spectral/core/spectral_defs_i.h
@@ -24,10 +24,12 @@
 #include <wlan_objmgr_global_obj.h>
 #include <wlan_objmgr_psoc_obj.h>
 #include <wlan_objmgr_pdev_obj.h>
+#include <wlan_objmgr_vdev_obj.h>
 #include <qdf_list.h>
 #include <qdf_timer.h>
 #include <qdf_util.h>
 #include <wlan_spectral_public_structs.h>
+#include <wlan_spectral_utils_api.h>
 #include <if_athioctl.h>
 #include <spectral_ioctl.h>
 
@@ -84,6 +86,7 @@
  */
 struct spectral_context {
 	struct wlan_objmgr_psoc *psoc_obj;
+	struct spectral_legacy_cbacks legacy_cbacks;
 	int (*sptrlc_spectral_control)(struct wlan_objmgr_pdev *pdev, u_int id,
 				       void *indata, u_int32_t insize,
 		void *outdata, u_int32_t *outsize);
diff --git a/spectral/dispatcher/inc/wlan_spectral_utils_api.h b/spectral/dispatcher/inc/wlan_spectral_utils_api.h
index cdcf99c..beef773 100644
--- a/spectral/dispatcher/inc/wlan_spectral_utils_api.h
+++ b/spectral/dispatcher/inc/wlan_spectral_utils_api.h
@@ -67,4 +67,23 @@
 void wlan_register_wmi_spectral_cmd_ops(
 		struct wlan_objmgr_pdev *pdev,
 		struct wmi_spectral_cmd_ops *cmd_ops);
+
+/**
+ * struct spectral_legacy_cbacks - Spectral legacy callbacks
+ * @vdev_get_chan_freq:          Get channel frequency
+ * @vdev_get_ch_width:           Get channel width
+ * @vdev_get_sec20chan_freq_mhz: Get seconadry 20 frequency
+ */
+struct spectral_legacy_cbacks {
+	int16_t (*vdev_get_chan_freq)(struct wlan_objmgr_vdev *vdev);
+	enum phy_ch_width (*vdev_get_ch_width)(struct wlan_objmgr_vdev *vdev);
+	int (*vdev_get_sec20chan_freq_mhz)(struct wlan_objmgr_vdev *vdev,
+					     uint16_t *sec20chan_freq);
+};
+
+QDF_STATUS spectral_register_legacy_cb(struct wlan_objmgr_psoc *psoc,
+		struct spectral_legacy_cbacks *legacy_cbacks);
+
+enum phy_ch_width spectral_vdev_get_ch_width(struct wlan_objmgr_vdev *vdev);
+
 #endif /* _WLAN_SPECTRAL_UTILS_API_H_*/
diff --git a/spectral/dispatcher/src/wlan_spectral_utils_api.c b/spectral/dispatcher/src/wlan_spectral_utils_api.c
index 171bdf1..607cd25 100644
--- a/spectral/dispatcher/src/wlan_spectral_utils_api.c
+++ b/spectral/dispatcher/src/wlan_spectral_utils_api.c
@@ -82,13 +82,64 @@
 	return QDF_STATUS_SUCCESS;
 }
 
+QDF_STATUS spectral_register_legacy_cb(struct wlan_objmgr_psoc *psoc,
+		struct spectral_legacy_cbacks *legacy_cbacks)
+{
+	struct spectral_context *sc;
+
+	sc = spectral_get_spectral_ctx_from_psoc(psoc);
+	if (!sc) {
+		spectral_err("Invalid Context");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	sc->legacy_cbacks.vdev_get_chan_freq =
+		legacy_cbacks->vdev_get_chan_freq;
+	sc->legacy_cbacks.vdev_get_ch_width =
+		legacy_cbacks->vdev_get_ch_width;
+	sc->legacy_cbacks.vdev_get_sec20chan_freq_mhz =
+		legacy_cbacks->vdev_get_sec20chan_freq_mhz;
+
+	return QDF_STATUS_SUCCESS;
+}
+EXPORT_SYMBOL(spectral_register_legacy_cb);
+
+int16_t spectral_vdev_get_chan_freq(struct wlan_objmgr_vdev *vdev)
+{
+	struct spectral_context *sc;
+
+	sc = spectral_get_spectral_ctx_from_vdev(vdev);
+	return sc->legacy_cbacks.vdev_get_chan_freq(vdev);
+}
+
+enum phy_ch_width spectral_vdev_get_ch_width(struct wlan_objmgr_vdev *vdev)
+{
+	struct spectral_context *sc;
+
+	sc = spectral_get_spectral_ctx_from_vdev(vdev);
+	return sc->legacy_cbacks.vdev_get_ch_width(vdev);
+}
+
+int spectral_vdev_get_sec20chan_freq_mhz(struct wlan_objmgr_vdev *vdev,
+		uint16_t *sec20chan_freq)
+{
+	struct spectral_context *sc;
+
+	sc = spectral_get_spectral_ctx_from_vdev(vdev);
+	return sc->legacy_cbacks.vdev_get_sec20chan_freq_mhz(vdev, sec20chan_freq);
+}
+
 void wlan_lmac_if_sptrl_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops)
 {
 	struct wlan_lmac_if_sptrl_rx_ops *sptrl_rx_ops = &rx_ops->sptrl_rx_ops;
 
 	/* Spectral rx ops */
 	sptrl_rx_ops->sptrlro_send_phydata = tgt_send_phydata;
-	sptrl_rx_ops->sptrlro_get_target_handle = tgt_get_target_handle;
+	sptrl_rx_ops->sptrlro_get_target_handle  = tgt_get_target_handle;
+	sptrl_rx_ops->sptrlro_vdev_get_chan_freq = spectral_vdev_get_chan_freq;
+	sptrl_rx_ops->sptrlro_vdev_get_ch_width  = spectral_vdev_get_ch_width;
+	sptrl_rx_ops->sptrlro_vdev_get_sec20chan_freq_mhz =
+		spectral_vdev_get_sec20chan_freq_mhz;
 }
 
 void wlan_register_wmi_spectral_cmd_ops(
diff --git a/target_if/spectral/target_if_spectral.c b/target_if/spectral/target_if_spectral.c
index 089451a..118313b 100644
--- a/target_if/spectral/target_if_spectral.c
+++ b/target_if/spectral/target_if_spectral.c
@@ -940,7 +940,7 @@
 	if (!vdev)
 		return 0;
 
-	if (wlan_vdev_get_sec20chan_freq_mhz(vdev, &sec20chan_freq) < 0) {
+	if (target_if_vdev_get_sec20chan_freq_mhz(vdev, &sec20chan_freq) < 0) {
 		wlan_objmgr_vdev_release_ref(vdev, WLAN_SPECTRAL_ID);
 		return 0;
 	}
@@ -974,7 +974,7 @@
 	if (!vdev)
 		return 0;
 
-	chan_freq = wlan_vdev_get_chan_freq(vdev);
+	chan_freq = target_if_vdev_get_chan_freq(vdev);
 	if (chan_freq < 0) {
 		wlan_objmgr_vdev_release_ref(vdev, WLAN_SPECTRAL_ID);
 		return 0;
@@ -1967,7 +1967,7 @@
 	if (!vdev)
 		return 1;
 
-	spectral->ch_width  = wlan_vdev_get_ch_width(vdev);
+	spectral->ch_width  = target_if_vdev_get_ch_width(vdev);
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_SPECTRAL_ID);
 
 	if (spectral->ch_width == CH_WIDTH_INVALID)
diff --git a/target_if/spectral/target_if_spectral.h b/target_if/spectral/target_if_spectral.h
index 04a3a5f..f75d1a5 100644
--- a/target_if/spectral/target_if_spectral.h
+++ b/target_if/spectral/target_if_spectral.h
@@ -939,6 +939,40 @@
 	return spectral;
 }
 
+static inline
+int16_t target_if_vdev_get_chan_freq(struct wlan_objmgr_vdev *vdev)
+{
+	struct wlan_objmgr_psoc *psoc = NULL;
+
+	psoc = wlan_vdev_get_psoc(vdev);
+
+	return psoc->soc_cb.rx_ops.sptrl_rx_ops.sptrlro_vdev_get_chan_freq(
+		vdev);
+}
+
+static inline
+enum phy_ch_width target_if_vdev_get_ch_width(struct wlan_objmgr_vdev *vdev)
+{
+	struct wlan_objmgr_psoc *psoc = NULL;
+
+	psoc = wlan_vdev_get_psoc(vdev);
+
+	return psoc->soc_cb.rx_ops.sptrl_rx_ops.sptrlro_vdev_get_ch_width(
+		vdev);
+}
+
+static inline
+int target_if_vdev_get_sec20chan_freq_mhz(struct wlan_objmgr_vdev *vdev,
+		uint16_t *sec20chan_freq)
+{
+	struct wlan_objmgr_psoc *psoc = NULL;
+
+	psoc = wlan_vdev_get_psoc(vdev);
+
+	return psoc->soc_cb.rx_ops.sptrl_rx_ops.
+		sptrlro_vdev_get_sec20chan_freq_mhz(vdev, sec20chan_freq);
+}
+
 /**
  * target_if_spectral_set_rxchainmask() - Set Spectral Rx chainmask
  * @pdev: Pointer to pdev
diff --git a/target_if/spectral/target_if_spectral_sim.c b/target_if/spectral/target_if_spectral_sim.c
index 587d345..1dec379 100644
--- a/target_if/spectral/target_if_spectral_sim.c
+++ b/target_if/spectral/target_if_spectral_sim.c
@@ -848,7 +848,7 @@
 		return 0;
 	}
 
-	bw = wlan_vdev_get_ch_width(vdev);
+	bw = target_if_vdev_get_ch_width(vdev);
 
 	switch (bw) {
 	case CH_WIDTH_20MHZ:
diff --git a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h b/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h
index d11d121..8224e07 100644
--- a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h
+++ b/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h
@@ -760,6 +760,12 @@
 	int (*sptrlro_send_phydata)(struct wlan_objmgr_pdev *pdev,
 				    struct sock *sock, qdf_nbuf_t nbuf);
 	void * (*sptrlro_get_target_handle)(struct wlan_objmgr_pdev *pdev);
+	int16_t (*sptrlro_vdev_get_chan_freq)(struct wlan_objmgr_vdev *vdev);
+	enum phy_ch_width (*sptrlro_vdev_get_ch_width)(
+			struct wlan_objmgr_vdev *vdev);
+	int (*sptrlro_vdev_get_sec20chan_freq_mhz)(
+			struct wlan_objmgr_vdev *vdev,
+			uint16_t *sec20chan_freq);
 };
 #endif /* WLAN_CONV_SPECTRAL_ENABLE */