summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVarun Reddy Yeturu <varunreddy.yeturu@codeaurora.org>2016-09-16 10:33:19 -0700
committerqcabuildsw <qcabuildsw@localhost>2016-10-19 15:18:20 -0700
commit0425186793467924aafab46a322086eec67bbb22 (patch)
tree5037df43ea1a1460504c5831fa34f7b127844394
parentba175fc4134c50269311f76537e0acb5e04e0141 (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.c9
-rw-r--r--core/mac/inc/sir_api.h1
-rw-r--r--core/sme/inc/csr_api.h1
-rw-r--r--core/sme/src/csr/csr_api_roam.c7
-rw-r--r--core/wma/src/wma_scan_roam.c2
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);