From 600a296834a438dc93a57be3c979679d39c47231 Mon Sep 17 00:00:00 2001 From: Nirav Shah Date: Thu, 10 Dec 2015 15:39:48 +0530 Subject: [PATCH] qcacld-3.0: Do not reserve mgmt descriptors Do not reserve tx descriptors for management packets if management over WMI is enabled. Change-Id: Iafe758d91d11f4875e3152d92538055784490a14 CRs-Fixed: 949917 --- core/dp/ol/inc/ol_txrx_ctrl_api.h | 3 +++ core/dp/txrx/ol_txrx.c | 34 +++++++++++++++++++++++++++++ core/dp/txrx/ol_txrx_flow_control.c | 6 +++-- core/dp/txrx/ol_txrx_types.h | 1 + core/wma/src/wma_main.c | 5 +++++ 5 files changed, 47 insertions(+), 2 deletions(-) diff --git a/core/dp/ol/inc/ol_txrx_ctrl_api.h b/core/dp/ol/inc/ol_txrx_ctrl_api.h index 4a01d3ec0eb8..700dcf4a0626 100644 --- a/core/dp/ol/inc/ol_txrx_ctrl_api.h +++ b/core/dp/ol/inc/ol_txrx_ctrl_api.h @@ -1261,6 +1261,9 @@ void ol_txrx_set_ocb_peer(struct ol_txrx_pdev_t *pdev, bool ol_txrx_get_ocb_peer(struct ol_txrx_pdev_t *pdev, struct ol_txrx_peer_t **peer); +void ol_tx_set_is_mgmt_over_wmi_enabled(uint8_t value); +uint8_t ol_tx_get_is_mgmt_over_wmi_enabled(void); + /* TX FLOW Control related functions */ #ifdef QCA_LL_TX_FLOW_CONTROL_V2 #define TX_FLOW_MGMT_POOL_ID 0xEF diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index 37694a8e78dd..fa9f7d8fd369 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/core/dp/txrx/ol_txrx.c @@ -76,6 +76,40 @@ /*=== function definitions ===*/ +/** + * ol_tx_set_is_mgmt_over_wmi_enabled() - set flag to indicate that mgmt over + * wmi is enabled or not. + * @value: 1 for enabled/ 0 for disable + * + * Return: None + */ +void ol_tx_set_is_mgmt_over_wmi_enabled(uint8_t value) +{ + struct ol_txrx_pdev_t *pdev = cds_get_context(CDF_MODULE_ID_TXRX); + if (!pdev) { + cdf_print("%s: pdev is NULL\n", __func__); + return; + } + pdev->is_mgmt_over_wmi_enabled = value; + return; +} + +/** + * ol_tx_get_is_mgmt_over_wmi_enabled() - get value of is_mgmt_over_wmi_enabled + * + * Return: is_mgmt_over_wmi_enabled + */ +uint8_t ol_tx_get_is_mgmt_over_wmi_enabled(void) +{ + struct ol_txrx_pdev_t *pdev = cds_get_context(CDF_MODULE_ID_TXRX); + if (!pdev) { + cdf_print("%s: pdev is NULL\n", __func__); + return 0; + } + return pdev->is_mgmt_over_wmi_enabled; +} + + #ifdef QCA_SUPPORT_TXRX_LOCAL_PEER_ID ol_txrx_peer_handle ol_txrx_find_peer_by_addr_and_vdev(ol_txrx_pdev_handle pdev, diff --git a/core/dp/txrx/ol_txrx_flow_control.c b/core/dp/txrx/ol_txrx_flow_control.c index 82785837ac22..21d49908053f 100644 --- a/core/dp/txrx/ol_txrx_flow_control.c +++ b/core/dp/txrx/ol_txrx_flow_control.c @@ -112,7 +112,8 @@ void ol_tx_register_flow_control(struct ol_txrx_pdev_t *pdev) cdf_spinlock_init(&pdev->tx_desc.flow_pool_list_lock); TAILQ_INIT(&pdev->tx_desc.flow_pool_list); - ol_tx_register_global_mgmt_pool(pdev); + if (!ol_tx_get_is_mgmt_over_wmi_enabled()) + ol_tx_register_global_mgmt_pool(pdev); } /** @@ -123,7 +124,8 @@ void ol_tx_register_flow_control(struct ol_txrx_pdev_t *pdev) */ void ol_tx_deregister_flow_control(struct ol_txrx_pdev_t *pdev) { - ol_tx_deregister_global_mgmt_pool(pdev); + if (!ol_tx_get_is_mgmt_over_wmi_enabled()) + ol_tx_deregister_global_mgmt_pool(pdev); cdf_spinlock_destroy(&pdev->tx_desc.flow_pool_list_lock); if (!TAILQ_EMPTY(&pdev->tx_desc.flow_pool_list)) { diff --git a/core/dp/txrx/ol_txrx_types.h b/core/dp/txrx/ol_txrx_types.h index 118d9d97bbee..3fc470bd107e 100644 --- a/core/dp/txrx/ol_txrx_types.h +++ b/core/dp/txrx/ol_txrx_types.h @@ -571,6 +571,7 @@ struct ol_txrx_pdev_t { struct cdf_mem_multi_page_t desc_pages; } tx_desc; + uint8_t is_mgmt_over_wmi_enabled; #if defined(QCA_LL_TX_FLOW_CONTROL_V2) struct ol_txrx_pool_stats pool_stats; uint32_t num_msdu_desc; diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index 2fc74131c6ed..f36fd45a7d94 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -3806,6 +3806,11 @@ void wma_rx_service_ready_event(WMA_HANDLE handle, void *cmd_param_info) cdf_mem_copy(wma_handle->wmi_service_bitmap, param_buf->wmi_service_bitmap, sizeof(wma_handle->wmi_service_bitmap)); + + ol_tx_set_is_mgmt_over_wmi_enabled( + WMI_SERVICE_IS_ENABLED(wma_handle->wmi_service_bitmap, + WMI_SERVICE_MGMT_TX_WMI)); + /* SWBA event handler for beacon transmission */ status = wmi_unified_register_event_handler(wma_handle->wmi_handle, WMI_HOST_SWBA_EVENTID,