From af08a97d270f4bec157d0a3151d90961ae8bcd00 Mon Sep 17 00:00:00 2001 From: Vinay Adella Date: Fri, 2 Mar 2018 14:00:26 +0530 Subject: [PATCH] qcacmn: Add support for vdev level mgmt drain Change the pdev mgmt drain to vdev mgmt drain. The pdev drain function drains packets of all vdevs, which causes an issue with backlog queues maintained for each vdev. vdev level drain will help to support per-vdev queues that are maintained out side the qcacmn module. Change-Id: I78c58e8e12299eb7754f171f2c70291068871b03 CRs-Fixed: 2197254 --- .../dispatcher/inc/wlan_mgmt_txrx_utils_api.h | 11 +++++---- .../dispatcher/src/wlan_mgmt_txrx_utils_api.c | 24 ++++++++++++++----- 2 files changed, 24 insertions(+), 11 deletions(-) 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); + } + } } }