From c773848bf4b83a0943ebf74dcb34ad8f44bcdbe1 Mon Sep 17 00:00:00 2001 From: sumedh baikady Date: Tue, 2 Apr 2019 18:14:46 -0700 Subject: [PATCH] qcacmn: Fix to accept Addba req when BA session is active Currently, if BA session for a tid is active, we tear down current session and do not send an addba response. Clients are expected to send new addba req. But this is not happening, therefore we accept new addba req after flushing tid queue and then setup queue with latest addba request values. Also change is made to not update ssn to 0 so that old sequence can be continued to use. Change-Id: I129ce74d7414c3255d5a4360f39fec9ed3d7650f CRs-fixed: 2428837 --- dp/wifi3.0/dp_peer.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index ebc4e52d2ed4..2c636a8c67ed 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -2244,7 +2244,7 @@ int dp_addba_resp_tx_completion_wifi3(void *peer_handle, qdf_spin_lock_bh(&rx_tid->tid_lock); if (status) { rx_tid->num_addba_rsp_failed++; - dp_rx_tid_update_wifi3(peer, tid, 1, 0); + dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); rx_tid->ba_status = DP_RX_BA_INACTIVE; qdf_spin_unlock_bh(&rx_tid->tid_lock); QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, @@ -2401,14 +2401,12 @@ int dp_addba_requestprocess_wifi3(void *peer_handle, rx_tid->num_of_addba_req++; if ((rx_tid->ba_status == DP_RX_BA_ACTIVE && rx_tid->hw_qdesc_vaddr_unaligned)) { - dp_rx_tid_update_wifi3(peer, tid, 1, 0); + dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); rx_tid->ba_status = DP_RX_BA_INACTIVE; peer->active_ba_session_cnt--; - qdf_spin_unlock_bh(&rx_tid->tid_lock); - QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, - "%s: Rx Tid- %d hw qdesc is already setup", - __func__, tid); - return QDF_STATUS_E_FAILURE; + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, + "%s: Addba recvd for Rx Tid-%d hw qdesc is already setup", + __func__, tid); } if (rx_tid->ba_status == DP_RX_BA_IN_PROGRESS) { @@ -2482,7 +2480,7 @@ int dp_delba_process_wifi3(void *peer_handle, */ rx_tid->delba_rcode = reasoncode; rx_tid->num_of_delba_req++; - dp_rx_tid_update_wifi3(peer, tid, 1, 0); + dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); rx_tid->ba_status = DP_RX_BA_INACTIVE; peer->active_ba_session_cnt--; @@ -2534,12 +2532,12 @@ int dp_delba_tx_completion_wifi3(void *peer_handle, rx_tid->delba_tx_status = 0; } if (rx_tid->ba_status == DP_RX_BA_ACTIVE) { - dp_rx_tid_update_wifi3(peer, tid, 1, 0); + dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); rx_tid->ba_status = DP_RX_BA_INACTIVE; peer->active_ba_session_cnt--; } if (rx_tid->ba_status == DP_RX_BA_IN_PROGRESS) { - dp_rx_tid_update_wifi3(peer, tid, 1, 0); + dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); rx_tid->ba_status = DP_RX_BA_INACTIVE; } qdf_spin_unlock_bh(&rx_tid->tid_lock);