Lines Matching +full:irq +full:- +full:mirror
1 // SPDX-License-Identifier: GPL-2.0-only
9 #include <linux/dma-mapping.h>
95 regmap_update_bits(dev->hw->regs, reg, mask | val, val);
131 return readl(dev->wlan.base + reg);
137 writel(val, dev->wlan.base + reg);
157 if (!mtk_wed_is_v3_or_greater(dev->hw))
166 dev_err(dev->hw->dev, "rx reset failed\n");
171 dev_err(dev->hw->dev, "rx reset failed\n");
179 dev_err(dev->hw->dev, "rx reset failed\n");
184 dev_err(dev->hw->dev, "rx reset failed\n");
246 dev_err(dev->hw->dev, "rx reset failed\n");
252 for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++) {
253 if (dev->rx_wdma[i].desc)
285 if (!mtk_wed_is_v3_or_greater(dev->hw))
294 dev_err(dev->hw->dev, "tx reset failed\n");
299 dev_err(dev->hw->dev, "tx reset failed\n");
307 dev_err(dev->hw->dev, "tx reset failed\n");
312 dev_err(dev->hw->dev, "tx reset failed\n");
367 dev_err(dev->hw->dev, "tx reset failed\n");
373 for (i = 0; i < ARRAY_SIZE(dev->tx_wdma); i++)
398 struct mtk_wed_wo *wo = dev->hw->wed_wo;
414 dev_err(dev->hw->dev, "failed to disable wed-wo\n");
419 switch (dev->hw->index) {
452 dev = hw->wed_dev;
453 if (!dev || !dev->wlan.reset)
457 err = dev->wlan.reset(dev);
459 dev_err(dev->dev, "wlan reset failed: %d\n", err);
478 dev = hw->wed_dev;
479 if (!dev || !dev->wlan.reset_complete)
482 dev->wlan.reset_complete(dev);
494 if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) {
495 hw = hw_list[pci_domain_nr(dev->wlan.pci_dev->bus)];
499 if (!hw->wed_dev)
510 if (hw && !hw->wed_dev)
517 hw->wed_dev = dev;
524 struct mtk_wed_hw *hw = dev->hw;
531 wed_amsdu = devm_kcalloc(hw->dev, MTK_WED_AMSDU_NPAGES,
534 return -ENOMEM;
548 wed_amsdu[i].txd_phy = dma_map_single(hw->dev, ptr,
551 if (dma_mapping_error(hw->dev, wed_amsdu[i].txd_phy))
554 dev->hw->wed_amsdu = wed_amsdu;
559 for (i--; i >= 0; i--)
560 dma_unmap_single(hw->dev, wed_amsdu[i].txd_phy,
562 return -ENOMEM;
568 struct mtk_wed_amsdu *wed_amsdu = dev->hw->wed_amsdu;
575 dma_unmap_single(dev->hw->dev, wed_amsdu[i].txd_phy,
585 struct mtk_wed_amsdu *wed_amsdu = dev->hw->wed_amsdu;
599 dev->wlan.amsdu_max_len >> 8) |
601 dev->wlan.amsdu_max_subframes));
608 dev_err(dev->hw->dev, "amsdu initialization failed\n");
614 FIELD_PREP(MTK_WED_AMSDU_HIFTXD_SRC, dev->hw->index));
625 if (dev->wlan.id == 0x7991)
636 u32 desc_size = dev->hw->soc->tx_ring_desc_size;
638 int token = dev->wlan.token_start;
643 if (!mtk_wed_is_v3_or_greater(dev->hw)) {
644 ring_size = dev->wlan.nbuf & ~(MTK_WED_BUF_PER_PAGE - 1);
645 dev->tx_buf_ring.size = ring_size;
647 dev->tx_buf_ring.size = MTK_WED_TX_BM_DMA_SIZE;
650 n_pages = dev->tx_buf_ring.size / MTK_WED_BUF_PER_PAGE;
654 return -ENOMEM;
656 dev->tx_buf_ring.pages = page_list;
658 desc_ptr = dma_alloc_coherent(dev->hw->dev,
659 dev->tx_buf_ring.size * desc_size,
662 return -ENOMEM;
664 dev->tx_buf_ring.desc = desc_ptr;
665 dev->tx_buf_ring.desc_phys = desc_phys;
675 return -ENOMEM;
677 page_phys = dma_map_page(dev->hw->dev, page, 0, PAGE_SIZE,
679 if (dma_mapping_error(dev->hw->dev, page_phys)) {
681 return -ENOMEM;
686 dma_sync_single_for_cpu(dev->hw->dev, page_phys, PAGE_SIZE,
696 desc->buf0 = cpu_to_le32(buf_phys);
697 if (!mtk_wed_is_v3_or_greater(dev->hw)) {
700 txd_size = dev->wlan.init_buf(buf, buf_phys,
702 desc->buf1 = cpu_to_le32(buf_phys + txd_size);
704 if (mtk_wed_is_v1(dev->hw))
707 MTK_WED_BUF_SIZE - txd_size);
711 MTK_WED_BUF_SIZE - txd_size);
712 desc->info = 0;
716 desc->ctrl = cpu_to_le32(ctrl);
723 dma_sync_single_for_device(dev->hw->dev, page_phys, PAGE_SIZE,
733 struct mtk_wed_buf *page_list = dev->tx_buf_ring.pages;
734 struct mtk_wed_hw *hw = dev->hw;
740 if (!dev->tx_buf_ring.desc)
743 for (i = 0; i < dev->tx_buf_ring.size; i += MTK_WED_BUF_PER_PAGE) {
750 dma_unmap_page(dev->hw->dev, page_phy, PAGE_SIZE,
755 dma_free_coherent(dev->hw->dev,
756 dev->tx_buf_ring.size * hw->soc->tx_ring_desc_size,
757 dev->tx_buf_ring.desc,
758 dev->tx_buf_ring.desc_phys);
773 if (!dev->wlan.hw_rro)
778 return -ENOMEM;
780 dev->hw_rro.size = dev->wlan.rx_nbuf & ~(MTK_WED_BUF_PER_PAGE - 1);
781 dev->hw_rro.pages = page_list;
782 desc = dma_alloc_coherent(dev->hw->dev,
783 dev->wlan.rx_nbuf * sizeof(*desc),
786 return -ENOMEM;
788 dev->hw_rro.desc = desc;
789 dev->hw_rro.desc_phys = desc_phys;
798 return -ENOMEM;
800 page_phys = dma_map_page(dev->hw->dev, page, 0, PAGE_SIZE,
802 if (dma_mapping_error(dev->hw->dev, page_phys)) {
804 return -ENOMEM;
809 dma_sync_single_for_cpu(dev->hw->dev, page_phys, PAGE_SIZE,
814 desc->buf0 = cpu_to_le32(buf_phys);
815 desc->token = cpu_to_le32(RX_DMA_PREP_ADDR64(buf_phys));
820 dma_sync_single_for_device(dev->hw->dev, page_phys, PAGE_SIZE,
833 dev->rx_buf_ring.size = dev->wlan.rx_nbuf;
834 desc = dma_alloc_coherent(dev->hw->dev,
835 dev->wlan.rx_nbuf * sizeof(*desc),
838 return -ENOMEM;
840 dev->rx_buf_ring.desc = desc;
841 dev->rx_buf_ring.desc_phys = desc_phys;
842 dev->wlan.init_rx_buf(dev, dev->wlan.rx_npkt);
850 struct mtk_wed_buf *page_list = dev->hw_rro.pages;
851 struct mtk_wed_bm_desc *desc = dev->hw_rro.desc;
854 if (!dev->wlan.hw_rro)
870 dma_unmap_page(dev->hw->dev, buf_addr, PAGE_SIZE,
875 dma_free_coherent(dev->hw->dev, dev->hw_rro.size * sizeof(*desc),
876 desc, dev->hw_rro.desc_phys);
885 struct mtk_wed_bm_desc *desc = dev->rx_buf_ring.desc;
890 dev->wlan.release_rx_buf(dev);
891 dma_free_coherent(dev->hw->dev, dev->rx_buf_ring.size * sizeof(*desc),
892 desc, dev->rx_buf_ring.desc_phys);
900 if (!mtk_wed_get_rx_capa(dev) || !dev->wlan.hw_rro)
906 wed_w32(dev, MTK_WED_RRO_PG_BM_BASE, dev->hw_rro.desc_phys);
921 FIELD_PREP(MTK_WED_RX_BM_RX_DMAD_SDL0, dev->wlan.rx_size));
922 wed_w32(dev, MTK_WED_RX_BM_BASE, dev->rx_buf_ring.desc_phys);
924 FIELD_PREP(MTK_WED_RX_BM_SW_TAIL, dev->wlan.rx_npkt));
935 if (!ring->desc)
938 dma_free_coherent(dev->hw->dev, ring->size * ring->desc_size,
939 ring->desc, ring->desc_phys);
946 mtk_wed_free_ring(dev, &dev->rro.ring);
954 for (i = 0; i < ARRAY_SIZE(dev->tx_ring); i++)
955 mtk_wed_free_ring(dev, &dev->tx_ring[i]);
956 for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++)
957 mtk_wed_free_ring(dev, &dev->rx_wdma[i]);
965 switch (dev->hw->version) {
983 if (!dev->hw->num_flows)
993 if (!mtk_wed_is_v2(dev->hw))
1014 u32 cur_idx = readl(ring->wpdma + MTK_WED_RING_OFS_CPU_IDX);
1016 if (cur_idx == MTK_WED_RX_RING_SIZE - 1)
1023 dev_err(dev->hw->dev, "rx dma enable failed\n");
1024 return -ETIMEDOUT;
1048 if (mtk_wed_is_v1(dev->hw)) {
1049 regmap_write(dev->hw->mirror, dev->hw->index * 4, 0);
1062 if (mtk_wed_is_v3_or_greater(dev->hw) &&
1103 if (mtk_wed_is_v1(dev->hw))
1111 if (mtk_wed_is_v3_or_greater(dev->hw)) {
1123 struct mtk_wed_hw *hw = dev->hw;
1134 if (hw->wed_wo)
1137 if (hw->wed_wo)
1141 if (dev->wlan.bus_type == MTK_WED_BUS_PCIE) {
1144 wlan_node = dev->wlan.pci_dev->dev.of_node;
1145 if (of_dma_is_coherent(wlan_node) && hw->hifsys)
1146 regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP,
1147 BIT(hw->index), BIT(hw->index));
1150 if ((!hw_list[!hw->index] || !hw_list[!hw->index]->wed_dev) &&
1151 hw->eth->dma_dev != hw->eth->dev)
1152 mtk_eth_set_dma_device(hw->eth, hw->eth->dev);
1157 hw->wed_dev = NULL;
1171 switch (dev->wlan.bus_type) {
1173 struct device_node *np = dev->hw->eth->dev->of_node;
1175 if (mtk_wed_is_v2(dev->hw)) {
1179 "mediatek,wed-pcie");
1186 if (dev->wlan.msi) {
1188 dev->hw->pcie_base | 0xc08);
1190 dev->hw->pcie_base | 0xc04);
1194 dev->hw->pcie_base | 0x180);
1196 dev->hw->pcie_base | 0x184);
1208 dev->hw->index));
1226 if (mtk_wed_is_v1(dev->hw)) {
1227 wed_w32(dev, MTK_WED_WPDMA_CFG_BASE, dev->wlan.wpdma_phys);
1233 wed_w32(dev, MTK_WED_WPDMA_CFG_BASE, dev->wlan.wpdma_int);
1234 wed_w32(dev, MTK_WED_WPDMA_CFG_INT_MASK, dev->wlan.wpdma_mask);
1235 wed_w32(dev, MTK_WED_WPDMA_CFG_TX, dev->wlan.wpdma_tx);
1236 wed_w32(dev, MTK_WED_WPDMA_CFG_TX_FREE, dev->wlan.wpdma_txfree);
1241 wed_w32(dev, MTK_WED_WPDMA_RX_GLO_CFG, dev->wlan.wpdma_rx_glo);
1242 wed_w32(dev, dev->hw->soc->regmap.wpdma_rx_ring0, dev->wlan.wpdma_rx);
1244 if (!dev->wlan.hw_rro)
1247 wed_w32(dev, MTK_WED_RRO_RX_D_CFG(0), dev->wlan.wpdma_rx_rro[0]);
1248 wed_w32(dev, MTK_WED_RRO_RX_D_CFG(1), dev->wlan.wpdma_rx_rro[1]);
1251 dev->wlan.wpdma_rx_pg + i * 0x10);
1264 if (!mtk_wed_is_v3_or_greater(dev->hw)) {
1272 if (mtk_wed_is_v1(dev->hw)) {
1273 u32 offset = dev->hw->index ? 0x04000400 : 0;
1283 MTK_PCIE_BASE(dev->hw->index));
1285 wed_w32(dev, MTK_WED_WDMA_CFG_BASE, dev->hw->wdma_phy);
1305 ring->desc = dma_alloc_coherent(dev->hw->dev,
1306 size * sizeof(*ring->desc),
1307 &ring->desc_phys, GFP_KERNEL);
1308 if (!ring->desc)
1309 return -ENOMEM;
1311 ring->desc_size = sizeof(*ring->desc);
1312 ring->size = size;
1325 index = of_property_match_string(dev->hw->node, "memory-region-names",
1326 "wo-dlm");
1330 np = of_parse_phandle(dev->hw->node, "memory-region", index);
1332 return -ENODEV;
1338 return -ENODEV;
1340 dev->rro.miod_phys = rmem->base;
1341 dev->rro.fdbk_phys = MTK_WED_MIOD_COUNT + dev->rro.miod_phys;
1343 return mtk_wed_rro_ring_alloc(dev, &dev->rro.ring,
1350 struct mtk_wed_wo *wo = dev->hw->wed_wo;
1387 wed_w32(dev, MTK_WED_RROQM_MIOD_CTRL0, dev->rro.miod_phys);
1390 wed_w32(dev, MTK_WED_RROQM_FDBK_CTRL0, dev->rro.fdbk_phys);
1394 wed_w32(dev, MTK_WED_RROQ_BASE_L, dev->rro.ring.desc_phys);
1401 wed_w32(dev, MTK_WED_RROQM_MIOD_CTRL2, MTK_WED_MIOD_CNT - 1);
1417 if (mtk_wed_is_v2(dev->hw)) {
1422 0x3 + dev->hw->index));
1427 0x3 + dev->hw->index));
1436 if (dev->init_done)
1439 dev->init_done = true;
1442 wed_w32(dev, MTK_WED_TX_BM_BASE, dev->tx_buf_ring.desc_phys);
1445 if (mtk_wed_is_v1(dev->hw)) {
1449 dev->tx_buf_ring.size / 128) |
1455 } else if (mtk_wed_is_v2(dev->hw)) {
1459 dev->tx_buf_ring.size / 128) |
1471 dev->tx_buf_ring.size / 128) |
1473 dev->tx_buf_ring.size / 128));
1476 wed_w32(dev, dev->hw->soc->regmap.tx_bm_tkid,
1477 FIELD_PREP(MTK_WED_TX_BM_TKID_START, dev->wlan.token_start) |
1479 dev->wlan.token_start + dev->wlan.nbuf - 1));
1483 if (mtk_wed_is_v3_or_greater(dev->hw)) {
1491 dev->wlan.nbuf / 128) |
1493 dev->wlan.nbuf / 128));
1503 if (mtk_wed_is_v1(dev->hw)) {
1537 if (!mtk_wed_is_v1(dev->hw))
1544 void *head = (void *)ring->desc;
1550 desc = (struct mtk_wdma_desc *)(head + i * ring->desc_size);
1551 desc->buf0 = 0;
1553 desc->ctrl = cpu_to_le32(MTK_WDMA_DESC_CTRL_DMA_DONE);
1555 desc->ctrl = cpu_to_le32(MTK_WFDMA_DESC_CTRL_TO_HOST);
1556 desc->buf1 = 0;
1557 desc->info = 0;
1564 struct mtk_wed_wo *wo = dev->hw->wed_wo;
1574 if (dev->wlan.hw_rro) {
1584 if (!ret && mtk_wed_is_v3_or_greater(dev->hw))
1591 if (mtk_wed_is_v3_or_greater(dev->hw)) {
1628 if (dev->wlan.hw_rro) {
1655 } else if (mtk_wed_is_v3_or_greater(dev->hw)) {
1668 if (mtk_wed_is_v3_or_greater(dev->hw))
1684 dev->hw->soc->regmap.reset_idx_rx_mask);
1694 if (dev->wlan.hw_rro) {
1711 for (i = 0; i < ARRAY_SIZE(dev->rx_ring); i++) {
1712 if (!dev->rx_ring[i].desc)
1715 mtk_wed_ring_reset(&dev->rx_ring[i], MTK_WED_RX_RING_SIZE,
1731 for (i = 0; i < ARRAY_SIZE(dev->tx_ring); i++) {
1732 if (!dev->tx_ring[i].desc)
1735 mtk_wed_ring_reset(&dev->tx_ring[i], MTK_WED_TX_RING_SIZE,
1747 dev->hw->soc->regmap.reset_idx_tx_mask);
1753 if (mtk_wed_is_v3_or_greater(dev->hw)) {
1766 if (!busy && mtk_wed_is_v3_or_greater(dev->hw))
1774 if (mtk_wed_is_v3_or_greater(dev->hw)) {
1803 if (mtk_wed_is_v1(dev->hw))
1831 if (mtk_wed_is_v3_or_greater(dev->hw))
1840 dev->init_done = false;
1841 if (mtk_wed_is_v1(dev->hw))
1849 if (mtk_wed_is_v3_or_greater(dev->hw)) {
1863 ring->desc = dma_alloc_coherent(dev->hw->dev, size * desc_size,
1864 &ring->desc_phys, GFP_KERNEL);
1865 if (!ring->desc)
1866 return -ENOMEM;
1868 ring->desc_size = desc_size;
1869 ring->size = size;
1881 if (idx >= ARRAY_SIZE(dev->rx_wdma))
1882 return -EINVAL;
1884 wdma = &dev->rx_wdma[idx];
1886 dev->hw->soc->wdma_desc_size, true))
1887 return -ENOMEM;
1890 wdma->desc_phys);
1896 wdma->desc_phys);
1909 if (idx >= ARRAY_SIZE(dev->tx_wdma))
1910 return -EINVAL;
1912 wdma = &dev->tx_wdma[idx];
1914 dev->hw->soc->wdma_desc_size, true))
1915 return -ENOMEM;
1917 if (mtk_wed_is_v3_or_greater(dev->hw)) {
1918 struct mtk_wdma_desc *desc = wdma->desc;
1922 desc->buf0 = 0;
1923 desc->ctrl = cpu_to_le32(MTK_WDMA_DESC_CTRL_DMA_DONE);
1924 desc->buf1 = 0;
1925 desc->info = cpu_to_le32(MTK_WDMA_TXD0_DESC_INFO_DMA_DONE);
1927 desc->buf0 = 0;
1928 desc->ctrl = cpu_to_le32(MTK_WDMA_DESC_CTRL_DMA_DONE);
1929 desc->buf1 = 0;
1930 desc->info = cpu_to_le32(MTK_WDMA_TXD1_DESC_INFO_DMA_DONE);
1936 wdma->desc_phys);
1947 wdma->desc_phys);
1963 struct mtk_eth *eth = dev->hw->eth;
1974 skb->protocol = eh->h_proto;
1975 mtk_ppe_check_skb(eth->ppe[dev->hw->index], skb, hash);
1990 if (mtk_wed_is_v1(dev->hw)) {
2000 if (mtk_wed_is_v3_or_greater(dev->hw))
2010 dev->wlan.tx_tbit[0]) |
2012 dev->wlan.tx_tbit[1]));
2019 dev->wlan.txfree_tbit));
2028 dev->wlan.rx_tbit[0]) |
2030 dev->wlan.rx_tbit[1]));
2039 dev->wdma_idx));
2056 if (!mtk_wed_is_v3_or_greater(dev->hw)) {
2082 if (mtk_wed_is_v1(dev->hw)) {
2092 if (mtk_wed_is_v3_or_greater(dev->hw)) {
2128 if (mtk_wed_is_v3_or_greater(dev->hw)) {
2140 struct mtk_wed_ring *ring = &dev->rx_ring[i];
2143 if (!(ring->flags & MTK_WED_RING_CONFIGURED))
2147 dev_err(dev->hw->dev,
2153 dev->wlan.wpdma_rx_glo -
2154 dev->wlan.phy_base) | MTK_WFMDA_RX_DMA_EN;
2156 dev->wlan.wpdma_rx_glo - dev->wlan.phy_base,
2169 if (!mtk_wed_get_rx_capa(dev) || !dev->wlan.hw_rro)
2188 dev->wlan.rro_rx_tbit[0]) |
2190 dev->wlan.rro_rx_tbit[1]));
2200 dev->wlan.rx_pg_tbit[0]) |
2202 dev->wlan.rx_pg_tbit[1]) |
2204 dev->wlan.rx_pg_tbit[2]));
2213 struct mtk_wed_ring *ring = &dev->rx_rro_ring[i];
2215 if (!(ring->flags & MTK_WED_RING_CONFIGURED))
2219 dev_err(dev->hw->dev,
2224 struct mtk_wed_ring *ring = &dev->rx_page_ring[i];
2226 if (!(ring->flags & MTK_WED_RING_CONFIGURED))
2230 dev_err(dev->hw->dev,
2239 struct mtk_wed_ring *ring = &dev->rx_rro_ring[idx];
2241 ring->wpdma = regs;
2246 ring->flags |= MTK_WED_RING_CONFIGURED;
2252 struct mtk_wed_ring *ring = &dev->rx_page_ring[idx];
2254 ring->wpdma = regs;
2259 ring->flags |= MTK_WED_RING_CONFIGURED;
2265 struct mtk_wed_ring *ring = &dev->ind_cmd_ring;
2269 ring->wpdma = regs;
2277 wed_w32(dev, MTK_WED_RRO_CFG0, dev->wlan.phy_base +
2278 dev->wlan.ind_cmd.ack_sn_addr);
2281 dev->wlan.ind_cmd.win_size) |
2283 dev->wlan.ind_cmd.particular_sid));
2287 dev->wlan.ind_cmd.particular_se_phys);
2289 for (i = 0; i < dev->wlan.ind_cmd.se_group_nums; i++) {
2291 dev->wlan.ind_cmd.addr_elem_phys[i] >> 4);
2299 dev_err(dev->hw->dev,
2304 for (i = 0; i < dev->wlan.ind_cmd.particular_sid; i++) {
2316 dev_err(dev->hw->dev,
2334 for (i = 0; i < ARRAY_SIZE(dev->rx_wdma); i++)
2335 if (!dev->rx_wdma[i].desc)
2343 if (mtk_wed_is_v1(dev->hw)) {
2344 u32 val = dev->wlan.wpdma_phys | MTK_PCIE_MIRROR_MAP_EN |
2346 dev->hw->index);
2348 val |= BIT(0) | (BIT(1) * !!dev->hw->index);
2349 regmap_write(dev->hw->mirror, dev->hw->index * 4, val);
2360 if (mtk_wed_is_v3_or_greater(dev->hw)) {
2370 mtk_wed_set_512_support(dev, dev->wlan.wcid_512);
2374 dev->running = true;
2388 if ((dev->wlan.bus_type == MTK_WED_BUS_PCIE &&
2389 pci_domain_nr(dev->wlan.pci_dev->bus) > 1) ||
2391 ret = -ENODEV;
2403 ret = -ENODEV;
2407 device = dev->wlan.bus_type == MTK_WED_BUS_PCIE
2408 ? &dev->wlan.pci_dev->dev
2409 : &dev->wlan.platform_dev->dev;
2411 hw->index, hw->version);
2413 dev->hw = hw;
2414 dev->dev = hw->dev;
2415 dev->irq = hw->irq;
2416 dev->wdma_idx = hw->index;
2417 dev->version = hw->version;
2418 dev->hw->pcie_base = mtk_wed_get_pcie_base(dev);
2420 if (hw->eth->dma_dev == hw->eth->dev &&
2421 of_dma_is_coherent(hw->eth->dev->of_node))
2422 mtk_eth_set_dma_device(hw->eth, hw->dev);
2440 regmap_update_bits(hw->hifsys, HIFSYS_DMA_AG_MAP,
2441 BIT(hw->index), 0);
2443 dev->rev_id = wed_r32(dev, MTK_WED_REV_ID);
2449 dev_err(dev->hw->dev, "failed to attach wed device\n");
2462 struct mtk_wed_ring *ring = &dev->tx_ring[idx];
2476 if (WARN_ON(idx >= ARRAY_SIZE(dev->tx_ring)))
2477 return -EINVAL;
2480 sizeof(*ring->desc), true))
2481 return -ENOMEM;
2485 return -ENOMEM;
2487 ring->reg_base = MTK_WED_RING_TX(idx);
2488 ring->wpdma = regs;
2490 if (mtk_wed_is_v3_or_greater(dev->hw) && idx == 1) {
2507 /* WED -> WPDMA */
2508 wpdma_tx_w32(dev, idx, MTK_WED_RING_OFS_BASE, ring->desc_phys);
2513 ring->desc_phys);
2524 struct mtk_wed_ring *ring = &dev->txfree_ring;
2525 int i, index = mtk_wed_is_v1(dev->hw);
2532 ring->reg_base = MTK_WED_RING_RX(index);
2533 ring->wpdma = regs;
2549 struct mtk_wed_ring *ring = &dev->rx_ring[idx];
2551 if (WARN_ON(idx >= ARRAY_SIZE(dev->rx_ring)))
2552 return -EINVAL;
2555 sizeof(*ring->desc), false))
2556 return -ENOMEM;
2560 return -ENOMEM;
2562 ring->reg_base = MTK_WED_RING_RX_DATA(idx);
2563 ring->wpdma = regs;
2564 ring->flags |= MTK_WED_RING_CONFIGURED;
2566 /* WPDMA -> WED */
2567 wpdma_rx_w32(dev, idx, MTK_WED_RING_OFS_BASE, ring->desc_phys);
2571 ring->desc_phys);
2583 if (mtk_wed_is_v3_or_greater(dev->hw))
2592 if (!dev->hw->num_flows)
2595 pr_err("mtk_wed%d: error status=%08x\n", dev->hw->index, val);
2618 if (!hw || !hw->wed_dev) {
2619 ret = -ENODEV;
2623 if (!hw->wed_dev->wlan.offload_enable)
2626 if (hw->num_flows) {
2627 hw->num_flows++;
2631 ret = hw->wed_dev->wlan.offload_enable(hw->wed_dev);
2633 hw->num_flows++;
2634 mtk_wed_set_ext_int(hw->wed_dev, true);
2648 if (!hw || !hw->wed_dev)
2651 if (!hw->wed_dev->wlan.offload_disable)
2654 if (--hw->num_flows)
2657 hw->wed_dev->wlan.offload_disable(hw->wed_dev);
2658 mtk_wed_set_ext_int(hw->wed_dev, true);
2671 if (!priv || !tc_can_offload(priv->dev))
2672 return -EOPNOTSUPP;
2675 return -EOPNOTSUPP;
2677 hw = priv->hw;
2678 return mtk_flow_offload_cmd(hw->eth, cls, hw->index);
2688 struct mtk_eth *eth = hw->eth;
2691 if (!eth->soc->offload_version)
2692 return -EOPNOTSUPP;
2694 if (f->binder_type != FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS)
2695 return -EOPNOTSUPP;
2698 f->driver_block_list = &block_cb_list;
2700 switch (f->command) {
2702 block_cb = flow_block_cb_lookup(f->block, cb, dev);
2710 return -ENOMEM;
2712 priv->hw = hw;
2713 priv->dev = dev;
2722 list_add_tail(&block_cb->driver_list, &block_cb_list);
2725 block_cb = flow_block_cb_lookup(f->block, cb, dev);
2727 return -ENOENT;
2731 list_del(&block_cb->driver_list);
2732 kfree(block_cb->cb_priv);
2733 block_cb->cb_priv = NULL;
2737 return -EOPNOTSUPP;
2745 struct mtk_wed_hw *hw = wed->hw;
2748 return -EOPNOTSUPP;
2755 return -EOPNOTSUPP;
2784 struct device_node *eth_np = eth->dev->of_node;
2788 int irq;
2797 get_device(&pdev->dev);
2798 irq = platform_get_irq(pdev, 0);
2799 if (irq < 0)
2817 hw->node = np;
2818 hw->regs = regs;
2819 hw->eth = eth;
2820 hw->dev = &pdev->dev;
2821 hw->wdma_phy = wdma_phy;
2822 hw->wdma = wdma;
2823 hw->index = index;
2824 hw->irq = irq;
2825 hw->version = eth->soc->version;
2827 switch (hw->version) {
2829 hw->soc = &mt7986_data;
2832 hw->soc = &mt7988_data;
2836 hw->mirror = syscon_regmap_lookup_by_phandle(eth_np,
2837 "mediatek,pcie-mirror");
2838 hw->hifsys = syscon_regmap_lookup_by_phandle(eth_np,
2840 if (IS_ERR(hw->mirror) || IS_ERR(hw->hifsys)) {
2846 regmap_write(hw->mirror, 0, 0);
2847 regmap_write(hw->mirror, 4, 0);
2849 hw->soc = &mt7622_data;
2864 put_device(&pdev->dev);
2885 debugfs_remove(hw->debugfs_dir);
2886 put_device(hw->dev);
2887 of_node_put(hw->node);