|
@@ -1851,6 +1851,35 @@ QDF_STATUS wma_roam_scan_offload_command(tp_wma_handle wma_handle,
|
|
command, vdev_id);
|
|
command, vdev_id);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * wma_roam_scan_btm_offload() - Send BTM offload config
|
|
|
|
+ * @wma_handle: wma handle
|
|
|
|
+ * @roam_req: roam request parameters
|
|
|
|
+ *
|
|
|
|
+ * This function is used to send BTM offload config to fw
|
|
|
|
+ *
|
|
|
|
+ * Return: QDF status
|
|
|
|
+ */
|
|
|
|
+static QDF_STATUS wma_roam_scan_btm_offload(tp_wma_handle wma_handle,
|
|
|
|
+ tSirRoamOffloadScanReq *roam_req)
|
|
|
|
+{
|
|
|
|
+ struct wmi_btm_config *params;
|
|
|
|
+ QDF_STATUS status;
|
|
|
|
+
|
|
|
|
+ params = qdf_mem_malloc(sizeof(struct wmi_btm_config));
|
|
|
|
+ if (!params) {
|
|
|
|
+ WMA_LOGE("Memory alloc failed for btm params");
|
|
|
|
+ return QDF_STATUS_E_FAILURE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ params->vdev_id = roam_req->sessionId;
|
|
|
|
+ params->btm_offload_config = roam_req->btm_offload_config;
|
|
|
|
+ status = wmi_unified_send_btm_config(wma_handle->wmi_handle, params);
|
|
|
|
+ qdf_mem_free(params);
|
|
|
|
+
|
|
|
|
+ return status;
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* wma_process_roaming_config() - process roam request
|
|
* wma_process_roaming_config() - process roam request
|
|
* @wma_handle: wma handle
|
|
* @wma_handle: wma handle
|
|
@@ -1989,6 +2018,11 @@ QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle,
|
|
WMA_LOGE("Sending start for roam scan filter failed");
|
|
WMA_LOGE("Sending start for roam scan filter failed");
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
+ qdf_status = wma_roam_scan_btm_offload(wma_handle, roam_req);
|
|
|
|
+ if (qdf_status != QDF_STATUS_SUCCESS) {
|
|
|
|
+ WMA_LOGE("Sending BTM config to fw failed");
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
break;
|
|
break;
|
|
|
|
|
|
case ROAM_SCAN_OFFLOAD_STOP:
|
|
case ROAM_SCAN_OFFLOAD_STOP:
|
|
@@ -5982,6 +6016,31 @@ void wma_roam_better_ap_handler(tp_wma_handle wma, uint32_t vdev_id)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * wma_handle_btm_disassoc_imminent_msg() - Send del sta msg to lim on receiving
|
|
|
|
+ * BTM request from AP with disassoc imminent reason
|
|
|
|
+ * @wma_handle: wma handle
|
|
|
|
+ * @vdev_id: vdev id
|
|
|
|
+ *
|
|
|
|
+ * Return: None
|
|
|
|
+ */
|
|
|
|
+static void wma_handle_btm_disassoc_imminent_msg(tp_wma_handle wma_handle,
|
|
|
|
+ uint32_t vdev_id)
|
|
|
|
+{
|
|
|
|
+ tpDeleteStaContext del_sta_ctx;
|
|
|
|
+
|
|
|
|
+ del_sta_ctx =
|
|
|
|
+ (tDeleteStaContext *)qdf_mem_malloc(sizeof(tDeleteStaContext));
|
|
|
|
+ if (!del_sta_ctx) {
|
|
|
|
+ WMA_LOGE("Memory alloc failed for del sta context");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ del_sta_ctx->vdev_id = vdev_id;
|
|
|
|
+ del_sta_ctx->reasonCode = HAL_DEL_STA_REASON_CODE_BTM_DISASSOC_IMMINENT;
|
|
|
|
+ wma_send_msg(wma_handle, SIR_LIM_DELETE_STA_CONTEXT_IND,
|
|
|
|
+ (void *)del_sta_ctx, 0);
|
|
|
|
+}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* wma_roam_event_callback() - roam event callback
|
|
* wma_roam_event_callback() - roam event callback
|
|
* @handle: wma handle
|
|
* @handle: wma handle
|
|
@@ -6027,6 +6086,18 @@ int wma_roam_event_callback(WMA_HANDLE handle, uint8_t *event_buf,
|
|
QDF_PROTO_TYPE_EVENT, QDF_ROAM_EVENTID));
|
|
QDF_PROTO_TYPE_EVENT, QDF_ROAM_EVENTID));
|
|
|
|
|
|
switch (wmi_event->reason) {
|
|
switch (wmi_event->reason) {
|
|
|
|
+ case WMI_ROAM_REASON_BTM:
|
|
|
|
+ /*
|
|
|
|
+ * This event is received from firmware if firmware is unable to
|
|
|
|
+ * find candidate AP after roam scan and BTM request from AP
|
|
|
|
+ * has disassoc imminent bit set.
|
|
|
|
+ */
|
|
|
|
+ WMA_LOGD("Kickout due to btm request");
|
|
|
|
+ wma_sta_kickout_event(HOST_STA_KICKOUT_REASON_BTM,
|
|
|
|
+ wmi_event->vdev_id, NULL);
|
|
|
|
+ wma_handle_btm_disassoc_imminent_msg(wma_handle,
|
|
|
|
+ wmi_event->vdev_id);
|
|
|
|
+ break;
|
|
case WMI_ROAM_REASON_BMISS:
|
|
case WMI_ROAM_REASON_BMISS:
|
|
WMA_LOGD("Beacon Miss for vdevid %x", wmi_event->vdev_id);
|
|
WMA_LOGD("Beacon Miss for vdevid %x", wmi_event->vdev_id);
|
|
wma_beacon_miss_handler(wma_handle, wmi_event->vdev_id,
|
|
wma_beacon_miss_handler(wma_handle, wmi_event->vdev_id,
|