diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h index df6398268350..e216d4f3d30b 100644 --- a/core/wma/inc/wma.h +++ b/core/wma/inc/wma.h @@ -1983,6 +1983,18 @@ QDF_STATUS wma_mgmt_unified_cmd_send(struct wlan_objmgr_vdev *vdev, qdf_nbuf_t buf, uint32_t desc_id, void *mgmt_tx_params); +/** + * wma_mgmt_nbuf_unmap_cb() - dma unmap for pending mgmt pkts + * @pdev: objmgr pdev + * @buf: buffer + * + * This function does the dma unmap of the pending mgmt packet cleanup + * + * Return: None + */ +void wma_mgmt_nbuf_unmap_cb(struct wlan_objmgr_pdev *pdev, + qdf_nbuf_t buf); + /** * wma_chan_info_event_handler() - chan info event handler * @handle: wma handle diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index d92ee0bd3bec..0fe5bfd0a436 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -2231,6 +2231,9 @@ wma_register_tx_ops_handler(struct wlan_lmac_if_tx_ops *tx_ops) /* mgmt_txrx component's tx ops */ tx_ops->mgmt_txrx_tx_ops.mgmt_tx_send = wma_mgmt_unified_cmd_send; + /* mgmt txrx component nbuf op for nbuf dma unmap */ + tx_ops->mgmt_txrx_tx_ops.tx_drain_nbuf_op = wma_mgmt_nbuf_unmap_cb; + return QDF_STATUS_SUCCESS; } diff --git a/core/wma/src/wma_mgmt.c b/core/wma/src/wma_mgmt.c index 4563c6c140cc..5de49c7cf34d 100644 --- a/core/wma/src/wma_mgmt.c +++ b/core/wma/src/wma_mgmt.c @@ -4368,3 +4368,22 @@ QDF_STATUS wma_mgmt_unified_cmd_send(struct wlan_objmgr_vdev *vdev, return QDF_STATUS_SUCCESS; } +void wma_mgmt_nbuf_unmap_cb(struct wlan_objmgr_pdev *pdev, + qdf_nbuf_t buf) +{ + tp_wma_handle wma_handle = cds_get_context(QDF_MODULE_ID_WMA); + + if (!wma_handle) { + WMA_LOGE("%s: wma handle is NULL", __func__); + return; + } + + if (!buf) + return; + + if (wmi_service_enabled(wma_handle->wmi_handle, + wmi_service_mgmt_tx_wmi)) { + qdf_nbuf_unmap_single(wma_handle->qdf_dev, buf, + QDF_DMA_TO_DEVICE); + } +}