Commit ff0ea57f authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Paolo Abeni

net: ethernet: mtk_wed: introduce mtk_wed_buf structure

Introduce mtk_wed_buf structure to store both virtual and physical
addresses allocated in mtk_wed_tx_buffer_alloc() routine. This is a
preliminary patch to add WED support for MT7988 SoC since it relies on a
different dma descriptor layout not storing page dma addresses.
Co-developed-by: default avatarSujuan Chen <sujuan.chen@mediatek.com>
Signed-off-by: default avatarSujuan Chen <sujuan.chen@mediatek.com>
Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent bafd764a
...@@ -300,9 +300,9 @@ mtk_wed_assign(struct mtk_wed_device *dev) ...@@ -300,9 +300,9 @@ mtk_wed_assign(struct mtk_wed_device *dev)
static int static int
mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev) mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev)
{ {
struct mtk_wed_buf *page_list;
struct mtk_wdma_desc *desc; struct mtk_wdma_desc *desc;
dma_addr_t desc_phys; dma_addr_t desc_phys;
void **page_list;
int token = dev->wlan.token_start; int token = dev->wlan.token_start;
int ring_size; int ring_size;
int n_pages; int n_pages;
...@@ -343,7 +343,8 @@ mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev) ...@@ -343,7 +343,8 @@ mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev)
return -ENOMEM; return -ENOMEM;
} }
page_list[page_idx++] = page; page_list[page_idx].p = page;
page_list[page_idx++].phy_addr = page_phys;
dma_sync_single_for_cpu(dev->hw->dev, page_phys, PAGE_SIZE, dma_sync_single_for_cpu(dev->hw->dev, page_phys, PAGE_SIZE,
DMA_BIDIRECTIONAL); DMA_BIDIRECTIONAL);
...@@ -387,8 +388,8 @@ mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev) ...@@ -387,8 +388,8 @@ mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev)
static void static void
mtk_wed_free_tx_buffer(struct mtk_wed_device *dev) mtk_wed_free_tx_buffer(struct mtk_wed_device *dev)
{ {
struct mtk_wed_buf *page_list = dev->tx_buf_ring.pages;
struct mtk_wdma_desc *desc = dev->tx_buf_ring.desc; struct mtk_wdma_desc *desc = dev->tx_buf_ring.desc;
void **page_list = dev->tx_buf_ring.pages;
int page_idx; int page_idx;
int i; int i;
...@@ -400,13 +401,12 @@ mtk_wed_free_tx_buffer(struct mtk_wed_device *dev) ...@@ -400,13 +401,12 @@ mtk_wed_free_tx_buffer(struct mtk_wed_device *dev)
for (i = 0, page_idx = 0; i < dev->tx_buf_ring.size; for (i = 0, page_idx = 0; i < dev->tx_buf_ring.size;
i += MTK_WED_BUF_PER_PAGE) { i += MTK_WED_BUF_PER_PAGE) {
void *page = page_list[page_idx++]; dma_addr_t buf_addr = page_list[page_idx].phy_addr;
dma_addr_t buf_addr; void *page = page_list[page_idx++].p;
if (!page) if (!page)
break; break;
buf_addr = le32_to_cpu(desc[i].buf0);
dma_unmap_page(dev->hw->dev, buf_addr, PAGE_SIZE, dma_unmap_page(dev->hw->dev, buf_addr, PAGE_SIZE,
DMA_BIDIRECTIONAL); DMA_BIDIRECTIONAL);
__free_page(page); __free_page(page);
......
...@@ -76,6 +76,11 @@ struct mtk_wed_wo_rx_stats { ...@@ -76,6 +76,11 @@ struct mtk_wed_wo_rx_stats {
__le32 rx_drop_cnt; __le32 rx_drop_cnt;
}; };
struct mtk_wed_buf {
void *p;
dma_addr_t phy_addr;
};
struct mtk_wed_device { struct mtk_wed_device {
#ifdef CONFIG_NET_MEDIATEK_SOC_WED #ifdef CONFIG_NET_MEDIATEK_SOC_WED
const struct mtk_wed_ops *ops; const struct mtk_wed_ops *ops;
...@@ -97,7 +102,7 @@ struct mtk_wed_device { ...@@ -97,7 +102,7 @@ struct mtk_wed_device {
struct { struct {
int size; int size;
void **pages; struct mtk_wed_buf *pages;
struct mtk_wdma_desc *desc; struct mtk_wdma_desc *desc;
dma_addr_t desc_phys; dma_addr_t desc_phys;
} tx_buf_ring; } tx_buf_ring;
......
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