From 0425186793467924aafab46a322086eec67bbb22 Mon Sep 17 00:00:00 2001 From: Varun Reddy Yeturu Date: Fri, 16 Sep 2016 10:33:19 -0700 Subject: [PATCH] qcacld-3.0: LFR3: Fix to handle peer MAP/UNMAP events Enabling flow steering may send the peer map/unmap events from the target to the host in a random order.When host does not receive them in expected sequence, there is an issue with peer management.Fix the issue by making the firmware send the events through a single copy engine in the same order they were generated and thus host can handle the events properly Change-Id: If2396a0bf943f2833e1e3a44d778054a76c65ada CRs-Fixed: 1078976 --- core/hdd/src/wlan_hdd_assoc.c | 9 +++++++++ core/mac/inc/sir_api.h | 1 + core/sme/inc/csr_api.h | 1 + core/sme/src/csr/csr_api_roam.c | 7 +++++++ core/wma/src/wma_scan_roam.c | 2 ++ 5 files changed, 20 insertions(+) diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index 5a40fb0bbfa24..341ef18ea1ab3 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -62,6 +62,7 @@ #include "ol_rx_fwd.h" #include "cdp_txrx_flow_ctrl_legacy.h" #include "cdp_txrx_peer_ops.h" +#include "wlan_hdd_napi.h" /* These are needed to recognize WPA and RSN suite types */ #define HDD_WPA_OUI_SIZE 4 @@ -4601,6 +4602,8 @@ hdd_sme_roam_callback(void *pContext, tCsrRoamInfo *pRoamInfo, uint32_t roamId, * after reassoc. */ hdd_info("Disabling queues"); + hdd_info("Roam Synch Ind: NAPI Serialize ON"); + hdd_napi_serialize(1); wlan_hdd_netif_queue_control(pAdapter, WLAN_NETIF_TX_DISABLE, WLAN_CONTROL_PATH); @@ -4613,6 +4616,10 @@ hdd_sme_roam_callback(void *pContext, tCsrRoamInfo *pRoamInfo, uint32_t roamId, hdd_info("hdd_ReassocScenario set to: %d, due to eCSR_ROAM_FT_START, session: %d", pHddStaCtx->hdd_ReassocScenario, pAdapter->sessionId); break; + case eCSR_ROAM_NAPI_OFF: + hdd_info("After Roam Synch Comp: NAPI Serialize OFF"); + hdd_napi_serialize(0); + break; case eCSR_ROAM_SHOULD_ROAM: /* notify apps that we can't pass traffic anymore */ hdd_info("Disabling queues"); @@ -4897,11 +4904,13 @@ hdd_sme_roam_callback(void *pContext, tCsrRoamInfo *pRoamInfo, uint32_t roamId, wlan_hdd_netif_queue_control(pAdapter, WLAN_NETIF_TX_DISABLE, WLAN_CONTROL_PATH); + hdd_napi_serialize(1); cds_set_connection_in_progress(true); cds_restart_opportunistic_timer(true); break; case eCSR_ROAM_ABORT: hdd_info("Firmware aborted roaming operation, previous connection is still valid"); + hdd_napi_serialize(0); wlan_hdd_netif_queue_control(pAdapter, WLAN_WAKE_ALL_NETIF_QUEUE, WLAN_CONTROL_PATH); diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index e2e3db5a829da..c673d402d074a 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -203,6 +203,7 @@ enum sir_roam_op_code { SIR_ROAMING_START, SIR_ROAMING_ABORT, SIR_ROAM_SYNCH_COMPLETE, + SIR_ROAM_SYNCH_NAPI_OFF, }; /** * Module ID definitions. diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h index f36805226cb58..49f2b1b1d108d 100644 --- a/core/sme/inc/csr_api.h +++ b/core/sme/inc/csr_api.h @@ -512,6 +512,7 @@ typedef enum { eCSR_ROAM_UPDATE_SCAN_RESULT, eCSR_ROAM_START, eCSR_ROAM_ABORT, + eCSR_ROAM_NAPI_OFF, } eRoamCmdStatus; /* comment inside indicates what roaming callback gets */ diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 7d26af4594b91..6c0f417ec8057 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -18822,6 +18822,8 @@ void csr_process_ho_fail_ind(tpAniSirGlobal pMac, void *pMsgBuf) return; } cds_set_connection_in_progress(false); + csr_roam_call_callback(pMac, sessionId, NULL, 0, + eCSR_ROAM_NAPI_OFF, eSIR_SME_SUCCESS); csr_roam_synch_clean_up(pMac, sessionId); csr_roaming_report_diag_event(pMac, NULL, eCSR_REASON_ROAM_HO_FAIL); @@ -19560,6 +19562,11 @@ void csr_roam_synch_callback(tpAniSirGlobal mac_ctx, eCSR_ROAM_ABORT, eSIR_SME_SUCCESS); sme_release_global_lock(&mac_ctx->sme); return; + case SIR_ROAM_SYNCH_NAPI_OFF: + csr_roam_call_callback(mac_ctx, session_id, NULL, 0, + eCSR_ROAM_NAPI_OFF, eSIR_SME_SUCCESS); + sme_release_global_lock(&mac_ctx->sme); + return; case SIR_ROAM_SYNCH_PROPAGATION: break; case SIR_ROAM_SYNCH_COMPLETE: diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 514696deba85c..09ad59a89e40f 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -2331,6 +2331,8 @@ int wma_roam_synch_event_handler(void *handle, uint8_t *event, 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((tpAniSirGlobal)wma->mac_context, + roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_NAPI_OFF); cleanup_label: if (roam_synch_ind_ptr->join_rsp) qdf_mem_free(roam_synch_ind_ptr->join_rsp);