123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- From: Lorenzo Bianconi <[email protected]>
- Date: Mon, 18 Sep 2023 12:29:08 +0200
- Subject: [PATCH] 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: Sujuan Chen <[email protected]>
- Signed-off-by: Sujuan Chen <[email protected]>
- Signed-off-by: Lorenzo Bianconi <[email protected]>
- Signed-off-by: Paolo Abeni <[email protected]>
- ---
- --- a/drivers/net/ethernet/mediatek/mtk_wed.c
- +++ b/drivers/net/ethernet/mediatek/mtk_wed.c
- @@ -300,9 +300,9 @@ out:
- static int
- mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev)
- {
- + struct mtk_wed_buf *page_list;
- struct mtk_wdma_desc *desc;
- dma_addr_t desc_phys;
- - void **page_list;
- int token = dev->wlan.token_start;
- int ring_size;
- int n_pages;
- @@ -343,7 +343,8 @@ mtk_wed_tx_buffer_alloc(struct mtk_wed_d
- 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_BIDIRECTIONAL);
-
- @@ -387,8 +388,8 @@ mtk_wed_tx_buffer_alloc(struct mtk_wed_d
- static void
- 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;
- - void **page_list = dev->tx_buf_ring.pages;
- int page_idx;
- int i;
-
- @@ -400,13 +401,12 @@ mtk_wed_free_tx_buffer(struct mtk_wed_de
-
- for (i = 0, page_idx = 0; i < dev->tx_buf_ring.size;
- i += MTK_WED_BUF_PER_PAGE) {
- - void *page = page_list[page_idx++];
- - dma_addr_t buf_addr;
- + dma_addr_t buf_addr = page_list[page_idx].phy_addr;
- + void *page = page_list[page_idx++].p;
-
- if (!page)
- break;
-
- - buf_addr = le32_to_cpu(desc[i].buf0);
- dma_unmap_page(dev->hw->dev, buf_addr, PAGE_SIZE,
- DMA_BIDIRECTIONAL);
- __free_page(page);
- --- a/include/linux/soc/mediatek/mtk_wed.h
- +++ b/include/linux/soc/mediatek/mtk_wed.h
- @@ -76,6 +76,11 @@ struct mtk_wed_wo_rx_stats {
- __le32 rx_drop_cnt;
- };
-
- +struct mtk_wed_buf {
- + void *p;
- + dma_addr_t phy_addr;
- +};
- +
- struct mtk_wed_device {
- #ifdef CONFIG_NET_MEDIATEK_SOC_WED
- const struct mtk_wed_ops *ops;
- @@ -97,7 +102,7 @@ struct mtk_wed_device {
-
- struct {
- int size;
- - void **pages;
- + struct mtk_wed_buf *pages;
- struct mtk_wdma_desc *desc;
- dma_addr_t desc_phys;
- } tx_buf_ring;
|