qcacmn: Skip sending WMI REORDER_QUEUE_SETUP for BAR frames

When host receives BAR frames with OOR/2K jump in sequence
number it updates REO HW with new starting sequence number
and requests F.W to setup peer reorder queue. But REORDER_QUEUE_SETUP
is already requested to F.W as part of initial add BA in host.

So while handling OOR/2K jump BAR frames don't send
REORDER_QUEUE_SETUP to F.W

Change-Id: Idc3657e901dc792f699b53c45e4ae5133d286891
CRs-Fixed: 2981280
This commit is contained in:
Karthik Kantamneni
2021-06-30 14:00:18 +05:30
committed by Madan Koyyalamudi
parent 09f8d73a48
commit 8c19a927bf
3 changed files with 16 additions and 11 deletions

View File

@@ -2341,11 +2341,13 @@ dp_get_pdev_from_soc_pdev_id_wifi3(struct dp_soc *soc,
* @tid: TID * @tid: TID
* @ba_window_size: BlockAck window size * @ba_window_size: BlockAck window size
* @start_seq: Starting sequence number * @start_seq: Starting sequence number
* @bar_update: BAR update triggered
* *
* Return: QDF_STATUS code * Return: QDF_STATUS code
*/ */
QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, uint32_t QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, uint32_t
ba_window_size, uint32_t start_seq); ba_window_size, uint32_t start_seq,
bool bar_update);
/** /**
* dp_get_peer_mac_list(): function to get peer mac list of vdev * dp_get_peer_mac_list(): function to get peer mac list of vdev

View File

@@ -2513,7 +2513,8 @@ static bool dp_get_peer_vdev_roaming_in_progress(struct dp_peer *peer)
} }
QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, uint32_t QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, uint32_t
ba_window_size, uint32_t start_seq) ba_window_size, uint32_t start_seq,
bool bar_update)
{ {
struct dp_rx_tid *rx_tid = &peer->rx_tid[tid]; struct dp_rx_tid *rx_tid = &peer->rx_tid[tid];
struct dp_soc *soc = peer->vdev->pdev->soc; struct dp_soc *soc = peer->vdev->pdev->soc;
@@ -2545,7 +2546,7 @@ QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, uint32_t
if (dp_get_peer_vdev_roaming_in_progress(peer)) if (dp_get_peer_vdev_roaming_in_progress(peer))
return QDF_STATUS_E_PERM; return QDF_STATUS_E_PERM;
if (soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup) if (soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup && !bar_update)
soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup( soc->cdp_soc.ol_ops->peer_rx_reorder_queue_setup(
soc->ctrl_psoc, peer->vdev->pdev->pdev_id, soc->ctrl_psoc, peer->vdev->pdev->pdev_id,
peer->vdev->vdev_id, peer->mac_addr.raw, peer->vdev->vdev_id, peer->mac_addr.raw,
@@ -2733,7 +2734,7 @@ QDF_STATUS dp_rx_tid_setup_wifi3(struct dp_peer *peer, int tid,
rx_tid->ba_win_size = ba_window_size; rx_tid->ba_win_size = ba_window_size;
if (rx_tid->hw_qdesc_vaddr_unaligned) if (rx_tid->hw_qdesc_vaddr_unaligned)
return dp_rx_tid_update_wifi3(peer, tid, ba_window_size, return dp_rx_tid_update_wifi3(peer, tid, ba_window_size,
start_seq); start_seq, false);
rx_tid->delba_tx_status = 0; rx_tid->delba_tx_status = 0;
rx_tid->ppdu_id_2k = 0; rx_tid->ppdu_id_2k = 0;
rx_tid->num_of_addba_req = 0; rx_tid->num_of_addba_req = 0;
@@ -3473,7 +3474,7 @@ int dp_addba_resp_tx_completion_wifi3(struct cdp_soc_t *cdp_soc,
if (status) { if (status) {
rx_tid->num_addba_rsp_failed++; rx_tid->num_addba_rsp_failed++;
dp_rx_tid_update_wifi3(peer, tid, 1, dp_rx_tid_update_wifi3(peer, tid, 1,
IEEE80211_SEQ_MAX); IEEE80211_SEQ_MAX, false);
rx_tid->ba_status = DP_RX_BA_INACTIVE; rx_tid->ba_status = DP_RX_BA_INACTIVE;
qdf_spin_unlock_bh(&rx_tid->tid_lock); qdf_spin_unlock_bh(&rx_tid->tid_lock);
dp_err("RxTid- %d addba rsp tx completion failed", tid); dp_err("RxTid- %d addba rsp tx completion failed", tid);
@@ -3498,7 +3499,8 @@ int dp_addba_resp_tx_completion_wifi3(struct cdp_soc_t *cdp_soc,
if (dp_rx_tid_update_wifi3(peer, tid, if (dp_rx_tid_update_wifi3(peer, tid,
rx_tid->ba_win_size, rx_tid->ba_win_size,
rx_tid->startseqnum)) { rx_tid->startseqnum,
false)) {
dp_err("Failed update REO SSN"); dp_err("Failed update REO SSN");
} }
@@ -3665,7 +3667,7 @@ int dp_addba_requestprocess_wifi3(struct cdp_soc_t *cdp_soc,
rx_tid->num_of_addba_req++; rx_tid->num_of_addba_req++;
if ((rx_tid->ba_status == DP_RX_BA_ACTIVE && if ((rx_tid->ba_status == DP_RX_BA_ACTIVE &&
rx_tid->hw_qdesc_vaddr_unaligned)) { rx_tid->hw_qdesc_vaddr_unaligned)) {
dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX, false);
rx_tid->ba_status = DP_RX_BA_INACTIVE; rx_tid->ba_status = DP_RX_BA_INACTIVE;
peer->active_ba_session_cnt--; peer->active_ba_session_cnt--;
dp_peer_debug("%pK: Rx Tid- %d hw qdesc is already setup", dp_peer_debug("%pK: Rx Tid- %d hw qdesc is already setup",
@@ -3798,7 +3800,7 @@ int dp_delba_process_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac,
*/ */
rx_tid->delba_rcode = reasoncode; rx_tid->delba_rcode = reasoncode;
rx_tid->num_of_delba_req++; rx_tid->num_of_delba_req++;
dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX, false);
rx_tid->ba_status = DP_RX_BA_INACTIVE; rx_tid->ba_status = DP_RX_BA_INACTIVE;
peer->active_ba_session_cnt--; peer->active_ba_session_cnt--;
@@ -3860,12 +3862,12 @@ int dp_delba_tx_completion_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac,
rx_tid->delba_tx_status = 0; rx_tid->delba_tx_status = 0;
} }
if (rx_tid->ba_status == DP_RX_BA_ACTIVE) { if (rx_tid->ba_status == DP_RX_BA_ACTIVE) {
dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX, false);
rx_tid->ba_status = DP_RX_BA_INACTIVE; rx_tid->ba_status = DP_RX_BA_INACTIVE;
peer->active_ba_session_cnt--; peer->active_ba_session_cnt--;
} }
if (rx_tid->ba_status == DP_RX_BA_IN_PROGRESS) { if (rx_tid->ba_status == DP_RX_BA_IN_PROGRESS) {
dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX, false);
rx_tid->ba_status = DP_RX_BA_INACTIVE; rx_tid->ba_status = DP_RX_BA_INACTIVE;
} }
qdf_spin_unlock_bh(&rx_tid->tid_lock); qdf_spin_unlock_bh(&rx_tid->tid_lock);

View File

@@ -576,7 +576,8 @@ void dp_rx_err_handle_bar(struct dp_soc *soc,
status = dp_rx_tid_update_wifi3(peer, tid, status = dp_rx_tid_update_wifi3(peer, tid,
peer->rx_tid[tid].ba_win_size, peer->rx_tid[tid].ba_win_size,
start_seq_num); start_seq_num,
true);
if (status != QDF_STATUS_SUCCESS) { if (status != QDF_STATUS_SUCCESS) {
dp_err_rl("failed to handle bar frame update rx tid"); dp_err_rl("failed to handle bar frame update rx tid");
DP_STATS_INC(soc, rx.err.bar_handle_fail_count, 1); DP_STATS_INC(soc, rx.err.bar_handle_fail_count, 1);