diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index be36ee3728..0a35856a79 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -5646,6 +5646,8 @@ dp_tx_comp_process_desc_list(struct dp_soc *soc, nbuf = desc->nbuf; dp_tx_nbuf_dev_queue_free_no_flag(&h, nbuf); dp_tx_desc_free(soc, desc, desc->pool_id); + + __dp_tx_outstanding_dec(soc); } else { nbuf = dp_ppeds_tx_desc_free(soc, desc); dp_tx_nbuf_dev_queue_free_no_flag(&h, nbuf); diff --git a/dp/wifi3.0/dp_tx.h b/dp/wifi3.0/dp_tx.h index 9c8da606cc..9c18d1c395 100644 --- a/dp/wifi3.0/dp_tx.h +++ b/dp/wifi3.0/dp_tx.h @@ -1659,6 +1659,26 @@ is_dp_spl_tx_limit_reached(struct dp_vdev *vdev, qdf_nbuf_t nbuf) return true; } +static inline bool +__dp_tx_limit_check(struct dp_soc *soc) +{ + struct dp_global_context *dp_global; + uint32_t global_tx_desc_allowed; + uint32_t global_tx_desc_reg_allowed; + uint32_t global_tx_desc_spcl_allowed; + + dp_global = wlan_objmgr_get_global_ctx(); + global_tx_desc_allowed = + wlan_cfg_get_num_global_tx_desc(soc->wlan_cfg_ctx); + global_tx_desc_spcl_allowed = + wlan_cfg_get_num_global_spcl_tx_desc(soc->wlan_cfg_ctx); + global_tx_desc_reg_allowed = global_tx_desc_allowed - + global_tx_desc_spcl_allowed; + + return (dp_tx_get_global_desc_in_use(dp_global) >= + global_tx_desc_reg_allowed); +} + /** * dp_tx_limit_check - Check if allocated tx descriptors reached * global max reg limit and pdev max reg limit for regular packets. Also check @@ -1675,20 +1695,8 @@ dp_tx_limit_check(struct dp_vdev *vdev, qdf_nbuf_t nbuf) { struct dp_pdev *pdev = vdev->pdev; struct dp_soc *soc = pdev->soc; - struct dp_global_context *dp_global; - uint32_t global_tx_desc_allowed; - uint32_t global_tx_desc_reg_allowed; - uint32_t global_tx_desc_spcl_allowed; - dp_global = wlan_objmgr_get_global_ctx(); - global_tx_desc_allowed = - wlan_cfg_get_num_global_tx_desc(soc->wlan_cfg_ctx); - global_tx_desc_spcl_allowed = - wlan_cfg_get_num_global_spcl_tx_desc(soc->wlan_cfg_ctx); - global_tx_desc_reg_allowed = global_tx_desc_allowed - - global_tx_desc_spcl_allowed; - - if (dp_tx_get_global_desc_in_use(dp_global) >= global_tx_desc_reg_allowed) { + if (__dp_tx_limit_check(soc)) { if (is_dp_spl_tx_limit_reached(vdev, nbuf)) { dp_tx_info("queued packets are more than max tx, drop the frame"); DP_STATS_INC(vdev, tx_i.dropped.desc_na.num, 1); @@ -1740,6 +1748,13 @@ is_dp_spl_tx_limit_reached(struct dp_vdev *vdev, qdf_nbuf_t nbuf) return true; } +static inline bool +__dp_tx_limit_check(struct dp_soc *soc) +{ + return (qdf_atomic_read(&soc->num_tx_outstanding) >= + soc->num_reg_tx_allowed); +} + /** * dp_tx_limit_check - Check if allocated tx descriptors reached * soc max reg limit and pdev max reg limit for regular packets. Also check if @@ -1757,8 +1772,7 @@ dp_tx_limit_check(struct dp_vdev *vdev, qdf_nbuf_t nbuf) struct dp_pdev *pdev = vdev->pdev; struct dp_soc *soc = pdev->soc; - if (qdf_atomic_read(&soc->num_tx_outstanding) >= - soc->num_reg_tx_allowed) { + if (__dp_tx_limit_check(soc)) { if (is_dp_spl_tx_limit_reached(vdev, nbuf)) { dp_tx_info("queued packets are more than max tx, drop the frame"); DP_STATS_INC(vdev, tx_i.dropped.desc_na.num, 1); @@ -1805,6 +1819,16 @@ dp_tx_exception_limit_check(struct dp_vdev *vdev) } #ifdef QCA_SUPPORT_DP_GLOBAL_CTX +static inline void +__dp_tx_outstanding_inc(struct dp_soc *soc) +{ + struct dp_global_context *dp_global; + + dp_global = wlan_objmgr_get_global_ctx(); + + qdf_atomic_inc(&dp_global->global_descriptor_in_use); +} + /** * dp_tx_outstanding_inc - Inc outstanding tx desc values on global and pdev * @pdev: DP pdev handle @@ -1814,15 +1838,20 @@ dp_tx_exception_limit_check(struct dp_vdev *vdev) static inline void dp_tx_outstanding_inc(struct dp_pdev *pdev) { - struct dp_global_context *dp_global; - - dp_global = wlan_objmgr_get_global_ctx(); - - qdf_atomic_inc(&dp_global->global_descriptor_in_use); + __dp_tx_outstanding_inc(pdev->soc); qdf_atomic_inc(&pdev->num_tx_outstanding); dp_update_tx_desc_stats(pdev); } +static inline void +__dp_tx_outstanding_dec(struct dp_soc *soc) +{ + struct dp_global_context *dp_global; + + dp_global = wlan_objmgr_get_global_ctx(); + + qdf_atomic_dec(&dp_global->global_descriptor_in_use); +} /** * dp_tx_outstanding_dec - Dec outstanding tx desc values on global and pdev * @pdev: DP pdev handle @@ -1832,16 +1861,20 @@ dp_tx_outstanding_inc(struct dp_pdev *pdev) static inline void dp_tx_outstanding_dec(struct dp_pdev *pdev) { - struct dp_global_context *dp_global; + struct dp_soc *soc = pdev->soc; - dp_global = wlan_objmgr_get_global_ctx(); - - qdf_atomic_dec(&dp_global->global_descriptor_in_use); + __dp_tx_outstanding_dec(soc); qdf_atomic_dec(&pdev->num_tx_outstanding); dp_update_tx_desc_stats(pdev); } #else + +static inline void +__dp_tx_outstanding_inc(struct dp_soc *soc) +{ + qdf_atomic_inc(&soc->num_tx_outstanding); +} /** * dp_tx_outstanding_inc - Increment outstanding tx desc values on pdev and soc * @pdev: DP pdev handle @@ -1853,11 +1886,17 @@ dp_tx_outstanding_inc(struct dp_pdev *pdev) { struct dp_soc *soc = pdev->soc; + __dp_tx_outstanding_inc(soc); qdf_atomic_inc(&pdev->num_tx_outstanding); - qdf_atomic_inc(&soc->num_tx_outstanding); dp_update_tx_desc_stats(pdev); } +static inline void +__dp_tx_outstanding_dec(struct dp_soc *soc) +{ + qdf_atomic_dec(&soc->num_tx_outstanding); +} + /** * dp_tx_outstanding_dec - Decrement outstanding tx desc values on pdev and soc * @pdev: DP pdev handle @@ -1869,13 +1908,19 @@ dp_tx_outstanding_dec(struct dp_pdev *pdev) { struct dp_soc *soc = pdev->soc; + __dp_tx_outstanding_dec(soc); qdf_atomic_dec(&pdev->num_tx_outstanding); - qdf_atomic_dec(&soc->num_tx_outstanding); dp_update_tx_desc_stats(pdev); } #endif /* QCA_SUPPORT_DP_GLOBAL_CTX */ #else //QCA_TX_LIMIT_CHECK +static inline bool +__dp_tx_limit_check(struct dp_soc *soc) +{ + return false; +} + static inline bool dp_tx_limit_check(struct dp_vdev *vdev, qdf_nbuf_t nbuf) { @@ -1888,6 +1933,11 @@ dp_tx_exception_limit_check(struct dp_vdev *vdev) return false; } +static inline void +__dp_tx_outstanding_inc(struct dp_soc *soc) +{ +} + static inline void dp_tx_outstanding_inc(struct dp_pdev *pdev) { @@ -1895,6 +1945,11 @@ dp_tx_outstanding_inc(struct dp_pdev *pdev) dp_update_tx_desc_stats(pdev); } +static inline void +__dp_tx_outstanding_dec(struct dp_soc *soc) +{ +} + static inline void dp_tx_outstanding_dec(struct dp_pdev *pdev) {