Browse Source

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
Vinay Adella 7 years ago
parent
commit
af08a97d27

+ 6 - 5
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);
 

+ 18 - 6
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);
+				}
+			}
 		}
 	}