Lines Matching +full:synclko +full:- +full:disable

1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2017-2019 Microchip Technology Inc.
14 #include <linux/platform_data/microchip-ksz.h>
203 * struct ksz_drive_strength - drive strength mapping
212 /* ksz9477_drive_strengths - Drive strength mapping for KSZ9477 variants
220 * - for high speed signals
230 * - for low speed signals
247 /* ksz8830_drive_strengths - Drive strength mapping for KSZ8830, KSZ8873, ..
1247 * port map is NOT continuous. The per-port register
1667 if (chip->chip_id == prod_num) in ksz_lookup_info()
1679 if (dev->pdata) { in ksz_check_device_id()
1680 expected_chip_id = dev->pdata->chip_id; in ksz_check_device_id()
1683 return -ENODEV; in ksz_check_device_id()
1685 expected_chip_data = of_device_get_match_data(dev->dev); in ksz_check_device_id()
1686 expected_chip_id = expected_chip_data->chip_id; in ksz_check_device_id()
1689 if (expected_chip_id != dev->chip_id) { in ksz_check_device_id()
1690 dev_err(dev->dev, in ksz_check_device_id()
1692 expected_chip_data->dev_name, dev->info->dev_name); in ksz_check_device_id()
1693 return -ENODEV; in ksz_check_device_id()
1702 struct ksz_device *dev = ds->priv; in ksz_phylink_get_caps()
1704 if (dev->info->supports_mii[port]) in ksz_phylink_get_caps()
1705 __set_bit(PHY_INTERFACE_MODE_MII, config->supported_interfaces); in ksz_phylink_get_caps()
1707 if (dev->info->supports_rmii[port]) in ksz_phylink_get_caps()
1709 config->supported_interfaces); in ksz_phylink_get_caps()
1711 if (dev->info->supports_rgmii[port]) in ksz_phylink_get_caps()
1712 phy_interface_set_rgmii(config->supported_interfaces); in ksz_phylink_get_caps()
1714 if (dev->info->internal_phy[port]) { in ksz_phylink_get_caps()
1716 config->supported_interfaces); in ksz_phylink_get_caps()
1718 * phy-mode property is absent in ksz_phylink_get_caps()
1721 config->supported_interfaces); in ksz_phylink_get_caps()
1724 if (dev->dev_ops->get_caps) in ksz_phylink_get_caps()
1725 dev->dev_ops->get_caps(dev, port, config); in ksz_phylink_get_caps()
1735 mib = &dev->ports[port].mib; in ksz_r_mib_stats64()
1736 stats = &mib->stats64; in ksz_r_mib_stats64()
1737 pstats = &mib->pause_stats; in ksz_r_mib_stats64()
1738 raw = (struct ksz_stats_raw *)mib->counters; in ksz_r_mib_stats64()
1740 spin_lock(&mib->stats64_lock); in ksz_r_mib_stats64()
1742 stats->rx_packets = raw->rx_bcast + raw->rx_mcast + raw->rx_ucast + in ksz_r_mib_stats64()
1743 raw->rx_pause; in ksz_r_mib_stats64()
1744 stats->tx_packets = raw->tx_bcast + raw->tx_mcast + raw->tx_ucast + in ksz_r_mib_stats64()
1745 raw->tx_pause; in ksz_r_mib_stats64()
1750 stats->rx_bytes = raw->rx_total - stats->rx_packets * ETH_FCS_LEN; in ksz_r_mib_stats64()
1751 stats->tx_bytes = raw->tx_total - stats->tx_packets * ETH_FCS_LEN; in ksz_r_mib_stats64()
1753 stats->rx_length_errors = raw->rx_undersize + raw->rx_fragments + in ksz_r_mib_stats64()
1754 raw->rx_oversize; in ksz_r_mib_stats64()
1756 stats->rx_crc_errors = raw->rx_crc_err; in ksz_r_mib_stats64()
1757 stats->rx_frame_errors = raw->rx_align_err; in ksz_r_mib_stats64()
1758 stats->rx_dropped = raw->rx_discards; in ksz_r_mib_stats64()
1759 stats->rx_errors = stats->rx_length_errors + stats->rx_crc_errors + in ksz_r_mib_stats64()
1760 stats->rx_frame_errors + stats->rx_dropped; in ksz_r_mib_stats64()
1762 stats->tx_window_errors = raw->tx_late_col; in ksz_r_mib_stats64()
1763 stats->tx_fifo_errors = raw->tx_discards; in ksz_r_mib_stats64()
1764 stats->tx_aborted_errors = raw->tx_exc_col; in ksz_r_mib_stats64()
1765 stats->tx_errors = stats->tx_window_errors + stats->tx_fifo_errors + in ksz_r_mib_stats64()
1766 stats->tx_aborted_errors; in ksz_r_mib_stats64()
1768 stats->multicast = raw->rx_mcast; in ksz_r_mib_stats64()
1769 stats->collisions = raw->tx_total_col; in ksz_r_mib_stats64()
1771 pstats->tx_pause_frames = raw->tx_pause; in ksz_r_mib_stats64()
1772 pstats->rx_pause_frames = raw->rx_pause; in ksz_r_mib_stats64()
1774 spin_unlock(&mib->stats64_lock); in ksz_r_mib_stats64()
1784 mib = &dev->ports[port].mib; in ksz88xx_r_mib_stats64()
1785 stats = &mib->stats64; in ksz88xx_r_mib_stats64()
1786 pstats = &mib->pause_stats; in ksz88xx_r_mib_stats64()
1787 raw = (struct ksz88xx_stats_raw *)mib->counters; in ksz88xx_r_mib_stats64()
1789 spin_lock(&mib->stats64_lock); in ksz88xx_r_mib_stats64()
1791 stats->rx_packets = raw->rx_bcast + raw->rx_mcast + raw->rx_ucast + in ksz88xx_r_mib_stats64()
1792 raw->rx_pause; in ksz88xx_r_mib_stats64()
1793 stats->tx_packets = raw->tx_bcast + raw->tx_mcast + raw->tx_ucast + in ksz88xx_r_mib_stats64()
1794 raw->tx_pause; in ksz88xx_r_mib_stats64()
1799 stats->rx_bytes = raw->rx + raw->rx_hi - stats->rx_packets * ETH_FCS_LEN; in ksz88xx_r_mib_stats64()
1800 stats->tx_bytes = raw->tx + raw->tx_hi - stats->tx_packets * ETH_FCS_LEN; in ksz88xx_r_mib_stats64()
1802 stats->rx_length_errors = raw->rx_undersize + raw->rx_fragments + in ksz88xx_r_mib_stats64()
1803 raw->rx_oversize; in ksz88xx_r_mib_stats64()
1805 stats->rx_crc_errors = raw->rx_crc_err; in ksz88xx_r_mib_stats64()
1806 stats->rx_frame_errors = raw->rx_align_err; in ksz88xx_r_mib_stats64()
1807 stats->rx_dropped = raw->rx_discards; in ksz88xx_r_mib_stats64()
1808 stats->rx_errors = stats->rx_length_errors + stats->rx_crc_errors + in ksz88xx_r_mib_stats64()
1809 stats->rx_frame_errors + stats->rx_dropped; in ksz88xx_r_mib_stats64()
1811 stats->tx_window_errors = raw->tx_late_col; in ksz88xx_r_mib_stats64()
1812 stats->tx_fifo_errors = raw->tx_discards; in ksz88xx_r_mib_stats64()
1813 stats->tx_aborted_errors = raw->tx_exc_col; in ksz88xx_r_mib_stats64()
1814 stats->tx_errors = stats->tx_window_errors + stats->tx_fifo_errors + in ksz88xx_r_mib_stats64()
1815 stats->tx_aborted_errors; in ksz88xx_r_mib_stats64()
1817 stats->multicast = raw->rx_mcast; in ksz88xx_r_mib_stats64()
1818 stats->collisions = raw->tx_total_col; in ksz88xx_r_mib_stats64()
1820 pstats->tx_pause_frames = raw->tx_pause; in ksz88xx_r_mib_stats64()
1821 pstats->rx_pause_frames = raw->rx_pause; in ksz88xx_r_mib_stats64()
1823 spin_unlock(&mib->stats64_lock); in ksz88xx_r_mib_stats64()
1829 struct ksz_device *dev = ds->priv; in ksz_get_stats64()
1832 mib = &dev->ports[port].mib; in ksz_get_stats64()
1834 spin_lock(&mib->stats64_lock); in ksz_get_stats64()
1835 memcpy(s, &mib->stats64, sizeof(*s)); in ksz_get_stats64()
1836 spin_unlock(&mib->stats64_lock); in ksz_get_stats64()
1842 struct ksz_device *dev = ds->priv; in ksz_get_pause_stats()
1845 mib = &dev->ports[port].mib; in ksz_get_pause_stats()
1847 spin_lock(&mib->stats64_lock); in ksz_get_pause_stats()
1848 memcpy(pause_stats, &mib->pause_stats, sizeof(*pause_stats)); in ksz_get_pause_stats()
1849 spin_unlock(&mib->stats64_lock); in ksz_get_pause_stats()
1855 struct ksz_device *dev = ds->priv; in ksz_get_strings()
1861 for (i = 0; i < dev->info->mib_cnt; i++) { in ksz_get_strings()
1863 dev->info->mib_names[i].string, ETH_GSTRING_LEN); in ksz_get_strings()
1869 struct ksz_port *p = &dev->ports[port]; in ksz_update_port_member()
1870 struct dsa_switch *ds = dev->ds; in ksz_update_port_member()
1881 for (i = 0; i < ds->num_ports; i++) { in ksz_update_port_member()
1883 struct ksz_port *other_p = &dev->ports[i]; in ksz_update_port_member()
1892 if (other_p->stp_state != BR_STATE_FORWARDING) in ksz_update_port_member()
1895 if (p->stp_state == BR_STATE_FORWARDING) { in ksz_update_port_member()
1901 for (j = 0; j < ds->num_ports; j++) { in ksz_update_port_member()
1911 third_p = &dev->ports[j]; in ksz_update_port_member()
1912 if (third_p->stp_state != BR_STATE_FORWARDING) in ksz_update_port_member()
1919 dev->dev_ops->cfg_port_member(dev, i, val | cpu_port); in ksz_update_port_member()
1922 dev->dev_ops->cfg_port_member(dev, port, port_member | cpu_port); in ksz_update_port_member()
1927 struct ksz_device *dev = bus->priv; in ksz_sw_mdio_read()
1931 ret = dev->dev_ops->r_phy(dev, addr, regnum, &val); in ksz_sw_mdio_read()
1941 struct ksz_device *dev = bus->priv; in ksz_sw_mdio_write()
1943 return dev->dev_ops->w_phy(dev, addr, regnum, val); in ksz_sw_mdio_write()
1948 struct dsa_switch *ds = dev->ds; in ksz_irq_phy_setup()
1954 if (BIT(phy) & ds->phys_mii_mask) { in ksz_irq_phy_setup()
1955 irq = irq_find_mapping(dev->ports[phy].pirq.domain, in ksz_irq_phy_setup()
1961 ds->user_mii_bus->irq[phy] = irq; in ksz_irq_phy_setup()
1966 while (phy--) in ksz_irq_phy_setup()
1967 if (BIT(phy) & ds->phys_mii_mask) in ksz_irq_phy_setup()
1968 irq_dispose_mapping(ds->user_mii_bus->irq[phy]); in ksz_irq_phy_setup()
1975 struct dsa_switch *ds = dev->ds; in ksz_irq_phy_free()
1979 if (BIT(phy) & ds->phys_mii_mask) in ksz_irq_phy_free()
1980 irq_dispose_mapping(ds->user_mii_bus->irq[phy]); in ksz_irq_phy_free()
1985 struct dsa_switch *ds = dev->ds; in ksz_mdio_register()
1990 mdio_np = of_get_child_by_name(dev->dev->of_node, "mdio"); in ksz_mdio_register()
1994 bus = devm_mdiobus_alloc(ds->dev); in ksz_mdio_register()
1997 return -ENOMEM; in ksz_mdio_register()
2000 bus->priv = dev; in ksz_mdio_register()
2001 bus->read = ksz_sw_mdio_read; in ksz_mdio_register()
2002 bus->write = ksz_sw_mdio_write; in ksz_mdio_register()
2003 bus->name = "ksz user smi"; in ksz_mdio_register()
2004 snprintf(bus->id, MII_BUS_ID_SIZE, "SMI-%d", ds->index); in ksz_mdio_register()
2005 bus->parent = ds->dev; in ksz_mdio_register()
2006 bus->phy_mask = ~ds->phys_mii_mask; in ksz_mdio_register()
2008 ds->user_mii_bus = bus; in ksz_mdio_register()
2010 if (dev->irq > 0) { in ksz_mdio_register()
2018 ret = devm_of_mdiobus_register(ds->dev, bus, mdio_np); in ksz_mdio_register()
2020 dev_err(ds->dev, "unable to register MDIO bus %s\n", in ksz_mdio_register()
2021 bus->id); in ksz_mdio_register()
2022 if (dev->irq > 0) in ksz_mdio_register()
2035 kirq->masked |= BIT(d->hwirq); in ksz_irq_mask()
2042 kirq->masked &= ~BIT(d->hwirq); in ksz_irq_unmask()
2049 mutex_lock(&kirq->dev->lock_irq); in ksz_irq_bus_lock()
2055 struct ksz_device *dev = kirq->dev; in ksz_irq_bus_sync_unlock()
2058 ret = ksz_write32(dev, kirq->reg_mask, kirq->masked); in ksz_irq_bus_sync_unlock()
2060 dev_err(dev->dev, "failed to change IRQ mask\n"); in ksz_irq_bus_sync_unlock()
2062 mutex_unlock(&dev->lock_irq); in ksz_irq_bus_sync_unlock()
2066 .name = "ksz-irq",
2076 irq_set_chip_data(irq, d->host_data); in ksz_irq_domain_map()
2092 free_irq(kirq->irq_num, kirq); in ksz_irq_free()
2094 for (irq = 0; irq < kirq->nirqs; irq++) { in ksz_irq_free()
2095 virq = irq_find_mapping(kirq->domain, irq); in ksz_irq_free()
2099 irq_domain_remove(kirq->domain); in ksz_irq_free()
2112 dev = kirq->dev; in ksz_irq_thread_fn()
2115 ret = ksz_read8(dev, kirq->reg_status, &data); in ksz_irq_thread_fn()
2119 for (n = 0; n < kirq->nirqs; ++n) { in ksz_irq_thread_fn()
2121 sub_irq = irq_find_mapping(kirq->domain, n); in ksz_irq_thread_fn()
2134 kirq->dev = dev; in ksz_irq_common_setup()
2135 kirq->masked = ~0; in ksz_irq_common_setup()
2137 kirq->domain = irq_domain_add_simple(dev->dev->of_node, kirq->nirqs, 0, in ksz_irq_common_setup()
2139 if (!kirq->domain) in ksz_irq_common_setup()
2140 return -ENOMEM; in ksz_irq_common_setup()
2142 for (n = 0; n < kirq->nirqs; n++) in ksz_irq_common_setup()
2143 irq_create_mapping(kirq->domain, n); in ksz_irq_common_setup()
2145 ret = request_threaded_irq(kirq->irq_num, NULL, ksz_irq_thread_fn, in ksz_irq_common_setup()
2146 IRQF_ONESHOT, kirq->name, kirq); in ksz_irq_common_setup()
2160 struct ksz_irq *girq = &dev->girq; in ksz_girq_setup()
2162 girq->nirqs = dev->info->port_cnt; in ksz_girq_setup()
2163 girq->reg_mask = REG_SW_PORT_INT_MASK__1; in ksz_girq_setup()
2164 girq->reg_status = REG_SW_PORT_INT_STATUS__1; in ksz_girq_setup()
2165 snprintf(girq->name, sizeof(girq->name), "global_port_irq"); in ksz_girq_setup()
2167 girq->irq_num = dev->irq; in ksz_girq_setup()
2174 struct ksz_irq *pirq = &dev->ports[p].pirq; in ksz_pirq_setup()
2176 pirq->nirqs = dev->info->port_nirqs; in ksz_pirq_setup()
2177 pirq->reg_mask = dev->dev_ops->get_port_addr(p, REG_PORT_INT_MASK); in ksz_pirq_setup()
2178 pirq->reg_status = dev->dev_ops->get_port_addr(p, REG_PORT_INT_STATUS); in ksz_pirq_setup()
2179 snprintf(pirq->name, sizeof(pirq->name), "port_irq-%d", p); in ksz_pirq_setup()
2181 pirq->irq_num = irq_find_mapping(dev->girq.domain, p); in ksz_pirq_setup()
2182 if (pirq->irq_num < 0) in ksz_pirq_setup()
2183 return pirq->irq_num; in ksz_pirq_setup()
2190 struct ksz_device *dev = ds->priv; in ksz_setup()
2196 regs = dev->info->regs; in ksz_setup()
2198 dev->vlan_cache = devm_kcalloc(dev->dev, sizeof(struct vlan_table), in ksz_setup()
2199 dev->info->num_vlans, GFP_KERNEL); in ksz_setup()
2200 if (!dev->vlan_cache) in ksz_setup()
2201 return -ENOMEM; in ksz_setup()
2203 ret = dev->dev_ops->reset(dev); in ksz_setup()
2205 dev_err(ds->dev, "failed to reset switch\n"); in ksz_setup()
2215 dev->dev_ops->config_cpu_port(ds); in ksz_setup()
2217 dev->dev_ops->enable_stp_addr(dev); in ksz_setup()
2219 ds->num_tx_queues = dev->info->num_tx_queues; in ksz_setup()
2226 ds->configure_vlan_while_not_filtering = false; in ksz_setup()
2228 if (dev->dev_ops->setup) { in ksz_setup()
2229 ret = dev->dev_ops->setup(ds); in ksz_setup()
2239 p = &dev->ports[dev->cpu_port]; in ksz_setup()
2240 p->learning = true; in ksz_setup()
2242 if (dev->irq > 0) { in ksz_setup()
2247 dsa_switch_for_each_user_port(dp, dev->ds) { in ksz_setup()
2248 ret = ksz_pirq_setup(dev, dp->index); in ksz_setup()
2252 ret = ksz_ptp_irq_setup(ds, dp->index); in ksz_setup()
2260 dev_err(dev->dev, "Failed to register PTP clock: %d\n", ret); in ksz_setup()
2266 dev_err(dev->dev, "failed to register the mdio"); in ksz_setup()
2279 if (dev->irq > 0) in ksz_setup()
2280 dsa_switch_for_each_user_port(dp, dev->ds) in ksz_setup()
2281 ksz_ptp_irq_free(ds, dp->index); in ksz_setup()
2283 if (dev->irq > 0) in ksz_setup()
2284 dsa_switch_for_each_user_port(dp, dev->ds) in ksz_setup()
2285 ksz_irq_free(&dev->ports[dp->index].pirq); in ksz_setup()
2287 if (dev->irq > 0) in ksz_setup()
2288 ksz_irq_free(&dev->girq); in ksz_setup()
2295 struct ksz_device *dev = ds->priv; in ksz_teardown()
2300 if (dev->irq > 0) { in ksz_teardown()
2301 dsa_switch_for_each_user_port(dp, dev->ds) { in ksz_teardown()
2302 ksz_ptp_irq_free(ds, dp->index); in ksz_teardown()
2304 ksz_irq_free(&dev->ports[dp->index].pirq); in ksz_teardown()
2307 ksz_irq_free(&dev->girq); in ksz_teardown()
2310 if (dev->dev_ops->teardown) in ksz_teardown()
2311 dev->dev_ops->teardown(ds); in ksz_teardown()
2316 struct ksz_port_mib *mib = &dev->ports[port].mib; in port_r_cnt()
2320 while (mib->cnt_ptr < dev->info->reg_mib_cnt) { in port_r_cnt()
2321 dev->dev_ops->r_mib_cnt(dev, port, mib->cnt_ptr, in port_r_cnt()
2322 &mib->counters[mib->cnt_ptr]); in port_r_cnt()
2323 ++mib->cnt_ptr; in port_r_cnt()
2327 dropped = &mib->counters[dev->info->mib_cnt]; in port_r_cnt()
2330 while (mib->cnt_ptr < dev->info->mib_cnt) { in port_r_cnt()
2331 dev->dev_ops->r_mib_pkt(dev, port, mib->cnt_ptr, in port_r_cnt()
2332 dropped, &mib->counters[mib->cnt_ptr]); in port_r_cnt()
2333 ++mib->cnt_ptr; in port_r_cnt()
2335 mib->cnt_ptr = 0; in port_r_cnt()
2346 for (i = 0; i < dev->info->port_cnt; i++) { in ksz_mib_read_work()
2347 if (dsa_is_unused_port(dev->ds, i)) in ksz_mib_read_work()
2350 p = &dev->ports[i]; in ksz_mib_read_work()
2351 mib = &p->mib; in ksz_mib_read_work()
2352 mutex_lock(&mib->cnt_mutex); in ksz_mib_read_work()
2357 if (!p->read) { in ksz_mib_read_work()
2358 const struct dsa_port *dp = dsa_to_port(dev->ds, i); in ksz_mib_read_work()
2360 if (!netif_carrier_ok(dp->user)) in ksz_mib_read_work()
2361 mib->cnt_ptr = dev->info->reg_mib_cnt; in ksz_mib_read_work()
2364 p->read = false; in ksz_mib_read_work()
2366 if (dev->dev_ops->r_mib_stat64) in ksz_mib_read_work()
2367 dev->dev_ops->r_mib_stat64(dev, i); in ksz_mib_read_work()
2369 mutex_unlock(&mib->cnt_mutex); in ksz_mib_read_work()
2372 schedule_delayed_work(&dev->mib_read, dev->mib_read_interval); in ksz_mib_read_work()
2379 INIT_DELAYED_WORK(&dev->mib_read, ksz_mib_read_work); in ksz_init_mib_timer()
2381 for (i = 0; i < dev->info->port_cnt; i++) { in ksz_init_mib_timer()
2382 struct ksz_port_mib *mib = &dev->ports[i].mib; in ksz_init_mib_timer()
2384 dev->dev_ops->port_init_cnt(dev, i); in ksz_init_mib_timer()
2386 mib->cnt_ptr = 0; in ksz_init_mib_timer()
2387 memset(mib->counters, 0, dev->info->mib_cnt * sizeof(u64)); in ksz_init_mib_timer()
2393 struct ksz_device *dev = ds->priv; in ksz_phy_read16()
2397 ret = dev->dev_ops->r_phy(dev, addr, reg, &val); in ksz_phy_read16()
2406 struct ksz_device *dev = ds->priv; in ksz_phy_write16()
2409 ret = dev->dev_ops->w_phy(dev, addr, reg, val); in ksz_phy_write16()
2418 struct ksz_device *dev = ds->priv; in ksz_get_phy_flags()
2420 switch (dev->chip_id) { in ksz_get_phy_flags()
2423 * Port 1 does not work with LinkMD Cable-Testing. in ksz_get_phy_flags()
2436 * controls. If not disabled, the PHY ports can auto-negotiate in ksz_get_phy_flags()
2449 struct ksz_device *dev = ds->priv; in ksz_mac_link_down()
2450 struct ksz_port *p = &dev->ports[port]; in ksz_mac_link_down()
2453 p->read = true; in ksz_mac_link_down()
2455 if (dev->mib_read_interval) in ksz_mac_link_down()
2456 schedule_delayed_work(&dev->mib_read, 0); in ksz_mac_link_down()
2461 struct ksz_device *dev = ds->priv; in ksz_sset_count()
2466 return dev->info->mib_cnt; in ksz_sset_count()
2473 struct ksz_device *dev = ds->priv; in ksz_get_ethtool_stats()
2476 mib = &dev->ports[port].mib; in ksz_get_ethtool_stats()
2477 mutex_lock(&mib->cnt_mutex); in ksz_get_ethtool_stats()
2480 if (!netif_carrier_ok(dp->user)) in ksz_get_ethtool_stats()
2481 mib->cnt_ptr = dev->info->reg_mib_cnt; in ksz_get_ethtool_stats()
2483 memcpy(buf, mib->counters, dev->info->mib_cnt * sizeof(u64)); in ksz_get_ethtool_stats()
2484 mutex_unlock(&mib->cnt_mutex); in ksz_get_ethtool_stats()
2509 struct ksz_device *dev = ds->priv; in ksz_port_fast_age()
2511 dev->dev_ops->flush_dyn_mac_table(dev, port); in ksz_port_fast_age()
2516 struct ksz_device *dev = ds->priv; in ksz_set_ageing_time()
2518 if (!dev->dev_ops->set_ageing_time) in ksz_set_ageing_time()
2519 return -EOPNOTSUPP; in ksz_set_ageing_time()
2521 return dev->dev_ops->set_ageing_time(dev, msecs); in ksz_set_ageing_time()
2528 struct ksz_device *dev = ds->priv; in ksz_port_fdb_add()
2530 if (!dev->dev_ops->fdb_add) in ksz_port_fdb_add()
2531 return -EOPNOTSUPP; in ksz_port_fdb_add()
2533 return dev->dev_ops->fdb_add(dev, port, addr, vid, db); in ksz_port_fdb_add()
2540 struct ksz_device *dev = ds->priv; in ksz_port_fdb_del()
2542 if (!dev->dev_ops->fdb_del) in ksz_port_fdb_del()
2543 return -EOPNOTSUPP; in ksz_port_fdb_del()
2545 return dev->dev_ops->fdb_del(dev, port, addr, vid, db); in ksz_port_fdb_del()
2551 struct ksz_device *dev = ds->priv; in ksz_port_fdb_dump()
2553 if (!dev->dev_ops->fdb_dump) in ksz_port_fdb_dump()
2554 return -EOPNOTSUPP; in ksz_port_fdb_dump()
2556 return dev->dev_ops->fdb_dump(dev, port, cb, data); in ksz_port_fdb_dump()
2563 struct ksz_device *dev = ds->priv; in ksz_port_mdb_add()
2565 if (!dev->dev_ops->mdb_add) in ksz_port_mdb_add()
2566 return -EOPNOTSUPP; in ksz_port_mdb_add()
2568 return dev->dev_ops->mdb_add(dev, port, mdb, db); in ksz_port_mdb_add()
2575 struct ksz_device *dev = ds->priv; in ksz_port_mdb_del()
2577 if (!dev->dev_ops->mdb_del) in ksz_port_mdb_del()
2578 return -EOPNOTSUPP; in ksz_port_mdb_del()
2580 return dev->dev_ops->mdb_del(dev, port, mdb, db); in ksz_port_mdb_del()
2585 struct ksz_device *dev = ds->priv; in ksz_port_setup()
2591 dev->dev_ops->port_setup(dev, port, false); in ksz_port_setup()
2602 struct ksz_device *dev = ds->priv; in ksz_port_stp_state_set()
2607 regs = dev->info->regs; in ksz_port_stp_state_set()
2612 p = &dev->ports[port]; in ksz_port_stp_state_set()
2623 if (!p->learning) in ksz_port_stp_state_set()
2628 if (!p->learning) in ksz_port_stp_state_set()
2635 dev_err(ds->dev, "invalid STP state: %d\n", state); in ksz_port_stp_state_set()
2641 p->stp_state = state; in ksz_port_stp_state_set()
2648 struct ksz_device *dev = ds->priv; in ksz_port_teardown()
2650 switch (dev->chip_id) { in ksz_port_teardown()
2668 return -EINVAL; in ksz_port_pre_bridge_flags()
2677 struct ksz_device *dev = ds->priv; in ksz_port_bridge_flags()
2678 struct ksz_port *p = &dev->ports[port]; in ksz_port_bridge_flags()
2681 p->learning = !!(flags.val & BR_LEARNING); in ksz_port_bridge_flags()
2684 ksz_port_stp_state_set(ds, port, p->stp_state); in ksz_port_bridge_flags()
2694 struct ksz_device *dev = ds->priv; in ksz_get_tag_protocol()
2697 if (dev->chip_id == KSZ8795_CHIP_ID || in ksz_get_tag_protocol()
2698 dev->chip_id == KSZ8794_CHIP_ID || in ksz_get_tag_protocol()
2699 dev->chip_id == KSZ8765_CHIP_ID) in ksz_get_tag_protocol()
2702 if (dev->chip_id == KSZ8830_CHIP_ID || in ksz_get_tag_protocol()
2703 dev->chip_id == KSZ8563_CHIP_ID || in ksz_get_tag_protocol()
2704 dev->chip_id == KSZ9893_CHIP_ID || in ksz_get_tag_protocol()
2705 dev->chip_id == KSZ9563_CHIP_ID) in ksz_get_tag_protocol()
2708 if (dev->chip_id == KSZ9477_CHIP_ID || in ksz_get_tag_protocol()
2709 dev->chip_id == KSZ9896_CHIP_ID || in ksz_get_tag_protocol()
2710 dev->chip_id == KSZ9897_CHIP_ID || in ksz_get_tag_protocol()
2711 dev->chip_id == KSZ9567_CHIP_ID) in ksz_get_tag_protocol()
2732 tagger_data->xmit_work_fn = ksz_port_deferred_xmit; in ksz_connect_tag_protocol()
2735 return -EPROTONOSUPPORT; in ksz_connect_tag_protocol()
2742 struct ksz_device *dev = ds->priv; in ksz_port_vlan_filtering()
2744 if (!dev->dev_ops->vlan_filtering) in ksz_port_vlan_filtering()
2745 return -EOPNOTSUPP; in ksz_port_vlan_filtering()
2747 return dev->dev_ops->vlan_filtering(dev, port, flag, extack); in ksz_port_vlan_filtering()
2754 struct ksz_device *dev = ds->priv; in ksz_port_vlan_add()
2756 if (!dev->dev_ops->vlan_add) in ksz_port_vlan_add()
2757 return -EOPNOTSUPP; in ksz_port_vlan_add()
2759 return dev->dev_ops->vlan_add(dev, port, vlan, extack); in ksz_port_vlan_add()
2765 struct ksz_device *dev = ds->priv; in ksz_port_vlan_del()
2767 if (!dev->dev_ops->vlan_del) in ksz_port_vlan_del()
2768 return -EOPNOTSUPP; in ksz_port_vlan_del()
2770 return dev->dev_ops->vlan_del(dev, port, vlan); in ksz_port_vlan_del()
2777 struct ksz_device *dev = ds->priv; in ksz_port_mirror_add()
2779 if (!dev->dev_ops->mirror_add) in ksz_port_mirror_add()
2780 return -EOPNOTSUPP; in ksz_port_mirror_add()
2782 return dev->dev_ops->mirror_add(dev, port, mirror, ingress, extack); in ksz_port_mirror_add()
2788 struct ksz_device *dev = ds->priv; in ksz_port_mirror_del()
2790 if (dev->dev_ops->mirror_del) in ksz_port_mirror_del()
2791 dev->dev_ops->mirror_del(dev, port, mirror); in ksz_port_mirror_del()
2796 struct ksz_device *dev = ds->priv; in ksz_change_mtu()
2798 if (!dev->dev_ops->change_mtu) in ksz_change_mtu()
2799 return -EOPNOTSUPP; in ksz_change_mtu()
2801 return dev->dev_ops->change_mtu(dev, port, mtu); in ksz_change_mtu()
2806 struct ksz_device *dev = ds->priv; in ksz_max_mtu()
2808 switch (dev->chip_id) { in ksz_max_mtu()
2812 return KSZ8795_HUGE_PACKET_SIZE - VLAN_ETH_HLEN - ETH_FCS_LEN; in ksz_max_mtu()
2814 return KSZ8863_HUGE_PACKET_SIZE - VLAN_ETH_HLEN - ETH_FCS_LEN; in ksz_max_mtu()
2827 return KSZ9477_MAX_FRAME_SIZE - VLAN_ETH_HLEN - ETH_FCS_LEN; in ksz_max_mtu()
2830 return -EOPNOTSUPP; in ksz_max_mtu()
2835 struct ksz_device *dev = ds->priv; in ksz_validate_eee()
2837 if (!dev->info->internal_phy[port]) in ksz_validate_eee()
2838 return -EOPNOTSUPP; in ksz_validate_eee()
2840 switch (dev->chip_id) { in ksz_validate_eee()
2851 return -EOPNOTSUPP; in ksz_validate_eee()
2864 e->tx_lpi_enabled = true; in ksz_get_mac_eee()
2869 e->tx_lpi_timer = 0; in ksz_get_mac_eee()
2877 struct ksz_device *dev = ds->priv; in ksz_set_mac_eee()
2884 if (!e->tx_lpi_enabled) { in ksz_set_mac_eee()
2885 dev_err(dev->dev, "Disabling EEE Tx LPI is not supported\n"); in ksz_set_mac_eee()
2886 return -EINVAL; in ksz_set_mac_eee()
2889 if (e->tx_lpi_timer) { in ksz_set_mac_eee()
2890 dev_err(dev->dev, "Setting EEE Tx LPI timer is not supported\n"); in ksz_set_mac_eee()
2891 return -EINVAL; in ksz_set_mac_eee()
2900 const u8 *bitval = dev->info->xmii_ctrl1; in ksz_set_xmii()
2901 struct ksz_port *p = &dev->ports[port]; in ksz_set_xmii()
2902 const u16 *regs = dev->info->regs; in ksz_set_xmii()
2925 /* On KSZ9893, disable RGMII in-band status support */ in ksz_set_xmii()
2926 if (dev->chip_id == KSZ9893_CHIP_ID || in ksz_set_xmii()
2927 dev->chip_id == KSZ8563_CHIP_ID || in ksz_set_xmii()
2928 dev->chip_id == KSZ9563_CHIP_ID) in ksz_set_xmii()
2932 dev_err(dev->dev, "Unsupported interface '%s' for port %d\n", in ksz_set_xmii()
2937 if (p->rgmii_tx_val) in ksz_set_xmii()
2940 if (p->rgmii_rx_val) in ksz_set_xmii()
2949 const u8 *bitval = dev->info->xmii_ctrl1; in ksz_get_xmii()
2950 const u16 *regs = dev->info->regs; in ksz_get_xmii()
2984 struct ksz_device *dev = ds->priv; in ksz_phylink_mac_config()
2987 dev->ports[port].manual_flow = !(state->pause & MLO_PAUSE_AN); in ksz_phylink_mac_config()
2992 if (dev->info->internal_phy[port]) in ksz_phylink_mac_config()
2996 dev_err(dev->dev, "In-band AN not supported!\n"); in ksz_phylink_mac_config()
3000 ksz_set_xmii(dev, port, state->interface); in ksz_phylink_mac_config()
3002 if (dev->dev_ops->phylink_mac_config) in ksz_phylink_mac_config()
3003 dev->dev_ops->phylink_mac_config(dev, port, mode, state); in ksz_phylink_mac_config()
3005 if (dev->dev_ops->setup_rgmii_delay) in ksz_phylink_mac_config()
3006 dev->dev_ops->setup_rgmii_delay(dev, port); in ksz_phylink_mac_config()
3011 const u8 *bitval = dev->info->xmii_ctrl1; in ksz_get_gbit()
3012 const u16 *regs = dev->info->regs; in ksz_get_gbit()
3029 const u8 *bitval = dev->info->xmii_ctrl1; in ksz_set_gbit()
3030 const u16 *regs = dev->info->regs; in ksz_set_gbit()
3048 const u8 *bitval = dev->info->xmii_ctrl0; in ksz_set_100_10mbit()
3049 const u16 *regs = dev->info->regs; in ksz_set_100_10mbit()
3079 const u8 *bitval = dev->info->xmii_ctrl0; in ksz_duplex_flowctrl()
3080 const u32 *masks = dev->info->masks; in ksz_duplex_flowctrl()
3081 const u16 *regs = dev->info->regs; in ksz_duplex_flowctrl()
3111 p = &dev->ports[port]; in ksz9477_phylink_mac_link_up()
3114 if (dev->info->internal_phy[port]) in ksz9477_phylink_mac_link_up()
3117 p->phydev.speed = speed; in ksz9477_phylink_mac_link_up()
3130 struct ksz_device *dev = ds->priv; in ksz_phylink_mac_link_up()
3132 dev->dev_ops->phylink_mac_link_up(dev, port, mode, interface, phydev, in ksz_phylink_mac_link_up()
3156 dev->chip_id = KSZ8795_CHIP_ID; in ksz_switch_detect()
3160 dev->chip_id = KSZ8765_CHIP_ID; in ksz_switch_detect()
3162 dev->chip_id = KSZ8794_CHIP_ID; in ksz_switch_detect()
3164 return -ENODEV; in ksz_switch_detect()
3169 dev->chip_id = KSZ8830_CHIP_ID; in ksz_switch_detect()
3171 return -ENODEV; in ksz_switch_detect()
3178 dev->chip_rev = FIELD_GET(SW_REV_ID_M, id32); in ksz_switch_detect()
3191 dev->chip_id = id32; in ksz_switch_detect()
3200 dev->chip_id = KSZ8563_CHIP_ID; in ksz_switch_detect()
3202 dev->chip_id = KSZ9563_CHIP_ID; in ksz_switch_detect()
3204 dev->chip_id = KSZ9893_CHIP_ID; in ksz_switch_detect()
3208 dev_err(dev->dev, in ksz_switch_detect()
3210 return -ENODEV; in ksz_switch_detect()
3219 struct ksz_device *dev = ds->priv; in ksz_cls_flower_add()
3221 switch (dev->chip_id) { in ksz_cls_flower_add()
3232 return -EOPNOTSUPP; in ksz_cls_flower_add()
3238 struct ksz_device *dev = ds->priv; in ksz_cls_flower_del()
3240 switch (dev->chip_id) { in ksz_cls_flower_del()
3251 return -EOPNOTSUPP; in ksz_cls_flower_del()
3255 * is converted to Hex-decimal using the successive multiplication method. On
3266 txrate = idle_slope - send_slope; in cinc_cal()
3269 return -EINVAL; in cinc_cal()
3300 struct ksz_device *dev = ds->priv; in ksz_setup_tc_cbs()
3304 if (!dev->info->tc_cbs_supported) in ksz_setup_tc_cbs()
3305 return -EOPNOTSUPP; in ksz_setup_tc_cbs()
3307 if (qopt->queue > dev->info->num_tx_queues) in ksz_setup_tc_cbs()
3308 return -EINVAL; in ksz_setup_tc_cbs()
3311 ret = ksz_pwrite32(dev, port, REG_PORT_MTI_QUEUE_INDEX__4, qopt->queue); in ksz_setup_tc_cbs()
3315 if (!qopt->enable) in ksz_setup_tc_cbs()
3321 qopt->hicredit); in ksz_setup_tc_cbs()
3327 qopt->locredit); in ksz_setup_tc_cbs()
3332 ret = cinc_cal(qopt->idleslope, qopt->sendslope, &bw); in ksz_setup_tc_cbs()
3336 if (dev->dev_ops->tc_cbs_set_cinc) { in ksz_setup_tc_cbs()
3337 ret = dev->dev_ops->tc_cbs_set_cinc(dev, port, bw); in ksz_setup_tc_cbs()
3353 for (queue = 0; queue < dev->info->num_tx_queues; queue++) { in ksz_disable_egress_rate_limit()
3370 return p->bands - 1 - band; in ksz_ets_band_to_queue()
3419 for (band = 0; band < p->bands; band++) { in ksz_tc_ets_add()
3431 for (tc_prio = 0; tc_prio < ARRAY_SIZE(p->priomap); tc_prio++) { in ksz_tc_ets_add()
3437 queue = ksz_ets_band_to_queue(p, p->priomap[tc_prio]); in ksz_tc_ets_add()
3452 for (queue = 0; queue < dev->info->num_tx_queues; queue++) { in ksz_tc_ets_del()
3459 switch (dev->info->num_tx_queues) { in ksz_tc_ets_del()
3470 return -EINVAL; in ksz_tc_ets_del()
3473 /* Revert the queue mapping for TC-priority to its default setting on in ksz_tc_ets_del()
3494 if (p->bands != dev->info->num_tx_queues) { in ksz_tc_ets_validate()
3495 dev_err(dev->dev, "Not supported amount of bands. It should be %d\n", in ksz_tc_ets_validate()
3496 dev->info->num_tx_queues); in ksz_tc_ets_validate()
3497 return -EOPNOTSUPP; in ksz_tc_ets_validate()
3500 for (band = 0; band < p->bands; ++band) { in ksz_tc_ets_validate()
3513 if (p->quanta[band]) { in ksz_tc_ets_validate()
3514 dev_err(dev->dev, "Quanta/weights configuration is not supported.\n"); in ksz_tc_ets_validate()
3515 return -EOPNOTSUPP; in ksz_tc_ets_validate()
3525 struct ksz_device *dev = ds->priv; in ksz_tc_setup_qdisc_ets()
3528 if (!dev->info->tc_ets_supported) in ksz_tc_setup_qdisc_ets()
3529 return -EOPNOTSUPP; in ksz_tc_setup_qdisc_ets()
3531 if (qopt->parent != TC_H_ROOT) { in ksz_tc_setup_qdisc_ets()
3532 dev_err(dev->dev, "Parent should be \"root\"\n"); in ksz_tc_setup_qdisc_ets()
3533 return -EOPNOTSUPP; in ksz_tc_setup_qdisc_ets()
3536 switch (qopt->command) { in ksz_tc_setup_qdisc_ets()
3538 ret = ksz_tc_ets_validate(dev, port, &qopt->replace_params); in ksz_tc_setup_qdisc_ets()
3542 return ksz_tc_ets_add(dev, port, &qopt->replace_params); in ksz_tc_setup_qdisc_ets()
3547 return -EOPNOTSUPP; in ksz_tc_setup_qdisc_ets()
3550 return -EOPNOTSUPP; in ksz_tc_setup_qdisc_ets()
3562 return -EOPNOTSUPP; in ksz_setup_tc()
3569 struct ksz_device *dev = ds->priv; in ksz_get_wol()
3571 if (dev->dev_ops->get_wol) in ksz_get_wol()
3572 dev->dev_ops->get_wol(dev, port, wol); in ksz_get_wol()
3578 struct ksz_device *dev = ds->priv; in ksz_set_wol()
3580 if (dev->dev_ops->set_wol) in ksz_set_wol()
3581 return dev->dev_ops->set_wol(dev, port, wol); in ksz_set_wol()
3583 return -EOPNOTSUPP; in ksz_set_wol()
3592 if (dp->hsr_dev) { in ksz_port_set_mac_address()
3593 dev_err(ds->dev, in ksz_port_set_mac_address()
3596 return -EBUSY; in ksz_port_set_mac_address()
3599 ksz_get_wol(ds, dp->index, &wol); in ksz_port_set_mac_address()
3601 dev_err(ds->dev, in ksz_port_set_mac_address()
3604 return -EBUSY; in ksz_port_set_mac_address()
3611 * ksz_is_port_mac_global_usable - Check if the MAC address on a given port
3624 struct net_device *user = dsa_to_port(ds, port)->user; in ksz_is_port_mac_global_usable()
3625 const unsigned char *addr = user->dev_addr; in ksz_is_port_mac_global_usable()
3627 struct ksz_device *dev = ds->priv; in ksz_is_port_mac_global_usable()
3631 switch_macaddr = dev->switch_macaddr; in ksz_is_port_mac_global_usable()
3632 if (switch_macaddr && !ether_addr_equal(switch_macaddr->addr, addr)) in ksz_is_port_mac_global_usable()
3639 * ksz_switch_macaddr_get - Program the switch's MAC address register.
3646 * multiple features like HSR self-address filtering and WoL. Other user ports
3656 struct net_device *user = dsa_to_port(ds, port)->user; in ksz_switch_macaddr_get()
3657 const unsigned char *addr = user->dev_addr; in ksz_switch_macaddr_get()
3659 struct ksz_device *dev = ds->priv; in ksz_switch_macaddr_get()
3660 const u16 *regs = dev->info->regs; in ksz_switch_macaddr_get()
3666 switch_macaddr = dev->switch_macaddr; in ksz_switch_macaddr_get()
3668 if (!ether_addr_equal(switch_macaddr->addr, addr)) { in ksz_switch_macaddr_get()
3671 switch_macaddr->addr); in ksz_switch_macaddr_get()
3672 return -EBUSY; in ksz_switch_macaddr_get()
3675 refcount_inc(&switch_macaddr->refcount); in ksz_switch_macaddr_get()
3681 return -ENOMEM; in ksz_switch_macaddr_get()
3683 ether_addr_copy(switch_macaddr->addr, addr); in ksz_switch_macaddr_get()
3684 refcount_set(&switch_macaddr->refcount, 1); in ksz_switch_macaddr_get()
3685 dev->switch_macaddr = switch_macaddr; in ksz_switch_macaddr_get()
3697 dev->switch_macaddr = NULL; in ksz_switch_macaddr_get()
3698 refcount_set(&switch_macaddr->refcount, 0); in ksz_switch_macaddr_get()
3707 struct ksz_device *dev = ds->priv; in ksz_switch_macaddr_put()
3708 const u16 *regs = dev->info->regs; in ksz_switch_macaddr_put()
3714 switch_macaddr = dev->switch_macaddr; in ksz_switch_macaddr_put()
3715 if (!refcount_dec_and_test(&switch_macaddr->refcount)) in ksz_switch_macaddr_put()
3721 dev->switch_macaddr = NULL; in ksz_switch_macaddr_put()
3728 struct ksz_device *dev = ds->priv; in ksz_hsr_join()
3736 if (dev->chip_id != KSZ9477_CHIP_ID) { in ksz_hsr_join()
3738 return -EOPNOTSUPP; in ksz_hsr_join()
3742 if (dev->hsr_dev && hsr != dev->hsr_dev) { in ksz_hsr_join()
3744 return -EOPNOTSUPP; in ksz_hsr_join()
3750 return -EOPNOTSUPP; in ksz_hsr_join()
3761 dev->hsr_dev = hsr; in ksz_hsr_join()
3762 dev->hsr_ports |= BIT(port); in ksz_hsr_join()
3770 struct ksz_device *dev = ds->priv; in ksz_hsr_leave()
3772 WARN_ON(dev->chip_id != KSZ9477_CHIP_ID); in ksz_hsr_leave()
3775 dev->hsr_ports &= ~BIT(port); in ksz_hsr_leave()
3776 if (!dev->hsr_ports) in ksz_hsr_leave()
3777 dev->hsr_dev = NULL; in ksz_hsr_leave()
3848 ds->dev = base; in ksz_switch_alloc()
3849 ds->num_ports = DSA_MAX_PORTS; in ksz_switch_alloc()
3850 ds->ops = &ksz_switch_ops; in ksz_switch_alloc()
3856 ds->priv = swdev; in ksz_switch_alloc()
3857 swdev->dev = base; in ksz_switch_alloc()
3859 swdev->ds = ds; in ksz_switch_alloc()
3860 swdev->priv = priv; in ksz_switch_alloc()
3867 * ksz_switch_shutdown - Shutdown routine for the switch device.
3880 if (dev->dev_ops->wol_pre_shutdown) in ksz_switch_shutdown()
3881 dev->dev_ops->wol_pre_shutdown(dev, &wol_enabled); in ksz_switch_shutdown()
3883 if (dev->dev_ops->reset && !wol_enabled) in ksz_switch_shutdown()
3884 dev->dev_ops->reset(dev); in ksz_switch_shutdown()
3886 dsa_switch_shutdown(dev->ds); in ksz_switch_shutdown()
3893 phy_interface_t phy_mode = dev->ports[port_num].interface; in ksz_parse_rgmii_delay()
3894 int rx_delay = -1, tx_delay = -1; in ksz_parse_rgmii_delay()
3899 of_property_read_u32(port_dn, "rx-internal-delay-ps", &rx_delay); in ksz_parse_rgmii_delay()
3900 of_property_read_u32(port_dn, "tx-internal-delay-ps", &tx_delay); in ksz_parse_rgmii_delay()
3902 if (rx_delay == -1 && tx_delay == -1) { in ksz_parse_rgmii_delay()
3903 dev_warn(dev->dev, in ksz_parse_rgmii_delay()
3904 "Port %d interpreting RGMII delay settings based on \"phy-mode\" property, " in ksz_parse_rgmii_delay()
3905 "please update device tree to specify \"rx-internal-delay-ps\" and " in ksz_parse_rgmii_delay()
3906 "\"tx-internal-delay-ps\"", in ksz_parse_rgmii_delay()
3923 dev->ports[port_num].rgmii_rx_val = rx_delay; in ksz_parse_rgmii_delay()
3924 dev->ports[port_num].rgmii_tx_val = tx_delay; in ksz_parse_rgmii_delay()
3928 * ksz_drive_strength_to_reg() - Convert drive strength value to corresponding
3938 * is returned. Otherwise, -EINVAL is returned indicating an invalid value.
3950 return -EINVAL; in ksz_drive_strength_to_reg()
3954 * ksz_drive_strength_error() - Report invalid drive strength value
3985 remaining_size -= added_len; in ksz_drive_strength_error()
3988 dev_err(dev->dev, "Invalid drive strength %d, supported values are %s\n", in ksz_drive_strength_error()
3993 * ksz9477_drive_strength_write() - Set the drive strength for specific KSZ9477
4000 * based on the provided properties. It handles chip-specific nuances and
4014 if (props[KSZ_DRIVER_STRENGTH_IO].value != -1) in ksz9477_drive_strength_write()
4015 dev_warn(dev->dev, "%s is not supported by this chip variant\n", in ksz9477_drive_strength_write()
4018 if (dev->chip_id == KSZ8795_CHIP_ID || in ksz9477_drive_strength_write()
4019 dev->chip_id == KSZ8794_CHIP_ID || in ksz9477_drive_strength_write()
4020 dev->chip_id == KSZ8765_CHIP_ID) in ksz9477_drive_strength_write()
4026 if (props[i].value == -1) in ksz9477_drive_strength_write()
4045 * ksz8830_drive_strength_write() - Set the drive strength configuration for
4067 if (props[i].value == -1 || i == KSZ_DRIVER_STRENGTH_IO) in ksz8830_drive_strength_write()
4070 dev_warn(dev->dev, "%s is not supported by this chip variant\n", in ksz8830_drive_strength_write()
4088 * ksz_parse_drive_strength() - Extract and apply drive strength configurations
4103 .name = "microchip,hi-drive-strength-microamp", in ksz_parse_drive_strength()
4105 .value = -1, in ksz_parse_drive_strength()
4108 .name = "microchip,lo-drive-strength-microamp", in ksz_parse_drive_strength()
4110 .value = -1, in ksz_parse_drive_strength()
4113 .name = "microchip,io-drive-strength-microamp", in ksz_parse_drive_strength()
4115 .value = -1, in ksz_parse_drive_strength()
4118 struct device_node *np = dev->dev->of_node; in ksz_parse_drive_strength()
4125 if (ret && ret != -EINVAL) in ksz_parse_drive_strength()
4126 dev_warn(dev->dev, "Failed to read %s\n", in ksz_parse_drive_strength()
4137 switch (dev->chip_id) { in ksz_parse_drive_strength()
4155 if (of_props[i].value == -1) in ksz_parse_drive_strength()
4158 dev_warn(dev->dev, "%s is not supported by this chip variant\n", in ksz_parse_drive_strength()
4175 dev->reset_gpio = devm_gpiod_get_optional(dev->dev, "reset", in ksz_switch_register()
4177 if (IS_ERR(dev->reset_gpio)) in ksz_switch_register()
4178 return PTR_ERR(dev->reset_gpio); in ksz_switch_register()
4180 if (dev->reset_gpio) { in ksz_switch_register()
4181 gpiod_set_value_cansleep(dev->reset_gpio, 1); in ksz_switch_register()
4183 gpiod_set_value_cansleep(dev->reset_gpio, 0); in ksz_switch_register()
4187 mutex_init(&dev->dev_mutex); in ksz_switch_register()
4188 mutex_init(&dev->regmap_mutex); in ksz_switch_register()
4189 mutex_init(&dev->alu_mutex); in ksz_switch_register()
4190 mutex_init(&dev->vlan_mutex); in ksz_switch_register()
4196 info = ksz_lookup_info(dev->chip_id); in ksz_switch_register()
4198 return -ENODEV; in ksz_switch_register()
4201 dev->info = info; in ksz_switch_register()
4203 dev_info(dev->dev, "found switch: %s, rev %i\n", in ksz_switch_register()
4204 dev->info->dev_name, dev->chip_rev); in ksz_switch_register()
4210 dev->dev_ops = dev->info->ops; in ksz_switch_register()
4212 ret = dev->dev_ops->init(dev); in ksz_switch_register()
4216 dev->ports = devm_kzalloc(dev->dev, in ksz_switch_register()
4217 dev->info->port_cnt * sizeof(struct ksz_port), in ksz_switch_register()
4219 if (!dev->ports) in ksz_switch_register()
4220 return -ENOMEM; in ksz_switch_register()
4222 for (i = 0; i < dev->info->port_cnt; i++) { in ksz_switch_register()
4223 spin_lock_init(&dev->ports[i].mib.stats64_lock); in ksz_switch_register()
4224 mutex_init(&dev->ports[i].mib.cnt_mutex); in ksz_switch_register()
4225 dev->ports[i].mib.counters = in ksz_switch_register()
4226 devm_kzalloc(dev->dev, in ksz_switch_register()
4227 sizeof(u64) * (dev->info->mib_cnt + 1), in ksz_switch_register()
4229 if (!dev->ports[i].mib.counters) in ksz_switch_register()
4230 return -ENOMEM; in ksz_switch_register()
4232 dev->ports[i].ksz_dev = dev; in ksz_switch_register()
4233 dev->ports[i].num = i; in ksz_switch_register()
4237 dev->ds->num_ports = dev->info->port_cnt; in ksz_switch_register()
4242 for (port_num = 0; port_num < dev->info->port_cnt; ++port_num) in ksz_switch_register()
4243 dev->ports[port_num].interface = PHY_INTERFACE_MODE_NA; in ksz_switch_register()
4244 if (dev->dev->of_node) { in ksz_switch_register()
4249 ret = of_get_phy_mode(dev->dev->of_node, &interface); in ksz_switch_register()
4251 dev->compat_interface = interface; in ksz_switch_register()
4252 ports = of_get_child_by_name(dev->dev->of_node, "ethernet-ports"); in ksz_switch_register()
4254 ports = of_get_child_by_name(dev->dev->of_node, "ports"); in ksz_switch_register()
4260 if (!(dev->port_mask & BIT(port_num))) { in ksz_switch_register()
4263 return -EINVAL; in ksz_switch_register()
4266 &dev->ports[port_num].interface); in ksz_switch_register()
4272 dev->synclko_125 = of_property_read_bool(dev->dev->of_node, in ksz_switch_register()
4273 "microchip,synclko-125"); in ksz_switch_register()
4274 dev->synclko_disable = of_property_read_bool(dev->dev->of_node, in ksz_switch_register()
4275 "microchip,synclko-disable"); in ksz_switch_register()
4276 if (dev->synclko_125 && dev->synclko_disable) { in ksz_switch_register()
4277 dev_err(dev->dev, "inconsistent synclko settings\n"); in ksz_switch_register()
4278 return -EINVAL; in ksz_switch_register()
4281 dev->wakeup_source = of_property_read_bool(dev->dev->of_node, in ksz_switch_register()
4282 "wakeup-source"); in ksz_switch_register()
4285 ret = dsa_register_switch(dev->ds); in ksz_switch_register()
4287 dev->dev_ops->exit(dev); in ksz_switch_register()
4292 dev->mib_read_interval = msecs_to_jiffies(5000); in ksz_switch_register()
4295 schedule_delayed_work(&dev->mib_read, 0); in ksz_switch_register()
4304 if (dev->mib_read_interval) { in ksz_switch_remove()
4305 dev->mib_read_interval = 0; in ksz_switch_remove()
4306 cancel_delayed_work_sync(&dev->mib_read); in ksz_switch_remove()
4309 dev->dev_ops->exit(dev); in ksz_switch_remove()
4310 dsa_unregister_switch(dev->ds); in ksz_switch_remove()
4312 if (dev->reset_gpio) in ksz_switch_remove()
4313 gpiod_set_value_cansleep(dev->reset_gpio, 1); in ksz_switch_remove()