diff --git a/umac/cmn_services/serialization/inc/wlan_serialization_api.h b/umac/cmn_services/serialization/inc/wlan_serialization_api.h index eb331292408f..3091e45251e2 100644 --- a/umac/cmn_services/serialization/inc/wlan_serialization_api.h +++ b/umac/cmn_services/serialization/inc/wlan_serialization_api.h @@ -486,5 +486,21 @@ wlan_serialization_get_scan_cmd_using_scan_id( struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, uint16_t scan_id, uint8_t is_scan_cmd_from_active_queue); - +/** + * wlan_serialization_get_active_cmd() - Return active umac command which + * matches vdev and cmd type + * @psoc: pointer to soc + * @vdev_id: vdev id to pull vdev object + * @cmd_type: cmd type to match + * + * This API fetches vdev/pdev object based on vdev_id, loops through active + * command queue and find the active command which matches cmd_type as well + * as vdev object. + * + * Return: Pointer to umac command. NULL is returned if active command of given + * type is not found. + */ +void *wlan_serialization_get_active_cmd(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, + enum wlan_serialization_cmd_type cmd_type); #endif diff --git a/umac/cmn_services/serialization/src/wlan_serialization_api.c b/umac/cmn_services/serialization/src/wlan_serialization_api.c index 5fcaa338c2ef..77ed293d36b3 100644 --- a/umac/cmn_services/serialization/src/wlan_serialization_api.c +++ b/umac/cmn_services/serialization/src/wlan_serialization_api.c @@ -380,3 +380,68 @@ release_vdev_ref: wlan_objmgr_vdev_release_ref(vdev, WLAN_SERIALIZATION_ID); return cmd; } + +void *wlan_serialization_get_active_cmd(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id, + enum wlan_serialization_cmd_type cmd_type) +{ + uint32_t qlen; + struct wlan_objmgr_vdev *vdev; + struct wlan_objmgr_pdev *pdev; + struct wlan_serialization_pdev_priv_obj *ser_pdev_obj; + struct wlan_serialization_command_list *cmd_list = NULL; + void *umac_cmd = NULL; + qdf_list_node_t *nnode = NULL; + qdf_list_t *queue; + + if (!psoc) { + serialization_err("invalid psoc"); + return umac_cmd; + } + vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id, + WLAN_SERIALIZATION_ID); + if (!vdev) { + serialization_err("invalid vdev"); + return umac_cmd; + } + + pdev = wlan_vdev_get_pdev(vdev); + if (!pdev) { + serialization_err("invalid pdev"); + goto release_vdev_ref; + } + + ser_pdev_obj = wlan_serialization_get_pdev_priv_obj(pdev); + if (!ser_pdev_obj) { + serialization_err("invalid ser_pdev_obj"); + goto release_vdev_ref; + } + + queue = &ser_pdev_obj->active_list; + + qlen = qdf_list_size(queue); + if (!qlen) { + serialization_err("Empty Queue"); + goto release_vdev_ref; + } + while (qlen--) { + if (QDF_STATUS_SUCCESS != wlan_serialization_get_cmd_from_queue( + queue, &nnode)) { + serialization_err("unsuccessful attempt"); + break; + } + cmd_list = qdf_container_of(nnode, + struct wlan_serialization_command_list, + node); + if (cmd_list->cmd.cmd_type == cmd_type && + cmd_list->cmd.vdev == vdev) { + serialization_debug("cmd_type[%d] matched", cmd_type); + umac_cmd = cmd_list->cmd.umac_cmd; + break; + } + } +release_vdev_ref: + wlan_objmgr_vdev_release_ref(vdev, WLAN_SERIALIZATION_ID); + + return umac_cmd; +}