Browse Source

qcacld-3.0: Pass vdev object when starting spectral scan

It starts spectral scan without vdev object, and uses the first vdev
as current vdev. which cause vdev mismatch in some platform. So pass
vdev object when starting spectral scan.

Change-Id: I7571d2f3716079969de872372779aa28d60c82ce
CRs-Fixed: 2716454
Wu Gao 4 years ago
parent
commit
5356e7c203
1 changed files with 90 additions and 12 deletions
  1. 90 12
      core/hdd/src/wlan_hdd_spectralscan.c

+ 90 - 12
core/hdd/src/wlan_hdd_spectralscan.c

@@ -59,6 +59,7 @@ static int __wlan_hdd_cfg80211_spectral_scan_start(struct wiphy *wiphy,
 	struct hdd_context *hdd_ctx = wiphy_priv(wiphy);
 	struct net_device *dev = wdev->netdev;
 	struct hdd_adapter *adapter;
+	struct wlan_objmgr_vdev *vdev;
 
 	hdd_enter();
 
@@ -72,13 +73,20 @@ static int __wlan_hdd_cfg80211_spectral_scan_start(struct wiphy *wiphy,
 	}
 
 	adapter = WLAN_HDD_GET_PRIV_PTR(dev);
-	if (wlan_hdd_validate_vdev_id(adapter->vdev_id))
-		return -EINVAL;
+	ret = hdd_validate_adapter(adapter);
+	if (ret)
+		return ret;
 
+	vdev = hdd_objmgr_get_vdev(adapter);
+	if (!vdev) {
+		hdd_err("can't get vdev");
+		return -EINVAL;
+	}
 	wlan_spectral_update_rx_chainmask(adapter);
-	ret = wlan_cfg80211_spectral_scan_config_and_start(wiphy,
-					hdd_ctx->pdev,
-					data, data_len);
+	ret = wlan_cfg80211_spectral_scan_config_and_start(
+						wiphy, hdd_ctx->pdev,
+						vdev, data, data_len);
+	hdd_objmgr_put_vdev(vdev);
 	hdd_exit();
 
 	return ret;
@@ -102,6 +110,9 @@ static int __wlan_hdd_cfg80211_spectral_scan_stop(struct wiphy *wiphy,
 {
 	int ret;
 	struct hdd_context *hdd_ctx = wiphy_priv(wiphy);
+	struct net_device *dev = wdev->netdev;
+	struct hdd_adapter *adapter;
+	struct wlan_objmgr_vdev *vdev;
 
 	hdd_enter();
 
@@ -114,8 +125,19 @@ static int __wlan_hdd_cfg80211_spectral_scan_stop(struct wiphy *wiphy,
 		return -EPERM;
 	}
 
+	adapter = WLAN_HDD_GET_PRIV_PTR(dev);
+	ret = hdd_validate_adapter(adapter);
+	if (ret)
+		return ret;
+
+	vdev = hdd_objmgr_get_vdev(adapter);
+	if (!vdev) {
+		hdd_err("can't get vdev");
+		return -EINVAL;
+	}
 	ret = wlan_cfg80211_spectral_scan_stop(wiphy, hdd_ctx->pdev,
-					       data, data_len);
+					       vdev, data, data_len);
+	hdd_objmgr_put_vdev(vdev);
 	hdd_exit();
 
 	return ret;
@@ -140,6 +162,9 @@ static int __wlan_hdd_cfg80211_spectral_scan_get_config(
 {
 	int ret;
 	struct hdd_context *hdd_ctx = wiphy_priv(wiphy);
+	struct net_device *dev = wdev->netdev;
+	struct hdd_adapter *adapter;
+	struct wlan_objmgr_vdev *vdev;
 
 	hdd_enter();
 
@@ -152,8 +177,19 @@ static int __wlan_hdd_cfg80211_spectral_scan_get_config(
 		return -EPERM;
 	}
 
+	adapter = WLAN_HDD_GET_PRIV_PTR(dev);
+	ret = hdd_validate_adapter(adapter);
+	if (ret)
+		return ret;
+
+	vdev = hdd_objmgr_get_vdev(adapter);
+	if (!vdev) {
+		hdd_err("can't get vdev");
+		return -EINVAL;
+	}
 	ret = wlan_cfg80211_spectral_scan_get_config(wiphy, hdd_ctx->pdev,
-						     data, data_len);
+						     vdev, data, data_len);
+	hdd_objmgr_put_vdev(vdev);
 	hdd_exit();
 
 	return ret;
@@ -178,6 +214,9 @@ static int __wlan_hdd_cfg80211_spectral_scan_get_diag_stats(
 {
 	int ret;
 	struct hdd_context *hdd_ctx = wiphy_priv(wiphy);
+	struct net_device *dev = wdev->netdev;
+	struct hdd_adapter *adapter;
+	struct wlan_objmgr_vdev *vdev;
 
 	hdd_enter();
 
@@ -190,9 +229,20 @@ static int __wlan_hdd_cfg80211_spectral_scan_get_diag_stats(
 		return -EPERM;
 	}
 
-	ret = wlan_cfg80211_spectral_scan_get_diag_stats(wiphy,
-					hdd_ctx->pdev,
-					data, data_len);
+	adapter = WLAN_HDD_GET_PRIV_PTR(dev);
+	ret = hdd_validate_adapter(adapter);
+	if (ret)
+		return ret;
+
+	vdev = hdd_objmgr_get_vdev(adapter);
+	if (!vdev) {
+		hdd_err("can't get vdev");
+		return -EINVAL;
+	}
+	ret = wlan_cfg80211_spectral_scan_get_diag_stats(
+						wiphy, hdd_ctx->pdev,
+						vdev, data, data_len);
+	hdd_objmgr_put_vdev(vdev);
 	hdd_exit();
 
 	return ret;
@@ -217,6 +267,9 @@ static int __wlan_hdd_cfg80211_spectral_scan_get_cap_info(
 {
 	int ret;
 	struct hdd_context *hdd_ctx = wiphy_priv(wiphy);
+	struct net_device *dev = wdev->netdev;
+	struct hdd_adapter *adapter;
+	struct wlan_objmgr_vdev *vdev;
 
 	hdd_enter();
 
@@ -229,8 +282,19 @@ static int __wlan_hdd_cfg80211_spectral_scan_get_cap_info(
 		return -EPERM;
 	}
 
+	adapter = WLAN_HDD_GET_PRIV_PTR(dev);
+	ret = hdd_validate_adapter(adapter);
+	if (ret)
+		return ret;
+
+	vdev = hdd_objmgr_get_vdev(adapter);
+	if (!vdev) {
+		hdd_err("can't get vdev");
+		return -EINVAL;
+	}
 	ret = wlan_cfg80211_spectral_scan_get_cap(wiphy, hdd_ctx->pdev,
-						  data, data_len);
+						  vdev, data, data_len);
+	hdd_objmgr_put_vdev(vdev);
 	hdd_exit();
 
 	return ret;
@@ -256,6 +320,9 @@ static int __wlan_hdd_cfg80211_spectral_scan_get_status(
 {
 	int ret;
 	struct hdd_context *hdd_ctx = wiphy_priv(wiphy);
+	struct net_device *dev = wdev->netdev;
+	struct hdd_adapter *adapter;
+	struct wlan_objmgr_vdev *vdev;
 
 	hdd_enter();
 
@@ -268,8 +335,19 @@ static int __wlan_hdd_cfg80211_spectral_scan_get_status(
 		return -EPERM;
 	}
 
+	adapter = WLAN_HDD_GET_PRIV_PTR(dev);
+	ret = hdd_validate_adapter(adapter);
+	if (ret)
+		return ret;
+
+	vdev = hdd_objmgr_get_vdev(adapter);
+	if (!vdev) {
+		hdd_err("can't get vdev");
+		return -EINVAL;
+	}
 	ret = wlan_cfg80211_spectral_scan_get_status(wiphy, hdd_ctx->pdev,
-						     data, data_len);
+						     vdev, data, data_len);
+	hdd_objmgr_put_vdev(vdev);
 	hdd_exit();
 
 	return ret;