Ver Fonte

qcacld-3.0: Switch to target if vdev start req

Populate vdev mlme in wma vdev start.
Call vdev mgr/target if vdev start API in wma vdev start.

Change-Id: Icbf82c8af320d0b2a19a72db94ad6abfa373b7e6
CRs-Fixed: 2516589
Jianmin Zhu há 5 anos atrás
pai
commit
b4203ad3dc

+ 0 - 14
core/wma/inc/wma_internal.h

@@ -1394,20 +1394,6 @@ void wma_acquire_wakelock(qdf_wake_lock_t *wl, uint32_t msec);
  */
 void wma_release_wakelock(qdf_wake_lock_t *wl);
 
-/**
- * wma_send_vdev_start_to_fw() - send the vdev start command to firmware
- * @wma: a reference to the global WMA handle
- * @params: the vdev start params to send to firmware
- *
- * Consumers should call wma_release_wakelock() upon receipt of the vdev start
- * response from firmware to avoid power penalties. Alternatively, calling the
- * matching vdev_up or vdev_down APIs will also release this lock.
- *
- * Return: QDF_STATUS
- */
-QDF_STATUS
-wma_send_vdev_start_to_fw(t_wma_handle *wma, struct vdev_start_params *params);
-
 /**
  * wma_send_vdev_stop_to_fw() - send the vdev stop command to firmware
  * @wma: a reference to the global WMA handle

+ 76 - 3
core/wma/src/wma_dev_if.c

@@ -978,15 +978,18 @@ static void wma_send_start_resp(tp_wma_handle wma,
 				struct vdev_start_response *rsp)
 {
 	struct wma_txrx_node *iface = &wma->interfaces[rsp->vdev_id];
+	QDF_STATUS status;
 
 	if (QDF_IS_STATUS_SUCCESS(rsp->status) &&
 	    QDF_IS_STATUS_SUCCESS(add_bss->status)) {
-		add_bss->status =
+		status =
 		  wlan_vdev_mlme_sm_deliver_evt(iface->vdev,
 						WLAN_VDEV_SM_EV_START_RESP,
 						sizeof(*add_bss), add_bss);
-		if (QDF_IS_STATUS_SUCCESS(add_bss->status))
+		if (QDF_IS_STATUS_SUCCESS(status))
 			return;
+
+		add_bss->status = status;
 	}
 
 	/* Send vdev stop if vdev start was success */
@@ -2821,6 +2824,68 @@ enum mlme_bcn_tx_rate_code wma_get_bcn_rate_code(uint16_t rate)
 	}
 }
 
+static QDF_STATUS vdev_mgr_start_param_populate(struct vdev_mlme_obj *mlme_obj,
+						struct vdev_start_params *param)
+{
+	struct wlan_channel *des_chan;
+	struct wlan_objmgr_vdev *vdev;
+	struct wlan_objmgr_pdev *pdev;
+
+	vdev = mlme_obj->vdev;
+	if (!vdev) {
+		mlme_err("VDEV is NULL");
+		return QDF_STATUS_E_INVAL;
+	}
+	pdev = wlan_vdev_get_pdev(vdev);
+	if (!pdev) {
+		mlme_err("PDEV is NULL");
+		return QDF_STATUS_E_INVAL;
+	}
+	if (wlan_objmgr_pdev_try_get_ref(pdev, WLAN_MLME_SB_ID) !=
+							QDF_STATUS_SUCCESS) {
+		mlme_err("Failed to get pdev reference");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	des_chan = wlan_vdev_mlme_get_des_chan(vdev);
+
+	mlme_obj->proto.generic.beacon_interval = param->beacon_interval;
+	mlme_obj->proto.generic.dtim_period = param->dtim_period;
+	mlme_obj->mgmt.generic.disable_hw_ack = param->disable_hw_ack;
+	mlme_obj->mgmt.chainmask_info.num_rx_chain =
+				param->preferred_rx_streams;
+	mlme_obj->mgmt.chainmask_info.num_tx_chain =
+				param->preferred_tx_streams;
+
+	mlme_obj->proto.he_ops_info.he_ops = param->he_ops;
+	des_chan->ch_ieee = param->channel.chan_id;
+	mlme_obj->mgmt.generic.tx_power = param->channel.pwr;
+	des_chan->ch_freq = param->channel.mhz;
+	mlme_obj->mgmt.rate_info.half_rate = param->channel.half_rate;
+	mlme_obj->mgmt.rate_info.quarter_rate = param->channel.quarter_rate;
+	mlme_obj->proto.ht_info.allow_ht = param->channel.allow_ht;
+	mlme_obj->proto.vht_info.allow_vht = param->channel.allow_vht;
+	mlme_obj->mgmt.generic.phy_mode = param->channel.phy_mode;
+	des_chan->ch_cfreq1 = param->channel.cfreq1;
+	des_chan->ch_cfreq2 = param->channel.cfreq2;
+	mlme_obj->mgmt.generic.maxpower = param->channel.maxpower;
+	mlme_obj->mgmt.generic.minpower = param->channel.minpower;
+	mlme_obj->mgmt.generic.maxregpower = param->channel.maxregpower;
+	mlme_obj->mgmt.generic.antennamax = param->channel.antennamax;
+	mlme_obj->mgmt.generic.reg_class_id = param->channel.reg_class_id;
+	mlme_obj->mgmt.rate_info.bcn_tx_rate = param->bcn_tx_rate_code;
+	mlme_obj->proto.generic.ldpc = param->ldpc_rx_enabled;
+	if (mlme_obj->mgmt.generic.type == WLAN_VDEV_MLME_TYPE_AP) {
+		mlme_obj->mgmt.ap.hidden_ssid = param->hidden_ssid;
+		mlme_obj->mgmt.ap.cac_duration_ms  = param->cac_duration_ms;
+	}
+	wlan_vdev_mlme_set_ssid(vdev, param->ssid.mac_ssid,
+				param->ssid.length);
+
+	wlan_objmgr_pdev_release_ref(pdev, WLAN_MLME_SB_ID);
+	return QDF_STATUS_SUCCESS;
+}
+
 /**
  * wma_vdev_start() - send vdev start request to fw
  * @wma: wma handle
@@ -2848,6 +2913,7 @@ QDF_STATUS wma_vdev_start(tp_wma_handle wma,
 	struct wlan_mlme_nss_chains *ini_cfg;
 	QDF_STATUS status;
 	uint32_t vdev_stop_type;
+	struct vdev_mlme_obj *mlme_obj;
 
 	ini_cfg = mlme_get_ini_vdev_config(iface->vdev);
 	if (!ini_cfg) {
@@ -3092,7 +3158,14 @@ QDF_STATUS wma_vdev_start(tp_wma_handle wma,
 	if (wma->dynamic_nss_chains_support)
 		wma_vdev_nss_chain_params_send(params.vdev_id, ini_cfg);
 
-	return wma_send_vdev_start_to_fw(wma, &params);
+	mlme_obj = wlan_vdev_mlme_get_cmpt_obj(intr[req->vdev_id].vdev);
+	if (!mlme_obj) {
+		pe_err("vdev component object is NULL");
+		return QDF_STATUS_E_FAILURE;
+	}
+	vdev_mgr_start_param_populate(mlme_obj, &params);
+
+	return vdev_mgr_start_send(mlme_obj,  isRestart);
 }
 
 /**

+ 1 - 1
core/wma/src/wma_nan_datapath.c

@@ -108,7 +108,7 @@ void wma_add_bss_ndi_mode(tp_wma_handle wma, struct bss_params *add_bss)
 
 	status = wma_vdev_start(wma, &req, false);
 	if (status != QDF_STATUS_SUCCESS) {
-		mlme_clear_bss_params(vdev_obj, add_bss);
+		mlme_clear_bss_params(vdev_obj);
 		goto send_fail_resp;
 	}
 

+ 0 - 24
core/wma/src/wma_utils.c

@@ -3445,30 +3445,6 @@ void wma_release_wakelock(qdf_wake_lock_t *wl)
 	qdf_runtime_pm_allow_suspend(&wma->wmi_cmd_rsp_runtime_lock);
 }
 
-QDF_STATUS
-wma_send_vdev_start_to_fw(t_wma_handle *wma, struct vdev_start_params *params)
-{
-	QDF_STATUS status;
-	struct wma_txrx_node *vdev = &wma->interfaces[params->vdev_id];
-
-	if (!wma_is_vdev_valid(params->vdev_id)) {
-		WMA_LOGE("%s: Invalid vdev id:%d", __func__, params->vdev_id);
-		status = QDF_STATUS_E_FAILURE;
-		return status;
-	}
-	wma_acquire_wakelock(&vdev->vdev_start_wakelock,
-			     WMA_VDEV_START_REQUEST_TIMEOUT);
-	qdf_runtime_pm_prevent_suspend(&vdev->vdev_start_runtime_wakelock);
-	status = wmi_unified_vdev_start_send(wma->wmi_handle, params);
-	if (QDF_IS_STATUS_ERROR(status)) {
-		qdf_runtime_pm_allow_suspend(
-				&vdev->vdev_start_runtime_wakelock);
-		wma_release_wakelock(&vdev->vdev_start_wakelock);
-	}
-
-	return status;
-}
-
 QDF_STATUS wma_send_vdev_stop_to_fw(t_wma_handle *wma, uint8_t vdev_id)
 {
 	QDF_STATUS status = QDF_STATUS_E_FAILURE;