Parcourir la source

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
Nirav Shah il y a 9 ans
Parent
commit
22bf44dc87

+ 3 - 0
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

+ 34 - 0
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,

+ 4 - 2
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)) {

+ 1 - 0
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;

+ 5 - 0
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,