diff options
| author | Varun Reddy Yeturu <varunreddy.yeturu@codeaurora.org> | 2016-09-16 10:33:19 -0700 |
|---|---|---|
| committer | qcabuildsw <qcabuildsw@localhost> | 2016-10-19 15:18:20 -0700 |
| commit | 0425186793467924aafab46a322086eec67bbb22 (patch) | |
| tree | 5037df43ea1a1460504c5831fa34f7b127844394 | |
| parent | ba175fc4134c50269311f76537e0acb5e04e0141 (diff) | |
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
| -rw-r--r-- | core/hdd/src/wlan_hdd_assoc.c | 9 | ||||
| -rw-r--r-- | core/mac/inc/sir_api.h | 1 | ||||
| -rw-r--r-- | core/sme/inc/csr_api.h | 1 | ||||
| -rw-r--r-- | core/sme/src/csr/csr_api_roam.c | 7 | ||||
| -rw-r--r-- | core/wma/src/wma_scan_roam.c | 2 |
5 files changed, 20 insertions, 0 deletions
diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index 5a40fb0bbfa2..341ef18ea1ab 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 e2e3db5a829d..c673d402d074 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 f36805226cb5..49f2b1b1d108 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 7d26af4594b9..6c0f417ec805 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 514696deba85..09ad59a89e40 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); |
