Lines Matching +full:tx +full:- +full:p2p +full:- +full:microvolt

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Marvell 88e6xxx Ethernet switch single-chip support
9 * Copyright (c) 2016-2017 Savoir-faire Linux Inc.
49 if (unlikely(!mutex_is_locked(&chip->reg_lock))) { in assert_reg_lock()
50 dev_err(chip->dev, "Switch registers lock not held!\n"); in assert_reg_lock()
65 dev_dbg(chip->dev, "<- addr: 0x%.2x reg: 0x%.2x val: 0x%.4x\n", in mv88e6xxx_read()
81 dev_dbg(chip->dev, "-> addr: 0x%.2x reg: 0x%.2x val: 0x%.4x\n", in mv88e6xxx_write()
120 dev_err(chip->dev, "Timeout while waiting for switch\n"); in mv88e6xxx_wait_mask()
121 return -ETIMEDOUT; in mv88e6xxx_wait_mask()
135 mdio_bus = list_first_entry_or_null(&chip->mdios, in mv88e6xxx_default_mdio_bus()
140 return mdio_bus->bus; in mv88e6xxx_default_mdio_bus()
146 unsigned int n = d->hwirq; in mv88e6xxx_g1_irq_mask()
148 chip->g1_irq.masked |= (1 << n); in mv88e6xxx_g1_irq_mask()
154 unsigned int n = d->hwirq; in mv88e6xxx_g1_irq_unmask()
156 chip->g1_irq.masked &= ~(1 << n); in mv88e6xxx_g1_irq_unmask()
176 for (n = 0; n < chip->g1_irq.nirqs; ++n) { in mv88e6xxx_g1_irq_thread_work()
178 sub_irq = irq_find_mapping(chip->g1_irq.domain, in mv88e6xxx_g1_irq_thread_work()
194 ctl1 &= GENMASK(chip->g1_irq.nirqs, 0); in mv88e6xxx_g1_irq_thread_work()
218 u16 mask = GENMASK(chip->g1_irq.nirqs, 0); in mv88e6xxx_g1_irq_bus_sync_unlock()
227 reg |= (~chip->g1_irq.masked & mask); in mv88e6xxx_g1_irq_bus_sync_unlock()
238 .name = "mv88e6xxx-g1",
249 struct mv88e6xxx_chip *chip = d->host_data; in mv88e6xxx_g1_irq_domain_map()
251 irq_set_chip_data(irq, d->host_data); in mv88e6xxx_g1_irq_domain_map()
252 irq_set_chip_and_handler(irq, &chip->g1_irq.chip, handle_level_irq); in mv88e6xxx_g1_irq_domain_map()
270 mask &= ~GENMASK(chip->g1_irq.nirqs, 0); in mv88e6xxx_g1_irq_free_common()
273 for (irq = 0; irq < chip->g1_irq.nirqs; irq++) { in mv88e6xxx_g1_irq_free_common()
274 virq = irq_find_mapping(chip->g1_irq.domain, irq); in mv88e6xxx_g1_irq_free_common()
278 irq_domain_remove(chip->g1_irq.domain); in mv88e6xxx_g1_irq_free_common()
287 free_irq(chip->irq, chip); in mv88e6xxx_g1_irq_free()
299 chip->g1_irq.nirqs = chip->info->g1_irqs; in mv88e6xxx_g1_irq_setup_common()
300 chip->g1_irq.domain = irq_domain_add_simple( in mv88e6xxx_g1_irq_setup_common()
301 NULL, chip->g1_irq.nirqs, 0, in mv88e6xxx_g1_irq_setup_common()
303 if (!chip->g1_irq.domain) in mv88e6xxx_g1_irq_setup_common()
304 return -ENOMEM; in mv88e6xxx_g1_irq_setup_common()
306 for (irq = 0; irq < chip->g1_irq.nirqs; irq++) in mv88e6xxx_g1_irq_setup_common()
307 irq_create_mapping(chip->g1_irq.domain, irq); in mv88e6xxx_g1_irq_setup_common()
309 chip->g1_irq.chip = mv88e6xxx_g1_irq_chip; in mv88e6xxx_g1_irq_setup_common()
310 chip->g1_irq.masked = ~0; in mv88e6xxx_g1_irq_setup_common()
316 mask &= ~GENMASK(chip->g1_irq.nirqs, 0); in mv88e6xxx_g1_irq_setup_common()
330 mask &= ~GENMASK(chip->g1_irq.nirqs, 0); in mv88e6xxx_g1_irq_setup_common()
335 virq = irq_find_mapping(chip->g1_irq.domain, irq); in mv88e6xxx_g1_irq_setup_common()
339 irq_domain_remove(chip->g1_irq.domain); in mv88e6xxx_g1_irq_setup_common()
358 irq_set_lockdep_class(chip->irq, &lock_key, &request_key); in mv88e6xxx_g1_irq_setup()
360 snprintf(chip->irq_name, sizeof(chip->irq_name), in mv88e6xxx_g1_irq_setup()
361 "mv88e6xxx-%s", dev_name(chip->dev)); in mv88e6xxx_g1_irq_setup()
364 err = request_threaded_irq(chip->irq, NULL, in mv88e6xxx_g1_irq_setup()
367 chip->irq_name, chip); in mv88e6xxx_g1_irq_setup()
382 kthread_queue_delayed_work(chip->kworker, &chip->irq_poll_work, in mv88e6xxx_irq_poll()
394 kthread_init_delayed_work(&chip->irq_poll_work, in mv88e6xxx_irq_poll_setup()
397 chip->kworker = kthread_run_worker(0, "%s", dev_name(chip->dev)); in mv88e6xxx_irq_poll_setup()
398 if (IS_ERR(chip->kworker)) in mv88e6xxx_irq_poll_setup()
399 return PTR_ERR(chip->kworker); in mv88e6xxx_irq_poll_setup()
401 kthread_queue_delayed_work(chip->kworker, &chip->irq_poll_work, in mv88e6xxx_irq_poll_setup()
409 kthread_cancel_delayed_work_sync(&chip->irq_poll_work); in mv88e6xxx_irq_poll_free()
410 kthread_destroy_worker(chip->kworker); in mv88e6xxx_irq_poll_free()
422 if (chip->info->ops->port_set_rgmii_delay) { in mv88e6xxx_port_config_interface()
423 err = chip->info->ops->port_set_rgmii_delay(chip, port, in mv88e6xxx_port_config_interface()
425 if (err && err != -EOPNOTSUPP) in mv88e6xxx_port_config_interface()
429 if (chip->info->ops->port_set_cmode) { in mv88e6xxx_port_config_interface()
430 err = chip->info->ops->port_set_cmode(chip, port, in mv88e6xxx_port_config_interface()
432 if (err && err != -EOPNOTSUPP) in mv88e6xxx_port_config_interface()
445 if (!chip->info->ops->port_set_link) in mv88e6xxx_port_setup_mac()
449 err = chip->info->ops->port_set_link(chip, port, LINK_FORCED_DOWN); in mv88e6xxx_port_setup_mac()
453 if (chip->info->ops->port_set_speed_duplex) { in mv88e6xxx_port_setup_mac()
454 err = chip->info->ops->port_set_speed_duplex(chip, port, in mv88e6xxx_port_setup_mac()
456 if (err && err != -EOPNOTSUPP) in mv88e6xxx_port_setup_mac()
460 if (chip->info->ops->port_set_pause) { in mv88e6xxx_port_setup_mac()
461 err = chip->info->ops->port_set_pause(chip, port, pause); in mv88e6xxx_port_setup_mac()
468 if (chip->info->ops->port_set_link(chip, port, link)) in mv88e6xxx_port_setup_mac()
469 dev_err(chip->dev, "p%d: failed to restore MAC's link\n", port); in mv88e6xxx_port_setup_mac()
476 return port >= chip->info->internal_phys_offset && in mv88e6xxx_phy_is_internal()
477 port < chip->info->num_internal_phys + in mv88e6xxx_phy_is_internal()
478 chip->info->internal_phys_offset; in mv88e6xxx_phy_is_internal()
489 if (chip->info->family == MV88E6XXX_FAMILY_6250) in mv88e6xxx_port_ppu_updates()
494 dev_err(chip->dev, in mv88e6xxx_port_ppu_updates()
516 u8 cmode = chip->ports[port].cmode; in mv88e6095_phylink_get_caps()
518 config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100; in mv88e6095_phylink_get_caps()
521 __set_bit(PHY_INTERFACE_MODE_MII, config->supported_interfaces); in mv88e6095_phylink_get_caps()
526 config->supported_interfaces); in mv88e6095_phylink_get_caps()
528 config->mac_capabilities |= MAC_1000FD; in mv88e6095_phylink_get_caps()
535 u8 cmode = chip->ports[port].cmode; in mv88e6185_phylink_get_caps()
540 config->supported_interfaces); in mv88e6185_phylink_get_caps()
542 config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 | in mv88e6185_phylink_get_caps()
574 unsigned long *supported = config->supported_interfaces; in mv88e6250_setup_supported_interfaces()
580 dev_err(chip->dev, "p%d: failed to read port status\n", port); in mv88e6250_setup_supported_interfaces()
614 dev_err(chip->dev, in mv88e6250_setup_supported_interfaces()
626 config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100; in mv88e6250_phylink_get_caps()
632 unsigned long *supported = config->supported_interfaces; in mv88e6351_phylink_get_caps()
635 mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported); in mv88e6351_phylink_get_caps()
637 config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 | in mv88e6351_phylink_get_caps()
650 /* If PHY_DETECT is zero, then we are not in auto-media mode */ in mv88e63xx_get_port_serdes_cmode()
674 unsigned long *supported = config->supported_interfaces; in mv88e6352_phylink_get_caps()
678 mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported); in mv88e6352_phylink_get_caps()
680 config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 | in mv88e6352_phylink_get_caps()
687 dev_err(chip->dev, "p%d: failed to read scratch\n", in mv88e6352_phylink_get_caps()
694 dev_err(chip->dev, "p%d: failed to read serdes cmode\n", in mv88e6352_phylink_get_caps()
704 unsigned long *supported = config->supported_interfaces; in mv88e632x_phylink_get_caps()
708 mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported); in mv88e632x_phylink_get_caps()
710 config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 | in mv88e632x_phylink_get_caps()
717 dev_err(chip->dev, "p%d: failed to read serdes cmode\n", in mv88e632x_phylink_get_caps()
727 unsigned long *supported = config->supported_interfaces; in mv88e6341_phylink_get_caps()
730 mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported); in mv88e6341_phylink_get_caps()
733 config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 | in mv88e6341_phylink_get_caps()
742 config->mac_capabilities |= MAC_2500FD; in mv88e6341_phylink_get_caps()
749 unsigned long *supported = config->supported_interfaces; in mv88e6390_phylink_get_caps()
752 mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported); in mv88e6390_phylink_get_caps()
755 config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 | in mv88e6390_phylink_get_caps()
764 config->mac_capabilities |= MAC_2500FD; in mv88e6390_phylink_get_caps()
771 unsigned long *supported = config->supported_interfaces; in mv88e6390x_phylink_get_caps()
775 /* For the 6x90X, ports 2-7 can be in automedia mode. in mv88e6390x_phylink_get_caps()
778 * Port 2 can also support 1000BASE-X in automedia mode if port 9 is in mv88e6390x_phylink_get_caps()
779 * configured for 1000BASE-X, SGMII or 2500BASE-X. in mv88e6390x_phylink_get_caps()
780 * Port 3-4 can also support 1000BASE-X in automedia mode if port 9 is in mv88e6390x_phylink_get_caps()
781 * configured for RXAUI, 1000BASE-X, SGMII or 2500BASE-X. in mv88e6390x_phylink_get_caps()
783 * Port 5 can also support 1000BASE-X in automedia mode if port 10 is in mv88e6390x_phylink_get_caps()
784 * configured for 1000BASE-X, SGMII or 2500BASE-X. in mv88e6390x_phylink_get_caps()
785 * Port 6-7 can also support 1000BASE-X in automedia mode if port 10 is in mv88e6390x_phylink_get_caps()
786 * configured for RXAUI, 1000BASE-X, SGMII or 2500BASE-X. in mv88e6390x_phylink_get_caps()
788 * For now, be permissive (as the old code was) and allow 1000BASE-X in mv88e6390x_phylink_get_caps()
799 config->mac_capabilities |= MAC_10000FD; in mv88e6390x_phylink_get_caps()
806 unsigned long *supported = config->supported_interfaces; in mv88e6393x_phylink_get_caps()
808 chip->info->prod_num == MV88E6XXX_PORT_SWITCH_ID_PROD_6191X; in mv88e6393x_phylink_get_caps()
810 chip->info->prod_num == MV88E6XXX_PORT_SWITCH_ID_PROD_6361; in mv88e6393x_phylink_get_caps()
812 mv88e6xxx_translate_cmode(chip->ports[port].cmode, supported); in mv88e6393x_phylink_get_caps()
814 config->mac_capabilities = MAC_SYM_PAUSE | MAC_10 | MAC_100 | in mv88e6393x_phylink_get_caps()
825 config->mac_capabilities |= MAC_2500FD; in mv88e6393x_phylink_get_caps()
832 config->mac_capabilities |= MAC_5000FD | in mv88e6393x_phylink_get_caps()
850 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_get_caps()
853 chip->info->ops->phylink_get_caps(chip, port, config); in mv88e6xxx_get_caps()
858 config->supported_interfaces); in mv88e6xxx_get_caps()
859 /* Internal ports with no phy-mode need GMII for PHYLIB */ in mv88e6xxx_get_caps()
861 config->supported_interfaces); in mv88e6xxx_get_caps()
870 struct mv88e6xxx_chip *chip = dp->ds->priv; in mv88e6xxx_mac_select_pcs()
873 if (chip->info->ops->pcs_ops) in mv88e6xxx_mac_select_pcs()
874 pcs = chip->info->ops->pcs_ops->pcs_select(chip, dp->index, in mv88e6xxx_mac_select_pcs()
884 struct mv88e6xxx_chip *chip = dp->ds->priv; in mv88e6xxx_mac_prepare()
885 int port = dp->index; in mv88e6xxx_mac_prepare()
893 chip->ports[port].interface != interface && in mv88e6xxx_mac_prepare()
894 chip->info->ops->port_set_link) { in mv88e6xxx_mac_prepare()
896 err = chip->info->ops->port_set_link(chip, port, in mv88e6xxx_mac_prepare()
909 struct mv88e6xxx_chip *chip = dp->ds->priv; in mv88e6xxx_mac_config()
910 int port = dp->index; in mv88e6xxx_mac_config()
917 state->interface); in mv88e6xxx_mac_config()
918 if (err && err != -EOPNOTSUPP) in mv88e6xxx_mac_config()
925 if (err && err != -EOPNOTSUPP) in mv88e6xxx_mac_config()
926 dev_err(chip->dev, "p%d: failed to configure MAC/PCS\n", port); in mv88e6xxx_mac_config()
933 struct mv88e6xxx_chip *chip = dp->ds->priv; in mv88e6xxx_mac_finish()
934 int port = dp->index; in mv88e6xxx_mac_finish()
939 * up in the in-band case where there is no separate SERDES. Also in mv88e6xxx_mac_finish()
941 * in PHY mode (we treat the PPU as an effective in-band mechanism.) in mv88e6xxx_mac_finish()
945 if (chip->info->ops->port_set_link && in mv88e6xxx_mac_finish()
947 chip->ports[port].interface != interface) || in mv88e6xxx_mac_finish()
949 err = chip->info->ops->port_set_link(chip, port, LINK_UNFORCED); in mv88e6xxx_mac_finish()
953 chip->ports[port].interface = interface; in mv88e6xxx_mac_finish()
963 struct mv88e6xxx_chip *chip = dp->ds->priv; in mv88e6xxx_mac_link_down()
965 int port = dp->index; in mv88e6xxx_mac_link_down()
968 ops = chip->info->ops; in mv88e6xxx_mac_link_down()
972 * updated by the switch or if we are using fixed-link mode. in mv88e6xxx_mac_link_down()
975 mode == MLO_AN_FIXED) && ops->port_sync_link) in mv88e6xxx_mac_link_down()
976 err = ops->port_sync_link(chip, port, mode, false); in mv88e6xxx_mac_link_down()
978 if (!err && ops->port_set_speed_duplex) in mv88e6xxx_mac_link_down()
979 err = ops->port_set_speed_duplex(chip, port, SPEED_UNFORCED, in mv88e6xxx_mac_link_down()
984 dev_err(chip->dev, in mv88e6xxx_mac_link_down()
995 struct mv88e6xxx_chip *chip = dp->ds->priv; in mv88e6xxx_mac_link_up()
997 int port = dp->index; in mv88e6xxx_mac_link_up()
1000 ops = chip->info->ops; in mv88e6xxx_mac_link_up()
1004 * automatically updated by the switch or if we are using fixed-link in mv88e6xxx_mac_link_up()
1009 if (ops->port_set_speed_duplex) { in mv88e6xxx_mac_link_up()
1010 err = ops->port_set_speed_duplex(chip, port, in mv88e6xxx_mac_link_up()
1012 if (err && err != -EOPNOTSUPP) in mv88e6xxx_mac_link_up()
1016 if (ops->port_sync_link) in mv88e6xxx_mac_link_up()
1017 err = ops->port_sync_link(chip, port, mode, true); in mv88e6xxx_mac_link_up()
1022 if (err && err != -EOPNOTSUPP) in mv88e6xxx_mac_link_up()
1023 dev_err(chip->dev, in mv88e6xxx_mac_link_up()
1031 if (!chip->info->ops->stats_snapshot) in mv88e6xxx_stats_snapshot()
1032 return -EOPNOTSUPP; in mv88e6xxx_stats_snapshot()
1035 err = chip->info->ops->stats_snapshot(chip, port); in mv88e6xxx_stats_snapshot()
1126 switch (s->type) { in _mv88e6xxx_get_ethtool_stat()
1128 err = mv88e6xxx_port_read(chip, port, s->reg, &reg); in _mv88e6xxx_get_ethtool_stat()
1133 if (s->size == 4) { in _mv88e6xxx_get_ethtool_stat()
1134 err = mv88e6xxx_port_read(chip, port, s->reg + 1, &reg); in _mv88e6xxx_get_ethtool_stat()
1144 reg |= s->reg | histogram; in _mv88e6xxx_get_ethtool_stat()
1146 if (s->size == 8) in _mv88e6xxx_get_ethtool_stat()
1164 if (stat->type & types) in mv88e6xxx_stats_get_strings()
1165 ethtool_puts(data, stat->string); in mv88e6xxx_stats_get_strings()
1208 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_get_strings()
1215 if (chip->info->ops->stats_get_strings) in mv88e6xxx_get_strings()
1216 chip->info->ops->stats_get_strings(chip, &data); in mv88e6xxx_get_strings()
1218 if (chip->info->ops->serdes_get_strings) in mv88e6xxx_get_strings()
1219 chip->info->ops->serdes_get_strings(chip, port, &data); in mv88e6xxx_get_strings()
1234 if (stat->type & types) in mv88e6xxx_stats_get_sset_count()
1259 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_get_sset_count()
1267 if (chip->info->ops->stats_get_sset_count) in mv88e6xxx_get_sset_count()
1268 count = chip->info->ops->stats_get_sset_count(chip); in mv88e6xxx_get_sset_count()
1272 if (chip->info->ops->serdes_get_sset_count) in mv88e6xxx_get_sset_count()
1273 serdes_count = chip->info->ops->serdes_get_sset_count(chip, in mv88e6xxx_get_sset_count()
1332 if (!(stat->type & chip->info->stats_type)) in mv88e6xxx_stats_get_stat()
1335 if (chip->info->ops->stats_get_stat) { in mv88e6xxx_stats_get_stat()
1337 ret = chip->info->ops->stats_get_stat(chip, port, stat, data); in mv88e6xxx_stats_get_stat()
1360 *data++ = chip->ports[port].atu_member_violation; in mv88e6xxx_atu_vtu_get_stats()
1361 *data++ = chip->ports[port].atu_miss_violation; in mv88e6xxx_atu_vtu_get_stats()
1362 *data++ = chip->ports[port].atu_full_violation; in mv88e6xxx_atu_vtu_get_stats()
1363 *data++ = chip->ports[port].vtu_member_violation; in mv88e6xxx_atu_vtu_get_stats()
1364 *data++ = chip->ports[port].vtu_miss_violation; in mv88e6xxx_atu_vtu_get_stats()
1375 if (chip->info->ops->serdes_get_stats) { in mv88e6xxx_get_stats()
1377 count = chip->info->ops->serdes_get_stats(chip, port, data); in mv88e6xxx_get_stats()
1387 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_get_ethtool_stats()
1400 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_get_eth_mac_stats()
1410 &mac_stats->stats._member) in mv88e6xxx_get_eth_mac_stats()
1429 mac_stats->stats.FramesTransmittedOK += mac_stats->stats.MulticastFramesXmittedOK; in mv88e6xxx_get_eth_mac_stats()
1430 mac_stats->stats.FramesTransmittedOK += mac_stats->stats.BroadcastFramesXmittedOK; in mv88e6xxx_get_eth_mac_stats()
1431 mac_stats->stats.FramesReceivedOK += mac_stats->stats.MulticastFramesReceivedOK; in mv88e6xxx_get_eth_mac_stats()
1432 mac_stats->stats.FramesReceivedOK += mac_stats->stats.BroadcastFramesReceivedOK; in mv88e6xxx_get_eth_mac_stats()
1448 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_get_rmon_stats()
1458 &rmon_stats->stats._member) in mv88e6xxx_get_rmon_stats()
1478 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_get_regs_len()
1482 if (chip->info->ops->serdes_get_regs_len) in mv88e6xxx_get_regs_len()
1483 len += chip->info->ops->serdes_get_regs_len(chip, port); in mv88e6xxx_get_regs_len()
1491 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_get_regs()
1497 regs->version = chip->info->prod_num; in mv88e6xxx_get_regs()
1510 if (chip->info->ops->serdes_get_regs) in mv88e6xxx_get_regs()
1511 chip->info->ops->serdes_get_regs(chip, port, &p[i]); in mv88e6xxx_get_regs()
1526 struct dsa_switch *ds = chip->ds; in mv88e6xxx_port_vlan()
1527 struct dsa_switch_tree *dst = ds->dst; in mv88e6xxx_port_vlan()
1533 if (dev <= dst->last_switch) { in mv88e6xxx_port_vlan()
1534 list_for_each_entry(dp, &dst->ports, list) { in mv88e6xxx_port_vlan()
1535 if (dp->ds->index == dev && dp->index == port) { in mv88e6xxx_port_vlan()
1546 list_for_each_entry(dp, &dst->ports, list) { in mv88e6xxx_port_vlan()
1552 if (bridge_num + dst->last_switch != dev) in mv88e6xxx_port_vlan()
1565 if (dp->type == DSA_PORT_TYPE_CPU || dp->type == DSA_PORT_TYPE_DSA) in mv88e6xxx_port_vlan()
1581 if (other_dp->type == DSA_PORT_TYPE_CPU || in mv88e6xxx_port_vlan()
1582 other_dp->type == DSA_PORT_TYPE_DSA || in mv88e6xxx_port_vlan()
1584 pvlan |= BIT(other_dp->index); in mv88e6xxx_port_vlan()
1591 u16 output_ports = mv88e6xxx_port_vlan(chip, chip->ds->index, port); in mv88e6xxx_port_vlan_map()
1602 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_stp_state_set()
1610 dev_err(ds->dev, "p%d: failed to update state\n", port); in mv88e6xxx_port_stp_state_set()
1617 if (chip->info->ops->ieee_pri_map) { in mv88e6xxx_pri_setup()
1618 err = chip->info->ops->ieee_pri_map(chip); in mv88e6xxx_pri_setup()
1623 if (chip->info->ops->ip_pri_map) { in mv88e6xxx_pri_setup()
1624 err = chip->info->ops->ip_pri_map(chip); in mv88e6xxx_pri_setup()
1634 struct dsa_switch *ds = chip->ds; in mv88e6xxx_devmap_setup()
1638 if (!chip->info->global2_addr) in mv88e6xxx_devmap_setup()
1644 if (port == ds->num_ports) in mv88e6xxx_devmap_setup()
1652 if (chip->info->ops->set_cascade_port) { in mv88e6xxx_devmap_setup()
1654 err = chip->info->ops->set_cascade_port(chip, port); in mv88e6xxx_devmap_setup()
1659 err = mv88e6xxx_g1_set_device_number(chip, chip->ds->index); in mv88e6xxx_devmap_setup()
1669 if (chip->info->global2_addr) in mv88e6xxx_trunk_setup()
1677 if (chip->info->ops->rmu_disable) in mv88e6xxx_rmu_setup()
1678 return chip->info->ops->rmu_disable(chip); in mv88e6xxx_rmu_setup()
1685 if (chip->info->ops->pot_clear) in mv88e6xxx_pot_setup()
1686 return chip->info->ops->pot_clear(chip); in mv88e6xxx_pot_setup()
1693 if (chip->info->ops->mgmt_rsvd2cpu) in mv88e6xxx_rsvd2cpu_setup()
1694 return chip->info->ops->mgmt_rsvd2cpu(chip); in mv88e6xxx_rsvd2cpu_setup()
1710 * ->port_setup_message_port. in mv88e6xxx_atu_setup()
1712 if (chip->info->ops->port_setup_message_port) { in mv88e6xxx_atu_setup()
1726 if (!chip->info->ops->irl_init_all) in mv88e6xxx_irl_setup()
1733 err = chip->info->ops->irl_init_all(chip, port); in mv88e6xxx_irl_setup()
1743 if (chip->info->ops->set_switch_mac) { in mv88e6xxx_mac_setup()
1748 return chip->info->ops->set_switch_mac(chip, addr); in mv88e6xxx_mac_setup()
1756 struct dsa_switch_tree *dst = chip->ds->dst; in mv88e6xxx_pvt_map()
1764 /* Skip the local source device, which uses in-chip port VLAN */ in mv88e6xxx_pvt_map()
1765 if (dev != chip->ds->index) { in mv88e6xxx_pvt_map()
1768 ds = dsa_switch_find(dst->index, dev); in mv88e6xxx_pvt_map()
1770 if (dp && dp->lag) { in mv88e6xxx_pvt_map()
1775 * the LAG ID (one-based) as the port number in mv88e6xxx_pvt_map()
1776 * (zero-based). in mv88e6xxx_pvt_map()
1779 port = dsa_port_lag_id_get(dp) - 1; in mv88e6xxx_pvt_map()
1815 if (dsa_to_port(chip->ds, port)->lag) in mv88e6xxx_port_fast_age_fid()
1816 /* Hardware is incapable of fast-aging a LAG through a in mv88e6xxx_port_fast_age_fid()
1818 * more fancy in place this is a no-op. in mv88e6xxx_port_fast_age_fid()
1820 return -EOPNOTSUPP; in mv88e6xxx_port_fast_age_fid()
1827 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_fast_age()
1835 dev_err(chip->ds->dev, "p%d: failed to flush ATU: %d\n", in mv88e6xxx_port_fast_age()
1852 if (!chip->info->ops->vtu_getnext) in mv88e6xxx_vtu_get()
1853 return -EOPNOTSUPP; in mv88e6xxx_vtu_get()
1857 entry->vid = vid ? vid - 1 : mv88e6xxx_max_vid(chip); in mv88e6xxx_vtu_get()
1858 entry->valid = false; in mv88e6xxx_vtu_get()
1860 err = chip->info->ops->vtu_getnext(chip, entry); in mv88e6xxx_vtu_get()
1862 if (entry->vid != vid) in mv88e6xxx_vtu_get()
1863 entry->valid = false; in mv88e6xxx_vtu_get()
1880 if (!chip->info->ops->vtu_getnext) in mv88e6xxx_vtu_walk()
1881 return -EOPNOTSUPP; in mv88e6xxx_vtu_walk()
1884 err = chip->info->ops->vtu_getnext(chip, &entry); in mv88e6xxx_vtu_walk()
1902 if (!chip->info->ops->vtu_loadpurge) in mv88e6xxx_vtu_loadpurge()
1903 return -EOPNOTSUPP; in mv88e6xxx_vtu_loadpurge()
1905 return chip->info->ops->vtu_loadpurge(chip, entry); in mv88e6xxx_vtu_loadpurge()
1910 *fid = find_first_zero_bit(chip->fid_bitmap, MV88E6XXX_N_FID); in mv88e6xxx_atu_new()
1912 return -ENOSPC; in mv88e6xxx_atu_new()
1921 if (!chip->info->ops->stu_loadpurge) in mv88e6xxx_stu_loadpurge()
1922 return -EOPNOTSUPP; in mv88e6xxx_stu_loadpurge()
1924 return chip->info->ops->stu_loadpurge(chip, entry); in mv88e6xxx_stu_loadpurge()
1952 list_for_each_entry(mst, &chip->msts, node) in mv88e6xxx_sid_get()
1953 __set_bit(mst->stu.sid, busy); in mv88e6xxx_sid_get()
1957 return (*sid >= mv88e6xxx_max_sid(chip)) ? -ENOSPC : 0; in mv88e6xxx_sid_get()
1977 list_for_each_entry_safe(mst, tmp, &chip->msts, node) { in mv88e6xxx_mst_put()
1978 if (mst->stu.sid != sid) in mv88e6xxx_mst_put()
1981 if (!refcount_dec_and_test(&mst->refcnt)) in mv88e6xxx_mst_put()
1984 mst->stu.valid = false; in mv88e6xxx_mst_put()
1985 err = mv88e6xxx_stu_loadpurge(chip, &mst->stu); in mv88e6xxx_mst_put()
1987 refcount_set(&mst->refcnt, 1); in mv88e6xxx_mst_put()
1991 list_del(&mst->node); in mv88e6xxx_mst_put()
1996 return -ENOENT; in mv88e6xxx_mst_put()
2006 err = -EOPNOTSUPP; in mv88e6xxx_mst_get()
2015 list_for_each_entry(mst, &chip->msts, node) { in mv88e6xxx_mst_get()
2016 if (mst->br == br && mst->msti == msti) { in mv88e6xxx_mst_get()
2017 refcount_inc(&mst->refcnt); in mv88e6xxx_mst_get()
2018 *sid = mst->stu.sid; in mv88e6xxx_mst_get()
2029 err = -ENOMEM; in mv88e6xxx_mst_get()
2033 INIT_LIST_HEAD(&mst->node); in mv88e6xxx_mst_get()
2034 refcount_set(&mst->refcnt, 1); in mv88e6xxx_mst_get()
2035 mst->br = br; in mv88e6xxx_mst_get()
2036 mst->msti = msti; in mv88e6xxx_mst_get()
2037 mst->stu.valid = true; in mv88e6xxx_mst_get()
2038 mst->stu.sid = *sid; in mv88e6xxx_mst_get()
2041 * a STU state of disabled means to go by the port-global in mv88e6xxx_mst_get()
2046 mst->stu.state[i] = dsa_is_user_port(chip->ds, i) ? in mv88e6xxx_mst_get()
2050 err = mv88e6xxx_stu_loadpurge(chip, &mst->stu); in mv88e6xxx_mst_get()
2054 list_add_tail(&mst->node, &chip->msts); in mv88e6xxx_mst_get()
2067 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_mst_state_set()
2073 return -EOPNOTSUPP; in mv88e6xxx_port_mst_state_set()
2075 switch (st->state) { in mv88e6xxx_port_mst_state_set()
2088 return -EINVAL; in mv88e6xxx_port_mst_state_set()
2091 list_for_each_entry(mst, &chip->msts, node) { in mv88e6xxx_port_mst_state_set()
2092 if (mst->br == dsa_port_bridge_dev_get(dp) && in mv88e6xxx_port_mst_state_set()
2093 mst->msti == st->msti) { in mv88e6xxx_port_mst_state_set()
2094 if (mst->stu.state[port] == state) in mv88e6xxx_port_mst_state_set()
2097 mst->stu.state[port] = state; in mv88e6xxx_port_mst_state_set()
2099 err = mv88e6xxx_stu_loadpurge(chip, &mst->stu); in mv88e6xxx_port_mst_state_set()
2105 return -ENOENT; in mv88e6xxx_port_mst_state_set()
2112 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_check_hw_vlan()
2130 if (vlan.member[other_dp->index] == in mv88e6xxx_port_check_hw_vlan()
2141 dev_err(ds->dev, "p%d: hw VLAN %d already used by port %d in %s\n", in mv88e6xxx_port_check_hw_vlan()
2142 port, vlan.vid, other_dp->index, netdev_name(other_br)); in mv88e6xxx_port_check_hw_vlan()
2143 return -EOPNOTSUPP; in mv88e6xxx_port_check_hw_vlan()
2151 struct dsa_port *dp = dsa_to_port(chip->ds, port); in mv88e6xxx_port_commit_pvid()
2153 struct mv88e6xxx_port *p = &chip->ports[port]; in mv88e6xxx_port_commit_pvid()
2160 pvid = p->bridge_pvid.vid; in mv88e6xxx_port_commit_pvid()
2161 drop_untagged = !p->bridge_pvid.valid; in mv88e6xxx_port_commit_pvid()
2178 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_vlan_filtering()
2184 return -EOPNOTSUPP; in mv88e6xxx_port_vlan_filtering()
2206 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_vlan_prepare()
2210 return -EOPNOTSUPP; in mv88e6xxx_port_vlan_prepare()
2216 err = mv88e6xxx_port_check_hw_vlan(ds, port, vlan->vid); in mv88e6xxx_port_vlan_prepare()
2234 * VLAN ID into the port's database used for VLAN-unaware bridging. in mv88e6xxx_port_db_get()
2243 /* switchdev expects -EOPNOTSUPP to honor software VLANs */ in mv88e6xxx_port_db_get()
2245 return -EOPNOTSUPP; in mv88e6xxx_port_db_get()
2250 entry->state = 0; in mv88e6xxx_port_db_get()
2251 ether_addr_copy(entry->mac, addr); in mv88e6xxx_port_db_get()
2252 eth_addr_dec(entry->mac); in mv88e6xxx_port_db_get()
2309 enum mv88e6xxx_policy_mapping mapping = policy->mapping; in mv88e6xxx_policy_apply()
2310 enum mv88e6xxx_policy_action action = policy->action; in mv88e6xxx_policy_apply()
2311 const u8 *addr = policy->addr; in mv88e6xxx_policy_apply()
2312 u16 vid = policy->vid; in mv88e6xxx_policy_apply()
2317 if (!chip->info->ops->port_set_policy) in mv88e6xxx_policy_apply()
2318 return -EOPNOTSUPP; in mv88e6xxx_policy_apply()
2332 return -EOPNOTSUPP; in mv88e6xxx_policy_apply()
2340 return -EOPNOTSUPP; in mv88e6xxx_policy_apply()
2345 idr_for_each_entry(&chip->policies, policy, id) in mv88e6xxx_policy_apply()
2346 if (policy->port == port && in mv88e6xxx_policy_apply()
2347 policy->mapping == mapping && in mv88e6xxx_policy_apply()
2348 policy->action != action) in mv88e6xxx_policy_apply()
2351 return chip->info->ops->port_set_policy(chip, port, mapping, action); in mv88e6xxx_policy_apply()
2357 struct ethhdr *mac_entry = &fs->h_u.ether_spec; in mv88e6xxx_policy_insert()
2358 struct ethhdr *mac_mask = &fs->m_u.ether_spec; in mv88e6xxx_policy_insert()
2367 if (fs->location != RX_CLS_LOC_ANY) in mv88e6xxx_policy_insert()
2368 return -EINVAL; in mv88e6xxx_policy_insert()
2370 if (fs->ring_cookie == RX_CLS_FLOW_DISC) in mv88e6xxx_policy_insert()
2373 return -EOPNOTSUPP; in mv88e6xxx_policy_insert()
2375 switch (fs->flow_type & ~FLOW_EXT) { in mv88e6xxx_policy_insert()
2377 if (!is_zero_ether_addr(mac_mask->h_dest) && in mv88e6xxx_policy_insert()
2378 is_zero_ether_addr(mac_mask->h_source)) { in mv88e6xxx_policy_insert()
2380 addr = mac_entry->h_dest; in mv88e6xxx_policy_insert()
2381 } else if (is_zero_ether_addr(mac_mask->h_dest) && in mv88e6xxx_policy_insert()
2382 !is_zero_ether_addr(mac_mask->h_source)) { in mv88e6xxx_policy_insert()
2384 addr = mac_entry->h_source; in mv88e6xxx_policy_insert()
2387 return -EOPNOTSUPP; in mv88e6xxx_policy_insert()
2391 return -EOPNOTSUPP; in mv88e6xxx_policy_insert()
2394 if ((fs->flow_type & FLOW_EXT) && fs->m_ext.vlan_tci) { in mv88e6xxx_policy_insert()
2395 if (fs->m_ext.vlan_tci != htons(0xffff)) in mv88e6xxx_policy_insert()
2396 return -EOPNOTSUPP; in mv88e6xxx_policy_insert()
2397 vid = be16_to_cpu(fs->h_ext.vlan_tci) & VLAN_VID_MASK; in mv88e6xxx_policy_insert()
2400 idr_for_each_entry(&chip->policies, policy, id) { in mv88e6xxx_policy_insert()
2401 if (policy->port == port && policy->mapping == mapping && in mv88e6xxx_policy_insert()
2402 policy->action == action && policy->vid == vid && in mv88e6xxx_policy_insert()
2403 ether_addr_equal(policy->addr, addr)) in mv88e6xxx_policy_insert()
2404 return -EEXIST; in mv88e6xxx_policy_insert()
2407 policy = devm_kzalloc(chip->dev, sizeof(*policy), GFP_KERNEL); in mv88e6xxx_policy_insert()
2409 return -ENOMEM; in mv88e6xxx_policy_insert()
2411 fs->location = 0; in mv88e6xxx_policy_insert()
2412 err = idr_alloc_u32(&chip->policies, policy, &fs->location, 0xffffffff, in mv88e6xxx_policy_insert()
2415 devm_kfree(chip->dev, policy); in mv88e6xxx_policy_insert()
2419 memcpy(&policy->fs, fs, sizeof(*fs)); in mv88e6xxx_policy_insert()
2420 ether_addr_copy(policy->addr, addr); in mv88e6xxx_policy_insert()
2421 policy->mapping = mapping; in mv88e6xxx_policy_insert()
2422 policy->action = action; in mv88e6xxx_policy_insert()
2423 policy->port = port; in mv88e6xxx_policy_insert()
2424 policy->vid = vid; in mv88e6xxx_policy_insert()
2428 idr_remove(&chip->policies, fs->location); in mv88e6xxx_policy_insert()
2429 devm_kfree(chip->dev, policy); in mv88e6xxx_policy_insert()
2439 struct ethtool_rx_flow_spec *fs = &rxnfc->fs; in mv88e6xxx_get_rxnfc()
2440 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_get_rxnfc()
2447 switch (rxnfc->cmd) { in mv88e6xxx_get_rxnfc()
2449 rxnfc->data = 0; in mv88e6xxx_get_rxnfc()
2450 rxnfc->data |= RX_CLS_LOC_SPECIAL; in mv88e6xxx_get_rxnfc()
2451 rxnfc->rule_cnt = 0; in mv88e6xxx_get_rxnfc()
2452 idr_for_each_entry(&chip->policies, policy, id) in mv88e6xxx_get_rxnfc()
2453 if (policy->port == port) in mv88e6xxx_get_rxnfc()
2454 rxnfc->rule_cnt++; in mv88e6xxx_get_rxnfc()
2458 err = -ENOENT; in mv88e6xxx_get_rxnfc()
2459 policy = idr_find(&chip->policies, fs->location); in mv88e6xxx_get_rxnfc()
2461 memcpy(fs, &policy->fs, sizeof(*fs)); in mv88e6xxx_get_rxnfc()
2466 rxnfc->data = 0; in mv88e6xxx_get_rxnfc()
2467 rxnfc->rule_cnt = 0; in mv88e6xxx_get_rxnfc()
2468 idr_for_each_entry(&chip->policies, policy, id) in mv88e6xxx_get_rxnfc()
2469 if (policy->port == port) in mv88e6xxx_get_rxnfc()
2470 rule_locs[rxnfc->rule_cnt++] = id; in mv88e6xxx_get_rxnfc()
2474 err = -EOPNOTSUPP; in mv88e6xxx_get_rxnfc()
2486 struct ethtool_rx_flow_spec *fs = &rxnfc->fs; in mv88e6xxx_set_rxnfc()
2487 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_set_rxnfc()
2493 switch (rxnfc->cmd) { in mv88e6xxx_set_rxnfc()
2498 err = -ENOENT; in mv88e6xxx_set_rxnfc()
2499 policy = idr_remove(&chip->policies, fs->location); in mv88e6xxx_set_rxnfc()
2501 policy->action = MV88E6XXX_POLICY_ACTION_NORMAL; in mv88e6xxx_set_rxnfc()
2503 devm_kfree(chip->dev, policy); in mv88e6xxx_set_rxnfc()
2507 err = -EOPNOTSUPP; in mv88e6xxx_set_rxnfc()
2533 struct dsa_port *dp = dsa_to_port(chip->ds, port); in mv88e6xxx_broadcast_setup()
2536 if (dsa_is_unused_port(chip->ds, port)) in mv88e6xxx_broadcast_setup()
2568 if (ctx->flood) in mv88e6xxx_port_broadcast_sync_vlan()
2575 return mv88e6xxx_port_db_load_purge(chip, ctx->port, broadcast, in mv88e6xxx_port_broadcast_sync_vlan()
2576 vlan->vid, state); in mv88e6xxx_port_broadcast_sync_vlan()
2645 dev_info(chip->dev, "p%d: already a member of VLAN %d\n", in mv88e6xxx_port_vlan_join()
2650 bitmap_set(chip->fid_bitmap, vlan.fid, 1); in mv88e6xxx_port_vlan_join()
2659 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_vlan_add()
2660 bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED; in mv88e6xxx_port_vlan_add()
2661 bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID; in mv88e6xxx_port_vlan_add()
2662 struct mv88e6xxx_port *p = &chip->ports[port]; in mv88e6xxx_port_vlan_add()
2667 if (!vlan->vid) in mv88e6xxx_port_vlan_add()
2688 err = mv88e6xxx_port_vlan_join(chip, port, vlan->vid, member, warn); in mv88e6xxx_port_vlan_add()
2690 dev_err(ds->dev, "p%d: failed to add VLAN %d%c\n", port, in mv88e6xxx_port_vlan_add()
2691 vlan->vid, untagged ? 'u' : 't'); in mv88e6xxx_port_vlan_add()
2696 p->bridge_pvid.vid = vlan->vid; in mv88e6xxx_port_vlan_add()
2697 p->bridge_pvid.valid = true; in mv88e6xxx_port_vlan_add()
2702 } else if (vlan->vid && p->bridge_pvid.vid == vlan->vid) { in mv88e6xxx_port_vlan_add()
2703 /* The old pvid was reinstalled as a non-pvid VLAN */ in mv88e6xxx_port_vlan_add()
2704 p->bridge_pvid.valid = false; in mv88e6xxx_port_vlan_add()
2735 return -EOPNOTSUPP; in mv88e6xxx_port_vlan_leave()
2759 bitmap_clear(chip->fid_bitmap, vlan.fid, 1); in mv88e6xxx_port_vlan_leave()
2768 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_vlan_del()
2769 struct mv88e6xxx_port *p = &chip->ports[port]; in mv88e6xxx_port_vlan_del()
2774 return -EOPNOTSUPP; in mv88e6xxx_port_vlan_del()
2789 err = mv88e6xxx_port_vlan_leave(chip, port, vlan->vid); in mv88e6xxx_port_vlan_del()
2793 if (vlan->vid == pvid) { in mv88e6xxx_port_vlan_del()
2794 p->bridge_pvid.valid = false; in mv88e6xxx_port_vlan_del()
2809 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_vlan_fast_age()
2831 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_vlan_msti_set()
2837 return -EOPNOTSUPP; in mv88e6xxx_vlan_msti_set()
2841 err = mv88e6xxx_vtu_get(chip, msti->vid, &vlan); in mv88e6xxx_vlan_msti_set()
2846 err = -EINVAL; in mv88e6xxx_vlan_msti_set()
2852 err = mv88e6xxx_mst_get(chip, bridge.dev, msti->msti, &new_sid); in mv88e6xxx_vlan_msti_set()
2877 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_fdb_add()
2887 err = -ENOSPC; in mv88e6xxx_port_fdb_add()
2899 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_fdb_del()
2956 return mv88e6xxx_port_db_dump_fid(chip, entry->fid, entry->vid, in mv88e6xxx_port_db_dump_vlan()
2957 ctx->port, ctx->cb, ctx->data); in mv88e6xxx_port_db_dump_vlan()
2986 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_fdb_dump()
2999 struct dsa_switch *ds = chip->ds; in mv88e6xxx_bridge_map()
3000 struct dsa_switch_tree *dst = ds->dst; in mv88e6xxx_bridge_map()
3004 list_for_each_entry(dp, &dst->ports, list) { in mv88e6xxx_bridge_map()
3006 if (dp->ds == ds) { in mv88e6xxx_bridge_map()
3010 err = mv88e6xxx_port_vlan_map(chip, dp->index); in mv88e6xxx_bridge_map()
3015 * remap its cross-chip Port VLAN Table entry. in mv88e6xxx_bridge_map()
3017 err = mv88e6xxx_pvt_map(chip, dp->ds->index, in mv88e6xxx_bridge_map()
3018 dp->index); in mv88e6xxx_bridge_map()
3028 /* Treat the software bridge as a virtual single-port switch behind the
3029 * CPU and map in the PVT. First dst->last_switch elements are taken by
3035 u8 dev = bridge_num + ds->dst->last_switch; in mv88e6xxx_map_virtual_bridge_to_pvt()
3036 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_map_virtual_bridge_to_pvt()
3046 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_bridge_join()
3080 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_bridge_leave()
3087 dev_err(ds->dev, "failed to remap cross-chip Port VLAN\n"); in mv88e6xxx_port_bridge_leave()
3091 dev_err(ds->dev, "failed to remap in-chip Port VLAN\n"); in mv88e6xxx_port_bridge_leave()
3095 dev_err(ds->dev, in mv88e6xxx_port_bridge_leave()
3096 "port %d failed to restore map-DA: %pe\n", in mv88e6xxx_port_bridge_leave()
3101 dev_err(ds->dev, in mv88e6xxx_port_bridge_leave()
3113 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_crosschip_bridge_join()
3116 if (tree_index != ds->dst->index) in mv88e6xxx_crosschip_bridge_join()
3131 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_crosschip_bridge_leave()
3133 if (tree_index != ds->dst->index) in mv88e6xxx_crosschip_bridge_leave()
3139 dev_err(ds->dev, "failed to remap cross-chip Port VLAN\n"); in mv88e6xxx_crosschip_bridge_leave()
3145 if (chip->info->ops->reset) in mv88e6xxx_software_reset()
3146 return chip->info->ops->reset(chip); in mv88e6xxx_software_reset()
3153 struct gpio_desc *gpiod = chip->reset; in mv88e6xxx_hardware_reset()
3160 * mid-byte, causing the first EEPROM read after the reset in mv88e6xxx_hardware_reset()
3164 * generally wait for EEPROM loads to complete as their pre- in mv88e6xxx_hardware_reset()
3165 * and post-reset handlers. in mv88e6xxx_hardware_reset()
3167 if (chip->info->ops->hardware_reset_pre) { in mv88e6xxx_hardware_reset()
3168 err = chip->info->ops->hardware_reset_pre(chip); in mv88e6xxx_hardware_reset()
3170 dev_err(chip->dev, "pre-reset error: %d\n", err); in mv88e6xxx_hardware_reset()
3178 if (chip->info->ops->hardware_reset_post) { in mv88e6xxx_hardware_reset()
3179 err = chip->info->ops->hardware_reset_post(chip); in mv88e6xxx_hardware_reset()
3181 dev_err(chip->dev, "post-reset error: %d\n", err); in mv88e6xxx_hardware_reset()
3224 if (!chip->info->ops->port_set_frame_mode) in mv88e6xxx_set_port_mode()
3225 return -EOPNOTSUPP; in mv88e6xxx_set_port_mode()
3231 err = chip->info->ops->port_set_frame_mode(chip, port, frame); in mv88e6xxx_set_port_mode()
3235 if (chip->info->ops->port_set_ether_type) in mv88e6xxx_set_port_mode()
3236 return chip->info->ops->port_set_ether_type(chip, port, etype); in mv88e6xxx_set_port_mode()
3265 if (dsa_is_dsa_port(chip->ds, port)) in mv88e6xxx_setup_port_mode()
3268 if (dsa_is_user_port(chip->ds, port)) in mv88e6xxx_setup_port_mode()
3272 if (chip->tag_protocol == DSA_TAG_PROTO_DSA) in mv88e6xxx_setup_port_mode()
3275 if (chip->tag_protocol == DSA_TAG_PROTO_EDSA) in mv88e6xxx_setup_port_mode()
3278 return -EINVAL; in mv88e6xxx_setup_port_mode()
3283 bool message = dsa_is_dsa_port(chip->ds, port); in mv88e6xxx_setup_message_port()
3292 if (chip->info->ops->port_set_ucast_flood) { in mv88e6xxx_setup_egress_floods()
3293 err = chip->info->ops->port_set_ucast_flood(chip, port, true); in mv88e6xxx_setup_egress_floods()
3297 if (chip->info->ops->port_set_mcast_flood) { in mv88e6xxx_setup_egress_floods()
3298 err = chip->info->ops->port_set_mcast_flood(chip, port, true); in mv88e6xxx_setup_egress_floods()
3312 if (!chip->info->ops->set_egress_port) in mv88e6xxx_set_egress_port()
3313 return -EOPNOTSUPP; in mv88e6xxx_set_egress_port()
3315 err = chip->info->ops->set_egress_port(chip, direction, port); in mv88e6xxx_set_egress_port()
3320 chip->ingress_dest_port = port; in mv88e6xxx_set_egress_port()
3322 chip->egress_dest_port = port; in mv88e6xxx_set_egress_port()
3329 struct dsa_switch *ds = chip->ds; in mv88e6xxx_setup_upstream_port()
3334 if (chip->info->ops->port_set_upstream_port) { in mv88e6xxx_setup_upstream_port()
3335 err = chip->info->ops->port_set_upstream_port(chip, port, in mv88e6xxx_setup_upstream_port()
3342 if (chip->info->ops->set_cpu_port) { in mv88e6xxx_setup_upstream_port()
3343 err = chip->info->ops->set_cpu_port(chip, in mv88e6xxx_setup_upstream_port()
3352 if (err && err != -EOPNOTSUPP) in mv88e6xxx_setup_upstream_port()
3358 if (err && err != -EOPNOTSUPP) in mv88e6xxx_setup_upstream_port()
3370 struct dsa_switch *ds = chip->ds; in mv88e6xxx_setup_port()
3378 p = &chip->ports[port]; in mv88e6xxx_setup_port()
3379 p->chip = chip; in mv88e6xxx_setup_port()
3380 p->port = port; in mv88e6xxx_setup_port()
3383 ports_fwnode = device_get_named_child_node(chip->dev, "ethernet-ports"); in mv88e6xxx_setup_port()
3385 ports_fwnode = device_get_named_child_node(chip->dev, "ports"); in mv88e6xxx_setup_port()
3391 p->fwnode = port_fwnode; in mv88e6xxx_setup_port()
3392 p->fiber = fwnode_property_present(port_fwnode, "sfp"); in mv88e6xxx_setup_port()
3398 dev_dbg(chip->dev, "no ethernet ports node defined for the device\n"); in mv88e6xxx_setup_port()
3401 if (chip->info->ops->port_setup_leds) { in mv88e6xxx_setup_port()
3402 err = chip->info->ops->port_setup_leds(chip, port); in mv88e6xxx_setup_port()
3403 if (err && err != -EOPNOTSUPP) in mv88e6xxx_setup_port()
3413 /* Port Control: disable Drop-on-Unlock, disable Drop-on-Lock, in mv88e6xxx_setup_port()
3470 chip->info->ops->port_set_policy) { in mv88e6xxx_setup_port()
3471 err = chip->info->ops->port_set_policy(chip, port, in mv88e6xxx_setup_port()
3480 * loaded in the VTU - therefore, enable 802.1Q in order to take in mv88e6xxx_setup_port()
3506 * as the private PVID on ports under a VLAN-unaware bridge. in mv88e6xxx_setup_port()
3517 if (chip->info->ops->port_set_jumbo_size) { in mv88e6xxx_setup_port()
3518 err = chip->info->ops->port_set_jumbo_size(chip, port, 10218); in mv88e6xxx_setup_port()
3549 if (chip->info->ops->port_pause_limit) { in mv88e6xxx_setup_port()
3550 err = chip->info->ops->port_pause_limit(chip, port, 0, 0); in mv88e6xxx_setup_port()
3555 if (chip->info->ops->port_disable_learn_limit) { in mv88e6xxx_setup_port()
3556 err = chip->info->ops->port_disable_learn_limit(chip, port); in mv88e6xxx_setup_port()
3561 if (chip->info->ops->port_disable_pri_override) { in mv88e6xxx_setup_port()
3562 err = chip->info->ops->port_disable_pri_override(chip, port); in mv88e6xxx_setup_port()
3567 if (chip->info->ops->port_tag_remap) { in mv88e6xxx_setup_port()
3568 err = chip->info->ops->port_tag_remap(chip, port); in mv88e6xxx_setup_port()
3573 if (chip->info->ops->port_egress_rate_limiting) { in mv88e6xxx_setup_port()
3574 err = chip->info->ops->port_egress_rate_limiting(chip, port); in mv88e6xxx_setup_port()
3579 if (chip->info->ops->port_setup_message_port) { in mv88e6xxx_setup_port()
3580 err = chip->info->ops->port_setup_message_port(chip, port); in mv88e6xxx_setup_port()
3585 if (chip->info->ops->serdes_set_tx_amplitude) { in mv88e6xxx_setup_port()
3588 phy_handle = of_parse_phandle(dp->dn, "phy-handle", 0); in mv88e6xxx_setup_port()
3591 "tx-p2p-microvolt", in mv88e6xxx_setup_port()
3593 err = chip->info->ops->serdes_set_tx_amplitude(chip, in mv88e6xxx_setup_port()
3622 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_get_max_mtu()
3624 if (chip->info->ops->port_set_jumbo_size) in mv88e6xxx_get_max_mtu()
3625 return 10240 - VLAN_ETH_HLEN - EDSA_HLEN - ETH_FCS_LEN; in mv88e6xxx_get_max_mtu()
3626 else if (chip->info->ops->set_max_frame_size) in mv88e6xxx_get_max_mtu()
3627 return 1632 - VLAN_ETH_HLEN - EDSA_HLEN - ETH_FCS_LEN; in mv88e6xxx_get_max_mtu()
3633 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_change_mtu()
3639 if (!chip->info->ops->port_set_jumbo_size && in mv88e6xxx_change_mtu()
3640 !chip->info->ops->set_max_frame_size) { in mv88e6xxx_change_mtu()
3642 return -EINVAL; in mv88e6xxx_change_mtu()
3651 if (chip->info->ops->port_set_jumbo_size) in mv88e6xxx_change_mtu()
3652 ret = chip->info->ops->port_set_jumbo_size(chip, port, new_mtu); in mv88e6xxx_change_mtu()
3653 else if (chip->info->ops->set_max_frame_size && in mv88e6xxx_change_mtu()
3655 ret = chip->info->ops->set_max_frame_size(chip, new_mtu); in mv88e6xxx_change_mtu()
3664 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_set_ageing_time()
3679 if (chip->info->ops->stats_set_histogram) { in mv88e6xxx_stats_setup()
3680 err = chip->info->ops->stats_set_histogram(chip); in mv88e6xxx_stats_setup()
3713 dev_err(chip->dev, in mv88e6390_setup_errata_applied()
3761 struct mv88e6xxx_mdio_bus *mdio_bus = bus->priv; in mv88e6xxx_mdio_read()
3762 struct mv88e6xxx_chip *chip = mdio_bus->chip; in mv88e6xxx_mdio_read()
3767 if (!chip->info->ops->phy_read) in mv88e6xxx_mdio_read()
3768 return -EOPNOTSUPP; in mv88e6xxx_mdio_read()
3771 err = chip->info->ops->phy_read(chip, bus, phy, reg, &val); in mv88e6xxx_mdio_read()
3776 chip->info->family < ARRAY_SIZE(family_prod_id_table)) { in mv88e6xxx_mdio_read()
3777 prod_id = family_prod_id_table[chip->info->family]; in mv88e6xxx_mdio_read()
3788 struct mv88e6xxx_mdio_bus *mdio_bus = bus->priv; in mv88e6xxx_mdio_read_c45()
3789 struct mv88e6xxx_chip *chip = mdio_bus->chip; in mv88e6xxx_mdio_read_c45()
3793 if (!chip->info->ops->phy_read_c45) in mv88e6xxx_mdio_read_c45()
3794 return -ENODEV; in mv88e6xxx_mdio_read_c45()
3797 err = chip->info->ops->phy_read_c45(chip, bus, phy, devad, reg, &val); in mv88e6xxx_mdio_read_c45()
3805 struct mv88e6xxx_mdio_bus *mdio_bus = bus->priv; in mv88e6xxx_mdio_write()
3806 struct mv88e6xxx_chip *chip = mdio_bus->chip; in mv88e6xxx_mdio_write()
3809 if (!chip->info->ops->phy_write) in mv88e6xxx_mdio_write()
3810 return -EOPNOTSUPP; in mv88e6xxx_mdio_write()
3813 err = chip->info->ops->phy_write(chip, bus, phy, reg, val); in mv88e6xxx_mdio_write()
3822 struct mv88e6xxx_mdio_bus *mdio_bus = bus->priv; in mv88e6xxx_mdio_write_c45()
3823 struct mv88e6xxx_chip *chip = mdio_bus->chip; in mv88e6xxx_mdio_write_c45()
3826 if (!chip->info->ops->phy_write_c45) in mv88e6xxx_mdio_write_c45()
3827 return -EOPNOTSUPP; in mv88e6xxx_mdio_write_c45()
3830 err = chip->info->ops->phy_write_c45(chip, bus, phy, devad, reg, val); in mv88e6xxx_mdio_write_c45()
3847 if (chip->info->family == MV88E6XXX_FAMILY_6393) in mv88e6xxx_mdio_register()
3859 return -ENOMEM; in mv88e6xxx_mdio_register()
3861 mdio_bus = bus->priv; in mv88e6xxx_mdio_register()
3862 mdio_bus->bus = bus; in mv88e6xxx_mdio_register()
3863 mdio_bus->chip = chip; in mv88e6xxx_mdio_register()
3864 INIT_LIST_HEAD(&mdio_bus->list); in mv88e6xxx_mdio_register()
3865 mdio_bus->external = external; in mv88e6xxx_mdio_register()
3868 bus->name = np->full_name; in mv88e6xxx_mdio_register()
3869 snprintf(bus->id, MII_BUS_ID_SIZE, "%pOF", np); in mv88e6xxx_mdio_register()
3871 bus->name = "mv88e6xxx SMI"; in mv88e6xxx_mdio_register()
3872 snprintf(bus->id, MII_BUS_ID_SIZE, "mv88e6xxx-%d", index++); in mv88e6xxx_mdio_register()
3875 bus->read = mv88e6xxx_mdio_read; in mv88e6xxx_mdio_register()
3876 bus->write = mv88e6xxx_mdio_write; in mv88e6xxx_mdio_register()
3877 bus->read_c45 = mv88e6xxx_mdio_read_c45; in mv88e6xxx_mdio_register()
3878 bus->write_c45 = mv88e6xxx_mdio_write_c45; in mv88e6xxx_mdio_register()
3879 bus->parent = chip->dev; in mv88e6xxx_mdio_register()
3880 bus->phy_mask = ~GENMASK(chip->info->phy_base_addr + in mv88e6xxx_mdio_register()
3881 mv88e6xxx_num_ports(chip) - 1, in mv88e6xxx_mdio_register()
3882 chip->info->phy_base_addr); in mv88e6xxx_mdio_register()
3892 dev_err(chip->dev, "Cannot register MDIO bus (%d)\n", err); in mv88e6xxx_mdio_register()
3898 list_add_tail(&mdio_bus->list, &chip->mdios); in mv88e6xxx_mdio_register()
3900 list_add(&mdio_bus->list, &chip->mdios); in mv88e6xxx_mdio_register()
3915 list_for_each_entry_safe(mdio_bus, p, &chip->mdios, list) { in mv88e6xxx_mdios_unregister()
3916 bus = mdio_bus->bus; in mv88e6xxx_mdios_unregister()
3918 if (!mdio_bus->external) in mv88e6xxx_mdios_unregister()
3928 struct device_node *np = chip->dev->of_node; in mv88e6xxx_mdios_register()
3948 child, "marvell,mv88e6xxx-mdio-external")) { in mv88e6xxx_mdios_register()
3963 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_teardown()
3973 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_setup()
3982 chip->ds = ds; in mv88e6xxx_setup()
3983 ds->user_mii_bus = mv88e6xxx_default_mdio_bus(chip); in mv88e6xxx_setup()
3991 ds->max_num_bridges = MV88E6XXX_MAX_PVT_SWITCHES - in mv88e6xxx_setup()
3992 ds->dst->last_switch - 1; in mv88e6xxx_setup()
3996 if (chip->info->ops->setup_errata) { in mv88e6xxx_setup()
3997 err = chip->info->ops->setup_errata(chip); in mv88e6xxx_setup()
4004 if (chip->info->ops->port_get_cmode) { in mv88e6xxx_setup()
4005 err = chip->info->ops->port_get_cmode(chip, i, &cmode); in mv88e6xxx_setup()
4009 chip->ports[i].cmode = cmode; in mv88e6xxx_setup()
4031 dev_err(chip->dev, "port %d is invalid\n", i); in mv88e6xxx_setup()
4032 err = -EINVAL; in mv88e6xxx_setup()
4090 if (chip->info->ptp_support) { in mv88e6xxx_setup()
4141 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_setup()
4144 if (chip->info->ops->pcs_ops && in mv88e6xxx_port_setup()
4145 chip->info->ops->pcs_ops->pcs_init) { in mv88e6xxx_port_setup()
4146 err = chip->info->ops->pcs_ops->pcs_init(chip, port); in mv88e6xxx_port_setup()
4156 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_teardown()
4160 if (chip->info->ops->pcs_ops && in mv88e6xxx_port_teardown()
4161 chip->info->ops->pcs_ops->pcs_teardown) in mv88e6xxx_port_teardown()
4162 chip->info->ops->pcs_ops->pcs_teardown(chip, port); in mv88e6xxx_port_teardown()
4167 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_get_eeprom_len()
4169 return chip->eeprom_len; in mv88e6xxx_get_eeprom_len()
4175 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_get_eeprom()
4178 if (!chip->info->ops->get_eeprom) in mv88e6xxx_get_eeprom()
4179 return -EOPNOTSUPP; in mv88e6xxx_get_eeprom()
4182 err = chip->info->ops->get_eeprom(chip, eeprom, data); in mv88e6xxx_get_eeprom()
4188 eeprom->magic = 0xc3ec4951; in mv88e6xxx_get_eeprom()
4196 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_set_eeprom()
4199 if (!chip->info->ops->set_eeprom) in mv88e6xxx_set_eeprom()
4200 return -EOPNOTSUPP; in mv88e6xxx_set_eeprom()
4202 if (eeprom->magic != 0xc3ec4951) in mv88e6xxx_set_eeprom()
4203 return -EINVAL; in mv88e6xxx_set_eeprom()
4206 err = chip->info->ops->set_eeprom(chip, eeprom, data); in mv88e6xxx_set_eeprom()
5682 /* Ports 2-4 are not routed to pins
6171 /* Ports 2-4 are not routed to pins
6560 return -ENODEV; in mv88e6xxx_detect()
6563 chip->info = info; in mv88e6xxx_detect()
6565 dev_info(chip->dev, "switch 0x%x detected: %s, revision %u\n", in mv88e6xxx_detect()
6566 chip->info->prod_num, chip->info->name, rev); in mv88e6xxx_detect()
6576 /* dual_chip takes precedence over single/multi-chip modes */ in mv88e6xxx_single_chip_detect()
6577 if (chip->info->dual_chip) in mv88e6xxx_single_chip_detect()
6578 return -EINVAL; in mv88e6xxx_single_chip_detect()
6587 if (mdiodev->addr != 16) in mv88e6xxx_single_chip_detect()
6588 return -EINVAL; in mv88e6xxx_single_chip_detect()
6590 err = mv88e6xxx_smi_init(chip, mdiodev->bus, 0); in mv88e6xxx_single_chip_detect()
6605 chip->dev = dev; in mv88e6xxx_alloc_chip()
6607 mutex_init(&chip->reg_lock); in mv88e6xxx_alloc_chip()
6608 INIT_LIST_HEAD(&chip->mdios); in mv88e6xxx_alloc_chip()
6609 idr_init(&chip->policies); in mv88e6xxx_alloc_chip()
6610 INIT_LIST_HEAD(&chip->msts); in mv88e6xxx_alloc_chip()
6619 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_get_tag_protocol()
6621 return chip->tag_protocol; in mv88e6xxx_get_tag_protocol()
6627 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_change_tag_protocol()
6634 switch (chip->info->edsa_support) { in mv88e6xxx_change_tag_protocol()
6636 return -EPROTONOSUPPORT; in mv88e6xxx_change_tag_protocol()
6638 dev_warn(chip->dev, "Relying on undocumented EDSA tagging behavior\n"); in mv88e6xxx_change_tag_protocol()
6647 return -EPROTONOSUPPORT; in mv88e6xxx_change_tag_protocol()
6650 old_protocol = chip->tag_protocol; in mv88e6xxx_change_tag_protocol()
6651 chip->tag_protocol = proto; in mv88e6xxx_change_tag_protocol()
6655 err = mv88e6xxx_setup_port_mode(chip, cpu_dp->index); in mv88e6xxx_change_tag_protocol()
6666 chip->tag_protocol = old_protocol; in mv88e6xxx_change_tag_protocol()
6670 mv88e6xxx_setup_port_mode(chip, cpu_dp->index); in mv88e6xxx_change_tag_protocol()
6680 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_mdb_add()
6684 err = mv88e6xxx_port_db_load_purge(chip, port, mdb->addr, mdb->vid, in mv88e6xxx_port_mdb_add()
6689 if (!mv88e6xxx_port_db_find(chip, mdb->addr, mdb->vid)) in mv88e6xxx_port_mdb_add()
6690 err = -ENOSPC; in mv88e6xxx_port_mdb_add()
6702 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_mdb_del()
6706 err = mv88e6xxx_port_db_load_purge(chip, port, mdb->addr, mdb->vid, 0); in mv88e6xxx_port_mdb_del()
6720 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_mirror_add()
6725 mutex_lock(&chip->reg_lock); in mv88e6xxx_port_mirror_add()
6726 if ((ingress ? chip->ingress_dest_port : chip->egress_dest_port) != in mv88e6xxx_port_mirror_add()
6727 mirror->to_local_port) { in mv88e6xxx_port_mirror_add()
6730 chip->ports[i].mirror_ingress : in mv88e6xxx_port_mirror_add()
6731 chip->ports[i].mirror_egress; in mv88e6xxx_port_mirror_add()
6735 err = -EBUSY; in mv88e6xxx_port_mirror_add()
6740 mirror->to_local_port); in mv88e6xxx_port_mirror_add()
6747 mutex_unlock(&chip->reg_lock); in mv88e6xxx_port_mirror_add()
6755 enum mv88e6xxx_egress_direction direction = mirror->ingress ? in mv88e6xxx_port_mirror_del()
6758 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_mirror_del()
6762 mutex_lock(&chip->reg_lock); in mv88e6xxx_port_mirror_del()
6764 dev_err(ds->dev, "p%d: failed to disable mirroring\n", port); in mv88e6xxx_port_mirror_del()
6767 other_mirrors |= mirror->ingress ? in mv88e6xxx_port_mirror_del()
6768 chip->ports[i].mirror_ingress : in mv88e6xxx_port_mirror_del()
6769 chip->ports[i].mirror_egress; in mv88e6xxx_port_mirror_del()
6775 dev_err(ds->dev, "failed to set egress port\n"); in mv88e6xxx_port_mirror_del()
6778 mutex_unlock(&chip->reg_lock); in mv88e6xxx_port_mirror_del()
6785 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_pre_bridge_flags()
6790 return -EINVAL; in mv88e6xxx_port_pre_bridge_flags()
6792 ops = chip->info->ops; in mv88e6xxx_port_pre_bridge_flags()
6794 if ((flags.mask & BR_FLOOD) && !ops->port_set_ucast_flood) in mv88e6xxx_port_pre_bridge_flags()
6795 return -EINVAL; in mv88e6xxx_port_pre_bridge_flags()
6797 if ((flags.mask & BR_MCAST_FLOOD) && !ops->port_set_mcast_flood) in mv88e6xxx_port_pre_bridge_flags()
6798 return -EINVAL; in mv88e6xxx_port_pre_bridge_flags()
6807 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_bridge_flags()
6824 err = chip->info->ops->port_set_ucast_flood(chip, port, in mv88e6xxx_port_bridge_flags()
6833 err = chip->info->ops->port_set_mcast_flood(chip, port, in mv88e6xxx_port_bridge_flags()
6871 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_lag_can_offload()
6883 dsa_lag_foreach_port(dp, ds->dst, &lag) in mv88e6xxx_lag_can_offload()
6896 if (info->tx_type != NETDEV_LAG_TX_TYPE_HASH) { in mv88e6xxx_lag_can_offload()
6898 "Can only offload LAG using hash TX type"); in mv88e6xxx_lag_can_offload()
6911 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_lag_sync_map()
6916 /* DSA LAG IDs are one-based, hardware is zero-based */ in mv88e6xxx_lag_sync_map()
6917 id = lag.id - 1; in mv88e6xxx_lag_sync_map()
6923 dsa_lag_foreach_port(dp, ds->dst, &lag) in mv88e6xxx_lag_sync_map()
6924 map |= BIT(dsa_towards_port(ds, dp->ds->index, dp->index)); in mv88e6xxx_lag_sync_map()
6956 active = mv88e6xxx_lag_mask_table[num_tx - 1][nth]; in mv88e6xxx_lag_set_port_mask()
6966 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_lag_sync_masks()
6975 ivec = BIT(mv88e6xxx_num_ports(chip)) - 1; in mv88e6xxx_lag_sync_masks()
6979 if (!dp->lag) in mv88e6xxx_lag_sync_masks()
6982 ivec &= ~BIT(dp->index); in mv88e6xxx_lag_sync_masks()
6989 * are in the Tx set. in mv88e6xxx_lag_sync_masks()
6991 dsa_lags_foreach_id(id, ds->dst) { in mv88e6xxx_lag_sync_masks()
6992 lag = dsa_lag_by_id(ds->dst, id); in mv88e6xxx_lag_sync_masks()
6997 dsa_lag_foreach_port(dp, ds->dst, lag) { in mv88e6xxx_lag_sync_masks()
6998 if (dp->lag_tx_enabled) in mv88e6xxx_lag_sync_masks()
7006 dsa_lag_foreach_port(dp, ds->dst, lag) { in mv88e6xxx_lag_sync_masks()
7007 if (!dp->lag_tx_enabled) in mv88e6xxx_lag_sync_masks()
7010 if (dp->ds == ds) in mv88e6xxx_lag_sync_masks()
7011 mv88e6xxx_lag_set_port_mask(mask, dp->index, in mv88e6xxx_lag_sync_masks()
7042 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_lag_change()
7056 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_lag_join()
7060 return -EOPNOTSUPP; in mv88e6xxx_port_lag_join()
7062 /* DSA LAG IDs are one-based */ in mv88e6xxx_port_lag_join()
7063 id = lag.id - 1; in mv88e6xxx_port_lag_join()
7088 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_port_lag_leave()
7101 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_crosschip_lag_change()
7115 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_crosschip_lag_join()
7119 return -EOPNOTSUPP; in mv88e6xxx_crosschip_lag_join()
7137 struct mv88e6xxx_chip *chip = ds->priv; in mv88e6xxx_crosschip_lag_leave()
7220 struct device *dev = chip->dev; in mv88e6xxx_register_switch()
7225 return -ENOMEM; in mv88e6xxx_register_switch()
7227 ds->dev = dev; in mv88e6xxx_register_switch()
7228 ds->num_ports = mv88e6xxx_num_ports(chip); in mv88e6xxx_register_switch()
7229 ds->priv = chip; in mv88e6xxx_register_switch()
7230 ds->dev = dev; in mv88e6xxx_register_switch()
7231 ds->ops = &mv88e6xxx_switch_ops; in mv88e6xxx_register_switch()
7232 ds->phylink_mac_ops = &mv88e6xxx_phylink_mac_ops; in mv88e6xxx_register_switch()
7233 ds->ageing_time_min = chip->info->age_time_coeff; in mv88e6xxx_register_switch()
7234 ds->ageing_time_max = chip->info->age_time_coeff * U8_MAX; in mv88e6xxx_register_switch()
7237 * 5-bit port mode, which we do not support. 640k^W16 ought to in mv88e6xxx_register_switch()
7240 ds->num_lag_ids = mv88e6xxx_has_lag(chip) ? 16 : 0; in mv88e6xxx_register_switch()
7249 dsa_unregister_switch(chip->ds); in mv88e6xxx_unregister_switch()
7254 const struct of_device_id *matches = dev->driver->of_match_table; in pdata_device_get_match_data()
7255 const struct dsa_mv88e6xxx_pdata *pdata = dev->platform_data; in pdata_device_get_match_data()
7257 for (; matches->name[0] || matches->type[0] || matches->compatible[0]; in pdata_device_get_match_data()
7259 if (!strcmp(pdata->compatible, matches->compatible)) in pdata_device_get_match_data()
7260 return matches->data; in pdata_device_get_match_data()
7270 return -EOPNOTSUPP; in mv88e6xxx_suspend()
7282 struct dsa_mv88e6xxx_pdata *pdata = mdiodev->dev.platform_data; in mv88e6xxx_probe()
7284 struct device *dev = &mdiodev->dev; in mv88e6xxx_probe()
7285 struct device_node *np = dev->of_node; in mv88e6xxx_probe()
7291 return -EINVAL; in mv88e6xxx_probe()
7299 if (!pdata->netdev) in mv88e6xxx_probe()
7300 return -EINVAL; in mv88e6xxx_probe()
7303 if (!(pdata->enabled_ports & (1 << port))) in mv88e6xxx_probe()
7305 if (strcmp(pdata->cd.port_names[port], "cpu")) in mv88e6xxx_probe()
7307 pdata->cd.netdev[port] = &pdata->netdev->dev; in mv88e6xxx_probe()
7313 return -EINVAL; in mv88e6xxx_probe()
7317 err = -ENOMEM; in mv88e6xxx_probe()
7321 chip->info = compat_info; in mv88e6xxx_probe()
7323 chip->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); in mv88e6xxx_probe()
7324 if (IS_ERR(chip->reset)) { in mv88e6xxx_probe()
7325 err = PTR_ERR(chip->reset); in mv88e6xxx_probe()
7328 if (chip->reset) in mv88e6xxx_probe()
7336 err = mv88e6xxx_smi_init(chip, mdiodev->bus, mdiodev->addr); in mv88e6xxx_probe()
7345 if (chip->info->edsa_support == MV88E6XXX_EDSA_SUPPORTED) in mv88e6xxx_probe()
7346 chip->tag_protocol = DSA_TAG_PROTO_EDSA; in mv88e6xxx_probe()
7348 chip->tag_protocol = DSA_TAG_PROTO_DSA; in mv88e6xxx_probe()
7352 if (chip->info->ops->get_eeprom) { in mv88e6xxx_probe()
7354 of_property_read_u32(np, "eeprom-length", in mv88e6xxx_probe()
7355 &chip->eeprom_len); in mv88e6xxx_probe()
7357 chip->eeprom_len = pdata->eeprom_len; in mv88e6xxx_probe()
7367 chip->irq = of_irq_get(np, 0); in mv88e6xxx_probe()
7368 if (chip->irq == -EPROBE_DEFER) { in mv88e6xxx_probe()
7369 err = chip->irq; in mv88e6xxx_probe()
7375 chip->irq = pdata->irq; in mv88e6xxx_probe()
7382 if (chip->irq > 0) in mv88e6xxx_probe()
7391 if (chip->info->g2_irqs > 0) { in mv88e6xxx_probe()
7416 if (chip->info->g2_irqs > 0) in mv88e6xxx_probe()
7419 if (chip->irq > 0) in mv88e6xxx_probe()
7427 dev_put(pdata->netdev); in mv88e6xxx_probe()
7434 struct dsa_switch *ds = dev_get_drvdata(&mdiodev->dev); in mv88e6xxx_remove()
7440 chip = ds->priv; in mv88e6xxx_remove()
7442 if (chip->info->ptp_support) { in mv88e6xxx_remove()
7452 if (chip->info->g2_irqs > 0) in mv88e6xxx_remove()
7455 if (chip->irq > 0) in mv88e6xxx_remove()
7465 struct dsa_switch *ds = dev_get_drvdata(&mdiodev->dev); in mv88e6xxx_shutdown()
7472 dev_set_drvdata(&mdiodev->dev, NULL); in mv88e6xxx_shutdown()