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: