瀏覽代碼

qcacmn: get HP of RXDMA ring without incrementing

get the HP of the RXDMA ring without incrementing
This will ensure in case of nbuf failures the ring
HP remains unchanged

Change-Id: I69ec9207a44a4c50484933797326e962ad2d4a5c
CRs-Fixed: 3309394
Tallapragada Kalyan 2 年之前
父節點
當前提交
4c45f8a2ed
共有 2 個文件被更改,包括 26 次插入2 次删除
  1. 3 2
      dp/wifi3.0/dp_rx.c
  2. 23 0
      hal/wifi3.0/hal_api.h

+ 3 - 2
dp/wifi3.0/dp_rx.c

@@ -420,8 +420,8 @@ __dp_rx_buffers_no_map_replenish(struct dp_soc *soc, uint32_t mac_id,
 		next = (*desc_list)->next;
 		qdf_prefetch(next);
 		rxdma_ring_entry = (struct dp_buffer_addr_info *)
-			hal_srng_src_get_next(soc->hal_soc, rxdma_srng);
-		if (!rxdma_ring_entry)
+			hal_srng_src_peek(soc->hal_soc, rxdma_srng);
+		if (qdf_unlikely(!rxdma_ring_entry))
 			break;
 
 		nbuf = dp_rx_nbuf_alloc(soc, rx_desc_pool);
@@ -449,6 +449,7 @@ __dp_rx_buffers_no_map_replenish(struct dp_soc *soc, uint32_t mac_id,
 					     rx_desc_pool->owner);
 
 		*desc_list = next;
+		hal_srng_src_get_next(soc->hal_soc, rxdma_srng);
 	}
 	qdf_dsb();
 	hal_srng_access_end(soc->hal_soc, rxdma_srng);

+ 23 - 0
hal/wifi3.0/hal_api.h

@@ -1975,6 +1975,29 @@ void *hal_srng_src_get_next_consumed(void *hal_soc,
 }
 #endif /* CLEAR_SW2TCL_CONSUMED_DESC */
 
+/**
+ * hal_srng_src_peek - get the HP of the SRC ring
+ * @hal_soc: Opaque HAL SOC handle
+ * @hal_ring_hdl: Source ring pointer
+ *
+ * get the head pointer in the src ring but do not increment it
+ */
+static inline
+void *hal_srng_src_peek(void *hal_soc, hal_ring_handle_t hal_ring_hdl)
+{
+	struct hal_srng *srng = (struct hal_srng *)hal_ring_hdl;
+	uint32_t *desc;
+	uint32_t next_hp = (srng->u.src_ring.hp + srng->entry_size) %
+		srng->ring_size;
+
+	if (next_hp != srng->u.src_ring.cached_tp) {
+		desc = &(srng->ring_base_vaddr[srng->u.src_ring.hp]);
+		return (void *)desc;
+	}
+
+	return NULL;
+}
+
 /**
  * hal_srng_src_get_next - Get next entry from a source ring and move cached tail pointer
  *