Quellcode durchsuchen

qcacmn: Include DS tx desc usage in global desc limit check

Make sure the global tx desc usage limit is honored by
direct switch as well.

Change-Id: Ie84edb08a8bd6c6a18338caf21328245bd70a8bc
CRs-Fixed: 3486130
Pavankumar Nandeshwar vor 2 Jahren
Ursprung
Commit
89f62ba1f3
2 geänderte Dateien mit 82 neuen und 25 gelöschten Zeilen
  1. 2 0
      dp/wifi3.0/dp_tx.c
  2. 80 25
      dp/wifi3.0/dp_tx.h

+ 2 - 0
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);

+ 80 - 25
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
@@ -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)
 {