diff --git a/umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_utils_api.h b/umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_utils_api.h index 57cfb35e3adc..0d403b7c3c61 100644 --- a/umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_utils_api.h +++ b/umac/cmn_services/mgmt_txrx/dispatcher/inc/wlan_mgmt_txrx_utils_api.h @@ -843,18 +843,19 @@ QDF_STATUS wlan_mgmt_txrx_register_rx_cb( uint8_t num_entries); /** - * wlan_mgmt_txrx_pdev_drain() - Function to drain all mgmt packets - * @pdev: pdev context + * wlan_mgmt_txrx_vdev_drain() - Function to drain all mgmt packets + * specific to a vdev + * @vdev: vdev context * @mgmt_fill_peer_cb: callback func to UMAC to fill peer into buf * @status: opaque pointer about the status of the pkts passed to UMAC * - * This function drains all mgmt packets. This can be used in the + * This function drains all mgmt packets of a vdev. This can be used in the * event of target going down without sending completions. * * Return: QDF_STATUS_SUCCESS - in case of success */ -QDF_STATUS wlan_mgmt_txrx_pdev_drain( - struct wlan_objmgr_pdev *pdev, +QDF_STATUS wlan_mgmt_txrx_vdev_drain( + struct wlan_objmgr_vdev *vdev, mgmt_frame_fill_peer_cb mgmt_fill_peer_cb, void *status); diff --git a/umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_utils_api.c b/umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_utils_api.c index 255177be7398..4dc065d25b43 100644 --- a/umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_utils_api.c +++ b/umac/cmn_services/mgmt_txrx/dispatcher/src/wlan_mgmt_txrx_utils_api.c @@ -770,16 +770,24 @@ QDF_STATUS wlan_mgmt_txrx_pdev_close(struct wlan_objmgr_pdev *pdev) return QDF_STATUS_SUCCESS; } -QDF_STATUS wlan_mgmt_txrx_pdev_drain(struct wlan_objmgr_pdev *pdev, +QDF_STATUS wlan_mgmt_txrx_vdev_drain(struct wlan_objmgr_vdev *vdev, mgmt_frame_fill_peer_cb mgmt_fill_peer_cb, void *status) { + struct wlan_objmgr_pdev *pdev; struct mgmt_txrx_priv_pdev_context *mgmt_txrx_pdev_ctx; struct mgmt_txrx_desc_elem_t *mgmt_desc; struct wlan_objmgr_peer *peer; + struct wlan_objmgr_vdev *peer_vdev; uint32_t pool_size; int i; + if (!vdev) { + mgmt_txrx_err("vdev context is NULL"); + return QDF_STATUS_E_INVAL; + } + + pdev = wlan_vdev_get_pdev(vdev); if (!pdev) { mgmt_txrx_err("pdev context is NULL"); return QDF_STATUS_E_INVAL; @@ -802,11 +810,15 @@ QDF_STATUS wlan_mgmt_txrx_pdev_drain(struct wlan_objmgr_pdev *pdev, if (mgmt_txrx_pdev_ctx->mgmt_desc_pool.pool[i].in_use) { mgmt_desc = &mgmt_txrx_pdev_ctx->mgmt_desc_pool.pool[i]; peer = mgmt_txrx_get_peer(pdev, mgmt_desc->desc_id); - QDF_ASSERT(peer != NULL); - if (mgmt_fill_peer_cb) - mgmt_fill_peer_cb(peer, mgmt_desc->nbuf); - mgmt_txrx_tx_completion_handler(pdev, - mgmt_desc->desc_id, 0, status); + if (peer) { + peer_vdev = wlan_peer_get_vdev(peer); + if (peer_vdev == vdev) { + if (mgmt_fill_peer_cb) + mgmt_fill_peer_cb(peer, mgmt_desc->nbuf); + mgmt_txrx_tx_completion_handler(pdev, + mgmt_desc->desc_id, 0, status); + } + } } }