소스 검색

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;