diff --git a/wmi_unified_api.h b/wmi_unified_api.h index 768b48ef6b..d230ca1c1a 100644 --- a/wmi_unified_api.h +++ b/wmi_unified_api.h @@ -2330,6 +2330,33 @@ QDF_STATUS wmi_unified_fils_discovery_send_cmd(void *wmi_hdl, struct fd_params *param); #endif /* WLAN_SUPPORT_FILS */ +/** + * wmi_unified_send_roam_scan_stats_cmd() - Wrapper to request roam scan stats + * @wmi_hdl: wmi handle + * @params: request params + * + * This function is used to send the roam scan stats request command to + * firmware. + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS +wmi_unified_send_roam_scan_stats_cmd(void *wmi_hdl, + struct wmi_roam_scan_stats_req *params); + +/** + * wmi_extract_roam_scan_stats_res_evt() - API to extract roam scan stats res + * @wmi: wmi handle + * @evt_buf: pointer to the event buffer + * @vdev_id: output pointer to hold vdev id + * @res_param: output pointer to hold extracted memory + * + * Return: QDF_STATUS + */ +QDF_STATUS +wmi_extract_roam_scan_stats_res_evt(wmi_unified_t wmi, void *evt_buf, + uint32_t *vdev_id, + struct wmi_roam_scan_stats_res **res_param); /** * wmi_unified_offload_11k_cmd() - send 11k offload command * @wmi_hdl: wmi handle diff --git a/wmi_unified_param.h b/wmi_unified_param.h index 8443b02306..c26eca3ae3 100644 --- a/wmi_unified_param.h +++ b/wmi_unified_param.h @@ -5614,6 +5614,7 @@ typedef enum { #endif wmi_twt_enable_complete_event_id, wmi_apf_get_vdev_work_memory_resp_event_id, + wmi_roam_scan_stats_event_id, #ifdef OL_ATH_SMART_LOGGING wmi_debug_fatal_condition_eventid, @@ -8752,4 +8753,82 @@ struct wmi_apf_read_memory_resp_event_params { #define WMI_HOST_VDEV_FLAGS_TRANSMIT_AP 0x00000002 #define WMI_HOST_VDEV_FLAGS_NON_TRANSMIT_AP 0x00000004 +/* Begin of roam scan stats definitions */ + +#define WMI_ROAM_SCAN_STATS_MAX 5 +#define WMI_ROAM_SCAN_STATS_CANDIDATES_MAX 4 +#define WMI_ROAM_SCAN_STATS_CHANNELS_MAX 50 + +/** + * struct wmi_roam_scan_stats_req - Structure to hold roam scan stats request + * @vdev_id: interface id + */ +struct wmi_roam_scan_stats_req { + uint32_t vdev_id; +}; + +/** + * struct wmi_roam_scan_cand - Roam scan candidates + * @score: score of AP + * @rssi: rssi of the AP + * @freq: center frequency + * @bssid: bssid of AP + */ +struct wmi_roam_scan_cand { + uint32_t score; + uint32_t rssi; + uint32_t freq; + uint8_t bssid[QDF_MAC_ADDR_SIZE]; +}; + +/** + * struct wmi_roam_scan_stats_params - Roam scan details + * @time_stamp: time at which this roam scan happened + * @client_id: id of client which triggered this scan + * @num_scan_chans: number of channels that were scanned as part of this scan + * @scan_freqs: frequencies of the channels that were scanned + * @is_roam_successful: whether a successful roaming happened after this scan + * @old_bssid: bssid to which STA is connected just before this scan + * @new_bssid: bssid to which STA is roamed to in case of successful roaming + * @num_roam_candidates: no.of roam candidates that are being reported + * @roam_candidate: roam scan candidate details + * @trigger_id: reason for triggering this roam or roam scan + * @trigger_value: threshold value related to trigger_id + */ +struct wmi_roam_scan_stats_params { + uint64_t time_stamp; + uint32_t client_id; + uint32_t num_scan_chans; + uint32_t scan_freqs[WMI_ROAM_SCAN_STATS_CHANNELS_MAX]; + uint32_t is_roam_successful; + + /* Bssid to which STA is connected when the roam scan is triggered */ + uint8_t old_bssid[QDF_MAC_ADDR_SIZE]; + + /* + * Bssid to which STA is connected after roaming. Will be valid only + * if is_roam_successful is true. + */ + uint8_t new_bssid[QDF_MAC_ADDR_SIZE]; + + /* Number of roam candidates that are being reported in the stats */ + uint32_t num_roam_candidates; + struct wmi_roam_scan_cand cand[WMI_ROAM_SCAN_STATS_CANDIDATES_MAX]; + uint32_t trigger_id; + uint32_t trigger_value; +}; + +/** + * struct wmi_roam_scan_stats_res - Roam scan stats response from firmware + * @num_roam_scan: number of roam scans triggered + * @roam_scan: place holder to indicate the array of + * wmi_roam_scan_stats_params followed by this structure + */ +struct wmi_roam_scan_stats_res { + uint32_t num_roam_scans; + struct wmi_roam_scan_stats_params roam_scan[0]; +}; + +/* End of roam scan stats definitions */ + #endif /* _WMI_UNIFIED_PARAM_H_ */ diff --git a/wmi_unified_priv.h b/wmi_unified_priv.h index cd843a9947..ff8be3ac43 100644 --- a/wmi_unified_priv.h +++ b/wmi_unified_priv.h @@ -1620,6 +1620,17 @@ QDF_STATUS (*extract_swfda_vdev_id)(wmi_unified_t wmi_handle, void *evt_buf, QDF_STATUS (*send_fils_discovery_send_cmd)(wmi_unified_t wmi_handle, struct fd_params *param); #endif /* WLAN_SUPPORT_FILS */ + +QDF_STATUS +(*send_roam_scan_stats_cmd)(wmi_unified_t wmi_handle, + struct wmi_roam_scan_stats_req *params); + +QDF_STATUS +(*extract_roam_scan_stats_res_evt)(wmi_unified_t wmi_handle, + void *evt_buf, + uint32_t *vdev_id, + struct wmi_roam_scan_stats_res **res_param); + QDF_STATUS (*send_offload_11k_cmd)(wmi_unified_t wmi_handle, struct wmi_11k_offload_params *params);