Jelajahi Sumber

qcacmn: Handle special tx descriptor pool cases

Fix the missing special tx descriptor pool cases

Change-Id: Ie6a7539e77b805483c32cb7bcfbc3143f9ef8034
CRs-Fixed: 3610126
Pavankumar Nandeshwar 1 tahun lalu
induk
melakukan
a9d8a404fc

+ 2 - 1
dp/wifi3.0/dp_main.c

@@ -12562,7 +12562,8 @@ void dp_find_missing_tx_comp(struct dp_soc *soc)
 					 desc_pages.cacheable_pages)))
 				break;
 
-			tx_desc = dp_tx_desc_find(soc, i, page_id, offset);
+			tx_desc = dp_tx_desc_find(soc, i, page_id, offset,
+						  false);
 			if (tx_desc->magic == DP_TX_MAGIC_PATTERN_FREE) {
 				continue;
 			} else if (tx_desc->magic ==

+ 3 - 0
dp/wifi3.0/dp_stats.c

@@ -6249,6 +6249,9 @@ void dp_print_soc_tx_stats(struct dp_soc *soc)
 		tx_desc_pool = dp_get_tx_desc_pool(soc, desc_pool_id);
 		soc->stats.tx.desc_in_use +=
 			tx_desc_pool->num_allocated;
+		tx_desc_pool = dp_get_spcl_tx_desc_pool(soc, desc_pool_id);
+		soc->stats.tx.desc_in_use +=
+			tx_desc_pool->num_allocated;
 	}
 
 	DP_PRINT_STATS("Tx Descriptors In Use = %u",

+ 29 - 11
dp/wifi3.0/dp_tx.c

@@ -6360,7 +6360,8 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
 					 desc_pages.cacheable_pages)))
 				break;
 
-			tx_desc = dp_tx_desc_find(soc, i, page_id, offset);
+			tx_desc = dp_tx_desc_find(soc, i, page_id, offset,
+						  false);
 
 			if (dp_is_tx_desc_flush_match(pdev, vdev, tx_desc)) {
 				/*
@@ -6389,14 +6390,16 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
  * @soc: Handle to DP soc structure
  * @tx_desc: pointer of one TX desc
  * @desc_pool_id: TX Desc pool id
+ * @spcl_pool: Special pool
  */
 static inline void
 dp_tx_desc_reset_vdev(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc,
-		      uint8_t desc_pool_id)
+		      uint8_t desc_pool_id, bool spcl_pool)
 {
 	struct dp_tx_desc_pool_s *pool = NULL;
 
-	pool = dp_get_tx_desc_pool(soc, desc_pool_id);
+	pool = spcl_pool ? dp_get_spcl_tx_desc_pool(soc, desc_pool_id) :
+				dp_get_tx_desc_pool(soc, desc_pool_id);
 	TX_DESC_LOCK_LOCK(&pool->lock);
 
 	tx_desc->vdev_id = DP_INVALID_VDEV_ID;
@@ -6404,8 +6407,8 @@ dp_tx_desc_reset_vdev(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc,
 	TX_DESC_LOCK_UNLOCK(&pool->lock);
 }
 
-void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
-		      bool force_free)
+void __dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
+			bool force_free, bool spcl_pool)
 {
 	uint8_t i, num_pool;
 	uint32_t j;
@@ -6420,22 +6423,30 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
 		return;
 	}
 
-	num_desc = wlan_cfg_get_num_tx_desc(soc->wlan_cfg_ctx);
+	num_desc = spcl_pool ? wlan_cfg_get_num_tx_spl_desc(soc->wlan_cfg_ctx) :
+			wlan_cfg_get_num_tx_desc(soc->wlan_cfg_ctx);
+
 	num_pool = wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx);
 
 	for (i = 0; i < num_pool; i++) {
-		tx_desc_pool = dp_get_tx_desc_pool(soc, i);
+		tx_desc_pool = spcl_pool ? dp_get_spcl_tx_desc_pool(soc, i) :
+						dp_get_tx_desc_pool(soc, i);
 		if (!tx_desc_pool->desc_pages.cacheable_pages)
 			continue;
 
-		num_desc_t = dp_get_updated_tx_desc(soc->ctrl_psoc, i,
-						    num_desc);
+		if (spcl_pool)
+			num_desc_t = num_desc;
+		else
+			num_desc_t = dp_get_updated_tx_desc(soc->ctrl_psoc, i,
+							    num_desc);
+
 		num_desc_per_page =
 			tx_desc_pool->desc_pages.num_element_per_page;
 		for (j = 0; j < num_desc_t; j++) {
 			page_id = j / num_desc_per_page;
 			offset = j % num_desc_per_page;
-			tx_desc = dp_tx_desc_find(soc, i, page_id, offset);
+			tx_desc = dp_tx_desc_find(soc, i, page_id, offset,
+						  spcl_pool);
 
 			if (dp_is_tx_desc_flush_match(pdev, vdev, tx_desc)) {
 				if (force_free) {
@@ -6444,12 +6455,19 @@ void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
 					dp_tx_desc_release(soc, tx_desc, i);
 				} else {
 					dp_tx_desc_reset_vdev(soc, tx_desc,
-							      i);
+							      i, spcl_pool);
 				}
 			}
 		}
 	}
 }
+
+void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
+		      bool force_free)
+{
+	__dp_tx_desc_flush(pdev, vdev, force_free, false);
+	__dp_tx_desc_flush(pdev, vdev, force_free, true);
+}
 #endif /* !QCA_LL_TX_FLOW_CONTROL_V2 */
 
 QDF_STATUS dp_tx_vdev_detach(struct dp_vdev *vdev)

+ 10 - 0
dp/wifi3.0/dp_tx_desc.c

@@ -104,6 +104,16 @@ void dp_tx_desc_pool_cleanup(struct dp_soc *soc, qdf_nbuf_t *nbuf_list)
 	for (i = 0; i < num_pool; i++) {
 		tx_desc_pool = dp_get_tx_desc_pool(soc, i);
 
+		if (tx_desc_pool)
+			qdf_tx_desc_pool_free_bufs(soc,
+						   &tx_desc_pool->desc_pages,
+						   tx_desc_pool->elem_size,
+						   tx_desc_pool->elem_count,
+						   true, &dp_tx_desc_clean_up,
+						   nbuf_list);
+
+		tx_desc_pool = dp_get_spcl_tx_desc_pool(soc, i);
+
 		if (tx_desc_pool)
 			qdf_tx_desc_pool_free_bufs(soc,
 						   &tx_desc_pool->desc_pages,

+ 16 - 6
dp/wifi3.0/dp_tx_desc.h

@@ -26,6 +26,8 @@
 
 /*
  * 21 bits cookie
+ * 1 bit special pool indicator
+ * 3 bits unused
  * 2 bits pool id 0 ~ 3,
  * 10 bits page id 0 ~ 1023
  * 5 bits offset id 0 ~ 31 (Desc size = 128, Num descs per page = 4096/128 = 32)
@@ -34,6 +36,8 @@
 
 /* TODO: Need to revisit this change for Rhine */
 #ifdef WLAN_SOFTUMAC_SUPPORT
+#define DP_TX_DESC_ID_SPCL_MASK    0x100000
+#define DP_TX_DESC_ID_SPCL_OS      20
 #define DP_TX_DESC_ID_POOL_MASK    0x018000
 #define DP_TX_DESC_ID_POOL_OS      15
 #define DP_TX_DESC_ID_PAGE_MASK    0x007FF0
@@ -41,6 +45,8 @@
 #define DP_TX_DESC_ID_OFFSET_MASK  0x00000F
 #define DP_TX_DESC_ID_OFFSET_OS    0
 #else
+#define DP_TX_DESC_ID_SPCL_MASK    0x100000
+#define DP_TX_DESC_ID_SPCL_OS      20
 #define DP_TX_DESC_ID_POOL_MASK    0x018000
 #define DP_TX_DESC_ID_POOL_OS      15
 #define DP_TX_DESC_ID_PAGE_MASK    0x007FE0
@@ -1289,21 +1295,25 @@ static inline void dp_tx_desc_update_fast_comp_flag(struct dp_soc *soc,
 /**
  * dp_tx_desc_find() - find dp tx descriptor from pool/page/offset
  * @soc: handle for the device sending the data
- * @pool_id:
- * @page_id:
- * @offset:
+ * @pool_id: pool id
+ * @page_id: page id
+ * @offset: offset from base address
+ * @spcl_pool: bit to indicate if this is a special pool
  *
  * Use page and offset to find the corresponding descriptor object in
  * the given descriptor pool.
  *
  * Return: the descriptor object that has the specified ID
  */
-static inline struct dp_tx_desc_s *dp_tx_desc_find(struct dp_soc *soc,
-		uint8_t pool_id, uint16_t page_id, uint16_t offset)
+static inline
+struct dp_tx_desc_s *dp_tx_desc_find(struct dp_soc *soc,
+				     uint8_t pool_id, uint16_t page_id,
+				     uint16_t offset, bool spcl_pool)
 {
 	struct dp_tx_desc_pool_s *tx_desc_pool = NULL;
 
-	tx_desc_pool = dp_get_tx_desc_pool(soc, pool_id);
+	tx_desc_pool = spcl_pool ? dp_get_spcl_tx_desc_pool(soc, pool_id) :
+				dp_get_tx_desc_pool(soc, pool_id);
 
 	return tx_desc_pool->desc_pages.cacheable_pages[page_id] +
 		tx_desc_pool->elem_size * offset;

+ 2 - 1
dp/wifi3.0/li/dp_li.c

@@ -744,7 +744,8 @@ void dp_tx_comp_get_prefetched_params_from_hal_desc(
 			(tx_desc_id & DP_TX_DESC_ID_PAGE_MASK) >>
 			DP_TX_DESC_ID_PAGE_OS,
 			(tx_desc_id & DP_TX_DESC_ID_OFFSET_MASK) >>
-			DP_TX_DESC_ID_OFFSET_OS);
+			DP_TX_DESC_ID_OFFSET_OS,
+			(tx_desc_id & DP_TX_DESC_ID_SPCL_MASK));
 	qdf_prefetch((uint8_t *)*r_tx_desc);
 }
 #endif

+ 4 - 2
dp/wifi3.0/li/dp_li_tx.c

@@ -49,7 +49,8 @@ void dp_tx_comp_get_params_from_hal_desc_li(struct dp_soc *soc,
 				     (tx_desc_id & DP_TX_DESC_ID_PAGE_MASK) >>
 							DP_TX_DESC_ID_PAGE_OS,
 				     (tx_desc_id & DP_TX_DESC_ID_OFFSET_MASK) >>
-						DP_TX_DESC_ID_OFFSET_OS);
+						DP_TX_DESC_ID_OFFSET_OS,
+				     (tx_desc_id & DP_TX_DESC_ID_SPCL_MASK));
 	/* Pool id is not matching. Error */
 	if ((*r_tx_desc)->pool_id != pool_id) {
 		dp_tx_comp_alert("Tx Comp pool id %d not matched %d",
@@ -603,7 +604,8 @@ QDF_STATUS dp_tx_desc_pool_init_li(struct dp_soc *soc,
 	while (tx_desc) {
 		page_id = count / num_desc_per_page;
 		offset = count % num_desc_per_page;
-		id = ((pool_id_32 << DP_TX_DESC_ID_POOL_OS) |
+		id = ((!!spcl_tx_desc) <<  DP_TX_DESC_ID_SPCL_OS |
+			(pool_id_32 << DP_TX_DESC_ID_POOL_OS) |
 			(page_id << DP_TX_DESC_ID_PAGE_OS) | offset);
 
 		tx_desc->id = id;