Sfoglia il codice sorgente

qcacmn: Check return value of nbuf_map in tx_ipa_smmu_map

Currently the return status of qdf_nbuf_map_single()
is not checked in dp_tx_ipa_uc_attach(). This change adds
the check to ensure that each nbuf in the TX buff pool,
is successfully mapped before providing the nbuf
to be IPA SMMU mapped.

Change-Id: Ic40479af8f2eaa2ced87b20a25250844e5e146bf
CRs-Fixed: 3629564
Namita Nair 1 anno fa
parent
commit
552f04acdf
3 ha cambiato i file con 48 aggiunte e 50 eliminazioni
  1. 11 2
      dp/wifi3.0/dp_ipa.c
  2. 35 45
      ipa/core/src/wlan_ipa_core.c
  3. 2 3
      ipa/core/src/wlan_ipa_main.c

+ 11 - 2
dp/wifi3.0/dp_ipa.c

@@ -1511,8 +1511,15 @@ static int dp_tx_ipa_uc_attach(struct dp_soc *soc, struct dp_pdev *pdev)
 			break;
 		}
 
-		qdf_nbuf_map_single(soc->osdev, nbuf,
-				    QDF_DMA_BIDIRECTIONAL);
+		retval = qdf_nbuf_map_single(soc->osdev, nbuf,
+					     QDF_DMA_BIDIRECTIONAL);
+		if (qdf_unlikely(retval != QDF_STATUS_SUCCESS)) {
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+				  "%s: nbuf map failed", __func__);
+			qdf_nbuf_free(nbuf);
+			retval = -EFAULT;
+			break;
+		}
 		buffer_paddr = qdf_nbuf_get_frag_paddr(nbuf, 0);
 		qdf_mem_dp_tx_skb_cnt_inc();
 		qdf_mem_dp_tx_skb_inc(qdf_nbuf_get_end_offset(nbuf));
@@ -1574,6 +1581,8 @@ int dp_ipa_uc_attach(struct dp_soc *soc, struct dp_pdev *pdev)
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
 			  "%s: DP IPA UC TX attach fail code %d",
 			  __func__, error);
+		if (error == -EFAULT)
+			dp_tx_ipa_uc_detach(soc, pdev);
 		return error;
 	}
 

+ 35 - 45
ipa/core/src/wlan_ipa_core.c

@@ -767,8 +767,8 @@ static inline QDF_STATUS wlan_ipa_wdi_init(struct wlan_ipa_priv *ipa_ctx)
 
 	ipa_info("ipa_over_gsi: %d, is_smmu_enabled: %d, handle: %d",
 		 ipa_ctx->over_gsi, ipa_ctx->is_smmu_enabled, ipa_ctx->hdl);
-	ipa_info("opt_dp: enabled from IPA : %d",
-		 ipa_ctx->opt_wifi_datapath);
+	ipa_debug("opt_dp: enabled from IPA : %d",
+		  ipa_ctx->opt_wifi_datapath);
 
 	if (QDF_IPA_WDI_INIT_OUT_PARAMS_IS_UC_READY(&out)) {
 		ipa_debug("IPA uC READY");
@@ -4291,7 +4291,6 @@ static inline QDF_STATUS wlan_ipa_reg_flt_cbs(struct wlan_ipa_priv *ipa_ctx)
 	ipa_wdi_opt_dpath_flt_add_cb flt_add_cb =
 					     &wlan_ipa_wdi_opt_dpath_flt_add_cb;
 
-	ipa_info("opt_dp: ipa_reg_flt_cb");
 	status = qdf_ipa_wdi_register_flt_cb(ipa_ctx->hdl, flt_rsrv_cb,
 					     flt_rsrv_rel_cb,
 					     flt_add_cb,
@@ -4316,14 +4315,14 @@ QDF_STATUS wlan_ipa_opt_dp_init(struct wlan_ipa_priv *ipa_ctx)
 	if (ipa_ctx->opt_wifi_datapath) {
 		if (ipa_config_is_opt_wifi_dp_enabled()) {
 			status = wlan_ipa_reg_flt_cbs(ipa_ctx);
-			ipa_info("opt_dp: Register flt cb. status %d", status);
+			ipa_debug("opt_dp: Register flt cb. status %d", status);
 			qdf_wake_lock_create(&ipa_ctx->opt_dp_wake_lock,
 					     "opt_dp");
 		} else {
-			ipa_info("opt_dp: Disabled from WLAN INI");
+			ipa_debug("opt_dp: Disabled from WLAN INI");
 		}
 	} else {
-		ipa_info("opt_dp: Disabled from IPA");
+		ipa_debug("opt_dp: Disabled from IPA");
 	}
 
 	return status;
@@ -5082,9 +5081,14 @@ QDF_STATUS wlan_ipa_uc_ol_deinit(struct wlan_ipa_priv *ipa_ctx)
 				       ipa_ctx->dp_pdev_id);
 
 	if (true == ipa_ctx->uc_loaded) {
-		cdp_ipa_tx_buf_smmu_unmapping(ipa_ctx->dp_soc,
-					      ipa_ctx->dp_pdev_id,
-					      __func__, __LINE__);
+		status = cdp_ipa_tx_buf_smmu_unmapping(ipa_ctx->dp_soc,
+						       ipa_ctx->dp_pdev_id,
+						       __func__, __LINE__);
+		if (status)
+			ipa_err("Failure to unmap IPA Tx buffers (status=%d)",
+				status);
+		else
+			ipa_info("TX buffers unmapped from IPA");
 		status = cdp_ipa_cleanup(ipa_ctx->dp_soc,
 					 ipa_ctx->dp_pdev_id,
 					 ipa_ctx->tx_pipe_handle,
@@ -5342,7 +5346,7 @@ int wlan_ipa_wdi_opt_dpath_flt_rsrv_cb(
 	/* Hold wakelock */
 	qdf_wake_lock_acquire(&ipa_obj->opt_dp_wake_lock,
 			      WIFI_POWER_EVENT_WAKELOCK_OPT_WIFI_DP);
-	ipa_info("opt_dp: Wakelock acquired");
+	ipa_debug("opt_dp: Wakelock acquired");
 	qdf_pm_system_wakeup();
 
 	response = cdp_ipa_pcie_link_up(ipa_obj->dp_soc);
@@ -5351,8 +5355,8 @@ int wlan_ipa_wdi_opt_dpath_flt_rsrv_cb(
 		goto error_pcie_link_up;
 	}
 
-	ipa_info("opt_dp :Target suspend state %d",
-		 qdf_atomic_read(&wmi_handle->is_target_suspended));
+	ipa_debug("opt_dp :Target suspend state %d",
+		  qdf_atomic_read(&wmi_handle->is_target_suspended));
 	while (qdf_atomic_read(&wmi_handle->is_target_suspended) &&
 	       wait_cnt < OPT_DP_TARGET_RESUME_WAIT_COUNT) {
 		qdf_sleep(OPT_DP_TARGET_RESUME_WAIT_TIMEOUT_MS);
@@ -5365,7 +5369,7 @@ int wlan_ipa_wdi_opt_dpath_flt_rsrv_cb(
 	}
 
 	/* Disable Low power features before filter reservation */
-	ipa_info("opt_dp: Disable low power features to reserve filter");
+	ipa_debug("opt_dp: Disable low power features to reserve filter");
 	param_val = 0;
 	response = cdp_ipa_opt_dp_enable_disable_low_power_mode(pdev, pdev_id,
 								param_val);
@@ -5375,7 +5379,7 @@ int wlan_ipa_wdi_opt_dpath_flt_rsrv_cb(
 		goto error;
 	}
 
-	ipa_info("opt_dp: Send filter reserve req");
+	ipa_debug("opt_dp: Send filter reserve req");
 	dp_flt_params = &(ipa_obj->dp_cce_super_rule_flt_param);
 	dp_flt_params->op = HTT_RX_CCE_SUPER_RULE_SETUP_REQUEST;
 	dp_flt_params->pdev_id = ipa_obj->dp_pdev_id;
@@ -5470,9 +5474,7 @@ int wlan_ipa_wdi_opt_dpath_flt_add_cb(
 				dp_flt_param->flt_addr_params[i].dst_ipv4_addr,
 				(&dst_ip_addr),
 				IPV4BYTES);
-			ipa_info("ipv4 src addr rxed from ipa 0x%x",
-				 ipa_flt->flt_info[flt].ipv4_addr.ipv4_saddr);
-			ipa_info("ipv4 sent to FW 0x%x", src_ip_addr);
+			ipa_debug("ipv4 sent to FW 0x%x", src_ip_addr);
 		} else if (dp_flt_param->flt_addr_params[i].l3_type == IPV6) {
 			host_ipv6 = (uint32_t *)dp_flt_param->flt_addr_params[i].
 				    src_ipv6_addr;
@@ -5486,14 +5488,14 @@ int wlan_ipa_wdi_opt_dpath_flt_add_cb(
 				host_ipv6++;
 			}
 			for (j = 0; j < IPV6ARRAY; j++) {
-				ipa_info("ipv6 src addr rxed from ipa 0x%x",
-					 ipa_flt->flt_info[flt].ipv6_addr.
-					 ipv6_saddr[j]);
+				ipa_debug("ipv6 src addr rxed from ipa 0x%x",
+					  ipa_flt->flt_info[flt].ipv6_addr.
+					  ipv6_saddr[j]);
 			}
 			for (j = 0; j < IPV6ARRAY; j++)
-				ipa_info("ipv6 sent to FW 0x%x",
-					 *((uint32_t *)dp_flt_param->flt_addr_params[i].
-					 src_ipv6_addr + j));
+				ipa_debug("ipv6 sent to FW 0x%x",
+					  *((uint32_t *)dp_flt_param->flt_addr_params[i].
+					  src_ipv6_addr + j));
 			/* Dest addr is currently not used in filter */
 		}
 	}
@@ -5503,14 +5505,8 @@ int wlan_ipa_wdi_opt_dpath_flt_add_cb(
 	dp_flt_param->num_filters = num_flts;
 	qdf_event_reset(&ipa_obj->ipa_flt_evnt);
 
-	ipa_info("opt_dp: op %d, pdev_id %d. num_flts %d",
-		 dp_flt_param->op, dp_flt_param->pdev_id, num_flts);
-	for (i = 0; i < num_flts; i++)
-		ipa_info("version %d, valid %d, src addr_ %08lx, evnt reqd %d",
-			 dp_flt_param->flt_addr_params[i].l3_type,
-			 dp_flt_param->flt_addr_params[i].valid,
-			 dp_flt_param->flt_addr_params[i].src_ipv4_addr,
-			 dp_flt_param->flt_addr_params[i].ipa_flt_evnt_required);
+	ipa_debug("opt_dp: op %d, pdev_id %d. num_flts %d",
+		  dp_flt_param->op, dp_flt_param->pdev_id, num_flts);
 
 	cdp_ipa_rx_cce_super_rule_setup(ipa_obj->dp_soc, dp_flt_param);
 
@@ -5578,14 +5574,8 @@ int wlan_ipa_wdi_opt_dpath_flt_rem_cb(
 	dp_flt_params->num_filters = num_flts;
 	qdf_event_reset(&ipa_obj->ipa_flt_evnt);
 
-	ipa_info("opt_dp: op %d, pdev_id %d. num_flts %d",
-		 dp_flt_params->op, dp_flt_params->pdev_id, num_flts);
-	for (i = 0; i < num_flts; i++)
-		ipa_info("version %d, valid %d, src addr_ %08lx, evnt_reqd %d",
-			 dp_flt_params->flt_addr_params[i].l3_type,
-			 dp_flt_params->flt_addr_params[i].valid,
-			 dp_flt_params->flt_addr_params[i].src_ipv4_addr,
-			 dp_flt_params->flt_addr_params[i].ipa_flt_evnt_required);
+	ipa_debug("opt_dp: op %d, pdev_id %d. num_flts %d",
+		  dp_flt_params->op, dp_flt_params->pdev_id, num_flts);
 
 	cdp_ipa_rx_cce_super_rule_setup(ipa_obj->dp_soc, dp_flt_params);
 
@@ -5617,7 +5607,7 @@ int wlan_ipa_wdi_opt_dpath_flt_rsrv_rel_cb(void *ipa_ctx)
 	pdev = ipa_obj->pdev;
 	pdev_id = ipa_obj->dp_pdev_id;
 	/* Enable Low power features before filter release */
-	ipa_info("opt_dp: Enable low power features to release filter");
+	ipa_debug("opt_dp: Enable low power features to release filter");
 	param_val = 1;
 	response = cdp_ipa_opt_dp_enable_disable_low_power_mode(pdev, pdev_id,
 								param_val);
@@ -5626,11 +5616,11 @@ int wlan_ipa_wdi_opt_dpath_flt_rsrv_rel_cb(void *ipa_ctx)
 	}
 
 	response = cdp_ipa_pcie_link_down(ipa_obj->dp_soc);
-	ipa_info("opt_dp: Vote for PCIe link down");
+	ipa_debug("opt_dp: Vote for PCIe link down");
 
 	dp_flt_params = &(ipa_obj->dp_cce_super_rule_flt_param);
 	for (i = 0; i < IPA_WDI_MAX_FILTER; i++)
-		 dp_flt_params->flt_addr_params[i].valid = 0;
+		dp_flt_params->flt_addr_params[i].valid = 0;
 	dp_flt_params->op = HTT_RX_CCE_SUPER_RULE_RELEASE;
 	dp_flt_params->pdev_id = ipa_obj->dp_pdev_id;
 	dp_flt_params->num_filters = IPA_WDI_MAX_FILTER;
@@ -5689,7 +5679,7 @@ void wlan_ipa_wdi_opt_dpath_notify_flt_rlsd(int flt0_rslt, int flt1_rslt)
 
 	qdf_wake_lock_release(&ipa_ctx->opt_dp_wake_lock,
 			      WIFI_POWER_EVENT_WAKELOCK_OPT_WIFI_DP);
-	ipa_info("opt_dp: Wakelock released");
+	ipa_debug("opt_dp: Wakelock released");
 }
 
 void wlan_ipa_wdi_opt_dpath_notify_flt_add_rem_cb(int flt0_rslt, int flt1_rslt)
@@ -5708,8 +5698,8 @@ void wlan_ipa_wdi_opt_dpath_notify_flt_add_rem_cb(int flt0_rslt, int flt1_rslt)
 	else
 			dp_flt_params->ipa_flt_evnt_response =
 							     QDF_STATUS_SUCCESS;
-	ipa_info("opt_dp: ipa_flt_event_response set status: %d",
-		 dp_flt_params->ipa_flt_evnt_response);
+	ipa_debug("opt_dp: ipa_flt_event_response set status: %d",
+		  dp_flt_params->ipa_flt_evnt_response);
 	qdf_event_set(&ipa_obj->ipa_flt_evnt);
 }
 #endif /* IPA_OPT_WIFI_DP */

+ 2 - 3
ipa/core/src/wlan_ipa_main.c

@@ -835,7 +835,6 @@ uint32_t get_ipa_config(struct wlan_objmgr_psoc *psoc)
 			ipa_err("Invalid IPA Config 0x%x", val);
 		val = INTRL_MODE_ENABLE;
 	}
-	ipa_info("IPAConfig set as 0x%x", val);
 	return val;
 }
 #else
@@ -863,8 +862,8 @@ void ipa_component_config_update(struct wlan_objmgr_psoc *psoc)
 
 	if (g_ipa_pld_enable) {
 		g_ipa_config->ipa_config = get_ipa_config(psoc);
-		ipa_info("IPA ini configuration: 0x%x",
-			 g_ipa_config->ipa_config);
+		ipa_debug("IPA ini configuration: 0x%x",
+			  g_ipa_config->ipa_config);
 	} else {
 		g_ipa_config->ipa_config = 0;
 		ipa_info("IPA disabled from platform driver");