Lines Matching +full:ethernet +full:- +full:pse

1 // SPDX-License-Identifier: ISC
18 MODULE_PARM_DESC(wed_enable, "Enable Wireless Ethernet Dispatch support");
283 { 0x820c8000, 0x0c000, 0x02000 }, /* WF_UMAC_TOP (PSE) */
323 { 0x820c8000, 0x0c000, 0x02000 }, /* WF_UMAC_TOP (PSE) */
370 { 0x820c8000, 0x40c000, 0x02000 }, /* WF_UMAC_TOP (PSE) */
420 if (is_mt798x(&dev->mt76)) in mt7915_reg_map_l1()
423 l1_remap = is_mt7915(&dev->mt76) ? in mt7915_reg_map_l1()
426 dev->bus_ops->rmw(&dev->mt76, l1_remap, in mt7915_reg_map_l1()
430 dev->bus_ops->rr(&dev->mt76, l1_remap); in mt7915_reg_map_l1()
439 if (is_mt7915(&dev->mt76)) { in mt7915_reg_map_l2()
443 dev->bus_ops->rmw(&dev->mt76, MT_HIF_REMAP_L2, in mt7915_reg_map_l2()
448 dev->bus_ops->rr(&dev->mt76, MT_HIF_REMAP_L2); in mt7915_reg_map_l2()
450 u32 ofs = is_mt798x(&dev->mt76) ? 0x400000 : 0; in mt7915_reg_map_l2()
455 dev->bus_ops->rmw(&dev->mt76, MT_HIF_REMAP_L2_MT7916 + ofs, in mt7915_reg_map_l2()
460 dev->bus_ops->rr(&dev->mt76, MT_HIF_REMAP_L2_MT7916 + ofs); in mt7915_reg_map_l2()
475 if (!dev->reg.map) { in __mt7915_reg_addr()
476 dev_err(dev->mt76.dev, "err: reg_map is null\n"); in __mt7915_reg_addr()
480 for (i = 0; i < dev->reg.map_size; i++) { in __mt7915_reg_addr()
483 if (addr < dev->reg.map[i].phys) in __mt7915_reg_addr()
486 ofs = addr - dev->reg.map[i].phys; in __mt7915_reg_addr()
487 if (ofs >= dev->reg.map[i].size) in __mt7915_reg_addr()
490 return dev->reg.map[i].maps + ofs; in __mt7915_reg_addr()
503 if (dev_is_pci(dev->mt76.dev) && in __mt7915_reg_remap_addr()
510 addr = addr - MT_INFRA_MCU_START + MT_INFRA_BASE; in __mt7915_reg_remap_addr()
523 memcpy_fromio(buf, dev->mt76.mmio.regs + addr, len); in mt7915_memcpy_fromio()
527 spin_lock_bh(&dev->reg_lock); in mt7915_memcpy_fromio()
528 memcpy_fromio(buf, dev->mt76.mmio.regs + in mt7915_memcpy_fromio()
530 spin_unlock_bh(&dev->reg_lock); in mt7915_memcpy_fromio()
539 return dev->bus_ops->rr(mdev, addr); in mt7915_rr()
541 spin_lock_bh(&dev->reg_lock); in mt7915_rr()
542 val = dev->bus_ops->rr(mdev, __mt7915_reg_remap_addr(dev, offset)); in mt7915_rr()
543 spin_unlock_bh(&dev->reg_lock); in mt7915_rr()
554 dev->bus_ops->wr(mdev, addr, val); in mt7915_wr()
558 spin_lock_bh(&dev->reg_lock); in mt7915_wr()
559 dev->bus_ops->wr(mdev, __mt7915_reg_remap_addr(dev, offset), val); in mt7915_wr()
560 spin_unlock_bh(&dev->reg_lock); in mt7915_wr()
569 return dev->bus_ops->rmw(mdev, addr, mask, val); in mt7915_rmw()
571 spin_lock_bh(&dev->reg_lock); in mt7915_rmw()
572 val = dev->bus_ops->rmw(mdev, __mt7915_reg_remap_addr(dev, offset), mask, val); in mt7915_rmw()
573 spin_unlock_bh(&dev->reg_lock); in mt7915_rmw()
585 spin_lock_bh(&dev->mt76.token_lock); in mt7915_mmio_wed_offload_enable()
586 dev->mt76.token_size = wed->wlan.token_start; in mt7915_mmio_wed_offload_enable()
587 spin_unlock_bh(&dev->mt76.token_lock); in mt7915_mmio_wed_offload_enable()
589 return !wait_event_timeout(dev->mt76.tx_wait, in mt7915_mmio_wed_offload_enable()
590 !dev->mt76.wed_token_count, HZ); in mt7915_mmio_wed_offload_enable()
599 spin_lock_bh(&dev->mt76.token_lock); in mt7915_mmio_wed_offload_disable()
600 dev->mt76.token_size = MT7915_TOKEN_SIZE; in mt7915_mmio_wed_offload_disable()
601 spin_unlock_bh(&dev->mt76.token_lock); in mt7915_mmio_wed_offload_disable()
610 for (i = 0; i < dev->mt76.rx_token_size; i++) { in mt7915_mmio_wed_release_rx_buf()
613 t = mt76_rx_token_release(&dev->mt76, i); in mt7915_mmio_wed_release_rx_buf()
614 if (!t || !t->ptr) in mt7915_mmio_wed_release_rx_buf()
617 mt76_put_page_pool_buf(t->ptr, false); in mt7915_mmio_wed_release_rx_buf()
618 t->ptr = NULL; in mt7915_mmio_wed_release_rx_buf()
620 mt76_put_rxwi(&dev->mt76, t); in mt7915_mmio_wed_release_rx_buf()
623 mt76_free_pending_rxwi(&dev->mt76); in mt7915_mmio_wed_release_rx_buf()
628 struct mtk_rxbm_desc *desc = wed->rx_buf_ring.desc; in mt7915_mmio_wed_init_rx_buf()
635 q = &dev->mt76.q_rx[MT_RXQ_MAIN]; in mt7915_mmio_wed_init_rx_buf()
636 len = SKB_WITH_OVERHEAD(q->buf_size); in mt7915_mmio_wed_init_rx_buf()
645 t = mt76_get_rxwi(&dev->mt76); in mt7915_mmio_wed_init_rx_buf()
649 buf = mt76_get_page_pool_buf(q, &offset, q->buf_size); in mt7915_mmio_wed_init_rx_buf()
654 dir = page_pool_get_dma_dir(q->page_pool); in mt7915_mmio_wed_init_rx_buf()
655 dma_sync_single_for_device(dev->mt76.dma_dev, addr, len, dir); in mt7915_mmio_wed_init_rx_buf()
657 desc->buf0 = cpu_to_le32(addr); in mt7915_mmio_wed_init_rx_buf()
658 token = mt76_rx_token_consume(&dev->mt76, buf, t, addr); in mt7915_mmio_wed_init_rx_buf()
664 desc->token |= cpu_to_le32(FIELD_PREP(MT_DMA_CTL_TOKEN, in mt7915_mmio_wed_init_rx_buf()
673 mt76_put_rxwi(&dev->mt76, t); in mt7915_mmio_wed_init_rx_buf()
675 return -ENOMEM; in mt7915_mmio_wed_init_rx_buf()
681 int idx = le16_to_cpu(stats->wlan_idx); in mt7915_mmio_wed_update_rx_stats()
692 wcid = rcu_dereference(dev->mt76.wcid[idx]); in mt7915_mmio_wed_update_rx_stats()
694 wcid->stats.rx_bytes += le32_to_cpu(stats->rx_byte_cnt); in mt7915_mmio_wed_update_rx_stats()
695 wcid->stats.rx_packets += le32_to_cpu(stats->rx_pkt_cnt); in mt7915_mmio_wed_update_rx_stats()
696 wcid->stats.rx_errors += le32_to_cpu(stats->rx_err_cnt); in mt7915_mmio_wed_update_rx_stats()
697 wcid->stats.rx_drops += le32_to_cpu(stats->rx_drop_cnt); in mt7915_mmio_wed_update_rx_stats()
707 struct mt76_phy *mphy = &dev->mphy; in mt7915_mmio_wed_reset()
712 if (test_and_set_bit(MT76_STATE_WED_RESET, &mphy->state)) in mt7915_mmio_wed_reset()
713 return -EBUSY; in mt7915_mmio_wed_reset()
716 mphy->band_idx); in mt7915_mmio_wed_reset()
721 if (!wait_for_completion_timeout(&mdev->mmio.wed_reset, 20 * HZ)) { in mt7915_mmio_wed_reset()
722 dev_err(mdev->dev, "wed reset timeout\n"); in mt7915_mmio_wed_reset()
723 ret = -ETIMEDOUT; in mt7915_mmio_wed_reset()
727 clear_bit(MT76_STATE_WED_RESET, &mphy->state); in mt7915_mmio_wed_reset()
736 complete(&dev->mmio.wed_reset_complete); in mt7915_mmio_wed_reset_complete()
744 struct mtk_wed_device *wed = &dev->mt76.mmio.wed; in mt7915_mmio_wed_init()
753 wed->wlan.pci_dev = pci_dev; in mt7915_mmio_wed_init()
754 wed->wlan.bus_type = MTK_WED_BUS_PCIE; in mt7915_mmio_wed_init()
755 wed->wlan.base = devm_ioremap(dev->mt76.dev, in mt7915_mmio_wed_init()
758 wed->wlan.phy_base = pci_resource_start(pci_dev, 0); in mt7915_mmio_wed_init()
759 wed->wlan.wpdma_int = pci_resource_start(pci_dev, 0) + in mt7915_mmio_wed_init()
761 wed->wlan.wpdma_mask = pci_resource_start(pci_dev, 0) + in mt7915_mmio_wed_init()
763 wed->wlan.wpdma_phys = pci_resource_start(pci_dev, 0) + in mt7915_mmio_wed_init()
765 wed->wlan.wpdma_tx = pci_resource_start(pci_dev, 0) + in mt7915_mmio_wed_init()
767 wed->wlan.wpdma_txfree = pci_resource_start(pci_dev, 0) + in mt7915_mmio_wed_init()
769 wed->wlan.wpdma_rx_glo = pci_resource_start(pci_dev, 0) + in mt7915_mmio_wed_init()
771 wed->wlan.wpdma_rx = pci_resource_start(pci_dev, 0) + in mt7915_mmio_wed_init()
781 wed->wlan.platform_dev = plat_dev; in mt7915_mmio_wed_init()
782 wed->wlan.bus_type = MTK_WED_BUS_AXI; in mt7915_mmio_wed_init()
783 wed->wlan.base = devm_ioremap(dev->mt76.dev, res->start, in mt7915_mmio_wed_init()
785 wed->wlan.phy_base = res->start; in mt7915_mmio_wed_init()
786 wed->wlan.wpdma_int = res->start + MT_INT_SOURCE_CSR; in mt7915_mmio_wed_init()
787 wed->wlan.wpdma_mask = res->start + MT_INT_MASK_CSR; in mt7915_mmio_wed_init()
788 wed->wlan.wpdma_tx = res->start + MT_TXQ_WED_RING_BASE; in mt7915_mmio_wed_init()
789 wed->wlan.wpdma_txfree = res->start + MT_RXQ_WED_RING_BASE; in mt7915_mmio_wed_init()
790 wed->wlan.wpdma_rx_glo = res->start + MT_WPDMA_GLO_CFG; in mt7915_mmio_wed_init()
791 wed->wlan.wpdma_rx = res->start + MT_RXQ_WED_DATA_RING_BASE; in mt7915_mmio_wed_init()
793 wed->wlan.nbuf = MT7915_HW_TOKEN_SIZE; in mt7915_mmio_wed_init()
794 wed->wlan.tx_tbit[0] = is_mt7915(&dev->mt76) ? 4 : 30; in mt7915_mmio_wed_init()
795 wed->wlan.tx_tbit[1] = is_mt7915(&dev->mt76) ? 5 : 31; in mt7915_mmio_wed_init()
796 wed->wlan.txfree_tbit = is_mt798x(&dev->mt76) ? 2 : 1; in mt7915_mmio_wed_init()
797 wed->wlan.token_start = MT7915_TOKEN_SIZE - wed->wlan.nbuf; in mt7915_mmio_wed_init()
798 wed->wlan.wcid_512 = !is_mt7915(&dev->mt76); in mt7915_mmio_wed_init()
800 wed->wlan.rx_nbuf = 65536; in mt7915_mmio_wed_init()
801 wed->wlan.rx_npkt = MT7915_WED_RX_TOKEN_SIZE; in mt7915_mmio_wed_init()
802 wed->wlan.rx_size = SKB_WITH_OVERHEAD(MT_RX_BUF_SIZE); in mt7915_mmio_wed_init()
803 if (is_mt7915(&dev->mt76)) { in mt7915_mmio_wed_init()
804 wed->wlan.rx_tbit[0] = 16; in mt7915_mmio_wed_init()
805 wed->wlan.rx_tbit[1] = 17; in mt7915_mmio_wed_init()
806 } else if (is_mt798x(&dev->mt76)) { in mt7915_mmio_wed_init()
807 wed->wlan.rx_tbit[0] = 22; in mt7915_mmio_wed_init()
808 wed->wlan.rx_tbit[1] = 23; in mt7915_mmio_wed_init()
810 wed->wlan.rx_tbit[0] = 18; in mt7915_mmio_wed_init()
811 wed->wlan.rx_tbit[1] = 19; in mt7915_mmio_wed_init()
814 wed->wlan.init_buf = mt7915_wed_init_buf; in mt7915_mmio_wed_init()
815 wed->wlan.offload_enable = mt7915_mmio_wed_offload_enable; in mt7915_mmio_wed_init()
816 wed->wlan.offload_disable = mt7915_mmio_wed_offload_disable; in mt7915_mmio_wed_init()
817 wed->wlan.init_rx_buf = mt7915_mmio_wed_init_rx_buf; in mt7915_mmio_wed_init()
818 wed->wlan.release_rx_buf = mt7915_mmio_wed_release_rx_buf; in mt7915_mmio_wed_init()
819 wed->wlan.update_wo_rx_stats = mt7915_mmio_wed_update_rx_stats; in mt7915_mmio_wed_init()
820 wed->wlan.reset = mt7915_mmio_wed_reset; in mt7915_mmio_wed_init()
821 wed->wlan.reset_complete = mt7915_mmio_wed_reset_complete; in mt7915_mmio_wed_init()
823 dev->mt76.rx_token_size = wed->wlan.rx_npkt; in mt7915_mmio_wed_init()
828 *irq = wed->irq; in mt7915_mmio_wed_init()
829 dev->mt76.dma_dev = wed->dev; in mt7915_mmio_wed_init()
831 ret = dma_set_mask(wed->dev, DMA_BIT_MASK(32)); in mt7915_mmio_wed_init()
849 mt76_mmio_init(&dev->mt76, mem_base); in mt7915_mmio_init()
850 spin_lock_init(&dev->reg_lock); in mt7915_mmio_init()
854 dev->reg.reg_rev = mt7915_reg; in mt7915_mmio_init()
855 dev->reg.offs_rev = mt7915_offs; in mt7915_mmio_init()
856 dev->reg.map = mt7915_reg_map; in mt7915_mmio_init()
857 dev->reg.map_size = ARRAY_SIZE(mt7915_reg_map); in mt7915_mmio_init()
860 dev->reg.reg_rev = mt7916_reg; in mt7915_mmio_init()
861 dev->reg.offs_rev = mt7916_offs; in mt7915_mmio_init()
862 dev->reg.map = mt7916_reg_map; in mt7915_mmio_init()
863 dev->reg.map_size = ARRAY_SIZE(mt7916_reg_map); in mt7915_mmio_init()
867 dev->reg.reg_rev = mt7986_reg; in mt7915_mmio_init()
868 dev->reg.offs_rev = mt7916_offs; in mt7915_mmio_init()
869 dev->reg.map = mt7986_reg_map; in mt7915_mmio_init()
870 dev->reg.map_size = ARRAY_SIZE(mt7986_reg_map); in mt7915_mmio_init()
873 return -EINVAL; in mt7915_mmio_init()
876 dev->bus_ops = dev->mt76.bus; in mt7915_mmio_init()
877 bus_ops = devm_kmemdup(dev->mt76.dev, dev->bus_ops, sizeof(*bus_ops), in mt7915_mmio_init()
880 return -ENOMEM; in mt7915_mmio_init()
882 bus_ops->rr = mt7915_rr; in mt7915_mmio_init()
883 bus_ops->wr = mt7915_wr; in mt7915_mmio_init()
884 bus_ops->rmw = mt7915_rmw; in mt7915_mmio_init()
885 dev->mt76.bus = bus_ops; in mt7915_mmio_init()
887 mdev->rev = (device_id << 16) | in mt7915_mmio_init()
889 dev_dbg(mdev->dev, "ASIC revision: %04x\n", mdev->rev); in mt7915_mmio_init()
898 struct mt76_dev *mdev = &dev->mt76; in mt7915_dual_hif_set_irq_mask()
901 spin_lock_irqsave(&mdev->mmio.irq_lock, flags); in mt7915_dual_hif_set_irq_mask()
903 mdev->mmio.irqmask &= ~clear; in mt7915_dual_hif_set_irq_mask()
904 mdev->mmio.irqmask |= set; in mt7915_dual_hif_set_irq_mask()
907 if (mtk_wed_device_active(&mdev->mmio.wed)) in mt7915_dual_hif_set_irq_mask()
908 mtk_wed_device_irq_set_mask(&mdev->mmio.wed, in mt7915_dual_hif_set_irq_mask()
909 mdev->mmio.irqmask); in mt7915_dual_hif_set_irq_mask()
911 mt76_wr(dev, MT_INT_MASK_CSR, mdev->mmio.irqmask); in mt7915_dual_hif_set_irq_mask()
912 mt76_wr(dev, MT_INT1_MASK_CSR, mdev->mmio.irqmask); in mt7915_dual_hif_set_irq_mask()
915 spin_unlock_irqrestore(&mdev->mmio.irq_lock, flags); in mt7915_dual_hif_set_irq_mask()
926 /* TODO: support 2/4/6/8 MSI-X vectors */
930 struct mtk_wed_device *wed = &dev->mt76.mmio.wed; in mt7915_irq_tasklet()
935 if (dev->hif2) in mt7915_irq_tasklet()
937 intr = mtk_wed_device_irq_get(wed, dev->mt76.mmio.irqmask); in mt7915_irq_tasklet()
940 if (dev->hif2) in mt7915_irq_tasklet()
944 intr &= dev->mt76.mmio.irqmask; in mt7915_irq_tasklet()
948 if (dev->hif2) { in mt7915_irq_tasklet()
950 intr1 &= dev->mt76.mmio.irqmask; in mt7915_irq_tasklet()
956 trace_dev_irq(&dev->mt76, intr, dev->mt76.mmio.irqmask); in mt7915_irq_tasklet()
965 napi_schedule(&dev->mt76.tx_napi); in mt7915_irq_tasklet()
968 napi_schedule(&dev->mt76.napi[MT_RXQ_MAIN]); in mt7915_irq_tasklet()
971 napi_schedule(&dev->mt76.napi[MT_RXQ_BAND1]); in mt7915_irq_tasklet()
974 napi_schedule(&dev->mt76.napi[MT_RXQ_MCU]); in mt7915_irq_tasklet()
977 napi_schedule(&dev->mt76.napi[MT_RXQ_MCU_WA]); in mt7915_irq_tasklet()
979 if (!is_mt7915(&dev->mt76) && in mt7915_irq_tasklet()
981 napi_schedule(&dev->mt76.napi[MT_RXQ_MAIN_WA]); in mt7915_irq_tasklet()
984 napi_schedule(&dev->mt76.napi[MT_RXQ_BAND1_WA]); in mt7915_irq_tasklet()
991 dev->recovery.state = val; in mt7915_irq_tasklet()
1000 struct mtk_wed_device *wed = &dev->mt76.mmio.wed; in mt7915_irq_handler()
1007 if (dev->hif2) in mt7915_irq_handler()
1010 if (!test_bit(MT76_STATE_INITIALIZED, &dev->mphy.state)) in mt7915_irq_handler()
1013 tasklet_schedule(&dev->mt76.irq_tasklet); in mt7915_irq_handler()
1045 return ERR_PTR(-ENOMEM); in mt7915_mmio_probe()
1053 tasklet_setup(&mdev->irq_tasklet, mt7915_irq_tasklet); in mt7915_mmio_probe()
1058 mt76_free_device(&dev->mt76); in mt7915_mmio_probe()