qcacmn: Use qdf aligned mem alloc APIs in DP component
Replace dp_srng_mem_alloc() by qdf_aligned_mem_alloc_consistent() and
qdf_aligned_malloc() in dp_srng_setup().
Change-Id: Iae236a3cc19ec7a9f94b04382d37fc95e6ed622f
CRs-Fixed: 2462455
diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c
index bbdc366..2ad7ee8 100644
--- a/dp/wifi3.0/dp_main.c
+++ b/dp/wifi3.0/dp_main.c
@@ -1101,84 +1101,6 @@
}
}
-/*
- * dp_srng_mem_alloc() - Allocate memory for SRNG
- * @soc : Data path soc handle
- * @srng : SRNG pointer
- * @align : Align size
- *
- * return: QDF_STATUS_SUCCESS on successful allocation
- * QDF_STATUS_E_NOMEM on failure
- */
-static QDF_STATUS
-dp_srng_mem_alloc(struct dp_soc *soc, struct dp_srng *srng, uint32_t align,
- bool cached)
-{
- uint32_t align_alloc_size;
-
- if (!cached) {
- srng->base_vaddr_unaligned =
- qdf_mem_alloc_consistent(soc->osdev,
- soc->osdev->dev,
- srng->alloc_size,
- &srng->base_paddr_unaligned);
- } else {
- srng->base_vaddr_unaligned = qdf_mem_malloc(srng->alloc_size);
- srng->base_paddr_unaligned =
- qdf_mem_virt_to_phys(srng->base_vaddr_unaligned);
- }
-
- if (!srng->base_vaddr_unaligned) {
- return QDF_STATUS_E_NOMEM;
- }
-
- /* Re-allocate additional bytes to align base address only if
- * above allocation returns unaligned address. Reason for
- * trying exact size allocation above is, OS tries to allocate
- * blocks of size power-of-2 pages and then free extra pages.
- * e.g., of a ring size of 1MB, the allocation below will
- * request 1MB plus 7 bytes for alignment, which will cause a
- * 2MB block allocation,and that is failing sometimes due to
- * memory fragmentation.
- * dp_srng_mem_alloc should be replaced with
- * qdf_aligned_mem_alloc_consistent after fixing some known
- * shortcomings with this QDF function
- */
- if ((unsigned long)(srng->base_paddr_unaligned) &
- (align - 1)) {
- align_alloc_size = srng->alloc_size + align - 1;
-
- if (!cached) {
- qdf_mem_free_consistent(soc->osdev, soc->osdev->dev,
- srng->alloc_size,
- srng->base_vaddr_unaligned,
- srng->base_paddr_unaligned, 0);
-
- srng->base_vaddr_unaligned =
- qdf_mem_alloc_consistent(soc->osdev,
- soc->osdev->dev,
- align_alloc_size,
- &srng->base_paddr_unaligned);
-
- } else {
- qdf_mem_free(srng->base_vaddr_unaligned);
- srng->base_vaddr_unaligned =
- qdf_mem_malloc(align_alloc_size);
-
- srng->base_paddr_unaligned =
- qdf_mem_virt_to_phys(srng->base_vaddr_unaligned);
- }
-
- srng->alloc_size = align_alloc_size;
-
- if (!srng->base_vaddr_unaligned) {
- return QDF_STATUS_E_NOMEM;
- }
- }
-
- return QDF_STATUS_SUCCESS;
-}
-
#ifdef WLAN_DP_PER_RING_TYPE_CONFIG
/**
* dp_srng_configure_interrupt_thresholds() - Retrieve interrupt
@@ -1291,24 +1213,40 @@
srng->num_entries = num_entries;
if (!dp_is_soc_reinit(soc)) {
- if (dp_srng_mem_alloc(soc, srng, ring_base_align, cached) !=
- QDF_STATUS_SUCCESS) {
- dp_err("alloc failed - ring_type: %d, ring_num %d",
- ring_type, ring_num);
- return QDF_STATUS_E_NOMEM;
+ if (!cached) {
+ ring_params.ring_base_vaddr =
+ qdf_aligned_mem_alloc_consistent(
+ soc->osdev, &srng->alloc_size,
+ &srng->base_vaddr_unaligned,
+ &srng->base_paddr_unaligned,
+ &ring_params.ring_base_paddr,
+ ring_base_align);
+ } else {
+ ring_params.ring_base_vaddr = qdf_aligned_malloc(
+ &srng->alloc_size,
+ &srng->base_vaddr_unaligned,
+ &srng->base_paddr_unaligned,
+ &ring_params.ring_base_paddr,
+ ring_base_align);
}
+ if (!ring_params.ring_base_vaddr) {
+ dp_err("alloc failed - ring_type: %d, ring_num %d",
+ ring_type, ring_num);
+ return QDF_STATUS_E_NOMEM;
+ }
}
- ring_params.ring_base_paddr =
- (qdf_dma_addr_t)qdf_align(
+ ring_params.ring_base_paddr = (qdf_dma_addr_t)qdf_align(
(unsigned long)(srng->base_paddr_unaligned),
ring_base_align);
- ring_params.ring_base_vaddr =
- (void *)((unsigned long)(srng->base_vaddr_unaligned) +
+ ring_params.ring_base_vaddr = (void *)(
+ (unsigned long)(srng->base_vaddr_unaligned) +
((unsigned long)(ring_params.ring_base_paddr) -
- (unsigned long)(srng->base_paddr_unaligned)));
+ (unsigned long)(srng->base_paddr_unaligned)));
+
+ qdf_assert_always(ring_params.ring_base_vaddr);
ring_params.num_entries = num_entries;