qcacld-3.0: Refine roam event processing for LFR2/LFR3
Currently wmi_roam_event_id event handler only register under feature WLAN_FEATURE_ROAM_OFFLOAD, but it's needed for LFR2 roaming too. So refine roam event processing for LFR2/LFR3. Change-Id: Ic07fd8a543142fc1e151f484979ab99ff55ce802 CRs-Fixed: 3161973
This commit is contained in:

committed by
Madan Koyyalamudi

parent
4dc55d662a
commit
3f80fae5f0
4
Kbuild
4
Kbuild
@@ -1546,6 +1546,7 @@ MLME_OBJS += $(CM_DIR)/dispatcher/src/wlan_cm_tgt_if_tx_api.o \
|
|||||||
$(CM_DIR)/dispatcher/src/wlan_cm_roam_api.o \
|
$(CM_DIR)/dispatcher/src/wlan_cm_roam_api.o \
|
||||||
$(CM_DIR)/dispatcher/src/wlan_cm_roam_ucfg_api.o \
|
$(CM_DIR)/dispatcher/src/wlan_cm_roam_ucfg_api.o \
|
||||||
$(CM_TGT_IF_DIR)/src/target_if_cm_roam_offload.o \
|
$(CM_TGT_IF_DIR)/src/target_if_cm_roam_offload.o \
|
||||||
|
$(CM_TGT_IF_DIR)/src/target_if_cm_roam_event.o \
|
||||||
$(CM_DIR)/core/src/wlan_cm_roam_offload.o \
|
$(CM_DIR)/core/src/wlan_cm_roam_offload.o \
|
||||||
$(CM_DIR)/core/src/wlan_cm_vdev_connect.o \
|
$(CM_DIR)/core/src/wlan_cm_vdev_connect.o \
|
||||||
$(CM_DIR)/core/src/wlan_cm_vdev_disconnect.o
|
$(CM_DIR)/core/src/wlan_cm_vdev_disconnect.o
|
||||||
@@ -1555,8 +1556,7 @@ MLME_OBJS += $(CM_DIR)/utf/src/cm_utf.o
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(CONFIG_QCACLD_WLAN_LFR3), y)
|
ifeq ($(CONFIG_QCACLD_WLAN_LFR3), y)
|
||||||
MLME_OBJS += $(CM_TGT_IF_DIR)/src/target_if_cm_roam_event.o \
|
MLME_OBJS += $(CM_DIR)/core/src/wlan_cm_roam_fw_sync.o \
|
||||||
$(CM_DIR)/core/src/wlan_cm_roam_fw_sync.o \
|
|
||||||
$(CM_DIR)/core/src/wlan_cm_roam_offload_event.o
|
$(CM_DIR)/core/src/wlan_cm_roam_offload_event.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@@ -30,7 +30,6 @@
|
|||||||
#include "wlan_cm_roam_public_struct.h"
|
#include "wlan_cm_roam_public_struct.h"
|
||||||
#include <target_if.h>
|
#include <target_if.h>
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
|
||||||
/**
|
/**
|
||||||
* target_if_cm_get_roam_rx_ops() - Get CM roam rx ops registered
|
* target_if_cm_get_roam_rx_ops() - Get CM roam rx ops registered
|
||||||
* @psoc: pointer to psoc object
|
* @psoc: pointer to psoc object
|
||||||
@@ -40,6 +39,37 @@
|
|||||||
struct wlan_cm_roam_rx_ops *
|
struct wlan_cm_roam_rx_ops *
|
||||||
target_if_cm_get_roam_rx_ops(struct wlan_objmgr_psoc *psoc);
|
target_if_cm_get_roam_rx_ops(struct wlan_objmgr_psoc *psoc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* target_if_cm_roam_register_rx_ops - Target IF API to register roam
|
||||||
|
* related rx op.
|
||||||
|
* @rx_ops: Pointer to rx ops fp struct
|
||||||
|
*
|
||||||
|
* Return: none
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
target_if_cm_roam_register_rx_ops(struct wlan_cm_roam_rx_ops *rx_ops);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* target_if_cm_roam_event() - Target IF handler for roam events
|
||||||
|
* @scn: target handle
|
||||||
|
* @event: event buffer
|
||||||
|
* @len: event buffer length
|
||||||
|
*
|
||||||
|
* Return: int for success or error code
|
||||||
|
*/
|
||||||
|
int target_if_cm_roam_event(ol_scn_t scn, uint8_t *event, uint32_t len);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* target_if_roam_register_common_events() - register common roam events
|
||||||
|
* of LFR2/3
|
||||||
|
* @psoc: pointer to psoc object
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
target_if_roam_register_common_events(struct wlan_objmgr_psoc *psoc);
|
||||||
|
|
||||||
|
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||||
/**
|
/**
|
||||||
* target_if_cm_roam_sync_event() - Target IF handler for roam sync events
|
* target_if_cm_roam_sync_event() - Target IF handler for roam sync events
|
||||||
* @scn: target handle
|
* @scn: target handle
|
||||||
@@ -65,16 +95,6 @@ target_if_cm_roam_sync_frame_event(ol_scn_t scn,
|
|||||||
uint8_t *event,
|
uint8_t *event,
|
||||||
uint32_t len);
|
uint32_t len);
|
||||||
|
|
||||||
/**
|
|
||||||
* target_if_cm_roam_event() - Target IF handler for roam events
|
|
||||||
* @scn: target handle
|
|
||||||
* @event: event buffer
|
|
||||||
* @len: event buffer length
|
|
||||||
*
|
|
||||||
* Return: int for success or error code
|
|
||||||
*/
|
|
||||||
int target_if_cm_roam_event(ol_scn_t scn, uint8_t *event, uint32_t len);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* target_if_cm_roam_stats_event() - Target IF handler for roam stats event
|
* target_if_cm_roam_stats_event() - Target IF handler for roam stats event
|
||||||
* @scn: target handle
|
* @scn: target handle
|
||||||
@@ -99,7 +119,7 @@ target_if_cm_roam_auth_offload_event(ol_scn_t scn, uint8_t *event,
|
|||||||
uint32_t len);
|
uint32_t len);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* target_if_roam_offload_register_events() - register roam events
|
* target_if_roam_offload_register_events() - register roam offload events
|
||||||
* @psoc: pointer to psoc object
|
* @psoc: pointer to psoc object
|
||||||
*
|
*
|
||||||
* Return: QDF_STATUS
|
* Return: QDF_STATUS
|
||||||
@@ -143,16 +163,6 @@ int
|
|||||||
target_if_pmkid_request_event_handler(ol_scn_t scn, uint8_t *event,
|
target_if_pmkid_request_event_handler(ol_scn_t scn, uint8_t *event,
|
||||||
uint32_t len);
|
uint32_t len);
|
||||||
|
|
||||||
/**
|
|
||||||
* target_if_cm_roam_register_rx_ops - Target IF API to register roam
|
|
||||||
* related rx op.
|
|
||||||
* @rx_ops: Pointer to rx ops fp struct
|
|
||||||
*
|
|
||||||
* Return: none
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
target_if_cm_roam_register_rx_ops(struct wlan_cm_roam_rx_ops *rx_ops);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* target_if_roam_frame_event_handler - Target IF API to receive
|
* target_if_roam_frame_event_handler - Target IF API to receive
|
||||||
* Beacon/probe for the roaming candidate.
|
* Beacon/probe for the roaming candidate.
|
||||||
@@ -166,12 +176,6 @@ int
|
|||||||
target_if_roam_frame_event_handler(ol_scn_t scn, uint8_t *event,
|
target_if_roam_frame_event_handler(ol_scn_t scn, uint8_t *event,
|
||||||
uint32_t len);
|
uint32_t len);
|
||||||
#else /* WLAN_FEATURE_ROAM_OFFLOAD */
|
#else /* WLAN_FEATURE_ROAM_OFFLOAD */
|
||||||
static inline
|
|
||||||
void
|
|
||||||
target_if_cm_roam_register_rx_ops(struct wlan_cm_roam_rx_ops *rx_ops)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
QDF_STATUS
|
QDF_STATUS
|
||||||
target_if_roam_offload_register_events(struct wlan_objmgr_psoc *psoc)
|
target_if_roam_offload_register_events(struct wlan_objmgr_psoc *psoc)
|
||||||
@@ -179,12 +183,6 @@ target_if_roam_offload_register_events(struct wlan_objmgr_psoc *psoc)
|
|||||||
return QDF_STATUS_E_NOSUPPORT;
|
return QDF_STATUS_E_NOSUPPORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
|
||||||
target_if_cm_roam_event(ol_scn_t scn, uint8_t *event, uint32_t len)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
target_if_cm_roam_vdev_disconnect_event_handler(ol_scn_t scn, uint8_t *event,
|
target_if_cm_roam_vdev_disconnect_event_handler(ol_scn_t scn, uint8_t *event,
|
||||||
uint32_t len)
|
uint32_t len)
|
||||||
|
@@ -67,6 +67,93 @@ target_if_cm_roam_register_rx_ops(struct wlan_cm_roam_rx_ops *rx_ops)
|
|||||||
rx_ops->roam_candidate_frame_event = cm_roam_candidate_event_handler;
|
rx_ops->roam_candidate_frame_event = cm_roam_candidate_event_handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int target_if_cm_roam_event(ol_scn_t scn, uint8_t *event, uint32_t len)
|
||||||
|
{
|
||||||
|
QDF_STATUS qdf_status;
|
||||||
|
struct wmi_unified *wmi_handle;
|
||||||
|
struct roam_offload_roam_event *roam_event = NULL;
|
||||||
|
struct wlan_objmgr_psoc *psoc;
|
||||||
|
struct wlan_cm_roam_rx_ops *roam_rx_ops;
|
||||||
|
|
||||||
|
psoc = target_if_get_psoc_from_scn_hdl(scn);
|
||||||
|
if (!psoc) {
|
||||||
|
target_if_err("psoc is null");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
|
||||||
|
if (!wmi_handle) {
|
||||||
|
target_if_err("wmi_handle is null");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
roam_event = qdf_mem_malloc(sizeof(*roam_event));
|
||||||
|
if (!roam_event)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
qdf_status = wmi_extract_roam_event(wmi_handle, event, len, roam_event);
|
||||||
|
if (QDF_IS_STATUS_ERROR(qdf_status)) {
|
||||||
|
target_if_err("parsing of event failed, %d", qdf_status);
|
||||||
|
qdf_status = QDF_STATUS_E_INVAL;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
roam_event->psoc = psoc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop the timer upon RSO stop status success. The timer shall continue
|
||||||
|
* to run upon HO_FAIL status and would be stopped upon HO_FAILED event
|
||||||
|
*/
|
||||||
|
if (roam_event->reason == ROAM_REASON_RSO_STATUS ||
|
||||||
|
roam_event->reason == ROAM_REASON_HO_FAILED)
|
||||||
|
target_if_stop_rso_stop_timer(roam_event);
|
||||||
|
|
||||||
|
roam_rx_ops = target_if_cm_get_roam_rx_ops(psoc);
|
||||||
|
if (!roam_rx_ops || !roam_rx_ops->roam_event_rx) {
|
||||||
|
target_if_err("No valid roam rx ops");
|
||||||
|
qdf_status = QDF_STATUS_E_INVAL;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This can be called from IRQ context for WOW events such as
|
||||||
|
* WOW_REASON_LOW_RSSI and WOW_REASON_HO_FAIL. There is no issue
|
||||||
|
* currently, as these events are posted to schedular thread from
|
||||||
|
* cm_roam_event_handler, to access umac which use mutex.
|
||||||
|
* If any new ROAM event is added in IRQ context in future, avoid taking
|
||||||
|
* mutex. If mutex/sleep is needed, post a message to scheduler thread.
|
||||||
|
*/
|
||||||
|
qdf_status = roam_rx_ops->roam_event_rx(roam_event);
|
||||||
|
|
||||||
|
done:
|
||||||
|
qdf_mem_free(roam_event);
|
||||||
|
return qdf_status_to_os_return(qdf_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
QDF_STATUS
|
||||||
|
target_if_roam_register_common_events(struct wlan_objmgr_psoc *psoc)
|
||||||
|
{
|
||||||
|
QDF_STATUS ret;
|
||||||
|
wmi_unified_t handle = get_wmi_unified_hdl_from_psoc(psoc);
|
||||||
|
|
||||||
|
if (!handle) {
|
||||||
|
target_if_err("handle is NULL");
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Register for LFR2/3 commmon roam event */
|
||||||
|
ret = wmi_unified_register_event_handler(handle, wmi_roam_event_id,
|
||||||
|
target_if_cm_roam_event,
|
||||||
|
WMI_RX_SERIALIZER_CTX);
|
||||||
|
if (QDF_IS_STATUS_ERROR(ret)) {
|
||||||
|
target_if_err("wmi event registration failed, ret: %d", ret);
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||||
static void
|
static void
|
||||||
target_if_free_roam_synch_frame_ind(struct roam_synch_frame_ind *frame_ind)
|
target_if_free_roam_synch_frame_ind(struct roam_synch_frame_ind *frame_ind)
|
||||||
{
|
{
|
||||||
@@ -206,69 +293,6 @@ err:
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int target_if_cm_roam_event(ol_scn_t scn, uint8_t *event, uint32_t len)
|
|
||||||
{
|
|
||||||
QDF_STATUS qdf_status;
|
|
||||||
struct wmi_unified *wmi_handle;
|
|
||||||
struct roam_offload_roam_event *roam_event = NULL;
|
|
||||||
struct wlan_objmgr_psoc *psoc;
|
|
||||||
struct wlan_cm_roam_rx_ops *roam_rx_ops;
|
|
||||||
|
|
||||||
psoc = target_if_get_psoc_from_scn_hdl(scn);
|
|
||||||
if (!psoc) {
|
|
||||||
target_if_err("psoc is null");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
wmi_handle = get_wmi_unified_hdl_from_psoc(psoc);
|
|
||||||
if (!wmi_handle) {
|
|
||||||
target_if_err("wmi_handle is null");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
roam_event = qdf_mem_malloc(sizeof(*roam_event));
|
|
||||||
if (!roam_event)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
qdf_status = wmi_extract_roam_event(wmi_handle, event, len, roam_event);
|
|
||||||
if (QDF_IS_STATUS_ERROR(qdf_status)) {
|
|
||||||
target_if_err("parsing of event failed, %d", qdf_status);
|
|
||||||
qdf_status = QDF_STATUS_E_INVAL;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
roam_event->psoc = psoc;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Stop the timer upon RSO stop status success. The timer shall continue
|
|
||||||
* to run upon HO_FAIL status and would be stopped upon HO_FAILED event
|
|
||||||
*/
|
|
||||||
if (roam_event->reason == ROAM_REASON_RSO_STATUS ||
|
|
||||||
roam_event->reason == ROAM_REASON_HO_FAILED)
|
|
||||||
target_if_stop_rso_stop_timer(roam_event);
|
|
||||||
|
|
||||||
roam_rx_ops = target_if_cm_get_roam_rx_ops(psoc);
|
|
||||||
if (!roam_rx_ops || !roam_rx_ops->roam_event_rx) {
|
|
||||||
target_if_err("No valid roam rx ops");
|
|
||||||
qdf_status = QDF_STATUS_E_INVAL;
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This can be called from IRQ context for WOW events such as
|
|
||||||
* WOW_REASON_LOW_RSSI and WOW_REASON_HO_FAIL. There is no issue
|
|
||||||
* currently, as these events are posted to schedular thread from
|
|
||||||
* cm_roam_event_handler, to access umac which use mutex.
|
|
||||||
* If any new ROAM event is added in IRQ context in future, avoid taking
|
|
||||||
* mutex. If mutex/sleep is needed, post a message to scheduler thread.
|
|
||||||
*/
|
|
||||||
qdf_status = roam_rx_ops->roam_event_rx(roam_event);
|
|
||||||
|
|
||||||
done:
|
|
||||||
qdf_mem_free(roam_event);
|
|
||||||
return qdf_status_to_os_return(qdf_status);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
target_if_cm_btm_denylist_event(ol_scn_t scn, uint8_t *event, uint32_t len)
|
target_if_cm_btm_denylist_event(ol_scn_t scn, uint8_t *event, uint32_t len)
|
||||||
{
|
{
|
||||||
@@ -630,13 +654,6 @@ target_if_roam_offload_register_events(struct wlan_objmgr_psoc *psoc)
|
|||||||
target_if_err("wmi event registration failed, ret: %d", ret);
|
target_if_err("wmi event registration failed, ret: %d", ret);
|
||||||
return QDF_STATUS_E_FAILURE;
|
return QDF_STATUS_E_FAILURE;
|
||||||
}
|
}
|
||||||
ret = wmi_unified_register_event_handler(handle, wmi_roam_event_id,
|
|
||||||
target_if_cm_roam_event,
|
|
||||||
WMI_RX_SERIALIZER_CTX);
|
|
||||||
if (QDF_IS_STATUS_ERROR(ret)) {
|
|
||||||
target_if_err("wmi event registration failed, ret: %d", ret);
|
|
||||||
return QDF_STATUS_E_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = wmi_unified_register_event_handler(handle,
|
ret = wmi_unified_register_event_handler(handle,
|
||||||
wmi_roam_denylist_event_id,
|
wmi_roam_denylist_event_id,
|
||||||
@@ -709,3 +726,4 @@ target_if_roam_offload_register_events(struct wlan_objmgr_psoc *psoc)
|
|||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
|
||||||
|
@@ -1218,6 +1218,21 @@ cm_roam_candidate_event_handler(struct wlan_objmgr_psoc *psoc,
|
|||||||
{
|
{
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline QDF_STATUS
|
||||||
|
cm_roam_sync_event_handler(struct wlan_objmgr_psoc *psoc,
|
||||||
|
uint8_t *event, uint32_t len,
|
||||||
|
struct roam_offload_synch_ind *sync_ind)
|
||||||
|
{
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline QDF_STATUS
|
||||||
|
cm_roam_sync_frame_event_handler(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct roam_synch_frame_ind *frame_ind)
|
||||||
|
{
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
|
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_FIPS
|
#ifdef WLAN_FEATURE_FIPS
|
||||||
|
@@ -2414,6 +2414,12 @@ cm_vdev_disconnect_event_handler(struct vdev_disconnect_event_data *data)
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDF_STATUS
|
||||||
|
cm_roam_auth_offload_event_handler(struct auth_offload_event *auth_event)
|
||||||
|
{
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
QDF_STATUS
|
QDF_STATUS
|
||||||
cm_roam_pmkid_request_handler(struct roam_pmkid_req_event *data)
|
cm_roam_pmkid_request_handler(struct roam_pmkid_req_event *data)
|
||||||
{
|
{
|
||||||
@@ -3293,6 +3299,13 @@ err:
|
|||||||
qdf_mem_free(stats_info);
|
qdf_mem_free(stats_info);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
QDF_STATUS
|
||||||
|
cm_roam_stats_event_handler(struct wlan_objmgr_psoc *psoc,
|
||||||
|
struct roam_stats_event *stats_info)
|
||||||
|
{
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_FIPS
|
#ifdef WLAN_FEATURE_FIPS
|
||||||
|
@@ -141,6 +141,22 @@ QDF_STATUS wmi_unified_plm_start_cmd(wmi_unified_t wmi_handle,
|
|||||||
const struct plm_req_params *plm);
|
const struct plm_req_params *plm);
|
||||||
#endif /* FEATURE_WLAN_ESE */
|
#endif /* FEATURE_WLAN_ESE */
|
||||||
|
|
||||||
|
#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
|
||||||
|
/**
|
||||||
|
* wmi_extract_roam_event - Extract roam event
|
||||||
|
* @wmi_handle: WMI handle
|
||||||
|
* @event: Event data received from firmware
|
||||||
|
* @data_len: Event data length received from firmware
|
||||||
|
* @roam_event: Extract the event and fill in roam_event
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
wmi_extract_roam_event(wmi_unified_t wmi_handle, uint8_t *event,
|
||||||
|
uint32_t data_len,
|
||||||
|
struct roam_offload_roam_event *roam_event);
|
||||||
|
#endif /* WLAN_FEATURE_HOST_ROAM || WLAN_FEATURE_ROAM_OFFLOAD */
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||||
/* wmi_unified_set_ric_req_cmd() - set ric request element
|
/* wmi_unified_set_ric_req_cmd() - set ric request element
|
||||||
* @wmi_handle: wmi handle
|
* @wmi_handle: wmi handle
|
||||||
@@ -271,20 +287,6 @@ wmi_extract_roam_sync_frame_event(wmi_unified_t wmi_handle, void *event,
|
|||||||
uint32_t len,
|
uint32_t len,
|
||||||
struct roam_synch_frame_ind *frame_ptr);
|
struct roam_synch_frame_ind *frame_ptr);
|
||||||
|
|
||||||
/**
|
|
||||||
* wmi_extract_roam_event - Extract roam event
|
|
||||||
* @wmi_handle: WMI handle
|
|
||||||
* @event: Event data received from firmware
|
|
||||||
* @data_len: Event data length received from firmware
|
|
||||||
* @roam_event: Extract the event and fill in roam_event
|
|
||||||
*
|
|
||||||
* Return: QDF_STATUS
|
|
||||||
*/
|
|
||||||
QDF_STATUS
|
|
||||||
wmi_extract_roam_event(wmi_unified_t wmi_handle, uint8_t *event,
|
|
||||||
uint32_t data_len,
|
|
||||||
struct roam_offload_roam_event *roam_event);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wmi_extract_btm_denylist_event - Extract btm denylist event
|
* wmi_extract_btm_denylist_event - Extract btm denylist event
|
||||||
* @wmi_handle: WMI handle
|
* @wmi_handle: WMI handle
|
||||||
|
@@ -328,6 +328,21 @@ QDF_STATUS wmi_unified_get_roam_scan_ch_list(wmi_unified_t wmi_handle,
|
|||||||
return QDF_STATUS_E_FAILURE;
|
return QDF_STATUS_E_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
|
||||||
|
QDF_STATUS
|
||||||
|
wmi_extract_roam_event(wmi_unified_t wmi_handle, uint8_t *event,
|
||||||
|
uint32_t data_len,
|
||||||
|
struct roam_offload_roam_event *roam_event)
|
||||||
|
{
|
||||||
|
if (wmi_handle->ops->extract_roam_event)
|
||||||
|
return wmi_handle->ops->extract_roam_event(wmi_handle, event,
|
||||||
|
data_len,
|
||||||
|
roam_event);
|
||||||
|
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
#endif /* WLAN_FEATURE_HOST_ROAM || WLAN_FEATURE_ROAM_OFFLOAD */
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||||
QDF_STATUS wmi_unified_set_roam_triggers(wmi_unified_t wmi_handle,
|
QDF_STATUS wmi_unified_set_roam_triggers(wmi_unified_t wmi_handle,
|
||||||
struct wlan_roam_triggers *triggers)
|
struct wlan_roam_triggers *triggers)
|
||||||
@@ -366,19 +381,6 @@ wmi_extract_roam_sync_frame_event(wmi_unified_t wmi_handle, void *event,
|
|||||||
return QDF_STATUS_E_FAILURE;
|
return QDF_STATUS_E_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
QDF_STATUS
|
|
||||||
wmi_extract_roam_event(wmi_unified_t wmi_handle, uint8_t *event,
|
|
||||||
uint32_t data_len,
|
|
||||||
struct roam_offload_roam_event *roam_event)
|
|
||||||
{
|
|
||||||
if (wmi_handle->ops->extract_roam_event)
|
|
||||||
return wmi_handle->ops->extract_roam_event(wmi_handle, event,
|
|
||||||
data_len,
|
|
||||||
roam_event);
|
|
||||||
|
|
||||||
return QDF_STATUS_E_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
QDF_STATUS
|
QDF_STATUS
|
||||||
wmi_extract_btm_denylist_event(wmi_unified_t wmi_handle,
|
wmi_extract_btm_denylist_event(wmi_unified_t wmi_handle,
|
||||||
uint8_t *event,
|
uint8_t *event,
|
||||||
|
@@ -833,6 +833,254 @@ convert_roam_trigger_reason(enum roam_trigger_reason trigger_reason)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
|
||||||
|
static char *wmi_get_roam_event_reason_string(uint32_t reason)
|
||||||
|
{
|
||||||
|
switch (reason) {
|
||||||
|
case WMI_ROAM_REASON_INVALID:
|
||||||
|
return "Default";
|
||||||
|
case WMI_ROAM_REASON_BETTER_AP:
|
||||||
|
return "Better AP";
|
||||||
|
case WMI_ROAM_REASON_BMISS:
|
||||||
|
return "BMISS";
|
||||||
|
case WMI_ROAM_REASON_LOW_RSSI:
|
||||||
|
return "Low Rssi";
|
||||||
|
case WMI_ROAM_REASON_SUITABLE_AP:
|
||||||
|
return "Suitable AP";
|
||||||
|
case WMI_ROAM_REASON_HO_FAILED:
|
||||||
|
return "Hand-off Failed";
|
||||||
|
case WMI_ROAM_REASON_INVOKE_ROAM_FAIL:
|
||||||
|
return "Roam Invoke failed";
|
||||||
|
case WMI_ROAM_REASON_RSO_STATUS:
|
||||||
|
return "RSO status";
|
||||||
|
case WMI_ROAM_REASON_BTM:
|
||||||
|
return "BTM";
|
||||||
|
case WMI_ROAM_REASON_DEAUTH:
|
||||||
|
return "Deauth";
|
||||||
|
default:
|
||||||
|
return "Invalid";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "Invalid";
|
||||||
|
}
|
||||||
|
|
||||||
|
static enum roam_reason
|
||||||
|
wmi_convert_fw_reason_to_cm_reason(uint32_t reason)
|
||||||
|
{
|
||||||
|
switch (reason) {
|
||||||
|
case WMI_ROAM_REASON_INVALID:
|
||||||
|
return ROAM_REASON_INVALID;
|
||||||
|
case WMI_ROAM_REASON_BETTER_AP:
|
||||||
|
return ROAM_REASON_BETTER_AP;
|
||||||
|
case WMI_ROAM_REASON_BMISS:
|
||||||
|
return ROAM_REASON_BMISS;
|
||||||
|
case WMI_ROAM_REASON_LOW_RSSI:
|
||||||
|
return ROAM_REASON_LOW_RSSI;
|
||||||
|
case WMI_ROAM_REASON_SUITABLE_AP:
|
||||||
|
return ROAM_REASON_SUITABLE_AP;
|
||||||
|
case WMI_ROAM_REASON_HO_FAILED:
|
||||||
|
return ROAM_REASON_HO_FAILED;
|
||||||
|
case WMI_ROAM_REASON_INVOKE_ROAM_FAIL:
|
||||||
|
return ROAM_REASON_INVOKE_ROAM_FAIL;
|
||||||
|
case WMI_ROAM_REASON_RSO_STATUS:
|
||||||
|
return ROAM_REASON_RSO_STATUS;
|
||||||
|
case WMI_ROAM_REASON_BTM:
|
||||||
|
return ROAM_REASON_BTM;
|
||||||
|
case WMI_ROAM_REASON_DEAUTH:
|
||||||
|
return ROAM_REASON_DEAUTH;
|
||||||
|
default:
|
||||||
|
return ROAM_REASON_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ROAM_REASON_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
static enum cm_roam_notif
|
||||||
|
wmi_convert_fw_notif_to_cm_notif(uint32_t fw_notif)
|
||||||
|
{
|
||||||
|
switch (fw_notif) {
|
||||||
|
case WMI_ROAM_NOTIF_ROAM_START:
|
||||||
|
return CM_ROAM_NOTIF_ROAM_START;
|
||||||
|
case WMI_ROAM_NOTIF_ROAM_ABORT:
|
||||||
|
return CM_ROAM_NOTIF_ROAM_ABORT;
|
||||||
|
case WMI_ROAM_NOTIF_ROAM_REASSOC:
|
||||||
|
return CM_ROAM_NOTIF_ROAM_REASSOC;
|
||||||
|
case WMI_ROAM_NOTIF_SCAN_MODE_SUCCESS:
|
||||||
|
return CM_ROAM_NOTIF_SCAN_MODE_SUCCESS;
|
||||||
|
case WMI_ROAM_NOTIF_SCAN_MODE_FAIL:
|
||||||
|
return CM_ROAM_NOTIF_SCAN_MODE_FAIL;
|
||||||
|
case WMI_ROAM_NOTIF_DISCONNECT:
|
||||||
|
return CM_ROAM_NOTIF_DISCONNECT;
|
||||||
|
case WMI_ROAM_NOTIF_SUBNET_CHANGED:
|
||||||
|
return CM_ROAM_NOTIF_SUBNET_CHANGED;
|
||||||
|
case WMI_ROAM_NOTIF_SCAN_START:
|
||||||
|
return CM_ROAM_NOTIF_SCAN_START;
|
||||||
|
case WMI_ROAM_NOTIF_DEAUTH_RECV:
|
||||||
|
return CM_ROAM_NOTIF_DEAUTH_RECV;
|
||||||
|
case WMI_ROAM_NOTIF_DISASSOC_RECV:
|
||||||
|
return CM_ROAM_NOTIF_DISASSOC_RECV;
|
||||||
|
case WMI_ROAM_NOTIF_SCAN_MODE_SUCCESS_WITH_HO_FAIL:
|
||||||
|
return CM_ROAM_NOTIF_HO_FAIL;
|
||||||
|
case WMI_ROAM_NOTIF_SCAN_END:
|
||||||
|
return CM_ROAM_NOTIF_SCAN_END;
|
||||||
|
default:
|
||||||
|
return CM_ROAM_NOTIF_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CM_ROAM_NOTIF_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
wmi_extract_pdev_hw_mode_trans_ind(
|
||||||
|
wmi_pdev_hw_mode_transition_event_fixed_param *fixed_param,
|
||||||
|
wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry,
|
||||||
|
struct cm_hw_mode_trans_ind *hw_mode_trans_ind)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
if (fixed_param->num_vdev_mac_entries > MAX_VDEV_SUPPORTED) {
|
||||||
|
wmi_err("Number of Vdev mac entries %d exceeded max vdev supported %d",
|
||||||
|
fixed_param->num_vdev_mac_entries,
|
||||||
|
MAX_VDEV_SUPPORTED);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
hw_mode_trans_ind->old_hw_mode_index = fixed_param->old_hw_mode_index;
|
||||||
|
hw_mode_trans_ind->new_hw_mode_index = fixed_param->new_hw_mode_index;
|
||||||
|
hw_mode_trans_ind->num_vdev_mac_entries =
|
||||||
|
fixed_param->num_vdev_mac_entries;
|
||||||
|
wmi_debug("old_hw_mode_index:%d new_hw_mode_index:%d entries=%d",
|
||||||
|
fixed_param->old_hw_mode_index,
|
||||||
|
fixed_param->new_hw_mode_index,
|
||||||
|
fixed_param->num_vdev_mac_entries);
|
||||||
|
|
||||||
|
if (!vdev_mac_entry) {
|
||||||
|
wmi_err("Invalid vdev_mac_entry");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Store the vdev-mac map in WMA and send to policy manager */
|
||||||
|
for (i = 0; i < fixed_param->num_vdev_mac_entries; i++) {
|
||||||
|
uint32_t vdev_id, mac_id, pdev_id;
|
||||||
|
|
||||||
|
vdev_id = vdev_mac_entry[i].vdev_id;
|
||||||
|
pdev_id = vdev_mac_entry[i].pdev_id;
|
||||||
|
|
||||||
|
if (pdev_id == OL_TXRX_PDEV_ID) {
|
||||||
|
wmi_err("soc level id received for mac id");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (vdev_id >= WLAN_MAX_VDEVS) {
|
||||||
|
wmi_err("vdev_id: %d is invalid, max_bssid: %d",
|
||||||
|
vdev_id, WLAN_MAX_VDEVS);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
mac_id = WMI_PDEV_TO_MAC_MAP(vdev_mac_entry[i].pdev_id);
|
||||||
|
|
||||||
|
hw_mode_trans_ind->vdev_mac_map[i].vdev_id = vdev_id;
|
||||||
|
hw_mode_trans_ind->vdev_mac_map[i].mac_id = mac_id;
|
||||||
|
|
||||||
|
wmi_debug("vdev_id:%d mac_id:%d", vdev_id, mac_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* extract_roam_sync_event_tlv() - Extract the roam event
|
||||||
|
* @wmi_handle: wmi handle
|
||||||
|
* @evt_buf: Pointer to the event buffer
|
||||||
|
* @len: Data length
|
||||||
|
* @roam_event: Roam event data
|
||||||
|
*/
|
||||||
|
static QDF_STATUS
|
||||||
|
extract_roam_event_tlv(wmi_unified_t wmi_handle, void *evt_buf, uint32_t len,
|
||||||
|
struct roam_offload_roam_event *roam_event)
|
||||||
|
{
|
||||||
|
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||||
|
wmi_roam_event_fixed_param *wmi_event = NULL;
|
||||||
|
WMI_ROAM_EVENTID_param_tlvs *param_buf = NULL;
|
||||||
|
struct cm_hw_mode_trans_ind *hw_mode_trans_ind;
|
||||||
|
wmi_pdev_hw_mode_transition_event_fixed_param *hw_mode_trans_param;
|
||||||
|
|
||||||
|
if (!evt_buf) {
|
||||||
|
wmi_debug("Empty roam_sync_event param buf");
|
||||||
|
status = QDF_STATUS_E_FAILURE;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
param_buf = (WMI_ROAM_EVENTID_param_tlvs *)evt_buf;
|
||||||
|
if (!param_buf) {
|
||||||
|
wmi_debug("received null buf from target");
|
||||||
|
status = QDF_STATUS_E_FAILURE;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
wmi_event = param_buf->fixed_param;
|
||||||
|
if (!wmi_event) {
|
||||||
|
wmi_debug("received null event data from target");
|
||||||
|
status = QDF_STATUS_E_FAILURE;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
roam_event->vdev_id = wmi_event->vdev_id;
|
||||||
|
|
||||||
|
if (roam_event->vdev_id >= WLAN_MAX_VDEVS) {
|
||||||
|
wmi_err("Invalid vdev id from firmware: %u",
|
||||||
|
roam_event->vdev_id);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
hw_mode_trans_param = param_buf->hw_mode_transition_fixed_param;
|
||||||
|
if (hw_mode_trans_param &&
|
||||||
|
hw_mode_trans_param->num_vdev_mac_entries >
|
||||||
|
param_buf->num_wmi_pdev_set_hw_mode_response_vdev_mac_mapping) {
|
||||||
|
wmi_debug("invalid vdev mac entries %d %d",
|
||||||
|
hw_mode_trans_param->num_vdev_mac_entries,
|
||||||
|
param_buf->num_wmi_pdev_set_hw_mode_response_vdev_mac_mapping);
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
roam_event->reason =
|
||||||
|
wmi_convert_fw_reason_to_cm_reason(wmi_event->reason);
|
||||||
|
roam_event->rssi = wmi_event->rssi;
|
||||||
|
roam_event->notif = wmi_convert_fw_notif_to_cm_notif(wmi_event->notif);
|
||||||
|
roam_event->notif_params = wmi_event->notif_params;
|
||||||
|
roam_event->notif_params1 = wmi_event->notif_params1;
|
||||||
|
|
||||||
|
wlan_roam_debug_log(roam_event->vdev_id, DEBUG_ROAM_EVENT,
|
||||||
|
DEBUG_INVALID_PEER_ID, NULL, NULL,
|
||||||
|
roam_event->reason,
|
||||||
|
(roam_event->reason == WMI_ROAM_REASON_INVALID) ?
|
||||||
|
roam_event->notif : roam_event->rssi);
|
||||||
|
|
||||||
|
DPTRACE(qdf_dp_trace_record_event(QDF_DP_TRACE_EVENT_RECORD,
|
||||||
|
roam_event->vdev_id,
|
||||||
|
QDF_TRACE_DEFAULT_PDEV_ID,
|
||||||
|
QDF_PROTO_TYPE_EVENT,
|
||||||
|
QDF_ROAM_EVENTID));
|
||||||
|
|
||||||
|
wmi_debug("FW_ROAM_EVT: Reason:%s[%d], Notif %x for vdevid %x, rssi %d",
|
||||||
|
wmi_get_roam_event_reason_string(roam_event->reason),
|
||||||
|
roam_event->reason,
|
||||||
|
roam_event->notif, roam_event->vdev_id, roam_event->rssi);
|
||||||
|
|
||||||
|
if (param_buf->hw_mode_transition_fixed_param) {
|
||||||
|
hw_mode_trans_ind = qdf_mem_malloc(sizeof(*hw_mode_trans_ind));
|
||||||
|
if (!hw_mode_trans_ind) {
|
||||||
|
status = QDF_STATUS_E_NOMEM;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
wmi_extract_pdev_hw_mode_trans_ind(
|
||||||
|
param_buf->hw_mode_transition_fixed_param,
|
||||||
|
param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping,
|
||||||
|
hw_mode_trans_ind);
|
||||||
|
roam_event->hw_mode_trans_ind = hw_mode_trans_ind;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wmi_event->notif_params1)
|
||||||
|
roam_event->deauth_disassoc_frame =
|
||||||
|
param_buf->deauth_disassoc_frame;
|
||||||
|
end:
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
#endif /* WLAN_FEATURE_HOST_ROAM || WLAN_FEATURE_ROAM_OFFLOAD */
|
||||||
|
|
||||||
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
||||||
/* send_set_ric_req_cmd_tlv() - set ric request element
|
/* send_set_ric_req_cmd_tlv() - set ric request element
|
||||||
@@ -1815,60 +2063,6 @@ extract_roam_frame_info_tlv(wmi_unified_t wmi_handle, void *evt_buf,
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
wmi_extract_pdev_hw_mode_trans_ind(
|
|
||||||
wmi_pdev_hw_mode_transition_event_fixed_param *fixed_param,
|
|
||||||
wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry,
|
|
||||||
struct cm_hw_mode_trans_ind *hw_mode_trans_ind)
|
|
||||||
{
|
|
||||||
uint32_t i;
|
|
||||||
|
|
||||||
if (fixed_param->num_vdev_mac_entries > MAX_VDEV_SUPPORTED) {
|
|
||||||
wmi_err("Number of Vdev mac entries %d exceeded max vdev supported %d",
|
|
||||||
fixed_param->num_vdev_mac_entries,
|
|
||||||
MAX_VDEV_SUPPORTED);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
hw_mode_trans_ind->old_hw_mode_index = fixed_param->old_hw_mode_index;
|
|
||||||
hw_mode_trans_ind->new_hw_mode_index = fixed_param->new_hw_mode_index;
|
|
||||||
hw_mode_trans_ind->num_vdev_mac_entries =
|
|
||||||
fixed_param->num_vdev_mac_entries;
|
|
||||||
wmi_debug("old_hw_mode_index:%d new_hw_mode_index:%d entries=%d",
|
|
||||||
fixed_param->old_hw_mode_index,
|
|
||||||
fixed_param->new_hw_mode_index,
|
|
||||||
fixed_param->num_vdev_mac_entries);
|
|
||||||
|
|
||||||
if (!vdev_mac_entry) {
|
|
||||||
wmi_err("Invalid vdev_mac_entry");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Store the vdev-mac map in WMA and send to policy manager */
|
|
||||||
for (i = 0; i < fixed_param->num_vdev_mac_entries; i++) {
|
|
||||||
uint32_t vdev_id, mac_id, pdev_id;
|
|
||||||
|
|
||||||
vdev_id = vdev_mac_entry[i].vdev_id;
|
|
||||||
pdev_id = vdev_mac_entry[i].pdev_id;
|
|
||||||
|
|
||||||
if (pdev_id == OL_TXRX_PDEV_ID) {
|
|
||||||
wmi_err("soc level id received for mac id");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (vdev_id >= WLAN_MAX_VDEVS) {
|
|
||||||
wmi_err("vdev_id: %d is invalid, max_bssid: %d",
|
|
||||||
vdev_id, WLAN_MAX_VDEVS);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mac_id = WMI_PDEV_TO_MAC_MAP(vdev_mac_entry[i].pdev_id);
|
|
||||||
|
|
||||||
hw_mode_trans_ind->vdev_mac_map[i].vdev_id = vdev_id;
|
|
||||||
hw_mode_trans_ind->vdev_mac_map[i].mac_id = mac_id;
|
|
||||||
|
|
||||||
wmi_debug("vdev_id:%d mac_id:%d", vdev_id, mac_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wmi_fill_data_synch_frame_event() - Fill the the roam sync data buffer using
|
* wmi_fill_data_synch_frame_event() - Fill the the roam sync data buffer using
|
||||||
* synch frame event data
|
* synch frame event data
|
||||||
@@ -2508,197 +2702,6 @@ extract_roam_sync_frame_event_tlv(wmi_unified_t wmi_handle, void *event,
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *wmi_get_roam_event_reason_string(uint32_t reason)
|
|
||||||
{
|
|
||||||
switch (reason) {
|
|
||||||
case WMI_ROAM_REASON_INVALID:
|
|
||||||
return "Default";
|
|
||||||
case WMI_ROAM_REASON_BETTER_AP:
|
|
||||||
return "Better AP";
|
|
||||||
case WMI_ROAM_REASON_BMISS:
|
|
||||||
return "BMISS";
|
|
||||||
case WMI_ROAM_REASON_LOW_RSSI:
|
|
||||||
return "Low Rssi";
|
|
||||||
case WMI_ROAM_REASON_SUITABLE_AP:
|
|
||||||
return "Suitable AP";
|
|
||||||
case WMI_ROAM_REASON_HO_FAILED:
|
|
||||||
return "Hand-off Failed";
|
|
||||||
case WMI_ROAM_REASON_INVOKE_ROAM_FAIL:
|
|
||||||
return "Roam Invoke failed";
|
|
||||||
case WMI_ROAM_REASON_RSO_STATUS:
|
|
||||||
return "RSO status";
|
|
||||||
case WMI_ROAM_REASON_BTM:
|
|
||||||
return "BTM";
|
|
||||||
case WMI_ROAM_REASON_DEAUTH:
|
|
||||||
return "Deauth";
|
|
||||||
default:
|
|
||||||
return "Invalid";
|
|
||||||
}
|
|
||||||
|
|
||||||
return "Invalid";
|
|
||||||
}
|
|
||||||
|
|
||||||
static enum roam_reason
|
|
||||||
wmi_convert_fw_reason_to_cm_reason(uint32_t reason)
|
|
||||||
{
|
|
||||||
switch (reason) {
|
|
||||||
case WMI_ROAM_REASON_INVALID:
|
|
||||||
return ROAM_REASON_INVALID;
|
|
||||||
case WMI_ROAM_REASON_BETTER_AP:
|
|
||||||
return ROAM_REASON_BETTER_AP;
|
|
||||||
case WMI_ROAM_REASON_BMISS:
|
|
||||||
return ROAM_REASON_BMISS;
|
|
||||||
case WMI_ROAM_REASON_LOW_RSSI:
|
|
||||||
return ROAM_REASON_LOW_RSSI;
|
|
||||||
case WMI_ROAM_REASON_SUITABLE_AP:
|
|
||||||
return ROAM_REASON_SUITABLE_AP;
|
|
||||||
case WMI_ROAM_REASON_HO_FAILED:
|
|
||||||
return ROAM_REASON_HO_FAILED;
|
|
||||||
case WMI_ROAM_REASON_INVOKE_ROAM_FAIL:
|
|
||||||
return ROAM_REASON_INVOKE_ROAM_FAIL;
|
|
||||||
case WMI_ROAM_REASON_RSO_STATUS:
|
|
||||||
return ROAM_REASON_RSO_STATUS;
|
|
||||||
case WMI_ROAM_REASON_BTM:
|
|
||||||
return ROAM_REASON_BTM;
|
|
||||||
case WMI_ROAM_REASON_DEAUTH:
|
|
||||||
return ROAM_REASON_DEAUTH;
|
|
||||||
default:
|
|
||||||
return ROAM_REASON_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ROAM_REASON_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
static enum cm_roam_notif
|
|
||||||
wmi_convert_fw_notif_to_cm_notif(uint32_t fw_notif)
|
|
||||||
{
|
|
||||||
switch (fw_notif) {
|
|
||||||
case WMI_ROAM_NOTIF_ROAM_START:
|
|
||||||
return CM_ROAM_NOTIF_ROAM_START;
|
|
||||||
case WMI_ROAM_NOTIF_ROAM_ABORT:
|
|
||||||
return CM_ROAM_NOTIF_ROAM_ABORT;
|
|
||||||
case WMI_ROAM_NOTIF_ROAM_REASSOC:
|
|
||||||
return CM_ROAM_NOTIF_ROAM_REASSOC;
|
|
||||||
case WMI_ROAM_NOTIF_SCAN_MODE_SUCCESS:
|
|
||||||
return CM_ROAM_NOTIF_SCAN_MODE_SUCCESS;
|
|
||||||
case WMI_ROAM_NOTIF_SCAN_MODE_FAIL:
|
|
||||||
return CM_ROAM_NOTIF_SCAN_MODE_FAIL;
|
|
||||||
case WMI_ROAM_NOTIF_DISCONNECT:
|
|
||||||
return CM_ROAM_NOTIF_DISCONNECT;
|
|
||||||
case WMI_ROAM_NOTIF_SUBNET_CHANGED:
|
|
||||||
return CM_ROAM_NOTIF_SUBNET_CHANGED;
|
|
||||||
case WMI_ROAM_NOTIF_SCAN_START:
|
|
||||||
return CM_ROAM_NOTIF_SCAN_START;
|
|
||||||
case WMI_ROAM_NOTIF_DEAUTH_RECV:
|
|
||||||
return CM_ROAM_NOTIF_DEAUTH_RECV;
|
|
||||||
case WMI_ROAM_NOTIF_DISASSOC_RECV:
|
|
||||||
return CM_ROAM_NOTIF_DISASSOC_RECV;
|
|
||||||
case WMI_ROAM_NOTIF_SCAN_MODE_SUCCESS_WITH_HO_FAIL:
|
|
||||||
return CM_ROAM_NOTIF_HO_FAIL;
|
|
||||||
case WMI_ROAM_NOTIF_SCAN_END:
|
|
||||||
return CM_ROAM_NOTIF_SCAN_END;
|
|
||||||
default:
|
|
||||||
return CM_ROAM_NOTIF_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
return CM_ROAM_NOTIF_INVALID;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* extract_roam_sync_event_tlv() - Extract the roam event
|
|
||||||
* @wmi_handle: wmi handle
|
|
||||||
* @evt_buf: Pointer to the event buffer
|
|
||||||
* @len: Data length
|
|
||||||
* @roam_event: Roam event data
|
|
||||||
*/
|
|
||||||
static QDF_STATUS
|
|
||||||
extract_roam_event_tlv(wmi_unified_t wmi_handle, void *evt_buf, uint32_t len,
|
|
||||||
struct roam_offload_roam_event *roam_event)
|
|
||||||
{
|
|
||||||
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
||||||
wmi_roam_event_fixed_param *wmi_event = NULL;
|
|
||||||
WMI_ROAM_EVENTID_param_tlvs *param_buf = NULL;
|
|
||||||
struct cm_hw_mode_trans_ind *hw_mode_trans_ind;
|
|
||||||
wmi_pdev_hw_mode_transition_event_fixed_param *hw_mode_trans_param;
|
|
||||||
|
|
||||||
if (!evt_buf) {
|
|
||||||
wmi_debug("Empty roam_sync_event param buf");
|
|
||||||
status = QDF_STATUS_E_FAILURE;
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
param_buf = (WMI_ROAM_EVENTID_param_tlvs *)evt_buf;
|
|
||||||
if (!param_buf) {
|
|
||||||
wmi_debug("received null buf from target");
|
|
||||||
status = QDF_STATUS_E_FAILURE;
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
wmi_event = param_buf->fixed_param;
|
|
||||||
if (!wmi_event) {
|
|
||||||
wmi_debug("received null event data from target");
|
|
||||||
status = QDF_STATUS_E_FAILURE;
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
roam_event->vdev_id = wmi_event->vdev_id;
|
|
||||||
|
|
||||||
if (roam_event->vdev_id >= WLAN_MAX_VDEVS) {
|
|
||||||
wmi_err("Invalid vdev id from firmware: %u",
|
|
||||||
roam_event->vdev_id);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
hw_mode_trans_param = param_buf->hw_mode_transition_fixed_param;
|
|
||||||
if (hw_mode_trans_param &&
|
|
||||||
hw_mode_trans_param->num_vdev_mac_entries >
|
|
||||||
param_buf->num_wmi_pdev_set_hw_mode_response_vdev_mac_mapping) {
|
|
||||||
wmi_debug("invalid vdev mac entries %d %d",
|
|
||||||
hw_mode_trans_param->num_vdev_mac_entries,
|
|
||||||
param_buf->num_wmi_pdev_set_hw_mode_response_vdev_mac_mapping);
|
|
||||||
return QDF_STATUS_E_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
roam_event->reason =
|
|
||||||
wmi_convert_fw_reason_to_cm_reason(wmi_event->reason);
|
|
||||||
roam_event->rssi = wmi_event->rssi;
|
|
||||||
roam_event->notif = wmi_convert_fw_notif_to_cm_notif(wmi_event->notif);
|
|
||||||
roam_event->notif_params = wmi_event->notif_params;
|
|
||||||
roam_event->notif_params1 = wmi_event->notif_params1;
|
|
||||||
|
|
||||||
wlan_roam_debug_log(roam_event->vdev_id, DEBUG_ROAM_EVENT,
|
|
||||||
DEBUG_INVALID_PEER_ID, NULL, NULL,
|
|
||||||
roam_event->reason,
|
|
||||||
(roam_event->reason == WMI_ROAM_REASON_INVALID) ?
|
|
||||||
roam_event->notif : roam_event->rssi);
|
|
||||||
|
|
||||||
DPTRACE(qdf_dp_trace_record_event(QDF_DP_TRACE_EVENT_RECORD,
|
|
||||||
roam_event->vdev_id, QDF_TRACE_DEFAULT_PDEV_ID,
|
|
||||||
QDF_PROTO_TYPE_EVENT, QDF_ROAM_EVENTID));
|
|
||||||
|
|
||||||
wmi_debug("FW_ROAM_EVT: Reason:%s[%d], Notif %x for vdevid %x, rssi %d",
|
|
||||||
wmi_get_roam_event_reason_string(roam_event->reason),
|
|
||||||
roam_event->reason,
|
|
||||||
roam_event->notif, roam_event->vdev_id, roam_event->rssi);
|
|
||||||
|
|
||||||
if (param_buf->hw_mode_transition_fixed_param) {
|
|
||||||
hw_mode_trans_ind = qdf_mem_malloc(sizeof(*hw_mode_trans_ind));
|
|
||||||
if (!hw_mode_trans_ind) {
|
|
||||||
status = QDF_STATUS_E_NOMEM;
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
wmi_extract_pdev_hw_mode_trans_ind(
|
|
||||||
param_buf->hw_mode_transition_fixed_param,
|
|
||||||
param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping,
|
|
||||||
hw_mode_trans_ind);
|
|
||||||
roam_event->hw_mode_trans_ind = hw_mode_trans_ind;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (wmi_event->notif_params1)
|
|
||||||
roam_event->deauth_disassoc_frame =
|
|
||||||
param_buf->deauth_disassoc_frame;
|
|
||||||
end:
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
|
|
||||||
static enum dlm_reject_ap_reason wmi_get_reject_reason(uint32_t reason)
|
static enum dlm_reject_ap_reason wmi_get_reject_reason(uint32_t reason)
|
||||||
{
|
{
|
||||||
switch (reason) {
|
switch (reason) {
|
||||||
@@ -5423,6 +5426,7 @@ void wmi_roam_attach_tlv(wmi_unified_t wmi_handle)
|
|||||||
ops->send_idle_roam_params = send_idle_roam_params_tlv;
|
ops->send_idle_roam_params = send_idle_roam_params_tlv;
|
||||||
ops->send_disconnect_roam_params = send_disconnect_roam_params_tlv;
|
ops->send_disconnect_roam_params = send_disconnect_roam_params_tlv;
|
||||||
ops->send_roam_preauth_status = send_roam_preauth_status_tlv;
|
ops->send_roam_preauth_status = send_roam_preauth_status_tlv;
|
||||||
|
ops->extract_roam_event = extract_roam_event_tlv;
|
||||||
|
|
||||||
wmi_lfr_subnet_detection_attach_tlv(wmi_handle);
|
wmi_lfr_subnet_detection_attach_tlv(wmi_handle);
|
||||||
wmi_rssi_monitor_attach_tlv(wmi_handle);
|
wmi_rssi_monitor_attach_tlv(wmi_handle);
|
||||||
|
@@ -3179,6 +3179,10 @@ QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc,
|
|||||||
/* Register Converged Event handlers */
|
/* Register Converged Event handlers */
|
||||||
init_deinit_register_tgt_psoc_ev_handlers(psoc);
|
init_deinit_register_tgt_psoc_ev_handlers(psoc);
|
||||||
|
|
||||||
|
/* Register LFR2/3 common Roam Event handler */
|
||||||
|
target_if_roam_register_common_events(psoc);
|
||||||
|
|
||||||
|
/* Register Roam offload Event handlers */
|
||||||
target_if_roam_offload_register_events(psoc);
|
target_if_roam_offload_register_events(psoc);
|
||||||
|
|
||||||
/* Initialize max_no_of_peers for wma_get_number_of_peers_supported() */
|
/* Initialize max_no_of_peers for wma_get_number_of_peers_supported() */
|
||||||
|
Reference in New Issue
Block a user