Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/drivers/net/dsa/microchip/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 152 kB image not shown  

Quelle  ksz_common.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
/*
 * Microchip switch driver main logic
 *
 * Copyright (C) 2017-2025 Microchip Technology Inc.
 */


#include <linux/delay.h>
#include <linux/dsa/ksz_common.h>
#include <linux/export.h>
#include <linux/gpio/consumer.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_data/microchip-ksz.h>
#include <linux/phy.h>
#include <linux/etherdevice.h>
#include <linux/if_bridge.h>
#include <linux/if_vlan.h>
#include <linux/if_hsr.h>
#include <linux/irq.h>
#include <linux/irqdomain.h>
#include <linux/of.h>
#include <linux/of_mdio.h>
#include <linux/of_net.h>
#include <linux/micrel_phy.h>
#include <linux/pinctrl/consumer.h>
#include <net/dsa.h>
#include <net/ieee8021q.h>
#include <net/pkt_cls.h>
#include <net/switchdev.h>

#include "ksz_common.h"
#include "ksz_dcb.h"
#include "ksz_ptp.h"
#include "ksz8.h"
#include "ksz9477.h"
#include "lan937x.h"

#define MIB_COUNTER_NUM 0x20

struct ksz_stats_raw {
 u64 rx_hi;
 u64 rx_undersize;
 u64 rx_fragments;
 u64 rx_oversize;
 u64 rx_jabbers;
 u64 rx_symbol_err;
 u64 rx_crc_err;
 u64 rx_align_err;
 u64 rx_mac_ctrl;
 u64 rx_pause;
 u64 rx_bcast;
 u64 rx_mcast;
 u64 rx_ucast;
 u64 rx_64_or_less;
 u64 rx_65_127;
 u64 rx_128_255;
 u64 rx_256_511;
 u64 rx_512_1023;
 u64 rx_1024_1522;
 u64 rx_1523_2000;
 u64 rx_2001;
 u64 tx_hi;
 u64 tx_late_col;
 u64 tx_pause;
 u64 tx_bcast;
 u64 tx_mcast;
 u64 tx_ucast;
 u64 tx_deferred;
 u64 tx_total_col;
 u64 tx_exc_col;
 u64 tx_single_col;
 u64 tx_mult_col;
 u64 rx_total;
 u64 tx_total;
 u64 rx_discards;
 u64 tx_discards;
};

struct ksz88xx_stats_raw {
 u64 rx;
 u64 rx_hi;
 u64 rx_undersize;
 u64 rx_fragments;
 u64 rx_oversize;
 u64 rx_jabbers;
 u64 rx_symbol_err;
 u64 rx_crc_err;
 u64 rx_align_err;
 u64 rx_mac_ctrl;
 u64 rx_pause;
 u64 rx_bcast;
 u64 rx_mcast;
 u64 rx_ucast;
 u64 rx_64_or_less;
 u64 rx_65_127;
 u64 rx_128_255;
 u64 rx_256_511;
 u64 rx_512_1023;
 u64 rx_1024_1522;
 u64 tx;
 u64 tx_hi;
 u64 tx_late_col;
 u64 tx_pause;
 u64 tx_bcast;
 u64 tx_mcast;
 u64 tx_ucast;
 u64 tx_deferred;
 u64 tx_total_col;
 u64 tx_exc_col;
 u64 tx_single_col;
 u64 tx_mult_col;
 u64 rx_discards;
 u64 tx_discards;
};

static const struct ksz_mib_names ksz88xx_mib_names[] = {
 { 0x00, "rx" },
 { 0x01, "rx_hi" },
 { 0x02, "rx_undersize" },
 { 0x03, "rx_fragments" },
 { 0x04, "rx_oversize" },
 { 0x05, "rx_jabbers" },
 { 0x06, "rx_symbol_err" },
 { 0x07, "rx_crc_err" },
 { 0x08, "rx_align_err" },
 { 0x09, "rx_mac_ctrl" },
 { 0x0a, "rx_pause" },
 { 0x0b, "rx_bcast" },
 { 0x0c, "rx_mcast" },
 { 0x0d, "rx_ucast" },
 { 0x0e, "rx_64_or_less" },
 { 0x0f, "rx_65_127" },
 { 0x10, "rx_128_255" },
 { 0x11, "rx_256_511" },
 { 0x12, "rx_512_1023" },
 { 0x13, "rx_1024_1522" },
 { 0x14, "tx" },
 { 0x15, "tx_hi" },
 { 0x16, "tx_late_col" },
 { 0x17, "tx_pause" },
 { 0x18, "tx_bcast" },
 { 0x19, "tx_mcast" },
 { 0x1a, "tx_ucast" },
 { 0x1b, "tx_deferred" },
 { 0x1c, "tx_total_col" },
 { 0x1d, "tx_exc_col" },
 { 0x1e, "tx_single_col" },
 { 0x1f, "tx_mult_col" },
 { 0x100, "rx_discards" },
 { 0x101, "tx_discards" },
};

static const struct ksz_mib_names ksz9477_mib_names[] = {
 { 0x00, "rx_hi" },
 { 0x01, "rx_undersize" },
 { 0x02, "rx_fragments" },
 { 0x03, "rx_oversize" },
 { 0x04, "rx_jabbers" },
 { 0x05, "rx_symbol_err" },
 { 0x06, "rx_crc_err" },
 { 0x07, "rx_align_err" },
 { 0x08, "rx_mac_ctrl" },
 { 0x09, "rx_pause" },
 { 0x0A, "rx_bcast" },
 { 0x0B, "rx_mcast" },
 { 0x0C, "rx_ucast" },
 { 0x0D, "rx_64_or_less" },
 { 0x0E, "rx_65_127" },
 { 0x0F, "rx_128_255" },
 { 0x10, "rx_256_511" },
 { 0x11, "rx_512_1023" },
 { 0x12, "rx_1024_1522" },
 { 0x13, "rx_1523_2000" },
 { 0x14, "rx_2001" },
 { 0x15, "tx_hi" },
 { 0x16, "tx_late_col" },
 { 0x17, "tx_pause" },
 { 0x18, "tx_bcast" },
 { 0x19, "tx_mcast" },
 { 0x1A, "tx_ucast" },
 { 0x1B, "tx_deferred" },
 { 0x1C, "tx_total_col" },
 { 0x1D, "tx_exc_col" },
 { 0x1E, "tx_single_col" },
 { 0x1F, "tx_mult_col" },
 { 0x80, "rx_total" },
 { 0x81, "tx_total" },
 { 0x82, "rx_discards" },
 { 0x83, "tx_discards" },
};

struct ksz_driver_strength_prop {
 const char *name;
 int offset;
 int value;
};

enum ksz_driver_strength_type {
 KSZ_DRIVER_STRENGTH_HI,
 KSZ_DRIVER_STRENGTH_LO,
 KSZ_DRIVER_STRENGTH_IO,
};

/**
 * struct ksz_drive_strength - drive strength mapping
 * @reg_val: register value
 * @microamp: microamp value
 */

struct ksz_drive_strength {
 u32 reg_val;
 u32 microamp;
};

/* ksz9477_drive_strengths - Drive strength mapping for KSZ9477 variants
 *
 * This values are not documented in KSZ9477 variants but confirmed by
 * Microchip that KSZ9477, KSZ9567, KSZ8567, KSZ9897, KSZ9896, KSZ9563, KSZ9893
 * and KSZ8563 are using same register (drive strength) settings like KSZ8795.
 *
 * Documentation in KSZ8795CLX provides more information with some
 * recommendations:
 * - for high speed signals
 *   1. 4 mA or 8 mA is often used for MII, RMII, and SPI interface with using
 *      2.5V or 3.3V VDDIO.
 *   2. 12 mA or 16 mA is often used for MII, RMII, and SPI interface with
 *      using 1.8V VDDIO.
 *   3. 20 mA or 24 mA is often used for GMII/RGMII interface with using 2.5V
 *      or 3.3V VDDIO.
 *   4. 28 mA is often used for GMII/RGMII interface with using 1.8V VDDIO.
 *   5. In same interface, the heavy loading should use higher one of the
 *      drive current strength.
 * - for low speed signals
 *   1. 3.3V VDDIO, use either 4 mA or 8 mA.
 *   2. 2.5V VDDIO, use either 8 mA or 12 mA.
 *   3. 1.8V VDDIO, use either 12 mA or 16 mA.
 *   4. If it is heavy loading, can use higher drive current strength.
 */

static const struct ksz_drive_strength ksz9477_drive_strengths[] = {
 { SW_DRIVE_STRENGTH_2MA,  2000 },
 { SW_DRIVE_STRENGTH_4MA,  4000 },
 { SW_DRIVE_STRENGTH_8MA,  8000 },
 { SW_DRIVE_STRENGTH_12MA, 12000 },
 { SW_DRIVE_STRENGTH_16MA, 16000 },
 { SW_DRIVE_STRENGTH_20MA, 20000 },
 { SW_DRIVE_STRENGTH_24MA, 24000 },
 { SW_DRIVE_STRENGTH_28MA, 28000 },
};

/* ksz88x3_drive_strengths - Drive strength mapping for KSZ8863, KSZ8873, ..
 *      variants.
 * This values are documented in KSZ8873 and KSZ8863 datasheets.
 */

static const struct ksz_drive_strength ksz88x3_drive_strengths[] = {
 { 0,  8000 },
 { KSZ8873_DRIVE_STRENGTH_16MA, 16000 },
};

static void ksz88x3_phylink_mac_config(struct phylink_config *config,
           unsigned int mode,
           const struct phylink_link_state *state);
static void ksz_phylink_mac_config(struct phylink_config *config,
       unsigned int mode,
       const struct phylink_link_state *state);
static void ksz_phylink_mac_link_down(struct phylink_config *config,
          unsigned int mode,
          phy_interface_t interface);

/**
 * ksz_phylink_mac_disable_tx_lpi() - Callback to signal LPI support (Dummy)
 * @config: phylink config structure
 *
 * This function is a dummy handler. See ksz_phylink_mac_enable_tx_lpi() for
 * a detailed explanation of EEE/LPI handling in KSZ switches.
 */

static void ksz_phylink_mac_disable_tx_lpi(struct phylink_config *config)
{
}

/**
 * ksz_phylink_mac_enable_tx_lpi() - Callback to signal LPI support (Dummy)
 * @config: phylink config structure
 * @timer: timer value before entering LPI (unused)
 * @tx_clock_stop: whether to stop the TX clock in LPI mode (unused)
 *
 * This function signals to phylink that the driver architecture supports
 * LPI management, enabling phylink to control EEE advertisement during
 * negotiation according to IEEE Std 802.3 (Clause 78).
 *
 * Hardware Management of EEE/LPI State:
 * For KSZ switch ports with integrated PHYs (e.g., KSZ9893R ports 1-2),
 * observation and testing suggest that the actual EEE / Low Power Idle (LPI)
 * state transitions are managed autonomously by the hardware based on
 * the auto-negotiation results. (Note: While the datasheet describes EEE
 * operation based on negotiation, it doesn't explicitly detail the internal
 * MAC/PHY interaction, so autonomous hardware management of the MAC state
 * for LPI is inferred from observed behavior).
 * This hardware control, consistent with the switch's ability to operate
 * autonomously via strapping, means MAC-level software intervention is not
 * required or exposed for managing the LPI state once EEE is negotiated.
 * (Ref: KSZ9893R Data Sheet DS00002420D, primarily Section 4.7.5 explaining
 * EEE, also Sections 4.1.7 on Auto-Negotiation and 3.2.1 on Configuration
 * Straps).
 *
 * Additionally, ports configured as MAC interfaces (e.g., KSZ9893R port 3)
 * lack documented MAC-level LPI control.
 *
 * Therefore, this callback performs no action and serves primarily to inform
 * phylink of LPI awareness and to document the inferred hardware behavior.
 *
 * Returns: 0 (Always success)
 */

static int ksz_phylink_mac_enable_tx_lpi(struct phylink_config *config,
      u32 timer, bool tx_clock_stop)
{
 return 0;
}

static const struct phylink_mac_ops ksz88x3_phylink_mac_ops = {
 .mac_config = ksz88x3_phylink_mac_config,
 .mac_link_down = ksz_phylink_mac_link_down,
 .mac_link_up = ksz8_phylink_mac_link_up,
 .mac_disable_tx_lpi = ksz_phylink_mac_disable_tx_lpi,
 .mac_enable_tx_lpi = ksz_phylink_mac_enable_tx_lpi,
};

static const struct phylink_mac_ops ksz8_phylink_mac_ops = {
 .mac_config = ksz_phylink_mac_config,
 .mac_link_down = ksz_phylink_mac_link_down,
 .mac_link_up = ksz8_phylink_mac_link_up,
 .mac_disable_tx_lpi = ksz_phylink_mac_disable_tx_lpi,
 .mac_enable_tx_lpi = ksz_phylink_mac_enable_tx_lpi,
};

static const struct ksz_dev_ops ksz8463_dev_ops = {
 .setup = ksz8_setup,
 .get_port_addr = ksz8463_get_port_addr,
 .cfg_port_member = ksz8_cfg_port_member,
 .flush_dyn_mac_table = ksz8_flush_dyn_mac_table,
 .port_setup = ksz8_port_setup,
 .r_phy = ksz8463_r_phy,
 .w_phy = ksz8463_w_phy,
 .r_mib_cnt = ksz8_r_mib_cnt,
 .r_mib_pkt = ksz8_r_mib_pkt,
 .r_mib_stat64 = ksz88xx_r_mib_stats64,
 .freeze_mib = ksz8_freeze_mib,
 .port_init_cnt = ksz8_port_init_cnt,
 .fdb_dump = ksz8_fdb_dump,
 .fdb_add = ksz8_fdb_add,
 .fdb_del = ksz8_fdb_del,
 .mdb_add = ksz8_mdb_add,
 .mdb_del = ksz8_mdb_del,
 .vlan_filtering = ksz8_port_vlan_filtering,
 .vlan_add = ksz8_port_vlan_add,
 .vlan_del = ksz8_port_vlan_del,
 .mirror_add = ksz8_port_mirror_add,
 .mirror_del = ksz8_port_mirror_del,
 .get_caps = ksz8_get_caps,
 .config_cpu_port = ksz8_config_cpu_port,
 .enable_stp_addr = ksz8_enable_stp_addr,
 .reset = ksz8_reset_switch,
 .init = ksz8_switch_init,
 .exit = ksz8_switch_exit,
 .change_mtu = ksz8_change_mtu,
};

static const struct ksz_dev_ops ksz88xx_dev_ops = {
 .setup = ksz8_setup,
 .get_port_addr = ksz8_get_port_addr,
 .cfg_port_member = ksz8_cfg_port_member,
 .flush_dyn_mac_table = ksz8_flush_dyn_mac_table,
 .port_setup = ksz8_port_setup,
 .r_phy = ksz8_r_phy,
 .w_phy = ksz8_w_phy,
 .r_mib_cnt = ksz8_r_mib_cnt,
 .r_mib_pkt = ksz8_r_mib_pkt,
 .r_mib_stat64 = ksz88xx_r_mib_stats64,
 .freeze_mib = ksz8_freeze_mib,
 .port_init_cnt = ksz8_port_init_cnt,
 .fdb_dump = ksz8_fdb_dump,
 .fdb_add = ksz8_fdb_add,
 .fdb_del = ksz8_fdb_del,
 .mdb_add = ksz8_mdb_add,
 .mdb_del = ksz8_mdb_del,
 .vlan_filtering = ksz8_port_vlan_filtering,
 .vlan_add = ksz8_port_vlan_add,
 .vlan_del = ksz8_port_vlan_del,
 .mirror_add = ksz8_port_mirror_add,
 .mirror_del = ksz8_port_mirror_del,
 .get_caps = ksz8_get_caps,
 .config_cpu_port = ksz8_config_cpu_port,
 .enable_stp_addr = ksz8_enable_stp_addr,
 .reset = ksz8_reset_switch,
 .init = ksz8_switch_init,
 .exit = ksz8_switch_exit,
 .change_mtu = ksz8_change_mtu,
 .pme_write8 = ksz8_pme_write8,
 .pme_pread8 = ksz8_pme_pread8,
 .pme_pwrite8 = ksz8_pme_pwrite8,
};

static const struct ksz_dev_ops ksz87xx_dev_ops = {
 .setup = ksz8_setup,
 .get_port_addr = ksz8_get_port_addr,
 .cfg_port_member = ksz8_cfg_port_member,
 .flush_dyn_mac_table = ksz8_flush_dyn_mac_table,
 .port_setup = ksz8_port_setup,
 .r_phy = ksz8_r_phy,
 .w_phy = ksz8_w_phy,
 .r_mib_cnt = ksz8_r_mib_cnt,
 .r_mib_pkt = ksz8_r_mib_pkt,
 .r_mib_stat64 = ksz_r_mib_stats64,
 .freeze_mib = ksz8_freeze_mib,
 .port_init_cnt = ksz8_port_init_cnt,
 .fdb_dump = ksz8_fdb_dump,
 .fdb_add = ksz8_fdb_add,
 .fdb_del = ksz8_fdb_del,
 .mdb_add = ksz8_mdb_add,
 .mdb_del = ksz8_mdb_del,
 .vlan_filtering = ksz8_port_vlan_filtering,
 .vlan_add = ksz8_port_vlan_add,
 .vlan_del = ksz8_port_vlan_del,
 .mirror_add = ksz8_port_mirror_add,
 .mirror_del = ksz8_port_mirror_del,
 .get_caps = ksz8_get_caps,
 .config_cpu_port = ksz8_config_cpu_port,
 .enable_stp_addr = ksz8_enable_stp_addr,
 .reset = ksz8_reset_switch,
 .init = ksz8_switch_init,
 .exit = ksz8_switch_exit,
 .change_mtu = ksz8_change_mtu,
 .pme_write8 = ksz8_pme_write8,
 .pme_pread8 = ksz8_pme_pread8,
 .pme_pwrite8 = ksz8_pme_pwrite8,
};

static void ksz9477_phylink_mac_link_up(struct phylink_config *config,
     struct phy_device *phydev,
     unsigned int mode,
     phy_interface_t interface,
     int speed, int duplex, bool tx_pause,
     bool rx_pause);

static struct phylink_pcs *
ksz_phylink_mac_select_pcs(struct phylink_config *config,
      phy_interface_t interface)
{
 struct dsa_port *dp = dsa_phylink_to_port(config);
 struct ksz_device *dev = dp->ds->priv;
 struct ksz_port *p = &dev->ports[dp->index];

 if (ksz_is_sgmii_port(dev, dp->index) &&
     (interface == PHY_INTERFACE_MODE_SGMII ||
     interface == PHY_INTERFACE_MODE_1000BASEX))
  return p->pcs;

 return NULL;
}

static const struct phylink_mac_ops ksz9477_phylink_mac_ops = {
 .mac_config = ksz_phylink_mac_config,
 .mac_link_down = ksz_phylink_mac_link_down,
 .mac_link_up = ksz9477_phylink_mac_link_up,
 .mac_disable_tx_lpi = ksz_phylink_mac_disable_tx_lpi,
 .mac_enable_tx_lpi = ksz_phylink_mac_enable_tx_lpi,
 .mac_select_pcs = ksz_phylink_mac_select_pcs,
};

static const struct ksz_dev_ops ksz9477_dev_ops = {
 .setup = ksz9477_setup,
 .get_port_addr = ksz9477_get_port_addr,
 .cfg_port_member = ksz9477_cfg_port_member,
 .flush_dyn_mac_table = ksz9477_flush_dyn_mac_table,
 .port_setup = ksz9477_port_setup,
 .set_ageing_time = ksz9477_set_ageing_time,
 .r_phy = ksz9477_r_phy,
 .w_phy = ksz9477_w_phy,
 .r_mib_cnt = ksz9477_r_mib_cnt,
 .r_mib_pkt = ksz9477_r_mib_pkt,
 .r_mib_stat64 = ksz_r_mib_stats64,
 .freeze_mib = ksz9477_freeze_mib,
 .port_init_cnt = ksz9477_port_init_cnt,
 .vlan_filtering = ksz9477_port_vlan_filtering,
 .vlan_add = ksz9477_port_vlan_add,
 .vlan_del = ksz9477_port_vlan_del,
 .mirror_add = ksz9477_port_mirror_add,
 .mirror_del = ksz9477_port_mirror_del,
 .get_caps = ksz9477_get_caps,
 .fdb_dump = ksz9477_fdb_dump,
 .fdb_add = ksz9477_fdb_add,
 .fdb_del = ksz9477_fdb_del,
 .mdb_add = ksz9477_mdb_add,
 .mdb_del = ksz9477_mdb_del,
 .change_mtu = ksz9477_change_mtu,
 .pme_write8 = ksz_write8,
 .pme_pread8 = ksz_pread8,
 .pme_pwrite8 = ksz_pwrite8,
 .config_cpu_port = ksz9477_config_cpu_port,
 .tc_cbs_set_cinc = ksz9477_tc_cbs_set_cinc,
 .enable_stp_addr = ksz9477_enable_stp_addr,
 .reset = ksz9477_reset_switch,
 .init = ksz9477_switch_init,
 .exit = ksz9477_switch_exit,
 .pcs_create = ksz9477_pcs_create,
};

static const struct phylink_mac_ops lan937x_phylink_mac_ops = {
 .mac_config = ksz_phylink_mac_config,
 .mac_link_down = ksz_phylink_mac_link_down,
 .mac_link_up = ksz9477_phylink_mac_link_up,
 .mac_disable_tx_lpi = ksz_phylink_mac_disable_tx_lpi,
 .mac_enable_tx_lpi = ksz_phylink_mac_enable_tx_lpi,
};

static const struct ksz_dev_ops lan937x_dev_ops = {
 .setup = lan937x_setup,
 .teardown = lan937x_teardown,
 .get_port_addr = ksz9477_get_port_addr,
 .cfg_port_member = ksz9477_cfg_port_member,
 .flush_dyn_mac_table = ksz9477_flush_dyn_mac_table,
 .port_setup = lan937x_port_setup,
 .set_ageing_time = lan937x_set_ageing_time,
 .mdio_bus_preinit = lan937x_mdio_bus_preinit,
 .create_phy_addr_map = lan937x_create_phy_addr_map,
 .r_phy = lan937x_r_phy,
 .w_phy = lan937x_w_phy,
 .r_mib_cnt = ksz9477_r_mib_cnt,
 .r_mib_pkt = ksz9477_r_mib_pkt,
 .r_mib_stat64 = ksz_r_mib_stats64,
 .freeze_mib = ksz9477_freeze_mib,
 .port_init_cnt = ksz9477_port_init_cnt,
 .vlan_filtering = ksz9477_port_vlan_filtering,
 .vlan_add = ksz9477_port_vlan_add,
 .vlan_del = ksz9477_port_vlan_del,
 .mirror_add = ksz9477_port_mirror_add,
 .mirror_del = ksz9477_port_mirror_del,
 .get_caps = lan937x_phylink_get_caps,
 .setup_rgmii_delay = lan937x_setup_rgmii_delay,
 .fdb_dump = ksz9477_fdb_dump,
 .fdb_add = ksz9477_fdb_add,
 .fdb_del = ksz9477_fdb_del,
 .mdb_add = ksz9477_mdb_add,
 .mdb_del = ksz9477_mdb_del,
 .change_mtu = lan937x_change_mtu,
 .config_cpu_port = lan937x_config_cpu_port,
 .tc_cbs_set_cinc = lan937x_tc_cbs_set_cinc,
 .enable_stp_addr = ksz9477_enable_stp_addr,
 .reset = lan937x_reset_switch,
 .init = lan937x_switch_init,
 .exit = lan937x_switch_exit,
};

static const u16 ksz8463_regs[] = {
 [REG_SW_MAC_ADDR]  = 0x10,
 [REG_IND_CTRL_0]  = 0x30,
 [REG_IND_DATA_8]  = 0x26,
 [REG_IND_DATA_CHECK]  = 0x26,
 [REG_IND_DATA_HI]  = 0x28,
 [REG_IND_DATA_LO]  = 0x2C,
 [REG_IND_MIB_CHECK]  = 0x2F,
 [P_FORCE_CTRL]   = 0x0C,
 [P_LINK_STATUS]   = 0x0E,
 [P_LOCAL_CTRL]   = 0x0C,
 [P_NEG_RESTART_CTRL]  = 0x0D,
 [P_REMOTE_STATUS]  = 0x0E,
 [P_SPEED_STATUS]  = 0x0F,
 [S_TAIL_TAG_CTRL]  = 0xAD,
 [P_STP_CTRL]   = 0x6F,
 [S_START_CTRL]   = 0x01,
 [S_BROADCAST_CTRL]  = 0x06,
 [S_MULTICAST_CTRL]  = 0x04,
};

static const u32 ksz8463_masks[] = {
 [PORT_802_1P_REMAPPING]  = BIT(3),
 [SW_TAIL_TAG_ENABLE]  = BIT(0),
 [MIB_COUNTER_OVERFLOW]  = BIT(7),
 [MIB_COUNTER_VALID]  = BIT(6),
 [VLAN_TABLE_FID]  = GENMASK(15, 12),
 [VLAN_TABLE_MEMBERSHIP]  = GENMASK(18, 16),
 [VLAN_TABLE_VALID]  = BIT(19),
 [STATIC_MAC_TABLE_VALID] = BIT(19),
 [STATIC_MAC_TABLE_USE_FID] = BIT(21),
 [STATIC_MAC_TABLE_FID]  = GENMASK(25, 22),
 [STATIC_MAC_TABLE_OVERRIDE] = BIT(20),
 [STATIC_MAC_TABLE_FWD_PORTS] = GENMASK(18, 16),
 [DYNAMIC_MAC_TABLE_ENTRIES_H] = GENMASK(1, 0),
 [DYNAMIC_MAC_TABLE_MAC_EMPTY] = BIT(2),
 [DYNAMIC_MAC_TABLE_NOT_READY] = BIT(7),
 [DYNAMIC_MAC_TABLE_ENTRIES] = GENMASK(31, 24),
 [DYNAMIC_MAC_TABLE_FID]  = GENMASK(19, 16),
 [DYNAMIC_MAC_TABLE_SRC_PORT] = GENMASK(21, 20),
 [DYNAMIC_MAC_TABLE_TIMESTAMP] = GENMASK(23, 22),
};

static u8 ksz8463_shifts[] = {
 [VLAN_TABLE_MEMBERSHIP_S] = 16,
 [STATIC_MAC_FWD_PORTS]  = 16,
 [STATIC_MAC_FID]  = 22,
 [DYNAMIC_MAC_ENTRIES_H]  = 8,
 [DYNAMIC_MAC_ENTRIES]  = 24,
 [DYNAMIC_MAC_FID]  = 16,
 [DYNAMIC_MAC_TIMESTAMP]  = 22,
 [DYNAMIC_MAC_SRC_PORT]  = 20,
};

static const u16 ksz8795_regs[] = {
 [REG_SW_MAC_ADDR]  = 0x68,
 [REG_IND_CTRL_0]  = 0x6E,
 [REG_IND_DATA_8]  = 0x70,
 [REG_IND_DATA_CHECK]  = 0x72,
 [REG_IND_DATA_HI]  = 0x71,
 [REG_IND_DATA_LO]  = 0x75,
 [REG_IND_MIB_CHECK]  = 0x74,
 [REG_IND_BYTE]   = 0xA0,
 [P_FORCE_CTRL]   = 0x0C,
 [P_LINK_STATUS]   = 0x0E,
 [P_LOCAL_CTRL]   = 0x07,
 [P_NEG_RESTART_CTRL]  = 0x0D,
 [P_REMOTE_STATUS]  = 0x08,
 [P_SPEED_STATUS]  = 0x09,
 [S_TAIL_TAG_CTRL]  = 0x0C,
 [P_STP_CTRL]   = 0x02,
 [S_START_CTRL]   = 0x01,
 [S_BROADCAST_CTRL]  = 0x06,
 [S_MULTICAST_CTRL]  = 0x04,
 [P_XMII_CTRL_0]   = 0x06,
 [P_XMII_CTRL_1]   = 0x06,
 [REG_SW_PME_CTRL]  = 0x8003,
 [REG_PORT_PME_STATUS]  = 0x8003,
 [REG_PORT_PME_CTRL]  = 0x8007,
};

static const u32 ksz8795_masks[] = {
 [PORT_802_1P_REMAPPING]  = BIT(7),
 [SW_TAIL_TAG_ENABLE]  = BIT(1),
 [MIB_COUNTER_OVERFLOW]  = BIT(6),
 [MIB_COUNTER_VALID]  = BIT(5),
 [VLAN_TABLE_FID]  = GENMASK(6, 0),
 [VLAN_TABLE_MEMBERSHIP]  = GENMASK(11, 7),
 [VLAN_TABLE_VALID]  = BIT(12),
 [STATIC_MAC_TABLE_VALID] = BIT(21),
 [STATIC_MAC_TABLE_USE_FID] = BIT(23),
 [STATIC_MAC_TABLE_FID]  = GENMASK(30, 24),
 [STATIC_MAC_TABLE_OVERRIDE] = BIT(22),
 [STATIC_MAC_TABLE_FWD_PORTS] = GENMASK(20, 16),
 [DYNAMIC_MAC_TABLE_ENTRIES_H] = GENMASK(6, 0),
 [DYNAMIC_MAC_TABLE_MAC_EMPTY] = BIT(7),
 [DYNAMIC_MAC_TABLE_NOT_READY] = BIT(7),
 [DYNAMIC_MAC_TABLE_ENTRIES] = GENMASK(31, 29),
 [DYNAMIC_MAC_TABLE_FID]  = GENMASK(22, 16),
 [DYNAMIC_MAC_TABLE_SRC_PORT] = GENMASK(26, 24),
 [DYNAMIC_MAC_TABLE_TIMESTAMP] = GENMASK(28, 27),
 [P_MII_TX_FLOW_CTRL]  = BIT(5),
 [P_MII_RX_FLOW_CTRL]  = BIT(5),
};

static const u8 ksz8795_xmii_ctrl0[] = {
 [P_MII_100MBIT]   = 0,
 [P_MII_10MBIT]   = 1,
 [P_MII_FULL_DUPLEX]  = 0,
 [P_MII_HALF_DUPLEX]  = 1,
};

static const u8 ksz8795_xmii_ctrl1[] = {
 [P_RGMII_SEL]   = 3,
 [P_GMII_SEL]   = 2,
 [P_RMII_SEL]   = 1,
 [P_MII_SEL]   = 0,
 [P_GMII_1GBIT]   = 1,
 [P_GMII_NOT_1GBIT]  = 0,
};

static const u8 ksz8795_shifts[] = {
 [VLAN_TABLE_MEMBERSHIP_S] = 7,
 [VLAN_TABLE]   = 16,
 [STATIC_MAC_FWD_PORTS]  = 16,
 [STATIC_MAC_FID]  = 24,
 [DYNAMIC_MAC_ENTRIES_H]  = 3,
 [DYNAMIC_MAC_ENTRIES]  = 29,
 [DYNAMIC_MAC_FID]  = 16,
 [DYNAMIC_MAC_TIMESTAMP]  = 27,
 [DYNAMIC_MAC_SRC_PORT]  = 24,
};

static const u16 ksz8863_regs[] = {
 [REG_SW_MAC_ADDR]  = 0x70,
 [REG_IND_CTRL_0]  = 0x79,
 [REG_IND_DATA_8]  = 0x7B,
 [REG_IND_DATA_CHECK]  = 0x7B,
 [REG_IND_DATA_HI]  = 0x7C,
 [REG_IND_DATA_LO]  = 0x80,
 [REG_IND_MIB_CHECK]  = 0x80,
 [P_FORCE_CTRL]   = 0x0C,
 [P_LINK_STATUS]   = 0x0E,
 [P_LOCAL_CTRL]   = 0x0C,
 [P_NEG_RESTART_CTRL]  = 0x0D,
 [P_REMOTE_STATUS]  = 0x0E,
 [P_SPEED_STATUS]  = 0x0F,
 [S_TAIL_TAG_CTRL]  = 0x03,
 [P_STP_CTRL]   = 0x02,
 [S_START_CTRL]   = 0x01,
 [S_BROADCAST_CTRL]  = 0x06,
 [S_MULTICAST_CTRL]  = 0x04,
};

static const u32 ksz8863_masks[] = {
 [PORT_802_1P_REMAPPING]  = BIT(3),
 [SW_TAIL_TAG_ENABLE]  = BIT(6),
 [MIB_COUNTER_OVERFLOW]  = BIT(7),
 [MIB_COUNTER_VALID]  = BIT(6),
 [VLAN_TABLE_FID]  = GENMASK(15, 12),
 [VLAN_TABLE_MEMBERSHIP]  = GENMASK(18, 16),
 [VLAN_TABLE_VALID]  = BIT(19),
 [STATIC_MAC_TABLE_VALID] = BIT(19),
 [STATIC_MAC_TABLE_USE_FID] = BIT(21),
 [STATIC_MAC_TABLE_FID]  = GENMASK(25, 22),
 [STATIC_MAC_TABLE_OVERRIDE] = BIT(20),
 [STATIC_MAC_TABLE_FWD_PORTS] = GENMASK(18, 16),
 [DYNAMIC_MAC_TABLE_ENTRIES_H] = GENMASK(1, 0),
 [DYNAMIC_MAC_TABLE_MAC_EMPTY] = BIT(2),
 [DYNAMIC_MAC_TABLE_NOT_READY] = BIT(7),
 [DYNAMIC_MAC_TABLE_ENTRIES] = GENMASK(31, 24),
 [DYNAMIC_MAC_TABLE_FID]  = GENMASK(19, 16),
 [DYNAMIC_MAC_TABLE_SRC_PORT] = GENMASK(21, 20),
 [DYNAMIC_MAC_TABLE_TIMESTAMP] = GENMASK(23, 22),
};

static u8 ksz8863_shifts[] = {
 [VLAN_TABLE_MEMBERSHIP_S] = 16,
 [STATIC_MAC_FWD_PORTS]  = 16,
 [STATIC_MAC_FID]  = 22,
 [DYNAMIC_MAC_ENTRIES_H]  = 8,
 [DYNAMIC_MAC_ENTRIES]  = 24,
 [DYNAMIC_MAC_FID]  = 16,
 [DYNAMIC_MAC_TIMESTAMP]  = 22,
 [DYNAMIC_MAC_SRC_PORT]  = 20,
};

static const u16 ksz8895_regs[] = {
 [REG_SW_MAC_ADDR]  = 0x68,
 [REG_IND_CTRL_0]  = 0x6E,
 [REG_IND_DATA_8]  = 0x70,
 [REG_IND_DATA_CHECK]  = 0x72,
 [REG_IND_DATA_HI]  = 0x71,
 [REG_IND_DATA_LO]  = 0x75,
 [REG_IND_MIB_CHECK]  = 0x75,
 [P_FORCE_CTRL]   = 0x0C,
 [P_LINK_STATUS]   = 0x0E,
 [P_LOCAL_CTRL]   = 0x0C,
 [P_NEG_RESTART_CTRL]  = 0x0D,
 [P_REMOTE_STATUS]  = 0x0E,
 [P_SPEED_STATUS]  = 0x09,
 [S_TAIL_TAG_CTRL]  = 0x0C,
 [P_STP_CTRL]   = 0x02,
 [S_START_CTRL]   = 0x01,
 [S_BROADCAST_CTRL]  = 0x06,
 [S_MULTICAST_CTRL]  = 0x04,
};

static const u32 ksz8895_masks[] = {
 [PORT_802_1P_REMAPPING]  = BIT(7),
 [SW_TAIL_TAG_ENABLE]  = BIT(1),
 [MIB_COUNTER_OVERFLOW]  = BIT(7),
 [MIB_COUNTER_VALID]  = BIT(6),
 [VLAN_TABLE_FID]  = GENMASK(6, 0),
 [VLAN_TABLE_MEMBERSHIP]  = GENMASK(11, 7),
 [VLAN_TABLE_VALID]  = BIT(12),
 [STATIC_MAC_TABLE_VALID] = BIT(21),
 [STATIC_MAC_TABLE_USE_FID] = BIT(23),
 [STATIC_MAC_TABLE_FID]  = GENMASK(30, 24),
 [STATIC_MAC_TABLE_OVERRIDE] = BIT(22),
 [STATIC_MAC_TABLE_FWD_PORTS] = GENMASK(20, 16),
 [DYNAMIC_MAC_TABLE_ENTRIES_H] = GENMASK(6, 0),
 [DYNAMIC_MAC_TABLE_MAC_EMPTY] = BIT(7),
 [DYNAMIC_MAC_TABLE_NOT_READY] = BIT(7),
 [DYNAMIC_MAC_TABLE_ENTRIES] = GENMASK(31, 29),
 [DYNAMIC_MAC_TABLE_FID]  = GENMASK(22, 16),
 [DYNAMIC_MAC_TABLE_SRC_PORT] = GENMASK(26, 24),
 [DYNAMIC_MAC_TABLE_TIMESTAMP] = GENMASK(28, 27),
};

static const u8 ksz8895_shifts[] = {
 [VLAN_TABLE_MEMBERSHIP_S] = 7,
 [VLAN_TABLE]   = 13,
 [STATIC_MAC_FWD_PORTS]  = 16,
 [STATIC_MAC_FID]  = 24,
 [DYNAMIC_MAC_ENTRIES_H]  = 3,
 [DYNAMIC_MAC_ENTRIES]  = 29,
 [DYNAMIC_MAC_FID]  = 16,
 [DYNAMIC_MAC_TIMESTAMP]  = 27,
 [DYNAMIC_MAC_SRC_PORT]  = 24,
};

static const u16 ksz9477_regs[] = {
 [REG_SW_MAC_ADDR]  = 0x0302,
 [P_STP_CTRL]   = 0x0B04,
 [S_START_CTRL]   = 0x0300,
 [S_BROADCAST_CTRL]  = 0x0332,
 [S_MULTICAST_CTRL]  = 0x0331,
 [P_XMII_CTRL_0]   = 0x0300,
 [P_XMII_CTRL_1]   = 0x0301,
 [REG_SW_PME_CTRL]  = 0x0006,
 [REG_PORT_PME_STATUS]  = 0x0013,
 [REG_PORT_PME_CTRL]  = 0x0017,
};

static const u32 ksz9477_masks[] = {
 [ALU_STAT_WRITE]  = 0,
 [ALU_STAT_READ]   = 1,
 [ALU_STAT_DIRECT]  = 0,
 [ALU_RESV_MCAST_ADDR]  = BIT(1),
 [P_MII_TX_FLOW_CTRL]  = BIT(5),
 [P_MII_RX_FLOW_CTRL]  = BIT(3),
};

static const u8 ksz9477_shifts[] = {
 [ALU_STAT_INDEX]  = 16,
};

static const u8 ksz9477_xmii_ctrl0[] = {
 [P_MII_100MBIT]   = 1,
 [P_MII_10MBIT]   = 0,
 [P_MII_FULL_DUPLEX]  = 1,
 [P_MII_HALF_DUPLEX]  = 0,
};

static const u8 ksz9477_xmii_ctrl1[] = {
 [P_RGMII_SEL]   = 0,
 [P_RMII_SEL]   = 1,
 [P_GMII_SEL]   = 2,
 [P_MII_SEL]   = 3,
 [P_GMII_1GBIT]   = 0,
 [P_GMII_NOT_1GBIT]  = 1,
};

static const u32 lan937x_masks[] = {
 [ALU_STAT_WRITE]  = 1,
 [ALU_STAT_READ]   = 2,
 [ALU_STAT_DIRECT]  = BIT(3),
 [ALU_RESV_MCAST_ADDR]  = BIT(2),
 [P_MII_TX_FLOW_CTRL]  = BIT(5),
 [P_MII_RX_FLOW_CTRL]  = BIT(3),
};

static const u8 lan937x_shifts[] = {
 [ALU_STAT_INDEX]  = 8,
};

static const struct regmap_range ksz8563_valid_regs[] = {
 regmap_reg_range(0x0000, 0x0003),
 regmap_reg_range(0x0006, 0x0006),
 regmap_reg_range(0x000f, 0x001f),
 regmap_reg_range(0x0100, 0x0100),
 regmap_reg_range(0x0104, 0x0107),
 regmap_reg_range(0x010d, 0x010d),
 regmap_reg_range(0x0110, 0x0113),
 regmap_reg_range(0x0120, 0x012b),
 regmap_reg_range(0x0201, 0x0201),
 regmap_reg_range(0x0210, 0x0213),
 regmap_reg_range(0x0300, 0x0300),
 regmap_reg_range(0x0302, 0x031b),
 regmap_reg_range(0x0320, 0x032b),
 regmap_reg_range(0x0330, 0x0336),
 regmap_reg_range(0x0338, 0x033e),
 regmap_reg_range(0x0340, 0x035f),
 regmap_reg_range(0x0370, 0x0370),
 regmap_reg_range(0x0378, 0x0378),
 regmap_reg_range(0x037c, 0x037d),
 regmap_reg_range(0x0390, 0x0393),
 regmap_reg_range(0x0400, 0x040e),
 regmap_reg_range(0x0410, 0x042f),
 regmap_reg_range(0x0500, 0x0519),
 regmap_reg_range(0x0520, 0x054b),
 regmap_reg_range(0x0550, 0x05b3),

 /* port 1 */
 regmap_reg_range(0x1000, 0x1001),
 regmap_reg_range(0x1004, 0x100b),
 regmap_reg_range(0x1013, 0x1013),
 regmap_reg_range(0x1017, 0x1017),
 regmap_reg_range(0x101b, 0x101b),
 regmap_reg_range(0x101f, 0x1021),
 regmap_reg_range(0x1030, 0x1030),
 regmap_reg_range(0x1100, 0x1111),
 regmap_reg_range(0x111a, 0x111d),
 regmap_reg_range(0x1122, 0x1127),
 regmap_reg_range(0x112a, 0x112b),
 regmap_reg_range(0x1136, 0x1139),
 regmap_reg_range(0x113e, 0x113f),
 regmap_reg_range(0x1400, 0x1401),
 regmap_reg_range(0x1403, 0x1403),
 regmap_reg_range(0x1410, 0x1417),
 regmap_reg_range(0x1420, 0x1423),
 regmap_reg_range(0x1500, 0x1507),
 regmap_reg_range(0x1600, 0x1612),
 regmap_reg_range(0x1800, 0x180f),
 regmap_reg_range(0x1900, 0x1907),
 regmap_reg_range(0x1914, 0x191b),
 regmap_reg_range(0x1a00, 0x1a03),
 regmap_reg_range(0x1a04, 0x1a08),
 regmap_reg_range(0x1b00, 0x1b01),
 regmap_reg_range(0x1b04, 0x1b04),
 regmap_reg_range(0x1c00, 0x1c05),
 regmap_reg_range(0x1c08, 0x1c1b),

 /* port 2 */
 regmap_reg_range(0x2000, 0x2001),
 regmap_reg_range(0x2004, 0x200b),
 regmap_reg_range(0x2013, 0x2013),
 regmap_reg_range(0x2017, 0x2017),
 regmap_reg_range(0x201b, 0x201b),
 regmap_reg_range(0x201f, 0x2021),
 regmap_reg_range(0x2030, 0x2030),
 regmap_reg_range(0x2100, 0x2111),
 regmap_reg_range(0x211a, 0x211d),
 regmap_reg_range(0x2122, 0x2127),
 regmap_reg_range(0x212a, 0x212b),
 regmap_reg_range(0x2136, 0x2139),
 regmap_reg_range(0x213e, 0x213f),
 regmap_reg_range(0x2400, 0x2401),
 regmap_reg_range(0x2403, 0x2403),
 regmap_reg_range(0x2410, 0x2417),
 regmap_reg_range(0x2420, 0x2423),
 regmap_reg_range(0x2500, 0x2507),
 regmap_reg_range(0x2600, 0x2612),
 regmap_reg_range(0x2800, 0x280f),
 regmap_reg_range(0x2900, 0x2907),
 regmap_reg_range(0x2914, 0x291b),
 regmap_reg_range(0x2a00, 0x2a03),
 regmap_reg_range(0x2a04, 0x2a08),
 regmap_reg_range(0x2b00, 0x2b01),
 regmap_reg_range(0x2b04, 0x2b04),
 regmap_reg_range(0x2c00, 0x2c05),
 regmap_reg_range(0x2c08, 0x2c1b),

 /* port 3 */
 regmap_reg_range(0x3000, 0x3001),
 regmap_reg_range(0x3004, 0x300b),
 regmap_reg_range(0x3013, 0x3013),
 regmap_reg_range(0x3017, 0x3017),
 regmap_reg_range(0x301b, 0x301b),
 regmap_reg_range(0x301f, 0x3021),
 regmap_reg_range(0x3030, 0x3030),
 regmap_reg_range(0x3300, 0x3301),
 regmap_reg_range(0x3303, 0x3303),
 regmap_reg_range(0x3400, 0x3401),
 regmap_reg_range(0x3403, 0x3403),
 regmap_reg_range(0x3410, 0x3417),
 regmap_reg_range(0x3420, 0x3423),
 regmap_reg_range(0x3500, 0x3507),
 regmap_reg_range(0x3600, 0x3612),
 regmap_reg_range(0x3800, 0x380f),
 regmap_reg_range(0x3900, 0x3907),
 regmap_reg_range(0x3914, 0x391b),
 regmap_reg_range(0x3a00, 0x3a03),
 regmap_reg_range(0x3a04, 0x3a08),
 regmap_reg_range(0x3b00, 0x3b01),
 regmap_reg_range(0x3b04, 0x3b04),
 regmap_reg_range(0x3c00, 0x3c05),
 regmap_reg_range(0x3c08, 0x3c1b),
};

static const struct regmap_access_table ksz8563_register_set = {
 .yes_ranges = ksz8563_valid_regs,
 .n_yes_ranges = ARRAY_SIZE(ksz8563_valid_regs),
};

static const struct regmap_range ksz9477_valid_regs[] = {
 regmap_reg_range(0x0000, 0x0003),
 regmap_reg_range(0x0006, 0x0006),
 regmap_reg_range(0x0010, 0x001f),
 regmap_reg_range(0x0100, 0x0100),
 regmap_reg_range(0x0103, 0x0107),
 regmap_reg_range(0x010d, 0x010d),
 regmap_reg_range(0x0110, 0x0113),
 regmap_reg_range(0x0120, 0x012b),
 regmap_reg_range(0x0201, 0x0201),
 regmap_reg_range(0x0210, 0x0213),
 regmap_reg_range(0x0300, 0x0300),
 regmap_reg_range(0x0302, 0x031b),
 regmap_reg_range(0x0320, 0x032b),
 regmap_reg_range(0x0330, 0x0336),
 regmap_reg_range(0x0338, 0x033b),
 regmap_reg_range(0x033e, 0x033e),
 regmap_reg_range(0x0340, 0x035f),
 regmap_reg_range(0x0370, 0x0370),
 regmap_reg_range(0x0378, 0x0378),
 regmap_reg_range(0x037c, 0x037d),
 regmap_reg_range(0x0390, 0x0393),
 regmap_reg_range(0x0400, 0x040e),
 regmap_reg_range(0x0410, 0x042f),
 regmap_reg_range(0x0444, 0x044b),
 regmap_reg_range(0x0450, 0x046f),
 regmap_reg_range(0x0500, 0x0519),
 regmap_reg_range(0x0520, 0x054b),
 regmap_reg_range(0x0550, 0x05b3),
 regmap_reg_range(0x0604, 0x060b),
 regmap_reg_range(0x0610, 0x0612),
 regmap_reg_range(0x0614, 0x062c),
 regmap_reg_range(0x0640, 0x0645),
 regmap_reg_range(0x0648, 0x064d),

 /* port 1 */
 regmap_reg_range(0x1000, 0x1001),
 regmap_reg_range(0x1013, 0x1013),
 regmap_reg_range(0x1017, 0x1017),
 regmap_reg_range(0x101b, 0x101b),
 regmap_reg_range(0x101f, 0x1020),
 regmap_reg_range(0x1030, 0x1030),
 regmap_reg_range(0x1100, 0x1115),
 regmap_reg_range(0x111a, 0x111f),
 regmap_reg_range(0x1120, 0x112b),
 regmap_reg_range(0x1134, 0x113b),
 regmap_reg_range(0x113c, 0x113f),
 regmap_reg_range(0x1400, 0x1401),
 regmap_reg_range(0x1403, 0x1403),
 regmap_reg_range(0x1410, 0x1417),
 regmap_reg_range(0x1420, 0x1423),
 regmap_reg_range(0x1500, 0x1507),
 regmap_reg_range(0x1600, 0x1613),
 regmap_reg_range(0x1800, 0x180f),
 regmap_reg_range(0x1820, 0x1827),
 regmap_reg_range(0x1830, 0x1837),
 regmap_reg_range(0x1840, 0x184b),
 regmap_reg_range(0x1900, 0x1907),
 regmap_reg_range(0x1914, 0x191b),
 regmap_reg_range(0x1920, 0x1920),
 regmap_reg_range(0x1923, 0x1927),
 regmap_reg_range(0x1a00, 0x1a03),
 regmap_reg_range(0x1a04, 0x1a07),
 regmap_reg_range(0x1b00, 0x1b01),
 regmap_reg_range(0x1b04, 0x1b04),
 regmap_reg_range(0x1c00, 0x1c05),
 regmap_reg_range(0x1c08, 0x1c1b),

 /* port 2 */
 regmap_reg_range(0x2000, 0x2001),
 regmap_reg_range(0x2013, 0x2013),
 regmap_reg_range(0x2017, 0x2017),
 regmap_reg_range(0x201b, 0x201b),
 regmap_reg_range(0x201f, 0x2020),
 regmap_reg_range(0x2030, 0x2030),
 regmap_reg_range(0x2100, 0x2115),
 regmap_reg_range(0x211a, 0x211f),
 regmap_reg_range(0x2120, 0x212b),
 regmap_reg_range(0x2134, 0x213b),
 regmap_reg_range(0x213c, 0x213f),
 regmap_reg_range(0x2400, 0x2401),
 regmap_reg_range(0x2403, 0x2403),
 regmap_reg_range(0x2410, 0x2417),
 regmap_reg_range(0x2420, 0x2423),
 regmap_reg_range(0x2500, 0x2507),
 regmap_reg_range(0x2600, 0x2613),
 regmap_reg_range(0x2800, 0x280f),
 regmap_reg_range(0x2820, 0x2827),
 regmap_reg_range(0x2830, 0x2837),
 regmap_reg_range(0x2840, 0x284b),
 regmap_reg_range(0x2900, 0x2907),
 regmap_reg_range(0x2914, 0x291b),
 regmap_reg_range(0x2920, 0x2920),
 regmap_reg_range(0x2923, 0x2927),
 regmap_reg_range(0x2a00, 0x2a03),
 regmap_reg_range(0x2a04, 0x2a07),
 regmap_reg_range(0x2b00, 0x2b01),
 regmap_reg_range(0x2b04, 0x2b04),
 regmap_reg_range(0x2c00, 0x2c05),
 regmap_reg_range(0x2c08, 0x2c1b),

 /* port 3 */
 regmap_reg_range(0x3000, 0x3001),
 regmap_reg_range(0x3013, 0x3013),
 regmap_reg_range(0x3017, 0x3017),
 regmap_reg_range(0x301b, 0x301b),
 regmap_reg_range(0x301f, 0x3020),
 regmap_reg_range(0x3030, 0x3030),
 regmap_reg_range(0x3100, 0x3115),
 regmap_reg_range(0x311a, 0x311f),
 regmap_reg_range(0x3120, 0x312b),
 regmap_reg_range(0x3134, 0x313b),
 regmap_reg_range(0x313c, 0x313f),
 regmap_reg_range(0x3400, 0x3401),
 regmap_reg_range(0x3403, 0x3403),
 regmap_reg_range(0x3410, 0x3417),
 regmap_reg_range(0x3420, 0x3423),
 regmap_reg_range(0x3500, 0x3507),
 regmap_reg_range(0x3600, 0x3613),
 regmap_reg_range(0x3800, 0x380f),
 regmap_reg_range(0x3820, 0x3827),
 regmap_reg_range(0x3830, 0x3837),
 regmap_reg_range(0x3840, 0x384b),
 regmap_reg_range(0x3900, 0x3907),
 regmap_reg_range(0x3914, 0x391b),
 regmap_reg_range(0x3920, 0x3920),
 regmap_reg_range(0x3923, 0x3927),
 regmap_reg_range(0x3a00, 0x3a03),
 regmap_reg_range(0x3a04, 0x3a07),
 regmap_reg_range(0x3b00, 0x3b01),
 regmap_reg_range(0x3b04, 0x3b04),
 regmap_reg_range(0x3c00, 0x3c05),
 regmap_reg_range(0x3c08, 0x3c1b),

 /* port 4 */
 regmap_reg_range(0x4000, 0x4001),
 regmap_reg_range(0x4013, 0x4013),
 regmap_reg_range(0x4017, 0x4017),
 regmap_reg_range(0x401b, 0x401b),
 regmap_reg_range(0x401f, 0x4020),
 regmap_reg_range(0x4030, 0x4030),
 regmap_reg_range(0x4100, 0x4115),
 regmap_reg_range(0x411a, 0x411f),
 regmap_reg_range(0x4120, 0x412b),
 regmap_reg_range(0x4134, 0x413b),
 regmap_reg_range(0x413c, 0x413f),
 regmap_reg_range(0x4400, 0x4401),
 regmap_reg_range(0x4403, 0x4403),
 regmap_reg_range(0x4410, 0x4417),
 regmap_reg_range(0x4420, 0x4423),
 regmap_reg_range(0x4500, 0x4507),
 regmap_reg_range(0x4600, 0x4613),
 regmap_reg_range(0x4800, 0x480f),
 regmap_reg_range(0x4820, 0x4827),
 regmap_reg_range(0x4830, 0x4837),
 regmap_reg_range(0x4840, 0x484b),
 regmap_reg_range(0x4900, 0x4907),
 regmap_reg_range(0x4914, 0x491b),
 regmap_reg_range(0x4920, 0x4920),
 regmap_reg_range(0x4923, 0x4927),
 regmap_reg_range(0x4a00, 0x4a03),
 regmap_reg_range(0x4a04, 0x4a07),
 regmap_reg_range(0x4b00, 0x4b01),
 regmap_reg_range(0x4b04, 0x4b04),
 regmap_reg_range(0x4c00, 0x4c05),
 regmap_reg_range(0x4c08, 0x4c1b),

 /* port 5 */
 regmap_reg_range(0x5000, 0x5001),
 regmap_reg_range(0x5013, 0x5013),
 regmap_reg_range(0x5017, 0x5017),
 regmap_reg_range(0x501b, 0x501b),
 regmap_reg_range(0x501f, 0x5020),
 regmap_reg_range(0x5030, 0x5030),
 regmap_reg_range(0x5100, 0x5115),
 regmap_reg_range(0x511a, 0x511f),
 regmap_reg_range(0x5120, 0x512b),
 regmap_reg_range(0x5134, 0x513b),
 regmap_reg_range(0x513c, 0x513f),
 regmap_reg_range(0x5400, 0x5401),
 regmap_reg_range(0x5403, 0x5403),
 regmap_reg_range(0x5410, 0x5417),
 regmap_reg_range(0x5420, 0x5423),
 regmap_reg_range(0x5500, 0x5507),
 regmap_reg_range(0x5600, 0x5613),
 regmap_reg_range(0x5800, 0x580f),
 regmap_reg_range(0x5820, 0x5827),
 regmap_reg_range(0x5830, 0x5837),
 regmap_reg_range(0x5840, 0x584b),
 regmap_reg_range(0x5900, 0x5907),
 regmap_reg_range(0x5914, 0x591b),
 regmap_reg_range(0x5920, 0x5920),
 regmap_reg_range(0x5923, 0x5927),
 regmap_reg_range(0x5a00, 0x5a03),
 regmap_reg_range(0x5a04, 0x5a07),
 regmap_reg_range(0x5b00, 0x5b01),
 regmap_reg_range(0x5b04, 0x5b04),
 regmap_reg_range(0x5c00, 0x5c05),
 regmap_reg_range(0x5c08, 0x5c1b),

 /* port 6 */
 regmap_reg_range(0x6000, 0x6001),
 regmap_reg_range(0x6013, 0x6013),
 regmap_reg_range(0x6017, 0x6017),
 regmap_reg_range(0x601b, 0x601b),
 regmap_reg_range(0x601f, 0x6020),
 regmap_reg_range(0x6030, 0x6030),
 regmap_reg_range(0x6300, 0x6301),
 regmap_reg_range(0x6400, 0x6401),
 regmap_reg_range(0x6403, 0x6403),
 regmap_reg_range(0x6410, 0x6417),
 regmap_reg_range(0x6420, 0x6423),
 regmap_reg_range(0x6500, 0x6507),
 regmap_reg_range(0x6600, 0x6613),
 regmap_reg_range(0x6800, 0x680f),
 regmap_reg_range(0x6820, 0x6827),
 regmap_reg_range(0x6830, 0x6837),
 regmap_reg_range(0x6840, 0x684b),
 regmap_reg_range(0x6900, 0x6907),
 regmap_reg_range(0x6914, 0x691b),
 regmap_reg_range(0x6920, 0x6920),
 regmap_reg_range(0x6923, 0x6927),
 regmap_reg_range(0x6a00, 0x6a03),
 regmap_reg_range(0x6a04, 0x6a07),
 regmap_reg_range(0x6b00, 0x6b01),
 regmap_reg_range(0x6b04, 0x6b04),
 regmap_reg_range(0x6c00, 0x6c05),
 regmap_reg_range(0x6c08, 0x6c1b),

 /* port 7 */
 regmap_reg_range(0x7000, 0x7001),
 regmap_reg_range(0x7013, 0x7013),
 regmap_reg_range(0x7017, 0x7017),
 regmap_reg_range(0x701b, 0x701b),
 regmap_reg_range(0x701f, 0x7020),
 regmap_reg_range(0x7030, 0x7030),
 regmap_reg_range(0x7200, 0x7207),
 regmap_reg_range(0x7300, 0x7301),
 regmap_reg_range(0x7400, 0x7401),
 regmap_reg_range(0x7403, 0x7403),
 regmap_reg_range(0x7410, 0x7417),
 regmap_reg_range(0x7420, 0x7423),
 regmap_reg_range(0x7500, 0x7507),
 regmap_reg_range(0x7600, 0x7613),
 regmap_reg_range(0x7800, 0x780f),
 regmap_reg_range(0x7820, 0x7827),
 regmap_reg_range(0x7830, 0x7837),
 regmap_reg_range(0x7840, 0x784b),
 regmap_reg_range(0x7900, 0x7907),
 regmap_reg_range(0x7914, 0x791b),
 regmap_reg_range(0x7920, 0x7920),
 regmap_reg_range(0x7923, 0x7927),
 regmap_reg_range(0x7a00, 0x7a03),
 regmap_reg_range(0x7a04, 0x7a07),
 regmap_reg_range(0x7b00, 0x7b01),
 regmap_reg_range(0x7b04, 0x7b04),
 regmap_reg_range(0x7c00, 0x7c05),
 regmap_reg_range(0x7c08, 0x7c1b),
};

static const struct regmap_access_table ksz9477_register_set = {
 .yes_ranges = ksz9477_valid_regs,
 .n_yes_ranges = ARRAY_SIZE(ksz9477_valid_regs),
};

static const struct regmap_range ksz9896_valid_regs[] = {
 regmap_reg_range(0x0000, 0x0003),
 regmap_reg_range(0x0006, 0x0006),
 regmap_reg_range(0x0010, 0x001f),
 regmap_reg_range(0x0100, 0x0100),
 regmap_reg_range(0x0103, 0x0107),
 regmap_reg_range(0x010d, 0x010d),
 regmap_reg_range(0x0110, 0x0113),
 regmap_reg_range(0x0120, 0x0127),
 regmap_reg_range(0x0201, 0x0201),
 regmap_reg_range(0x0210, 0x0213),
 regmap_reg_range(0x0300, 0x0300),
 regmap_reg_range(0x0302, 0x030b),
 regmap_reg_range(0x0310, 0x031b),
 regmap_reg_range(0x0320, 0x032b),
 regmap_reg_range(0x0330, 0x0336),
 regmap_reg_range(0x0338, 0x033b),
 regmap_reg_range(0x033e, 0x033e),
 regmap_reg_range(0x0340, 0x035f),
 regmap_reg_range(0x0370, 0x0370),
 regmap_reg_range(0x0378, 0x0378),
 regmap_reg_range(0x037c, 0x037d),
 regmap_reg_range(0x0390, 0x0393),
 regmap_reg_range(0x0400, 0x040e),
 regmap_reg_range(0x0410, 0x042f),

 /* port 1 */
 regmap_reg_range(0x1000, 0x1001),
 regmap_reg_range(0x1013, 0x1013),
 regmap_reg_range(0x1017, 0x1017),
 regmap_reg_range(0x101b, 0x101b),
 regmap_reg_range(0x101f, 0x1020),
 regmap_reg_range(0x1030, 0x1030),
 regmap_reg_range(0x1100, 0x1115),
 regmap_reg_range(0x111a, 0x111f),
 regmap_reg_range(0x1120, 0x112b),
 regmap_reg_range(0x1134, 0x113b),
 regmap_reg_range(0x113c, 0x113f),
 regmap_reg_range(0x1400, 0x1401),
 regmap_reg_range(0x1403, 0x1403),
 regmap_reg_range(0x1410, 0x1417),
 regmap_reg_range(0x1420, 0x1423),
 regmap_reg_range(0x1500, 0x1507),
 regmap_reg_range(0x1600, 0x1612),
 regmap_reg_range(0x1800, 0x180f),
 regmap_reg_range(0x1820, 0x1827),
 regmap_reg_range(0x1830, 0x1837),
 regmap_reg_range(0x1840, 0x184b),
 regmap_reg_range(0x1900, 0x1907),
 regmap_reg_range(0x1914, 0x1915),
 regmap_reg_range(0x1a00, 0x1a03),
 regmap_reg_range(0x1a04, 0x1a07),
 regmap_reg_range(0x1b00, 0x1b01),
 regmap_reg_range(0x1b04, 0x1b04),

 /* port 2 */
 regmap_reg_range(0x2000, 0x2001),
 regmap_reg_range(0x2013, 0x2013),
 regmap_reg_range(0x2017, 0x2017),
 regmap_reg_range(0x201b, 0x201b),
 regmap_reg_range(0x201f, 0x2020),
 regmap_reg_range(0x2030, 0x2030),
 regmap_reg_range(0x2100, 0x2115),
 regmap_reg_range(0x211a, 0x211f),
 regmap_reg_range(0x2120, 0x212b),
 regmap_reg_range(0x2134, 0x213b),
 regmap_reg_range(0x213c, 0x213f),
 regmap_reg_range(0x2400, 0x2401),
 regmap_reg_range(0x2403, 0x2403),
 regmap_reg_range(0x2410, 0x2417),
 regmap_reg_range(0x2420, 0x2423),
 regmap_reg_range(0x2500, 0x2507),
 regmap_reg_range(0x2600, 0x2612),
 regmap_reg_range(0x2800, 0x280f),
 regmap_reg_range(0x2820, 0x2827),
 regmap_reg_range(0x2830, 0x2837),
 regmap_reg_range(0x2840, 0x284b),
 regmap_reg_range(0x2900, 0x2907),
 regmap_reg_range(0x2914, 0x2915),
 regmap_reg_range(0x2a00, 0x2a03),
 regmap_reg_range(0x2a04, 0x2a07),
 regmap_reg_range(0x2b00, 0x2b01),
 regmap_reg_range(0x2b04, 0x2b04),

 /* port 3 */
 regmap_reg_range(0x3000, 0x3001),
 regmap_reg_range(0x3013, 0x3013),
 regmap_reg_range(0x3017, 0x3017),
 regmap_reg_range(0x301b, 0x301b),
 regmap_reg_range(0x301f, 0x3020),
 regmap_reg_range(0x3030, 0x3030),
 regmap_reg_range(0x3100, 0x3115),
 regmap_reg_range(0x311a, 0x311f),
 regmap_reg_range(0x3120, 0x312b),
 regmap_reg_range(0x3134, 0x313b),
 regmap_reg_range(0x313c, 0x313f),
 regmap_reg_range(0x3400, 0x3401),
 regmap_reg_range(0x3403, 0x3403),
 regmap_reg_range(0x3410, 0x3417),
 regmap_reg_range(0x3420, 0x3423),
 regmap_reg_range(0x3500, 0x3507),
 regmap_reg_range(0x3600, 0x3612),
 regmap_reg_range(0x3800, 0x380f),
 regmap_reg_range(0x3820, 0x3827),
 regmap_reg_range(0x3830, 0x3837),
 regmap_reg_range(0x3840, 0x384b),
 regmap_reg_range(0x3900, 0x3907),
 regmap_reg_range(0x3914, 0x3915),
 regmap_reg_range(0x3a00, 0x3a03),
 regmap_reg_range(0x3a04, 0x3a07),
 regmap_reg_range(0x3b00, 0x3b01),
 regmap_reg_range(0x3b04, 0x3b04),

 /* port 4 */
 regmap_reg_range(0x4000, 0x4001),
 regmap_reg_range(0x4013, 0x4013),
 regmap_reg_range(0x4017, 0x4017),
 regmap_reg_range(0x401b, 0x401b),
 regmap_reg_range(0x401f, 0x4020),
 regmap_reg_range(0x4030, 0x4030),
 regmap_reg_range(0x4100, 0x4115),
 regmap_reg_range(0x411a, 0x411f),
 regmap_reg_range(0x4120, 0x412b),
 regmap_reg_range(0x4134, 0x413b),
 regmap_reg_range(0x413c, 0x413f),
 regmap_reg_range(0x4400, 0x4401),
 regmap_reg_range(0x4403, 0x4403),
 regmap_reg_range(0x4410, 0x4417),
 regmap_reg_range(0x4420, 0x4423),
 regmap_reg_range(0x4500, 0x4507),
 regmap_reg_range(0x4600, 0x4612),
 regmap_reg_range(0x4800, 0x480f),
 regmap_reg_range(0x4820, 0x4827),
 regmap_reg_range(0x4830, 0x4837),
 regmap_reg_range(0x4840, 0x484b),
 regmap_reg_range(0x4900, 0x4907),
 regmap_reg_range(0x4914, 0x4915),
 regmap_reg_range(0x4a00, 0x4a03),
 regmap_reg_range(0x4a04, 0x4a07),
 regmap_reg_range(0x4b00, 0x4b01),
 regmap_reg_range(0x4b04, 0x4b04),

 /* port 5 */
 regmap_reg_range(0x5000, 0x5001),
 regmap_reg_range(0x5013, 0x5013),
 regmap_reg_range(0x5017, 0x5017),
 regmap_reg_range(0x501b, 0x501b),
 regmap_reg_range(0x501f, 0x5020),
 regmap_reg_range(0x5030, 0x5030),
 regmap_reg_range(0x5100, 0x5115),
 regmap_reg_range(0x511a, 0x511f),
 regmap_reg_range(0x5120, 0x512b),
 regmap_reg_range(0x5134, 0x513b),
 regmap_reg_range(0x513c, 0x513f),
 regmap_reg_range(0x5400, 0x5401),
 regmap_reg_range(0x5403, 0x5403),
 regmap_reg_range(0x5410, 0x5417),
 regmap_reg_range(0x5420, 0x5423),
 regmap_reg_range(0x5500, 0x5507),
 regmap_reg_range(0x5600, 0x5612),
 regmap_reg_range(0x5800, 0x580f),
 regmap_reg_range(0x5820, 0x5827),
 regmap_reg_range(0x5830, 0x5837),
 regmap_reg_range(0x5840, 0x584b),
 regmap_reg_range(0x5900, 0x5907),
 regmap_reg_range(0x5914, 0x5915),
 regmap_reg_range(0x5a00, 0x5a03),
 regmap_reg_range(0x5a04, 0x5a07),
 regmap_reg_range(0x5b00, 0x5b01),
 regmap_reg_range(0x5b04, 0x5b04),

 /* port 6 */
 regmap_reg_range(0x6000, 0x6001),
 regmap_reg_range(0x6013, 0x6013),
 regmap_reg_range(0x6017, 0x6017),
 regmap_reg_range(0x601b, 0x601b),
 regmap_reg_range(0x601f, 0x6020),
 regmap_reg_range(0x6030, 0x6030),
 regmap_reg_range(0x6100, 0x6115),
 regmap_reg_range(0x611a, 0x611f),
 regmap_reg_range(0x6120, 0x612b),
 regmap_reg_range(0x6134, 0x613b),
 regmap_reg_range(0x613c, 0x613f),
 regmap_reg_range(0x6300, 0x6301),
 regmap_reg_range(0x6400, 0x6401),
 regmap_reg_range(0x6403, 0x6403),
 regmap_reg_range(0x6410, 0x6417),
 regmap_reg_range(0x6420, 0x6423),
 regmap_reg_range(0x6500, 0x6507),
 regmap_reg_range(0x6600, 0x6612),
 regmap_reg_range(0x6800, 0x680f),
 regmap_reg_range(0x6820, 0x6827),
 regmap_reg_range(0x6830, 0x6837),
 regmap_reg_range(0x6840, 0x684b),
 regmap_reg_range(0x6900, 0x6907),
 regmap_reg_range(0x6914, 0x6915),
 regmap_reg_range(0x6a00, 0x6a03),
 regmap_reg_range(0x6a04, 0x6a07),
 regmap_reg_range(0x6b00, 0x6b01),
 regmap_reg_range(0x6b04, 0x6b04),
};

static const struct regmap_access_table ksz9896_register_set = {
 .yes_ranges = ksz9896_valid_regs,
 .n_yes_ranges = ARRAY_SIZE(ksz9896_valid_regs),
};

static const struct regmap_range ksz8873_valid_regs[] = {
 regmap_reg_range(0x00, 0x01),
 /* global control register */
 regmap_reg_range(0x02, 0x0f),

 /* port registers */
 regmap_reg_range(0x10, 0x1d),
 regmap_reg_range(0x1e, 0x1f),
 regmap_reg_range(0x20, 0x2d),
 regmap_reg_range(0x2e, 0x2f),
 regmap_reg_range(0x30, 0x39),
 regmap_reg_range(0x3f, 0x3f),

 /* advanced control registers */
 regmap_reg_range(0x43, 0x43),
 regmap_reg_range(0x60, 0x6f),
 regmap_reg_range(0x70, 0x75),
 regmap_reg_range(0x76, 0x78),
 regmap_reg_range(0x79, 0x7a),
 regmap_reg_range(0x7b, 0x83),
 regmap_reg_range(0x8e, 0x99),
 regmap_reg_range(0x9a, 0xa5),
 regmap_reg_range(0xa6, 0xa6),
 regmap_reg_range(0xa7, 0xaa),
 regmap_reg_range(0xab, 0xae),
 regmap_reg_range(0xaf, 0xba),
 regmap_reg_range(0xbb, 0xbc),
 regmap_reg_range(0xbd, 0xbd),
 regmap_reg_range(0xc0, 0xc0),
 regmap_reg_range(0xc2, 0xc2),
 regmap_reg_range(0xc3, 0xc3),
 regmap_reg_range(0xc4, 0xc4),
 regmap_reg_range(0xc6, 0xc6),
};

static const struct regmap_access_table ksz8873_register_set = {
 .yes_ranges = ksz8873_valid_regs,
 .n_yes_ranges = ARRAY_SIZE(ksz8873_valid_regs),
};

const struct ksz_chip_data ksz_switch_chips[] = {
 [KSZ8463] = {
  .chip_id = KSZ8463_CHIP_ID,
  .dev_name = "KSZ8463",
  .num_vlans = 16,
  .num_alus = 0,
  .num_statics = 8,
  .cpu_ports = 0x4, /* can be configured as cpu port */
  .port_cnt = 3,
  .num_tx_queues = 4,
  .num_ipms = 4,
  .ops = &ksz8463_dev_ops,
  .phylink_mac_ops = &ksz88x3_phylink_mac_ops,
  .mib_names = ksz88xx_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz88xx_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz8463_regs,
  .masks = ksz8463_masks,
  .shifts = ksz8463_shifts,
  .supports_mii = {falsefalsetrue},
  .supports_rmii = {falsefalsetrue},
  .internal_phy = {truetruefalse},
 },

 [KSZ8563] = {
  .chip_id = KSZ8563_CHIP_ID,
  .dev_name = "KSZ8563",
  .num_vlans = 4096,
  .num_alus = 4096,
  .num_statics = 16,
  .cpu_ports = 0x07, /* can be configured as cpu port */
  .port_cnt = 3,  /* total port count */
  .port_nirqs = 3,
  .num_tx_queues = 4,
  .num_ipms = 8,
  .tc_cbs_supported = true,
  .ops = &ksz9477_dev_ops,
  .phylink_mac_ops = &ksz9477_phylink_mac_ops,
  .mib_names = ksz9477_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz9477_regs,
  .masks = ksz9477_masks,
  .shifts = ksz9477_shifts,
  .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  .xmii_ctrl1 = ksz8795_xmii_ctrl1, /* Same as ksz8795 */
  .supports_mii = {falsefalsetrue},
  .supports_rmii = {falsefalsetrue},
  .supports_rgmii = {falsefalsetrue},
  .internal_phy = {truetruefalse},
  .gbit_capable = {falsefalsetrue},
  .ptp_capable = true,
  .wr_table = &ksz8563_register_set,
  .rd_table = &ksz8563_register_set,
 },

 [KSZ8795] = {
  .chip_id = KSZ8795_CHIP_ID,
  .dev_name = "KSZ8795",
  .num_vlans = 4096,
  .num_alus = 0,
  .num_statics = 32,
  .cpu_ports = 0x10, /* can be configured as cpu port */
  .port_cnt = 5,  /* total cpu and user ports */
  .num_tx_queues = 4,
  .num_ipms = 4,
  .ops = &ksz87xx_dev_ops,
  .phylink_mac_ops = &ksz8_phylink_mac_ops,
  .ksz87xx_eee_link_erratum = true,
  .mib_names = ksz9477_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz8795_regs,
  .masks = ksz8795_masks,
  .shifts = ksz8795_shifts,
  .xmii_ctrl0 = ksz8795_xmii_ctrl0,
  .xmii_ctrl1 = ksz8795_xmii_ctrl1,
  .supports_mii = {falsefalsefalsefalsetrue},
  .supports_rmii = {falsefalsefalsefalsetrue},
  .supports_rgmii = {falsefalsefalsefalsetrue},
  .internal_phy = {truetruetruetruefalse},
 },

 [KSZ8794] = {
  /* WARNING
 * =======
 * KSZ8794 is similar to KSZ8795, except the port map
 * contains a gap between external and CPU ports, the
 * port map is NOT continuous. The per-port register
 * map is shifted accordingly too, i.e. registers at
 * offset 0x40 are NOT used on KSZ8794 and they ARE
 * used on KSZ8795 for external port 3.
 *           external  cpu
 * KSZ8794   0,1,2      4
 * KSZ8795   0,1,2,3    4
 * KSZ8765   0,1,2,3    4
 * port_cnt is configured as 5, even though it is 4
 */

  .chip_id = KSZ8794_CHIP_ID,
  .dev_name = "KSZ8794",
  .num_vlans = 4096,
  .num_alus = 0,
  .num_statics = 32,
  .cpu_ports = 0x10, /* can be configured as cpu port */
  .port_cnt = 5,  /* total cpu and user ports */
  .num_tx_queues = 4,
  .num_ipms = 4,
  .ops = &ksz87xx_dev_ops,
  .phylink_mac_ops = &ksz8_phylink_mac_ops,
  .ksz87xx_eee_link_erratum = true,
  .mib_names = ksz9477_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz8795_regs,
  .masks = ksz8795_masks,
  .shifts = ksz8795_shifts,
  .xmii_ctrl0 = ksz8795_xmii_ctrl0,
  .xmii_ctrl1 = ksz8795_xmii_ctrl1,
  .supports_mii = {falsefalsefalsefalsetrue},
  .supports_rmii = {falsefalsefalsefalsetrue},
  .supports_rgmii = {falsefalsefalsefalsetrue},
  .internal_phy = {truetruetruefalsefalse},
 },

 [KSZ8765] = {
  .chip_id = KSZ8765_CHIP_ID,
  .dev_name = "KSZ8765",
  .num_vlans = 4096,
  .num_alus = 0,
  .num_statics = 32,
  .cpu_ports = 0x10, /* can be configured as cpu port */
  .port_cnt = 5,  /* total cpu and user ports */
  .num_tx_queues = 4,
  .num_ipms = 4,
  .ops = &ksz87xx_dev_ops,
  .phylink_mac_ops = &ksz8_phylink_mac_ops,
  .ksz87xx_eee_link_erratum = true,
  .mib_names = ksz9477_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz8795_regs,
  .masks = ksz8795_masks,
  .shifts = ksz8795_shifts,
  .xmii_ctrl0 = ksz8795_xmii_ctrl0,
  .xmii_ctrl1 = ksz8795_xmii_ctrl1,
  .supports_mii = {falsefalsefalsefalsetrue},
  .supports_rmii = {falsefalsefalsefalsetrue},
  .supports_rgmii = {falsefalsefalsefalsetrue},
  .internal_phy = {truetruetruetruefalse},
 },

 [KSZ88X3] = {
  .chip_id = KSZ88X3_CHIP_ID,
  .dev_name = "KSZ8863/KSZ8873",
  .num_vlans = 16,
  .num_alus = 0,
  .num_statics = 8,
  .cpu_ports = 0x4, /* can be configured as cpu port */
  .port_cnt = 3,
  .num_tx_queues = 4,
  .num_ipms = 4,
  .ops = &ksz88xx_dev_ops,
  .phylink_mac_ops = &ksz88x3_phylink_mac_ops,
  .mib_names = ksz88xx_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz88xx_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz8863_regs,
  .masks = ksz8863_masks,
  .shifts = ksz8863_shifts,
  .supports_mii = {falsefalsetrue},
  .supports_rmii = {falsefalsetrue},
  .internal_phy = {truetruefalse},
  .wr_table = &ksz8873_register_set,
  .rd_table = &ksz8873_register_set,
 },

 [KSZ8864] = {
  /* WARNING
 * =======
 * KSZ8864 is similar to KSZ8895, except the first port
 * does not exist.
 *           external  cpu
 * KSZ8864   1,2,3      4
 * KSZ8895   0,1,2,3    4
 * port_cnt is configured as 5, even though it is 4
 */

  .chip_id = KSZ8864_CHIP_ID,
  .dev_name = "KSZ8864",
  .num_vlans = 4096,
  .num_alus = 0,
  .num_statics = 32,
  .cpu_ports = 0x10, /* can be configured as cpu port */
  .port_cnt = 5,  /* total cpu and user ports */
  .num_tx_queues = 4,
  .num_ipms = 4,
  .ops = &ksz88xx_dev_ops,
  .phylink_mac_ops = &ksz88x3_phylink_mac_ops,
  .mib_names = ksz88xx_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz88xx_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz8895_regs,
  .masks = ksz8895_masks,
  .shifts = ksz8895_shifts,
  .supports_mii = {falsefalsefalsefalsetrue},
  .supports_rmii = {falsefalsefalsefalsetrue},
  .internal_phy = {falsetruetruetruefalse},
 },

 [KSZ8895] = {
  .chip_id = KSZ8895_CHIP_ID,
  .dev_name = "KSZ8895",
  .num_vlans = 4096,
  .num_alus = 0,
  .num_statics = 32,
  .cpu_ports = 0x10, /* can be configured as cpu port */
  .port_cnt = 5,  /* total cpu and user ports */
  .num_tx_queues = 4,
  .num_ipms = 4,
  .ops = &ksz88xx_dev_ops,
  .phylink_mac_ops = &ksz88x3_phylink_mac_ops,
  .mib_names = ksz88xx_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz88xx_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz8895_regs,
  .masks = ksz8895_masks,
  .shifts = ksz8895_shifts,
  .supports_mii = {falsefalsefalsefalsetrue},
  .supports_rmii = {falsefalsefalsefalsetrue},
  .internal_phy = {truetruetruetruefalse},
 },

 [KSZ9477] = {
  .chip_id = KSZ9477_CHIP_ID,
  .dev_name = "KSZ9477",
  .num_vlans = 4096,
  .num_alus = 4096,
  .num_statics = 16,
  .cpu_ports = 0x7F, /* can be configured as cpu port */
  .port_cnt = 7,  /* total physical port count */
  .port_nirqs = 4,
  .num_tx_queues = 4,
  .num_ipms = 8,
  .tc_cbs_supported = true,
  .ops = &ksz9477_dev_ops,
  .phylink_mac_ops = &ksz9477_phylink_mac_ops,
  .phy_errata_9477 = true,
  .mib_names = ksz9477_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz9477_regs,
  .masks = ksz9477_masks,
  .shifts = ksz9477_shifts,
  .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  .xmii_ctrl1 = ksz9477_xmii_ctrl1,
  .supports_mii = {falsefalsefalsefalse,
       falsetruefalse},
  .supports_rmii = {falsefalsefalsefalse,
       falsetruefalse},
  .supports_rgmii = {falsefalsefalsefalse,
       falsetruefalse},
  .internal_phy = {truetruetruetrue,
       truefalsefalse},
  .gbit_capable = {truetruetruetruetruetruetrue},
  .ptp_capable = true,
  .sgmii_port = 7,
  .wr_table = &ksz9477_register_set,
  .rd_table = &ksz9477_register_set,
 },

 [KSZ9896] = {
  .chip_id = KSZ9896_CHIP_ID,
  .dev_name = "KSZ9896",
  .num_vlans = 4096,
  .num_alus = 4096,
  .num_statics = 16,
  .cpu_ports = 0x3F, /* can be configured as cpu port */
  .port_cnt = 6,  /* total physical port count */
  .port_nirqs = 2,
  .num_tx_queues = 4,
  .num_ipms = 8,
  .ops = &ksz9477_dev_ops,
  .phylink_mac_ops = &ksz9477_phylink_mac_ops,
  .phy_errata_9477 = true,
  .mib_names = ksz9477_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz9477_regs,
  .masks = ksz9477_masks,
  .shifts = ksz9477_shifts,
  .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  .xmii_ctrl1 = ksz9477_xmii_ctrl1,
  .supports_mii = {falsefalsefalsefalse,
       falsetrue},
  .supports_rmii = {falsefalsefalsefalse,
       falsetrue},
  .supports_rgmii = {falsefalsefalsefalse,
       falsetrue},
  .internal_phy = {truetruetruetrue,
       truefalse},
  .gbit_capable = {truetruetruetruetruetrue},
  .wr_table = &ksz9896_register_set,
  .rd_table = &ksz9896_register_set,
 },

 [KSZ9897] = {
  .chip_id = KSZ9897_CHIP_ID,
  .dev_name = "KSZ9897",
  .num_vlans = 4096,
  .num_alus = 4096,
  .num_statics = 16,
  .cpu_ports = 0x7F, /* can be configured as cpu port */
  .port_cnt = 7,  /* total physical port count */
  .port_nirqs = 2,
  .num_tx_queues = 4,
  .num_ipms = 8,
  .ops = &ksz9477_dev_ops,
  .phylink_mac_ops = &ksz9477_phylink_mac_ops,
  .phy_errata_9477 = true,
  .mib_names = ksz9477_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz9477_regs,
  .masks = ksz9477_masks,
  .shifts = ksz9477_shifts,
  .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  .xmii_ctrl1 = ksz9477_xmii_ctrl1,
  .supports_mii = {falsefalsefalsefalse,
       falsetruetrue},
  .supports_rmii = {falsefalsefalsefalse,
       falsetruetrue},
  .supports_rgmii = {falsefalsefalsefalse,
       falsetruetrue},
  .internal_phy = {truetruetruetrue,
       truefalsefalse},
  .gbit_capable = {truetruetruetruetruetruetrue},
 },

 [KSZ9893] = {
  .chip_id = KSZ9893_CHIP_ID,
  .dev_name = "KSZ9893",
  .num_vlans = 4096,
  .num_alus = 4096,
  .num_statics = 16,
  .cpu_ports = 0x07, /* can be configured as cpu port */
  .port_cnt = 3,  /* total port count */
  .port_nirqs = 2,
  .num_tx_queues = 4,
  .num_ipms = 8,
  .ops = &ksz9477_dev_ops,
  .phylink_mac_ops = &ksz9477_phylink_mac_ops,
  .mib_names = ksz9477_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz9477_regs,
  .masks = ksz9477_masks,
  .shifts = ksz9477_shifts,
  .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  .xmii_ctrl1 = ksz8795_xmii_ctrl1, /* Same as ksz8795 */
  .supports_mii = {falsefalsetrue},
  .supports_rmii = {falsefalsetrue},
  .supports_rgmii = {falsefalsetrue},
  .internal_phy = {truetruefalse},
  .gbit_capable = {truetruetrue},
 },

 [KSZ9563] = {
  .chip_id = KSZ9563_CHIP_ID,
  .dev_name = "KSZ9563",
  .num_vlans = 4096,
  .num_alus = 4096,
  .num_statics = 16,
  .cpu_ports = 0x07, /* can be configured as cpu port */
  .port_cnt = 3,  /* total port count */
  .port_nirqs = 3,
  .num_tx_queues = 4,
  .num_ipms = 8,
  .tc_cbs_supported = true,
  .ops = &ksz9477_dev_ops,
  .phylink_mac_ops = &ksz9477_phylink_mac_ops,
  .mib_names = ksz9477_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz9477_regs,
  .masks = ksz9477_masks,
  .shifts = ksz9477_shifts,
  .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  .xmii_ctrl1 = ksz8795_xmii_ctrl1, /* Same as ksz8795 */
  .supports_mii = {falsefalsetrue},
  .supports_rmii = {falsefalsetrue},
  .supports_rgmii = {falsefalsetrue},
  .internal_phy = {truetruefalse},
  .gbit_capable = {truetruetrue},
  .ptp_capable = true,
 },

 [KSZ8567] = {
  .chip_id = KSZ8567_CHIP_ID,
  .dev_name = "KSZ8567",
  .num_vlans = 4096,
  .num_alus = 4096,
  .num_statics = 16,
  .cpu_ports = 0x7F, /* can be configured as cpu port */
  .port_cnt = 7,  /* total port count */
  .port_nirqs = 3,
  .num_tx_queues = 4,
  .num_ipms = 8,
  .tc_cbs_supported = true,
  .ops = &ksz9477_dev_ops,
  .phylink_mac_ops = &ksz9477_phylink_mac_ops,
  .phy_errata_9477 = true,
  .mib_names = ksz9477_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz9477_regs,
  .masks = ksz9477_masks,
  .shifts = ksz9477_shifts,
  .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  .xmii_ctrl1 = ksz9477_xmii_ctrl1,
  .supports_mii = {falsefalsefalsefalse,
       falsetruetrue},
  .supports_rmii = {falsefalsefalsefalse,
       falsetruetrue},
  .supports_rgmii = {falsefalsefalsefalse,
       falsetruetrue},
  .internal_phy = {truetruetruetrue,
       truefalsefalse},
  .gbit_capable = {falsefalsefalsefalsefalse,
       truetrue},
  .ptp_capable = true,
 },

 [KSZ9567] = {
  .chip_id = KSZ9567_CHIP_ID,
  .dev_name = "KSZ9567",
  .num_vlans = 4096,
  .num_alus = 4096,
  .num_statics = 16,
  .cpu_ports = 0x7F, /* can be configured as cpu port */
  .port_cnt = 7,  /* total physical port count */
  .port_nirqs = 3,
  .num_tx_queues = 4,
  .num_ipms = 8,
  .tc_cbs_supported = true,
  .ops = &ksz9477_dev_ops,
  .mib_names = ksz9477_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz9477_regs,
  .masks = ksz9477_masks,
  .shifts = ksz9477_shifts,
  .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  .xmii_ctrl1 = ksz9477_xmii_ctrl1,
  .supports_mii = {falsefalsefalsefalse,
       falsetruetrue},
  .supports_rmii = {falsefalsefalsefalse,
       falsetruetrue},
  .supports_rgmii = {falsefalsefalsefalse,
       falsetruetrue},
  .internal_phy = {truetruetruetrue,
       truefalsefalse},
  .gbit_capable = {truetruetruetruetruetruetrue},
  .ptp_capable = true,
 },

 [LAN9370] = {
  .chip_id = LAN9370_CHIP_ID,
  .dev_name = "LAN9370",
  .num_vlans = 4096,
  .num_alus = 1024,
  .num_statics = 256,
  .cpu_ports = 0x10, /* can be configured as cpu port */
  .port_cnt = 5,  /* total physical port count */
  .port_nirqs = 6,
  .num_tx_queues = 8,
  .num_ipms = 8,
  .tc_cbs_supported = true,
  .phy_side_mdio_supported = true,
  .ops = &lan937x_dev_ops,
  .phylink_mac_ops = &lan937x_phylink_mac_ops,
  .mib_names = ksz9477_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz9477_regs,
  .masks = lan937x_masks,
  .shifts = lan937x_shifts,
  .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  .xmii_ctrl1 = ksz9477_xmii_ctrl1,
  .supports_mii = {falsefalsefalsefalsetrue},
  .supports_rmii = {falsefalsefalsefalsetrue},
  .supports_rgmii = {falsefalsefalsefalsetrue},
  .internal_phy = {truetruetruetruefalse},
  .ptp_capable = true,
 },

 [LAN9371] = {
  .chip_id = LAN9371_CHIP_ID,
  .dev_name = "LAN9371",
  .num_vlans = 4096,
  .num_alus = 1024,
  .num_statics = 256,
  .cpu_ports = 0x30, /* can be configured as cpu port */
  .port_cnt = 6,  /* total physical port count */
  .port_nirqs = 6,
  .num_tx_queues = 8,
  .num_ipms = 8,
  .tc_cbs_supported = true,
  .phy_side_mdio_supported = true,
  .ops = &lan937x_dev_ops,
  .phylink_mac_ops = &lan937x_phylink_mac_ops,
  .mib_names = ksz9477_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz9477_regs,
  .masks = lan937x_masks,
  .shifts = lan937x_shifts,
  .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  .xmii_ctrl1 = ksz9477_xmii_ctrl1,
  .supports_mii = {falsefalsefalsefalsetruetrue},
  .supports_rmii = {falsefalsefalsefalsetruetrue},
  .supports_rgmii = {falsefalsefalsefalsetruetrue},
  .internal_phy = {truetruetruetruefalsefalse},
  .ptp_capable = true,
 },

 [LAN9372] = {
  .chip_id = LAN9372_CHIP_ID,
  .dev_name = "LAN9372",
  .num_vlans = 4096,
  .num_alus = 1024,
  .num_statics = 256,
  .cpu_ports = 0x30, /* can be configured as cpu port */
  .port_cnt = 8,  /* total physical port count */
  .port_nirqs = 6,
  .num_tx_queues = 8,
  .num_ipms = 8,
  .tc_cbs_supported = true,
  .phy_side_mdio_supported = true,
  .ops = &lan937x_dev_ops,
  .phylink_mac_ops = &lan937x_phylink_mac_ops,
  .mib_names = ksz9477_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz9477_regs,
  .masks = lan937x_masks,
  .shifts = lan937x_shifts,
  .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  .xmii_ctrl1 = ksz9477_xmii_ctrl1,
  .supports_mii = {falsefalsefalsefalse,
       truetruefalsefalse},
  .supports_rmii = {falsefalsefalsefalse,
       truetruefalsefalse},
  .supports_rgmii = {falsefalsefalsefalse,
       truetruefalsefalse},
  .internal_phy = {truetruetruetrue,
       falsefalsetruetrue},
  .ptp_capable = true,
 },

 [LAN9373] = {
  .chip_id = LAN9373_CHIP_ID,
  .dev_name = "LAN9373",
  .num_vlans = 4096,
  .num_alus = 1024,
  .num_statics = 256,
  .cpu_ports = 0x38, /* can be configured as cpu port */
  .port_cnt = 5,  /* total physical port count */
  .port_nirqs = 6,
  .num_tx_queues = 8,
  .num_ipms = 8,
  .tc_cbs_supported = true,
  .phy_side_mdio_supported = true,
  .ops = &lan937x_dev_ops,
  .phylink_mac_ops = &lan937x_phylink_mac_ops,
  .mib_names = ksz9477_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz9477_regs,
  .masks = lan937x_masks,
  .shifts = lan937x_shifts,
  .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  .xmii_ctrl1 = ksz9477_xmii_ctrl1,
  .supports_mii = {falsefalsefalsefalse,
       truetruefalsefalse},
  .supports_rmii = {falsefalsefalsefalse,
       truetruefalsefalse},
  .supports_rgmii = {falsefalsefalsefalse,
       truetruefalsefalse},
  .internal_phy = {truetruetruefalse,
       falsefalsetruetrue},
  .ptp_capable = true,
 },

 [LAN9374] = {
  .chip_id = LAN9374_CHIP_ID,
  .dev_name = "LAN9374",
  .num_vlans = 4096,
  .num_alus = 1024,
  .num_statics = 256,
  .cpu_ports = 0x30, /* can be configured as cpu port */
  .port_cnt = 8,  /* total physical port count */
  .port_nirqs = 6,
  .num_tx_queues = 8,
  .num_ipms = 8,
  .tc_cbs_supported = true,
  .phy_side_mdio_supported = true,
  .ops = &lan937x_dev_ops,
  .phylink_mac_ops = &lan937x_phylink_mac_ops,
  .mib_names = ksz9477_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz9477_regs,
  .masks = lan937x_masks,
  .shifts = lan937x_shifts,
  .xmii_ctrl0 = ksz9477_xmii_ctrl0,
  .xmii_ctrl1 = ksz9477_xmii_ctrl1,
  .supports_mii = {falsefalsefalsefalse,
       truetruefalsefalse},
  .supports_rmii = {falsefalsefalsefalse,
       truetruefalsefalse},
  .supports_rgmii = {falsefalsefalsefalse,
       truetruefalsefalse},
  .internal_phy = {truetruetruetrue,
       falsefalsetruetrue},
  .ptp_capable = true,
 },

 [LAN9646] = {
  .chip_id = LAN9646_CHIP_ID,
  .dev_name = "LAN9646",
  .num_vlans = 4096,
  .num_alus = 4096,
  .num_statics = 16,
  .cpu_ports = 0x7F, /* can be configured as cpu port */
  .port_cnt = 7,  /* total physical port count */
  .port_nirqs = 4,
  .num_tx_queues = 4,
  .num_ipms = 8,
  .ops = &ksz9477_dev_ops,
  .phylink_mac_ops = &ksz9477_phylink_mac_ops,
  .phy_errata_9477 = true,
  .mib_names = ksz9477_mib_names,
  .mib_cnt = ARRAY_SIZE(ksz9477_mib_names),
  .reg_mib_cnt = MIB_COUNTER_NUM,
  .regs = ksz9477_regs,
  .masks = ksz9477_masks,
--> --------------------

--> maximum size reached

--> --------------------

Messung V0.5
C=95 H=94 G=94

¤ Dauer der Verarbeitung: 0.18 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.