diff options
| author | Varun Reddy Yeturu <varunreddy.yeturu@codeaurora.org> | 2017-03-15 16:14:03 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-03-17 12:09:42 -0700 |
| commit | e047a2df0cbc1e922189380d6bfdcfbd4688808d (patch) | |
| tree | 4e2f57d03d47e2d1632883ce3161763f974b0a4f | |
| parent | 5e94ca97033d96e96da25cd60d1d8df8d532aa7c (diff) | |
qcacld-3.0: Handle roam synch propagation failure
Handle Roam synch propagation failure properly.
Disable the roaming in progress flags in HDD.
Send a ROAM STOP command to firmware immediately.
Change-Id: I5f014ab79db553a1df758bf639362f26272a6a23
CRs-Fixed: 2020168
| -rw-r--r-- | core/sme/inc/csr_neighbor_roam.h | 1 | ||||
| -rw-r--r-- | core/wma/src/wma_scan_roam.c | 32 |
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) |
