diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index c043c1278d..e32640c0c1 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/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 */ diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 4f35a1bf0a..c81c861cfa 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/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; + } - src_data = ¶m_buf->roam_trigger_reason[idx]; + if (!param_buf->roam_result || idx >= param_buf->num_roam_result) + wmi_err("roam_result or idx error.%u", 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 = ¶m_buf->roam_scan_info[idx]; + + if (param_buf->roam_trigger_reason_cmm) + cmn_data = ¶m_buf->roam_trigger_reason_cmm[idx]; + + if (param_buf->roam_trigger_reason) + src_data = ¶m_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 = ¶m_buf->roam_trigger_rssi[idx]; + + if (param_buf->roam_result) { + roam_result = ¶m_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 = ¶m_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 = ¶m_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 = ¶m_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 = ¶m_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 = ¶m_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 = ¶m_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 = ¶m_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 = ¶m_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 = ¶m_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_STA_KICKOUT: + if (param_buf->roam_trigger_kickout) + kickout_data = ¶m_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: - 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]; + 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 = ¶m_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