diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 1ff05759e808..dd33b9d484cb 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -965,6 +965,8 @@ struct ol_if_ops { uint8_t *dest_macaddr, uint8_t *peer_macaddr, uint32_t flags); + + bool (*is_roam_inprogress)(uint32_t vdev_id); /* TODO: Add any other control path calls required to OL_IF/WMA layer */ }; diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index e90e0188748a..fbfabc3cc24d 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -771,6 +771,12 @@ void dp_local_peer_id_pool_init(struct dp_pdev *pdev); void dp_local_peer_id_alloc(struct dp_pdev *pdev, struct dp_peer *peer); void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer); #else +static inline +QDF_STATUS dp_get_vdevid(void *peer_handle, uint8_t *vdev_id) +{ + return QDF_STATUS_E_NOSUPPORT; +} + static inline void dp_local_peer_id_pool_init(struct dp_pdev *pdev) { } diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index 48974e968afb..66250c2a6290 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -2315,13 +2315,26 @@ int dp_addba_resp_tx_completion_wifi3(void *peer_handle, rx_tid = &peer->rx_tid[tid]; qdf_spin_lock_bh(&rx_tid->tid_lock); if (status) { + struct ol_if_ops *ol_ops = NULL; + bool is_roaming = false; + uint8_t vdev_id = -1; + rx_tid->num_addba_rsp_failed++; - dp_rx_tid_update_wifi3(peer, tid, 1, IEEE80211_SEQ_MAX); - rx_tid->ba_status = DP_RX_BA_INACTIVE; + ol_ops = peer->vdev->pdev->soc->cdp_soc.ol_ops; + + if (ol_ops && ol_ops->is_roam_inprogress) { + dp_get_vdevid(peer, &vdev_id); + is_roaming = ol_ops->is_roam_inprogress(vdev_id); + } + + if (!is_roaming) { + 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, - "%s: Rx Tid- %d addba rsp tx completion failed!", - __func__, tid); + dp_err("RxTid- %d addba rsp tx completion failed, is_roaming %d", + tid, is_roaming); return QDF_STATUS_SUCCESS; }