Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: ethernet: mtk_wed: add support for devices with more than 4GB of dram

Introduce WED offloading support for boards with more than 4GB of
memory.

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>
Link: https://lore.kernel.org/r/1c7efdf5d384ea7af3c0209723e40b2ee0f956bf.1700239272.git.lorenzo@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Lorenzo Bianconi and committed by
Jakub Kicinski
31c54867 4da325cc

+11 -5
+4 -1
drivers/net/ethernet/mediatek/mtk_eth_soc.c
··· 1159 1159 phy_ring_tail = eth->phy_scratch_ring + soc->txrx.txd_size * (cnt - 1); 1160 1160 1161 1161 for (i = 0; i < cnt; i++) { 1162 + dma_addr_t addr = dma_addr + i * MTK_QDMA_PAGE_SIZE; 1162 1163 struct mtk_tx_dma_v2 *txd; 1163 1164 1164 1165 txd = eth->scratch_ring + i * soc->txrx.txd_size; 1165 - txd->txd1 = dma_addr + i * MTK_QDMA_PAGE_SIZE; 1166 + txd->txd1 = addr; 1166 1167 if (i < cnt - 1) 1167 1168 txd->txd2 = eth->phy_scratch_ring + 1168 1169 (i + 1) * soc->txrx.txd_size; 1169 1170 1170 1171 txd->txd3 = TX_DMA_PLEN0(MTK_QDMA_PAGE_SIZE); 1172 + if (MTK_HAS_CAPS(soc->caps, MTK_36BIT_DMA)) 1173 + txd->txd3 |= TX_DMA_PREP_ADDR64(addr); 1171 1174 txd->txd4 = 0; 1172 1175 if (mtk_is_netsys_v2_or_greater(eth)) { 1173 1176 txd->txd5 = 0;
+5 -3
drivers/net/ethernet/mediatek/mtk_wed.c
··· 691 691 692 692 for (s = 0; s < MTK_WED_BUF_PER_PAGE; s++) { 693 693 struct mtk_wdma_desc *desc = desc_ptr; 694 + u32 ctrl; 694 695 695 696 desc->buf0 = cpu_to_le32(buf_phys); 696 697 if (!mtk_wed_is_v3_or_greater(dev->hw)) { 697 - u32 txd_size, ctrl; 698 + u32 txd_size; 698 699 699 700 txd_size = dev->wlan.init_buf(buf, buf_phys, 700 701 token++); ··· 709 708 ctrl |= MTK_WDMA_DESC_CTRL_LAST_SEG0 | 710 709 FIELD_PREP(MTK_WDMA_DESC_CTRL_LEN1_V2, 711 710 MTK_WED_BUF_SIZE - txd_size); 712 - desc->ctrl = cpu_to_le32(ctrl); 713 711 desc->info = 0; 714 712 } else { 715 - desc->ctrl = cpu_to_le32(token << 16); 713 + ctrl = token << 16 | TX_DMA_PREP_ADDR64(buf_phys); 716 714 } 715 + desc->ctrl = cpu_to_le32(ctrl); 717 716 718 717 desc_ptr += desc_size; 719 718 buf += MTK_WED_BUF_SIZE; ··· 812 811 buf_phys = page_phys; 813 812 for (s = 0; s < MTK_WED_RX_BUF_PER_PAGE; s++) { 814 813 desc->buf0 = cpu_to_le32(buf_phys); 814 + desc->token = cpu_to_le32(RX_DMA_PREP_ADDR64(buf_phys)); 815 815 buf_phys += MTK_WED_PAGE_BUF_SIZE; 816 816 desc++; 817 817 }
+2 -1
drivers/net/ethernet/mediatek/mtk_wed_wo.c
··· 142 142 dma_addr_t addr; 143 143 void *buf; 144 144 145 - buf = page_frag_alloc(&q->cache, q->buf_size, GFP_ATOMIC); 145 + buf = page_frag_alloc(&q->cache, q->buf_size, 146 + GFP_ATOMIC | GFP_DMA32); 146 147 if (!buf) 147 148 break; 148 149