Преглед изворни кода

qcacld-3.0: Refactor vdev stop/down code

Refactor vdev stop and down code to target_if common code.
Remove legacy code for vdev stop and down.

Change-Id: I4ab0743d39a3b37816ab9f18e8850cadf1335c15
CRs-Fixed: 2506649
Abhishek Ambure пре 5 година
родитељ
комит
09905d743a

+ 22 - 0
components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c

@@ -969,6 +969,25 @@ vdevmgr_vdev_delete_rsp_handle(struct vdev_mlme_obj *vdev_mlme,
 	return wma_vdev_detach_callback(vdev_mlme, rsp);
 }
 
+/**
+ * vdevmgr_vdev_stop_rsp_handle() - callback to handle vdev stop response
+ * @vdev_mlme: vdev mlme object
+ * @rsp: pointer to vdev stop response
+ *
+ * This function is called to handle vdev stop response and send result to
+ * upper layer
+ *
+ * Return: QDF_STATUS
+ */
+static QDF_STATUS
+vdevmgr_vdev_stop_rsp_handle(struct vdev_mlme_obj *vdev_mlme,
+			     struct vdev_stop_response *rsp)
+{
+	mlme_legacy_debug("vdev id = %d ",
+			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
+	return wma_vdev_stop_resp_handler(vdev_mlme, rsp);
+}
+
 /**
  * struct sta_mlme_ops - VDEV MLME operation callbacks strucutre for sta
  * @mlme_vdev_start_send:               callback to initiate actions of VDEV
@@ -1011,6 +1030,7 @@ static struct vdev_mlme_ops sta_mlme_ops = {
 	.mlme_vdev_down_send = vdevmgr_mlme_vdev_down_send,
 	.mlme_vdev_notify_down_complete = vdevmgr_notify_down_complete,
 	.mlme_vdev_ext_delete_rsp = vdevmgr_vdev_delete_rsp_handle,
+	.mlme_vdev_ext_stop_rsp = vdevmgr_vdev_stop_rsp_handle,
 };
 
 /**
@@ -1060,6 +1080,7 @@ static struct vdev_mlme_ops ap_mlme_ops = {
 	.mlme_vdev_notify_down_complete = vdevmgr_notify_down_complete,
 	.mlme_vdev_is_newchan_no_cac = ap_mlme_vdev_is_newchan_no_cac,
 	.mlme_vdev_ext_delete_rsp = vdevmgr_vdev_delete_rsp_handle,
+	.mlme_vdev_ext_stop_rsp = vdevmgr_vdev_stop_rsp_handle,
 };
 
 static struct vdev_mlme_ops mon_mlme_ops = {
@@ -1070,6 +1091,7 @@ static struct vdev_mlme_ops mon_mlme_ops = {
 	.mlme_vdev_disconnect_peers = mon_mlme_vdev_disconnect_peers,
 	.mlme_vdev_stop_send = mon_mlme_vdev_stop_send,
 	.mlme_vdev_down_send = mon_mlme_vdev_down_send,
+	.mlme_vdev_ext_delete_rsp = vdevmgr_vdev_delete_rsp_handle,
 };
 
 /**

+ 0 - 4
core/wma/inc/wma.h

@@ -755,10 +755,8 @@ struct roam_synch_frame_ind {
  * @rcpi_req: rcpi request
  * @in_bmps: Whether bmps for this interface has been enabled
  * @vdev_start_wakelock: wakelock to protect vdev start op with firmware
- * @vdev_stop_wakelock: wakelock to protect vdev stop op with firmware
  * @vdev_set_key_wakelock: wakelock to protect vdev set key op with firmware
  * @vdev_start_runtime_wakelock: runtime pm wakelock for vdev start
- * @vdev_stop_runtime_wakelock: runtime pm wakelock for vdev stop
  * @vdev_set_key_runtime_wakelock: runtime pm wakelock for set key
  * @channel: channel
  * @roam_offload_enabled: is roam offload enable/disable
@@ -827,10 +825,8 @@ struct wma_txrx_node {
 	struct beacon_filter_param beacon_filter;
 	bool beacon_filter_enabled;
 	qdf_wake_lock_t vdev_start_wakelock;
-	qdf_wake_lock_t vdev_stop_wakelock;
 	qdf_wake_lock_t vdev_set_key_wakelock;
 	qdf_runtime_lock_t vdev_start_runtime_wakelock;
-	qdf_runtime_lock_t vdev_stop_runtime_wakelock;
 	qdf_runtime_lock_t vdev_set_key_runtime_wakelock;
 	struct roam_synch_frame_ind roam_synch_frame_ind;
 	bool is_waiting_for_key;

+ 11 - 0
core/wma/inc/wma_api.h

@@ -680,6 +680,17 @@ QDF_STATUS wma_vdev_detach_callback(
 				struct vdev_mlme_obj *vdev_mlme,
 				struct vdev_delete_response *rsp);
 
+/**
+ * wma_vdev_stop_resp_handler() - vdev stop response handler
+ * @handle: wma handle
+ * @cmd_param_info: event buffer
+ * @len: buffer length
+ *
+ * Return: 0 for success or error code
+ */
+QDF_STATUS wma_vdev_stop_resp_handler(struct vdev_mlme_obj *vdev_mlme,
+				      struct vdev_stop_response *rsp);
+
 #ifdef FEATURE_WLM_STATS
 /**
  * typedef wma_wlm_stats_cb() - Callback function for WLM stats

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

@@ -640,25 +640,12 @@ void wma_send_set_link_response(tp_wma_handle wma, struct wma_target_req *req);
 
 /**
  * __wma_handle_vdev_stop_rsp() - vdev stop response handler
- * @handle: wma handle
- * @cmd_param_info: event buffer
- * @len: buffer length
+ * @resp_event: pointer to response received
  *
  * Return: QDF_STATUS_SUCCESS for success or QDF_ERROR code
  */
 QDF_STATUS
-__wma_handle_vdev_stop_rsp(wmi_vdev_stopped_event_fixed_param *resp_event);
-
-/**
- * wma_vdev_stop_resp_handler() - vdev stop response handler
- * @handle: wma handle
- * @cmd_param_info: event buffer
- * @len: buffer length
- *
- * Return: 0 for success or error code
- */
-int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info,
-				      uint32_t len);
+__wma_handle_vdev_stop_rsp(struct vdev_stop_response *resp_event);
 
 QDF_STATUS wma_vdev_start(tp_wma_handle wma, struct wma_vdev_start_req *req,
 			  bool isRestart);

+ 30 - 57
core/wma/src/wma_dev_if.c

@@ -2313,13 +2313,13 @@ void wma_send_vdev_down(tp_wma_handle wma, struct wma_target_req *req)
 }
 
 /**
- * wma_send_vdev_down_bss() - handle vdev down req
+ * wma_send_vdev_down_req() - handle vdev down req
  * @wma: wma handle
  * @req: target req
  *
  * Return: none
  */
-static void wma_send_vdev_down_bss(tp_wma_handle wma,
+static void wma_send_vdev_down_req(tp_wma_handle wma,
 				   struct wma_target_req *req)
 {
 	struct wma_txrx_node *iface = &wma->interfaces[req->vdev_id];
@@ -2329,23 +2329,6 @@ static void wma_send_vdev_down_bss(tp_wma_handle wma,
 				      sizeof(*req), req);
 }
 
-/**
- * wma_handle_set_link_down_rsp() - handle link down rsp
- * @wma: wma handle
- * @req: target req
- *
- * Return: none
- */
-static void wma_handle_set_link_down_rsp(tp_wma_handle wma,
-					 struct wma_target_req *req)
-{
-	struct wma_txrx_node *iface = &wma->interfaces[req->vdev_id];
-
-	wlan_vdev_mlme_sm_deliver_evt(iface->vdev,
-				      WLAN_VDEV_SM_EV_MLME_DOWN_REQ,
-				      sizeof(*req), req);
-}
-
 #ifdef WLAN_FEATURE_11W
 static void wma_clear_iface_key(struct wma_txrx_node *iface)
 {
@@ -2358,7 +2341,7 @@ static void wma_clear_iface_key(struct wma_txrx_node *iface)
 #endif
 
 QDF_STATUS
-__wma_handle_vdev_stop_rsp(wmi_vdev_stopped_event_fixed_param *resp_event)
+__wma_handle_vdev_stop_rsp(struct vdev_stop_response *resp_event)
 {
 	tp_wma_handle wma = cds_get_context(QDF_MODULE_ID_WMA);
 	struct wma_target_req *req_msg, *del_req;
@@ -2396,10 +2379,6 @@ __wma_handle_vdev_stop_rsp(wmi_vdev_stopped_event_fixed_param *resp_event)
 
 	/* Clear key information */
 	wma_clear_iface_key(iface);
-	qdf_runtime_pm_allow_suspend(
-			&iface->vdev_stop_runtime_wakelock);
-	wma_release_wakelock(&iface->vdev_stop_wakelock);
-
 	req_msg = wma_find_vdev_req(wma, resp_event->vdev_id,
 				    WMA_TARGET_REQ_TYPE_VDEV_STOP, true);
 	if (!req_msg) {
@@ -2457,7 +2436,7 @@ __wma_handle_vdev_stop_rsp(wmi_vdev_stopped_event_fixed_param *resp_event)
 		WMA_LOGI("%s: Removed peer %pK with peer_addr %pM vdevid %d peer_count %d",
 			 __func__, peer, params->bssid,  params->smesessionId,
 			 iface->peer_count);
-		wma_send_vdev_down_bss(wma, req_msg);
+		wma_send_vdev_down_req(wma, req_msg);
 	} else if (req_msg->msg_type == WMA_DELETE_BSS_REQ) {
 		tpDeleteBssParams params =
 			(tpDeleteBssParams) req_msg->user_data;
@@ -2479,7 +2458,7 @@ __wma_handle_vdev_stop_rsp(wmi_vdev_stopped_event_fixed_param *resp_event)
 		if (status) {
 			WMA_LOGE("%s Del bss failed vdev:%d", __func__,
 				 resp_event->vdev_id);
-			wma_send_vdev_down_bss(wma, req_msg);
+			wma_send_vdev_down_req(wma, req_msg);
 			goto free_req_msg;
 		}
 
@@ -2487,7 +2466,7 @@ __wma_handle_vdev_stop_rsp(wmi_vdev_stopped_event_fixed_param *resp_event)
 					wmi_service_sync_delete_cmds))
 			goto free_req_msg;
 
-		wma_send_vdev_down_bss(wma, req_msg);
+		wma_send_vdev_down_req(wma, req_msg);
 	} else if (req_msg->msg_type == WMA_SET_LINK_STATE) {
 		tpLinkStateParams params =
 			(tpLinkStateParams) req_msg->user_data;
@@ -2527,7 +2506,7 @@ __wma_handle_vdev_stop_rsp(wmi_vdev_stopped_event_fixed_param *resp_event)
 		}
 
 set_link_rsp:
-		wma_handle_set_link_down_rsp(wma, req_msg);
+		wma_send_vdev_down_req(wma, req_msg);
 	}
 
 free_req_msg:
@@ -2549,46 +2528,40 @@ free_req_msg:
  */
 static QDF_STATUS
 wma_handle_vdev_stop_rsp(tp_wma_handle wma,
-			 wmi_vdev_stopped_event_fixed_param *resp_event)
+			 struct vdev_stop_response *resp_event)
 {
 	struct wma_txrx_node *iface;
 
 	iface = &wma->interfaces[resp_event->vdev_id];
-
 	return wlan_vdev_mlme_sm_deliver_evt(iface->vdev,
 					     WLAN_VDEV_SM_EV_STOP_RESP,
 					     sizeof(*resp_event), resp_event);
 }
 
-int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info,
-			       uint32_t len)
+QDF_STATUS wma_vdev_stop_resp_handler(struct vdev_mlme_obj *vdev_mlme,
+				      struct vdev_stop_response *rsp)
 {
-	tp_wma_handle wma = (tp_wma_handle) handle;
-	WMI_VDEV_STOPPED_EVENTID_param_tlvs *param_buf;
-	wmi_vdev_stopped_event_fixed_param *resp_event;
-	int32_t status = 0;
-
-	WMA_LOGD("%s: Enter", __func__);
+	tp_wma_handle wma;
+	struct wma_txrx_node *iface = NULL;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 
-	param_buf = (WMI_VDEV_STOPPED_EVENTID_param_tlvs *) cmd_param_info;
-	if (!param_buf) {
-		WMA_LOGE("Invalid event buffer");
-		return -EINVAL;
+	wma = cds_get_context(QDF_MODULE_ID_WMA);
+	if (!wma) {
+		wma_err("wma handle is NULL for VDEV_%d", rsp->vdev_id);
+		return status;
 	}
 
-	resp_event = param_buf->fixed_param;
+	iface = &wma->interfaces[vdev_mlme->vdev->vdev_objmgr.vdev_id];
 
-	if (resp_event->vdev_id >= wma->max_bssid) {
+	if (rsp->vdev_id >= wma->max_bssid) {
 		WMA_LOGE("%s: Invalid vdev_id %d from FW",
-				__func__, resp_event->vdev_id);
-		return -EINVAL;
+				__func__, rsp->vdev_id);
+		return QDF_STATUS_E_INVAL;
 	}
 
-	status = wma_handle_vdev_stop_rsp(wma, resp_event);
-	if (QDF_IS_STATUS_ERROR(status))
-		return -EINVAL;
+	status = wma_handle_vdev_stop_rsp(wma, rsp);
 
-	return 0;
+	return status;
 }
 
 QDF_STATUS wma_post_vdev_create_setup(struct wlan_objmgr_vdev *vdev)
@@ -3367,12 +3340,12 @@ int wma_peer_delete_handler(void *handle, uint8_t *cmd_param_info,
 		WMA_LOGD(FL("Calling vdev detach handler"));
 		wma_handle_vdev_detach(wma, data->self_sta_param);
 		qdf_mem_free(data);
-	} else if (req_msg->type == WMA_SET_LINK_PEER_RSP) {
-		wma_handle_set_link_down_rsp(wma, req_msg);
-	} else if (req_msg->type == WMA_DELETE_PEER_RSP) {
-		wma_send_vdev_down_bss(wma, req_msg);
+	} else if (req_msg->type == WMA_SET_LINK_PEER_RSP ||
+		   req_msg->type == WMA_DELETE_PEER_RSP) {
+		wma_send_vdev_down_req(wma, req_msg);
 	}
 	qdf_mem_free(req_msg);
+
 	return status;
 }
 
@@ -3505,7 +3478,7 @@ void wma_hold_req_timer(void *data)
 		if (wma_crash_on_fw_timeout(wma->fw_timeout_crash))
 			wma_trigger_recovery_assert_on_fw_timeout(
 				WMA_DELETE_STA_REQ);
-		wma_send_vdev_down_bss(wma, tgt_req);
+		wma_send_vdev_down_req(wma, tgt_req);
 	} else if ((tgt_req->msg_type == SIR_HAL_PDEV_SET_HW_MODE) &&
 			(tgt_req->type == WMA_PDEV_SET_HW_MODE_RESP)) {
 		struct sir_set_hw_mode_resp *params =
@@ -3777,7 +3750,7 @@ void wma_vdev_resp_timer(void *data)
 					     params);
 		if (status) {
 			WMA_LOGE("Del BSS failed call del bss response vdev_id:%d", tgt_req->vdev_id);
-			wma_send_vdev_down_bss(wma, tgt_req);
+			wma_send_vdev_down_req(wma, tgt_req);
 		}
 
 		if (wmi_service_enabled(wma->wmi_handle,
@@ -5712,7 +5685,7 @@ void wma_delete_bss_ho_fail(tp_wma_handle wma, tpDeleteBssParams params)
 	struct wma_txrx_node *iface;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 	struct wma_target_req *msg;
-	wmi_vdev_stopped_event_fixed_param resp_event;
+	struct vdev_stop_response resp_event;
 
 	pdev = cds_get_context(QDF_MODULE_ID_TXRX);
 

+ 5 - 8
core/wma/src/wma_main.c

@@ -2864,8 +2864,6 @@ void wma_vdev_init(struct wma_txrx_node *vdev)
 {
 	qdf_wake_lock_create(&vdev->vdev_start_wakelock, "vdev_start");
 	qdf_runtime_lock_init(&vdev->vdev_start_runtime_wakelock);
-	qdf_wake_lock_create(&vdev->vdev_stop_wakelock, "vdev_stop");
-	qdf_runtime_lock_init(&vdev->vdev_stop_runtime_wakelock);
 	qdf_wake_lock_create(&vdev->vdev_set_key_wakelock, "vdev_set_key");
 	qdf_runtime_lock_init(&vdev->vdev_set_key_runtime_wakelock);
 	vdev->is_waiting_for_key = false;
@@ -2948,8 +2946,6 @@ void wma_vdev_deinit(struct wma_txrx_node *vdev)
 
 	qdf_runtime_lock_deinit(&vdev->vdev_set_key_runtime_wakelock);
 	qdf_wake_lock_destroy(&vdev->vdev_set_key_wakelock);
-	qdf_runtime_lock_deinit(&vdev->vdev_stop_runtime_wakelock);
-	qdf_wake_lock_destroy(&vdev->vdev_stop_wakelock);
 	qdf_runtime_lock_deinit(&vdev->vdev_start_runtime_wakelock);
 	qdf_wake_lock_destroy(&vdev->vdev_start_wakelock);
 	vdev->is_waiting_for_key = false;
@@ -3406,10 +3402,11 @@ QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc,
 					   WMA_RX_SERIALIZER_CTX);
 
 	/* Register vdev stop response event handler */
-	wmi_unified_register_event_handler(wma_handle->wmi_handle,
-					   wmi_vdev_stopped_event_id,
-					   wma_vdev_stop_resp_handler,
-					   WMA_RX_SERIALIZER_CTX);
+	wmi_unified_register_event_handler(
+				wma_handle->wmi_handle,
+				wmi_vdev_stopped_event_id,
+				target_if_vdev_mgr_stop_response_handler,
+				WMA_RX_SERIALIZER_CTX);
 
 	/* register for STA kickout function */
 	wmi_unified_register_event_handler(wma_handle->wmi_handle,

+ 26 - 20
core/wma/src/wma_utils.c

@@ -63,6 +63,7 @@
 #include <wlan_mlme_main.h>
 #include "host_diag_core_log.h"
 #include <wlan_mlme_api.h>
+#include <../../core/src/vdev_mgr_ops.h>
 
 /* MCS Based rate table */
 /* HT MCS parameters with Nss = 1 */
@@ -3470,12 +3471,18 @@ wma_send_vdev_start_to_fw(t_wma_handle *wma, struct vdev_start_params *params)
 
 QDF_STATUS wma_send_vdev_stop_to_fw(t_wma_handle *wma, uint8_t vdev_id)
 {
-	QDF_STATUS status;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	struct wma_txrx_node *iface = &wma->interfaces[vdev_id];
+	struct vdev_mlme_obj *vdev_mlme = NULL;
 
 	if (!wma_is_vdev_valid(vdev_id)) {
 		WMA_LOGE("%s: Invalid vdev id:%d", __func__, vdev_id);
-		status = QDF_STATUS_E_FAILURE;
+		return status;
+	}
+
+	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(iface->vdev);
+	if (!vdev_mlme) {
+		WMA_LOGE("Failed to get vdev mlme obj for vdev id %d", vdev_id);
 		return status;
 	}
 
@@ -3488,16 +3495,8 @@ QDF_STATUS wma_send_vdev_stop_to_fw(t_wma_handle *wma, uint8_t vdev_id)
 	qdf_mem_copy(mlme_get_dynamic_vdev_config(iface->vdev),
 		     mlme_get_ini_vdev_config(iface->vdev),
 		     sizeof(struct wlan_mlme_nss_chains));
-	wma_acquire_wakelock(&iface->vdev_stop_wakelock,
-			     WMA_VDEV_STOP_REQUEST_TIMEOUT);
-	qdf_runtime_pm_prevent_suspend(
-			&iface->vdev_stop_runtime_wakelock);
-	status = wmi_unified_vdev_stop_send(wma->wmi_handle, vdev_id);
-	if (QDF_IS_STATUS_ERROR(status)) {
-		qdf_runtime_pm_allow_suspend(
-				&iface->vdev_stop_runtime_wakelock);
-		wma_release_wakelock(&iface->vdev_stop_wakelock);
-	}
+
+	status = vdev_mgr_stop_send(vdev_mlme);
 
 	return status;
 }
@@ -3731,20 +3730,27 @@ QDF_STATUS wma_send_vdev_up_to_fw(t_wma_handle *wma,
 
 QDF_STATUS wma_send_vdev_down_to_fw(t_wma_handle *wma, uint8_t vdev_id)
 {
-	QDF_STATUS status;
-	struct wma_txrx_node *vdev;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
+	struct wma_txrx_node *iface = &wma->interfaces[vdev_id];
+	struct vdev_mlme_obj *vdev_mlme;
 
 	if (!wma_is_vdev_valid(vdev_id)) {
 		WMA_LOGE("%s: Invalid vdev id:%d", __func__, vdev_id);
-		return QDF_STATUS_E_FAILURE;
+		return status;
+	}
+
+	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(iface->vdev);
+	if (!vdev_mlme) {
+		WMA_LOGE("Failed to get vdev mlme obj for vdev id %d", vdev_id);
+		return status;
 	}
 
 	wma_update_roam_offload_flag(wma, vdev_id, false);
-	vdev = &wma->interfaces[vdev_id];
 	wma->interfaces[vdev_id].roaming_in_progress = false;
-	status = wmi_unified_vdev_down_send(wma->wmi_handle, vdev_id);
-	qdf_runtime_pm_allow_suspend(&vdev->vdev_start_runtime_wakelock);
-	wma_release_wakelock(&vdev->vdev_start_wakelock);
+
+	status = vdev_mgr_down_send(vdev_mlme);
+	qdf_runtime_pm_allow_suspend(&iface->vdev_start_runtime_wakelock);
+	wma_release_wakelock(&iface->vdev_start_wakelock);
 
 	return status;
 }
@@ -4153,7 +4159,7 @@ QDF_STATUS wma_mlme_vdev_stop_continue(struct vdev_mlme_obj *vdev_mlme,
 				       uint16_t data_len, void *data)
 {
 	return __wma_handle_vdev_stop_rsp(
-			(wmi_vdev_stopped_event_fixed_param *)data);
+			(struct vdev_stop_response *)data);
 }
 
 QDF_STATUS wma_ap_mlme_vdev_down_send(struct vdev_mlme_obj *vdev_mlme,