Explorar o código

qcacmn: Extend WMI_ROAM_STATS_EVENTID for enhanced roam

Extend WMI_ROAM_STATS_EVENTID event information for
requirement of:
1.Roam trigger related information, include timestamp,
  trigger reason, trigger condition, abort reason,
  scan type, roam status and fail reason.
2.Roam scan related information, include scan channel
  number, dwell type, max dwell time of each channel
  and total scan time.
3.all types of roam related frame information, include
  timestamp and successful or failed status for Preauth,
  Reassoc, EAPOL-M1/M2/M3/M4.

Change-Id: I1f54bc04d7cb8b083f1394989746c57c66fa29f6
CRs-Fixed: 3381545
chunquan %!s(int64=2) %!d(string=hai) anos
pai
achega
e26d34b3bb
Modificáronse 2 ficheiros con 625 adicións e 138 borrados
  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