ソースを参照

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
Qun Zhang 3 年 前
コミット
3f80fae5f0

+ 2 - 2
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_ucfg_api.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_vdev_connect.o \
 		$(CM_DIR)/core/src/wlan_cm_vdev_disconnect.o
@@ -1555,8 +1556,7 @@ MLME_OBJS +=    $(CM_DIR)/utf/src/cm_utf.o
 endif
 
 ifeq ($(CONFIG_QCACLD_WLAN_LFR3), y)
-MLME_OBJS +=    $(CM_TGT_IF_DIR)/src/target_if_cm_roam_event.o \
-		$(CM_DIR)/core/src/wlan_cm_roam_fw_sync.o \
+MLME_OBJS +=    $(CM_DIR)/core/src/wlan_cm_roam_fw_sync.o \
 		$(CM_DIR)/core/src/wlan_cm_roam_offload_event.o
 endif
 

+ 32 - 34
components/target_if/connection_mgr/inc/target_if_cm_roam_event.h

@@ -30,7 +30,6 @@
 #include "wlan_cm_roam_public_struct.h"
 #include <target_if.h>
 
-#ifdef WLAN_FEATURE_ROAM_OFFLOAD
 /**
  * target_if_cm_get_roam_rx_ops() - Get CM roam rx ops registered
  * @psoc: pointer to psoc object
@@ -40,6 +39,37 @@
 struct wlan_cm_roam_rx_ops *
 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
  * @scn: target handle
@@ -65,16 +95,6 @@ target_if_cm_roam_sync_frame_event(ol_scn_t scn,
 				   uint8_t *event,
 				   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
  * @scn: target handle
@@ -99,7 +119,7 @@ target_if_cm_roam_auth_offload_event(ol_scn_t scn, uint8_t *event,
 				     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
  *
  * Return: QDF_STATUS
@@ -143,16 +163,6 @@ int
 target_if_pmkid_request_event_handler(ol_scn_t scn, uint8_t *event,
 				      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
  * Beacon/probe for the roaming candidate.
@@ -166,12 +176,6 @@ int
 target_if_roam_frame_event_handler(ol_scn_t scn, uint8_t *event,
 				   uint32_t len);
 #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
 QDF_STATUS
 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;
 }
 
-static inline int
-target_if_cm_roam_event(ol_scn_t scn, uint8_t *event, uint32_t len)
-{
-	return 0;
-}
-
 static inline int
 target_if_cm_roam_vdev_disconnect_event_handler(ol_scn_t scn, uint8_t *event,
 						uint32_t len)

+ 88 - 70
components/target_if/connection_mgr/src/target_if_cm_roam_event.c

@@ -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;
 }
 
+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
 target_if_free_roam_synch_frame_ind(struct roam_synch_frame_ind *frame_ind)
 {
@@ -206,69 +293,6 @@ err:
 	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
 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);
 		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,
 					wmi_roam_denylist_event_id,
@@ -709,3 +726,4 @@ target_if_roam_offload_register_events(struct wlan_objmgr_psoc *psoc)
 
 	return QDF_STATUS_SUCCESS;
 }
+#endif /* WLAN_FEATURE_ROAM_OFFLOAD */

+ 15 - 0
components/umac/mlme/connection_mgr/dispatcher/inc/wlan_cm_roam_api.h

@@ -1218,6 +1218,21 @@ cm_roam_candidate_event_handler(struct wlan_objmgr_psoc *psoc,
 {
 	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 */
 
 #ifdef WLAN_FEATURE_FIPS

+ 13 - 0
components/umac/mlme/connection_mgr/dispatcher/src/wlan_cm_roam_api.c

@@ -2414,6 +2414,12 @@ cm_vdev_disconnect_event_handler(struct vdev_disconnect_event_data *data)
 	return QDF_STATUS_SUCCESS;
 }
 
+QDF_STATUS
+cm_roam_auth_offload_event_handler(struct auth_offload_event *auth_event)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
 QDF_STATUS
 cm_roam_pmkid_request_handler(struct roam_pmkid_req_event *data)
 {
@@ -3293,6 +3299,13 @@ err:
 	qdf_mem_free(stats_info);
 	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
 
 #ifdef WLAN_FEATURE_FIPS

+ 16 - 14
components/wmi/inc/wmi_unified_roam_api.h

@@ -141,6 +141,22 @@ QDF_STATUS wmi_unified_plm_start_cmd(wmi_unified_t wmi_handle,
 				     const struct plm_req_params *plm);
 #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
 /* wmi_unified_set_ric_req_cmd() - set ric request element
  * @wmi_handle: wmi handle
@@ -271,20 +287,6 @@ wmi_extract_roam_sync_frame_event(wmi_unified_t wmi_handle, void *event,
 				  uint32_t len,
 				  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_handle: WMI handle

+ 15 - 13
components/wmi/src/wmi_unified_roam_api.c

@@ -328,6 +328,21 @@ QDF_STATUS wmi_unified_get_roam_scan_ch_list(wmi_unified_t wmi_handle,
 	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
 QDF_STATUS wmi_unified_set_roam_triggers(wmi_unified_t wmi_handle,
 					 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;
 }
 
-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
 wmi_extract_btm_denylist_event(wmi_unified_t wmi_handle,
 			       uint8_t *event,

+ 249 - 245
components/wmi/src/wmi_unified_roam_tlv.c

@@ -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
 /* 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;
 }
 
-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
  * 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;
 }
 
-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)
 {
 	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_disconnect_roam_params = send_disconnect_roam_params_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_rssi_monitor_attach_tlv(wmi_handle);

+ 4 - 0
core/wma/src/wma_main.c

@@ -3179,6 +3179,10 @@ QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc,
 	/* Register Converged Event handlers */
 	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);
 
 	/* Initialize max_no_of_peers for wma_get_number_of_peers_supported() */