diff --git a/core/mac/src/pe/lim/lim_api.c b/core/mac/src/pe/lim/lim_api.c index 5639d8bf00..59147b4b05 100644 --- a/core/mac/src/pe/lim/lim_api.c +++ b/core/mac/src/pe/lim/lim_api.c @@ -75,6 +75,17 @@ #include "cfg_ucfg_api.h" #include "wlan_mlme_public_struct.h" #include "wlan_scan_utils_api.h" +#include +#include + +struct pe_hang_event_fixed_param { + uint32_t tlv_header; + uint8_t vdev_id; + uint8_t limmlmstate; + uint8_t limprevmlmstate; + uint8_t limsmestate; + uint8_t limprevsmestate; +} qdf_packed; static void __lim_init_bss_vars(struct mac_context *mac) { @@ -726,6 +737,51 @@ static QDF_STATUS lim_unregister_sap_bcn_callback(struct mac_context *mac_ctx) return status; } +static int pe_hang_event_notifier_call(struct notifier_block *block, + unsigned long state, + void *data) +{ + qdf_notif_block *notif_block = qdf_container_of(block, qdf_notif_block, + notif_block); + struct mac_context *mac; + struct pe_session *session; + struct qdf_notifer_data *pe_hang_data = data; + uint8_t *pe_data; + uint8_t i; + struct pe_hang_event_fixed_param *cmd; + + if (!data) + return NOTIFY_STOP_MASK; + + mac = notif_block->priv_data; + if (!mac) + return NOTIFY_STOP_MASK; + + if (pe_hang_data->offset >= QDF_WLAN_MAX_HOST_OFFSET) + return NOTIFY_STOP_MASK; + + for (i = 0; i < mac->lim.maxBssId; i++) { + session = &mac->lim.gpSession[i]; + if (!session->valid) + continue; + + pe_data = (pe_hang_data->hang_data + pe_hang_data->offset); + cmd = (struct pe_hang_event_fixed_param *)pe_data; + cmd->vdev_id = session->vdev_id; + cmd->limmlmstate = session->limMlmState; + cmd->limprevmlmstate = session->limPrevMlmState; + cmd->limsmestate = session->limSmeState; + cmd->limprevsmestate = session->limPrevSmeState; + pe_hang_data->offset += sizeof(*cmd); + } + + return NOTIFY_OK; +} + +static qdf_notif_block pe_hang_event_notifier = { + .notif_block.notifier_call = pe_hang_event_notifier_call, +}; + /** ------------------------------------------------------------- \fn pe_open \brief will be called in Open sequence from mac_open @@ -794,6 +850,9 @@ QDF_STATUS pe_open(struct mac_context *mac, struct cds_config_info *cds_cfg) pe_err("%s: Shutdown notifier register failed", __func__); } + pe_hang_event_notifier.priv_data = mac; + qdf_hang_event_register_notifier(&pe_hang_event_notifier); + return status; /* status here will be QDF_STATUS_SUCCESS */ pe_open_lock_fail: @@ -822,6 +881,7 @@ QDF_STATUS pe_close(struct mac_context *mac) if (ANI_DRIVER_TYPE(mac) == QDF_DRIVER_TYPE_MFG) return QDF_STATUS_SUCCESS; + qdf_hang_event_unregister_notifier(&pe_hang_event_notifier); lim_cleanup(mac); lim_unregister_sap_bcn_callback(mac);