diff --git a/core/hdd/src/wlan_hdd_twt.c b/core/hdd/src/wlan_hdd_twt.c index 728c56e455..7db94c6511 100644 --- a/core/hdd/src/wlan_hdd_twt.c +++ b/core/hdd/src/wlan_hdd_twt.c @@ -2563,29 +2563,26 @@ void hdd_send_twt_role_disable_cmd(struct hdd_context *hdd_ctx, void wlan_hdd_twt_init(struct hdd_context *hdd_ctx) { QDF_STATUS status; + struct twt_callbacks twt_cb; hdd_ctx->twt_state = TWT_INIT; sme_init_twt_complete_cb(hdd_ctx->mac_handle); - status = sme_register_twt_enable_complete_cb(hdd_ctx->mac_handle, - hdd_twt_enable_comp_cb); - if (!QDF_IS_STATUS_SUCCESS(status)) { + twt_cb.twt_enable_cb = hdd_twt_enable_comp_cb; + twt_cb.twt_disable_cb = hdd_twt_disable_comp_cb; + twt_cb.twt_add_dialog_cb = hdd_twt_add_dialog_comp_cb; + twt_cb.twt_del_dialog_cb = hdd_twt_del_dialog_comp_cb; + twt_cb.twt_pause_dialog_cb = hdd_twt_pause_dialog_comp_cb; + twt_cb.twt_resume_dialog_cb = hdd_twt_resume_dialog_comp_cb; + status = sme_register_twt_callbacks(hdd_ctx->mac_handle, &twt_cb); + if (QDF_IS_STATUS_ERROR(status)) { hdd_err("Register twt enable complete failed"); return; } - status = sme_register_twt_disable_complete_cb(hdd_ctx->mac_handle, - hdd_twt_disable_comp_cb); - if (!QDF_IS_STATUS_SUCCESS(status)) { - sme_deregister_twt_enable_complete_cb(hdd_ctx->mac_handle); - hdd_err("Register twt disable complete failed"); - return; - } - status = qdf_event_create(&hdd_ctx->twt_disable_comp_evt); - if (!QDF_IS_STATUS_SUCCESS(status)) { - sme_deregister_twt_disable_complete_cb(hdd_ctx->mac_handle); - sme_deregister_twt_enable_complete_cb(hdd_ctx->mac_handle); + if (QDF_IS_STATUS_ERROR(status)) { + sme_deregister_twt_callbacks(hdd_ctx->mac_handle); hdd_err("twt_disable_comp_evt init failed"); return; } @@ -2597,16 +2594,13 @@ void wlan_hdd_twt_deinit(struct hdd_context *hdd_ctx) { QDF_STATUS status; - status = sme_deregister_twt_disable_complete_cb(hdd_ctx->mac_handle); + status = qdf_event_destroy(&hdd_ctx->twt_disable_comp_evt); + if (QDF_IS_STATUS_ERROR(status)) + hdd_err("Failed to destroy twt_disable_comp_evt"); + + status = sme_deregister_twt_callbacks(hdd_ctx->mac_handle); if (!QDF_IS_STATUS_SUCCESS(status)) hdd_err("De-register of twt disable cb failed: %d", status); - status = sme_deregister_twt_enable_complete_cb(hdd_ctx->mac_handle); - if (!QDF_IS_STATUS_SUCCESS(status)) - hdd_err("De-register of twt enable cb failed: %d", status); - - if (!QDF_IS_STATUS_SUCCESS(qdf_event_destroy( - &hdd_ctx->twt_disable_comp_evt))) - hdd_err("Failed to destroy twt_disable_comp_evt"); hdd_ctx->twt_state = TWT_CLOSED; } diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index d46baedb61..663a5ba8fd 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -3706,24 +3706,14 @@ QDF_STATUS sme_test_config_twt_setup(struct wmi_twt_add_dialog_param *params); QDF_STATUS sme_init_twt_complete_cb(mac_handle_t mac_handle); /** - * sme_register_twt_enable_complete_cb() - TWT enable registrar + * sme_register_twt_callbacks() - TWT enable registrar * @mac_handle: MAC handle - * @twt_enable_cb: Function callback to handle enable event + * @twt_cb: TWT callbacks * * Return: QDF Status */ -QDF_STATUS sme_register_twt_enable_complete_cb(mac_handle_t mac_handle, - twt_enable_cb twt_enable_cb); - -/** - * sme_register_twt_disable_complete_cb() - TWT disable registrar - * @mac_handle: MAC handle - * @twt_disable_cb: Function callback to handle disable event - * - * Return: QDF Status - */ -QDF_STATUS sme_register_twt_disable_complete_cb(mac_handle_t mac_handle, - twt_disable_cb twt_disable_cb); +QDF_STATUS sme_register_twt_callbacks(mac_handle_t mac_handle, + struct twt_callbacks *twt_cb); /** * sme_add_dialog_cmd() - Register callback and send TWT add dialog @@ -3805,20 +3795,13 @@ sme_resume_dialog_cmd(mac_handle_t mac_handle, void *context); /** - * sme_deregister_twt_enable_complete_cb() - TWT enable deregistrar + * sme_deregister_twt_callbacks() - TWT enable deregistrar * @mac_handle: Opaque handle to the global MAC context * * Return: QDF Status */ -QDF_STATUS sme_deregister_twt_enable_complete_cb(mac_handle_t mac_handle); +QDF_STATUS sme_deregister_twt_callbacks(mac_handle_t mac_handle); -/** - * sme_deregister_twt_disable_complete_cb() - TWT disable deregistrar - * @mac_handle: Opaque handle to the global MAC context - * - * Return: QDF Status - */ -QDF_STATUS sme_deregister_twt_disable_complete_cb(mac_handle_t mac_handle); #else static inline diff --git a/core/sme/inc/sme_internal.h b/core/sme/inc/sme_internal.h index bcc50c39e8..54727f1723 100644 --- a/core/sme/inc/sme_internal.h +++ b/core/sme/inc/sme_internal.h @@ -206,6 +206,29 @@ void (*twt_nudge_dialog_cb)(void *context, typedef void (*twt_resume_dialog_cb)(void *context, struct wmi_twt_resume_dialog_complete_event_param *params); + +/** + * struct twt_callbacks - TWT response callback pointers + * @twt_enable_cb: TWT enable completion callback + * @twt_disable_cb: TWT disable completion callback + * @twt_add_dialog_cb: TWT add dialog completion callback + * @twt_del_dialog_cb: TWT delete dialog completion callback + * @twt_pause_dialog_cb: TWT pause dialog completion callback + * @twt_resume_dialog_cb: TWT resume dialog completion callback + */ +struct twt_callbacks { + void (*twt_enable_cb)(hdd_handle_t hdd_handle, + struct wmi_twt_enable_complete_event_param *params); + void (*twt_disable_cb)(hdd_handle_t hdd_handle); + void (*twt_add_dialog_cb)(hdd_handle_t hdd_handle, + struct twt_add_dialog_complete_event *add_dialog_event); + void (*twt_del_dialog_cb)(void *context, + struct wmi_twt_del_dialog_complete_event_param *params); + void (*twt_pause_dialog_cb)(void *context, + struct wmi_twt_pause_dialog_complete_event_param *params); + void (*twt_resume_dialog_cb)(void *context, + struct wmi_twt_resume_dialog_complete_event_param *params); +}; #endif #ifdef FEATURE_WLAN_APF diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index 0ea0ab1e1b..326e89f255 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -2094,7 +2094,6 @@ sme_process_twt_add_dialog_event(struct mac_context *mac, twt_add_dialog_cb callback; callback = mac->sme.twt_add_dialog_cb; - mac->sme.twt_add_dialog_cb = NULL; if (callback) callback(mac->hdd_handle, add_dialog_event); } @@ -2138,7 +2137,6 @@ sme_process_twt_pause_dialog_event(struct mac_context *mac, callback = mac->sme.twt_pause_dialog_cb; context = mac->sme.twt_pause_dialog_context; - mac->sme.twt_pause_dialog_cb = NULL; if (callback) callback(context, param); } @@ -2182,7 +2180,6 @@ sme_process_twt_resume_dialog_event(struct mac_context *mac, callback = mac->sme.twt_resume_dialog_cb; context = mac->sme.twt_resume_dialog_context; - mac->sme.twt_resume_dialog_cb = NULL; if (callback) callback(context, param); } @@ -14369,46 +14366,39 @@ QDF_STATUS sme_init_twt_complete_cb(mac_handle_t mac_handle) return status; } -QDF_STATUS sme_register_twt_enable_complete_cb(mac_handle_t mac_handle, - twt_enable_cb twt_enable_cb) +QDF_STATUS sme_register_twt_callbacks(mac_handle_t mac_handle, + struct twt_callbacks *twt_cb) { QDF_STATUS status; struct mac_context *mac = MAC_CONTEXT(mac_handle); status = sme_acquire_global_lock(&mac->sme); if (QDF_IS_STATUS_SUCCESS(status)) { - mac->sme.twt_enable_cb = twt_enable_cb; + mac->sme.twt_enable_cb = twt_cb->twt_enable_cb; + mac->sme.twt_add_dialog_cb = twt_cb->twt_add_dialog_cb; + mac->sme.twt_del_dialog_cb = twt_cb->twt_del_dialog_cb; + mac->sme.twt_pause_dialog_cb = twt_cb->twt_pause_dialog_cb; + mac->sme.twt_resume_dialog_cb = twt_cb->twt_resume_dialog_cb; + mac->sme.twt_disable_cb = twt_cb->twt_disable_cb; sme_release_global_lock(&mac->sme); - sme_debug("TWT: enable callback set"); + sme_debug("TWT: callbacks registered"); } return status; } -QDF_STATUS sme_register_twt_disable_complete_cb(mac_handle_t mac_handle, - twt_disable_cb twt_disable_cb) +QDF_STATUS sme_deregister_twt_callbacks(mac_handle_t mac_handle) { - QDF_STATUS status; - struct mac_context *mac = MAC_CONTEXT(mac_handle); + struct twt_callbacks twt_cb; - status = sme_acquire_global_lock(&mac->sme); - if (QDF_IS_STATUS_SUCCESS(status)) { - mac->sme.twt_disable_cb = twt_disable_cb; - sme_release_global_lock(&mac->sme); - sme_debug("TWT: disable callback set"); - } + twt_cb.twt_enable_cb = NULL; + twt_cb.twt_add_dialog_cb = NULL; + twt_cb.twt_del_dialog_cb = NULL; + twt_cb.twt_pause_dialog_cb = NULL; + twt_cb.twt_resume_dialog_cb = NULL; + twt_cb.twt_disable_cb = NULL; - return status; -} - -QDF_STATUS sme_deregister_twt_enable_complete_cb(mac_handle_t mac_handle) -{ - return sme_register_twt_enable_complete_cb(mac_handle, NULL); -} - -QDF_STATUS sme_deregister_twt_disable_complete_cb(mac_handle_t mac_handle) -{ - return sme_register_twt_disable_complete_cb(mac_handle, NULL); + return sme_register_twt_callbacks(mac_handle, &twt_cb); } QDF_STATUS sme_add_dialog_cmd(mac_handle_t mac_handle, @@ -14440,13 +14430,6 @@ QDF_STATUS sme_add_dialog_cmd(mac_handle_t mac_handle, return status; } - if (mac->sme.twt_add_dialog_cb) { - sme_release_global_lock(&mac->sme); - qdf_mem_free(cmd_params); - sme_err_rl("TWT: Command in progress - STATUS E_BUSY"); - return QDF_STATUS_E_BUSY; - } - /* Serialize the req through MC thread */ mac->sme.twt_add_dialog_cb = twt_add_dialog_cb; twt_msg.bodyptr = cmd_params; @@ -14497,13 +14480,6 @@ QDF_STATUS sme_del_dialog_cmd(mac_handle_t mac_handle, return status; } - if (mac->sme.twt_del_dialog_cb) { - sme_release_global_lock(&mac->sme); - qdf_mem_free(cmd_params); - sme_err_rl("TWT: Command in progress - STATUS E_BUSY"); - return QDF_STATUS_E_BUSY; - } - /* Serialize the req through MC thread */ mac->sme.twt_del_dialog_cb = del_dialog_cb; mac->sme.twt_del_dialog_context = context; @@ -14556,13 +14532,6 @@ sme_pause_dialog_cmd(mac_handle_t mac_handle, return status; } - if (mac->sme.twt_pause_dialog_cb) { - sme_release_global_lock(&mac->sme); - qdf_mem_free(cmd_params); - sme_err_rl("TWT: Command in progress - STATUS E_BUSY"); - return QDF_STATUS_E_BUSY; - } - /* Serialize the req through MC thread */ mac->sme.twt_pause_dialog_cb = pause_dialog_cb; mac->sme.twt_pause_dialog_context = context; @@ -14676,13 +14645,6 @@ sme_resume_dialog_cmd(mac_handle_t mac_handle, return status; } - if (mac->sme.twt_resume_dialog_cb) { - sme_release_global_lock(&mac->sme); - qdf_mem_free(cmd_params); - sme_err_rl("TWT: Command in progress - STATUS E_BUSY"); - return QDF_STATUS_E_BUSY; - } - /* Serialize the req through MC thread */ mac->sme.twt_resume_dialog_cb = resume_dialog_cb; mac->sme.twt_resume_dialog_context = context;