Browse Source

qcacmn: Fix issues in direct buffer rx module

1. Populate number of capabilities after extracting service ready ext param
2. Deinit ring during pdev destroy only if ring is configured
3. Do not allocate module param if no capability is shared for
   the pdev by target

Change-Id: Ie92b7fc882ba8b7755fea150c724459264a0ea79
CRs-Fixed: 2192671
Sathish Kumar 7 years ago
parent
commit
6b55904827

+ 30 - 21
target_if/direct_buf_rx/src/target_if_direct_buf_rx_main.c

@@ -23,6 +23,7 @@
 #include <target_if_direct_buf_rx_api.h>
 #include "hal_api.h"
 #include <service_ready_util.h>
+#include <init_deinit_ucfg.h>
 
 static uint8_t get_num_dbr_modules_per_pdev(struct wlan_objmgr_pdev *pdev)
 {
@@ -142,36 +143,41 @@ QDF_STATUS target_if_direct_buf_rx_pdev_create_handler(
 
 	direct_buf_rx_info("Dbr pdev obj %pK", dbr_pdev_obj);
 
+	status = wlan_objmgr_pdev_component_obj_attach(pdev,
+					WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
+					dbr_pdev_obj, QDF_STATUS_SUCCESS);
+
+	if (status != QDF_STATUS_SUCCESS) {
+		direct_buf_rx_err("Failed to attach dir buf rx component %d",
+				  status);
+		qdf_mem_free(dbr_pdev_obj);
+		return status;
+	}
+
 	num_modules = get_num_dbr_modules_per_pdev(pdev);
 	direct_buf_rx_info("Number of modules = %d pdev %d", num_modules,
 			   wlan_objmgr_pdev_get_pdev_id(pdev));
 	dbr_pdev_obj->num_modules = num_modules;
+
+	if (!dbr_pdev_obj->num_modules) {
+		direct_buf_rx_info("Number of modules = %d", num_modules);
+		return QDF_STATUS_SUCCESS;
+	}
+
 	dbr_pdev_obj->dbr_mod_param = qdf_mem_malloc(num_modules *
 				sizeof(struct direct_buf_rx_module_param));
 
 	if (dbr_pdev_obj->dbr_mod_param == NULL) {
 		direct_buf_rx_err("Failed to allocate dir buf rx mod param");
+		wlan_objmgr_pdev_component_obj_detach(pdev,
+					WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
+					dbr_pdev_obj);
 		qdf_mem_free(dbr_pdev_obj);
 		return QDF_STATUS_E_NOMEM;
 	}
 
-	status = wlan_objmgr_pdev_component_obj_attach(pdev,
-					WLAN_TARGET_IF_COMP_DIRECT_BUF_RX,
-					dbr_pdev_obj, QDF_STATUS_SUCCESS);
-
-	if (status != QDF_STATUS_SUCCESS) {
-		direct_buf_rx_err("Failed to attach dir buf rx component %d",
-				  status);
-		goto attach_error;
-	}
 
 	return QDF_STATUS_SUCCESS;
-
-attach_error:
-	qdf_mem_free(dbr_pdev_obj->dbr_mod_param);
-	qdf_mem_free(dbr_pdev_obj);
-
-	return status;
 }
 
 QDF_STATUS target_if_direct_buf_rx_pdev_destroy_handler(
@@ -566,7 +572,7 @@ static QDF_STATUS target_if_dbr_cfg_tgt(struct wlan_objmgr_pdev *pdev,
 
 	dbr_ring_cfg = mod_param->dbr_ring_cfg;
 	dbr_ring_cap = mod_param->dbr_ring_cap;
-	wmi_hdl = pdev->tgt_if_handle;
+	wmi_hdl = ucfg_get_pdev_wmi_handle(pdev);
 	if (!wmi_hdl) {
 		direct_buf_rx_err("WMI handle null. Can't send WMI CMD");
 		return QDF_STATUS_E_INVAL;
@@ -910,12 +916,15 @@ static QDF_STATUS target_if_dbr_deinit_ring(struct wlan_objmgr_pdev *pdev,
 	direct_buf_rx_info("dbr_psoc_obj %pK", dbr_psoc_obj);
 
 	dbr_ring_cfg = mod_param->dbr_ring_cfg;
-	target_if_dbr_empty_ring(pdev, dbr_psoc_obj, mod_param);
-	hal_srng_cleanup(dbr_psoc_obj->hal_soc, dbr_ring_cfg->srng);
-	qdf_mem_free_consistent(dbr_psoc_obj->osdev, dbr_psoc_obj->osdev->dev,
-			dbr_ring_cfg->ring_alloc_size,
-			dbr_ring_cfg->base_vaddr_unaligned,
+	if (dbr_ring_cfg) {
+		target_if_dbr_empty_ring(pdev, dbr_psoc_obj, mod_param);
+		hal_srng_cleanup(dbr_psoc_obj->hal_soc, dbr_ring_cfg->srng);
+		qdf_mem_free_consistent(dbr_psoc_obj->osdev,
+					dbr_psoc_obj->osdev->dev,
+					dbr_ring_cfg->ring_alloc_size,
+					dbr_ring_cfg->base_vaddr_unaligned,
 			(qdf_dma_addr_t)dbr_ring_cfg->base_paddr_unaligned, 0);
+	}
 
 	return QDF_STATUS_SUCCESS;
 }

+ 5 - 5
target_if/init_deinit/src/init_event_handler.c

@@ -198,11 +198,6 @@ static int init_deinit_service_ext_ready_event_handler(ol_scn_t scn_handle,
 	wmi_handle = target_psoc_get_wmi_hdl(tgt_hdl);
 	info = (&tgt_hdl->info);
 
-	err_code = init_deinit_populate_dbr_ring_cap(psoc, wmi_handle,
-						event, info);
-	if (err_code)
-		goto exit;
-
 	err_code = init_deinit_populate_service_ready_ext_param(wmi_handle,
 				event, &(info->service_ext_param));
 	if (err_code)
@@ -237,6 +232,11 @@ static int init_deinit_service_ext_ready_event_handler(ol_scn_t scn_handle,
 			goto exit;
 	}
 
+	err_code = init_deinit_populate_dbr_ring_cap(psoc, wmi_handle,
+						event, info);
+	if (err_code)
+		goto exit;
+
 	legacy_callback = target_if_get_psoc_legacy_service_ready_cb();
 	if (legacy_callback)
 		legacy_callback(wmi_service_ready_ext_event_id,