Browse Source

qcacld-3.0: Move SR changes from WMA to Target_if

Move SR changes from WMA to Target_if and remove
WMA api's which was previously using to update
SR threshold.

Change-Id: I219cd56195471df561a5789fb235e375a14e756c
CRs-Fixed: 3374674
Prasanna JS 2 years ago
parent
commit
44ddeedbd9

+ 27 - 0
components/mlme/core/inc/wlan_mlme_main.h

@@ -1735,4 +1735,31 @@ bool wlan_vdev_is_sae_auth_type(struct wlan_objmgr_vdev *vdev);
  */
 uint16_t wlan_get_rand_from_lst_for_freq(uint16_t *freq_lst,
 					 uint8_t num_chan);
+#if defined WLAN_FEATURE_SR
+/**
+ * mlme_sr_update() - MLME sr update callback
+ * @vdev: vdev object
+ * @enable: true or false
+ *
+ * This function is called to update the SR threshold
+ */
+void mlme_sr_update(struct wlan_objmgr_vdev *vdev, bool enable);
+
+/**
+ * mlme_sr_is_enable: Check whether SR is enabled or not
+ * @vdev: object manager vdev
+ *
+ * Return: True/False
+ */
+int mlme_sr_is_enable(struct wlan_objmgr_vdev *vdev);
+#else
+static inline void mlme_sr_update(struct wlan_objmgr_vdev *vdev, bool enable)
+{
+}
+
+static inline int mlme_sr_is_enable(struct wlan_objmgr_vdev *vdev)
+{
+	return 0;
+}
+#endif /* WLAN_FEATURE_SR */
 #endif

+ 176 - 4
components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c

@@ -44,6 +44,7 @@
 #include <lim_mlo.h>
 #include "wlan_mlo_mgr_sta.h"
 #endif
+#include <wlan_lmac_if_def.h>
 
 static struct vdev_mlme_ops sta_mlme_ops;
 static struct vdev_mlme_ops ap_mlme_ops;
@@ -249,6 +250,162 @@ static QDF_STATUS sta_mlme_vdev_start_connection(struct vdev_mlme_obj *vdev_mlme
 	return QDF_STATUS_SUCCESS;
 }
 
+#if defined WLAN_FEATURE_SR
+int mlme_sr_is_enable(struct wlan_objmgr_vdev *vdev)
+{
+	uint8_t sr_ctrl;
+
+	sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(vdev);
+	return ((!(sr_ctrl & NON_SRG_PD_SR_DISALLOWED) &&
+		 (sr_ctrl & NON_SRG_OFFSET_PRESENT)) ||
+		(sr_ctrl & SRG_INFO_PRESENT));
+}
+
+/**
+ * mlme_sr_handle_conc(): Handle concurrency scenario i.e Single MAC
+ * concurrency is not supoprted for SR, Disable SR if it is enable on other
+ * VDEV and enable it back once the once the concurrent vdev is down.
+ *
+ * @vdev: object manager vdev
+ * @conc_vdev: cuncurrent vdev object
+ * @en_sr_curr_vdev: indicates spatial reuse enable/disable
+ *
+ */
+static void
+mlme_sr_handle_conc(struct wlan_objmgr_vdev *vdev,
+		    struct wlan_objmgr_vdev *conc_vdev, bool en_sr_curr_vdev)
+{
+	uint32_t val = 0;
+	struct wlan_objmgr_pdev *pdev;
+	struct wlan_objmgr_psoc *psoc;
+	struct wlan_lmac_if_tx_ops *tx_ops;
+	uint8_t conc_vdev_id = wlan_vdev_get_id(conc_vdev);
+
+	pdev = wlan_vdev_get_pdev(vdev);
+	if (!pdev) {
+		mlme_err("pdev is NULL");
+		return;
+	}
+
+	psoc = wlan_vdev_get_psoc(vdev);
+	tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
+
+	if (en_sr_curr_vdev) {
+		wlan_vdev_mlme_set_sr_disable_due_conc(vdev, true);
+		wlan_vdev_mlme_set_sr_disable_due_conc(conc_vdev, true);
+
+		if (!wlan_vdev_mlme_get_he_spr_enabled(conc_vdev))
+			return;
+
+		if (tx_ops && tx_ops->spatial_reuse_tx_ops.target_if_sr_update)
+			tx_ops->spatial_reuse_tx_ops.target_if_sr_update
+						     (pdev, conc_vdev_id, val);
+
+		wlan_spatial_reuse_osif_event(conc_vdev, SR_OPERATION_SUSPEND,
+					      SR_REASON_CODE_CONCURRENCY);
+	} else if (wlan_vdev_mlme_is_sr_disable_due_conc(conc_vdev)) {
+		wlan_vdev_mlme_set_sr_disable_due_conc(conc_vdev, false);
+
+		if (!wlan_vdev_mlme_get_he_spr_enabled(conc_vdev))
+			return;
+
+		if (mlme_sr_is_enable(vdev)) {
+			wlan_mlme_update_sr_data(conc_vdev, &val, 0, 0, true);
+
+			if (tx_ops && tx_ops->spatial_reuse_tx_ops.target_if_sr_update)
+				tx_ops->spatial_reuse_tx_ops.target_if_sr_update
+						      (pdev, conc_vdev_id, val);
+
+			wlan_spatial_reuse_osif_event(conc_vdev,
+						      SR_OPERATION_RESUME,
+						      SR_REASON_CODE_CONCURRENCY);
+		} else {
+			mlme_debug("SR Disabled in SR Control");
+		}
+	}
+}
+
+void mlme_sr_update(struct wlan_objmgr_vdev *vdev, bool enable)
+{
+	struct wlan_objmgr_vdev *conc_vdev;
+	struct wlan_objmgr_psoc *psoc;
+	struct wlan_objmgr_pdev *pdev;
+	struct wlan_lmac_if_tx_ops *tx_ops;
+	uint32_t conc_vdev_id;
+	uint32_t val = 0;
+	uint8_t vdev_id;
+	uint8_t mac_id;
+
+	if (!vdev) {
+		mlme_err("vdev is NULL");
+		return;
+	}
+	vdev_id = wlan_vdev_get_id(vdev);
+
+	pdev = wlan_vdev_get_pdev(vdev);
+	if (!pdev) {
+		mlme_err("pdev is NULL");
+		return;
+	}
+
+	psoc = wlan_vdev_get_psoc(vdev);
+	if (!psoc) {
+		mlme_err("psoc is NULL");
+		return;
+	}
+
+	policy_mgr_get_mac_id_by_session_id(psoc, vdev_id, &mac_id);
+	conc_vdev_id = policy_mgr_get_conc_vdev_on_same_mac(psoc, vdev_id,
+							    mac_id);
+	if (conc_vdev_id != WLAN_INVALID_VDEV_ID &&
+	    !policy_mgr_sr_same_mac_conc_enabled(psoc)) {
+		/*
+		 * Single MAC concurrency is not supoprted for SR,
+		 * Disable SR if it is enable on other VDEV and enable
+		 * it back once the once the concurrent vdev is down.
+		 */
+		mlme_debug("SR with concurrency is not allowed");
+		conc_vdev =
+		wlan_objmgr_get_vdev_by_id_from_psoc(psoc, conc_vdev_id,
+						     WLAN_MLME_SB_ID);
+		if (!conc_vdev) {
+			mlme_err("Can't get vdev by vdev_id:%d", conc_vdev_id);
+		} else {
+			mlme_sr_handle_conc(vdev, conc_vdev, enable);
+			wlan_objmgr_vdev_release_ref(conc_vdev,
+						     WLAN_MLME_SB_ID);
+			goto err;
+		}
+	}
+
+	if (!wlan_vdev_mlme_get_he_spr_enabled(vdev)) {
+		mlme_err("Spatial Reuse disabled for vdev_id: %d", vdev_id);
+		goto err;
+	}
+
+	if (mlme_sr_is_enable(vdev)) {
+		if (enable) {
+			wlan_mlme_update_sr_data(vdev, &val, 0, 0, true);
+		} else {
+			/* VDEV down, disable SR */
+			wlan_vdev_mlme_set_sr_ctrl(vdev, 0);
+			wlan_vdev_mlme_set_non_srg_pd_offset(vdev, 0);
+		}
+
+		mlme_debug("SR param val: %x, Enable: %x", val, enable);
+
+		tx_ops = wlan_psoc_get_lmac_if_txops(psoc);
+		if (tx_ops && tx_ops->spatial_reuse_tx_ops.target_if_sr_update)
+			tx_ops->spatial_reuse_tx_ops.target_if_sr_update
+							(pdev, vdev_id, val);
+	} else {
+		mlme_debug("Spatial reuse is disabled in SR control");
+	}
+err:
+	return;
+}
+#endif
+
 /**
  * sta_mlme_vdev_up_send() - MLME vdev UP callback
  * @vdev_mlme: vdev mlme object
@@ -263,9 +420,16 @@ static QDF_STATUS sta_mlme_vdev_up_send(struct vdev_mlme_obj *vdev_mlme,
 					uint16_t event_data_len,
 					void *event_data)
 {
+	QDF_STATUS status;
+
 	mlme_legacy_debug("vdev id = %d ",
 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
-	return wma_sta_vdev_up_send(vdev_mlme, event_data_len, event_data);
+	status = wma_sta_vdev_up_send(vdev_mlme, event_data_len, event_data);
+
+	if (QDF_IS_STATUS_SUCCESS(status))
+		mlme_sr_update(vdev_mlme->vdev, true);
+
+	return status;
 }
 
 /**
@@ -580,9 +744,17 @@ ap_mlme_vdev_is_newchan_no_cac(struct vdev_mlme_obj *vdev_mlme)
 static QDF_STATUS vdevmgr_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme,
 					      uint16_t data_len, void *data)
 {
-	mlme_legacy_debug("vdev id = %d ",
-			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
-	return wma_ap_mlme_vdev_down_send(vdev_mlme, data_len, data);
+	QDF_STATUS status;
+	uint8_t vdev_id;
+
+	vdev_id = wlan_vdev_get_id(vdev_mlme->vdev);
+
+	mlme_legacy_debug("vdev id = %d ", vdev_id);
+	status = wma_ap_mlme_vdev_down_send(vdev_mlme, data_len, data);
+	if (QDF_IS_STATUS_SUCCESS(status))
+		mlme_sr_update(vdev_mlme->vdev, false);
+
+	return status;
 }
 
 /**

+ 2 - 20
core/wma/inc/wma_internal.h

@@ -1291,24 +1291,6 @@ static inline QDF_STATUS wma_set_tsf_gpio_pin(WMA_HANDLE handle, uint32_t pin)
 }
 #endif
 
-#ifdef WLAN_FEATURE_SR
-/**
- * wma_sr_update() - enable/disable spatial reuse
- * @wma: wma handle
- * @vdev_id: vdev id
- * @enable: indicates spatial reuse enable/disable
- *
- * Return: QDF_STATUS_SUCCESS for success or error code
- */
-QDF_STATUS wma_sr_update(tp_wma_handle wma, uint8_t vdev_id, bool enable);
-#else
-static inline QDF_STATUS wma_sr_update(tp_wma_handle wma, uint8_t vdev_id,
-				       bool enable)
-{
-	return QDF_STATUS_SUCCESS;
-}
-#endif
-
 QDF_STATUS wma_set_wisa_params(tp_wma_handle wma, struct sir_wisa_params *wisa);
 
 #ifdef DHCP_SERVER_OFFLOAD
@@ -1704,9 +1686,9 @@ int wma_roam_scan_stats_event_handler(void *handle, uint8_t *event,
  *
  * This function sends del bss resp to upper layer
  *
- * Return: none
+ * Return: Success or Failure status
  */
-void wma_send_vdev_down(tp_wma_handle wma, struct del_bss_resp *req);
+QDF_STATUS wma_send_vdev_down(tp_wma_handle wma, struct del_bss_resp *req);
 
 /**
  * wma_cold_boot_cal_event_handler() - Cold boot cal event handler

+ 9 - 6
core/wma/src/wma_dev_if.c

@@ -2507,7 +2507,8 @@ void wma_send_del_bss_response(tp_wma_handle wma, struct del_bss_resp *resp)
 	}
 }
 
-void wma_send_vdev_down(tp_wma_handle wma, struct del_bss_resp *resp)
+QDF_STATUS
+wma_send_vdev_down(tp_wma_handle wma, struct del_bss_resp *resp)
 {
 	uint8_t vdev_id;
 	struct wma_txrx_node *iface = &wma->interfaces[resp->vdev_id];
@@ -2515,8 +2516,8 @@ void wma_send_vdev_down(tp_wma_handle wma, struct del_bss_resp *resp)
 	QDF_STATUS status;
 
 	if (!resp) {
-		wma_err("req is NULL");
-		return;
+		wma_err("resp is NULL");
+		return QDF_STATUS_E_NULL_VALUE;
 	}
 
 	vdev_id = resp->vdev_id;
@@ -2524,19 +2525,21 @@ void wma_send_vdev_down(tp_wma_handle wma, struct del_bss_resp *resp)
 	if (QDF_IS_STATUS_ERROR(status)) {
 		wma_err("Failed to get vdev stop type");
 		qdf_mem_free(resp);
-		return;
+		return status;
 	}
 
 	if (vdev_stop_type != WMA_DELETE_BSS_HO_FAIL_REQ) {
-		if (wma_send_vdev_down_to_fw(wma, vdev_id) !=
-		    QDF_STATUS_SUCCESS)
+		status = wma_send_vdev_down_to_fw(wma, vdev_id);
+		if (QDF_IS_STATUS_ERROR(status))
 			wma_err("Failed to send vdev down cmd: vdev %d", vdev_id);
 		else
 			wma_check_and_find_mcc_ap(wma, vdev_id);
 	}
+
 	wlan_vdev_mlme_sm_deliver_evt(iface->vdev,
 				      WLAN_VDEV_SM_EV_DOWN_COMPLETE,
 				      sizeof(*resp), resp);
+	return status;
 }
 
 /**

+ 0 - 141
core/wma/src/wma_features.c

@@ -648,147 +648,6 @@ QDF_STATUS wma_process_dhcp_ind(WMA_HANDLE handle,
 					    &peer_set_param_fp);
 }
 
-#ifdef WLAN_FEATURE_SR
-
-static void wma_sr_send_pd_threshold(tp_wma_handle wma,
-				     uint8_t vdev_id,
-				     uint32_t val)
-{
-	struct vdev_set_params vparam;
-	wmi_unified_t wmi_handle = wma->wmi_handle;
-	bool sr_supported =
-		wmi_service_enabled(wmi_handle,
-				    wmi_service_srg_srp_spatial_reuse_support);
-
-	if (sr_supported) {
-		vparam.vdev_id = vdev_id;
-		vparam.param_id = wmi_vdev_param_set_cmd_obss_pd_threshold;
-		vparam.param_value = val;
-		wmi_unified_vdev_set_param_send(wmi_handle, &vparam);
-	} else {
-		wma_debug("Target doesn't support SR operations");
-	}
-}
-
-static void wma_sr_handle_conc(tp_wma_handle wma,
-			       struct wlan_objmgr_vdev *vdev,
-			       struct wlan_objmgr_vdev *conc_vdev,
-			       bool en_sr_curr_vdev)
-{
-	uint32_t val = 0;
-	uint8_t sr_ctrl;
-	uint8_t conc_vdev_id = wlan_vdev_get_id(conc_vdev);
-
-	if (en_sr_curr_vdev) {
-		wlan_vdev_mlme_set_sr_disable_due_conc(vdev, true);
-		wlan_vdev_mlme_set_sr_disable_due_conc(conc_vdev, true);
-		if (!wlan_vdev_mlme_get_he_spr_enabled(conc_vdev))
-			return;
-
-		wma_sr_send_pd_threshold(wma, conc_vdev_id, val);
-		wlan_spatial_reuse_osif_event(conc_vdev,
-					      SR_OPERATION_SUSPEND,
-					      SR_REASON_CODE_CONCURRENCY);
-	} else if (wlan_vdev_mlme_is_sr_disable_due_conc(conc_vdev)) {
-		wlan_vdev_mlme_set_sr_disable_due_conc(conc_vdev, false);
-		if (!wlan_vdev_mlme_get_he_spr_enabled(conc_vdev))
-			return;
-
-		sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(conc_vdev);
-		if ((!(sr_ctrl & NON_SRG_PD_SR_DISALLOWED) &&
-		     (sr_ctrl & NON_SRG_OFFSET_PRESENT)) ||
-		    (sr_ctrl & SRG_INFO_PRESENT)) {
-			wlan_mlme_update_sr_data(conc_vdev, &val, 0, 0, true);
-			wma_sr_send_pd_threshold(wma, conc_vdev_id, val);
-			wlan_spatial_reuse_osif_event(conc_vdev,
-						      SR_OPERATION_RESUME,
-						      SR_REASON_CODE_CONCURRENCY);
-		} else {
-			wma_debug("SR Disabled in SR Control");
-		}
-	}
-}
-
-QDF_STATUS wma_sr_update(tp_wma_handle wma, uint8_t vdev_id, bool enable)
-{
-	uint32_t val = 0;
-	uint8_t mac_id;
-	uint32_t conc_vdev_id;
-	struct wlan_objmgr_vdev *vdev, *conc_vdev;
-	uint8_t sr_ctrl;
-	QDF_STATUS status = QDF_STATUS_SUCCESS;
-	struct wma_txrx_node *wma_conn_table_entry;
-
-	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc, vdev_id,
-						    WLAN_LEGACY_WMA_ID);
-	if (!vdev) {
-		wma_err("Can't get vdev by vdev_id:%d", vdev_id);
-		return QDF_STATUS_E_INVAL;
-	}
-	wma_conn_table_entry = wma_get_interface_by_vdev_id(vdev_id);
-	if (!wma_conn_table_entry) {
-		wma_err("can't find vdev_id %d in WMA table", vdev_id);
-		status = QDF_STATUS_E_FAILURE;
-		goto release_ref;
-	}
-
-	mac_id = wma_conn_table_entry->mac_id;
-	conc_vdev_id = policy_mgr_get_conc_vdev_on_same_mac(wma->psoc, vdev_id,
-							    mac_id);
-	wma_debug("vdev_id %d conc_vdev_id: %d: mac_id: %d", vdev_id,
-		  conc_vdev_id, mac_id);
-	if (conc_vdev_id != WLAN_INVALID_VDEV_ID &&
-	    !policy_mgr_sr_same_mac_conc_enabled(wma->psoc)) {
-		/*
-		 * Single MAC concurrency is not supoprted for SR,
-		 * Disable SR if it is enable on other VDEV and enable
-		 * it back once the once the concurrent vdev is down.
-		 */
-		wma_debug("SR with concurrency is not allowed");
-		conc_vdev =
-		wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc, conc_vdev_id,
-						     WLAN_LEGACY_WMA_ID);
-		if (!conc_vdev) {
-			wma_err("Can't get vdev by vdev_id:%d", conc_vdev_id);
-		} else {
-			wma_sr_handle_conc(wma, vdev, conc_vdev, enable);
-			wlan_objmgr_vdev_release_ref(conc_vdev,
-						     WLAN_LEGACY_WMA_ID);
-			goto release_ref;
-		}
-	}
-
-	if (!wlan_vdev_mlme_get_he_spr_enabled(vdev)) {
-		wma_debug("Spatial Reuse disabled for vdev_id: %u", vdev_id);
-		status = QDF_STATUS_E_NOSUPPORT;
-		goto release_ref;
-	}
-
-	sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(vdev);
-	wma_debug("SR Control: %x", sr_ctrl);
-	if ((!(sr_ctrl & NON_SRG_PD_SR_DISALLOWED) &&
-	     (sr_ctrl & NON_SRG_OFFSET_PRESENT)) ||
-	    (sr_ctrl & SRG_INFO_PRESENT)) {
-		if (enable) {
-			wlan_mlme_update_sr_data(vdev, &val, 0, 0, true);
-		} else {
-			/* VDEV down, disable SR */
-			wlan_vdev_mlme_set_sr_ctrl(vdev, 0);
-			wlan_vdev_mlme_set_non_srg_pd_offset(vdev, 0);
-		}
-
-		wma_debug("SR param val: %x, Enable: %x", val, enable);
-		wma_sr_send_pd_threshold(wma, vdev_id, val);
-	} else {
-		wma_debug("Spatial reuse is disabled in ctrl");
-	}
-
-release_ref:
-	wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
-	return status;
-}
-#endif
-
 #if defined(WLAN_FEATURE_11BE)
 static enum wlan_phymode
 wma_eht_chan_phy_mode(uint32_t freq, uint8_t dot11_mode, uint16_t bw_val,

+ 2 - 1
core/wma/src/wma_mgmt.c

@@ -89,6 +89,7 @@
 #include "wlan_cm_roam_api.h"
 #include "wlan_cm_api.h"
 #include "wlan_mlo_link_force.h"
+#include <target_if_spatial_reuse.h>
 
 /* Max debug string size for WMM in bytes */
 #define WMA_WMM_DEBUG_STRING_SIZE    512
@@ -2552,7 +2553,7 @@ QDF_STATUS wma_set_ap_vdev_up(tp_wma_handle wma, uint8_t vdev_id)
 	wma_set_sap_keepalive(wma, vdev_id);
 	wma_set_vdev_mgmt_rate(wma, vdev_id);
 	wma_vdev_set_he_bss_params(wma, vdev_id, &mlme_obj->proto.he_ops_info);
-	wma_sr_update(wma, vdev_id, true);
+	mlme_sr_update(vdev, true);
 
 	return status;
 }

+ 7 - 13
core/wma/src/wma_utils.c

@@ -70,6 +70,7 @@
 #include "wlan_mlme_ucfg_api.h"
 #include <wlan_cp_stats_mc_tgt_api.h>
 #include "wma_eht.h"
+#include <target_if_spatial_reuse.h>
 
 /* MCS Based rate table */
 /* HT MCS parameters with Nss = 1 */
@@ -4170,26 +4171,22 @@ int wma_rcpi_event_handler(void *handle, uint8_t *cmd_param_info,
 
 QDF_STATUS wma_send_vdev_down_to_fw(t_wma_handle *wma, uint8_t vdev_id)
 {
-	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	struct wma_txrx_node *iface = &wma->interfaces[vdev_id];
 	struct vdev_mlme_obj *vdev_mlme;
+	struct wlan_objmgr_vdev *vdev = iface->vdev;
 
 	if (!wma_is_vdev_valid(vdev_id)) {
 		wma_err("Invalid vdev id:%d", vdev_id);
-		return status;
+		return QDF_STATUS_E_FAILURE;
 	}
 
-	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(iface->vdev);
+	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
 	if (!vdev_mlme) {
 		wma_err("Failed to get vdev mlme obj for vdev id %d", vdev_id);
-		return status;
+		return QDF_STATUS_E_FAILURE;
 	}
 
-	status = vdev_mgr_down_send(vdev_mlme);
-	if (QDF_IS_STATUS_SUCCESS(status))
-		wma_sr_update(wma, vdev_id, false);
-
-	return status;
+	return vdev_mgr_down_send(vdev_mlme);
 }
 
 #ifdef WLAN_FEATURE_LINK_LAYER_STATS
@@ -4514,7 +4511,6 @@ QDF_STATUS wma_sta_vdev_up_send(struct vdev_mlme_obj *vdev_mlme,
 		status = QDF_STATUS_E_FAILURE;
 	} else {
 		wma_set_vdev_mgmt_rate(wma, vdev_id);
-		wma_sr_update(wma, vdev_id, true);
 		if (iface->beacon_filter_enabled)
 			wma_add_beacon_filter(
 					wma,
@@ -4623,9 +4619,7 @@ QDF_STATUS wma_ap_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme,
 	if (!wma)
 		return QDF_STATUS_E_INVAL;
 
-	wma_send_vdev_down(wma, data);
-
-	return QDF_STATUS_SUCCESS;
+	return wma_send_vdev_down(wma, data);
 }
 
 QDF_STATUS