Lines Matching refs:sparx5
217 static int sparx5_create_targets(struct sparx5 *sparx5) in sparx5_create_targets() argument
234 iores[idx] = platform_get_resource(sparx5->pdev, IORESOURCE_MEM, in sparx5_create_targets()
237 dev_err(sparx5->dev, "Invalid resource\n"); in sparx5_create_targets()
240 iomem[idx] = devm_ioremap(sparx5->dev, in sparx5_create_targets()
244 dev_err(sparx5->dev, "Unable to get switch registers: %s\n", in sparx5_create_targets()
253 sparx5->regs[iomap->id] = begin[iomap->range] + iomap->offset; in sparx5_create_targets()
258 static int sparx5_create_port(struct sparx5 *sparx5, in sparx5_create_port() argument
266 ndev = sparx5_create_netdev(sparx5, config->portno); in sparx5_create_port()
268 dev_err(sparx5->dev, "Could not create net device: %02u\n", in sparx5_create_port()
285 sparx5->ports[config->portno] = spx5_port; in sparx5_create_port()
287 err = sparx5_port_init(sparx5, spx5_port, &config->conf); in sparx5_create_port()
289 dev_err(sparx5->dev, "port init failed\n"); in sparx5_create_port()
295 sparx5_vlan_port_setup(sparx5, spx5_port->portno); in sparx5_create_port()
340 static int sparx5_init_ram(struct sparx5 *s5) in sparx5_init_ram()
384 static int sparx5_init_switchcore(struct sparx5 *sparx5) in sparx5_init_switchcore() argument
391 sparx5, in sparx5_init_switchcore()
396 sparx5, in sparx5_init_switchcore()
400 value = spx5_rd(sparx5, HSCH_RESET_CFG); in sparx5_init_switchcore()
402 err = sparx5_init_ram(sparx5); in sparx5_init_switchcore()
408 spx5_wr(ANA_AC_STAT_RESET_RESET_SET(1), sparx5, ANA_AC_STAT_RESET); in sparx5_init_switchcore()
409 spx5_wr(ASM_STAT_CFG_STAT_CNT_CLR_SHOT_SET(1), sparx5, ASM_STAT_CFG); in sparx5_init_switchcore()
412 spx5_wr(HSCH_RESET_CFG_CORE_ENA_SET(1), sparx5, HSCH_RESET_CFG); in sparx5_init_switchcore()
417 static int sparx5_init_coreclock(struct sparx5 *sparx5) in sparx5_init_coreclock() argument
419 enum sparx5_core_clockfreq freq = sparx5->coreclock; in sparx5_init_coreclock()
426 switch (sparx5->target_ct) { in sparx5_init_coreclock()
428 if (sparx5->coreclock == SPX5_CORE_CLOCK_DEFAULT) in sparx5_init_coreclock()
430 else if (sparx5->coreclock != SPX5_CORE_CLOCK_250MHZ) in sparx5_init_coreclock()
436 if (sparx5->coreclock == SPX5_CORE_CLOCK_DEFAULT) in sparx5_init_coreclock()
438 else if (sparx5->coreclock != SPX5_CORE_CLOCK_500MHZ) in sparx5_init_coreclock()
443 if (sparx5->coreclock == SPX5_CORE_CLOCK_DEFAULT) in sparx5_init_coreclock()
445 else if (sparx5->coreclock != SPX5_CORE_CLOCK_625MHZ) in sparx5_init_coreclock()
449 if (sparx5->coreclock == SPX5_CORE_CLOCK_DEFAULT) in sparx5_init_coreclock()
455 if (sparx5->coreclock == SPX5_CORE_CLOCK_DEFAULT) in sparx5_init_coreclock()
457 else if (sparx5->coreclock == SPX5_CORE_CLOCK_250MHZ) in sparx5_init_coreclock()
461 dev_err(sparx5->dev, "Target (%#04x) not supported\n", in sparx5_init_coreclock()
462 sparx5->target_ct); in sparx5_init_coreclock()
480 dev_err(sparx5->dev, "%d coreclock not supported on (%#04x)\n", in sparx5_init_coreclock()
481 sparx5->coreclock, sparx5->target_ct); in sparx5_init_coreclock()
486 sparx5->coreclock = freq; in sparx5_init_coreclock()
501 sparx5, in sparx5_init_coreclock()
508 sparx5, in sparx5_init_coreclock()
513 sparx5, in sparx5_init_coreclock()
518 sparx5, in sparx5_init_coreclock()
523 sparx5, in sparx5_init_coreclock()
529 sparx5, in sparx5_init_coreclock()
535 sparx5, in sparx5_init_coreclock()
540 sparx5, in sparx5_init_coreclock()
546 static int sparx5_qlim_set(struct sparx5 *sparx5) in sparx5_qlim_set() argument
552 spx5_wr(0xFFF, sparx5, in sparx5_qlim_set()
556 spx5_wr(0xFFF, sparx5, in sparx5_qlim_set()
561 spx5_wr(QLIM_WM(80), sparx5, XQS_QLIMIT_SHR_QLIM_CFG(0)); in sparx5_qlim_set()
562 spx5_wr(QLIM_WM(90), sparx5, XQS_QLIMIT_SHR_CTOP_CFG(0)); in sparx5_qlim_set()
563 spx5_wr(QLIM_WM(95), sparx5, XQS_QLIMIT_SHR_ATOP_CFG(0)); in sparx5_qlim_set()
564 spx5_wr(QLIM_WM(100), sparx5, XQS_QLIMIT_SHR_TOP_CFG(0)); in sparx5_qlim_set()
572 static void sparx5_board_init(struct sparx5 *sparx5) in sparx5_board_init() argument
576 if (!sparx5->sd_sgpio_remapping) in sparx5_board_init()
582 sparx5, in sparx5_board_init()
587 if (sparx5->ports[idx]) in sparx5_board_init()
588 if (sparx5->ports[idx]->conf.sd_sgpio != ~0) in sparx5_board_init()
589 spx5_wr(sparx5->ports[idx]->conf.sd_sgpio, in sparx5_board_init()
590 sparx5, in sparx5_board_init()
594 static int sparx5_start(struct sparx5 *sparx5) in sparx5_start() argument
603 spx5_wr(idx, sparx5, ANA_AC_OWN_UPSID(idx)); in sparx5_start()
604 spx5_wr(idx, sparx5, ANA_CL_OWN_UPSID(idx)); in sparx5_start()
605 spx5_wr(idx, sparx5, ANA_L2_OWN_UPSID(idx)); in sparx5_start()
606 spx5_wr(idx, sparx5, REW_OWN_UPSID(idx)); in sparx5_start()
613 sparx5, in sparx5_start()
617 sparx5_update_fwd(sparx5); in sparx5_start()
621 sparx5, ANA_AC_PGID_MISC_CFG(PGID_CPU)); in sparx5_start()
623 sparx5, ANA_AC_PGID_MISC_CFG(PGID_BCAST)); in sparx5_start()
629 sparx5, ANA_CL_FILTER_CTRL(idx)); in sparx5_start()
632 sparx5_mact_init(sparx5); in sparx5_start()
635 sparx5_pgid_init(sparx5); in sparx5_start()
638 sparx5_vlan_init(sparx5); in sparx5_start()
641 sparx5_mact_learn(sparx5, PGID_CPU, broadcast, NULL_VID); in sparx5_start()
644 sparx5_qlim_set(sparx5); in sparx5_start()
646 err = sparx5_config_auto_calendar(sparx5); in sparx5_start()
650 err = sparx5_config_dsm_calendar(sparx5); in sparx5_start()
655 err = sparx_stats_init(sparx5); in sparx5_start()
660 mutex_init(&sparx5->mact_lock); in sparx5_start()
661 INIT_LIST_HEAD(&sparx5->mact_entries); in sparx5_start()
663 dev_name(sparx5->dev)); in sparx5_start()
664 sparx5->mact_queue = create_singlethread_workqueue(queue_name); in sparx5_start()
665 if (!sparx5->mact_queue) in sparx5_start()
668 INIT_DELAYED_WORK(&sparx5->mact_work, sparx5_mact_pull_work); in sparx5_start()
669 queue_delayed_work(sparx5->mact_queue, &sparx5->mact_work, in sparx5_start()
672 mutex_init(&sparx5->mdb_lock); in sparx5_start()
673 INIT_LIST_HEAD(&sparx5->mdb_entries); in sparx5_start()
675 err = sparx5_register_netdevs(sparx5); in sparx5_start()
679 sparx5_board_init(sparx5); in sparx5_start()
680 err = sparx5_register_notifier_blocks(sparx5); in sparx5_start()
684 err = sparx5_vcap_init(sparx5); in sparx5_start()
686 sparx5_unregister_notifier_blocks(sparx5); in sparx5_start()
692 if (sparx5->fdma_irq >= 0) { in sparx5_start()
693 if (GCB_CHIP_ID_REV_ID_GET(sparx5->chip_id) > 0) in sparx5_start()
694 err = devm_request_threaded_irq(sparx5->dev, in sparx5_start()
695 sparx5->fdma_irq, in sparx5_start()
699 "sparx5-fdma", sparx5); in sparx5_start()
701 err = sparx5_fdma_start(sparx5); in sparx5_start()
703 sparx5->fdma_irq = -ENXIO; in sparx5_start()
705 sparx5->fdma_irq = -ENXIO; in sparx5_start()
707 if (err && sparx5->xtr_irq >= 0) { in sparx5_start()
708 err = devm_request_irq(sparx5->dev, sparx5->xtr_irq, in sparx5_start()
710 "sparx5-xtr", sparx5); in sparx5_start()
712 err = sparx5_manual_injection_mode(sparx5); in sparx5_start()
714 sparx5->xtr_irq = -ENXIO; in sparx5_start()
716 sparx5->xtr_irq = -ENXIO; in sparx5_start()
719 if (sparx5->ptp_irq >= 0) { in sparx5_start()
720 err = devm_request_threaded_irq(sparx5->dev, sparx5->ptp_irq, in sparx5_start()
723 sparx5); in sparx5_start()
725 sparx5->ptp_irq = -ENXIO; in sparx5_start()
727 sparx5->ptp = 1; in sparx5_start()
733 static void sparx5_cleanup_ports(struct sparx5 *sparx5) in sparx5_cleanup_ports() argument
735 sparx5_unregister_netdevs(sparx5); in sparx5_cleanup_ports()
736 sparx5_destroy_netdevs(sparx5); in sparx5_cleanup_ports()
745 struct sparx5 *sparx5; in mchp_sparx5_probe() local
751 sparx5 = devm_kzalloc(&pdev->dev, sizeof(*sparx5), GFP_KERNEL); in mchp_sparx5_probe()
752 if (!sparx5) in mchp_sparx5_probe()
755 platform_set_drvdata(pdev, sparx5); in mchp_sparx5_probe()
756 sparx5->pdev = pdev; in mchp_sparx5_probe()
757 sparx5->dev = &pdev->dev; in mchp_sparx5_probe()
767 sparx5->coreclock = SPX5_CORE_CLOCK_DEFAULT; in mchp_sparx5_probe()
769 sparx5->debugfs_root = debugfs_create_dir("sparx5", NULL); in mchp_sparx5_probe()
773 dev_err(sparx5->dev, "no ethernet-ports child node found\n"); in mchp_sparx5_probe()
776 sparx5->port_count = of_get_child_count(ports); in mchp_sparx5_probe()
778 configs = kcalloc(sparx5->port_count, in mchp_sparx5_probe()
792 dev_err(sparx5->dev, "port reg property error\n"); in mchp_sparx5_probe()
801 dev_err(sparx5->dev, "port %u: missing phy-mode\n", in mchp_sparx5_probe()
808 dev_err(sparx5->dev, "port %u: missing bandwidth\n", in mchp_sparx5_probe()
816 sparx5->sd_sgpio_remapping = true; in mchp_sparx5_probe()
817 serdes = devm_of_phy_get(sparx5->dev, portnp, NULL); in mchp_sparx5_probe()
819 err = dev_err_probe(sparx5->dev, PTR_ERR(serdes), in mchp_sparx5_probe()
836 err = sparx5_create_targets(sparx5); in mchp_sparx5_probe()
840 if (of_get_mac_address(np, sparx5->base_mac)) { in mchp_sparx5_probe()
841 dev_info(sparx5->dev, "MAC addr was not set, use random MAC\n"); in mchp_sparx5_probe()
842 eth_random_addr(sparx5->base_mac); in mchp_sparx5_probe()
843 sparx5->base_mac[5] = 0; in mchp_sparx5_probe()
846 sparx5->fdma_irq = platform_get_irq_byname(sparx5->pdev, "fdma"); in mchp_sparx5_probe()
847 sparx5->xtr_irq = platform_get_irq_byname(sparx5->pdev, "xtr"); in mchp_sparx5_probe()
848 sparx5->ptp_irq = platform_get_irq_byname(sparx5->pdev, "ptp"); in mchp_sparx5_probe()
851 sparx5->chip_id = spx5_rd(sparx5, GCB_CHIP_ID); in mchp_sparx5_probe()
853 sparx5->target_ct = (enum spx5_target_chiptype) in mchp_sparx5_probe()
854 GCB_CHIP_ID_PART_ID_GET(sparx5->chip_id); in mchp_sparx5_probe()
857 err = sparx5_init_switchcore(sparx5); in mchp_sparx5_probe()
859 dev_err(sparx5->dev, "Switchcore initialization error\n"); in mchp_sparx5_probe()
864 err = sparx5_init_coreclock(sparx5); in mchp_sparx5_probe()
866 dev_err(sparx5->dev, "LC-PLL initialization error\n"); in mchp_sparx5_probe()
870 for (idx = 0; idx < sparx5->port_count; ++idx) { in mchp_sparx5_probe()
875 err = sparx5_create_port(sparx5, config); in mchp_sparx5_probe()
877 dev_err(sparx5->dev, "port create error\n"); in mchp_sparx5_probe()
882 err = sparx5_start(sparx5); in mchp_sparx5_probe()
884 dev_err(sparx5->dev, "Start failed\n"); in mchp_sparx5_probe()
888 err = sparx5_qos_init(sparx5); in mchp_sparx5_probe()
890 dev_err(sparx5->dev, "Failed to initialize QoS\n"); in mchp_sparx5_probe()
894 err = sparx5_ptp_init(sparx5); in mchp_sparx5_probe()
896 dev_err(sparx5->dev, "PTP failed\n"); in mchp_sparx5_probe()
902 sparx5_cleanup_ports(sparx5); in mchp_sparx5_probe()
903 if (sparx5->mact_queue) in mchp_sparx5_probe()
904 destroy_workqueue(sparx5->mact_queue); in mchp_sparx5_probe()
914 struct sparx5 *sparx5 = platform_get_drvdata(pdev); in mchp_sparx5_remove() local
916 debugfs_remove_recursive(sparx5->debugfs_root); in mchp_sparx5_remove()
917 if (sparx5->xtr_irq) { in mchp_sparx5_remove()
918 disable_irq(sparx5->xtr_irq); in mchp_sparx5_remove()
919 sparx5->xtr_irq = -ENXIO; in mchp_sparx5_remove()
921 if (sparx5->fdma_irq) { in mchp_sparx5_remove()
922 disable_irq(sparx5->fdma_irq); in mchp_sparx5_remove()
923 sparx5->fdma_irq = -ENXIO; in mchp_sparx5_remove()
925 sparx5_ptp_deinit(sparx5); in mchp_sparx5_remove()
926 sparx5_fdma_stop(sparx5); in mchp_sparx5_remove()
927 sparx5_cleanup_ports(sparx5); in mchp_sparx5_remove()
928 sparx5_vcap_destroy(sparx5); in mchp_sparx5_remove()
930 sparx5_unregister_notifier_blocks(sparx5); in mchp_sparx5_remove()
931 destroy_workqueue(sparx5->mact_queue); in mchp_sparx5_remove()