forked from Openwrt/openwrt
6407ef8d2b
Reorder and update existing patches Signed-off-by: Felix Fietkau <nbd@nbd.name>
88 lines
2.5 KiB
Diff
88 lines
2.5 KiB
Diff
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
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 <sujuan.chen@mediatek.com>
|
|
Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com>
|
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
|
---
|
|
|
|
--- a/drivers/net/ethernet/mediatek/mtk_wed.c
|
|
+++ b/drivers/net/ethernet/mediatek/mtk_wed.c
|
|
@@ -299,9 +299,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;
|
|
@@ -342,7 +342,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);
|
|
|
|
@@ -386,8 +387,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;
|
|
|
|
@@ -399,13 +400,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;
|