Add parsing of the new DT bindings related to the KSZ87xx low-loss cable errata. The parsed values are stored in the ksz_device structure for use during switch initialization. If the enable property is present, the driver reads the errata mode (microchip,low-loss-errata) and selects workaround 1 or 2 accordingly. If the enable property is absent, the errata logic is fully disabled. This keeps behavior fully backward-compatible with existing device trees. Signed-off-by: Fidelio Lawson --- drivers/net/dsa/microchip/ksz8.c | 25 +++++++++++++++++++++++++ drivers/net/dsa/microchip/ksz8.h | 1 + drivers/net/dsa/microchip/ksz_common.h | 9 +++++++++ 3 files changed, 35 insertions(+) diff --git a/drivers/net/dsa/microchip/ksz8.c b/drivers/net/dsa/microchip/ksz8.c index c354abdafc1b..78b42cf50ce2 100644 --- a/drivers/net/dsa/microchip/ksz8.c +++ b/drivers/net/dsa/microchip/ksz8.c @@ -1989,6 +1989,10 @@ int ksz8_setup(struct dsa_switch *ds) ret = ksz_rmw8(dev, REG_INT_ENABLE, INT_PME, 0); } + /* Check if errata on low loss cable should be applied */ + if (ksz_is_ksz87xx(dev)) + ksz87xx_parse_errata_dt(dev); + if (!ret) return ksz8_handle_global_errata(ds); else @@ -2096,6 +2100,27 @@ int ksz8463_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val) return 0; } +void ksz87xx_parse_errata_dt(struct ksz_device *dev) +{ + struct device_node *np = dev->dev->of_node; + u32 mode; + int ret; + + dev->low_loss_wa_enable = of_property_read_bool(np, "microchip,low-loss-errata-enable"); + + if (!dev->low_loss_wa_enable) { + dev->low_loss_wa_mode = KSZ_LOW_LOSS_WA_NONE; + return; + } + + ret = of_property_read_u32(np, "microchip,low-loss-errata", &mode); + + if (!ret && (mode == 1 || mode == 2)) + dev->low_loss_wa_mode = mode; + else + dev->low_loss_wa_mode = KSZ_LOW_LOSS_WA_1; +} + int ksz8_switch_init(struct ksz_device *dev) { dev->cpu_port = fls(dev->info->cpu_ports) - 1; diff --git a/drivers/net/dsa/microchip/ksz8.h b/drivers/net/dsa/microchip/ksz8.h index 0f2cd1474b44..3a43769a4c53 100644 --- a/drivers/net/dsa/microchip/ksz8.h +++ b/drivers/net/dsa/microchip/ksz8.h @@ -66,5 +66,6 @@ int ksz8_all_queues_split(struct ksz_device *dev, int queues); u32 ksz8463_get_port_addr(int port, int offset); int ksz8463_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val); int ksz8463_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val); +void ksz87xx_parse_errata_dt(struct ksz_device *dev); #endif diff --git a/drivers/net/dsa/microchip/ksz_common.h b/drivers/net/dsa/microchip/ksz_common.h index 929aff4c55de..f40e7bd20b3e 100644 --- a/drivers/net/dsa/microchip/ksz_common.h +++ b/drivers/net/dsa/microchip/ksz_common.h @@ -158,6 +158,12 @@ struct ksz_port { bool manual_flow; }; +enum ksz_low_loss_wa_mode { + KSZ_LOW_LOSS_WA_NONE = 0, + KSZ_LOW_LOSS_WA_1 = 1, + KSZ_LOW_LOSS_WA_2 = 2, +}; + struct ksz_device { struct dsa_switch *ds; struct ksz_platform_data *pdata; @@ -219,6 +225,9 @@ struct ksz_device { * the switch’s internal PHYs, bypassing the main SPI interface. */ struct mii_bus *parent_mdio_bus; + + bool low_loss_wa_enable; /* low-loss cable errata activation */ + enum ksz_low_loss_wa_mode low_loss_wa_mode; /* low-loss cable Workaround to apply */ }; /* List of supported models */ -- 2.53.0