[PATCH 2/2] Clean up DMA allocations
Eugene Krasnikov
k.eugene.e at gmail.com
Fri May 24 08:07:35 EDT 2013
Please send pull request.
2013/5/24 Eugene Krasnikov <k.eugene.e at gmail.com>:
> Finally we get rid of this legacy function wcn36xx_dma_alloc. I did
> not like it from very begging:)
>
> 2013/5/24 Pontus Fuchs <pontus.fuchs at gmail.com>:
>> Remove the wrapper function. It adds nothing but confusion.
>> Fix bad DMA free's as reported by Kalle Valo.
>>
>> Signed-off-by: Pontus Fuchs <pontus.fuchs at gmail.com>
>> ---
>> dxe.c | 55 +++++++++++++++++++++----------------------------------
>> dxe.h | 2 +-
>> 2 files changed, 22 insertions(+), 35 deletions(-)
>>
>> diff --git a/dxe.c b/dxe.c
>> index d841205..6d37937 100644
>> --- a/dxe.c
>> +++ b/dxe.c
>> @@ -24,30 +24,6 @@
>> #include "txrx.h"
>> #include "wcn36xx.h"
>>
>> -// Every DMA memory allocation must be preceded with wcn36xx_dxe_mem_info struct
>> -static void * wcn36xx_dma_alloc(size_t size, void **paddr)
>> -{
>> - u32 len;
>> - void *virt_addr;
>> - dma_addr_t phy_addr;
>> - struct wcn36xx_dxe_mem_info *mem_info = NULL;
>> -
>> - len = size + sizeof(struct wcn36xx_dxe_mem_info);
>> - virt_addr = dma_alloc_coherent(NULL, len, &phy_addr, GFP_KERNEL);
>> - if (NULL == virt_addr) {
>> - wcn36xx_error("can not alloc mem");
>> - return NULL;
>> - }
>> - memset(virt_addr, 0, len);
>> - mem_info = (struct wcn36xx_dxe_mem_info *)virt_addr;
>> - mem_info->len = len;
>> - mem_info->phy_addr = phy_addr;
>> - mem_info->offset = sizeof(struct wcn36xx_dxe_mem_info);
>> -
>> - *paddr = (void*)phy_addr + mem_info->offset;
>> - return virt_addr+mem_info->offset;
>> -}
>> -
>> static void wcn36xx_dxe_write_register(struct wcn36xx *wcn, int addr, int data)
>> {
>> wcn36xx_dbg(WCN36XX_DBG_DXE,
>> @@ -162,14 +138,17 @@ static int wcn36xx_dxe_init_descs(struct wcn36xx_dxe_ch *wcn_ch)
>> struct wcn36xx_dxe_desc *cur_dxe_desc = NULL;
>> struct wcn36xx_dxe_desc *prev_dxe_desc = NULL;
>> struct wcn36xx_dxe_ctl *cur_dxe_ctl = NULL;
>> - size_t size = 0;
>> + size_t size;
>> int i;
>>
>> size = wcn_ch->desc_num * sizeof(struct wcn36xx_dxe_desc);
>> - wcn_ch->cpu_addr = wcn36xx_dma_alloc(size, (void **)&wcn_ch->dma_addr);
>> + wcn_ch->cpu_addr = dma_alloc_coherent(NULL, size, &wcn_ch->dma_addr,
>> + GFP_KERNEL);
>> if (!wcn_ch->cpu_addr)
>> return -ENOMEM;
>>
>> + memset(wcn_ch->cpu_addr, 0, size);
>> +
>> cur_dxe_desc = (struct wcn36xx_dxe_desc *)wcn_ch->cpu_addr;
>> cur_dxe_ctl = wcn_ch->head_blk_ctl;
>>
>> @@ -384,15 +363,21 @@ void wcn36xx_rx_ready_work(struct work_struct *work)
>> }
>> int wcn36xx_dxe_allocate_mem_pools(struct wcn36xx *wcn)
>> {
>> + size_t s;
>> + void *cpu_addr;
>> +
>> /* Allocate BD headers for MGMT frames */
>>
>> // Where this come from ask QC
>> wcn->mgmt_mem_pool.chunk_size = WCN36XX_BD_CHUNK_SIZE +
>> 16 - (WCN36XX_BD_CHUNK_SIZE % 8);
>> - wcn->mgmt_mem_pool.virt_addr = wcn36xx_dma_alloc(
>> - wcn->mgmt_mem_pool.chunk_size * WCN36XX_DXE_CH_DESC_NUMB_TX_H,
>> - (void**)&wcn->mgmt_mem_pool.phy_addr);
>>
>> + s = wcn->mgmt_mem_pool.chunk_size * WCN36XX_DXE_CH_DESC_NUMB_TX_H;
>> + cpu_addr = dma_alloc_coherent(NULL, s, &wcn->mgmt_mem_pool.phy_addr,
>> + GFP_KERNEL);
>> +
>> + wcn->mgmt_mem_pool.virt_addr = cpu_addr;
>> + memset(cpu_addr, 0, s);
>> wcn->mgmt_mem_pool.bitmap =
>> kzalloc((WCN36XX_DXE_CH_DESC_NUMB_TX_H / 32 + 1) *
>> sizeof(u32), GFP_KERNEL);
>> @@ -402,10 +387,12 @@ int wcn36xx_dxe_allocate_mem_pools(struct wcn36xx *wcn)
>> // Where this come from ask QC
>> wcn->data_mem_pool.chunk_size = WCN36XX_BD_CHUNK_SIZE +
>> 16 - (WCN36XX_BD_CHUNK_SIZE % 8);
>> - wcn->data_mem_pool.virt_addr = wcn36xx_dma_alloc(
>> - wcn->data_mem_pool.chunk_size * WCN36XX_DXE_CH_DESC_NUMB_TX_L,
>> - (void**)&wcn->data_mem_pool.phy_addr);
>>
>> + s = wcn->data_mem_pool.chunk_size * WCN36XX_DXE_CH_DESC_NUMB_TX_L;
>> + cpu_addr = dma_alloc_coherent(NULL, s, &wcn->data_mem_pool.phy_addr,
>> + GFP_KERNEL);
>> + wcn->data_mem_pool.virt_addr = cpu_addr;
>> + memset(cpu_addr, 0, s);
>> wcn->data_mem_pool.bitmap =
>> kzalloc((WCN36XX_DXE_CH_DESC_NUMB_TX_L / 32 + 1) *
>> sizeof(u32), GFP_KERNEL);
>> @@ -418,12 +405,12 @@ void wcn36xx_dxe_free_mem_pools(struct wcn36xx *wcn)
>> dma_free_coherent(NULL, wcn->mgmt_mem_pool.chunk_size *
>> WCN36XX_DXE_CH_DESC_NUMB_TX_H,
>> wcn->mgmt_mem_pool.virt_addr,
>> - (dma_addr_t) wcn->data_mem_pool.phy_addr);
>> + wcn->mgmt_mem_pool.phy_addr);
>> if (wcn->data_mem_pool.virt_addr) {
>> dma_free_coherent(NULL, wcn->data_mem_pool.chunk_size *
>> WCN36XX_DXE_CH_DESC_NUMB_TX_L,
>> wcn->data_mem_pool.virt_addr,
>> - (dma_addr_t) wcn->data_mem_pool.phy_addr);
>> + wcn->data_mem_pool.phy_addr);
>> }
>> kfree(wcn->data_mem_pool.bitmap);
>> kfree(wcn->mgmt_mem_pool.bitmap);
>> diff --git a/dxe.h b/dxe.h
>> index d240a60..7761d7b 100644
>> --- a/dxe.h
>> +++ b/dxe.h
>> @@ -224,7 +224,7 @@ struct wcn36xx_dxe_ch {
>> struct wcn36xx_dxe_mem_pool {
>> int chunk_size; // size of every chunk
>> void *virt_addr; // virtual address that is visible to CPU
>> - void *phy_addr; // physical address that
>> + dma_addr_t phy_addr; // physical address that
>> void *bitmap; // bitmap array for all headers
>> };
>> struct wcn36xx;
>> --
>> 1.8.1.2
>>
>>
>> _______________________________________________
>> wcn36xx mailing list
>> wcn36xx at lists.infradead.org
>> http://lists.infradead.org/mailman/listinfo/wcn36xx
>
>
>
> --
> Best regards,
> Eugene
--
Best regards,
Eugene
More information about the wcn36xx
mailing list