diff --git a/umac/cmn_services/inc/wlan_cmn.h b/umac/cmn_services/inc/wlan_cmn.h index f86e5a620460..64d6e736a02c 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 dc50c873ef4f..ab6559a22667 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 +#include +#include +#include /** * wlan_chan_to_freq() - converts channel to frequency @@ -71,4 +74,19 @@ uint8_t *wlan_get_vendor_ie_ptr_from_oui(uint8_t *oui, * 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 17cc3aab14c1..a7e4bcf2d0e9 100644 --- a/umac/cmn_services/utils/src/wlan_utility.c +++ b/umac/cmn_services/utils/src/wlan_utility.c @@ -104,3 +104,25 @@ bool wlan_is_emulation_platform(uint32_t phy_version) 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 a9a39343bae8..f88c242d85f9 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -16303,6 +16303,9 @@ static QDF_STATUS extract_chan_info_event_tlv(wmi_unified_t wmi_handle, 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; }