summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHong Shi <hongsh@qti.qualcomm.com>2015-11-06 16:18:40 +0800
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2015-11-19 14:21:42 +0530
commitcc7293df71fb5523ae002a7ad003f1ba276cbb68 (patch)
treef5974cb8c9a78a5be779006a074a21f4dd4f4017
parentd953658e47dfba299e589564d7a07e0d4b066d98 (diff)
qcacld-2.0: Fix roaming can't work issue
Roaming failed because preauth frame are not sending on target ap channel. Rootcause is peer tid queue is paused while off home channel. Fix is to select vdev queue instead of peer tid queue when sending preauth frame. Change-Id: I86c3116d77a4038f0ff642df75ae408e9dd19224 CRs-Fixed: 936226
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_tx_classify.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_classify.c b/CORE/CLD_TXRX/TXRX/ol_tx_classify.c
index 01a5257ea675..17f93435be25 100644
--- a/CORE/CLD_TXRX/TXRX/ol_tx_classify.c
+++ b/CORE/CLD_TXRX/TXRX/ol_tx_classify.c
@@ -576,6 +576,7 @@ ol_tx_classify_mgmt(
struct ol_txrx_peer_t *peer = NULL;
struct ol_tx_frms_queue_t *txq = NULL;
A_UINT8 *dest_addr;
+ union ol_txrx_align_mac_addr_t local_mac_addr_aligned, *mac_addr;
TX_SCHED_DEBUG_PRINT("Enter %s\n", __func__);
dest_addr = ol_tx_dest_addr_find(pdev, tx_nbuf);
@@ -609,6 +610,23 @@ ol_tx_classify_mgmt(
* MAC address.
*/
peer = ol_txrx_assoc_peer_find(vdev);
+ /*
+ * Some special case(preauth for example) needs to send
+ * unicast mgmt frame to unassociated AP. In such case,
+ * we need to check if dest addr match the associated
+ * peer addr. If not, we set peer as NULL to queue this
+ * frame to vdev queue.
+ */
+ if (peer) {
+ adf_os_mem_copy(
+ &local_mac_addr_aligned.raw[0],
+ dest_addr, OL_TXRX_MAC_ADDR_LEN);
+ mac_addr = &local_mac_addr_aligned;
+ if (ol_txrx_peer_find_mac_addr_cmp(mac_addr, &peer->mac_addr) != 0) {
+ adf_os_atomic_dec(&peer->ref_cnt);
+ peer = NULL;
+ }
+ }
} else {
/* find the peer and increment its reference count */
peer = ol_txrx_peer_find_hash_find(pdev, dest_addr, 0, 1);