From b2eec6938c0532044d44eea4064ec40f28ce51e9 Mon Sep 17 00:00:00 2001 From: Deeksha Gupta Date: Tue, 4 May 2021 16:41:29 +0530 Subject: [PATCH] qcacld-3.0: Add support for SAP TWT teardown event Firmare sends SAP TWT teardown event to host. Host handle the event and send values to userspace via nl layer Change-Id: I714c6a18399c1e0d8b79d31af984037f2f5e2024 CRs-Fixed: 2938332 --- components/mlme/core/inc/wlan_mlme_main.h | 10 +++ components/mlme/core/src/wlan_mlme_main.c | 20 ++++++ core/sme/src/common/sme_api.c | 88 ++++++++++++++++------- 3 files changed, 92 insertions(+), 26 deletions(-) diff --git a/components/mlme/core/inc/wlan_mlme_main.h b/components/mlme/core/inc/wlan_mlme_main.h index 16b7f3bfd90b..928f7a7c0367 100644 --- a/components/mlme/core/inc/wlan_mlme_main.h +++ b/components/mlme/core/inc/wlan_mlme_main.h @@ -558,6 +558,16 @@ void mlme_set_discon_reason_n_from_ap(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, bool from_ap, uint32_t reason_code); +/** + * wlan_get_opmode_from_vdev_id() - Get opmode from vdevid + * @psoc: PSOC pointer + * @vdev_id: vdev id + * + * Return: opmode + */ +enum QDF_OPMODE wlan_get_opmode_from_vdev_id(struct wlan_objmgr_pdev *pdev, + uint8_t vdev_id); + /** * mlme_get_discon_reason_n_from_ap() - Get disconnect reason and from ap flag * @psoc: PSOC pointer diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index d7e8fd66226a..6343aafd7e51 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/components/mlme/core/src/wlan_mlme_main.c @@ -2704,6 +2704,26 @@ void mlme_set_discon_reason_n_from_ap(struct wlan_objmgr_psoc *psoc, wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID); } +enum QDF_OPMODE wlan_get_opmode_from_vdev_id(struct wlan_objmgr_pdev *pdev, + uint8_t vdev_id) +{ + struct wlan_objmgr_vdev *vdev; + enum QDF_OPMODE opmode = QDF_MAX_NO_OF_MODE; + + if (!pdev) + return opmode; + + vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id, + WLAN_LEGACY_MAC_ID); + if (!vdev) + return opmode; + + opmode = wlan_vdev_mlme_get_opmode(vdev); + wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_MAC_ID); + + return opmode; +} + void mlme_get_discon_reason_n_from_ap(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id, bool *from_ap, uint32_t *reason_code) diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index b2e142796005..886f8c5b5a6c 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -2179,25 +2179,20 @@ sme_is_twt_teardown_failed(enum WMI_HOST_DEL_TWT_STATUS teardown_status) return false; } -/** - * sme_process_twt_del_dialog_event() - Process twt del dialog event - * response from firmware - * @mac: Global MAC pointer - * @param: pointer to wmi_twt_del_dialog_complete_event_param buffer - * - * Return: None - */ static void -sme_process_twt_del_dialog_event(struct mac_context *mac, - struct wmi_twt_del_dialog_complete_event_param *param) +sme_process_sta_twt_del_dialog_event( + struct mac_context *mac, + struct wmi_twt_del_dialog_complete_event_param *param) { twt_del_dialog_cb callback; bool is_evt_allowed; enum wlan_twt_commands active_cmd = WLAN_TWT_NONE; is_evt_allowed = mlme_twt_is_command_in_progress( - mac->psoc, (struct qdf_mac_addr *)param->peer_macaddr, - param->dialog_id, WLAN_TWT_TERMINATE, &active_cmd); + mac->psoc, (struct qdf_mac_addr *) + param->peer_macaddr, param->dialog_id, + WLAN_TWT_TERMINATE, &active_cmd); + if (!is_evt_allowed && param->dialog_id != WLAN_ALL_SESSIONS_DIALOG_ID && param->status != WMI_HOST_DEL_TWT_STATUS_ROAMING && @@ -2205,6 +2200,7 @@ sme_process_twt_del_dialog_event(struct mac_context *mac, param->status != WMI_HOST_DEL_TWT_STATUS_CONCURRENCY) { sme_debug("Drop TWT Del dialog event for dialog_id:%d status:%d active_cmd:%d", param->dialog_id, param->status, active_cmd); + return; } @@ -2214,28 +2210,67 @@ sme_process_twt_del_dialog_event(struct mac_context *mac, if (param->status == WMI_HOST_DEL_TWT_STATUS_ROAMING || param->status == WMI_HOST_DEL_TWT_STATUS_CONCURRENCY) - mlme_twt_set_wait_for_notify( - mac->psoc, param->vdev_id, true); + mlme_twt_set_wait_for_notify(mac->psoc, param->vdev_id, true); /* Reset the active TWT command to none */ - mlme_set_twt_command_in_progress( - mac->psoc, (struct qdf_mac_addr *)param->peer_macaddr, - param->dialog_id, WLAN_TWT_NONE); + mlme_set_twt_command_in_progress(mac->psoc, (struct qdf_mac_addr *) + param->peer_macaddr, param->dialog_id, + WLAN_TWT_NONE); if (sme_is_twt_teardown_failed(param->status)) return; ucfg_mlme_set_twt_setup_done(mac->psoc, (struct qdf_mac_addr *) - param->peer_macaddr, - param->dialog_id, false); + param->peer_macaddr, param->dialog_id, + false); - ucfg_mlme_set_twt_session_state( - mac->psoc, (struct qdf_mac_addr *)param->peer_macaddr, - param->dialog_id, WLAN_TWT_SETUP_STATE_NOT_ESTABLISHED); + ucfg_mlme_set_twt_session_state(mac->psoc, (struct qdf_mac_addr *) + param->peer_macaddr, param->dialog_id, + WLAN_TWT_SETUP_STATE_NOT_ESTABLISHED); mlme_init_twt_context(mac->psoc, (struct qdf_mac_addr *) - param->peer_macaddr, - param->dialog_id); + param->peer_macaddr, param->dialog_id); +} + +/** + * sme_process_twt_del_dialog_event() - Process twt del dialog event + * response from firmware + * @mac: Global MAC pointer + * @param: pointer to wmi_twt_del_dialog_complete_event_param buffer + * + * Return: None + */ +static void +sme_process_twt_del_dialog_event( + struct mac_context *mac, + struct wmi_twt_del_dialog_complete_event_param *param) +{ + twt_del_dialog_cb callback; + enum QDF_OPMODE opmode; + QDF_STATUS qdf_status = QDF_STATUS_E_FAILURE; + + opmode = wlan_get_opmode_from_vdev_id(mac->pdev, param->vdev_id); + + qdf_status = sme_acquire_global_lock(&mac->sme); + if (QDF_IS_STATUS_ERROR(qdf_status)) + return; + + switch (opmode) { + case QDF_SAP_MODE: + callback = mac->sme.twt_del_dialog_cb; + if (callback) + callback(mac->psoc, param); + break; + case QDF_STA_MODE: + sme_process_sta_twt_del_dialog_event(mac, param); + break; + default: + sme_debug("TWT Teardown is not supported on %s", + qdf_opmode_str(opmode)); + } + + sme_release_global_lock(&mac->sme); + return; } /** @@ -2355,8 +2390,9 @@ sme_process_twt_add_dialog_event(struct mac_context *mac, } static void -sme_process_twt_del_dialog_event(struct mac_context *mac, - struct wmi_twt_del_dialog_complete_event_param *param) +sme_process_twt_del_dialog_event( + struct mac_context *mac, + struct wmi_twt_del_dialog_complete_event_param *param) { }