]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net: dsa: microchip: Setup fiber ports for KSZ8463
authorTristram Ha <tristram.ha@microchip.com>
Fri, 25 Jul 2025 00:17:52 +0000 (17:17 -0700)
committerJakub Kicinski <kuba@kernel.org>
Sat, 26 Jul 2025 00:01:56 +0000 (17:01 -0700)
The fiber ports in KSZ8463 cannot be detected internally, so it requires
specifying that condition in the device tree.  Like the one used in
Micrel PHY the port link can only be read and there is no write to the
PHY.  The driver programs registers to operate fiber ports correctly.

Signed-off-by: Tristram Ha <tristram.ha@microchip.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Link: https://patch.msgid.link/20250725001753.6330-6-Tristram.Ha@microchip.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/dsa/microchip/ksz8.c
drivers/net/dsa/microchip/ksz_common.c

index 55c1460b8b2ebe465c242042318a745df313b68f..62224426a9bd04558124b7e8bdfa445ba1dcda6b 100644 (file)
@@ -1714,6 +1714,7 @@ void ksz8_config_cpu_port(struct dsa_switch *ds)
        const u32 *masks;
        const u16 *regs;
        u8 remote;
+       u8 fiber_ports = 0;
        int i;
 
        masks = dev->info->masks;
@@ -1744,6 +1745,21 @@ void ksz8_config_cpu_port(struct dsa_switch *ds)
                else
                        ksz_port_cfg(dev, i, regs[P_STP_CTRL],
                                     PORT_FORCE_FLOW_CTRL, false);
+               if (p->fiber)
+                       fiber_ports |= (1 << i);
+       }
+       if (ksz_is_ksz8463(dev)) {
+               /* Setup fiber ports. */
+               if (fiber_ports) {
+                       fiber_ports &= 3;
+                       regmap_update_bits(ksz_regmap_16(dev),
+                                          KSZ8463_REG_CFG_CTRL,
+                                          fiber_ports << PORT_COPPER_MODE_S,
+                                          0);
+                       regmap_update_bits(ksz_regmap_16(dev),
+                                          KSZ8463_REG_DSP_CTRL_6,
+                                          COPPER_RECEIVE_ADJUSTMENT, 0);
+               }
        }
 }
 
index e47c4a5aad6fd1c4c4780280df595fce846fe855..7292bfe2f7cac3a0d88bb51339cc287f56ca1d1f 100644 (file)
@@ -5439,6 +5439,9 @@ int ksz_switch_register(struct ksz_device *dev)
                                                &dev->ports[port_num].interface);
 
                                ksz_parse_rgmii_delay(dev, port_num, port);
+                               dev->ports[port_num].fiber =
+                                       of_property_read_bool(port,
+                                                             "micrel,fiber-mode");
                        }
                        of_node_put(ports);
                }