net: dsa: Add KSZ8567 switch support
authorPhilippe Schenker <philippe.schenker@impulsing.ch>
Tue, 30 Jan 2024 08:34:19 +0000 (09:34 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 1 Feb 2024 10:17:24 +0000 (11:17 +0100)
This commit introduces support for the KSZ8567, a robust 7-port
Ethernet switch. The KSZ8567 features two RGMII/MII/RMII interfaces,
each capable of gigabit speeds, complemented by five 10/100 Mbps
MAC/PHYs.

Signed-off-by: Philippe Schenker <philippe.schenker@impulsing.ch>
Acked-by: Arun Ramadoss <arun.ramadoss@microchip.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Link: https://lore.kernel.org/r/20240130083419.135763-2-dev@pschenker.ch
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/dsa/microchip/ksz9477_i2c.c
drivers/net/dsa/microchip/ksz_common.c
drivers/net/dsa/microchip/ksz_common.h
drivers/net/dsa/microchip/ksz_spi.c
include/linux/platform_data/microchip-ksz.h

index cac4a607e54a5759f1cc7b0cf08afd64a986c2ba..82bebee4615c1e6a1b57a27222868f8b769df25d 100644 (file)
@@ -103,6 +103,10 @@ static const struct of_device_id ksz9477_dt_ids[] = {
                .compatible = "microchip,ksz8563",
                .data = &ksz_switch_chips[KSZ8563]
        },
+       {
+               .compatible = "microchip,ksz8567",
+               .data = &ksz_switch_chips[KSZ8567]
+       },
        {
                .compatible = "microchip,ksz9567",
                .data = &ksz_switch_chips[KSZ9567]
index a7b5ddb8656edb5348344353b1c47c0e89af0808..9ff5132f3ac6679fc8db861008b1e2e2ae25dc73 100644 (file)
@@ -1476,6 +1476,39 @@ const struct ksz_chip_data ksz_switch_chips[] = {
                .gbit_capable = {true, true, 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,
+               .tc_cbs_supported = true,
+               .tc_ets_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   = {false, false, false, false,
+                                  false, true, true},
+               .supports_rmii  = {false, false, false, false,
+                                  false, true, true},
+               .supports_rgmii = {false, false, false, false,
+                                  false, true, true},
+               .internal_phy   = {true, true, true, true,
+                                  true, false, false},
+               .gbit_capable   = {false, false, false, false, false,
+                                  true, true},
+       },
+
        [KSZ9567] = {
                .chip_id = KSZ9567_CHIP_ID,
                .dev_name = "KSZ9567",
@@ -2649,6 +2682,7 @@ static void ksz_port_teardown(struct dsa_switch *ds, int port)
 
        switch (dev->chip_id) {
        case KSZ8563_CHIP_ID:
+       case KSZ8567_CHIP_ID:
        case KSZ9477_CHIP_ID:
        case KSZ9563_CHIP_ID:
        case KSZ9567_CHIP_ID:
@@ -2705,7 +2739,8 @@ static enum dsa_tag_protocol ksz_get_tag_protocol(struct dsa_switch *ds,
            dev->chip_id == KSZ9563_CHIP_ID)
                proto = DSA_TAG_PROTO_KSZ9893;
 
-       if (dev->chip_id == KSZ9477_CHIP_ID ||
+       if (dev->chip_id == KSZ8567_CHIP_ID ||
+           dev->chip_id == KSZ9477_CHIP_ID ||
            dev->chip_id == KSZ9896_CHIP_ID ||
            dev->chip_id == KSZ9897_CHIP_ID ||
            dev->chip_id == KSZ9567_CHIP_ID)
@@ -2813,6 +2848,7 @@ static int ksz_max_mtu(struct dsa_switch *ds, int port)
        case KSZ8830_CHIP_ID:
                return KSZ8863_HUGE_PACKET_SIZE - VLAN_ETH_HLEN - ETH_FCS_LEN;
        case KSZ8563_CHIP_ID:
+       case KSZ8567_CHIP_ID:
        case KSZ9477_CHIP_ID:
        case KSZ9563_CHIP_ID:
        case KSZ9567_CHIP_ID:
@@ -2839,6 +2875,7 @@ static int ksz_validate_eee(struct dsa_switch *ds, int port)
 
        switch (dev->chip_id) {
        case KSZ8563_CHIP_ID:
+       case KSZ8567_CHIP_ID:
        case KSZ9477_CHIP_ID:
        case KSZ9563_CHIP_ID:
        case KSZ9567_CHIP_ID:
@@ -3183,6 +3220,7 @@ static int ksz_switch_detect(struct ksz_device *dev)
                case KSZ9896_CHIP_ID:
                case KSZ9897_CHIP_ID:
                case KSZ9567_CHIP_ID:
+               case KSZ8567_CHIP_ID:
                case LAN9370_CHIP_ID:
                case LAN9371_CHIP_ID:
                case LAN9372_CHIP_ID:
@@ -3220,6 +3258,7 @@ static int ksz_cls_flower_add(struct dsa_switch *ds, int port,
 
        switch (dev->chip_id) {
        case KSZ8563_CHIP_ID:
+       case KSZ8567_CHIP_ID:
        case KSZ9477_CHIP_ID:
        case KSZ9563_CHIP_ID:
        case KSZ9567_CHIP_ID:
@@ -3239,6 +3278,7 @@ static int ksz_cls_flower_del(struct dsa_switch *ds, int port,
 
        switch (dev->chip_id) {
        case KSZ8563_CHIP_ID:
+       case KSZ8567_CHIP_ID:
        case KSZ9477_CHIP_ID:
        case KSZ9563_CHIP_ID:
        case KSZ9567_CHIP_ID:
@@ -4142,6 +4182,7 @@ static int ksz_parse_drive_strength(struct ksz_device *dev)
        case KSZ8794_CHIP_ID:
        case KSZ8765_CHIP_ID:
        case KSZ8563_CHIP_ID:
+       case KSZ8567_CHIP_ID:
        case KSZ9477_CHIP_ID:
        case KSZ9563_CHIP_ID:
        case KSZ9567_CHIP_ID:
index 15612101a155b0f7fe753f3a3fbbe06fdc221ccf..060c5de9aa054fed90cb2973bf38f07c9b087799 100644 (file)
@@ -187,6 +187,7 @@ struct ksz_device {
 /* List of supported models */
 enum ksz_model {
        KSZ8563,
+       KSZ8567,
        KSZ8795,
        KSZ8794,
        KSZ8765,
index 6f6d878e742ca0288048643d9a6da3935ea6441d..c8166fb440abca1746abf317cd6b2b08351f81d2 100644 (file)
@@ -164,6 +164,10 @@ static const struct of_device_id ksz_dt_ids[] = {
                .compatible = "microchip,ksz8563",
                .data = &ksz_switch_chips[KSZ8563]
        },
+       {
+               .compatible = "microchip,ksz8567",
+               .data = &ksz_switch_chips[KSZ8567]
+       },
        {
                .compatible = "microchip,ksz9567",
                .data = &ksz_switch_chips[KSZ9567]
@@ -204,6 +208,7 @@ static const struct spi_device_id ksz_spi_ids[] = {
        { "ksz9893" },
        { "ksz9563" },
        { "ksz8563" },
+       { "ksz8567" },
        { "ksz9567" },
        { "lan9370" },
        { "lan9371" },
index f177416635a222a2982fbdd944e8a95e6cd48278..8c659db4da6b337e99e6388f38209c9d23f7a2c6 100644 (file)
@@ -33,6 +33,7 @@ enum ksz_chip_id {
        KSZ9897_CHIP_ID = 0x00989700,
        KSZ9893_CHIP_ID = 0x00989300,
        KSZ9563_CHIP_ID = 0x00956300,
+       KSZ8567_CHIP_ID = 0x00856700,
        KSZ9567_CHIP_ID = 0x00956700,
        LAN9370_CHIP_ID = 0x00937000,
        LAN9371_CHIP_ID = 0x00937100,