qcacmn: Extract pdev id from vdev id received in WMI_CHAN_INFO_EVENTID

Add support in utils layer to extract pdev id from vdev id using object
manager APIs.

Use the API to extract pdev id from vdev id received through the
chan info event handler for lithium based chipsets.

CRs-Fixed: 2043869
Change-Id: Ibf1f1f91d505d53219ca9a2f5d94beb8553edfe3
diff --git a/umac/cmn_services/inc/wlan_cmn.h b/umac/cmn_services/inc/wlan_cmn.h
index 2cc452e..f3ec4b8 100644
--- a/umac/cmn_services/inc/wlan_cmn.h
+++ b/umac/cmn_services/inc/wlan_cmn.h
@@ -48,6 +48,9 @@
 /* Max vdev_id */
 #define WLAN_UMAC_VDEV_ID_MAX 0xFF
 
+/* Invalid pdev_id */
+#define WLAN_INVALID_PDEV_ID 0xFFFFFFFF
+
 /* 802.11 cap info */
 #define WLAN_CAPINFO_ESS               0x0001
 #define WLAN_CAPINFO_IBSS              0x0002
diff --git a/umac/cmn_services/utils/inc/wlan_utility.h b/umac/cmn_services/utils/inc/wlan_utility.h
index dc50c87..ab6559a 100644
--- a/umac/cmn_services/utils/inc/wlan_utility.h
+++ b/umac/cmn_services/utils/inc/wlan_utility.h
@@ -24,6 +24,9 @@
 #define _WLAN_UTILITY_H_
 
 #include <qdf_types.h>
+#include <wlan_objmgr_psoc_obj.h>
+#include <wlan_objmgr_pdev_obj.h>
+#include <wlan_objmgr_vdev_obj.h>
 
 /**
  * wlan_chan_to_freq() - converts channel to frequency
@@ -71,4 +74,19 @@
  * Return: boolean value based on platform type
  */
 bool wlan_is_emulation_platform(uint32_t phy_version);
+
+/**
+ * wlan_get_pdev_id_from_vdev_id() - Helper func to derive pdev id from vdev_id
+ * @psoc    : psoc object
+ * @vdev_id : vdev identifier
+ * @dbg_id  : object manager debug id
+ *
+ * This function is used to derive the pdev id from vdev id for a psoc
+ *
+ * Return : pdev_id - +ve integer for success and WLAN_INVALID_PDEV_ID
+ *          for failure
+ */
+uint32_t wlan_get_pdev_id_from_vdev_id(struct wlan_objmgr_psoc *psoc,
+				 uint8_t vdev_id,
+				 wlan_objmgr_ref_dbgid dbg_id);
 #endif /* _WLAN_UTILITY_H_ */
diff --git a/umac/cmn_services/utils/src/wlan_utility.c b/umac/cmn_services/utils/src/wlan_utility.c
index 17cc3aa..a7e4bcf 100644
--- a/umac/cmn_services/utils/src/wlan_utility.c
+++ b/umac/cmn_services/utils/src/wlan_utility.c
@@ -104,3 +104,25 @@
 
 	return false;
 }
+
+uint32_t wlan_get_pdev_id_from_vdev_id(struct wlan_objmgr_psoc *psoc,
+				      uint8_t vdev_id,
+				      wlan_objmgr_ref_dbgid dbg_id)
+{
+	struct wlan_objmgr_vdev *vdev;
+	struct wlan_objmgr_pdev *pdev = NULL;
+	uint32_t pdev_id = WLAN_INVALID_PDEV_ID;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc,
+						    vdev_id, dbg_id);
+
+	if (vdev) {
+		pdev = wlan_vdev_get_pdev(vdev);
+		if (pdev)
+			pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
+		wlan_objmgr_vdev_release_ref(vdev, dbg_id);
+	}
+
+	return pdev_id;
+}
+EXPORT_SYMBOL(wlan_get_pdev_id_from_vdev_id);
diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c
index 872cbe8..2d5d0be 100644
--- a/wmi/src/wmi_unified_tlv.c
+++ b/wmi/src/wmi_unified_tlv.c
@@ -16236,6 +16236,9 @@
 	chan_info->noise_floor = ev->noise_floor;
 	chan_info->rx_clear_count = ev->rx_clear_count;
 	chan_info->cycle_count = ev->cycle_count;
+	chan_info->pdev_id = wlan_get_pdev_id_from_vdev_id(
+			(struct wlan_objmgr_psoc *)wmi_handle->soc->wmi_psoc,
+			ev->vdev_id, WLAN_SCAN_ID);
 
 	return QDF_STATUS_SUCCESS;
 }