Commit 024cc792 authored by Huazhong Tan's avatar Huazhong Tan Committed by David S. Miller

net: hns3: use dma_zalloc_coherent instead of kzalloc/dma_map_single

Reference to Documentation/DMA-API-HOWTO.txt,
Streaming DMA mappings which are usually mapped for one DMA transfer,
Network card DMA ring descriptors should use Consistent DMA mappings.
Signed-off-by: default avatarHuazhong Tan <tanhuazhong@huawei.com>
Signed-off-by: default avatarPeng Li <lipeng321@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7a7056e3
...@@ -1780,33 +1780,27 @@ static void hns3_free_buffers(struct hns3_enet_ring *ring) ...@@ -1780,33 +1780,27 @@ static void hns3_free_buffers(struct hns3_enet_ring *ring)
/* free desc along with its attached buffer */ /* free desc along with its attached buffer */
static void hns3_free_desc(struct hns3_enet_ring *ring) static void hns3_free_desc(struct hns3_enet_ring *ring)
{ {
int size = ring->desc_num * sizeof(ring->desc[0]);
hns3_free_buffers(ring); hns3_free_buffers(ring);
dma_unmap_single(ring_to_dev(ring), ring->desc_dma_addr, if (ring->desc) {
ring->desc_num * sizeof(ring->desc[0]), dma_free_coherent(ring_to_dev(ring), size,
DMA_BIDIRECTIONAL); ring->desc, ring->desc_dma_addr);
ring->desc_dma_addr = 0; ring->desc = NULL;
kfree(ring->desc); }
ring->desc = NULL;
} }
static int hns3_alloc_desc(struct hns3_enet_ring *ring) static int hns3_alloc_desc(struct hns3_enet_ring *ring)
{ {
int size = ring->desc_num * sizeof(ring->desc[0]); int size = ring->desc_num * sizeof(ring->desc[0]);
ring->desc = kzalloc(size, GFP_KERNEL); ring->desc = dma_zalloc_coherent(ring_to_dev(ring), size,
&ring->desc_dma_addr,
GFP_KERNEL);
if (!ring->desc) if (!ring->desc)
return -ENOMEM; return -ENOMEM;
ring->desc_dma_addr = dma_map_single(ring_to_dev(ring), ring->desc,
size, DMA_BIDIRECTIONAL);
if (dma_mapping_error(ring_to_dev(ring), ring->desc_dma_addr)) {
ring->desc_dma_addr = 0;
kfree(ring->desc);
ring->desc = NULL;
return -ENOMEM;
}
return 0; return 0;
} }
......
...@@ -45,31 +45,24 @@ static int hclge_alloc_cmd_desc(struct hclge_cmq_ring *ring) ...@@ -45,31 +45,24 @@ static int hclge_alloc_cmd_desc(struct hclge_cmq_ring *ring)
{ {
int size = ring->desc_num * sizeof(struct hclge_desc); int size = ring->desc_num * sizeof(struct hclge_desc);
ring->desc = kzalloc(size, GFP_KERNEL); ring->desc = dma_zalloc_coherent(cmq_ring_to_dev(ring),
size, &ring->desc_dma_addr,
GFP_KERNEL);
if (!ring->desc) if (!ring->desc)
return -ENOMEM; return -ENOMEM;
ring->desc_dma_addr = dma_map_single(cmq_ring_to_dev(ring), ring->desc,
size, DMA_BIDIRECTIONAL);
if (dma_mapping_error(cmq_ring_to_dev(ring), ring->desc_dma_addr)) {
ring->desc_dma_addr = 0;
kfree(ring->desc);
ring->desc = NULL;
return -ENOMEM;
}
return 0; return 0;
} }
static void hclge_free_cmd_desc(struct hclge_cmq_ring *ring) static void hclge_free_cmd_desc(struct hclge_cmq_ring *ring)
{ {
dma_unmap_single(cmq_ring_to_dev(ring), ring->desc_dma_addr, int size = ring->desc_num * sizeof(struct hclge_desc);
ring->desc_num * sizeof(ring->desc[0]),
DMA_BIDIRECTIONAL);
ring->desc_dma_addr = 0; if (ring->desc) {
kfree(ring->desc); dma_free_coherent(cmq_ring_to_dev(ring), size,
ring->desc = NULL; ring->desc, ring->desc_dma_addr);
ring->desc = NULL;
}
} }
static int hclge_alloc_cmd_queue(struct hclge_dev *hdev, int ring_type) static int hclge_alloc_cmd_queue(struct hclge_dev *hdev, int ring_type)
......
...@@ -76,32 +76,24 @@ static int hclgevf_alloc_cmd_desc(struct hclgevf_cmq_ring *ring) ...@@ -76,32 +76,24 @@ static int hclgevf_alloc_cmd_desc(struct hclgevf_cmq_ring *ring)
{ {
int size = ring->desc_num * sizeof(struct hclgevf_desc); int size = ring->desc_num * sizeof(struct hclgevf_desc);
ring->desc = kzalloc(size, GFP_KERNEL); ring->desc = dma_zalloc_coherent(cmq_ring_to_dev(ring),
size, &ring->desc_dma_addr,
GFP_KERNEL);
if (!ring->desc) if (!ring->desc)
return -ENOMEM; return -ENOMEM;
ring->desc_dma_addr = dma_map_single(cmq_ring_to_dev(ring), ring->desc,
size, DMA_BIDIRECTIONAL);
if (dma_mapping_error(cmq_ring_to_dev(ring), ring->desc_dma_addr)) {
ring->desc_dma_addr = 0;
kfree(ring->desc);
ring->desc = NULL;
return -ENOMEM;
}
return 0; return 0;
} }
static void hclgevf_free_cmd_desc(struct hclgevf_cmq_ring *ring) static void hclgevf_free_cmd_desc(struct hclgevf_cmq_ring *ring)
{ {
dma_unmap_single(cmq_ring_to_dev(ring), ring->desc_dma_addr, int size = ring->desc_num * sizeof(struct hclgevf_desc);
ring->desc_num * sizeof(ring->desc[0]),
hclgevf_ring_to_dma_dir(ring));
ring->desc_dma_addr = 0; if (ring->desc) {
kfree(ring->desc); dma_free_coherent(cmq_ring_to_dev(ring), size,
ring->desc = NULL; ring->desc, ring->desc_dma_addr);
ring->desc = NULL;
}
} }
static int hclgevf_init_cmd_queue(struct hclgevf_dev *hdev, static int hclgevf_init_cmd_queue(struct hclgevf_dev *hdev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment