|
@@ -12535,6 +12535,286 @@ static QDF_STATUS extract_ani_level_tlv(uint8_t *evt_buf,
|
|
|
}
|
|
|
#endif /* FEATURE_ANI_LEVEL_REQUEST */
|
|
|
|
|
|
+#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
|
|
+/**
|
|
|
+ * extract_roam_trigger_stats_tlv() - Extract the Roam trigger stats
|
|
|
+ * from the WMI_ROAM_STATS_EVENTID
|
|
|
+ * @wmi_handle: wmi handle
|
|
|
+ * @evt_buf: Pointer to the event buffer
|
|
|
+ * @trig: Pointer to destination structure to fill data
|
|
|
+ * @idx: TLV id
|
|
|
+ */
|
|
|
+static QDF_STATUS
|
|
|
+extract_roam_trigger_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
|
|
|
+ struct wmi_roam_trigger_info *trig, uint8_t idx)
|
|
|
+{
|
|
|
+ WMI_ROAM_STATS_EVENTID_param_tlvs *param_buf;
|
|
|
+ wmi_roam_trigger_reason *src_data = NULL;
|
|
|
+
|
|
|
+ param_buf = (WMI_ROAM_STATS_EVENTID_param_tlvs *)evt_buf;
|
|
|
+ if (!param_buf)
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+
|
|
|
+ src_data = ¶m_buf->roam_trigger_reason[idx];
|
|
|
+
|
|
|
+ trig->trigger_reason = src_data->trigger_reason;
|
|
|
+ trig->trigger_sub_reason = src_data->trigger_sub_reason;
|
|
|
+ trig->current_rssi = src_data->current_rssi;
|
|
|
+ trig->timestamp = src_data->timestamp;
|
|
|
+
|
|
|
+ switch (trig->trigger_reason) {
|
|
|
+ case WMI_ROAM_TRIGGER_REASON_PER:
|
|
|
+ case WMI_ROAM_TRIGGER_REASON_BMISS:
|
|
|
+ case WMI_ROAM_TRIGGER_REASON_HIGH_RSSI:
|
|
|
+ case WMI_ROAM_TRIGGER_REASON_PERIODIC:
|
|
|
+ case WMI_ROAM_TRIGGER_REASON_MAWC:
|
|
|
+ case WMI_ROAM_TRIGGER_REASON_DENSE:
|
|
|
+ case WMI_ROAM_TRIGGER_REASON_BACKGROUND:
|
|
|
+ case WMI_ROAM_TRIGGER_REASON_IDLE:
|
|
|
+ case WMI_ROAM_TRIGGER_REASON_FORCED:
|
|
|
+ case WMI_ROAM_TRIGGER_REASON_UNIT_TEST:
|
|
|
+ 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;
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+
|
|
|
+ case WMI_ROAM_TRIGGER_REASON_BSS_LOAD:
|
|
|
+ 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;
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+
|
|
|
+ case WMI_ROAM_TRIGGER_REASON_LOW_RSSI:
|
|
|
+ trig->rssi_trig_data.threshold = src_data->roam_rssi_threshold;
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+
|
|
|
+ default:
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+ }
|
|
|
+
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * extract_roam_scan_ap_stats_tlv() - Extract the Roam trigger stats
|
|
|
+ * from the WMI_ROAM_STATS_EVENTID
|
|
|
+ * @wmi_handle: wmi handle
|
|
|
+ * @evt_buf: Pointer to the event buffer
|
|
|
+ * @dst: Pointer to destination structure to fill data
|
|
|
+ * @ap_idx: TLV index for this roam scan
|
|
|
+ * @num_cand: number of candidates list in the roam scan
|
|
|
+ */
|
|
|
+static QDF_STATUS
|
|
|
+extract_roam_scan_ap_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
|
|
|
+ struct wmi_roam_candidate_info *dst,
|
|
|
+ uint8_t ap_idx, uint16_t num_cand)
|
|
|
+{
|
|
|
+ WMI_ROAM_STATS_EVENTID_param_tlvs *param_buf;
|
|
|
+ wmi_roam_ap_info *src = NULL;
|
|
|
+ uint8_t i;
|
|
|
+
|
|
|
+ param_buf = (WMI_ROAM_STATS_EVENTID_param_tlvs *)evt_buf;
|
|
|
+ if (!param_buf)
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+
|
|
|
+ src = ¶m_buf->roam_ap_info[ap_idx];
|
|
|
+
|
|
|
+ if (num_cand > MAX_ROAM_CANDIDATE_AP)
|
|
|
+ num_cand = MAX_ROAM_CANDIDATE_AP;
|
|
|
+
|
|
|
+ for (i = 0; i < num_cand; i++) {
|
|
|
+ WMI_MAC_ADDR_TO_CHAR_ARRAY(&src->bssid, dst->bssid.bytes);
|
|
|
+ dst->type = src->candidate_type;
|
|
|
+ dst->freq = src->channel;
|
|
|
+ dst->etp = src->etp;
|
|
|
+ dst->rssi = src->rssi;
|
|
|
+ dst->rssi_score = src->rssi_score;
|
|
|
+ dst->cu_load = src->cu_load;
|
|
|
+ dst->cu_score = src->cu_score;
|
|
|
+ dst->total_score = src->total_score;
|
|
|
+ dst->timestamp = src->timestamp;
|
|
|
+
|
|
|
+ src++;
|
|
|
+ dst++;
|
|
|
+ }
|
|
|
+
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * extract_roam_scan_stats_tlv() - Extract the Roam trigger stats
|
|
|
+ * from the WMI_ROAM_STATS_EVENTID
|
|
|
+ * @wmi_handle: wmi handle
|
|
|
+ * @evt_buf: Pointer to the event buffer
|
|
|
+ * @dst: Pointer to destination structure to fill data
|
|
|
+ * @idx: TLV id
|
|
|
+ * @chan_idx: Index of the channel tlv for the current roam trigger
|
|
|
+ * @ap_idx: Index of the candidate AP TLV for the current roam trigger
|
|
|
+ */
|
|
|
+static QDF_STATUS
|
|
|
+extract_roam_scan_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
|
|
|
+ struct wmi_roam_scan_data *dst, uint8_t idx,
|
|
|
+ uint8_t chan_idx, uint8_t ap_idx)
|
|
|
+{
|
|
|
+ WMI_ROAM_STATS_EVENTID_param_tlvs *param_buf;
|
|
|
+ wmi_roam_scan_info *src_data = NULL;
|
|
|
+ wmi_roam_scan_channel_info *src_chan = NULL;
|
|
|
+ QDF_STATUS status;
|
|
|
+ uint8_t i;
|
|
|
+
|
|
|
+ param_buf = (WMI_ROAM_STATS_EVENTID_param_tlvs *)evt_buf;
|
|
|
+ if (!param_buf)
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+
|
|
|
+ src_data = ¶m_buf->roam_scan_info[idx];
|
|
|
+
|
|
|
+ dst->type = src_data->roam_scan_type;
|
|
|
+ dst->num_ap = src_data->roam_ap_count;
|
|
|
+ dst->num_chan = src_data->roam_scan_channel_count;
|
|
|
+ dst->next_rssi_threshold = src_data->next_rssi_trigger_threshold;
|
|
|
+
|
|
|
+ /* Read the channel data only for dst->type is 0 (partial scan) */
|
|
|
+ if (dst->num_chan && !dst->type) {
|
|
|
+ if (dst->num_chan > MAX_ROAM_SCAN_CHAN)
|
|
|
+ dst->num_chan = MAX_ROAM_SCAN_CHAN;
|
|
|
+
|
|
|
+ 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;
|
|
|
+ src_chan++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!dst->num_ap)
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+
|
|
|
+ status = extract_roam_scan_ap_stats_tlv(wmi_handle, evt_buf, dst->ap,
|
|
|
+ ap_idx, dst->num_ap);
|
|
|
+ if (QDF_IS_STATUS_ERROR(status)) {
|
|
|
+ WMI_LOGE("Extract candidate stats for tlv[%d] failed", idx);
|
|
|
+ return status;
|
|
|
+ }
|
|
|
+
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * extract_roam_scan_stats_tlv() - Extract the Roam trigger stats
|
|
|
+ * from the WMI_ROAM_STATS_EVENTID
|
|
|
+ * @wmi_handle: wmi handle
|
|
|
+ * @evt_buf: Pointer to the event buffer
|
|
|
+ * @dst: Pointer to destination structure to fill data
|
|
|
+ * @idx: TLV id
|
|
|
+ */
|
|
|
+static QDF_STATUS
|
|
|
+extract_roam_result_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
|
|
|
+ struct wmi_roam_result *dst, uint8_t idx)
|
|
|
+{
|
|
|
+ WMI_ROAM_STATS_EVENTID_param_tlvs *param_buf;
|
|
|
+ wmi_roam_result *src_data = NULL;
|
|
|
+
|
|
|
+ param_buf = (WMI_ROAM_STATS_EVENTID_param_tlvs *)evt_buf;
|
|
|
+ if (!param_buf)
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+
|
|
|
+ src_data = ¶m_buf->roam_result[idx];
|
|
|
+
|
|
|
+ dst->status = src_data->roam_status ? false : true;
|
|
|
+ dst->timestamp = src_data->timestamp;
|
|
|
+ dst->fail_reason = src_data->roam_fail_reason;
|
|
|
+
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * extract_roam_11kv_stats_tlv() - Extract the Roam trigger stats
|
|
|
+ * from the WMI_ROAM_STATS_EVENTID
|
|
|
+ * @wmi_handle: wmi handle
|
|
|
+ * @evt_buf: Pointer to the event buffer
|
|
|
+ * @dst: Pointer to destination structure to fill data
|
|
|
+ * @idx: TLV id
|
|
|
+ * @rpt_idx: Neighbor report Channel index
|
|
|
+ */
|
|
|
+static QDF_STATUS
|
|
|
+extract_roam_11kv_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
|
|
|
+ struct wmi_neighbor_report_data *dst,
|
|
|
+ uint8_t idx, uint8_t rpt_idx)
|
|
|
+{
|
|
|
+ WMI_ROAM_STATS_EVENTID_param_tlvs *param_buf;
|
|
|
+ wmi_roam_neighbor_report_info *src_data = NULL;
|
|
|
+ wmi_roam_neighbor_report_channel_info *src_freq = NULL;
|
|
|
+ uint8_t i;
|
|
|
+
|
|
|
+ param_buf = (WMI_ROAM_STATS_EVENTID_param_tlvs *)evt_buf;
|
|
|
+ if (!param_buf)
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+
|
|
|
+ src_data = ¶m_buf->roam_neighbor_report_info[idx];
|
|
|
+
|
|
|
+ dst->req_type = src_data->request_type;
|
|
|
+ dst->num_freq = src_data->neighbor_report_channel_count;
|
|
|
+ dst->req_time = src_data->neighbor_report_request_timestamp;
|
|
|
+ dst->resp_time = src_data->neighbor_report_response_timestamp;
|
|
|
+
|
|
|
+ if (!dst->num_freq)
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+
|
|
|
+ src_freq = ¶m_buf->roam_neighbor_report_chan_info[rpt_idx];
|
|
|
+ if (dst->num_freq > MAX_ROAM_SCAN_CHAN)
|
|
|
+ dst->num_freq = MAX_ROAM_SCAN_CHAN;
|
|
|
+
|
|
|
+ for (i = 0; i < dst->num_freq; i++) {
|
|
|
+ dst->freq[i] = src_freq->channel;
|
|
|
+ src_freq++;
|
|
|
+ }
|
|
|
+
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline QDF_STATUS
|
|
|
+extract_roam_trigger_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
|
|
|
+ struct wmi_roam_trigger_info *trig, uint8_t idx)
|
|
|
+{
|
|
|
+ return QDF_STATUS_E_NOSUPPORT;
|
|
|
+}
|
|
|
+
|
|
|
+static inline QDF_STATUS
|
|
|
+extract_roam_result_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
|
|
|
+ struct wmi_roam_result *dst, uint8_t idx)
|
|
|
+{
|
|
|
+ return QDF_STATUS_E_NOSUPPORT;
|
|
|
+}
|
|
|
+
|
|
|
+static QDF_STATUS
|
|
|
+extract_roam_11kv_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
|
|
|
+ struct wmi_neighbor_report_data *dst,
|
|
|
+ uint8_t idx, uint8_t rpt_idx)
|
|
|
+{
|
|
|
+ return QDF_STATUS_E_NOSUPPORT;
|
|
|
+}
|
|
|
+
|
|
|
+static QDF_STATUS
|
|
|
+extract_roam_scan_stats_tlv(wmi_unified_t wmi_handle, void *evt_buf,
|
|
|
+ struct wmi_roam_scan_data *dst, uint8_t idx,
|
|
|
+ uint8_t chan_idx, uint8_t ap_idx)
|
|
|
+{
|
|
|
+ return QDF_STATUS_E_NOSUPPORT;
|
|
|
+}
|
|
|
+#endif
|
|
|
+
|
|
|
struct wmi_ops tlv_ops = {
|
|
|
.send_vdev_create_cmd = send_vdev_create_cmd_tlv,
|
|
|
.send_vdev_delete_cmd = send_vdev_delete_cmd_tlv,
|
|
@@ -12835,6 +13115,10 @@ struct wmi_ops tlv_ops = {
|
|
|
.send_ani_level_cmd = send_ani_level_cmd_tlv,
|
|
|
.extract_ani_level = extract_ani_level_tlv,
|
|
|
#endif /* FEATURE_ANI_LEVEL_REQUEST */
|
|
|
+ .extract_roam_trigger_stats = extract_roam_trigger_stats_tlv,
|
|
|
+ .extract_roam_scan_stats = extract_roam_scan_stats_tlv,
|
|
|
+ .extract_roam_result_stats = extract_roam_result_stats_tlv,
|
|
|
+ .extract_roam_11kv_stats = extract_roam_11kv_stats_tlv,
|
|
|
};
|
|
|
|
|
|
/**
|
|
@@ -13185,6 +13469,7 @@ static void populate_tlv_events_id(uint32_t *event_ids)
|
|
|
event_ids[wmi_get_ani_level_event_id] = WMI_GET_CHANNEL_ANI_EVENTID;
|
|
|
event_ids[wmi_peer_tx_pn_response_event_id] =
|
|
|
WMI_PEER_TX_PN_RESPONSE_EVENTID;
|
|
|
+ event_ids[wmi_roam_stats_event_id] = WMI_ROAM_STATS_EVENTID;
|
|
|
}
|
|
|
|
|
|
/**
|