diff --git a/umac/cfr/dispatcher/inc/wlan_cfr_ucfg_api.h b/umac/cfr/dispatcher/inc/wlan_cfr_ucfg_api.h index 50f2889da0d5..6d47cc6999c3 100644 --- a/umac/cfr/dispatcher/inc/wlan_cfr_ucfg_api.h +++ b/umac/cfr/dispatcher/inc/wlan_cfr_ucfg_api.h @@ -37,6 +37,16 @@ int ucfg_cfr_start_capture(struct wlan_objmgr_pdev *pdev, struct wlan_objmgr_peer *peer, struct cfr_capture_params *cfr_params); +/** + * ucfg_cfr_get_capture_status() - function to populate capture status + * @pdev: pointer to pdev object + * @status: capture status + * + * Return: none + */ +void ucfg_cfr_get_capture_status(struct wlan_objmgr_pdev *pdev, + enum cfr_capt_status *status); + /** * ucfg_cfr_stop_capture() - function to stop cfr capture for connected client * @pdev: pointer to pdev object diff --git a/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h b/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h index cf5922e26762..36d1f8261174 100644 --- a/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h +++ b/umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h @@ -1,3 +1,4 @@ + /* * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved. * @@ -507,8 +508,16 @@ struct pdev_cfr { qdf_spinlock_t lut_lock; }; -#define PEER_CFR_CAPTURE_ENABLE 1 -#define PEER_CFR_CAPTURE_DISABLE 0 +/** + * enum cfr_capt_status - CFR capture status + */ +enum cfr_capt_status { + /* Capture not in progress */ + PEER_CFR_CAPTURE_DISABLE, + /* Capture in progress */ + PEER_CFR_CAPTURE_ENABLE, +}; + /** * struct peer_cfr - private peer object for cfr * peer_obj: pointer to peer_obj diff --git a/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c b/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c index df90c57889da..be4c0e1c1b8b 100644 --- a/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c +++ b/umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c @@ -267,6 +267,49 @@ int ucfg_cfr_get_timer(struct wlan_objmgr_pdev *pdev) } qdf_export_symbol(ucfg_cfr_get_timer); +static void cfr_iter_peer_handler(struct wlan_objmgr_pdev *pdev, + void *object, void *arg) +{ + struct wlan_objmgr_peer *peer = (struct wlan_objmgr_peer *)object; + struct peer_cfr *pe; + int *cfr_capt_status = (int *)arg; + + if (*cfr_capt_status == PEER_CFR_CAPTURE_ENABLE) + return; + + if (!peer || !pdev) { + cfr_err("peer or pdev object is NULL"); + return; + } + + if (wlan_vdev_get_selfpeer(peer->peer_objmgr.vdev) == peer) + return; + + pe = wlan_objmgr_peer_get_comp_private_obj(peer, WLAN_UMAC_COMP_CFR); + if (!pe) { + cfr_err("PEER cfr object is NULL!"); + return; + } + + if (pe->request == PEER_CFR_CAPTURE_ENABLE) { + *cfr_capt_status = pe->request; + cfr_debug("CFR capture running for peer " + QDF_MAC_ADDR_STR, + QDF_MAC_ADDR_ARRAY(peer->macaddr)); + } +} + +void ucfg_cfr_get_capture_status(struct wlan_objmgr_pdev *pdev, + enum cfr_capt_status *status) +{ + *status = PEER_CFR_CAPTURE_DISABLE; + + wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_PEER_OP, + cfr_iter_peer_handler, + status, 1, WLAN_CFR_ID); +} +qdf_export_symbol(ucfg_cfr_get_capture_status); + int ucfg_cfr_stop_capture(struct wlan_objmgr_pdev *pdev, struct wlan_objmgr_peer *peer) {