|
@@ -4482,31 +4482,17 @@ static int ath10k_wmi_alloc_chunk(struct ath10k *ar, u32 req_id,
|
|
|
u32 num_units, u32 unit_len)
|
|
|
{
|
|
|
dma_addr_t paddr;
|
|
|
- u32 pool_size = 0;
|
|
|
+ u32 pool_size;
|
|
|
int idx = ar->wmi.num_mem_chunks;
|
|
|
- void *vaddr = NULL;
|
|
|
-
|
|
|
- if (ar->wmi.num_mem_chunks == ARRAY_SIZE(ar->wmi.mem_chunks))
|
|
|
- return -ENOMEM;
|
|
|
+ void *vaddr;
|
|
|
|
|
|
- while (!vaddr && num_units) {
|
|
|
- pool_size = num_units * round_up(unit_len, 4);
|
|
|
- if (!pool_size)
|
|
|
- return -EINVAL;
|
|
|
+ pool_size = num_units * round_up(unit_len, 4);
|
|
|
+ vaddr = dma_alloc_coherent(ar->dev, pool_size, &paddr, GFP_KERNEL);
|
|
|
|
|
|
- vaddr = kzalloc(pool_size, GFP_KERNEL | __GFP_NOWARN);
|
|
|
- if (!vaddr)
|
|
|
- num_units /= 2;
|
|
|
- }
|
|
|
-
|
|
|
- if (!num_units)
|
|
|
+ if (!vaddr)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- paddr = dma_map_single(ar->dev, vaddr, pool_size, DMA_BIDIRECTIONAL);
|
|
|
- if (dma_mapping_error(ar->dev, paddr)) {
|
|
|
- kfree(vaddr);
|
|
|
- return -ENOMEM;
|
|
|
- }
|
|
|
+ memset(vaddr, 0, pool_size);
|
|
|
|
|
|
ar->wmi.mem_chunks[idx].vaddr = vaddr;
|
|
|
ar->wmi.mem_chunks[idx].paddr = paddr;
|
|
@@ -8281,11 +8267,10 @@ void ath10k_wmi_free_host_mem(struct ath10k *ar)
|
|
|
|
|
|
/* free the host memory chunks requested by firmware */
|
|
|
for (i = 0; i < ar->wmi.num_mem_chunks; i++) {
|
|
|
- dma_unmap_single(ar->dev,
|
|
|
- ar->wmi.mem_chunks[i].paddr,
|
|
|
- ar->wmi.mem_chunks[i].len,
|
|
|
- DMA_BIDIRECTIONAL);
|
|
|
- kfree(ar->wmi.mem_chunks[i].vaddr);
|
|
|
+ dma_free_coherent(ar->dev,
|
|
|
+ ar->wmi.mem_chunks[i].len,
|
|
|
+ ar->wmi.mem_chunks[i].vaddr,
|
|
|
+ ar->wmi.mem_chunks[i].paddr);
|
|
|
}
|
|
|
|
|
|
ar->wmi.num_mem_chunks = 0;
|