Lines Matching refs:lan966x
30 { .compatible = "microchip,lan966x-switch" },
68 struct lan966x *lan966x)
101 lan966x->regs[iomap->id] = begin[iomap->range] + iomap->offset;
110 struct lan966x *lan966x = port->lan966x;
113 for (p = 0; p < lan966x->num_phys_ports; ++p) {
114 port = lan966x->ports[p];
128 struct lan966x *lan966x = port->lan966x;
136 ret = lan966x_mac_cpu_learn(lan966x, addr->sa_data, HOST_PVID);
147 ret = lan966x_mac_cpu_forget(lan966x, dev->dev_addr, HOST_PVID);
172 struct lan966x *lan966x = port->lan966x;
184 lan966x, ANA_PORT_CFG(port->chip_port));
208 static int lan966x_port_inj_status(struct lan966x *lan966x)
210 return lan_rd(lan966x, QS_INJ_STATUS);
213 static int lan966x_port_inj_ready(struct lan966x *lan966x, u8 grp)
217 if (lan_rd(lan966x, QS_INJ_STATUS) & QS_INJ_STATUS_FIFO_RDY_SET(BIT(grp)))
220 return readx_poll_timeout_atomic(lan966x_port_inj_status, lan966x, val,
230 struct lan966x *lan966x = port->lan966x;
236 val = lan_rd(lan966x, QS_INJ_STATUS);
244 lan966x, QS_INJ_CTRL(grp));
249 err = lan966x_port_inj_ready(lan966x, grp);
253 lan_wr((__force u32)ifh[i], lan966x, QS_INJ_WR(grp));
261 err = lan966x_port_inj_ready(lan966x, grp);
265 lan_wr(((u32 *)skb->data)[i], lan966x, QS_INJ_WR(grp));
271 err = lan966x_port_inj_ready(lan966x, grp);
275 lan_wr(0, lan966x, QS_INJ_WR(grp));
284 lan966x, QS_INJ_CTRL(grp));
287 lan_wr(0, lan966x, QS_INJ_WR(grp));
370 struct lan966x *lan966x = port->lan966x;
382 if (port->lan966x->ptp && skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) {
392 spin_lock(&lan966x->tx_lock);
393 if (port->lan966x->fdma)
397 spin_unlock(&lan966x->tx_lock);
405 struct lan966x *lan966x = port->lan966x;
410 lan966x, DEV_MAC_MAXLEN_CFG(port->chip_port));
413 if (!lan966x->fdma)
416 err = lan966x_fdma_change_mtu(lan966x);
419 lan966x, DEV_MAC_MAXLEN_CFG(port->chip_port));
429 struct lan966x *lan966x = port->lan966x;
431 return lan966x_mac_forget(lan966x, addr, HOST_PVID, ENTRYTYPE_LOCKED);
437 struct lan966x *lan966x = port->lan966x;
439 return lan966x_mac_cpu_learn(lan966x, addr, HOST_PVID);
451 struct lan966x *lan966x = port->lan966x;
453 ppid->id_len = sizeof(lan966x->base_mac);
454 memcpy(&ppid->id, &lan966x->base_mac, ppid->id_len);
464 if (!port->lan966x->ptp)
483 if (cfg->source == HWTSTAMP_SOURCE_NETDEV && !port->lan966x->ptp)
524 bool lan966x_hw_offload(struct lan966x *lan966x, u32 port, struct sk_buff *skb)
532 val = lan_rd(lan966x, ANA_CPU_FWD_CFG(port));
556 static int lan966x_port_xtr_status(struct lan966x *lan966x, u8 grp)
558 return lan_rd(lan966x, QS_XTR_RD(grp));
561 static int lan966x_port_xtr_ready(struct lan966x *lan966x, u8 grp)
568 lan966x, grp);
571 static int lan966x_rx_frame_word(struct lan966x *lan966x, u8 grp, u32 *rval)
577 val = lan_rd(lan966x, QS_XTR_RD(grp));
579 err = lan966x_port_xtr_ready(lan966x, grp);
593 val = lan_rd(lan966x, QS_XTR_RD(grp));
595 *rval = lan_rd(lan966x, QS_XTR_RD(grp));
601 *rval = lan_rd(lan966x, QS_XTR_RD(grp));
647 struct lan966x *lan966x = args;
650 if (!(lan_rd(lan966x, QS_XTR_DATA_PRESENT) & BIT(grp)))
663 err = lan966x_rx_frame_word(lan966x, grp, &ifh[i]);
674 WARN_ON(src_port >= lan966x->num_phys_ports);
676 dev = lan966x->ports[src_port]->dev;
687 sz = lan966x_rx_frame_word(lan966x, grp, &val);
698 sz = lan966x_rx_frame_word(lan966x, grp, &val);
712 lan966x_ptp_rxtstamp(lan966x, skb, src_port, timestamp);
715 if (lan966x->bridge_mask & BIT(src_port)) {
719 if (!lan966x_hw_offload(lan966x, src_port, skb))
731 lan_rd(lan966x, QS_XTR_RD(grp));
733 } while (lan_rd(lan966x, QS_XTR_DATA_PRESENT) & BIT(grp));
740 struct lan966x *lan966x = args;
742 return lan966x_mac_irq_handler(lan966x);
745 static void lan966x_cleanup_ports(struct lan966x *lan966x)
750 for (p = 0; p < lan966x->num_phys_ports; p++) {
751 port = lan966x->ports[p];
759 if (lan966x->fdma && lan966x->fdma_ndev == port->dev)
760 lan966x_fdma_netdev_deinit(lan966x, port->dev);
774 disable_irq(lan966x->xtr_irq);
775 lan966x->xtr_irq = -ENXIO;
777 if (lan966x->ana_irq > 0) {
778 disable_irq(lan966x->ana_irq);
779 lan966x->ana_irq = -ENXIO;
782 if (lan966x->fdma)
783 devm_free_irq(lan966x->dev, lan966x->fdma_irq, lan966x);
785 if (lan966x->ptp_irq > 0)
786 devm_free_irq(lan966x->dev, lan966x->ptp_irq, lan966x);
788 if (lan966x->ptp_ext_irq > 0)
789 devm_free_irq(lan966x->dev, lan966x->ptp_ext_irq, lan966x);
792 static int lan966x_probe_port(struct lan966x *lan966x, u32 p,
801 if (p >= lan966x->num_phys_ports)
804 dev = devm_alloc_etherdev_mqs(lan966x->dev,
810 SET_NETDEV_DEV(dev, lan966x->dev);
813 port->lan966x = lan966x;
815 lan966x->ports[p] = port;
828 eth_hw_addr_gen(dev, lan966x->base_mac, p + 1);
830 lan966x_mac_learn(lan966x, PGID_CPU, dev->dev_addr, HOST_PVID,
868 if (lan966x->fdma)
875 dev_err(lan966x->dev, "register_netdev failed\n");
887 static void lan966x_init(struct lan966x *lan966x)
892 lan966x_mac_init(lan966x);
894 lan966x_vlan_init(lan966x);
897 lan_wr(lan_rd(lan966x, QS_XTR_FLUSH) |
899 lan966x, QS_XTR_FLUSH);
905 lan_wr(lan_rd(lan966x, QS_XTR_FLUSH) &
907 lan966x, QS_XTR_FLUSH);
913 lan966x, ANA_AUTOAGE);
918 lan966x, ANA_ADVLEARN);
920 /* Setup frame ageing - "2 sec" - The unit is 6.5 us on lan966x */
923 lan966x, SYS_FRM_AGING);
926 lan_wr(0, lan966x, QSYS_CPU_GROUP_MAP);
931 lan_wr(QS_XTR_GRP_CFG_MODE_SET(lan966x->fdma ? 2 : 1) |
933 lan966x, QS_XTR_GRP_CFG(0));
936 lan_wr(QS_INJ_GRP_CFG_MODE_SET(lan966x->fdma ? 2 : 1) |
938 lan966x, QS_INJ_GRP_CFG(0));
942 lan966x, QS_INJ_CTRL(0));
947 lan966x, SYS_PORT_MODE(CPU_PORT));
954 lan966x, ANA_FLOODING_IPMC);
964 lan966x, ANA_FLOODING(i));
970 lan966x, ANA_PGID_CFG(i));
972 for (p = 0; p < lan966x->num_phys_ports; p++) {
976 lan966x, ANA_PGID(p + PGID_SRC));
981 lan_wr(0xffff, lan966x, ANA_CPU_FWD_BPDU_CFG(p));
986 lan_wr(1500 / 64, lan966x, QSYS_RES_CFG(i));
987 lan_wr(1500 / 64, lan966x, QSYS_RES_CFG(512 + i));
994 lan966x, QSYS_SW_PORT_MODE(CPU_PORT));
999 lan966x, ANA_PGID(CPU_PORT));
1002 lan966x, ANA_PGID(PGID_CPU));
1005 lan_rmw(GENMASK(lan966x->num_phys_ports - 1, 0),
1007 lan966x, ANA_PGID(PGID_MC));
1010 lan_rmw(GENMASK(lan966x->num_phys_ports - 1, 0),
1012 lan966x, ANA_PGID(PGID_MCIPV4));
1014 lan_rmw(GENMASK(lan966x->num_phys_ports - 1, 0),
1016 lan966x, ANA_PGID(PGID_MCIPV6));
1019 lan_rmw(GENMASK(lan966x->num_phys_ports - 1, 0),
1021 lan966x, ANA_PGID(PGID_UC));
1024 lan_rmw(ANA_PGID_PGID_SET(BIT(CPU_PORT) | GENMASK(lan966x->num_phys_ports - 1, 0)),
1026 lan966x, ANA_PGID(PGID_BC));
1029 lan966x, REW_PORT_CFG(CPU_PORT));
1033 lan966x, ANA_ANAINTR);
1035 spin_lock_init(&lan966x->tx_lock);
1037 lan966x_taprio_init(lan966x);
1040 static int lan966x_ram_init(struct lan966x *lan966x)
1042 return lan_rd(lan966x, SYS_RAM_INIT);
1045 static int lan966x_reset_switch(struct lan966x *lan966x)
1051 switch_reset = devm_reset_control_get_optional_shared(lan966x->dev,
1054 return dev_err_probe(lan966x->dev, PTR_ERR(switch_reset),
1066 if (lan_rd(lan966x, SYS_RESET_CFG) & SYS_RESET_CFG_CORE_ENA)
1069 lan_wr(SYS_RESET_CFG_CORE_ENA_SET(0), lan966x, SYS_RESET_CFG);
1070 lan_wr(SYS_RAM_INIT_RAM_INIT_SET(1), lan966x, SYS_RAM_INIT);
1071 ret = readx_poll_timeout(lan966x_ram_init, lan966x,
1077 lan_wr(SYS_RESET_CFG_CORE_ENA_SET(1), lan966x, SYS_RESET_CFG);
1085 struct lan966x *lan966x;
1089 lan966x = devm_kzalloc(&pdev->dev, sizeof(*lan966x), GFP_KERNEL);
1090 if (!lan966x)
1093 platform_set_drvdata(pdev, lan966x);
1094 lan966x->dev = &pdev->dev;
1097 ether_addr_copy(lan966x->base_mac, mac_addr);
1100 eth_random_addr(lan966x->base_mac);
1101 lan966x->base_mac[5] &= 0xf0;
1104 err = lan966x_create_targets(pdev, lan966x);
1109 err = lan966x_reset_switch(lan966x);
1113 lan966x->num_phys_ports = NUM_PHYS_PORTS;
1114 lan966x->ports = devm_kcalloc(&pdev->dev, lan966x->num_phys_ports,
1117 if (!lan966x->ports)
1121 lan966x->shared_queue_sz = LAN966X_BUFFER_MEMORY;
1124 lan966x->xtr_irq = platform_get_irq_byname(pdev, "xtr");
1125 if (lan966x->xtr_irq < 0)
1126 return lan966x->xtr_irq;
1128 err = devm_request_threaded_irq(&pdev->dev, lan966x->xtr_irq, NULL,
1130 "frame extraction", lan966x);
1136 lan966x->ana_irq = platform_get_irq_byname(pdev, "ana");
1137 if (lan966x->ana_irq > 0) {
1138 err = devm_request_threaded_irq(&pdev->dev, lan966x->ana_irq, NULL,
1140 "ana irq", lan966x);
1145 lan966x->ptp_irq = platform_get_irq_byname(pdev, "ptp");
1146 if (lan966x->ptp_irq > 0) {
1147 err = devm_request_threaded_irq(&pdev->dev, lan966x->ptp_irq, NULL,
1149 "ptp irq", lan966x);
1153 lan966x->ptp = 1;
1156 lan966x->fdma_irq = platform_get_irq_byname(pdev, "fdma");
1157 if (lan966x->fdma_irq > 0) {
1158 err = devm_request_irq(&pdev->dev, lan966x->fdma_irq,
1160 "fdma irq", lan966x);
1164 lan966x->fdma = true;
1167 if (lan966x->ptp) {
1168 lan966x->ptp_ext_irq = platform_get_irq_byname(pdev, "ptp-ext");
1169 if (lan966x->ptp_ext_irq > 0) {
1171 lan966x->ptp_ext_irq, NULL,
1174 "ptp-ext irq", lan966x);
1186 lan966x->debugfs_root = debugfs_create_dir("lan966x", NULL);
1189 lan966x_init(lan966x);
1190 lan966x_stats_init(lan966x);
1202 err = lan966x_probe_port(lan966x, p, phy_mode, portnp);
1207 lan966x->ports[p]->config.portmode = phy_mode;
1208 lan966x->ports[p]->fwnode = fwnode_handle_get(portnp);
1210 serdes = devm_of_phy_optional_get(lan966x->dev,
1216 lan966x->ports[p]->serdes = serdes;
1218 lan966x_port_init(lan966x->ports[p]);
1219 err = lan966x_xdp_port_init(lan966x->ports[p]);
1226 lan966x_mdb_init(lan966x);
1227 err = lan966x_fdb_init(lan966x);
1231 err = lan966x_ptp_init(lan966x);
1235 err = lan966x_fdma_init(lan966x);
1239 err = lan966x_vcap_init(lan966x);
1243 lan966x_dcb_init(lan966x);
1248 lan966x_fdma_deinit(lan966x);
1251 lan966x_ptp_deinit(lan966x);
1254 lan966x_fdb_deinit(lan966x);
1260 lan966x_cleanup_ports(lan966x);
1262 cancel_delayed_work_sync(&lan966x->stats_work);
1263 destroy_workqueue(lan966x->stats_queue);
1264 mutex_destroy(&lan966x->stats_lock);
1266 debugfs_remove_recursive(lan966x->debugfs_root);
1273 struct lan966x *lan966x = platform_get_drvdata(pdev);
1275 lan966x_taprio_deinit(lan966x);
1276 lan966x_vcap_deinit(lan966x);
1277 lan966x_fdma_deinit(lan966x);
1278 lan966x_cleanup_ports(lan966x);
1280 cancel_delayed_work_sync(&lan966x->stats_work);
1281 destroy_workqueue(lan966x->stats_queue);
1282 mutex_destroy(&lan966x->stats_lock);
1284 lan966x_mac_purge_entries(lan966x);
1285 lan966x_mdb_deinit(lan966x);
1286 lan966x_fdb_deinit(lan966x);
1287 lan966x_ptp_deinit(lan966x);
1289 debugfs_remove_recursive(lan966x->debugfs_root);
1296 .name = "lan966x-switch",