From 09905d743ae27a127342228da2503e56d74bb9a4 Mon Sep 17 00:00:00 2001 From: Abhishek Ambure Date: Thu, 8 Aug 2019 19:45:55 +0530 Subject: [PATCH] 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 --- .../core/src/wlan_mlme_vdev_mgr_interface.c | 22 +++++ core/wma/inc/wma.h | 4 - core/wma/inc/wma_api.h | 11 +++ core/wma/inc/wma_internal.h | 17 +--- core/wma/src/wma_dev_if.c | 87 +++++++------------ core/wma/src/wma_main.c | 13 ++- core/wma/src/wma_utils.c | 46 +++++----- 7 files changed, 96 insertions(+), 104 deletions(-) diff --git a/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c b/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c index 291126c29520..98bd7a21deb6 100644 --- a/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c +++ b/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, }; /** diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h index 6ebfdc493804..af3e521a2951 100644 --- a/core/wma/inc/wma.h +++ b/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; diff --git a/core/wma/inc/wma_api.h b/core/wma/inc/wma_api.h index 47b933e0dd33..118c8cffb20e 100644 --- a/core/wma/inc/wma_api.h +++ b/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 diff --git a/core/wma/inc/wma_internal.h b/core/wma/inc/wma_internal.h index 053a47df9c63..df583fb8cb55 100644 --- a/core/wma/inc/wma_internal.h +++ b/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); diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 05fefb01f068..8b624a42d47d 100644 --- a/core/wma/src/wma_dev_if.c +++ b/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; + tp_wma_handle wma; + struct wma_txrx_node *iface = NULL; + QDF_STATUS status = QDF_STATUS_E_FAILURE; - WMA_LOGD("%s: Enter", __func__); - - 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); diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index 15b007d7ceec..cd9964f802bd 100644 --- a/core/wma/src/wma_main.c +++ b/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, diff --git a/core/wma/src/wma_utils.c b/core/wma/src/wma_utils.c index c15412394a57..ecd4e1d9ea6f 100644 --- a/core/wma/src/wma_utils.c +++ b/core/wma/src/wma_utils.c @@ -63,6 +63,7 @@ #include #include "host_diag_core_log.h" #include +#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,