浏览代码

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 年之前
父节点
当前提交
5356e7c203
共有 1 个文件被更改,包括 90 次插入12 次删除
  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;