|
@@ -833,6 +833,254 @@ convert_roam_trigger_reason(enum roam_trigger_reason trigger_reason)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
|
|
|
+static char *wmi_get_roam_event_reason_string(uint32_t reason)
|
|
|
+{
|
|
|
+ switch (reason) {
|
|
|
+ case WMI_ROAM_REASON_INVALID:
|
|
|
+ return "Default";
|
|
|
+ case WMI_ROAM_REASON_BETTER_AP:
|
|
|
+ return "Better AP";
|
|
|
+ case WMI_ROAM_REASON_BMISS:
|
|
|
+ return "BMISS";
|
|
|
+ case WMI_ROAM_REASON_LOW_RSSI:
|
|
|
+ return "Low Rssi";
|
|
|
+ case WMI_ROAM_REASON_SUITABLE_AP:
|
|
|
+ return "Suitable AP";
|
|
|
+ case WMI_ROAM_REASON_HO_FAILED:
|
|
|
+ return "Hand-off Failed";
|
|
|
+ case WMI_ROAM_REASON_INVOKE_ROAM_FAIL:
|
|
|
+ return "Roam Invoke failed";
|
|
|
+ case WMI_ROAM_REASON_RSO_STATUS:
|
|
|
+ return "RSO status";
|
|
|
+ case WMI_ROAM_REASON_BTM:
|
|
|
+ return "BTM";
|
|
|
+ case WMI_ROAM_REASON_DEAUTH:
|
|
|
+ return "Deauth";
|
|
|
+ default:
|
|
|
+ return "Invalid";
|
|
|
+ }
|
|
|
+
|
|
|
+ return "Invalid";
|
|
|
+}
|
|
|
+
|
|
|
+static enum roam_reason
|
|
|
+wmi_convert_fw_reason_to_cm_reason(uint32_t reason)
|
|
|
+{
|
|
|
+ switch (reason) {
|
|
|
+ case WMI_ROAM_REASON_INVALID:
|
|
|
+ return ROAM_REASON_INVALID;
|
|
|
+ case WMI_ROAM_REASON_BETTER_AP:
|
|
|
+ return ROAM_REASON_BETTER_AP;
|
|
|
+ case WMI_ROAM_REASON_BMISS:
|
|
|
+ return ROAM_REASON_BMISS;
|
|
|
+ case WMI_ROAM_REASON_LOW_RSSI:
|
|
|
+ return ROAM_REASON_LOW_RSSI;
|
|
|
+ case WMI_ROAM_REASON_SUITABLE_AP:
|
|
|
+ return ROAM_REASON_SUITABLE_AP;
|
|
|
+ case WMI_ROAM_REASON_HO_FAILED:
|
|
|
+ return ROAM_REASON_HO_FAILED;
|
|
|
+ case WMI_ROAM_REASON_INVOKE_ROAM_FAIL:
|
|
|
+ return ROAM_REASON_INVOKE_ROAM_FAIL;
|
|
|
+ case WMI_ROAM_REASON_RSO_STATUS:
|
|
|
+ return ROAM_REASON_RSO_STATUS;
|
|
|
+ case WMI_ROAM_REASON_BTM:
|
|
|
+ return ROAM_REASON_BTM;
|
|
|
+ case WMI_ROAM_REASON_DEAUTH:
|
|
|
+ return ROAM_REASON_DEAUTH;
|
|
|
+ default:
|
|
|
+ return ROAM_REASON_INVALID;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ROAM_REASON_INVALID;
|
|
|
+}
|
|
|
+
|
|
|
+static enum cm_roam_notif
|
|
|
+wmi_convert_fw_notif_to_cm_notif(uint32_t fw_notif)
|
|
|
+{
|
|
|
+ switch (fw_notif) {
|
|
|
+ case WMI_ROAM_NOTIF_ROAM_START:
|
|
|
+ return CM_ROAM_NOTIF_ROAM_START;
|
|
|
+ case WMI_ROAM_NOTIF_ROAM_ABORT:
|
|
|
+ return CM_ROAM_NOTIF_ROAM_ABORT;
|
|
|
+ case WMI_ROAM_NOTIF_ROAM_REASSOC:
|
|
|
+ return CM_ROAM_NOTIF_ROAM_REASSOC;
|
|
|
+ case WMI_ROAM_NOTIF_SCAN_MODE_SUCCESS:
|
|
|
+ return CM_ROAM_NOTIF_SCAN_MODE_SUCCESS;
|
|
|
+ case WMI_ROAM_NOTIF_SCAN_MODE_FAIL:
|
|
|
+ return CM_ROAM_NOTIF_SCAN_MODE_FAIL;
|
|
|
+ case WMI_ROAM_NOTIF_DISCONNECT:
|
|
|
+ return CM_ROAM_NOTIF_DISCONNECT;
|
|
|
+ case WMI_ROAM_NOTIF_SUBNET_CHANGED:
|
|
|
+ return CM_ROAM_NOTIF_SUBNET_CHANGED;
|
|
|
+ case WMI_ROAM_NOTIF_SCAN_START:
|
|
|
+ return CM_ROAM_NOTIF_SCAN_START;
|
|
|
+ case WMI_ROAM_NOTIF_DEAUTH_RECV:
|
|
|
+ return CM_ROAM_NOTIF_DEAUTH_RECV;
|
|
|
+ case WMI_ROAM_NOTIF_DISASSOC_RECV:
|
|
|
+ return CM_ROAM_NOTIF_DISASSOC_RECV;
|
|
|
+ case WMI_ROAM_NOTIF_SCAN_MODE_SUCCESS_WITH_HO_FAIL:
|
|
|
+ return CM_ROAM_NOTIF_HO_FAIL;
|
|
|
+ case WMI_ROAM_NOTIF_SCAN_END:
|
|
|
+ return CM_ROAM_NOTIF_SCAN_END;
|
|
|
+ default:
|
|
|
+ return CM_ROAM_NOTIF_INVALID;
|
|
|
+ }
|
|
|
+
|
|
|
+ return CM_ROAM_NOTIF_INVALID;
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+wmi_extract_pdev_hw_mode_trans_ind(
|
|
|
+ wmi_pdev_hw_mode_transition_event_fixed_param *fixed_param,
|
|
|
+ wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry,
|
|
|
+ struct cm_hw_mode_trans_ind *hw_mode_trans_ind)
|
|
|
+{
|
|
|
+ uint32_t i;
|
|
|
+
|
|
|
+ if (fixed_param->num_vdev_mac_entries > MAX_VDEV_SUPPORTED) {
|
|
|
+ wmi_err("Number of Vdev mac entries %d exceeded max vdev supported %d",
|
|
|
+ fixed_param->num_vdev_mac_entries,
|
|
|
+ MAX_VDEV_SUPPORTED);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ hw_mode_trans_ind->old_hw_mode_index = fixed_param->old_hw_mode_index;
|
|
|
+ hw_mode_trans_ind->new_hw_mode_index = fixed_param->new_hw_mode_index;
|
|
|
+ hw_mode_trans_ind->num_vdev_mac_entries =
|
|
|
+ fixed_param->num_vdev_mac_entries;
|
|
|
+ wmi_debug("old_hw_mode_index:%d new_hw_mode_index:%d entries=%d",
|
|
|
+ fixed_param->old_hw_mode_index,
|
|
|
+ fixed_param->new_hw_mode_index,
|
|
|
+ fixed_param->num_vdev_mac_entries);
|
|
|
+
|
|
|
+ if (!vdev_mac_entry) {
|
|
|
+ wmi_err("Invalid vdev_mac_entry");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Store the vdev-mac map in WMA and send to policy manager */
|
|
|
+ for (i = 0; i < fixed_param->num_vdev_mac_entries; i++) {
|
|
|
+ uint32_t vdev_id, mac_id, pdev_id;
|
|
|
+
|
|
|
+ vdev_id = vdev_mac_entry[i].vdev_id;
|
|
|
+ pdev_id = vdev_mac_entry[i].pdev_id;
|
|
|
+
|
|
|
+ if (pdev_id == OL_TXRX_PDEV_ID) {
|
|
|
+ wmi_err("soc level id received for mac id");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (vdev_id >= WLAN_MAX_VDEVS) {
|
|
|
+ wmi_err("vdev_id: %d is invalid, max_bssid: %d",
|
|
|
+ vdev_id, WLAN_MAX_VDEVS);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ mac_id = WMI_PDEV_TO_MAC_MAP(vdev_mac_entry[i].pdev_id);
|
|
|
+
|
|
|
+ hw_mode_trans_ind->vdev_mac_map[i].vdev_id = vdev_id;
|
|
|
+ hw_mode_trans_ind->vdev_mac_map[i].mac_id = mac_id;
|
|
|
+
|
|
|
+ wmi_debug("vdev_id:%d mac_id:%d", vdev_id, mac_id);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * extract_roam_sync_event_tlv() - Extract the roam event
|
|
|
+ * @wmi_handle: wmi handle
|
|
|
+ * @evt_buf: Pointer to the event buffer
|
|
|
+ * @len: Data length
|
|
|
+ * @roam_event: Roam event data
|
|
|
+ */
|
|
|
+static QDF_STATUS
|
|
|
+extract_roam_event_tlv(wmi_unified_t wmi_handle, void *evt_buf, uint32_t len,
|
|
|
+ struct roam_offload_roam_event *roam_event)
|
|
|
+{
|
|
|
+ QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
|
+ wmi_roam_event_fixed_param *wmi_event = NULL;
|
|
|
+ WMI_ROAM_EVENTID_param_tlvs *param_buf = NULL;
|
|
|
+ struct cm_hw_mode_trans_ind *hw_mode_trans_ind;
|
|
|
+ wmi_pdev_hw_mode_transition_event_fixed_param *hw_mode_trans_param;
|
|
|
+
|
|
|
+ if (!evt_buf) {
|
|
|
+ wmi_debug("Empty roam_sync_event param buf");
|
|
|
+ status = QDF_STATUS_E_FAILURE;
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ param_buf = (WMI_ROAM_EVENTID_param_tlvs *)evt_buf;
|
|
|
+ if (!param_buf) {
|
|
|
+ wmi_debug("received null buf from target");
|
|
|
+ status = QDF_STATUS_E_FAILURE;
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ wmi_event = param_buf->fixed_param;
|
|
|
+ if (!wmi_event) {
|
|
|
+ wmi_debug("received null event data from target");
|
|
|
+ status = QDF_STATUS_E_FAILURE;
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ roam_event->vdev_id = wmi_event->vdev_id;
|
|
|
+
|
|
|
+ if (roam_event->vdev_id >= WLAN_MAX_VDEVS) {
|
|
|
+ wmi_err("Invalid vdev id from firmware: %u",
|
|
|
+ roam_event->vdev_id);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ hw_mode_trans_param = param_buf->hw_mode_transition_fixed_param;
|
|
|
+ if (hw_mode_trans_param &&
|
|
|
+ hw_mode_trans_param->num_vdev_mac_entries >
|
|
|
+ param_buf->num_wmi_pdev_set_hw_mode_response_vdev_mac_mapping) {
|
|
|
+ wmi_debug("invalid vdev mac entries %d %d",
|
|
|
+ hw_mode_trans_param->num_vdev_mac_entries,
|
|
|
+ param_buf->num_wmi_pdev_set_hw_mode_response_vdev_mac_mapping);
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
+ roam_event->reason =
|
|
|
+ wmi_convert_fw_reason_to_cm_reason(wmi_event->reason);
|
|
|
+ roam_event->rssi = wmi_event->rssi;
|
|
|
+ roam_event->notif = wmi_convert_fw_notif_to_cm_notif(wmi_event->notif);
|
|
|
+ roam_event->notif_params = wmi_event->notif_params;
|
|
|
+ roam_event->notif_params1 = wmi_event->notif_params1;
|
|
|
+
|
|
|
+ wlan_roam_debug_log(roam_event->vdev_id, DEBUG_ROAM_EVENT,
|
|
|
+ DEBUG_INVALID_PEER_ID, NULL, NULL,
|
|
|
+ roam_event->reason,
|
|
|
+ (roam_event->reason == WMI_ROAM_REASON_INVALID) ?
|
|
|
+ roam_event->notif : roam_event->rssi);
|
|
|
+
|
|
|
+ DPTRACE(qdf_dp_trace_record_event(QDF_DP_TRACE_EVENT_RECORD,
|
|
|
+ roam_event->vdev_id,
|
|
|
+ QDF_TRACE_DEFAULT_PDEV_ID,
|
|
|
+ QDF_PROTO_TYPE_EVENT,
|
|
|
+ QDF_ROAM_EVENTID));
|
|
|
+
|
|
|
+ wmi_debug("FW_ROAM_EVT: Reason:%s[%d], Notif %x for vdevid %x, rssi %d",
|
|
|
+ wmi_get_roam_event_reason_string(roam_event->reason),
|
|
|
+ roam_event->reason,
|
|
|
+ roam_event->notif, roam_event->vdev_id, roam_event->rssi);
|
|
|
+
|
|
|
+ if (param_buf->hw_mode_transition_fixed_param) {
|
|
|
+ hw_mode_trans_ind = qdf_mem_malloc(sizeof(*hw_mode_trans_ind));
|
|
|
+ if (!hw_mode_trans_ind) {
|
|
|
+ status = QDF_STATUS_E_NOMEM;
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ wmi_extract_pdev_hw_mode_trans_ind(
|
|
|
+ param_buf->hw_mode_transition_fixed_param,
|
|
|
+ param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping,
|
|
|
+ hw_mode_trans_ind);
|
|
|
+ roam_event->hw_mode_trans_ind = hw_mode_trans_ind;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (wmi_event->notif_params1)
|
|
|
+ roam_event->deauth_disassoc_frame =
|
|
|
+ param_buf->deauth_disassoc_frame;
|
|
|
+end:
|
|
|
+ return status;
|
|
|
+}
|
|
|
+#endif /* WLAN_FEATURE_HOST_ROAM || WLAN_FEATURE_ROAM_OFFLOAD */
|
|
|
|
|
|
#ifdef WLAN_FEATURE_ROAM_OFFLOAD
|
|
|
/* send_set_ric_req_cmd_tlv() - set ric request element
|
|
@@ -1815,60 +2063,6 @@ extract_roam_frame_info_tlv(wmi_unified_t wmi_handle, void *evt_buf,
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
}
|
|
|
|
|
|
-static void
|
|
|
-wmi_extract_pdev_hw_mode_trans_ind(
|
|
|
- wmi_pdev_hw_mode_transition_event_fixed_param *fixed_param,
|
|
|
- wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry,
|
|
|
- struct cm_hw_mode_trans_ind *hw_mode_trans_ind)
|
|
|
-{
|
|
|
- uint32_t i;
|
|
|
-
|
|
|
- if (fixed_param->num_vdev_mac_entries > MAX_VDEV_SUPPORTED) {
|
|
|
- wmi_err("Number of Vdev mac entries %d exceeded max vdev supported %d",
|
|
|
- fixed_param->num_vdev_mac_entries,
|
|
|
- MAX_VDEV_SUPPORTED);
|
|
|
- return;
|
|
|
- }
|
|
|
- hw_mode_trans_ind->old_hw_mode_index = fixed_param->old_hw_mode_index;
|
|
|
- hw_mode_trans_ind->new_hw_mode_index = fixed_param->new_hw_mode_index;
|
|
|
- hw_mode_trans_ind->num_vdev_mac_entries =
|
|
|
- fixed_param->num_vdev_mac_entries;
|
|
|
- wmi_debug("old_hw_mode_index:%d new_hw_mode_index:%d entries=%d",
|
|
|
- fixed_param->old_hw_mode_index,
|
|
|
- fixed_param->new_hw_mode_index,
|
|
|
- fixed_param->num_vdev_mac_entries);
|
|
|
-
|
|
|
- if (!vdev_mac_entry) {
|
|
|
- wmi_err("Invalid vdev_mac_entry");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- /* Store the vdev-mac map in WMA and send to policy manager */
|
|
|
- for (i = 0; i < fixed_param->num_vdev_mac_entries; i++) {
|
|
|
- uint32_t vdev_id, mac_id, pdev_id;
|
|
|
-
|
|
|
- vdev_id = vdev_mac_entry[i].vdev_id;
|
|
|
- pdev_id = vdev_mac_entry[i].pdev_id;
|
|
|
-
|
|
|
- if (pdev_id == OL_TXRX_PDEV_ID) {
|
|
|
- wmi_err("soc level id received for mac id");
|
|
|
- return;
|
|
|
- }
|
|
|
- if (vdev_id >= WLAN_MAX_VDEVS) {
|
|
|
- wmi_err("vdev_id: %d is invalid, max_bssid: %d",
|
|
|
- vdev_id, WLAN_MAX_VDEVS);
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- mac_id = WMI_PDEV_TO_MAC_MAP(vdev_mac_entry[i].pdev_id);
|
|
|
-
|
|
|
- hw_mode_trans_ind->vdev_mac_map[i].vdev_id = vdev_id;
|
|
|
- hw_mode_trans_ind->vdev_mac_map[i].mac_id = mac_id;
|
|
|
-
|
|
|
- wmi_debug("vdev_id:%d mac_id:%d", vdev_id, mac_id);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* wmi_fill_data_synch_frame_event() - Fill the the roam sync data buffer using
|
|
|
* synch frame event data
|
|
@@ -2508,197 +2702,6 @@ extract_roam_sync_frame_event_tlv(wmi_unified_t wmi_handle, void *event,
|
|
|
return QDF_STATUS_SUCCESS;
|
|
|
}
|
|
|
|
|
|
-static char *wmi_get_roam_event_reason_string(uint32_t reason)
|
|
|
-{
|
|
|
- switch (reason) {
|
|
|
- case WMI_ROAM_REASON_INVALID:
|
|
|
- return "Default";
|
|
|
- case WMI_ROAM_REASON_BETTER_AP:
|
|
|
- return "Better AP";
|
|
|
- case WMI_ROAM_REASON_BMISS:
|
|
|
- return "BMISS";
|
|
|
- case WMI_ROAM_REASON_LOW_RSSI:
|
|
|
- return "Low Rssi";
|
|
|
- case WMI_ROAM_REASON_SUITABLE_AP:
|
|
|
- return "Suitable AP";
|
|
|
- case WMI_ROAM_REASON_HO_FAILED:
|
|
|
- return "Hand-off Failed";
|
|
|
- case WMI_ROAM_REASON_INVOKE_ROAM_FAIL:
|
|
|
- return "Roam Invoke failed";
|
|
|
- case WMI_ROAM_REASON_RSO_STATUS:
|
|
|
- return "RSO status";
|
|
|
- case WMI_ROAM_REASON_BTM:
|
|
|
- return "BTM";
|
|
|
- case WMI_ROAM_REASON_DEAUTH:
|
|
|
- return "Deauth";
|
|
|
- default:
|
|
|
- return "Invalid";
|
|
|
- }
|
|
|
-
|
|
|
- return "Invalid";
|
|
|
-}
|
|
|
-
|
|
|
-static enum roam_reason
|
|
|
-wmi_convert_fw_reason_to_cm_reason(uint32_t reason)
|
|
|
-{
|
|
|
- switch (reason) {
|
|
|
- case WMI_ROAM_REASON_INVALID:
|
|
|
- return ROAM_REASON_INVALID;
|
|
|
- case WMI_ROAM_REASON_BETTER_AP:
|
|
|
- return ROAM_REASON_BETTER_AP;
|
|
|
- case WMI_ROAM_REASON_BMISS:
|
|
|
- return ROAM_REASON_BMISS;
|
|
|
- case WMI_ROAM_REASON_LOW_RSSI:
|
|
|
- return ROAM_REASON_LOW_RSSI;
|
|
|
- case WMI_ROAM_REASON_SUITABLE_AP:
|
|
|
- return ROAM_REASON_SUITABLE_AP;
|
|
|
- case WMI_ROAM_REASON_HO_FAILED:
|
|
|
- return ROAM_REASON_HO_FAILED;
|
|
|
- case WMI_ROAM_REASON_INVOKE_ROAM_FAIL:
|
|
|
- return ROAM_REASON_INVOKE_ROAM_FAIL;
|
|
|
- case WMI_ROAM_REASON_RSO_STATUS:
|
|
|
- return ROAM_REASON_RSO_STATUS;
|
|
|
- case WMI_ROAM_REASON_BTM:
|
|
|
- return ROAM_REASON_BTM;
|
|
|
- case WMI_ROAM_REASON_DEAUTH:
|
|
|
- return ROAM_REASON_DEAUTH;
|
|
|
- default:
|
|
|
- return ROAM_REASON_INVALID;
|
|
|
- }
|
|
|
-
|
|
|
- return ROAM_REASON_INVALID;
|
|
|
-}
|
|
|
-
|
|
|
-static enum cm_roam_notif
|
|
|
-wmi_convert_fw_notif_to_cm_notif(uint32_t fw_notif)
|
|
|
-{
|
|
|
- switch (fw_notif) {
|
|
|
- case WMI_ROAM_NOTIF_ROAM_START:
|
|
|
- return CM_ROAM_NOTIF_ROAM_START;
|
|
|
- case WMI_ROAM_NOTIF_ROAM_ABORT:
|
|
|
- return CM_ROAM_NOTIF_ROAM_ABORT;
|
|
|
- case WMI_ROAM_NOTIF_ROAM_REASSOC:
|
|
|
- return CM_ROAM_NOTIF_ROAM_REASSOC;
|
|
|
- case WMI_ROAM_NOTIF_SCAN_MODE_SUCCESS:
|
|
|
- return CM_ROAM_NOTIF_SCAN_MODE_SUCCESS;
|
|
|
- case WMI_ROAM_NOTIF_SCAN_MODE_FAIL:
|
|
|
- return CM_ROAM_NOTIF_SCAN_MODE_FAIL;
|
|
|
- case WMI_ROAM_NOTIF_DISCONNECT:
|
|
|
- return CM_ROAM_NOTIF_DISCONNECT;
|
|
|
- case WMI_ROAM_NOTIF_SUBNET_CHANGED:
|
|
|
- return CM_ROAM_NOTIF_SUBNET_CHANGED;
|
|
|
- case WMI_ROAM_NOTIF_SCAN_START:
|
|
|
- return CM_ROAM_NOTIF_SCAN_START;
|
|
|
- case WMI_ROAM_NOTIF_DEAUTH_RECV:
|
|
|
- return CM_ROAM_NOTIF_DEAUTH_RECV;
|
|
|
- case WMI_ROAM_NOTIF_DISASSOC_RECV:
|
|
|
- return CM_ROAM_NOTIF_DISASSOC_RECV;
|
|
|
- case WMI_ROAM_NOTIF_SCAN_MODE_SUCCESS_WITH_HO_FAIL:
|
|
|
- return CM_ROAM_NOTIF_HO_FAIL;
|
|
|
- case WMI_ROAM_NOTIF_SCAN_END:
|
|
|
- return CM_ROAM_NOTIF_SCAN_END;
|
|
|
- default:
|
|
|
- return CM_ROAM_NOTIF_INVALID;
|
|
|
- }
|
|
|
-
|
|
|
- return CM_ROAM_NOTIF_INVALID;
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * extract_roam_sync_event_tlv() - Extract the roam event
|
|
|
- * @wmi_handle: wmi handle
|
|
|
- * @evt_buf: Pointer to the event buffer
|
|
|
- * @len: Data length
|
|
|
- * @roam_event: Roam event data
|
|
|
- */
|
|
|
-static QDF_STATUS
|
|
|
-extract_roam_event_tlv(wmi_unified_t wmi_handle, void *evt_buf, uint32_t len,
|
|
|
- struct roam_offload_roam_event *roam_event)
|
|
|
-{
|
|
|
- QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
|
- wmi_roam_event_fixed_param *wmi_event = NULL;
|
|
|
- WMI_ROAM_EVENTID_param_tlvs *param_buf = NULL;
|
|
|
- struct cm_hw_mode_trans_ind *hw_mode_trans_ind;
|
|
|
- wmi_pdev_hw_mode_transition_event_fixed_param *hw_mode_trans_param;
|
|
|
-
|
|
|
- if (!evt_buf) {
|
|
|
- wmi_debug("Empty roam_sync_event param buf");
|
|
|
- status = QDF_STATUS_E_FAILURE;
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- param_buf = (WMI_ROAM_EVENTID_param_tlvs *)evt_buf;
|
|
|
- if (!param_buf) {
|
|
|
- wmi_debug("received null buf from target");
|
|
|
- status = QDF_STATUS_E_FAILURE;
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- wmi_event = param_buf->fixed_param;
|
|
|
- if (!wmi_event) {
|
|
|
- wmi_debug("received null event data from target");
|
|
|
- status = QDF_STATUS_E_FAILURE;
|
|
|
- goto end;
|
|
|
- }
|
|
|
- roam_event->vdev_id = wmi_event->vdev_id;
|
|
|
-
|
|
|
- if (roam_event->vdev_id >= WLAN_MAX_VDEVS) {
|
|
|
- wmi_err("Invalid vdev id from firmware: %u",
|
|
|
- roam_event->vdev_id);
|
|
|
- return -EINVAL;
|
|
|
- }
|
|
|
- hw_mode_trans_param = param_buf->hw_mode_transition_fixed_param;
|
|
|
- if (hw_mode_trans_param &&
|
|
|
- hw_mode_trans_param->num_vdev_mac_entries >
|
|
|
- param_buf->num_wmi_pdev_set_hw_mode_response_vdev_mac_mapping) {
|
|
|
- wmi_debug("invalid vdev mac entries %d %d",
|
|
|
- hw_mode_trans_param->num_vdev_mac_entries,
|
|
|
- param_buf->num_wmi_pdev_set_hw_mode_response_vdev_mac_mapping);
|
|
|
- return QDF_STATUS_E_FAILURE;
|
|
|
- }
|
|
|
-
|
|
|
- roam_event->reason =
|
|
|
- wmi_convert_fw_reason_to_cm_reason(wmi_event->reason);
|
|
|
- roam_event->rssi = wmi_event->rssi;
|
|
|
- roam_event->notif = wmi_convert_fw_notif_to_cm_notif(wmi_event->notif);
|
|
|
- roam_event->notif_params = wmi_event->notif_params;
|
|
|
- roam_event->notif_params1 = wmi_event->notif_params1;
|
|
|
-
|
|
|
- wlan_roam_debug_log(roam_event->vdev_id, DEBUG_ROAM_EVENT,
|
|
|
- DEBUG_INVALID_PEER_ID, NULL, NULL,
|
|
|
- roam_event->reason,
|
|
|
- (roam_event->reason == WMI_ROAM_REASON_INVALID) ?
|
|
|
- roam_event->notif : roam_event->rssi);
|
|
|
-
|
|
|
- DPTRACE(qdf_dp_trace_record_event(QDF_DP_TRACE_EVENT_RECORD,
|
|
|
- roam_event->vdev_id, QDF_TRACE_DEFAULT_PDEV_ID,
|
|
|
- QDF_PROTO_TYPE_EVENT, QDF_ROAM_EVENTID));
|
|
|
-
|
|
|
- wmi_debug("FW_ROAM_EVT: Reason:%s[%d], Notif %x for vdevid %x, rssi %d",
|
|
|
- wmi_get_roam_event_reason_string(roam_event->reason),
|
|
|
- roam_event->reason,
|
|
|
- roam_event->notif, roam_event->vdev_id, roam_event->rssi);
|
|
|
-
|
|
|
- if (param_buf->hw_mode_transition_fixed_param) {
|
|
|
- hw_mode_trans_ind = qdf_mem_malloc(sizeof(*hw_mode_trans_ind));
|
|
|
- if (!hw_mode_trans_ind) {
|
|
|
- status = QDF_STATUS_E_NOMEM;
|
|
|
- goto end;
|
|
|
- }
|
|
|
- wmi_extract_pdev_hw_mode_trans_ind(
|
|
|
- param_buf->hw_mode_transition_fixed_param,
|
|
|
- param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping,
|
|
|
- hw_mode_trans_ind);
|
|
|
- roam_event->hw_mode_trans_ind = hw_mode_trans_ind;
|
|
|
- }
|
|
|
-
|
|
|
- if (wmi_event->notif_params1)
|
|
|
- roam_event->deauth_disassoc_frame =
|
|
|
- param_buf->deauth_disassoc_frame;
|
|
|
-end:
|
|
|
- return status;
|
|
|
-}
|
|
|
-
|
|
|
static enum dlm_reject_ap_reason wmi_get_reject_reason(uint32_t reason)
|
|
|
{
|
|
|
switch (reason) {
|
|
@@ -5423,6 +5426,7 @@ void wmi_roam_attach_tlv(wmi_unified_t wmi_handle)
|
|
|
ops->send_idle_roam_params = send_idle_roam_params_tlv;
|
|
|
ops->send_disconnect_roam_params = send_disconnect_roam_params_tlv;
|
|
|
ops->send_roam_preauth_status = send_roam_preauth_status_tlv;
|
|
|
+ ops->extract_roam_event = extract_roam_event_tlv;
|
|
|
|
|
|
wmi_lfr_subnet_detection_attach_tlv(wmi_handle);
|
|
|
wmi_rssi_monitor_attach_tlv(wmi_handle);
|