Переглянути джерело

Merge "qcacmn: Extend WMI_ROAM_STATS_EVENTID for enhanced roam"

Linux Build Service Account 2 роки тому
батько
коміт
567c3ceaed
2 змінених файлів з 625 додано та 138 видалено
  1. 143 0
      wmi/inc/wmi_unified_param.h
  2. 482 138
      wmi/src/wmi_unified_tlv.c

+ 143 - 0
wmi/inc/wmi_unified_param.h

@@ -8789,6 +8789,85 @@ struct wmi_btm_req_candidate_info {
 	uint8_t preference;
 };
 
+/**
+ * struct wmi_roam_trigger_per_data - per roam trigger related information
+ * @rx_rate_thresh_percent:  percentage of lower than rx rate threshold
+ * @tx_rate_thresh_percent:  percentage of lower than tx rate threshold
+ */
+struct wmi_roam_trigger_per_data {
+	uint8_t rx_rate_thresh_percent;
+	uint8_t tx_rate_thresh_percent;
+};
+
+/**
+ * struct wmi_roam_trigger_bmiss_data - bmiss roam trigger related information
+ * @final_bmiss_cnt:        final beacon miss count
+ * @consecutive_bmiss_cnt:  consecutive beacon miss count
+ * @qos_null_success:       is Qos-Null tx Success: 0: success, 1:fail
+ */
+struct wmi_roam_trigger_bmiss_data {
+	uint32_t final_bmiss_cnt;
+	uint32_t consecutive_bmiss_cnt;
+	uint8_t qos_null_success;
+};
+
+/**
+ * struct wmi_roam_trigger_low_rssi_data - low rssi roam trigger
+ * related information
+ * @current_rssi:         Connected AP rssi in dBm
+ * @roam_rssi_threshold:  rssi threshold value in dBm
+ * @rx_linkspeed_status:  rx linkspeed status, 0:good linkspeed, 1:bad
+ */
+struct wmi_roam_trigger_low_rssi_data {
+	uint8_t current_rssi;
+	uint8_t roam_rssi_threshold;
+	uint8_t rx_linkspeed_status;
+};
+
+/**
+ * struct wmi_roam_trigger_hi_rssi_data - high rssi roam trigger
+ * related information
+ * @current_rssi:      Connected AP rssi in dBm
+ * @hirssi_threshold:  roam high RSSI threshold
+ */
+struct wmi_roam_trigger_hi_rssi_data {
+	uint8_t current_rssi;
+	uint8_t hirssi_threshold;
+};
+
+/**
+ * struct wmi_roam_trigger_congestion_data - congestion roam trigger
+ * related information
+ * @rx_tput:         RX Throughput in bytes per second in dense env
+ * @tx_tput:         TX Throughput in bytes per second in dense env
+ * @roamable_count:  roamable AP count info in dense env
+ */
+struct wmi_roam_trigger_congestion_data {
+	uint32_t rx_tput;
+	uint32_t tx_tput;
+	uint8_t roamable_count;
+};
+
+/**
+ * struct wmi_roam_trigger_user_data - user roam trigger related information
+ * @invoke_reason: defined in wlan_roam_invoke_reason
+ */
+struct wmi_roam_trigger_user_data {
+	uint32_t invoke_reason;
+};
+
+/**
+ * struct wmi_roam_trigger_background_data -  roam trigger related information
+ * @current_rssi:         Connected AP rssi in dBm
+ * @data_rssi:            data frame rssi in dBm
+ * @data_rssi_threshold:  data rssi threshold in dBm
+ */
+struct wmi_roam_trigger_background_data {
+	uint8_t current_rssi;
+	uint8_t data_rssi;
+	uint8_t data_rssi_threshold;
+};
+
 /**
  * struct wmi_roam_btm_trigger_data - BTM roam trigger related information
  * @timestamp:             timestamp
@@ -8846,6 +8925,26 @@ struct wmi_roam_deauth_trigger_data {
 	uint32_t reason;
 };
 
+/**
+ * struct wmi_roam_trigger_periodic_data - periodic roam trigger
+ * related information
+ * @periodic_timer_ms: roam scan periodic, milliseconds
+ */
+struct wmi_roam_trigger_periodic_data {
+	uint32_t periodic_timer_ms;
+};
+
+/**
+ * struct wmi_roam_trigger_tx_failures_data - tx failures roam trigger
+ * related information
+ * @kickout_threshold:  consecutive tx failure threshold
+ * @kickout_reason:     defined in wmi_peer_sta_kickout_reason
+ */
+struct wmi_roam_trigger_tx_failures_data {
+	uint32_t kickout_threshold;
+	uint32_t  kickout_reason;
+};
+
 /**
  * struct wmi_roam_wtc_btm_trigger_data - wtc btm roaming trigger related
  * parameters
@@ -8876,6 +8975,20 @@ struct wmi_roam_wtc_btm_trigger_data {
 	uint32_t duration;
 };
 
+/**
+ * struct wmi_roam_trigger_abort_reason - abort roam related information
+ * @abort_reason_code:    detail in qca_wlan_roam_abort_reason
+ * @data_rssi:            data rssi in dBm
+ * @data_rssi_threshold:  data rssi threshold in dBm
+ * @rx_linkspeed_status:  rx linkspeed status, 0:good linkspeed, 1:bad
+ */
+struct wmi_roam_trigger_abort_reason {
+	uint32_t abort_reason_code;
+	uint8_t data_rssi;
+	uint8_t data_rssi_threshold;
+	uint8_t rx_linkspeed_status;
+};
+
 /**
  *  struct wmi_roam_candidate_info - Roam scan candidate APs related info
  *  @timestamp:   Host timestamp in millisecs
@@ -8923,6 +9036,8 @@ struct wmi_roam_candidate_info {
  * @next_rssi_threshold: Next roam can trigger rssi threshold
  * @chan_freq: List of frequencies scanned as part of roam scan
  * @ap: List of candidate AP info
+ * @dwell_type: roam scan channel dwell type, enum in roam_scan_dwell_type
+ * @scan_complete_timestamp: timestamp of all channels scan completed
  */
 struct wmi_roam_scan_data {
 	bool present;
@@ -8934,6 +9049,8 @@ struct wmi_roam_scan_data {
 	uint32_t next_rssi_threshold;
 	uint16_t chan_freq[MAX_ROAM_SCAN_CHAN];
 	struct wmi_roam_candidate_info ap[MAX_ROAM_CANDIDATE_AP];
+	uint8_t dwell_type[MAX_ROAM_SCAN_CHAN];
+	uint32_t scan_complete_timestamp;
 };
 
 /**
@@ -8995,11 +9112,24 @@ struct wmi_neighbor_report_data {
  * @trigger_sub_reason: Sub reason for roam trigger if multiple roam scans
  * @current_rssi:       Connected AP RSSI
  * @timestamp:          Host timestamp in millisecs when roam scan was triggered
+ * @per_trig_data:      per roam trigger parameters
+ * @bmiss_trig_data:    beacon miss roam trigger parameters.
+ * @low_rssi_trig_data: low rssi roam trigger parameters.
+ * @hi_rssi_trig_data:  high rssi roam trigger parameters.
+ * @congestion_trig_data: congestion roam trigger parameters.
+ * @user_trig_data:     user trigger roam parameters.
+ * @background_trig_data: background roam trigger parameters.
  * @btm_trig_data:      BTM roam trigger parameters.
  * @cu_trig_data:       BSS Load roam trigger parameters.
  * @rssi_trig_data:     RSSI trigger related info.
  * @deauth_trig_data:   Deauth roam trigger related info
+ * @periodic_trig_data: periodic roam trigger parameters.
+ * @tx_failures_trig_data: tx failures roam trigger parameters.
  * @wtc_btm_trig_data:  WTC BTM roam trigger related info
+ * @abort_reason:       roam abort reason
+ * @scan_type:          roam scan type
+ * @roam_status:        roam result status
+ * @fail_reason:        roam fail reason
  */
 struct wmi_roam_trigger_info {
 	bool present;
@@ -9008,12 +9138,25 @@ struct wmi_roam_trigger_info {
 	uint32_t current_rssi;
 	uint32_t timestamp;
 	union {
+		struct wmi_roam_trigger_per_data per_trig_data;
+		struct wmi_roam_trigger_bmiss_data bmiss_trig_data;
+		struct wmi_roam_trigger_low_rssi_data low_rssi_trig_data;
+		struct wmi_roam_trigger_hi_rssi_data hi_rssi_trig_data;
+		struct wmi_roam_trigger_congestion_data congestion_trig_data;
+		struct wmi_roam_trigger_user_data user_trig_data;
+		struct wmi_roam_trigger_background_data background_trig_data;
 		struct wmi_roam_btm_trigger_data btm_trig_data;
 		struct wmi_roam_cu_trigger_data cu_trig_data;
 		struct wmi_roam_rssi_trigger_data rssi_trig_data;
 		struct wmi_roam_deauth_trigger_data deauth_trig_data;
+		struct wmi_roam_trigger_periodic_data periodic_trig_data;
+		struct wmi_roam_trigger_tx_failures_data tx_failures_trig_data;
 		struct wmi_roam_wtc_btm_trigger_data wtc_btm_trig_data;
 	};
+	struct wmi_roam_trigger_abort_reason abort_reason;
+	uint32_t scan_type;
+	uint32_t roam_status;
+	uint32_t fail_reason;
 };
 
 /* End of roam scan stats definitions */

+ 482 - 138
wmi/src/wmi_unified_tlv.c

@@ -18548,6 +18548,213 @@ wmi_convert_roam_sub_reason(WMI_ROAM_TRIGGER_SUB_REASON_ID subreason)
 	return 0;
 }
 
+/**
+ * wlan_roam_fail_reason_code() - Convert FW enum to Host enum
+ * @wmi_roam_fail_reason: roam fail enum
+ *
+ * Return: Roaming failure reason codes
+ */
+static enum wlan_roam_failure_reason_code
+wlan_roam_fail_reason_code(uint16_t wmi_roam_fail_reason)
+{
+	switch (wmi_roam_fail_reason) {
+	case WMI_ROAM_FAIL_REASON_NO_SCAN_START:
+		return ROAM_FAIL_REASON_NO_SCAN_START;
+	case WMI_ROAM_FAIL_REASON_NO_AP_FOUND:
+		return ROAM_FAIL_REASON_NO_AP_FOUND;
+	case WMI_ROAM_FAIL_REASON_NO_CAND_AP_FOUND:
+		return ROAM_FAIL_REASON_NO_CAND_AP_FOUND;
+	case WMI_ROAM_FAIL_REASON_HOST:
+		return ROAM_FAIL_REASON_HOST;
+	case WMI_ROAM_FAIL_REASON_AUTH_SEND:
+		return ROAM_FAIL_REASON_AUTH_SEND;
+	case WMI_ROAM_FAIL_REASON_AUTH_RECV:
+		return ROAM_FAIL_REASON_AUTH_RECV;
+	case WMI_ROAM_FAIL_REASON_NO_AUTH_RESP:
+		return ROAM_FAIL_REASON_NO_AUTH_RESP;
+	case WMI_ROAM_FAIL_REASON_REASSOC_SEND:
+		return ROAM_FAIL_REASON_REASSOC_SEND;
+	case WMI_ROAM_FAIL_REASON_REASSOC_RECV:
+		return ROAM_FAIL_REASON_REASSOC_RECV;
+	case WMI_ROAM_FAIL_REASON_NO_REASSOC_RESP:
+		return ROAM_FAIL_REASON_NO_REASSOC_RESP;
+	case WMI_ROAM_FAIL_REASON_EAPOL_TIMEOUT:
+		return ROAM_FAIL_REASON_EAPOL_TIMEOUT;
+	case WMI_ROAM_FAIL_REASON_MLME:
+		return ROAM_FAIL_REASON_MLME;
+	case WMI_ROAM_FAIL_REASON_INTERNAL_ABORT:
+		return ROAM_FAIL_REASON_INTERNAL_ABORT;
+	case WMI_ROAM_FAIL_REASON_SCAN_START:
+		return ROAM_FAIL_REASON_SCAN_START;
+	case WMI_ROAM_FAIL_REASON_AUTH_NO_ACK:
+		return ROAM_FAIL_REASON_AUTH_NO_ACK;
+	case WMI_ROAM_FAIL_REASON_AUTH_INTERNAL_DROP:
+		return ROAM_FAIL_REASON_AUTH_INTERNAL_DROP;
+	case WMI_ROAM_FAIL_REASON_REASSOC_NO_ACK:
+		return ROAM_FAIL_REASON_REASSOC_NO_ACK;
+	case WMI_ROAM_FAIL_REASON_REASSOC_INTERNAL_DROP:
+		return ROAM_FAIL_REASON_REASSOC_INTERNAL_DROP;
+	case WMI_ROAM_FAIL_REASON_EAPOL_M2_SEND:
+		return ROAM_FAIL_REASON_EAPOL_M2_SEND;
+	case WMI_ROAM_FAIL_REASON_EAPOL_M2_INTERNAL_DROP:
+		return ROAM_FAIL_REASON_EAPOL_M2_INTERNAL_DROP;
+	case WMI_ROAM_FAIL_REASON_EAPOL_M2_NO_ACK:
+		return ROAM_FAIL_REASON_EAPOL_M2_NO_ACK;
+	case WMI_ROAM_FAIL_REASON_EAPOL_M3_TIMEOUT:
+		return ROAM_FAIL_REASON_EAPOL_M3_TIMEOUT;
+	case WMI_ROAM_FAIL_REASON_EAPOL_M4_SEND:
+		return ROAM_FAIL_REASON_EAPOL_M4_SEND;
+	case WMI_ROAM_FAIL_REASON_EAPOL_M4_INTERNAL_DROP:
+		return ROAM_FAIL_REASON_EAPOL_M4_INTERNAL_DROP;
+	case WMI_ROAM_FAIL_REASON_EAPOL_M4_NO_ACK:
+		return ROAM_FAIL_REASON_EAPOL_M4_NO_ACK;
+	case WMI_ROAM_FAIL_REASON_NO_SCAN_FOR_FINAL_BMISS:
+		return ROAM_FAIL_REASON_NO_SCAN_FOR_FINAL_BMISS;
+	case WMI_ROAM_FAIL_REASON_DISCONNECT:
+		return ROAM_FAIL_REASON_DISCONNECT;
+	case WMI_ROAM_FAIL_REASON_SYNC:
+		return ROAM_FAIL_REASON_SYNC;
+	case WMI_ROAM_FAIL_REASON_SAE_INVALID_PMKID:
+		return ROAM_FAIL_REASON_SAE_INVALID_PMKID;
+	case WMI_ROAM_FAIL_REASON_SAE_PREAUTH_TIMEOUT:
+		return ROAM_FAIL_REASON_SAE_PREAUTH_TIMEOUT;
+	case WMI_ROAM_FAIL_REASON_SAE_PREAUTH_FAIL:
+		return ROAM_FAIL_REASON_SAE_PREAUTH_FAIL;
+	case WMI_ROAM_FAIL_REASON_UNABLE_TO_START_ROAM_HO:
+		return ROAM_FAIL_REASON_UNABLE_TO_START_ROAM_HO;
+	default:
+		return ROAM_FAIL_REASON_UNKNOWN;
+	}
+}
+
+/**
+ * wmi_convert_to_cm_roam_invoke_reason() - Convert FW enum to Host enum
+ * @reason: roam invoke reason from fw
+ *
+ * Return: Roam invoke reason code defined in host driver
+ */
+static enum roam_invoke_reason
+wmi_convert_to_cm_roam_invoke_reason(enum wlan_roam_invoke_reason reason)
+{
+	switch (reason) {
+	case ROAM_INVOKE_REASON_UNDEFINED:
+		return WLAN_ROAM_STATS_INVOKE_REASON_UNDEFINED;
+	case ROAM_INVOKE_REASON_NUD_FAILURE:
+		return WLAN_ROAM_STATS_INVOKE_REASON_NUD_FAILURE;
+	case ROAM_INVOKE_REASON_USER_SPACE:
+		return WLAN_ROAM_STATS_INVOKE_REASON_USER_SPACE;
+	default:
+		return WLAN_ROAM_STATS_INVOKE_REASON_UNDEFINED;
+	}
+}
+
+/**
+ * wmi_convert_to_cm_roam_tx_fail_reason() - Convert FW enum to Host enum
+ * @tx_fail_reason: roam tx fail reason from fw
+ *
+ * Return: Roam tx fail reason code defined in host driver
+ */
+static enum roam_tx_failures_reason
+wmi_convert_to_cm_roam_tx_fail_reason(PEER_KICKOUT_REASON tx_fail_reason)
+{
+	switch (tx_fail_reason) {
+	case WMI_PEER_STA_KICKOUT_REASON_UNSPECIFIED:
+		return WLAN_ROAM_STATS_KICKOUT_REASON_UNSPECIFIED;
+	case WMI_PEER_STA_KICKOUT_REASON_XRETRY:
+		return WLAN_ROAM_STATS_KICKOUT_REASON_XRETRY;
+	case WMI_PEER_STA_KICKOUT_REASON_INACTIVITY:
+		return WLAN_ROAM_STATS_KICKOUT_REASON_INACTIVITY;
+	case WMI_PEER_STA_KICKOUT_REASON_IBSS_DISCONNECT:
+		return WLAN_ROAM_STATS_KICKOUT_REASON_IBSS_DISCONNECT;
+	case WMI_PEER_STA_KICKOUT_REASON_TDLS_DISCONNECT:
+		return WLAN_ROAM_STATS_KICKOUT_REASON_TDLS_DISCONNECT;
+	case WMI_PEER_STA_KICKOUT_REASON_SA_QUERY_TIMEOUT:
+		return WLAN_ROAM_STATS_KICKOUT_REASON_SA_QUERY_TIMEOUT;
+	case WMI_PEER_STA_KICKOUT_REASON_ROAMING_EVENT:
+		return WLAN_ROAM_STATS_KICKOUT_REASON_ROAMING_EVENT;
+	default:
+		return WLAN_ROAM_STATS_KICKOUT_REASON_UNSPECIFIED;
+	}
+}
+
+/**
+ * wmi_convert_roam_abort_reason() - Convert FW enum to Host enum
+ * @abort_reason: roam abort reason from fw
+ *
+ * Return: Roam abort reason code defined in host driver
+ */
+static enum roam_abort_reason
+wmi_convert_roam_abort_reason(WMI_ROAM_FAIL_SUB_REASON_ID abort_reason)
+{
+	switch (abort_reason) {
+	case WMI_ROAM_ABORT_UNSPECIFIED:
+		return WLAN_ROAM_STATS_ABORT_UNSPECIFIED;
+	case WMI_ROAM_ABORT_LOWRSSI_DATA_RSSI_HIGH:
+		return WLAN_ROAM_STATS_ABORT_LOWRSSI_DATA_RSSI_HIGH;
+	case WMI_ROAM_ABORT_LOWRSSI_LINK_SPEED_GOOD:
+		return WLAN_ROAM_STATS_ABORT_LOWRSSI_LINK_SPEED_GOOD;
+	case WMI_ROAM_ABORT_BG_DATA_RSSI_HIGH:
+		return WLAN_ROAM_STATS_ABORT_BG_DATA_RSSI_HIGH;
+	case WMI_ROAM_ABORT_BG_RSSI_ABOVE_THRESHOLD:
+		return WLAN_ROAM_STATS_ABORT_BG_RSSI_ABOVE_THRESHOLD;
+	default:
+		return WLAN_ROAM_STATS_ABORT_UNSPECIFIED;
+	}
+}
+
+/**
+ * wlan_roam_scan_type() - Convert FW enum to Host enum
+ * @scan_type: roam scan type from fw
+ *
+ * Return: Roam scan type defined in host driver
+ */
+static enum roam_stats_scan_type
+wlan_roam_scan_type(uint32_t scan_type)
+{
+	switch (scan_type) {
+	case 0:
+		return ROAM_STATS_SCAN_TYPE_PARTIAL;
+	case 1:
+		return ROAM_STATS_SCAN_TYPE_FULL;
+	case 2:
+		return ROAM_STATS_SCAN_TYPE_NO_SCAN;
+	case 3:
+		return ROAM_STATS_SCAN_TYPE_HIGHER_BAND_5GHZ_6GHZ;
+	case 4:
+		return ROAM_STATS_SCAN_TYPE_HIGHER_BAND_6GHZ;
+	default:
+		return ROAM_STATS_SCAN_TYPE_PARTIAL;
+	}
+}
+
+/**
+ * wlan_roam_dwell_type() - Convert FW enum to Host enum
+ * @dwell_type: roam channel scan dwell type from fw
+ *
+ * Return: Roam channel scan dwell type defined in host driver
+ */
+static enum roam_scan_dwell_type
+wlan_roam_dwell_type(uint32_t dwell_type)
+{
+	switch (dwell_type) {
+	case 0:
+		return WLAN_ROAM_DWELL_TYPE_UNSPECIFIED;
+	case 1:
+		return WLAN_ROAM_DWELL_ACTIVE_TYPE;
+	case 2:
+		return WLAN_ROAM_DWELL_PASSIVE_TYPE;
+	default:
+		return WLAN_ROAM_DWELL_TYPE_UNSPECIFIED;
+	}
+}
+
+#define WLAN_ROAM_PER_TX_RATE_OFFSET       0
+#define WLAN_ROAM_PER_RX_RATE_OFFSET       16
+#define WLAN_ROAM_BMISS_FINNAL_OFFSET       0
+#define WLAN_ROAM_BMISS_CONSECUTIVE_OFFSET  7
+#define WLAN_ROAM_BMISS_QOSNULL_OFFSET      24
+#define WLAN_ROAM_DENSE_ROAMABLE_OFFSET     0
+
 /**
  * extract_roam_trigger_stats_tlv() - Extract the Roam trigger stats
  * from the WMI_ROAM_STATS_EVENTID
@@ -18564,100 +18771,313 @@ extract_roam_trigger_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
 {
 	WMI_ROAM_STATS_EVENTID_param_tlvs *param_buf;
 	wmi_roam_trigger_reason *src_data = NULL;
-	uint32_t trig_reason;
+	uint32_t trig_reason = 0;
+	uint32_t fail_reason = 0;
+	uint32_t abort       = 0;
+	uint32_t invoke      = 0;
+	uint32_t tx_fail     = 0;
+	wmi_roam_trigger_reason_cmm *cmn_data = NULL;
+	wmi_roam_trigger_per        *per_data = NULL;
+	wmi_roam_trigger_bmiss      *bmiss_data = NULL;
+	wmi_roam_trigger_hi_rssi    *hi_rssi_data = NULL;
+	wmi_roam_trigger_dense      *dense_data = NULL;
+	wmi_roam_trigger_force      *force_data = NULL;
+	wmi_roam_trigger_btm        *btm_data = NULL;
+	wmi_roam_trigger_bss_load   *bss_load_data = NULL;
+	wmi_roam_trigger_deauth     *deauth_data = NULL;
+	wmi_roam_trigger_periodic   *periodic_data = NULL;
+	wmi_roam_trigger_rssi       *rssi_data = NULL;
+	wmi_roam_trigger_kickout    *kickout_data = NULL;
+	wmi_roam_result             *roam_result = NULL;
+	wmi_roam_scan_info          *scan_info = NULL;
 
 	param_buf = (WMI_ROAM_STATS_EVENTID_param_tlvs *)evt_buf;
-	if (!param_buf || !param_buf->roam_trigger_reason)
+	if (!param_buf) {
+		wmi_err("Param buf is NULL");
 		return QDF_STATUS_E_FAILURE;
+	}
+
+	if (!param_buf->roam_result || idx >= param_buf->num_roam_result)
+		wmi_err("roam_result or idx error.%u", idx);
 
-	src_data = &param_buf->roam_trigger_reason[idx];
+	if (!param_buf->roam_scan_info || idx >= param_buf->num_roam_scan_info)
+		wmi_err("roam_scan_info or idx error.%u", idx);
 
 	trig->present = true;
-	trig_reason = src_data->trigger_reason;
-	trig->trigger_reason = wmi_convert_fw_to_cm_trig_reason(trig_reason);
-	trig->trigger_sub_reason =
-		wmi_convert_roam_sub_reason(src_data->trigger_sub_reason);
-	trig->current_rssi = src_data->current_rssi;
-	trig->timestamp = src_data->timestamp;
+
+	if (param_buf->roam_scan_info)
+		scan_info = &param_buf->roam_scan_info[idx];
+
+	if (param_buf->roam_trigger_reason_cmm)
+		cmn_data = &param_buf->roam_trigger_reason_cmm[idx];
+
+	if (param_buf->roam_trigger_reason)
+		src_data = &param_buf->roam_trigger_reason[idx];
+
+	if (cmn_data) {
+		trig_reason = cmn_data->trigger_reason;
+		trig->trigger_reason =
+			wmi_convert_fw_to_cm_trig_reason(trig_reason);
+		trig->timestamp = cmn_data->timestamp;
+	} else if (src_data) {
+		trig_reason = src_data->trigger_reason;
+		trig->trigger_reason =
+			wmi_convert_fw_to_cm_trig_reason(trig_reason);
+		trig->trigger_sub_reason =
+			wmi_convert_roam_sub_reason(src_data->trigger_sub_reason);
+		trig->current_rssi = src_data->current_rssi;
+		trig->timestamp = src_data->timestamp;
+	}
+
+	if (param_buf->roam_trigger_rssi)
+		rssi_data = &param_buf->roam_trigger_rssi[idx];
+
+	if (param_buf->roam_result) {
+		roam_result = &param_buf->roam_result[idx];
+
+		if (roam_result) {
+			trig->roam_status = roam_result->roam_status;
+			if (trig->roam_status) {
+				fail_reason = roam_result->roam_fail_reason;
+				trig->fail_reason =
+					wlan_roam_fail_reason_code(fail_reason);
+
+				if (rssi_data) {
+					abort = roam_result->roam_abort_reason;
+					trig->abort_reason.abort_reason_code =
+						wmi_convert_roam_abort_reason(abort);
+					trig->abort_reason.data_rssi =
+						rssi_data->data_rssi;
+					trig->abort_reason.data_rssi_threshold =
+						rssi_data->data_rssi_threshold;
+					trig->abort_reason.rx_linkspeed_status =
+						rssi_data->rx_linkspeed_status;
+				}
+			}
+		}
+	}
+
+	if (scan_info)
+		trig->scan_type =
+			wlan_roam_scan_type(scan_info->roam_scan_type);
 
 	switch (trig_reason) {
 	case WMI_ROAM_TRIGGER_REASON_PER:
+		if (param_buf->roam_trigger_per)
+			per_data = &param_buf->roam_trigger_per[idx];
+		if (per_data) {
+			trig->per_trig_data.tx_rate_thresh_percent =
+				WMI_GET_BITS(per_data->rate_thresh_percnt,
+					     WLAN_ROAM_PER_RX_RATE_OFFSET, 8);
+			trig->per_trig_data.rx_rate_thresh_percent =
+				WMI_GET_BITS(per_data->rate_thresh_percnt,
+					     WLAN_ROAM_PER_TX_RATE_OFFSET, 8);
+		}
+		return QDF_STATUS_SUCCESS;
+
 	case WMI_ROAM_TRIGGER_REASON_BMISS:
+		if (param_buf->roam_trigger_bmiss)
+			bmiss_data = &param_buf->roam_trigger_bmiss[idx];
+		if (bmiss_data) {
+			trig->bmiss_trig_data.final_bmiss_cnt =
+				WMI_GET_BITS(bmiss_data->bmiss_status,
+					     WLAN_ROAM_BMISS_FINNAL_OFFSET, 7);
+			trig->bmiss_trig_data.consecutive_bmiss_cnt =
+				WMI_GET_BITS(bmiss_data->bmiss_status,
+					     WLAN_ROAM_BMISS_CONSECUTIVE_OFFSET,
+					     17);
+			trig->bmiss_trig_data.qos_null_success =
+				WMI_GET_BITS(bmiss_data->bmiss_status,
+					     WLAN_ROAM_BMISS_QOSNULL_OFFSET, 1);
+		}
+		return QDF_STATUS_SUCCESS;
+
 	case WMI_ROAM_TRIGGER_REASON_HIGH_RSSI:
+		if (param_buf->roam_trigger_hi_rssi)
+			hi_rssi_data = &param_buf->roam_trigger_hi_rssi[idx];
+
+		if (hi_rssi_data && cmn_data) {
+			trig->hi_rssi_trig_data.current_rssi =
+				(uint8_t)cmn_data->current_rssi;
+			trig->hi_rssi_trig_data.hirssi_threshold =
+				(uint8_t)hi_rssi_data->hi_rssi_threshold;
+		}
+		return QDF_STATUS_SUCCESS;
+
 	case WMI_ROAM_TRIGGER_REASON_MAWC:
 	case WMI_ROAM_TRIGGER_REASON_DENSE:
+		if (param_buf->roam_trigger_dense)
+			dense_data = &param_buf->roam_trigger_dense[idx];
+		if (dense_data) {
+			trig->congestion_trig_data.rx_tput =
+				dense_data->rx_tput;
+			trig->congestion_trig_data.tx_tput =
+				dense_data->tx_tput;
+			trig->congestion_trig_data.roamable_count =
+				WMI_GET_BITS(dense_data->dense_status,
+					     WLAN_ROAM_DENSE_ROAMABLE_OFFSET,
+					     8);
+		}
+		return QDF_STATUS_SUCCESS;
+
 	case WMI_ROAM_TRIGGER_REASON_BACKGROUND:
+		if (cmn_data && rssi_data) {
+			trig->background_trig_data.current_rssi =
+				(uint8_t)cmn_data->current_rssi;
+			trig->background_trig_data.data_rssi =
+				(uint8_t)rssi_data->data_rssi;
+			trig->background_trig_data.data_rssi_threshold =
+				(uint8_t)rssi_data->data_rssi_threshold;
+		}
+		return QDF_STATUS_SUCCESS;
+
 	case WMI_ROAM_TRIGGER_REASON_IDLE:
 	case WMI_ROAM_TRIGGER_REASON_FORCED:
+		if (param_buf->roam_trigger_force)
+			force_data = &param_buf->roam_trigger_force[idx];
+		if (force_data) {
+			invoke = force_data->invoke_reason;
+			trig->user_trig_data.invoke_reason =
+				wmi_convert_to_cm_roam_invoke_reason(invoke);
+		}
+		return QDF_STATUS_SUCCESS;
+
 	case WMI_ROAM_TRIGGER_REASON_UNIT_TEST:
 	case WMI_ROAM_TRIGGER_REASON_BTC:
 		return QDF_STATUS_SUCCESS;
 
 	case WMI_ROAM_TRIGGER_REASON_BTM:
-		trig->btm_trig_data.btm_request_mode =
-				src_data->btm_request_mode;
-		trig->btm_trig_data.disassoc_timer =
-				src_data->disassoc_imminent_timer;
-		trig->btm_trig_data.validity_interval =
-				src_data->validity_internal;
-		trig->btm_trig_data.candidate_list_count =
-				src_data->candidate_list_count;
-		trig->btm_trig_data.btm_resp_status =
-				src_data->btm_response_status_code;
-		trig->btm_trig_data.btm_bss_termination_timeout =
-				src_data->btm_bss_termination_timeout;
-		trig->btm_trig_data.btm_mbo_assoc_retry_timeout =
-				src_data->btm_mbo_assoc_retry_timeout;
-		trig->btm_trig_data.token = src_data->btm_req_dialog_token;
-		if ((btm_idx + trig->btm_trig_data.candidate_list_count) <=
-		    param_buf->num_roam_btm_request_candidate_info)
-			extract_roam_11kv_candidate_info(
-					wmi_handle, evt_buf,
-					trig->btm_trig_data.btm_cand,
-					btm_idx,
-					src_data->candidate_list_count);
+		if (param_buf->roam_trigger_btm)
+			btm_data = &param_buf->roam_trigger_btm[idx];
+		if (btm_data) {
+			trig->btm_trig_data.btm_request_mode =
+				btm_data->btm_request_mode;
+			trig->btm_trig_data.disassoc_timer =
+				btm_data->disassoc_imminent_timer;
+			trig->btm_trig_data.validity_interval =
+				btm_data->validity_internal;
+			trig->btm_trig_data.candidate_list_count =
+				btm_data->candidate_list_count;
+			trig->btm_trig_data.btm_resp_status =
+				btm_data->btm_response_status_code;
+			trig->btm_trig_data.btm_bss_termination_timeout =
+				btm_data->btm_bss_termination_timeout;
+			trig->btm_trig_data.btm_mbo_assoc_retry_timeout =
+				btm_data->btm_mbo_assoc_retry_timeout;
+			trig->btm_trig_data.token =
+				(uint16_t)btm_data->btm_req_dialog_token;
+		} else if (src_data) {
+			trig->btm_trig_data.btm_request_mode =
+					src_data->btm_request_mode;
+			trig->btm_trig_data.disassoc_timer =
+					src_data->disassoc_imminent_timer;
+			trig->btm_trig_data.validity_interval =
+					src_data->validity_internal;
+			trig->btm_trig_data.candidate_list_count =
+					src_data->candidate_list_count;
+			trig->btm_trig_data.btm_resp_status =
+					src_data->btm_response_status_code;
+			trig->btm_trig_data.btm_bss_termination_timeout =
+					src_data->btm_bss_termination_timeout;
+			trig->btm_trig_data.btm_mbo_assoc_retry_timeout =
+					src_data->btm_mbo_assoc_retry_timeout;
+			trig->btm_trig_data.token =
+				src_data->btm_req_dialog_token;
+			if ((btm_idx +
+				trig->btm_trig_data.candidate_list_count) <=
+			    param_buf->num_roam_btm_request_candidate_info)
+				extract_roam_11kv_candidate_info(
+						wmi_handle, evt_buf,
+						trig->btm_trig_data.btm_cand,
+						btm_idx,
+						src_data->candidate_list_count);
+		}
 
 		return QDF_STATUS_SUCCESS;
 
 	case WMI_ROAM_TRIGGER_REASON_BSS_LOAD:
-		trig->cu_trig_data.cu_load = src_data->cu_load;
+		if (param_buf->roam_trigger_bss_load)
+			bss_load_data = &param_buf->roam_trigger_bss_load[idx];
+		if (bss_load_data)
+			trig->cu_trig_data.cu_load = bss_load_data->cu_load;
+		else if (src_data)
+			trig->cu_trig_data.cu_load = src_data->cu_load;
 		return QDF_STATUS_SUCCESS;
 
 	case WMI_ROAM_TRIGGER_REASON_DEAUTH:
-		trig->deauth_trig_data.type = src_data->deauth_type;
-		trig->deauth_trig_data.reason = src_data->deauth_reason;
+		if (param_buf->roam_trigger_deauth)
+			deauth_data = &param_buf->roam_trigger_deauth[idx];
+		if (deauth_data) {
+			trig->deauth_trig_data.type = deauth_data->deauth_type;
+			trig->deauth_trig_data.reason =
+				deauth_data->deauth_reason;
+		} else if (src_data) {
+			trig->deauth_trig_data.type = src_data->deauth_type;
+			trig->deauth_trig_data.reason = src_data->deauth_reason;
+		}
 		return QDF_STATUS_SUCCESS;
 
 	case WMI_ROAM_TRIGGER_REASON_PERIODIC:
+		if (param_buf->roam_trigger_periodic)
+			periodic_data = &param_buf->roam_trigger_periodic[idx];
+		if (periodic_data) {
+			trig->periodic_trig_data.periodic_timer_ms =
+				periodic_data->periodic_timer_ms;
+		}
+		return QDF_STATUS_SUCCESS;
+
 	case WMI_ROAM_TRIGGER_REASON_LOW_RSSI:
-		trig->rssi_trig_data.threshold = src_data->roam_rssi_threshold;
+		if (cmn_data && rssi_data) {
+			trig->low_rssi_trig_data.current_rssi =
+				(uint8_t)cmn_data->current_rssi;
+			trig->low_rssi_trig_data.roam_rssi_threshold =
+				(uint8_t)rssi_data->roam_rssi_threshold;
+			trig->low_rssi_trig_data.rx_linkspeed_status =
+				(uint8_t)rssi_data->rx_linkspeed_status;
+		} else if (src_data)
+			trig->rssi_trig_data.threshold =
+				src_data->roam_rssi_threshold;
+
 		return QDF_STATUS_SUCCESS;
 
-	case WMI_ROAM_TRIGGER_REASON_WTC_BTM:
-		trig->wtc_btm_trig_data.roaming_mode =
-					src_data->vendor_specific1[0];
-		trig->wtc_btm_trig_data.vsie_trigger_reason =
-					src_data->vendor_specific1[1];
-		trig->wtc_btm_trig_data.sub_code =
-					src_data->vendor_specific1[2];
-		trig->wtc_btm_trig_data.wtc_mode =
-					src_data->vendor_specific1[3];
-		trig->wtc_btm_trig_data.wtc_scan_mode =
-			convert_wtc_scan_mode(src_data->vendor_specific1[4]);
-		trig->wtc_btm_trig_data.wtc_rssi_th =
-					src_data->vendor_specific1[5];
-		trig->wtc_btm_trig_data.wtc_candi_rssi_th =
-					src_data->vendor_specific1[6];
-
-		trig->wtc_btm_trig_data.wtc_candi_rssi_ext_present =
-					src_data->vendor_specific2[0];
-		trig->wtc_btm_trig_data.wtc_candi_rssi_th_5g =
-					src_data->vendor_specific2[1];
-		trig->wtc_btm_trig_data.wtc_candi_rssi_th_6g =
-					src_data->vendor_specific2[2];
-		trig->wtc_btm_trig_data.duration =
-					src_data->vendor_specific2[3];
+	case WMI_ROAM_TRIGGER_REASON_STA_KICKOUT:
+		if (param_buf->roam_trigger_kickout)
+			kickout_data = &param_buf->roam_trigger_kickout[idx];
+		if (kickout_data) {
+			tx_fail = kickout_data->kickout_reason;
+			trig->tx_failures_trig_data.kickout_threshold =
+				kickout_data->kickout_th;
+			trig->tx_failures_trig_data.kickout_reason =
+				wmi_convert_to_cm_roam_tx_fail_reason(tx_fail);
+		}
+		return QDF_STATUS_SUCCESS;
 
+	case WMI_ROAM_TRIGGER_REASON_WTC_BTM:
+		if (src_data) {
+			trig->wtc_btm_trig_data.roaming_mode =
+						src_data->vendor_specific1[0];
+			trig->wtc_btm_trig_data.vsie_trigger_reason =
+						src_data->vendor_specific1[1];
+			trig->wtc_btm_trig_data.sub_code =
+						src_data->vendor_specific1[2];
+			trig->wtc_btm_trig_data.wtc_mode =
+						src_data->vendor_specific1[3];
+			trig->wtc_btm_trig_data.wtc_scan_mode =
+				convert_wtc_scan_mode(src_data->vendor_specific1[4]);
+			trig->wtc_btm_trig_data.wtc_rssi_th =
+						src_data->vendor_specific1[5];
+			trig->wtc_btm_trig_data.wtc_candi_rssi_th =
+						src_data->vendor_specific1[6];
+
+			trig->wtc_btm_trig_data.wtc_candi_rssi_ext_present =
+						src_data->vendor_specific2[0];
+			trig->wtc_btm_trig_data.wtc_candi_rssi_th_5g =
+						src_data->vendor_specific2[1];
+			trig->wtc_btm_trig_data.wtc_candi_rssi_th_6g =
+						src_data->vendor_specific2[2];
+			trig->wtc_btm_trig_data.duration =
+						src_data->vendor_specific2[3];
+		}
 		return QDF_STATUS_SUCCESS;
 	default:
 		return QDF_STATUS_SUCCESS;
@@ -18752,6 +19172,7 @@ extract_roam_scan_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
 	dst->present = true;
 	dst->type = src_data->roam_scan_type;
 	dst->num_chan = src_data->roam_scan_channel_count;
+	dst->scan_complete_timestamp = src_data->scan_complete_timestamp;
 	dst->next_rssi_threshold = src_data->next_rssi_trigger_threshold;
 	dst->is_btcoex_active = WMI_GET_BTCONNECT_STATUS(src_data->flags);
 	dst->frame_info_count = src_data->frame_info_count;
@@ -18767,6 +19188,8 @@ extract_roam_scan_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
 		src_chan = &param_buf->roam_scan_chan_info[chan_idx];
 		for (i = 0; i < dst->num_chan; i++) {
 			dst->chan_freq[i] = src_chan->channel;
+			dst->dwell_type[i] =
+				(uint8_t)wlan_roam_dwell_type(src_chan->ch_dwell_type);
 			src_chan++;
 		}
 	}
@@ -18788,85 +19211,6 @@ extract_roam_scan_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
 	return QDF_STATUS_SUCCESS;
 }
 
-/**
- * wlan_roam_fail_reason_code() - Convert FW enum to Host enum
- * @wmi_roam_fail_reason: roam fail enum
- *
- * Return: Roaming failure reason codes
- */
-static enum wlan_roam_failure_reason_code
-wlan_roam_fail_reason_code(uint16_t wmi_roam_fail_reason)
-{
-	switch (wmi_roam_fail_reason) {
-	case WMI_ROAM_FAIL_REASON_NO_SCAN_START:
-		return ROAM_FAIL_REASON_NO_SCAN_START;
-	case WMI_ROAM_FAIL_REASON_NO_AP_FOUND:
-		return ROAM_FAIL_REASON_NO_AP_FOUND;
-	case WMI_ROAM_FAIL_REASON_NO_CAND_AP_FOUND:
-		return ROAM_FAIL_REASON_NO_CAND_AP_FOUND;
-	case WMI_ROAM_FAIL_REASON_HOST:
-		return ROAM_FAIL_REASON_HOST;
-	case WMI_ROAM_FAIL_REASON_AUTH_SEND:
-		return ROAM_FAIL_REASON_AUTH_SEND;
-	case WMI_ROAM_FAIL_REASON_AUTH_RECV:
-		return ROAM_FAIL_REASON_AUTH_RECV;
-	case WMI_ROAM_FAIL_REASON_NO_AUTH_RESP:
-		return ROAM_FAIL_REASON_NO_AUTH_RESP;
-	case WMI_ROAM_FAIL_REASON_REASSOC_SEND:
-		return ROAM_FAIL_REASON_REASSOC_SEND;
-	case WMI_ROAM_FAIL_REASON_REASSOC_RECV:
-		return ROAM_FAIL_REASON_REASSOC_RECV;
-	case WMI_ROAM_FAIL_REASON_NO_REASSOC_RESP:
-		return ROAM_FAIL_REASON_NO_REASSOC_RESP;
-	case WMI_ROAM_FAIL_REASON_EAPOL_TIMEOUT:
-		return ROAM_FAIL_REASON_EAPOL_TIMEOUT;
-	case WMI_ROAM_FAIL_REASON_MLME:
-		return ROAM_FAIL_REASON_MLME;
-	case WMI_ROAM_FAIL_REASON_INTERNAL_ABORT:
-		return ROAM_FAIL_REASON_INTERNAL_ABORT;
-	case WMI_ROAM_FAIL_REASON_SCAN_START:
-		return ROAM_FAIL_REASON_SCAN_START;
-	case WMI_ROAM_FAIL_REASON_AUTH_NO_ACK:
-		return ROAM_FAIL_REASON_AUTH_NO_ACK;
-	case WMI_ROAM_FAIL_REASON_AUTH_INTERNAL_DROP:
-		return ROAM_FAIL_REASON_AUTH_INTERNAL_DROP;
-	case WMI_ROAM_FAIL_REASON_REASSOC_NO_ACK:
-		return ROAM_FAIL_REASON_REASSOC_NO_ACK;
-	case WMI_ROAM_FAIL_REASON_REASSOC_INTERNAL_DROP:
-		return ROAM_FAIL_REASON_REASSOC_INTERNAL_DROP;
-	case WMI_ROAM_FAIL_REASON_EAPOL_M2_SEND:
-		return ROAM_FAIL_REASON_EAPOL_M2_SEND;
-	case WMI_ROAM_FAIL_REASON_EAPOL_M2_INTERNAL_DROP:
-		return ROAM_FAIL_REASON_EAPOL_M2_INTERNAL_DROP;
-	case WMI_ROAM_FAIL_REASON_EAPOL_M2_NO_ACK:
-		return ROAM_FAIL_REASON_EAPOL_M2_NO_ACK;
-	case WMI_ROAM_FAIL_REASON_EAPOL_M3_TIMEOUT:
-		return ROAM_FAIL_REASON_EAPOL_M3_TIMEOUT;
-	case WMI_ROAM_FAIL_REASON_EAPOL_M4_SEND:
-		return ROAM_FAIL_REASON_EAPOL_M4_SEND;
-	case WMI_ROAM_FAIL_REASON_EAPOL_M4_INTERNAL_DROP:
-		return ROAM_FAIL_REASON_EAPOL_M4_INTERNAL_DROP;
-	case WMI_ROAM_FAIL_REASON_EAPOL_M4_NO_ACK:
-		return ROAM_FAIL_REASON_EAPOL_M4_NO_ACK;
-	case WMI_ROAM_FAIL_REASON_NO_SCAN_FOR_FINAL_BMISS:
-		return ROAM_FAIL_REASON_NO_SCAN_FOR_FINAL_BMISS;
-	case WMI_ROAM_FAIL_REASON_DISCONNECT:
-		return ROAM_FAIL_REASON_DISCONNECT;
-	case WMI_ROAM_FAIL_REASON_SYNC:
-		return ROAM_FAIL_REASON_SYNC;
-	case WMI_ROAM_FAIL_REASON_SAE_INVALID_PMKID:
-		return ROAM_FAIL_REASON_SAE_INVALID_PMKID;
-	case WMI_ROAM_FAIL_REASON_SAE_PREAUTH_TIMEOUT:
-		return ROAM_FAIL_REASON_SAE_PREAUTH_TIMEOUT;
-	case WMI_ROAM_FAIL_REASON_SAE_PREAUTH_FAIL:
-		return ROAM_FAIL_REASON_SAE_PREAUTH_FAIL;
-	case WMI_ROAM_FAIL_REASON_UNABLE_TO_START_ROAM_HO:
-		return ROAM_FAIL_REASON_UNABLE_TO_START_ROAM_HO;
-	default:
-		return ROAM_FAIL_REASON_UNKNOWN;
-	}
-}
-
 /**
  * extract_roam_result_stats_tlv() - Extract the Roam trigger stats
  * from the WMI_ROAM_STATS_EVENTID