|
@@ -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
|
|
@@ -1813,16 +1837,21 @@ dp_tx_exception_limit_check(struct dp_vdev *vdev)
|
|
|
*/
|
|
|
static inline void
|
|
|
dp_tx_outstanding_inc(struct dp_pdev *pdev)
|
|
|
+{
|
|
|
+ __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_inc(&dp_global->global_descriptor_in_use);
|
|
|
- qdf_atomic_inc(&pdev->num_tx_outstanding);
|
|
|
- dp_update_tx_desc_stats(pdev);
|
|
|
+ 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;
|
|
|
-
|
|
|
- dp_global = wlan_objmgr_get_global_ctx();
|
|
|
+ struct dp_soc *soc = pdev->soc;
|
|
|
|
|
|
- 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)
|
|
|
{
|