OSDN Git Service

net: dsa: microchip: add KSZ9896 switch support
authorRomain Naour <romain.naour@skf.com>
Fri, 2 Sep 2022 10:16:07 +0000 (12:16 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 7 Sep 2022 09:39:06 +0000 (10:39 +0100)
Add support for the KSZ9896 6-port Gigabit Ethernet Switch to the
ksz9477 driver.

Although the KSZ9896 is already listed in the device tree binding
documentation since a1c0ed24fe9b (dt-bindings: net: dsa: document
additional Microchip KSZ9477 family switches) the chip id
(0x00989600) is not recognized by ksz_switch_detect() and rejected
by the driver.

The KSZ9896 is similar to KSZ9897 but has only one configurable
MII/RMII/RGMII/GMII cpu port.

Signed-off-by: Romain Naour <romain.naour@skf.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/microchip/ksz_common.c
drivers/net/dsa/microchip/ksz_common.h
drivers/net/dsa/microchip/ksz_spi.c

index ec2896a..b19631d 100644 (file)
@@ -966,6 +966,35 @@ const struct ksz_chip_data ksz_switch_chips[] = {
                .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 */
+               .ops = &ksz9477_dev_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   = {false, false, false, false,
+                                  false, true},
+               .supports_rmii  = {false, false, false, false,
+                                  false, true},
+               .supports_rgmii = {false, false, false, false,
+                                  false, true},
+               .internal_phy   = {true, true, true, true,
+                                  true, false},
+               .gbit_capable   = {true, true, true, true, true, true},
+       },
+
        [KSZ9897] = {
                .chip_id = KSZ9897_CHIP_ID,
                .dev_name = "KSZ9897",
@@ -1807,6 +1836,7 @@ static enum dsa_tag_protocol ksz_get_tag_protocol(struct dsa_switch *ds,
                proto = DSA_TAG_PROTO_KSZ9893;
 
        if (dev->chip_id == KSZ9477_CHIP_ID ||
+           dev->chip_id == KSZ9896_CHIP_ID ||
            dev->chip_id == KSZ9897_CHIP_ID ||
            dev->chip_id == KSZ9567_CHIP_ID)
                proto = DSA_TAG_PROTO_KSZ9477;
@@ -2168,6 +2198,7 @@ static int ksz_switch_detect(struct ksz_device *dev)
 
                switch (id32) {
                case KSZ9477_CHIP_ID:
+               case KSZ9896_CHIP_ID:
                case KSZ9897_CHIP_ID:
                case KSZ9567_CHIP_ID:
                case LAN9370_CHIP_ID:
index 35346b3..7c63f90 100644 (file)
@@ -147,6 +147,7 @@ enum ksz_model {
        KSZ8765,
        KSZ8830,
        KSZ9477,
+       KSZ9896,
        KSZ9897,
        KSZ9893,
        KSZ9567,
@@ -164,6 +165,7 @@ enum ksz_chip_id {
        KSZ8765_CHIP_ID = 0x8765,
        KSZ8830_CHIP_ID = 0x8830,
        KSZ9477_CHIP_ID = 0x00947700,
+       KSZ9896_CHIP_ID = 0x00989600,
        KSZ9897_CHIP_ID = 0x00989700,
        KSZ9893_CHIP_ID = 0x00989300,
        KSZ9567_CHIP_ID = 0x00956700,
index 126ed1c..82e2352 100644 (file)
@@ -152,6 +152,10 @@ static const struct of_device_id ksz_dt_ids[] = {
                .data = &ksz_switch_chips[KSZ9477]
        },
        {
+               .compatible = "microchip,ksz9896",
+               .data = &ksz_switch_chips[KSZ9896]
+       },
+       {
                .compatible = "microchip,ksz9897",
                .data = &ksz_switch_chips[KSZ9897]
        },
@@ -202,6 +206,7 @@ static const struct spi_device_id ksz_spi_ids[] = {
        { "ksz8863" },
        { "ksz8873" },
        { "ksz9477" },
+       { "ksz9896" },
        { "ksz9897" },
        { "ksz9893" },
        { "ksz9563" },
@@ -231,6 +236,7 @@ static struct spi_driver ksz_spi_driver = {
 module_spi_driver(ksz_spi_driver);
 
 MODULE_ALIAS("spi:ksz9477");
+MODULE_ALIAS("spi:ksz9896");
 MODULE_ALIAS("spi:ksz9897");
 MODULE_ALIAS("spi:ksz9893");
 MODULE_ALIAS("spi:ksz9563");