diff --git a/dp/inc/cdp_txrx_cmn.h b/dp/inc/cdp_txrx_cmn.h index 2b99d6d391..387ff2f1a5 100644 --- a/dp/inc/cdp_txrx_cmn.h +++ b/dp/inc/cdp_txrx_cmn.h @@ -1307,6 +1307,36 @@ cdp_tso_soc_detach(ol_txrx_soc_handle soc) return soc->ops->cmn_drv_ops->txrx_tso_soc_detach(soc); } +/** + * cdp_tid_update_ba_win_size() - Update the DP tid BA window size + * @soc: soc handle + * @peer_mac: mac address of peer handle + * @vdev_id: id of vdev handle + * @tid: tid + * @buffersize: BA window size + * + * Return: success/failure of tid update + */ +static inline QDF_STATUS +cdp_tid_update_ba_win_size(ol_txrx_soc_handle soc, + uint8_t *peer_mac, uint16_t vdev_id, uint8_t tid, + uint16_t buffersize) +{ + if (!soc || !soc->ops) { + dp_cdp_debug("Invalid Instance:"); + QDF_BUG(0); + return 0; + } + + if (!soc->ops->cmn_drv_ops || + !soc->ops->cmn_drv_ops->tid_update_ba_win_size) + return 0; + + return soc->ops->cmn_drv_ops->tid_update_ba_win_size(soc, peer_mac, + vdev_id, tid, + buffersize); +} + /** * cdp_addba_resp_tx_completion() - Indicate addba response tx * completion to dp to change tid state. diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 36213cf737..29fc9ec17f 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -440,6 +440,10 @@ struct cdp_cmn_ops { int (*delba_process)(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac, uint16_t vdev_id, int tid, uint16_t reasoncode); + QDF_STATUS (*tid_update_ba_win_size)(ol_txrx_soc_handle soc, + uint8_t *peer_mac, + uint16_t vdev_id, uint8_t tid, + uint16_t buffersize); /** * delba_tx_completion() - Indicate delba tx status * @cdp_soc: soc handle diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 43c81339b5..185411f6bb 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -2002,6 +2002,21 @@ QDF_STATUS dp_set_addba_response(struct cdp_soc_t *cdp_soc, int dp_delba_process_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac, uint16_t vdev_id, int tid, uint16_t reasoncode); + +/** + * dp_rx_tid_update_ba_win_size() - Update the DP tid BA window size + * @soc: soc handle + * @peer_mac: mac address of peer handle + * @vdev_id: id of vdev handle + * @tid: tid + * @buffersize: BA window size + * + * Return: success/failure of tid update + */ +QDF_STATUS dp_rx_tid_update_ba_win_size(struct cdp_soc_t *cdp_soc, + uint8_t *peer_mac, uint16_t vdev_id, + uint8_t tid, uint16_t buffersize); + /* * dp_delba_tx_completion_wifi3() - Handle delba tx completion * diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 3d5f89190b..89ebffc56f 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -12469,6 +12469,7 @@ static struct cdp_cmn_ops dp_ops_cmn = { .delba_process = dp_delba_process_wifi3, .set_addba_response = dp_set_addba_response, .flush_cache_rx_queue = NULL, + .tid_update_ba_win_size = dp_rx_tid_update_ba_win_size, /* TODO: get API's for dscp-tid need to be added*/ .set_vdev_dscp_tid_map = dp_set_vdev_dscp_tid_map_wifi3, .set_pdev_dscp_tid_map = dp_set_pdev_dscp_tid_map_wifi3, diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index 8d5346af36..1819cf123a 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -4299,6 +4299,35 @@ static void dp_check_ba_buffersize(struct dp_peer *peer, } } +QDF_STATUS dp_rx_tid_update_ba_win_size(struct cdp_soc_t *cdp_soc, + uint8_t *peer_mac, uint16_t vdev_id, + uint8_t tid, uint16_t buffersize) +{ + struct dp_rx_tid *rx_tid = NULL; + struct dp_peer *peer; + + peer = dp_peer_get_tgt_peer_hash_find((struct dp_soc *)cdp_soc, + peer_mac, 0, vdev_id, + DP_MOD_ID_CDP); + if (!peer) { + dp_peer_debug("%pK: Peer is NULL!\n", cdp_soc); + return QDF_STATUS_E_FAILURE; + } + + rx_tid = &peer->rx_tid[tid]; + + qdf_spin_lock_bh(&rx_tid->tid_lock); + rx_tid->ba_win_size = buffersize; + qdf_spin_unlock_bh(&rx_tid->tid_lock); + + dp_info("peer "QDF_MAC_ADDR_FMT", tid %d, update BA win size to %d", + QDF_MAC_ADDR_REF(peer->mac_addr.raw), tid, buffersize); + + dp_peer_unref_delete(peer, DP_MOD_ID_CDP); + + return QDF_STATUS_SUCCESS; +} + #define DP_RX_BA_SESSION_DISABLE 1 /*