Browse Source

qcacmn: Gets vdev by id in spectral component

It starts spectral scan without vdev object, and uses the first vdev
as current vdev. which cause vdev mismatch in some platforms. So pass
vdev object or id when finding current vdev.

Change-Id: Iab55afbe2c98906021a008918f186d3d2dce5871
CRS-Fixed: 2716460
Wu Gao 5 năm trước cách đây
mục cha
commit
b43c68dedf

+ 14 - 0
os_if/linux/spectral/inc/wlan_cfg80211_spectral.h

@@ -60,6 +60,7 @@ void wlan_cfg80211_register_spectral_cmd_handler(struct wlan_objmgr_pdev *pdev,
  * wlan_cfg80211_spectral_scan_config_and_start() - Start spectral scan
  * @wiphy:    Pointer to wiphy
  * @pdev:     Pointer to pdev
+ * @vdev:     Pointer to vdev
  * @data:     Reference to data
  * @data_len: Length of @data
  *
@@ -67,6 +68,7 @@ void wlan_cfg80211_register_spectral_cmd_handler(struct wlan_objmgr_pdev *pdev,
  */
 int wlan_cfg80211_spectral_scan_config_and_start(struct wiphy *wiphy,
 						 struct wlan_objmgr_pdev *pdev,
+						 struct wlan_objmgr_vdev *vdev,
 						 const void *data,
 						 int data_len);
 
@@ -74,6 +76,7 @@ int wlan_cfg80211_spectral_scan_config_and_start(struct wiphy *wiphy,
  * wlan_cfg80211_spectral_scan_stop() - Stop spectral scan
  * @wiphy:    Pointer to wiphy
  * @pdev:     Pointer to pdev
+ * @vdev:     Pointer to vdev
  * @data:     Reference to data
  * @data_len: Length of @data
  *
@@ -81,6 +84,7 @@ int wlan_cfg80211_spectral_scan_config_and_start(struct wiphy *wiphy,
  */
 int wlan_cfg80211_spectral_scan_stop(struct wiphy *wiphy,
 				     struct wlan_objmgr_pdev *pdev,
+				     struct wlan_objmgr_vdev *vdev,
 				     const void *data,
 				     int data_len);
 
@@ -88,6 +92,7 @@ int wlan_cfg80211_spectral_scan_stop(struct wiphy *wiphy,
  * wlan_cfg80211_spectral_scan_get_config() - Get spectral scan config
  * @wiphy:    Pointer to wiphy
  * @pdev:     Pointer to pdev
+ * @vdev:     Pointer to vdev
  * @data:     Reference to data
  * @data_len: Length of @data
  *
@@ -95,6 +100,7 @@ int wlan_cfg80211_spectral_scan_stop(struct wiphy *wiphy,
  */
 int wlan_cfg80211_spectral_scan_get_config(struct wiphy *wiphy,
 					   struct wlan_objmgr_pdev *pdev,
+					   struct wlan_objmgr_vdev *vdev,
 					   const void *data,
 					   int data_len);
 
@@ -102,6 +108,7 @@ int wlan_cfg80211_spectral_scan_get_config(struct wiphy *wiphy,
  * wlan_cfg80211_spectral_scan_get_cap() - Get spectral system capabilities
  * @wiphy:    Pointer to wiphy
  * @pdev:     Pointer to pdev
+ * @vdev:     Pointer to vdev
  * @data:     Reference to data
  * @data_len: Length of @data
  *
@@ -109,6 +116,7 @@ int wlan_cfg80211_spectral_scan_get_config(struct wiphy *wiphy,
  */
 int wlan_cfg80211_spectral_scan_get_cap(struct wiphy *wiphy,
 					struct wlan_objmgr_pdev *pdev,
+					struct wlan_objmgr_vdev *vdev,
 					const void *data,
 					int data_len);
 
@@ -116,6 +124,7 @@ int wlan_cfg80211_spectral_scan_get_cap(struct wiphy *wiphy,
  * wlan_cfg80211_spectral_scan_get_diag_stats() - Get spectral diag stats
  * @wiphy:    Pointer to wiphy
  * @pdev:     Pointer to pdev
+ * @vdev:     Pointer to vdev
  * @data:     Reference to data
  * @data_len: Length of @data
  *
@@ -123,6 +132,7 @@ int wlan_cfg80211_spectral_scan_get_cap(struct wiphy *wiphy,
  */
 int wlan_cfg80211_spectral_scan_get_diag_stats(struct wiphy *wiphy,
 					       struct wlan_objmgr_pdev *pdev,
+					       struct wlan_objmgr_vdev *vdev,
 					       const void *data,
 					       int data_len);
 
@@ -130,6 +140,7 @@ int wlan_cfg80211_spectral_scan_get_diag_stats(struct wiphy *wiphy,
  * wlan_cfg80211_spectral_scan_get_status() - Get spectral scan status
  * @wiphy:    Pointer to wiphy
  * @pdev:     Pointer to pdev
+ * @vdev:     Pointer to vdev
  * @data:     Reference to data
  * @data_len: Length of @data
  *
@@ -137,12 +148,14 @@ int wlan_cfg80211_spectral_scan_get_diag_stats(struct wiphy *wiphy,
  */
 int wlan_cfg80211_spectral_scan_get_status(struct wiphy *wiphy,
 					   struct wlan_objmgr_pdev *pdev,
+					   struct wlan_objmgr_vdev *vdev,
 					   const void *data,
 					   int data_len);
 
 /**
  * wlan_cfg80211_spectral_scan_dma_debug_config() - configure DMA debug
  * @pdev:       Pointer to pdev
+ * @vdev:       Pointer to vdev
  * @tb:         Pointer to Spectral Scan config attribute
  * @sscan_mode: Spectral scan mode
  *
@@ -150,6 +163,7 @@ int wlan_cfg80211_spectral_scan_get_status(struct wiphy *wiphy,
  */
 QDF_STATUS wlan_cfg80211_spectral_scan_dma_debug_config(
 		struct wlan_objmgr_pdev *pdev,
+		struct wlan_objmgr_vdev *vdev,
 		struct nlattr **tb,
 		enum spectral_scan_mode sscan_mode);
 #endif

+ 15 - 1
os_if/linux/spectral/src/wlan_cfg80211_spectral.c

@@ -31,6 +31,7 @@
 #include <wlan_spectral_ucfg_api.h>
 #include <wlan_cfg80211_spectral.h>
 #include <spectral_ioctl.h>
+#include <wlan_objmgr_vdev_obj.h>
 
 const struct nla_policy spectral_scan_policy[
 		QCA_WLAN_VENDOR_ATTR_SPECTRAL_SCAN_CONFIG_MAX + 1] = {
@@ -191,6 +192,7 @@ convert_spectral_err_code_internal_to_nl
 #ifdef DIRECT_BUF_RX_DEBUG
 QDF_STATUS wlan_cfg80211_spectral_scan_dma_debug_config(
 	struct wlan_objmgr_pdev *pdev,
+	struct wlan_objmgr_vdev *vdev,
 	struct nlattr **tb,
 	enum spectral_scan_mode sscan_mode)
 {
@@ -232,6 +234,7 @@ QDF_STATUS wlan_cfg80211_spectral_scan_dma_debug_config(
 #else
 QDF_STATUS wlan_cfg80211_spectral_scan_dma_debug_config(
 	struct wlan_objmgr_pdev *pdev,
+	struct wlan_objmgr_vdev *vdev,
 	struct nlattr **tb,
 	enum spectral_scan_mode sscan_mode)
 {
@@ -241,6 +244,7 @@ QDF_STATUS wlan_cfg80211_spectral_scan_dma_debug_config(
 
 int wlan_cfg80211_spectral_scan_config_and_start(struct wiphy *wiphy,
 						 struct wlan_objmgr_pdev *pdev,
+						 struct wlan_objmgr_vdev *vdev,
 						 const void *data,
 						 int data_len)
 {
@@ -392,12 +396,17 @@ int wlan_cfg80211_spectral_scan_config_and_start(struct wiphy *wiphy,
 	}
 
 	status = wlan_cfg80211_spectral_scan_dma_debug_config(
-			pdev, tb, sscan_mode);
+			pdev, vdev, tb, sscan_mode);
 	if (QDF_IS_STATUS_ERROR(status)) {
 		status = QDF_STATUS_E_INVAL;
 		goto free_skb_return_os_status;
 	}
 
+	if (vdev)
+		sscan_req.vdev_id = wlan_vdev_get_id(vdev);
+	else
+		sscan_req.vdev_id = WLAN_INVALID_VDEV_ID;
+
 	if (CONFIG_REQUESTED(scan_req_type)) {
 		sscan_req.ss_mode = sscan_mode;
 		sscan_req.req_id = SPECTRAL_SET_CONFIG;
@@ -480,6 +489,7 @@ free_skb_return_os_status:
 
 int wlan_cfg80211_spectral_scan_stop(struct wiphy *wiphy,
 				     struct wlan_objmgr_pdev *pdev,
+				     struct wlan_objmgr_vdev *vdev,
 				     const void *data,
 				     int data_len)
 {
@@ -548,6 +558,7 @@ int wlan_cfg80211_spectral_scan_stop(struct wiphy *wiphy,
 
 int wlan_cfg80211_spectral_scan_get_config(struct wiphy *wiphy,
 					   struct wlan_objmgr_pdev *pdev,
+					   struct wlan_objmgr_vdev *vdev,
 					   const void *data,
 					   int data_len)
 {
@@ -678,6 +689,7 @@ fail:
 
 int wlan_cfg80211_spectral_scan_get_cap(struct wiphy *wiphy,
 					struct wlan_objmgr_pdev *pdev,
+					struct wlan_objmgr_vdev *vdev,
 					const void *data,
 					int data_len)
 {
@@ -829,6 +841,7 @@ fail:
 
 int wlan_cfg80211_spectral_scan_get_diag_stats(struct wiphy *wiphy,
 					       struct wlan_objmgr_pdev *pdev,
+					       struct wlan_objmgr_vdev *vdev,
 					       const void *data,
 					       int data_len)
 {
@@ -880,6 +893,7 @@ int wlan_cfg80211_spectral_scan_get_diag_stats(struct wiphy *wiphy,
 
 int wlan_cfg80211_spectral_scan_get_status(struct wiphy *wiphy,
 					   struct wlan_objmgr_pdev *pdev,
+					   struct wlan_objmgr_vdev *vdev,
 					   const void *data,
 					   int data_len)
 {

+ 11 - 6
spectral/core/spectral_common.c

@@ -32,6 +32,7 @@
  * spectral_get_vdev() - Get pointer to vdev to be used for Spectral
  * operations
  * @pdev: Pointer to pdev
+ * @vdev_id: vdev_id
  *
  * Spectral operates on pdev. However, in order to retrieve some WLAN
  * properties, a vdev is required. To facilitate this, the function returns the
@@ -50,14 +51,17 @@
  * Return: Pointer to vdev on success, NULL on failure
  */
 static struct wlan_objmgr_vdev*
-spectral_get_vdev(struct wlan_objmgr_pdev *pdev)
+spectral_get_vdev(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id)
 {
 	struct wlan_objmgr_vdev *vdev = NULL;
 
 	qdf_assert_always(pdev);
 
-	vdev = wlan_objmgr_pdev_get_first_vdev(pdev, WLAN_SPECTRAL_ID);
-
+	if (vdev_id == WLAN_INVALID_VDEV_ID)
+		vdev = wlan_objmgr_pdev_get_first_vdev(pdev, WLAN_SPECTRAL_ID);
+	else
+		vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
+							    WLAN_SPECTRAL_ID);
 	if (!vdev) {
 		spectral_warn("Unable to get first vdev of pdev");
 		return NULL;
@@ -318,7 +322,7 @@ spectral_control_cmn(struct wlan_objmgr_pdev *pdev,
 			 * Check if any of the inactive Rx antenna
 			 * chains is set active in spectral chainmask
 			 */
-			vdev = spectral_get_vdev(pdev);
+			vdev = spectral_get_vdev(pdev, sscan_req->vdev_id);
 			if (!vdev)
 				goto bad;
 
@@ -406,7 +410,8 @@ spectral_control_cmn(struct wlan_objmgr_pdev *pdev,
 
 	case SPECTRAL_ACTIVATE_SCAN:
 		err = &sscan_req->action_req.sscan_err_code;
-		ret = sc->sptrlc_start_spectral_scan(pdev, smode, err);
+		ret = sc->sptrlc_start_spectral_scan(pdev, sscan_req->vdev_id,
+						     smode, err);
 		if (QDF_IS_STATUS_ERROR(ret))
 			goto bad;
 		break;
@@ -440,7 +445,7 @@ spectral_control_cmn(struct wlan_objmgr_pdev *pdev,
 		{
 			uint32_t chan_width;
 
-			vdev = spectral_get_vdev(pdev);
+			vdev = spectral_get_vdev(pdev, sscan_req->vdev_id);
 			if (!vdev)
 				goto bad;
 

+ 1 - 0
spectral/core/spectral_defs_i.h

@@ -150,6 +150,7 @@ struct spectral_context {
 					 const enum spectral_scan_mode smode);
 	QDF_STATUS (*sptrlc_start_spectral_scan)
 					(struct wlan_objmgr_pdev *pdev,
+					 uint8_t vdev_id,
 					 const enum spectral_scan_mode smode,
 					 enum spectral_cp_error_code *err);
 	QDF_STATUS (*sptrlc_stop_spectral_scan)

+ 2 - 0
spectral/dispatcher/inc/wlan_spectral_public_structs.h

@@ -421,11 +421,13 @@ struct spectral_scan_dma_debug_request {
  *                              be atomic.
  * @ss_mode: Spectral scan mode
  * @req_id: Request identifier
+ * @vdev_id: VDEV id
  * @dma_debug_req: Spectral DMA debug request
  */
 struct spectral_cp_request {
 	enum spectral_scan_mode ss_mode;
 	uint8_t req_id;
+	uint8_t vdev_id;
 	union {
 		struct spectral_scan_config_request config_req;
 		struct spectral_scan_action_request action_req;

+ 2 - 0
spectral/dispatcher/inc/wlan_spectral_tgt_api.h

@@ -127,6 +127,7 @@ QDF_STATUS tgt_get_spectral_config(struct wlan_objmgr_pdev *pdev,
 /**
  * tgt_start_spectral_scan() - Start spectral scan
  * @pdev: Pointer to pdev object
+ * @vdev_id: VDEV id
  * @smode: Spectral scan mode
  * @err: Spectral control path error code
  *
@@ -135,6 +136,7 @@ QDF_STATUS tgt_get_spectral_config(struct wlan_objmgr_pdev *pdev,
  * Return: QDF_STATUS_SUCCESS on success, else QDF_STATUS_E_FAILURE
  */
 QDF_STATUS tgt_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
+				   uint8_t vdev_id,
 				   enum spectral_scan_mode smode,
 				   enum spectral_cp_error_code *err);
 

+ 3 - 2
spectral/dispatcher/src/wlan_spectral_tgt_api.c

@@ -197,6 +197,7 @@ tgt_get_spectral_config(struct wlan_objmgr_pdev *pdev,
 
 QDF_STATUS
 tgt_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
+			uint8_t vdev_id,
 			enum spectral_scan_mode smode,
 			enum spectral_cp_error_code *err)
 {
@@ -210,8 +211,8 @@ tgt_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
 		return QDF_STATUS_E_FAILURE;
 	}
 
-	return tx_ops->sptrl_tx_ops.sptrlto_start_spectral_scan(pdev, smode,
-			err);
+	return tx_ops->sptrl_tx_ops.sptrlto_start_spectral_scan(pdev, vdev_id,
+								smode, err);
 }
 
 QDF_STATUS

+ 71 - 33
target_if/spectral/target_if_spectral.c

@@ -54,7 +54,8 @@ static void target_if_spectral_get_firstvdev_pdev(struct wlan_objmgr_pdev *pdev,
 }
 
 struct wlan_objmgr_vdev *
-target_if_spectral_get_vdev(struct target_if_spectral *spectral)
+target_if_spectral_get_vdev(struct target_if_spectral *spectral,
+			    enum spectral_scan_mode smode)
 {
 	struct wlan_objmgr_pdev *pdev = NULL;
 	struct wlan_objmgr_vdev *first_vdev = NULL;
@@ -63,6 +64,18 @@ target_if_spectral_get_vdev(struct target_if_spectral *spectral)
 	pdev = spectral->pdev_obj;
 	qdf_assert_always(pdev);
 
+	if (smode >= SPECTRAL_SCAN_MODE_MAX) {
+		spectral_err("Invalid Spectral mode %u", smode);
+		return NULL;
+	}
+
+	if (spectral->vdev_id[smode] != WLAN_INVALID_VDEV_ID) {
+		first_vdev = wlan_objmgr_get_vdev_by_id_from_pdev(
+						pdev, spectral->vdev_id[smode],
+						WLAN_SPECTRAL_ID);
+		return first_vdev;
+	}
+
 	if (wlan_objmgr_pdev_try_get_ref(pdev, WLAN_SPECTRAL_ID) !=
 	    QDF_STATUS_SUCCESS) {
 		spectral_err("Unable to get pdev reference.");
@@ -82,7 +95,6 @@ target_if_spectral_get_vdev(struct target_if_spectral *spectral)
 			QDF_STATUS_SUCCESS)
 		first_vdev = NULL;
 
-
 	return first_vdev;
 }
 
@@ -124,7 +136,7 @@ target_if_send_vdev_spectral_configure_cmd(struct target_if_spectral *spectral,
 		return qdf_status_to_os_return(QDF_STATUS_E_FAILURE);
 	}
 
-	vdev = target_if_spectral_get_vdev(spectral);
+	vdev = target_if_spectral_get_vdev(spectral, smode);
 	if (!vdev)
 		return QDF_STATUS_E_NOENT;
 
@@ -205,7 +217,7 @@ target_if_send_vdev_spectral_enable_cmd(struct target_if_spectral *spectral,
 		return qdf_status_to_os_return(QDF_STATUS_E_FAILURE);
 	}
 
-	vdev = target_if_spectral_get_vdev(spectral);
+	vdev = target_if_spectral_get_vdev(spectral, smode);
 	if (!vdev)
 		return QDF_STATUS_E_NOENT;
 
@@ -308,7 +320,7 @@ target_if_spectral_info_init_defaults(struct target_if_spectral *spectral,
 
 	info->osps_cache.osc_params.ss_dbm_adj = SPECTRAL_SCAN_DBM_ADJ_DEFAULT;
 
-	vdev = target_if_spectral_get_vdev(spectral);
+	vdev = target_if_spectral_get_vdev(spectral, smode);
 	if (!vdev)
 		return QDF_STATUS_E_NOENT;
 
@@ -1138,6 +1150,7 @@ target_if_sops_stop_spectral_scan(void *arg, enum spectral_scan_mode smode)
 /**
  * target_if_spectral_get_extension_channel() - Get the Extension channel
  * @arg: Pointer to handle for Spectral target_if internal private data
+ * @smode: Spectral scan mode
  *
  * Function to get the current Extension channel (in MHz)
  *
@@ -1145,7 +1158,8 @@ target_if_sops_stop_spectral_scan(void *arg, enum spectral_scan_mode smode)
  * extension channel is not present.
  */
 uint32_t
-target_if_spectral_get_extension_channel(void *arg)
+target_if_spectral_get_extension_channel(void *arg,
+					 enum spectral_scan_mode smode)
 {
 	/*
 	 * XXX: Once we expand to use cases where Spectral could be activated
@@ -1160,7 +1174,11 @@ target_if_spectral_get_extension_channel(void *arg)
 	qdf_assert_always(arg);
 	spectral = (struct target_if_spectral *)arg;
 
-	vdev = target_if_spectral_get_vdev(spectral);
+	if (smode >= SPECTRAL_SCAN_MODE_MAX) {
+		spectral_err("Invalid Spectral mode %u", smode);
+		return 0;
+	}
+	vdev = target_if_spectral_get_vdev(spectral, smode);
 	if (!vdev)
 		return 0;
 
@@ -1177,13 +1195,14 @@ target_if_spectral_get_extension_channel(void *arg)
 /**
  * target_if_spectral_get_current_channel() - Get the current channel
  * @arg: Pointer to handle for Spectral target_if internal private data
+ * @smode: Spectral scan mode
  *
  * Function to get the current channel (in MHz)
  *
  * Return: Current channel (in MHz) on success, 0 on failure
  */
 uint32_t
-target_if_spectral_get_current_channel(void *arg)
+target_if_spectral_get_current_channel(void *arg, enum spectral_scan_mode smode)
 {
 	/*
 	 * XXX: Once we expand to use cases where Spectral could be activated
@@ -1198,7 +1217,11 @@ target_if_spectral_get_current_channel(void *arg)
 	qdf_assert_always(arg);
 	spectral = (struct target_if_spectral *)arg;
 
-	vdev = target_if_spectral_get_vdev(spectral);
+	if (smode >= SPECTRAL_SCAN_MODE_MAX) {
+		spectral_err("Invalid Spectral mode %u", smode);
+		return 0;
+	}
+	vdev = target_if_spectral_get_vdev(spectral, smode);
 	if (!vdev)
 		return 0;
 
@@ -1804,7 +1827,7 @@ null_stop_spectral_scan(void *arg, enum spectral_scan_mode smode)
 }
 
 static uint32_t
-null_get_extension_channel(void *arg)
+null_get_extension_channel(void *arg, enum spectral_scan_mode smode)
 {
 	spectral_ops_not_registered("get_extension_channel");
 	return 1;
@@ -1855,7 +1878,7 @@ null_get_mac_address(void *arg, char *addr)
 }
 
 static uint32_t
-null_get_current_channel(void *arg)
+null_get_current_channel(void *arg, enum spectral_scan_mode smode)
 {
 	spectral_ops_not_registered("get_current_channel");
 	return 0;
@@ -2301,6 +2324,8 @@ target_if_pdev_spectral_init(struct wlan_objmgr_pdev *pdev)
 	qdf_mem_zero(spectral, sizeof(struct target_if_spectral));
 	/* Store pdev in Spectral */
 	spectral->pdev_obj = pdev;
+	spectral->vdev_id[SPECTRAL_SCAN_MODE_NORMAL] = WLAN_INVALID_VDEV_ID;
+	spectral->vdev_id[SPECTRAL_SCAN_MODE_AGILE] = WLAN_INVALID_VDEV_ID;
 
 	psoc = wlan_pdev_get_psoc(pdev);
 
@@ -2899,7 +2924,7 @@ target_if_is_agile_span_overlap_with_operating_span
 	}
 	*is_overlapping = false;
 
-	vdev = target_if_spectral_get_vdev(spectral);
+	vdev = target_if_spectral_get_vdev(spectral, SPECTRAL_SCAN_MODE_AGILE);
 	if (!vdev) {
 		spectral_err("vdev is NULL");
 		return QDF_STATUS_E_FAILURE;
@@ -3021,7 +3046,7 @@ target_if_spectral_populate_chwidth(struct target_if_spectral *spectral,
 		return QDF_STATUS_E_INVAL;
 	}
 
-	vdev = target_if_spectral_get_vdev(spectral);
+	vdev = target_if_spectral_get_vdev(spectral, SPECTRAL_SCAN_MODE_NORMAL);
 	if (!vdev) {
 		spectral_err("vdev is null");
 		return QDF_STATUS_E_FAILURE;
@@ -3489,8 +3514,8 @@ target_if_get_fft_bin_count(int fft_len)
 /**
  * target_if_init_upper_lower_flags() - Initializes control and extension
  * segment flags
- * @fft_len: FFT length
- * @pdev: Pointer to pdev object
+ * @spectral: pointer to target if spectral object
+ * @smode: Spectral scan mode
  *
  * API to initialize the control and extension flags with the lower/upper
  * segment based on the HT mode
@@ -3498,15 +3523,20 @@ target_if_get_fft_bin_count(int fft_len)
  * Return: FFt bin count
  */
 static void
-target_if_init_upper_lower_flags(struct target_if_spectral *spectral)
+target_if_init_upper_lower_flags(struct target_if_spectral *spectral,
+				 enum spectral_scan_mode smode)
 {
 	int current_channel = 0;
 	int ext_channel = 0;
 	struct target_if_spectral_ops *p_sops =
 		GET_TARGET_IF_SPECTRAL_OPS(spectral);
 
-	current_channel = p_sops->get_current_channel(spectral);
-	ext_channel = p_sops->get_extension_channel(spectral);
+	if (smode >= SPECTRAL_SCAN_MODE_MAX) {
+		spectral_err("Invalid Spectral mode %u", smode);
+		return;
+	}
+	current_channel = p_sops->get_current_channel(spectral, smode);
+	ext_channel = p_sops->get_extension_channel(spectral, smode);
 
 	if ((current_channel == 0) || (ext_channel == 0))
 		return;
@@ -3636,8 +3666,8 @@ target_if_spectral_scan_enable_params(struct target_if_spectral *spectral,
 	    spectral_params->ss_spectral_pri ? 1 : 0;
 
 	/* check if extension channel is present */
-	extension_channel = p_sops->get_extension_channel(spectral);
-	current_channel = p_sops->get_current_channel(spectral);
+	extension_channel = p_sops->get_extension_channel(spectral, smode);
+	current_channel = p_sops->get_current_channel(spectral, smode);
 
 	status = target_if_spectral_populate_chwidth(
 			spectral, spectral->ch_width,
@@ -3895,7 +3925,7 @@ target_if_spectral_scan_enable_params(struct target_if_spectral *spectral,
 	/* get current spectral configuration */
 	p_sops->get_spectral_config(spectral, &spectral->params[smode], smode);
 
-	target_if_init_upper_lower_flags(spectral);
+	target_if_init_upper_lower_flags(spectral, smode);
 
 	return 0;
 }
@@ -3946,14 +3976,14 @@ target_if_is_aspectral_prohibited_by_adfs(struct wlan_objmgr_psoc *psoc,
 /**
  * target_if_get_curr_band() - Get current operating band of pdev
  *
- * @spectral: pointer to spectral object
+ * @pdev: pointer to pdev object
  *
  * API to get current operating band of a given pdev.
  *
  * Return: if success enum reg_wifi_band, REG_BAND_UNKNOWN in case of failure
  */
 static enum reg_wifi_band
-target_if_get_curr_band(struct wlan_objmgr_pdev *pdev)
+target_if_get_curr_band(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id)
 {
 	struct wlan_objmgr_vdev *vdev;
 	int16_t chan_freq;
@@ -3964,7 +3994,11 @@ target_if_get_curr_band(struct wlan_objmgr_pdev *pdev)
 		return REG_BAND_UNKNOWN;
 	}
 
-	vdev = wlan_objmgr_pdev_get_first_vdev(pdev, WLAN_SPECTRAL_ID);
+	if (vdev_id == WLAN_INVALID_VDEV_ID)
+		vdev = wlan_objmgr_pdev_get_first_vdev(pdev, WLAN_SPECTRAL_ID);
+	else
+		vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id,
+							    WLAN_SPECTRAL_ID);
 	if (!vdev) {
 		spectral_debug("vdev is NULL");
 		return REG_BAND_UNKNOWN;
@@ -4006,7 +4040,8 @@ target_if_is_agile_scan_active_in_5g(struct wlan_objmgr_psoc *psoc,
 	}
 	p_sops = GET_TARGET_IF_SPECTRAL_OPS(spectral);
 
-	band = target_if_get_curr_band(cur_pdev);
+	band = target_if_get_curr_band(
+			cur_pdev, spectral->vdev_id[SPECTRAL_SCAN_MODE_AGILE]);
 	if (band == REG_BAND_UNKNOWN) {
 		spectral_debug("Failed to get current band");
 		return;
@@ -4071,7 +4106,7 @@ target_if_is_agile_supported_cur_chmask(struct target_if_spectral *spectral,
 		return QDF_STATUS_E_FAILURE;
 	}
 
-	vdev = target_if_spectral_get_vdev(spectral);
+	vdev = target_if_spectral_get_vdev(spectral, SPECTRAL_SCAN_MODE_AGILE);
 	if (!vdev) {
 		spectral_err("First vdev is NULL");
 		return QDF_STATUS_E_FAILURE;
@@ -4147,6 +4182,7 @@ target_if_is_agile_supported_cur_chmask(struct target_if_spectral *spectral,
 
 QDF_STATUS
 target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
+			      uint8_t vdev_id,
 			      const enum spectral_scan_mode smode,
 			      enum spectral_cp_error_code *err)
 {
@@ -4191,6 +4227,13 @@ target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
 		return QDF_STATUS_E_FAILURE;
 	}
 
+	if (p_sops->is_spectral_active(spectral, smode)) {
+		spectral_err("spectral in progress in current pdev, mode %d",
+			     smode);
+		return QDF_STATUS_E_FAILURE;
+	}
+	spectral->vdev_id[smode] = vdev_id;
+
 	if (smode == SPECTRAL_SCAN_MODE_AGILE) {
 		QDF_STATUS status;
 		bool is_supported = false;
@@ -4209,7 +4252,7 @@ target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
 		}
 	}
 
-	band = target_if_get_curr_band(spectral->pdev_obj);
+	band = target_if_get_curr_band(spectral->pdev_obj, vdev_id);
 	if (band == REG_BAND_UNKNOWN) {
 		spectral_err("Failed to get current band");
 		return QDF_STATUS_E_FAILURE;
@@ -4219,12 +4262,6 @@ target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
 		enum wmi_host_hw_mode_config_type mode;
 		bool is_agile_scan_inprog_5g_pdev;
 
-		if (p_sops->is_spectral_active(spectral,
-					       SPECTRAL_SCAN_MODE_AGILE)) {
-			spectral_err("Agile Scan in progress in current pdev");
-			return QDF_STATUS_E_FAILURE;
-		}
-
 		tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
 		if (!tgt_hdl) {
 			target_if_err("target_psoc_info is null");
@@ -4386,6 +4423,7 @@ target_if_stop_spectral_scan(struct wlan_objmgr_pdev *pdev,
 
 	spectral->send_single_packet = 0;
 	spectral->sc_spectral_scan = 0;
+	spectral->vdev_id[smode] = WLAN_INVALID_VDEV_ID;
 
 	qdf_spin_unlock(&spectral->spectral_lock);
 

+ 19 - 5
target_if/spectral/target_if_spectral.h

@@ -669,7 +669,8 @@ struct target_if_spectral_ops {
 					enum spectral_cp_error_code *err);
 	uint32_t (*stop_spectral_scan)(void *arg,
 				       enum spectral_scan_mode smode);
-	uint32_t (*get_extension_channel)(void *arg);
+	uint32_t (*get_extension_channel)(void *arg,
+					  enum spectral_scan_mode smode);
 	int8_t    (*get_ctl_noisefloor)(void *arg);
 	int8_t    (*get_ext_noisefloor)(void *arg);
 	uint32_t (*configure_spectral)(
@@ -682,7 +683,8 @@ struct target_if_spectral_ops {
 			enum spectral_scan_mode smode);
 	uint32_t (*get_ent_spectral_mask)(void *arg);
 	uint32_t (*get_mac_address)(void *arg, char *addr);
-	uint32_t (*get_current_channel)(void *arg);
+	uint32_t (*get_current_channel)(void *arg,
+					enum spectral_scan_mode smode);
 	uint32_t (*reset_hw)(void *arg);
 	uint32_t (*get_chain_noise_floor)(void *arg, int16_t *nf_buf);
 	int (*spectral_process_phyerr)(struct target_if_spectral *spectral,
@@ -886,6 +888,7 @@ struct spectral_param_properties {
  * @capability: Spectral capabilities structure
  * @properties: Spectral parameter properties per mode
  * @spectral_lock: Lock used for internal Spectral operations
+ * @vdev_id: VDEV id for all spectral modes
  * @spectral_curchan_radindex: Current channel spectral index
  * @spectral_extchan_radindex: Extension channel spectral index
  * @spectraldomain: Current Spectral domain
@@ -980,6 +983,7 @@ struct target_if_spectral {
 	struct spectral_param_properties
 			properties[SPECTRAL_SCAN_MODE_MAX][SPECTRAL_PARAM_MAX];
 	qdf_spinlock_t                          spectral_lock;
+	uint8_t                                 vdev_id[SPECTRAL_SCAN_MODE_MAX];
 	int16_t                                 spectral_curchan_radindex;
 	int16_t                                 spectral_extchan_radindex;
 	uint32_t                               spectraldomain;
@@ -1340,6 +1344,7 @@ QDF_STATUS target_if_stop_spectral_scan(struct wlan_objmgr_pdev *pdev,
  * target_if_spectral_get_vdev() - Get pointer to vdev to be used for Spectral
  * operations
  * @spectral: Pointer to Spectral target_if internal private data
+ * @smode: spectral scan mode
  *
  * Spectral operates on pdev. However, in order to retrieve some WLAN
  * properties, a vdev is required. To facilitate this, the function returns the
@@ -1351,7 +1356,8 @@ QDF_STATUS target_if_stop_spectral_scan(struct wlan_objmgr_pdev *pdev,
  * Return: Pointer to vdev on success, NULL on failure
  */
 struct wlan_objmgr_vdev *target_if_spectral_get_vdev(
-	struct target_if_spectral *spectral);
+	struct target_if_spectral *spectral,
+	enum spectral_scan_mode smode);
 
 /**
  * target_if_spectral_dump_hdr_gen2() - Dump Spectral header for gen2
@@ -1952,19 +1958,25 @@ uint32_t target_if_sops_stop_spectral_scan(void *arg,
  * target_if_spectral_get_extension_channel() - Get the current Extension
  *                                              channel (in MHz)
  * @arg: Pointer to handle for Spectral target_if internal private data
+ * @smode: Spectral scan mode
  *
  * Return: Current Extension channel (in MHz) on success, 0 on failure or if
  * extension channel is not present.
  */
-uint32_t target_if_spectral_get_extension_channel(void *arg);
+uint32_t
+target_if_spectral_get_extension_channel(void *arg,
+					 enum spectral_scan_mode smode);
 
 /**
  * target_if_spectral_get_current_channel() - Get the current channel (in MHz)
  * @arg: Pointer to handle for Spectral target_if internal private data
+ * @smode: Spectral scan mode
  *
  * Return: Current channel (in MHz) on success, 0 on failure
  */
-uint32_t target_if_spectral_get_current_channel(void *arg);
+uint32_t
+target_if_spectral_get_current_channel(void *arg,
+				       enum spectral_scan_mode smode);
 
 
 /**
@@ -2127,6 +2139,7 @@ target_if_init_spectral_capability(struct target_if_spectral *spectral,
 /**
  * target_if_start_spectral_scan() - Start spectral scan
  * @pdev: Pointer to pdev object
+ * @vdev_id: VDEV id
  * @smode: Spectral scan mode
  * @err: Spectral error code
  *
@@ -2135,6 +2148,7 @@ target_if_init_spectral_capability(struct target_if_spectral *spectral,
  * Return: QDF_STATUS_SUCCESS in case of success, else QDF_STATUS_E_FAILURE
  */
 QDF_STATUS target_if_start_spectral_scan(struct wlan_objmgr_pdev *pdev,
+					 uint8_t vdev_id,
 					 enum spectral_scan_mode smode,
 					 enum spectral_cp_error_code *err);
 

+ 6 - 4
target_if/spectral/target_if_spectral_phyerr.c

@@ -972,7 +972,8 @@ target_if_process_phyerr_gen2(struct target_if_spectral *spectral,
 		params.max_exp = 0;
 		params.peak = 0;
 		params.bin_pwr_data = (uint8_t *)pfft;
-		params.freq = p_sops->get_current_channel(spectral);
+		params.freq = p_sops->get_current_channel(spectral,
+							  params.smode);
 		params.freq_loading = 0;
 
 		params.interf_list.count = 0;
@@ -1970,7 +1971,7 @@ target_if_consume_spectral_report_gen3(
 
 		params.rssi         = rssi;
 
-		vdev = target_if_spectral_get_vdev(spectral);
+		vdev = target_if_spectral_get_vdev(spectral, spectral_mode);
 		if (!vdev) {
 			spectral_info("First vdev is NULL");
 			reset_160mhz_delivery_state_machine(
@@ -1991,7 +1992,8 @@ target_if_consume_spectral_report_gen3(
 
 		params.max_mag  = p_sfft->fft_peak_mag;
 
-		params.freq = p_sops->get_current_channel(spectral);
+		params.freq = p_sops->get_current_channel(spectral,
+							  spectral_mode);
 		params.agile_freq1 = spectral->params[SPECTRAL_SCAN_MODE_AGILE].
 				     ss_frequency.cfreq1;
 		params.agile_freq2 = spectral->params[SPECTRAL_SCAN_MODE_AGILE].
@@ -2112,7 +2114,7 @@ target_if_consume_spectral_report_gen3(
 
 		params.rssi_sec80 = rssi;
 
-		vdev = target_if_spectral_get_vdev(spectral);
+		vdev = target_if_spectral_get_vdev(spectral, spectral_mode);
 		if (!vdev) {
 			spectral_info("First vdev is NULL");
 			reset_160mhz_delivery_state_machine

+ 3 - 2
target_if/spectral/target_if_spectral_sim.c

@@ -841,7 +841,8 @@ target_if_log_sim_spectral_params(struct spectral_config *params)
 uint32_t
 target_if_spectral_sops_sim_configure_params(
 	void *arg,
-	struct spectral_config *params)
+	struct spectral_config *params,
+	enum spectral_scan_mode smode)
 {
 	struct target_if_spectral *spectral = NULL;
 	struct spectralsim_context *simctx = NULL;
@@ -860,7 +861,7 @@ target_if_spectral_sops_sim_configure_params(
 	simctx = (struct spectralsim_context *)spectral->simctx;
 	qdf_assert_always(simctx);
 
-	vdev = target_if_spectral_get_vdev(spectral);
+	vdev = target_if_spectral_get_vdev(spectral, smode);
 	if (!vdev) {
 		spectral_warn("Spectral simulation: No VAPs found - not proceeding with param config.");
 		return 0;

+ 6 - 4
target_if/spectral/target_if_spectral_sim.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015,2017-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2015,2017-2020 The Linux Foundation. All rights reserved.
  *
  *
  * Permission to use, copy, modify, and/or distribute this software for
@@ -92,9 +92,10 @@ uint32_t target_if_spectral_sops_sim_stop_scan(void *arg);
 /**
  * target_if_spectral_sops_sim_configure_params() - Configure Spectral
  * parameters into simulation
- * arg - pointer to ath_spectral structure
- * params - pointer to struct spectral_config structure bearing Spectral
+ * @arg: pointer to ath_spectral structure
+ * @params: pointer to struct spectral_config structure bearing Spectral
  *          configuration
+ * @smode: Spectral scan mode
  *
  *  Internally, this function actually searches if a record set with the desired
  *  configuration has been loaded. If so, it points to the record set for
@@ -104,7 +105,8 @@ uint32_t target_if_spectral_sops_sim_stop_scan(void *arg);
  */
 uint32_t target_if_spectral_sops_sim_configure_params(
 	void *arg,
-	struct spectral_config *params);
+	struct spectral_config *params,
+	enum spectral_scan_mode smode);
 
 /**
  * target_if_spectral_sops_sim_get_params() - Get Spectral parameters configured

+ 1 - 0
umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h

@@ -633,6 +633,7 @@ struct wlan_lmac_if_sptrl_tx_ops {
 					 enum spectral_scan_mode smode);
 	QDF_STATUS (*sptrlto_start_spectral_scan)
 					(struct wlan_objmgr_pdev *pdev,
+					 uint8_t vdev_id,
 					 const enum spectral_scan_mode smode,
 					 enum spectral_cp_error_code *err);
 	QDF_STATUS (*sptrlto_stop_spectral_scan)