소스 검색

qcacld-3.0: Use objmgr api to get the vdev for pmo

Currently pmo_psoc_get_vdev api just returns the vdev without
taking the vdev reference and it is caller's responsibility to
take the reference, there could be a race condition where after
getting the vdev and before getting the reference of that vdev,
some other thread may delete this vdev.

To avoid this issue use objmgr api to get the vdev for pmo.

Change-Id: I3495589e2dbbb7d8efc579a62fff1a08a92c318f
CRs-Fixed: 2771211
Abdul Muqtadeer Ahmed 4 년 전
부모
커밋
8e37d3f6eb

+ 1 - 17
components/pmo/core/inc/wlan_pmo_objmgr.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -41,7 +41,6 @@
 #define pmo_peer_put_ref(peer) wlan_objmgr_peer_release_ref(peer, WLAN_PMO_ID)
 
 #define pmo_vdev_get_ref(vdev) wlan_objmgr_vdev_try_get_ref(vdev, WLAN_PMO_ID)
-#define pmo_vdev_put_ref(vdev) wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID)
 
 #define pmo_pdev_get_ref(pdev) wlan_objmgr_pdev_try_get_ref(pdev, WLAN_PMO_ID)
 #define pmo_pdev_put_ref(pdev) wlan_objmgr_pdev_release_ref(pdev, WLAN_PMO_ID)
@@ -120,21 +119,6 @@ pmo_vdev_get_id(struct wlan_objmgr_vdev *vdev)
 
 /* Tree Navigation: psoc */
 
-static inline struct wlan_objmgr_vdev *
-pmo_psoc_get_vdev(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
-{
-	struct wlan_objmgr_vdev *vdev;
-
-	if (vdev_id >= WLAN_UMAC_PSOC_MAX_VDEVS)
-		return NULL;
-
-	wlan_psoc_obj_lock(psoc);
-	vdev = psoc->soc_objmgr.wlan_vdev_list[vdev_id];
-	wlan_psoc_obj_unlock(psoc);
-
-	return vdev;
-}
-
 static inline struct pmo_psoc_priv_obj *
 pmo_psoc_get_priv(struct wlan_objmgr_psoc *psoc)
 {

+ 12 - 18
components/pmo/core/src/wlan_pmo_arp.c

@@ -214,21 +214,17 @@ QDF_STATUS pmo_core_arp_check_offload(struct wlan_objmgr_psoc *psoc,
 	bool active_offload_cond, is_applied_cond;
 	enum QDF_OPMODE opmode;
 
-	vdev = pmo_psoc_get_vdev(psoc, vdev_id);
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, WLAN_PMO_ID);
 	if (!vdev) {
 		pmo_err("vdev is NULL");
 		status = QDF_STATUS_E_INVAL;
 		goto out;
 	}
 
-	status = pmo_vdev_get_ref(vdev);
-	if (QDF_IS_STATUS_ERROR(status))
-		goto out;
-
 	opmode = pmo_get_vdev_opmode(vdev);
 	if (opmode == QDF_NDI_MODE) {
 		pmo_debug("ARP offload is not supported in NaN mode");
-		pmo_vdev_put_ref(vdev);
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 		return QDF_STATUS_E_INVAL;
 	}
 
@@ -245,11 +241,11 @@ QDF_STATUS pmo_core_arp_check_offload(struct wlan_objmgr_psoc *psoc,
 
 		if (active_offload_cond && is_applied_cond) {
 			pmo_debug("active offload is enabled and offload already sent");
-			pmo_vdev_put_ref(vdev);
+			wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 			return QDF_STATUS_E_INVAL;
 		}
 	}
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 	return status;
 }
@@ -271,17 +267,15 @@ QDF_STATUS pmo_core_cache_arp_offload_req(struct pmo_arp_req *arp_req)
 		goto out;
 	}
 
-	vdev = pmo_psoc_get_vdev(arp_req->psoc, arp_req->vdev_id);
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(arp_req->psoc,
+						    arp_req->vdev_id,
+						    WLAN_PMO_ID);
 	if (!vdev) {
 		pmo_err("vdev is NULL");
 		status = QDF_STATUS_E_INVAL;
 		goto out;
 	}
 
-	status = pmo_vdev_get_ref(vdev);
-	if (QDF_IS_STATUS_ERROR(status))
-		goto out;
-
 	status = pmo_core_arp_offload_sanity(vdev);
 	if (status != QDF_STATUS_SUCCESS)
 		goto dec_ref;
@@ -291,7 +285,7 @@ QDF_STATUS pmo_core_cache_arp_offload_req(struct pmo_arp_req *arp_req)
 
 	status = pmo_core_cache_arp_in_vdev_priv(arp_req, vdev);
 dec_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 
 	return status;
@@ -322,7 +316,7 @@ QDF_STATUS pmo_core_flush_arp_offload_req(struct wlan_objmgr_vdev *vdev)
 
 	status = pmo_core_flush_arp_from_vdev_priv(vdev);
 def_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 	pmo_exit();
 
@@ -356,7 +350,7 @@ QDF_STATUS pmo_core_enable_arp_offload_in_fwr(struct wlan_objmgr_vdev *vdev,
 	status = pmo_core_do_enable_arp_offload(vdev, vdev_id, trigger);
 
 put_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:;
 
 	return status;
@@ -388,7 +382,7 @@ QDF_STATUS pmo_core_disable_arp_offload_in_fwr(struct wlan_objmgr_vdev *vdev,
 
 	status = pmo_core_do_disable_arp_offload(vdev, vdev_id, trigger);
 def_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 
 	return status;
@@ -430,7 +424,7 @@ pmo_core_get_arp_offload_params(struct wlan_objmgr_vdev *vdev,
 	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
 
 put_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 	pmo_exit();
 

+ 5 - 5
components/pmo/core/src/wlan_pmo_gtk.c

@@ -216,7 +216,7 @@ QDF_STATUS pmo_core_cache_gtk_offload_req(struct wlan_objmgr_vdev *vdev,
 
 	status = pmo_core_cache_gtk_req_in_vdev_priv(vdev, gtk_req);
 dec_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 
 	return status;
@@ -250,7 +250,7 @@ QDF_STATUS pmo_core_flush_gtk_offload_req(struct wlan_objmgr_vdev *vdev)
 
 	status = pmo_core_flush_gtk_req_from_vdev_priv(vdev);
 dec_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 
 	return status;
@@ -282,7 +282,7 @@ QDF_STATUS pmo_core_enable_gtk_offload_in_fwr(struct wlan_objmgr_vdev *vdev)
 	}
 	status = pmo_core_do_enable_gtk_offload(vdev, vdev_ctx, op_gtk_req);
 dec_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 	if (op_gtk_req)
 		qdf_mem_free(op_gtk_req);
@@ -318,7 +318,7 @@ QDF_STATUS pmo_core_disable_gtk_offload_in_fwr(struct wlan_objmgr_vdev *vdev)
 
 	status = pmo_core_do_disable_gtk_offload(vdev, vdev_ctx, op_gtk_req);
 dec_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 	if (op_gtk_req)
 		qdf_mem_free(op_gtk_req);
@@ -358,7 +358,7 @@ QDF_STATUS pmo_core_get_gtk_rsp(struct wlan_objmgr_vdev *vdev,
 	/* send cmd to fwr */
 	status = pmo_tgt_get_gtk_rsp(vdev);
 dec_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 	pmo_exit();
 

+ 5 - 5
components/pmo/core/src/wlan_pmo_hw_filter.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2020 The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -41,7 +41,7 @@ QDF_STATUS pmo_core_enable_hw_filter_in_fwr(struct wlan_objmgr_vdev *vdev)
 
 	if (wlan_vdev_is_up(vdev) != QDF_STATUS_SUCCESS) {
 		status = QDF_STATUS_E_NOSUPPORT;
-		pmo_vdev_put_ref(vdev);
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 		goto exit_with_status;
 	}
 
@@ -55,7 +55,7 @@ QDF_STATUS pmo_core_enable_hw_filter_in_fwr(struct wlan_objmgr_vdev *vdev)
 	req.enable = true;
 	status = pmo_tgt_conf_hw_filter(pmo_vdev_get_psoc(vdev), &req);
 
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 
 exit_with_status:
 	pmo_exit();
@@ -78,7 +78,7 @@ QDF_STATUS pmo_core_disable_hw_filter_in_fwr(struct wlan_objmgr_vdev *vdev)
 
 	if (wlan_vdev_is_up(vdev) != QDF_STATUS_SUCCESS) {
 		status = QDF_STATUS_E_NOSUPPORT;
-		pmo_vdev_put_ref(vdev);
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 		goto exit_with_status;
 	}
 
@@ -92,7 +92,7 @@ QDF_STATUS pmo_core_disable_hw_filter_in_fwr(struct wlan_objmgr_vdev *vdev)
 	req.enable = false;
 	status = pmo_tgt_conf_hw_filter(pmo_vdev_get_psoc(vdev), &req);
 
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 
 exit_with_status:
 	pmo_exit();

+ 18 - 56
components/pmo/core/src/wlan_pmo_mc_addr_filtering.c

@@ -113,7 +113,7 @@ QDF_STATUS pmo_core_enhanced_mc_filter_enable(struct wlan_objmgr_vdev *vdev)
 
 	pmo_tgt_send_enhance_multicast_offload_req(vdev, true);
 
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 
 exit_with_status:
 
@@ -132,7 +132,7 @@ QDF_STATUS pmo_core_enhanced_mc_filter_disable(struct wlan_objmgr_vdev *vdev)
 
 	pmo_tgt_send_enhance_multicast_offload_req(vdev, false);
 
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 
 exit_with_status:
 	pmo_exit();
@@ -248,29 +248,22 @@ uint8_t pmo_core_max_mc_addr_supported(struct wlan_objmgr_psoc *psoc)
 int pmo_core_get_mc_addr_list_count(struct wlan_objmgr_psoc *psoc,
 		uint8_t vdev_id)
 {
-	QDF_STATUS status;
 	struct wlan_objmgr_vdev *vdev;
 	struct pmo_vdev_priv_obj *vdev_ctx;
 	uint8_t mc_cnt;
 
-	vdev = pmo_psoc_get_vdev(psoc, vdev_id);
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, WLAN_PMO_ID);
 	if (!vdev) {
 		pmo_err("vdev is NULL");
 		return PMO_INVALID_MC_ADDR_COUNT;
 	}
 
-	status = pmo_vdev_get_ref(vdev);
-	if (QDF_IS_STATUS_ERROR(status)) {
-		pmo_warn("failed to get vdev reference");
-		return PMO_INVALID_MC_ADDR_COUNT;
-	}
-
 	vdev_ctx = pmo_vdev_get_priv(vdev);
 	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
 	mc_cnt = vdev_ctx->vdev_mc_list_req.mc_cnt;
 	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
 
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 
 	return mc_cnt;
 }
@@ -278,28 +271,21 @@ int pmo_core_get_mc_addr_list_count(struct wlan_objmgr_psoc *psoc,
 void pmo_core_set_mc_addr_list_count(struct wlan_objmgr_psoc *psoc,
 		uint8_t vdev_id, uint8_t count)
 {
-	QDF_STATUS status;
 	struct pmo_vdev_priv_obj *vdev_ctx;
 	struct wlan_objmgr_vdev *vdev;
 
-	vdev = pmo_psoc_get_vdev(psoc, vdev_id);
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, WLAN_PMO_ID);
 	if (!vdev) {
 		pmo_err("vdev is NULL");
 		return;
 	}
 
-	status = pmo_vdev_get_ref(vdev);
-	if (QDF_IS_STATUS_ERROR(status)) {
-		pmo_warn("failed to get vdev reference");
-		return;
-	}
-
 	vdev_ctx = pmo_vdev_get_priv(vdev);
 	qdf_spin_lock_bh(&vdev_ctx->pmo_vdev_lock);
 	vdev_ctx->vdev_mc_list_req.mc_cnt = count;
 	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
 
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 }
 
 static QDF_STATUS pmo_core_mc_addr_flitering_sanity(
@@ -346,20 +332,15 @@ QDF_STATUS pmo_core_cache_mc_addr_list(
 		goto out;
 	}
 
-	vdev = pmo_psoc_get_vdev(mc_list_config->psoc, mc_list_config->vdev_id);
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(mc_list_config->psoc,
+						    mc_list_config->vdev_id,
+						    WLAN_PMO_ID);
 	if (!vdev) {
 		pmo_err("vdev is NULL");
 		status = QDF_STATUS_E_NULL_VALUE;
 		goto out;
 	}
 
-	status = pmo_vdev_get_ref(vdev);
-	if (QDF_IS_STATUS_ERROR(status)) {
-		pmo_warn("failed to get vdev reference");
-		status = QDF_STATUS_E_INVAL;
-		goto out;
-	}
-
 	status = pmo_core_mc_addr_flitering_sanity(vdev);
 	if (status != QDF_STATUS_SUCCESS)
 		goto dec_ref;
@@ -370,7 +351,7 @@ QDF_STATUS pmo_core_cache_mc_addr_list(
 	status = pmo_core_cache_mc_addr_list_in_vdev_priv(mc_list_config, vdev);
 
 dec_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 
 	return status;
@@ -388,20 +369,13 @@ QDF_STATUS pmo_core_flush_mc_addr_list(struct wlan_objmgr_psoc *psoc,
 		goto out;
 	}
 
-	vdev = pmo_psoc_get_vdev(psoc, vdev_id);
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, WLAN_PMO_ID);
 	if (!vdev) {
 		pmo_err("vdev is NULL");
 		status = QDF_STATUS_E_NULL_VALUE;
 		goto out;
 	}
 
-	status = pmo_vdev_get_ref(vdev);
-	if (QDF_IS_STATUS_ERROR(status)) {
-		pmo_warn("failed to get vdev reference");
-		status = QDF_STATUS_E_INVAL;
-		goto out;
-	}
-
 	status = pmo_core_mc_addr_flitering_sanity(vdev);
 	if (status != QDF_STATUS_SUCCESS)
 		goto dec_ref;
@@ -412,7 +386,7 @@ QDF_STATUS pmo_core_flush_mc_addr_list(struct wlan_objmgr_psoc *psoc,
 	status = pmo_core_flush_mc_addr_list_from_vdev_priv(vdev);
 
 dec_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 
 	return status;
@@ -479,17 +453,13 @@ QDF_STATUS pmo_core_enable_mc_addr_filtering_in_fwr(
 	if (QDF_IS_STATUS_ERROR(status))
 		goto exit_with_status;
 
-	vdev = pmo_psoc_get_vdev(psoc, vdev_id);
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, WLAN_PMO_ID);
 	if (!vdev) {
 		pmo_err("vdev is NULL");
 		status = QDF_STATUS_E_INVAL;
 		goto put_psoc;
 	}
 
-	status = pmo_vdev_get_ref(vdev);
-	if (QDF_IS_STATUS_ERROR(status))
-		goto put_psoc;
-
 	status = pmo_core_mc_addr_flitering_sanity(vdev);
 	if (status != QDF_STATUS_SUCCESS)
 		goto put_vdev;
@@ -503,7 +473,7 @@ QDF_STATUS pmo_core_enable_mc_addr_filtering_in_fwr(
 	status = pmo_core_handle_enable_mc_list_trigger(vdev, trigger);
 
 put_vdev:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 
 put_psoc:
 	pmo_psoc_put_ref(psoc);
@@ -576,17 +546,13 @@ QDF_STATUS pmo_core_disable_mc_addr_filtering_in_fwr(
 		goto out;
 	}
 
-	vdev = pmo_psoc_get_vdev(psoc, vdev_id);
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, WLAN_PMO_ID);
 	if (!vdev) {
 		pmo_err("vdev is NULL");
 		status = QDF_STATUS_E_NULL_VALUE;
 		goto out;
 	}
 
-	status = pmo_vdev_get_ref(vdev);
-	if (QDF_IS_STATUS_ERROR(status))
-		goto out;
-
 	status = pmo_core_mc_addr_flitering_sanity(vdev);
 	if (status != QDF_STATUS_SUCCESS)
 		goto put_ref;
@@ -601,7 +567,7 @@ QDF_STATUS pmo_core_disable_mc_addr_filtering_in_fwr(
 	status = pmo_core_handle_disable_mc_list_trigger(vdev, trigger);
 
 put_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 
 out:
 
@@ -628,17 +594,13 @@ pmo_core_get_mc_addr_list(struct wlan_objmgr_psoc *psoc,
 	if (QDF_IS_STATUS_ERROR(status))
 		goto exit_with_status;
 
-	vdev = pmo_psoc_get_vdev(psoc, vdev_id);
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, WLAN_PMO_ID);
 	if (!vdev) {
 		pmo_err("vdev is NULL");
 		status = QDF_STATUS_E_INVAL;
 		goto put_psoc;
 	}
 
-	status = pmo_vdev_get_ref(vdev);
-	if (QDF_IS_STATUS_ERROR(status))
-		goto put_psoc;
-
 	status = pmo_core_mc_addr_flitering_sanity(vdev);
 	if (status != QDF_STATUS_SUCCESS)
 		goto put_vdev;
@@ -649,7 +611,7 @@ pmo_core_get_mc_addr_list(struct wlan_objmgr_psoc *psoc,
 	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
 
 put_vdev:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 
 put_psoc:
 	pmo_psoc_put_ref(psoc);

+ 12 - 18
components/pmo/core/src/wlan_pmo_ns.c

@@ -253,21 +253,17 @@ QDF_STATUS pmo_core_ns_check_offload(struct wlan_objmgr_psoc *psoc,
 	bool active_offload_cond, is_applied_cond;
 	enum QDF_OPMODE opmode;
 
-	vdev = pmo_psoc_get_vdev(psoc, vdev_id);
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, WLAN_PMO_ID);
 	if (!vdev) {
 		pmo_err("vdev is NULL");
 		status = QDF_STATUS_E_INVAL;
 		goto out;
 	}
 
-	status = pmo_vdev_get_ref(vdev);
-	if (QDF_IS_STATUS_ERROR(status))
-		goto out;
-
 	opmode = pmo_get_vdev_opmode(vdev);
 	if (opmode == QDF_NDI_MODE) {
 		pmo_debug("NS offload not supported in NaN mode");
-		pmo_vdev_put_ref(vdev);
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 		return QDF_STATUS_E_INVAL;
 	}
 
@@ -284,11 +280,11 @@ QDF_STATUS pmo_core_ns_check_offload(struct wlan_objmgr_psoc *psoc,
 
 		if (active_offload_cond && is_applied_cond) {
 			pmo_debug("active offload is enabled and offload already sent");
-			pmo_vdev_put_ref(vdev);
+			wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 			return QDF_STATUS_E_INVAL;
 		}
 	}
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 	return status;
 }
@@ -310,17 +306,15 @@ QDF_STATUS pmo_core_cache_ns_offload_req(struct pmo_ns_req *ns_req)
 		goto out;
 	}
 
-	vdev = pmo_psoc_get_vdev(ns_req->psoc, ns_req->vdev_id);
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(ns_req->psoc,
+						    ns_req->vdev_id,
+						    WLAN_PMO_ID);
 	if (!vdev) {
 		pmo_err("vdev is NULL");
 		status = QDF_STATUS_E_INVAL;
 		goto out;
 	}
 
-	status = pmo_vdev_get_ref(vdev);
-	if (QDF_IS_STATUS_ERROR(status))
-		goto out;
-
 	status = pmo_core_ns_offload_sanity(vdev);
 	if (status != QDF_STATUS_SUCCESS)
 		goto dec_ref;
@@ -333,7 +327,7 @@ QDF_STATUS pmo_core_cache_ns_offload_req(struct pmo_ns_req *ns_req)
 
 	status = pmo_core_cache_ns_in_vdev_priv(ns_req, vdev);
 dec_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 
 	return status;
@@ -364,7 +358,7 @@ QDF_STATUS pmo_core_flush_ns_offload_req(struct wlan_objmgr_vdev *vdev)
 
 	status = pmo_core_flush_ns_from_vdev_priv(vdev);
 dec_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 	pmo_exit();
 
@@ -423,7 +417,7 @@ skip_ns_dynamic_check:
 		vdev_id, vdev, trigger);
 	status = pmo_core_do_enable_ns_offload(vdev, vdev_id, trigger);
 dec_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 
 	return status;
@@ -474,7 +468,7 @@ skip_ns_dynamic_check:
 
 	status = pmo_core_do_disable_ns_offload(vdev, vdev_id, trigger);
 dec_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 	pmo_exit();
 
@@ -516,7 +510,7 @@ pmo_core_get_ns_offload_params(struct wlan_objmgr_vdev *vdev,
 	qdf_spin_unlock_bh(&vdev_ctx->pmo_vdev_lock);
 
 dec_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 	pmo_exit();
 

+ 15 - 25
components/pmo/core/src/wlan_pmo_suspend_resume.c

@@ -316,7 +316,6 @@ static void pmo_core_set_suspend_dtim(struct wlan_objmgr_psoc *psoc)
 	struct pmo_vdev_priv_obj *vdev_ctx;
 	struct pmo_psoc_priv_obj *psoc_ctx;
 	bool li_offload_support = false;
-	QDF_STATUS status;
 
 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
 		li_offload_support = psoc_ctx->caps.li_offload;
@@ -327,20 +326,17 @@ static void pmo_core_set_suspend_dtim(struct wlan_objmgr_psoc *psoc)
 
 	/* Iterate through VDEV list */
 	for (vdev_id = 0; vdev_id < WLAN_UMAC_PSOC_MAX_VDEVS; vdev_id++) {
-		vdev = pmo_psoc_get_vdev(psoc, vdev_id);
+		vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+							    WLAN_PMO_ID);
 		if (!vdev)
 			continue;
 
-		status = pmo_vdev_get_ref(vdev);
-		if (QDF_IS_STATUS_ERROR(status))
-			continue;
-
 		vdev_ctx = pmo_vdev_get_priv(vdev);
 		if (!pmo_is_listen_interval_user_set(vdev_ctx)
 		    && !li_offload_support)
 			pmo_core_set_vdev_suspend_dtim(psoc, vdev, vdev_ctx);
 		pmo_configure_vdev_suspend_params(psoc, vdev, vdev_ctx);
-		pmo_vdev_put_ref(vdev);
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 	}
 }
 
@@ -386,7 +382,8 @@ void pmo_core_configure_dynamic_wake_events(struct wlan_objmgr_psoc *psoc)
 		qdf_mem_zero(enable_mask,  sizeof(uint32_t) * BM_LEN);
 		qdf_mem_zero(disable_mask, sizeof(uint32_t) * BM_LEN);
 
-		vdev = pmo_psoc_get_vdev(psoc, vdev_id);
+		vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+							    WLAN_PMO_ID);
 		if (!vdev)
 			continue;
 
@@ -433,19 +430,16 @@ static void pmo_core_enable_runtime_pm_offloads(struct wlan_objmgr_psoc *psoc)
 {
 	uint8_t vdev_id;
 	struct wlan_objmgr_vdev *vdev;
-	QDF_STATUS status;
 
 	/* Iterate through VDEV list */
 	for (vdev_id = 0; vdev_id < WLAN_UMAC_PSOC_MAX_VDEVS; vdev_id++) {
-		vdev = pmo_psoc_get_vdev(psoc, vdev_id);
+		vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+							    WLAN_PMO_ID);
 		if (!vdev)
 			continue;
-		status = pmo_vdev_get_ref(vdev);
-		if (QDF_IS_STATUS_ERROR(status))
-			continue;
 
 		pmo_register_action_frame_patterns(vdev, QDF_RUNTIME_SUSPEND);
-		pmo_vdev_put_ref(vdev);
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 	}
 }
 
@@ -462,7 +456,7 @@ static void pmo_core_disable_runtime_pm_offloads(struct wlan_objmgr_psoc *psoc)
 			continue;
 
 		pmo_clear_action_frame_patterns(vdev);
-		pmo_vdev_put_ref(vdev);
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 	}
 }
 
@@ -602,7 +596,6 @@ static void pmo_core_set_resume_dtim(struct wlan_objmgr_psoc *psoc)
 	struct pmo_vdev_priv_obj *vdev_ctx;
 	struct pmo_psoc_priv_obj *psoc_ctx;
 	bool li_offload_support = false;
-	QDF_STATUS status;
 
 	pmo_psoc_with_ctx(psoc, psoc_ctx) {
 		li_offload_support = psoc_ctx->caps.li_offload;
@@ -613,20 +606,17 @@ static void pmo_core_set_resume_dtim(struct wlan_objmgr_psoc *psoc)
 
 	/* Iterate through VDEV list */
 	for (vdev_id = 0; vdev_id < WLAN_UMAC_PSOC_MAX_VDEVS; vdev_id++) {
-		vdev = pmo_psoc_get_vdev(psoc, vdev_id);
+		vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+							    WLAN_PMO_ID);
 		if (!vdev)
 			continue;
 
-		status = pmo_vdev_get_ref(vdev);
-		if (QDF_IS_STATUS_ERROR(status))
-			continue;
-
 		vdev_ctx = pmo_vdev_get_priv(vdev);
 		if (!pmo_is_listen_interval_user_set(vdev_ctx)
 		    && !li_offload_support)
 			pmo_core_set_vdev_resume_dtim(psoc, vdev, vdev_ctx);
 		pmo_configure_vdev_resume_params(psoc, vdev, vdev_ctx);
-		pmo_vdev_put_ref(vdev);
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 	}
 }
 
@@ -1565,7 +1555,7 @@ QDF_STATUS pmo_core_config_listen_interval(struct wlan_objmgr_vdev *vdev,
 	}
 
 dec_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 	pmo_exit();
 
@@ -1606,7 +1596,7 @@ QDF_STATUS pmo_core_config_modulated_dtim(struct wlan_objmgr_vdev *vdev,
 
 	if (!max_dtim) {
 		pmo_err("Invalid dtim period");
-		pmo_vdev_put_ref(vdev);
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 		return QDF_STATUS_E_INVAL;
 	}
 
@@ -1655,7 +1645,7 @@ QDF_STATUS pmo_core_config_modulated_dtim(struct wlan_objmgr_vdev *vdev,
 		}
 	}
 
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 	pmo_exit();
 	return status;

+ 13 - 31
components/pmo/core/src/wlan_pmo_wow.c

@@ -66,7 +66,7 @@ QDF_STATUS pmo_core_del_wow_pattern(struct wlan_objmgr_vdev *vdev)
 	for (id = 0; id < pattern_count; id++)
 		status = pmo_tgt_del_wow_pattern(vdev, id, true);
 
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 	return status;
 }
@@ -130,7 +130,7 @@ QDF_STATUS pmo_core_add_wow_user_pattern(struct wlan_objmgr_vdev *vdev,
 	if (status != QDF_STATUS_SUCCESS)
 		pmo_err("Failed to add wow pattern %d", ptrn->pattern_id);
 
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 	pmo_exit();
 
@@ -164,7 +164,7 @@ QDF_STATUS pmo_core_del_wow_user_pattern(struct wlan_objmgr_vdev *vdev,
 	if (!pmo_get_wow_user_ptrn(vdev_ctx))
 		pmo_register_wow_default_patterns(vdev);
 rel_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 	pmo_exit();
 
@@ -175,7 +175,6 @@ void pmo_core_enable_wakeup_event(struct wlan_objmgr_psoc *psoc,
 				  uint32_t vdev_id,
 				  WOW_WAKE_EVENT_TYPE wow_event)
 {
-	QDF_STATUS status;
 	struct wlan_objmgr_vdev *vdev;
 	uint32_t bitmap[PMO_WOW_MAX_EVENT_BM_LEN] = {0};
 
@@ -186,21 +185,17 @@ void pmo_core_enable_wakeup_event(struct wlan_objmgr_psoc *psoc,
 		goto out;
 	}
 
-	vdev = pmo_psoc_get_vdev(psoc, vdev_id);
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, WLAN_PMO_ID);
 	if (!vdev) {
 		pmo_err("vdev is NULL");
 		goto out;
 	}
 
-	status = pmo_vdev_get_ref(vdev);
-	if (QDF_IS_STATUS_ERROR(status))
-		goto out;
-
 	pmo_set_wow_event_bitmap(wow_event, PMO_WOW_MAX_EVENT_BM_LEN, bitmap);
 
 	pmo_tgt_enable_wow_wakeup_event(vdev, bitmap);
 
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 
 out:
 	pmo_exit();
@@ -210,7 +205,6 @@ void pmo_core_disable_wakeup_event(struct wlan_objmgr_psoc *psoc,
 				   uint32_t vdev_id,
 				   WOW_WAKE_EVENT_TYPE wow_event)
 {
-	QDF_STATUS status;
 	struct wlan_objmgr_vdev *vdev;
 	uint32_t bitmap[PMO_WOW_MAX_EVENT_BM_LEN] = {0};
 
@@ -219,21 +213,17 @@ void pmo_core_disable_wakeup_event(struct wlan_objmgr_psoc *psoc,
 		return;
 	}
 
-	vdev = pmo_psoc_get_vdev(psoc, vdev_id);
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, WLAN_PMO_ID);
 	if (!vdev) {
 		pmo_err("vdev is NULL");
 		return;
 	}
 
-	status = pmo_vdev_get_ref(vdev);
-	if (QDF_IS_STATUS_ERROR(status))
-		return;
-
 	pmo_set_wow_event_bitmap(wow_event, PMO_WOW_MAX_EVENT_BM_LEN, bitmap);
 
 	pmo_tgt_disable_wow_wakeup_event(vdev, bitmap);
 
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 }
 
 /**
@@ -249,23 +239,19 @@ bool pmo_is_beaconing_vdev_up(struct wlan_objmgr_psoc *psoc)
 	struct wlan_objmgr_vdev *vdev;
 	enum QDF_OPMODE vdev_opmode;
 	bool is_beaconing;
-	QDF_STATUS status;
 
 	/* Iterate through VDEV list */
 	for (vdev_id = 0; vdev_id < WLAN_UMAC_PSOC_MAX_VDEVS; vdev_id++) {
-		vdev = pmo_psoc_get_vdev(psoc, vdev_id);
+		vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+							    WLAN_PMO_ID);
 		if (!vdev)
 			continue;
 
-		status = pmo_vdev_get_ref(vdev);
-		if (QDF_IS_STATUS_ERROR(status))
-			continue;
-
 		vdev_opmode = pmo_get_vdev_opmode(vdev);
 		is_beaconing = pmo_is_vdev_in_beaconning_mode(vdev_opmode) &&
 			       QDF_IS_STATUS_SUCCESS(wlan_vdev_is_up(vdev));
 
-		pmo_vdev_put_ref(vdev);
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 
 		if (is_beaconing)
 			return true;
@@ -298,7 +284,6 @@ bool pmo_core_is_wow_applicable(struct wlan_objmgr_psoc *psoc)
 	int vdev_id;
 	struct wlan_objmgr_vdev *vdev;
 	bool is_wow_applicable = false;
-	QDF_STATUS status;
 
 	if (!psoc) {
 		pmo_err("psoc is null");
@@ -327,14 +312,11 @@ bool pmo_core_is_wow_applicable(struct wlan_objmgr_psoc *psoc)
 
 	/* Iterate through VDEV list */
 	for (vdev_id = 0; vdev_id < WLAN_UMAC_PSOC_MAX_VDEVS; vdev_id++) {
-		vdev = pmo_psoc_get_vdev(psoc, vdev_id);
+		vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+							    WLAN_PMO_ID);
 		if (!vdev)
 			continue;
 
-		status = pmo_vdev_get_ref(vdev);
-		if (QDF_IS_STATUS_ERROR(status))
-			continue;
-
 		if (wlan_vdev_is_up(vdev) == QDF_STATUS_SUCCESS) {
 			pmo_debug("STA is connected, enabling wow");
 			is_wow_applicable = true;
@@ -353,7 +335,7 @@ bool pmo_core_is_wow_applicable(struct wlan_objmgr_psoc *psoc)
 			is_wow_applicable = true;
 		}
 
-		pmo_vdev_put_ref(vdev);
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 
 		if (is_wow_applicable)
 			return true;

+ 1 - 1
components/pmo/dispatcher/src/wlan_pmo_obj_mgmt_api.c

@@ -282,7 +282,7 @@ QDF_STATUS pmo_vdev_ready(struct wlan_objmgr_vdev *vdev)
 	/* Register default wow patterns with firmware */
 	pmo_register_wow_default_patterns(vdev);
 
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 
 	/*
 	 * The above APIs should return a status but don't.

+ 3 - 6
components/pmo/dispatcher/src/wlan_pmo_tgt_gtk.c

@@ -129,7 +129,8 @@ QDF_STATUS pmo_tgt_gtk_rsp_evt(struct wlan_objmgr_psoc *psoc,
 		goto out;
 	}
 
-	vdev = pmo_psoc_get_vdev(psoc, rsp_param->vdev_id);
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, rsp_param->vdev_id,
+						    WLAN_PMO_ID);
 	if (!vdev) {
 		pmo_err("vdev is null vdev_id:%d psoc:%pK",
 			rsp_param->vdev_id, psoc);
@@ -137,10 +138,6 @@ QDF_STATUS pmo_tgt_gtk_rsp_evt(struct wlan_objmgr_psoc *psoc,
 		goto out;
 	}
 
-	status = pmo_vdev_get_ref(vdev);
-	if (QDF_IS_STATUS_ERROR(status))
-		goto out;
-
 	vdev_ctx = pmo_vdev_get_priv(vdev);
 
 	status = pmo_get_vdev_bss_peer_mac_addr(vdev, &rsp_param->bssid);
@@ -169,7 +166,7 @@ QDF_STATUS pmo_tgt_gtk_rsp_evt(struct wlan_objmgr_psoc *psoc,
 	}
 
 dec_ref:
-	pmo_vdev_put_ref(vdev);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
 out:
 	pmo_exit();