summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/sme/inc/csr_neighbor_roam.h1
-rw-r--r--core/wma/src/wma_scan_roam.c32
2 files changed, 22 insertions, 11 deletions
diff --git a/core/sme/inc/csr_neighbor_roam.h b/core/sme/inc/csr_neighbor_roam.h
index 1c08e8bc6323..19ee3177eefc 100644
--- a/core/sme/inc/csr_neighbor_roam.h
+++ b/core/sme/inc/csr_neighbor_roam.h
@@ -323,6 +323,7 @@ void csr_roam_reset_roam_params(tpAniSirGlobal mac_ptr);
#define REASON_ROAM_SCAN_HI_RSSI_UB_CHANGED 33
#define REASON_CONNECT_IES_CHANGED 34
#define REASON_ROAM_SCAN_STA_ROAM_POLICY_CHANGED 35
+#define REASON_ROAM_SYNCH_FAILED 36
#if defined(WLAN_FEATURE_HOST_ROAM) || defined(WLAN_FEATURE_ROAM_OFFLOAD)
diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c
index 1c91c4eb79e9..41ca1ad4ba9b 100644
--- a/core/wma/src/wma_scan_roam.c
+++ b/core/wma/src/wma_scan_roam.c
@@ -2161,7 +2161,7 @@ void wma_process_roam_synch_fail(WMA_HANDLE handle,
*
* Return: Success or Failure
*/
-static QDF_STATUS wma_fill_roam_synch_buffer(tp_wma_handle wma,
+static int wma_fill_roam_synch_buffer(tp_wma_handle wma,
roam_offload_synch_ind *roam_synch_ind_ptr,
WMI_ROAM_SYNCH_EVENTID_param_tlvs *param_buf)
{
@@ -2171,7 +2171,6 @@ static QDF_STATUS wma_fill_roam_synch_buffer(tp_wma_handle wma,
uint8_t *reassoc_req_ptr;
wmi_channel *chan;
wmi_key_material *key;
- QDF_STATUS status = QDF_STATUS_SUCCESS;
synch_event = param_buf->fixed_param;
roam_synch_ind_ptr->roamedVdevId = synch_event->vdev_id;
@@ -2194,7 +2193,7 @@ static QDF_STATUS wma_fill_roam_synch_buffer(tp_wma_handle wma,
wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context,
roam_synch_ind_ptr, NULL, SIR_ROAMING_DEREGISTER_STA))) {
WMA_LOGE("LFR3: CSR Roam synch cb failed");
- return QDF_STATUS_E_FAILURE;
+ return -EINVAL;
}
/* Beacon/Probe Rsp data */
roam_synch_ind_ptr->beaconProbeRespOffset =
@@ -2255,7 +2254,7 @@ static QDF_STATUS wma_fill_roam_synch_buffer(tp_wma_handle wma,
else
WMA_LOGD(FL("hw_mode transition fixed param is NULL"));
- return status;
+ return 0;
}
/**
@@ -2377,28 +2376,29 @@ int wma_roam_synch_event_handler(void *handle, uint8_t *event,
WMI_ROAM_SYNCH_EVENTID_param_tlvs *param_buf = NULL;
wmi_roam_synch_event_fixed_param *synch_event = NULL;
tp_wma_handle wma = (tp_wma_handle) handle;
- roam_offload_synch_ind *roam_synch_ind_ptr;
+ roam_offload_synch_ind *roam_synch_ind_ptr = NULL;
tpSirBssDescription bss_desc_ptr = NULL;
uint16_t ie_len = 0;
int status = -EINVAL;
+ tSirRoamOffloadScanReq *roam_req;
qdf_time_t roam_synch_received = qdf_get_system_timestamp();
WMA_LOGD("LFR3:%s", __func__);
if (!event) {
WMA_LOGE("%s: event param null", __func__);
- return status;
+ goto cleanup_label;
}
param_buf = (WMI_ROAM_SYNCH_EVENTID_param_tlvs *) event;
if (!param_buf) {
WMA_LOGE("%s: received null buf from target", __func__);
- return status;
+ goto cleanup_label;
}
synch_event = param_buf->fixed_param;
if (!synch_event) {
WMA_LOGE("%s: received null event data from target", __func__);
- return status;
+ goto cleanup_label;
}
wma_peer_debug_log(synch_event->vdev_id, DEBUG_ROAM_SYNCH_IND,
@@ -2412,7 +2412,7 @@ int wma_roam_synch_event_handler(void *handle, uint8_t *event,
if (wma_is_roam_synch_in_progress(wma, synch_event->vdev_id)) {
WMA_LOGE("%s: Ignoring RSI since one is already in progress",
__func__);
- return status;
+ goto cleanup_label;
}
WMA_LOGE("LFR3: Received WMA_ROAM_OFFLOAD_SYNCH_IND");
@@ -2432,8 +2432,9 @@ int wma_roam_synch_event_handler(void *handle, uint8_t *event,
goto cleanup_label;
}
qdf_mem_zero(roam_synch_ind_ptr, len);
- status = wma_fill_roam_synch_buffer(wma, roam_synch_ind_ptr, param_buf);
- if (!QDF_IS_STATUS_SUCCESS(status))
+ status = wma_fill_roam_synch_buffer(wma,
+ roam_synch_ind_ptr, param_buf);
+ if (status != 0)
goto cleanup_label;
/* 24 byte MAC header and 12 byte to ssid IE */
if (roam_synch_ind_ptr->beaconProbeRespLength >
@@ -2483,6 +2484,15 @@ int wma_roam_synch_event_handler(void *handle, uint8_t *event,
status = 0;
cleanup_label:
+ if (status != 0) {
+ if (roam_synch_ind_ptr)
+ wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context,
+ roam_synch_ind_ptr, NULL, SIR_ROAMING_ABORT);
+ roam_req = qdf_mem_malloc(sizeof(tSirRoamOffloadScanReq));
+ roam_req->Command = ROAM_SCAN_OFFLOAD_STOP;
+ roam_req->reason = REASON_ROAM_SYNCH_FAILED;
+ wma_process_roaming_config(wma, roam_req);
+ }
if (roam_synch_ind_ptr && roam_synch_ind_ptr->join_rsp)
qdf_mem_free(roam_synch_ind_ptr->join_rsp);
if (roam_synch_ind_ptr)