From 18285936bc00c855e98593255b7a64d6287e002c Mon Sep 17 00:00:00 2001 From: Abhinav Kumar Date: Thu, 8 Aug 2019 16:50:06 +0530 Subject: [PATCH] qcacld-3.0: Don't Issue disconnect on roaming timer expiry Currently Host issue a disconnect and cleanup for current AP, even if the offloaded roaming feature has started, but has not completed for some reason. This results in connection loss with the current AP. Fix is to call abort event SIR_ROAMING_ABORT in case of roaming offload timeout in order to maintain the connection with the current AP. Change-Id: I4168f8aeb7a759896a5d93e1918ce6542e61b37e CRs-Fixed: 2508449 --- core/mac/inc/sir_api.h | 8 + core/mac/src/include/sir_params.h | 2 +- .../src/sys/legacy/src/utils/src/mac_trace.c | 2 +- core/sme/inc/csr_support.h | 4 +- core/sme/src/csr/csr_api_roam.c | 142 ++++++++++++------ core/wma/inc/wma.h | 14 +- core/wma/inc/wma_types.h | 2 +- core/wma/src/wma_data.c | 13 +- core/wma/src/wma_dev_if.c | 2 +- core/wma/src/wma_main.c | 4 + core/wma/src/wma_mgmt.c | 4 +- core/wma/src/wma_scan_roam.c | 103 ++++++++----- 12 files changed, 200 insertions(+), 100 deletions(-) diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index 7ac7a084e0f7..799db7d8a2b7 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -2151,6 +2151,14 @@ struct mawc_params { uint8_t mawc_roam_rssi_low_adjust; }; +/** + * struct roam_sync_timeout_timer_info - Info related to roam sync timer + * @vdev_id: Vdev id for which host waiting roam sync ind from fw + */ +struct roam_sync_timeout_timer_info { + uint8_t vdev_id; +}; + struct roam_offload_scan_req { uint16_t message_type; uint16_t length; diff --git a/core/mac/src/include/sir_params.h b/core/mac/src/include/sir_params.h index 74722efc700e..fcbcdd91afcd 100644 --- a/core/mac/src/include/sir_params.h +++ b/core/mac/src/include/sir_params.h @@ -580,7 +580,7 @@ struct sir_cfg_action_frm_tb_ppdu { #define SIR_HAL_APF_GET_CAPABILITIES_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 341) -#define SIR_HAL_APF_SET_INSTRUCTIONS_REQ (SIR_HAL_ITC_MSG_TYPES_BEGIN + 342) +#define SIR_HAL_WMA_ROAM_SYNC_TIMEOUT (SIR_HAL_ITC_MSG_TYPES_BEGIN + 342) #define SIR_HAL_SET_WISA_PARAMS (SIR_HAL_ITC_MSG_TYPES_BEGIN + 343) #define SIR_HAL_SET_ADAPT_DWELLTIME_PARAMS (SIR_HAL_ITC_MSG_TYPES_BEGIN + 344) diff --git a/core/mac/src/sys/legacy/src/utils/src/mac_trace.c b/core/mac/src/sys/legacy/src/utils/src/mac_trace.c index 9da76df2be4c..93175cf36c06 100644 --- a/core/mac/src/sys/legacy/src/utils/src/mac_trace.c +++ b/core/mac/src/sys/legacy/src/utils/src/mac_trace.c @@ -537,7 +537,7 @@ uint8_t *mac_trace_get_wma_msg_string(uint16_t wma_msg) CASE_RETURN_STRING(WMA_REMOVE_BCN_FILTER_CMDID); CASE_RETURN_STRING(WMA_SET_ADAPT_DWELLTIME_CONF_PARAMS); CASE_RETURN_STRING(WDA_APF_GET_CAPABILITIES_REQ); - CASE_RETURN_STRING(WDA_APF_SET_INSTRUCTIONS_REQ); + CASE_RETURN_STRING(WMA_ROAM_SYNC_TIMEOUT); CASE_RETURN_STRING(WMA_SET_PDEV_IE_REQ); CASE_RETURN_STRING(WMA_UPDATE_WEP_DEFAULT_KEY); CASE_RETURN_STRING(WMA_SEND_FREQ_RANGE_CONTROL_IND); diff --git a/core/sme/inc/csr_support.h b/core/sme/inc/csr_support.h index d4f91c339fdb..34559cb9e1b9 100644 --- a/core/sme/inc/csr_support.h +++ b/core/sme/inc/csr_support.h @@ -201,11 +201,11 @@ typedef struct tagCsrWapiIe { /** * struct csr_timer_info - CSR-specific timer context * @mac: Global MAC context associated with the timer - * @session_id: Session associated with the timer + * @vdev_id: Session associated with the timer */ struct csr_timer_info { struct mac_context *mac; - uint8_t session_id; + uint8_t vdev_id; }; #define CSR_IS_11A_BSS(bss_desc) (eSIR_11A_NW_TYPE == (bss_desc)->nwType) diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 727a52e7413f..9b690c55101c 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -406,7 +406,7 @@ static bool csr_roam_is_same_profile_keys(struct mac_context *mac, struct csr_roam_profile *pProfile2); static QDF_STATUS csr_roam_start_roaming_timer(struct mac_context *mac, - uint32_t sessionId, + uint32_t vdev_id, uint32_t interval); static QDF_STATUS csr_roam_stop_roaming_timer(struct mac_context *mac, uint32_t sessionId); @@ -1291,12 +1291,12 @@ static QDF_STATUS csr_roam_open(struct mac_context *mac) for (i = 0; i < WLAN_MAX_VDEVS; i++) { pSession = CSR_GET_SESSION(mac, i); pSession->roamingTimerInfo.mac = mac; - pSession->roamingTimerInfo.session_id = - WLAN_UMAC_VDEV_ID_MAX; + pSession->roamingTimerInfo.vdev_id = + WLAN_UMAC_VDEV_ID_MAX; } mac->roam.WaitForKeyTimerInfo.mac = mac; - mac->roam.WaitForKeyTimerInfo.session_id = - WLAN_UMAC_VDEV_ID_MAX; + mac->roam.WaitForKeyTimerInfo.vdev_id = + WLAN_UMAC_VDEV_ID_MAX; status = qdf_mc_timer_init(&mac->roam.hTimerWaitForKey, QDF_TIMER_TYPE_SW, csr_roam_wait_for_key_time_out_handler, @@ -7065,7 +7065,7 @@ static void csr_roam_process_join_res(struct mac_context *mac_ctx, CSR_WAIT_FOR_KEY_TIMEOUT_PERIOD; /* Save session_id in case of timeout */ - mac_ctx->roam.WaitForKeyTimerInfo.session_id = + mac_ctx->roam.WaitForKeyTimerInfo.vdev_id = (uint8_t) session_id; /* * This time should be long enough for the rest @@ -12536,11 +12536,11 @@ void csr_roam_roaming_timer_handler(void *pv) { struct csr_timer_info *info = pv; struct mac_context *mac = info->mac; - uint32_t sessionId = info->session_id; - struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId); + uint32_t vdev_id = info->vdev_id; + struct csr_roam_session *pSession = CSR_GET_SESSION(mac, vdev_id); if (!pSession) { - sme_err(" session %d not found ", sessionId); + sme_err(" session %d not found ", vdev_id); return; } @@ -12565,33 +12565,72 @@ void csr_roam_roaming_timer_handler(void *pv) void csr_roam_roaming_offload_timeout_handler(void *timer_data) { struct csr_timer_info *timer_info = timer_data; + struct wlan_objmgr_vdev *vdev; + struct mlme_roam_after_data_stall *vdev_roam_params; + struct scheduler_msg wma_msg = {0}; + struct roam_sync_timeout_timer_info *req; + QDF_STATUS status; if (timer_info) { - QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG, - "LFR3:roaming offload timer expired, session: %d", - timer_info->session_id); + sme_debug("LFR3:roaming offload timer expired, session: %d", + timer_info->vdev_id); } else { - QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, - "Invalid Session"); + sme_err("Invalid Session"); return; } - csr_roam_disconnect(timer_info->mac, timer_info->session_id, - eCSR_DISCONNECT_REASON_UNSPECIFIED); + + vdev = wlan_objmgr_get_vdev_by_id_from_psoc(timer_info->mac->psoc, + timer_info->vdev_id, + WLAN_LEGACY_SME_ID); + if (!vdev) { + sme_err("vdev is NULL, aborting roam start"); + return; + } + + vdev_roam_params = mlme_get_roam_invoke_params(vdev); + if (!vdev_roam_params) { + sme_err("Invalid vdev roam params, aborting timeout handler"); + status = QDF_STATUS_E_NULL_VALUE; + goto rel; + } + + req = qdf_mem_malloc(sizeof(*req)); + if (!req) + goto rel; + + req->vdev_id = timer_info->vdev_id; + wma_msg.type = WMA_ROAM_SYNC_TIMEOUT; + wma_msg.bodyptr = req; + + status = scheduler_post_message(QDF_MODULE_ID_SME, QDF_MODULE_ID_WMA, + QDF_MODULE_ID_WMA, &wma_msg); + if (!QDF_IS_STATUS_SUCCESS(status)) { + sme_err("Post roam offload timer fails, session id: %d", + timer_info->vdev_id); + qdf_mem_free(req); + goto rel; + } + + vdev_roam_params->roam_invoke_in_progress = false; + +rel: + wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_SME_ID); } -QDF_STATUS csr_roam_start_roaming_timer(struct mac_context *mac, uint32_t sessionId, +QDF_STATUS csr_roam_start_roaming_timer(struct mac_context *mac, + uint32_t vdev_id, uint32_t interval) { QDF_STATUS status; - struct csr_roam_session *pSession = CSR_GET_SESSION(mac, sessionId); + struct csr_roam_session *pSession = CSR_GET_SESSION(mac, vdev_id); if (!pSession) { - sme_err("session %d not found", sessionId); + sme_err("session %d not found", vdev_id); return QDF_STATUS_E_FAILURE; } sme_debug("csrScanStartRoamingTimer"); - pSession->roamingTimerInfo.session_id = (uint8_t) sessionId; + pSession->roamingTimerInfo.vdev_id = (uint8_t) vdev_id; status = qdf_mc_timer_start(&pSession->hTimerRoaming, interval / QDF_MC_TIMER_TO_MS_UNIT); @@ -12609,8 +12648,8 @@ void csr_roam_wait_for_key_time_out_handler(void *pv) { struct csr_timer_info *info = pv; struct mac_context *mac = info->mac; - uint8_t session_id = info->session_id; - struct csr_roam_session *pSession = CSR_GET_SESSION(mac, session_id); + uint8_t vdev_id = info->vdev_id; + struct csr_roam_session *pSession = CSR_GET_SESSION(mac, vdev_id); QDF_STATUS status = QDF_STATUS_E_FAILURE; if (!pSession) { @@ -12620,20 +12659,19 @@ void csr_roam_wait_for_key_time_out_handler(void *pv) sme_debug("WaitForKey timer expired in state: %s sub-state: %s", mac_trace_get_neighbour_roam_state(mac->roam. - neighborRoamInfo[session_id]. + neighborRoamInfo[vdev_id]. neighborRoamState), mac_trace_getcsr_roam_sub_state(mac->roam. - curSubState[session_id])); + curSubState[vdev_id])); spin_lock(&mac->roam.roam_state_lock); - if (CSR_IS_WAIT_FOR_KEY(mac, session_id)) { + if (CSR_IS_WAIT_FOR_KEY(mac, vdev_id)) { /* Change the substate so command queue is unblocked. */ - if (session_id < WLAN_MAX_VDEVS) - mac->roam.curSubState[session_id] = + if (vdev_id < WLAN_MAX_VDEVS) + mac->roam.curSubState[vdev_id] = eCSR_ROAM_SUBSTATE_NONE; spin_unlock(&mac->roam.roam_state_lock); - if (csr_neighbor_roam_is_handoff_in_progress(mac, - session_id)) { + if (csr_neighbor_roam_is_handoff_in_progress(mac, vdev_id)) { /* * Enable heartbeat timer when hand-off is in progress * and Key Wait timer expired. @@ -12652,11 +12690,11 @@ void csr_roam_wait_for_key_time_out_handler(void *pv) sme_debug("SME pre-auth state timeout"); status = sme_acquire_global_lock(&mac->sme); - if (csr_is_conn_state_connected_infra(mac, session_id)) { + if (csr_is_conn_state_connected_infra(mac, vdev_id)) { csr_roam_link_up(mac, pSession->connectedProfile.bssid); if (QDF_IS_STATUS_SUCCESS(status)) { - csr_roam_disconnect(mac, session_id, + csr_roam_disconnect(mac, vdev_id, eCSR_DISCONNECT_REASON_UNSPECIFIED); } } else { @@ -12674,7 +12712,7 @@ void csr_roam_wait_for_key_time_out_handler(void *pv) * csr_roam_roaming_offload_timer_action() - API to start/stop the timer * @mac_ctx: MAC Context * @interval: Value to be set for the timer - * @session_id: Session on which the timer should be operated + * @vdev_id: Session on which the timer should be operated * @action: Start/Stop action for the timer * * API to start/stop the roaming offload timer @@ -12682,17 +12720,18 @@ void csr_roam_wait_for_key_time_out_handler(void *pv) * Return: None */ void csr_roam_roaming_offload_timer_action( - struct mac_context *mac_ctx, uint32_t interval, uint8_t session_id, + struct mac_context *mac_ctx, uint32_t interval, uint8_t vdev_id, uint8_t action) { struct csr_roam_session *csr_session = CSR_GET_SESSION(mac_ctx, - session_id); + vdev_id); + QDF_TIMER_STATE tstate; QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_DEBUG, ("LFR3: timer action %d, session %d, intvl %d"), - action, session_id, interval); + action, vdev_id, interval); if (mac_ctx) { - csr_session = CSR_GET_SESSION(mac_ctx, session_id); + csr_session = CSR_GET_SESSION(mac_ctx, vdev_id); } else { QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, ("LFR3: Invalid MAC Context")); @@ -12700,13 +12739,24 @@ void csr_roam_roaming_offload_timer_action( } if (!csr_session) { QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_ERROR, - ("LFR3: session %d not found"), session_id); + ("LFR3: session %d not found"), vdev_id); return; } - csr_session->roamingTimerInfo.session_id = (uint8_t) session_id; - if (action == ROAMING_OFFLOAD_TIMER_START) + csr_session->roamingTimerInfo.vdev_id = (uint8_t) vdev_id; + + tstate = + qdf_mc_timer_get_current_state(&csr_session->roaming_offload_timer); + + if (action == ROAMING_OFFLOAD_TIMER_START) { + /* + * If timer is already running then re-start timer in order to + * process new ROAM_START with fresh timer. + */ + if (tstate == QDF_TIMER_STATE_RUNNING) + qdf_mc_timer_stop(&csr_session->roaming_offload_timer); qdf_mc_timer_start(&csr_session->roaming_offload_timer, - interval / QDF_MC_TIMER_TO_MS_UNIT); + interval / QDF_MC_TIMER_TO_MS_UNIT); + } if (action == ROAMING_OFFLOAD_TIMER_STOP) qdf_mc_timer_stop(&csr_session->roaming_offload_timer); @@ -12717,7 +12767,7 @@ static QDF_STATUS csr_roam_start_wait_for_key_timer( struct mac_context *mac, uint32_t interval) { QDF_STATUS status; - uint8_t session_id = mac->roam.WaitForKeyTimerInfo.session_id; + uint8_t session_id = mac->roam.WaitForKeyTimerInfo.vdev_id; tpCsrNeighborRoamControlInfo pNeighborRoamInfo = &mac->roam.neighborRoamInfo[session_id]; @@ -12739,16 +12789,16 @@ static QDF_STATUS csr_roam_start_wait_for_key_timer( QDF_STATUS csr_roam_stop_wait_for_key_timer(struct mac_context *mac) { - uint8_t session_id = mac->roam.WaitForKeyTimerInfo.session_id; + uint8_t vdev_id = mac->roam.WaitForKeyTimerInfo.vdev_id; tpCsrNeighborRoamControlInfo pNeighborRoamInfo = - &mac->roam.neighborRoamInfo[session_id]; + &mac->roam.neighborRoamInfo[vdev_id]; sme_debug("WaitForKey timer stopped in state: %s sub-state: %s", mac_trace_get_neighbour_roam_state(pNeighborRoamInfo-> neighborRoamState), mac_trace_getcsr_roam_sub_state(mac->roam. - curSubState[session_id])); - if (csr_neighbor_roam_is_handoff_in_progress(mac, session_id)) { + curSubState[vdev_id])); + if (csr_neighbor_roam_is_handoff_in_progress(mac, vdev_id)) { /* * Enable heartbeat timer when hand-off is in progress * and Key Wait timer got stopped for some reason @@ -21341,7 +21391,7 @@ static QDF_STATUS csr_process_roam_sync_callback(struct mac_context *mac_ctx, session_id); ps_global_info->remain_in_power_active_till_dhcp = true; - mac_ctx->roam.WaitForKeyTimerInfo.session_id = session_id; + mac_ctx->roam.WaitForKeyTimerInfo.vdev_id = session_id; if (!QDF_IS_STATUS_SUCCESS(csr_roam_start_wait_for_key_timer( mac_ctx, CSR_WAIT_FOR_KEY_TIMEOUT_PERIOD)) ) { diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h index 55f0c9a609c8..a940368ec2cc 100644 --- a/core/wma/inc/wma.h +++ b/core/wma/inc/wma.h @@ -1040,7 +1040,7 @@ struct wma_wlm_stats_data { typedef struct { void *wmi_handle; void *cds_context; - void *mac_context; + struct mac_context *mac_context; struct wlan_objmgr_psoc *psoc; struct wlan_objmgr_pdev *pdev; qdf_event_t target_suspend; @@ -2263,6 +2263,18 @@ wma_send_roam_preauth_status(tp_wma_handle wma_handle, {} #endif +/** + * wma_handle_roam_sync_timeout() - Update roaming status at wma layer + * @wma_handle: wma handle + * @info: Info for roaming start timer + * + * This function gets called in case of roaming offload timer get expired + * + * Return: None + */ +void wma_handle_roam_sync_timeout(tp_wma_handle wma_handle, + struct roam_sync_timeout_timer_info *info); + #ifdef WMI_INTERFACE_EVENT_LOGGING static inline void wma_print_wmi_cmd_log(uint32_t count, qdf_abstract_print *print, diff --git a/core/wma/inc/wma_types.h b/core/wma/inc/wma_types.h index e5bd79073f41..b02939d6284e 100644 --- a/core/wma/inc/wma_types.h +++ b/core/wma/inc/wma_types.h @@ -408,7 +408,7 @@ #define WMA_SET_ADAPT_DWELLTIME_CONF_PARAMS SIR_HAL_SET_ADAPT_DWELLTIME_PARAMS #define WDA_APF_GET_CAPABILITIES_REQ SIR_HAL_APF_GET_CAPABILITIES_REQ -#define WDA_APF_SET_INSTRUCTIONS_REQ SIR_HAL_APF_SET_INSTRUCTIONS_REQ +#define WMA_ROAM_SYNC_TIMEOUT SIR_HAL_WMA_ROAM_SYNC_TIMEOUT #define WMA_SET_PDEV_IE_REQ SIR_HAL_SET_PDEV_IE_REQ #define WMA_UPDATE_WEP_DEFAULT_KEY SIR_HAL_UPDATE_WEP_DEFAULT_KEY diff --git a/core/wma/src/wma_data.c b/core/wma/src/wma_data.c index 937c88ba0313..129ac360924e 100644 --- a/core/wma/src/wma_data.c +++ b/core/wma/src/wma_data.c @@ -859,8 +859,7 @@ static void wma_data_tx_ack_work_handler(void *ack_work) /* Call the Ack Cb registered by UMAC */ if (ack_cb) - ack_cb((struct mac_context *) (wma_handle->mac_context), NULL, - work->status, NULL); + ack_cb(wma_handle->mac_context, NULL, work->status, NULL); else WMA_LOGE("Data Tx Ack Cb is NULL"); @@ -2856,11 +2855,11 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen, WLAN_MGMT_NB_ID); } - status = wlan_mgmt_txrx_mgmt_frame_tx(peer, - (struct mac_context *)wma_handle->mac_context, - (qdf_nbuf_t)tx_frame, - NULL, tx_frm_ota_comp_cb, - WLAN_UMAC_COMP_MLME, &mgmt_param); + status = wlan_mgmt_txrx_mgmt_frame_tx(peer, wma_handle->mac_context, + (qdf_nbuf_t)tx_frame, NULL, + tx_frm_ota_comp_cb, + WLAN_UMAC_COMP_MLME, + &mgmt_param); wlan_objmgr_peer_release_ref(peer, WLAN_MGMT_NB_ID); if (status != QDF_STATUS_SUCCESS) { diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index e9befd4d70ce..7c348e208a5b 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -4561,7 +4561,7 @@ static void wma_add_sta_req_ap_mode(tp_wma_handle wma, tpAddStaParams add_sta) uint32_t i, j; uint16_t mcs_limit; uint8_t *rate_pos; - struct mac_context *mac = (struct mac_context *)wma->mac_context; + struct mac_context *mac = wma->mac_context; pdev = cds_get_context(QDF_MODULE_ID_TXRX); diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index 9edf38a4655c..4ec67ed92c9a 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -8645,6 +8645,10 @@ static QDF_STATUS wma_mc_process_msg(struct scheduler_msg *msg) qdf_mem_free(msg->bodyptr); break; + case WMA_ROAM_SYNC_TIMEOUT: + wma_handle_roam_sync_timeout(wma_handle, msg->bodyptr); + qdf_mem_free(msg->bodyptr); + break; case WMA_RATE_UPDATE_IND: wma_process_rate_update_indicate(wma_handle, (tSirRateUpdateInd *) msg->bodyptr); diff --git a/core/wma/src/wma_mgmt.c b/core/wma/src/wma_mgmt.c index 17770ed7c1c4..77c5ba891b2e 100644 --- a/core/wma/src/wma_mgmt.c +++ b/core/wma/src/wma_mgmt.c @@ -1022,7 +1022,7 @@ static void wma_mask_tx_ht_rate(tp_wma_handle wma, uint8_t *mcs_set) uint32_t i, j; uint16_t mcs_limit; uint8_t *rate_pos = mcs_set; - struct mac_context *mac = (struct mac_context *)wma->mac_context; + struct mac_context *mac = wma->mac_context; /* * Get MCS limit from ini configure, and map it to rate parameters @@ -1255,7 +1255,7 @@ QDF_STATUS wma_send_peer_assoc(tp_wma_handle wma, struct wma_txrx_node *intr = NULL; bool is_he; QDF_STATUS status; - struct mac_context *mac = (struct mac_context *)wma->mac_context; + struct mac_context *mac = wma->mac_context; cmd = qdf_mem_malloc(sizeof(struct peer_assoc_params)); if (!cmd) { diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 0f09e89ae3f0..88bf69086a63 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -2367,8 +2367,8 @@ static int wma_fill_roam_synch_buffer(tp_wma_handle wma, roam_synch_ind_ptr->rssi, roam_synch_ind_ptr->isBeacon); if (!QDF_IS_STATUS_SUCCESS( - wma->csr_roam_synch_cb((struct mac_context *)wma->mac_context, - roam_synch_ind_ptr, NULL, SIR_ROAMING_DEREGISTER_STA))) { + wma->csr_roam_synch_cb(wma->mac_context, roam_synch_ind_ptr, + NULL, SIR_ROAMING_DEREGISTER_STA))) { WMA_LOGE("LFR3: CSR Roam synch cb failed"); wma_free_roam_synch_frame_ind(iface); return status; @@ -2865,8 +2865,7 @@ int wma_mlme_roam_synch_event_handler_cb(void *handle, uint8_t *event, goto cleanup_label; } qdf_mem_zero(bss_desc_ptr, sizeof(struct bss_description) + ie_len); - if (QDF_IS_STATUS_ERROR(wma->pe_roam_synch_cb( - (struct mac_context *)wma->mac_context, + if (QDF_IS_STATUS_ERROR(wma->pe_roam_synch_cb(wma->mac_context, roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_PROPAGATION))) { WMA_LOGE("LFR3: PE roam synch cb failed"); @@ -2875,8 +2874,8 @@ int wma_mlme_roam_synch_event_handler_cb(void *handle, uint8_t *event, } wma_roam_update_vdev(wma, roam_synch_ind_ptr); - wma->csr_roam_synch_cb((struct mac_context *)wma->mac_context, - roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_PROPAGATION); + wma->csr_roam_synch_cb(wma->mac_context, roam_synch_ind_ptr, + bss_desc_ptr, SIR_ROAM_SYNCH_PROPAGATION); wma_process_roam_synch_complete(wma, synch_event->vdev_id); /* update freq and channel width */ @@ -2905,22 +2904,23 @@ int wma_mlme_roam_synch_event_handler_cb(void *handle, uint8_t *event, chanmode); } - wma->csr_roam_synch_cb((struct mac_context *)wma->mac_context, - roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_COMPLETE); + wma->csr_roam_synch_cb(wma->mac_context, roam_synch_ind_ptr, + bss_desc_ptr, SIR_ROAM_SYNCH_COMPLETE); wma->interfaces[synch_event->vdev_id].roam_synch_delay = qdf_get_system_timestamp() - roam_synch_received; WMA_LOGD("LFR3: roam_synch_delay:%d", wma->interfaces[synch_event->vdev_id].roam_synch_delay); - wma->csr_roam_synch_cb((struct mac_context *)wma->mac_context, - roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_NAPI_OFF); + wma->csr_roam_synch_cb(wma->mac_context, roam_synch_ind_ptr, + bss_desc_ptr, SIR_ROAM_SYNCH_NAPI_OFF); status = 0; cleanup_label: if (status != 0) { if (roam_synch_ind_ptr) - wma->csr_roam_synch_cb((struct mac_context *)wma->mac_context, - roam_synch_ind_ptr, NULL, SIR_ROAMING_ABORT); + wma->csr_roam_synch_cb(wma->mac_context, + roam_synch_ind_ptr, NULL, + SIR_ROAMING_ABORT); roam_req = qdf_mem_malloc(sizeof(struct roam_offload_scan_req)); if (roam_req && synch_event) { roam_req->Command = ROAM_SCAN_OFFLOAD_STOP; @@ -5297,6 +5297,54 @@ static int wma_handle_hw_mode_transition(tp_wma_handle wma, return 0; } +/** + * wma_invalid_roam_reason_handler() - Handle Invalid roam notification + * @wma: wma handle + * @vdev_id: vdev id + * @op_code: Operation to be done by the callback + * + * This function calls pe and csr callbacks with proper op_code + * + * Return: None + */ +static void wma_invalid_roam_reason_handler(tp_wma_handle wma_handle, + uint32_t vdev_id, + uint32_t notif) +{ + struct roam_offload_synch_ind *roam_synch_data; + enum sir_roam_op_code op_code; + + if (notif == WMI_ROAM_NOTIF_ROAM_START) { + wma_handle->interfaces[vdev_id].roaming_in_progress = true; + op_code = SIR_ROAMING_START; + } else if (notif == WMI_ROAM_NOTIF_ROAM_ABORT) { + wma_handle->interfaces[vdev_id].roaming_in_progress = false; + op_code = SIR_ROAMING_ABORT; + } else { + WMA_LOGE(FL("Invalid notif %d"), notif); + return; + } + + roam_synch_data = qdf_mem_malloc(sizeof(*roam_synch_data)); + if (!roam_synch_data) + return; + + roam_synch_data->roamed_vdev_id = vdev_id; + wma_handle->pe_roam_synch_cb(wma_handle->mac_context, roam_synch_data, + NULL, op_code); + wma_handle->csr_roam_synch_cb(wma_handle->mac_context, roam_synch_data, + NULL, op_code); + + qdf_mem_free(roam_synch_data); +} + +void wma_handle_roam_sync_timeout(tp_wma_handle wma_handle, + struct roam_sync_timeout_timer_info *info) +{ + wma_invalid_roam_reason_handler(wma_handle, info->vdev_id, + WMI_ROAM_NOTIF_ROAM_ABORT); +} + /** * wma_roam_event_callback() - roam event callback * @handle: wma handle @@ -5314,7 +5362,6 @@ int wma_roam_event_callback(WMA_HANDLE handle, uint8_t *event_buf, WMI_ROAM_EVENTID_param_tlvs *param_buf; wmi_roam_event_fixed_param *wmi_event; struct roam_offload_synch_ind *roam_synch_data; - enum sir_roam_op_code op_code = {0}; uint8_t *frame = NULL; param_buf = (WMI_ROAM_EVENTID_param_tlvs *) event_buf; @@ -5402,28 +5449,8 @@ int wma_roam_event_callback(WMA_HANDLE handle, uint8_t *event_buf, break; #endif case WMI_ROAM_REASON_INVALID: - roam_synch_data = qdf_mem_malloc(sizeof(*roam_synch_data)); - if (!roam_synch_data) - return -ENOMEM; - - if (wmi_event->notif == WMI_ROAM_NOTIF_ROAM_START) { - op_code = SIR_ROAMING_START; - wma_handle->interfaces[wmi_event->vdev_id]. - roaming_in_progress = true; - } - if (wmi_event->notif == WMI_ROAM_NOTIF_ROAM_ABORT) { - op_code = SIR_ROAMING_ABORT; - wma_handle->interfaces[wmi_event->vdev_id]. - roaming_in_progress = false; - } - roam_synch_data->roamed_vdev_id = wmi_event->vdev_id; - wma_handle->pe_roam_synch_cb( - (struct mac_context *)wma_handle->mac_context, - roam_synch_data, NULL, op_code); - wma_handle->csr_roam_synch_cb( - (struct mac_context *)wma_handle->mac_context, - roam_synch_data, NULL, op_code); - qdf_mem_free(roam_synch_data); + wma_invalid_roam_reason_handler(wma_handle, wmi_event->vdev_id, + wmi_event->notif); break; case WMI_ROAM_REASON_RSO_STATUS: wma_rso_cmd_status_event_handler(wmi_event); @@ -5435,9 +5462,9 @@ int wma_roam_event_callback(WMA_HANDLE handle, uint8_t *event_buf, return -ENOMEM; roam_synch_data->roamed_vdev_id = wmi_event->vdev_id; - wma_handle->csr_roam_synch_cb( - (struct mac_context *)wma_handle->mac_context, - roam_synch_data, NULL, SIR_ROAMING_INVOKE_FAIL); + wma_handle->csr_roam_synch_cb(wma_handle->mac_context, + roam_synch_data, NULL, + SIR_ROAMING_INVOKE_FAIL); qdf_mem_free(roam_synch_data); break; case WMI_ROAM_REASON_DEAUTH: