From nobody Fri Jun 12 12:48:12 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6C5DF40627A for ; Fri, 15 May 2026 08:38:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778834333; cv=none; b=USedwAmG0ed4Y+1lRsKFGZOKdGmv7v/qf4irwSiaAAVi63728brPq0wYJIgL7oIXpc9MS/Gkhl/7oCnZlhAmpfYzTWKcCohgiH2agsVvFa07guDg6iHFEBoFU3ELDAMWCZ88mFbL0tDDIH1mO0rpp8DWo5Vm6Z+yfU+nLdpHO5E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778834333; c=relaxed/simple; bh=UxwO+r5wuB5bFp15sC2t75Og5LJatnLwjr28V/ET4/0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lzrllYvUpLP/rHNNl8aRU+fmKtFYLZdUYRQ4D2MPsdZ/DuV/DSKS0UFZQipsUs6vzyLTuxJIYYYesAYhjOScV3NOfFH31XeNvWAw6G2+mdAC1tshI0M/zmRjfi3/GSSRnHNfy6p+6aElChro4am90ptjfPP+kd90Yn8L+WSgieQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=ThYBwqBA; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="ThYBwqBA" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id DCDC51A35DD; Fri, 15 May 2026 08:38:49 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id AA1F3606FD; Fri, 15 May 2026 08:38:49 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 5884811AF8528; Fri, 15 May 2026 10:38:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1778834328; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=6wlZkhryxLjypQZDrECW3ZNzvfZK73vCLk6cn1DK/vw=; b=ThYBwqBAW5HzzeaThiBselTrd18S0IYEQYgbs5KIMUXzsmN8PwQWlcYchFGnqTIL8BcbVi mWg9nhvntWCFF9PeDoIt1OkZQompRDeKh7HyPEU00AQ76AEYg6v/bB3cGz4xJkDmkLfkRL xe3XNgdLa4mxSy7S63Zbk8RawHSzjAAK5sbQa6PuqLxaqBC2Bs0h2v+X8UdZUHDUOjXUGR HcXce2AM+4aD+ipEQcyvsRJobwoMAd+5YFiaGlfSHL119f1+jhSKzWCj8f2klPX/vwAPUK jdvnGr6nRwtFDkBAqTCj57EW03Z7mU2BqWUNH9qCxB5Owc8XGdGQGPGJLHv0lg== From: Bastien Curutchet Date: Fri, 15 May 2026 10:38:36 +0200 Subject: [PATCH net-next v2 1/8] net: dsa: microchip: don't reset on shutdown or driver removal Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260515-clean-ksz-2nd-series-v2-1-35a968a739f6@bootlin.com> References: <20260515-clean-ksz-2nd-series-v2-0-35a968a739f6@bootlin.com> In-Reply-To: <20260515-clean-ksz-2nd-series-v2-0-35a968a739f6@bootlin.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , Richard Cochran Cc: Pascal Eberhard , =?utf-8?q?Miqu=C3=A8l_Raynal?= , Thomas Petazzoni , Tristram Ha , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, "Bastien Curutchet (Schneider Electric)" , Vladimir Oltean X-Mailer: b4 0.14.3 X-Last-TLS-Session-Version: TLSv1.3 From: Vladimir Oltean The ksz_switch driver is one of the few which reset the switch when unbinding the driver or shutting down - in the same category with ar9331_sw_remove(), bcm_sf2_sw_remove(), and ks8995_remove(), vsc73xx_remove() and lan9303_remove(). I don't think there exists any requirement to do this, and in fact it does create complications for WoL, as the code already shows. My issue with this logic is that it is the only thing keeping dev_ops->reset() necessary, which I would like to remove after individual KSZ switch families get their own setup() and teardown() methods that don't go through dev_ops. Don't reset the switch when unbinding the driver or shutting down. Remove the exit callbacks from the ksz_dev_ops. Signed-off-by: Vladimir Oltean Signed-off-by: Bastien Curutchet (Schneider Electric) --- drivers/net/dsa/microchip/ksz8.c | 8 -------- drivers/net/dsa/microchip/ksz9477.c | 6 ------ drivers/net/dsa/microchip/ksz_common.c | 32 ++++++++--------------------= ---- drivers/net/dsa/microchip/ksz_common.h | 1 - drivers/net/dsa/microchip/lan937x_main.c | 6 ------ 5 files changed, 8 insertions(+), 45 deletions(-) diff --git a/drivers/net/dsa/microchip/ksz8.c b/drivers/net/dsa/microchip/k= sz8.c index 825133e9ce6e6..ccbc3480717f0 100644 --- a/drivers/net/dsa/microchip/ksz8.c +++ b/drivers/net/dsa/microchip/ksz8.c @@ -2109,11 +2109,6 @@ static int ksz8_switch_init(struct ksz_device *dev) return 0; } =20 -static void ksz8_switch_exit(struct ksz_device *dev) -{ - ksz8_reset_switch(dev); -} - static enum dsa_tag_protocol ksz8463_get_tag_protocol(struct dsa_switch *d= s, int port, enum dsa_tag_protocol mp) @@ -2226,7 +2221,6 @@ const struct ksz_dev_ops ksz8463_dev_ops =3D { .enable_stp_addr =3D ksz8_enable_stp_addr, .reset =3D ksz8_reset_switch, .init =3D ksz8_switch_init, - .exit =3D ksz8_switch_exit, }; =20 const struct ksz_dev_ops ksz87xx_dev_ops =3D { @@ -2245,7 +2239,6 @@ const struct ksz_dev_ops ksz87xx_dev_ops =3D { .enable_stp_addr =3D ksz8_enable_stp_addr, .reset =3D ksz8_reset_switch, .init =3D ksz8_switch_init, - .exit =3D ksz8_switch_exit, .pme_write8 =3D ksz8_pme_write8, .pme_pread8 =3D ksz8_pme_pread8, .pme_pwrite8 =3D ksz8_pme_pwrite8, @@ -2267,7 +2260,6 @@ const struct ksz_dev_ops ksz88xx_dev_ops =3D { .enable_stp_addr =3D ksz8_enable_stp_addr, .reset =3D ksz8_reset_switch, .init =3D ksz8_switch_init, - .exit =3D ksz8_switch_exit, .pme_write8 =3D ksz8_pme_write8, .pme_pread8 =3D ksz8_pme_pread8, .pme_pwrite8 =3D ksz8_pme_pwrite8, diff --git a/drivers/net/dsa/microchip/ksz9477.c b/drivers/net/dsa/microchi= p/ksz9477.c index 65fd07ef73ad0..88a5ff62aae89 100644 --- a/drivers/net/dsa/microchip/ksz9477.c +++ b/drivers/net/dsa/microchip/ksz9477.c @@ -1624,11 +1624,6 @@ static int ksz9477_switch_init(struct ksz_device *de= v) return 0; } =20 -static void ksz9477_switch_exit(struct ksz_device *dev) -{ - ksz9477_reset_switch(dev); -} - static enum dsa_tag_protocol ksz9477_get_tag_protocol(struct dsa_switch *d= s, int port, enum dsa_tag_protocol mp) @@ -1803,7 +1798,6 @@ const struct ksz_dev_ops ksz9477_dev_ops =3D { .enable_stp_addr =3D ksz9477_enable_stp_addr, .reset =3D ksz9477_reset_switch, .init =3D ksz9477_switch_init, - .exit =3D ksz9477_switch_exit, .pcs_create =3D ksz9477_pcs_create, }; =20 diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/micro= chip/ksz_common.c index 4a7bcd1a93927..78d77a60a6ce2 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -4170,16 +4170,15 @@ int ksz_set_wol(struct dsa_switch *ds, int port, * the wol_enabled flag accordingly to reflect whether WoL is active on any * port. */ -static void ksz_wol_pre_shutdown(struct ksz_device *dev, bool *wol_enabled) +static void ksz_wol_pre_shutdown(struct ksz_device *dev) { const struct ksz_dev_ops *ops =3D dev->dev_ops; const u16 *regs =3D dev->info->regs; u8 pme_pin_en =3D PME_ENABLE; + bool wol_enabled =3D false; struct dsa_port *dp; int ret; =20 - *wol_enabled =3D false; - if (!is_ksz9477(dev) && !ksz_is_ksz87xx(dev)) return; =20 @@ -4192,7 +4191,7 @@ static void ksz_wol_pre_shutdown(struct ksz_device *d= ev, bool *wol_enabled) ret =3D ops->pme_pread8(dev, dp->index, regs[REG_PORT_PME_CTRL], &pme_ctrl); if (!ret && pme_ctrl) - *wol_enabled =3D true; + wol_enabled =3D true; =20 /* make sure there are no pending wake events which would * prevent the device from going to sleep/shutdown. @@ -4201,7 +4200,7 @@ static void ksz_wol_pre_shutdown(struct ksz_device *d= ev, bool *wol_enabled) } =20 /* Now we are save to enable PME pin. */ - if (*wol_enabled) { + if (wol_enabled) { if (dev->pme_active_high) pme_pin_en |=3D PME_POLARITY; ops->pme_write8(dev, regs[REG_SW_PME_CTRL], pme_pin_en); @@ -4480,20 +4479,12 @@ EXPORT_SYMBOL(ksz_switch_alloc); * @dev: The switch device structure. * * This function is responsible for initiating a shutdown sequence for the - * switch device. It invokes the reset operation defined in the device - * operations, if available, to reset the switch. Subsequently, it calls t= he - * DSA framework's shutdown function to ensure a proper shutdown of the DSA - * switch. + * switch device. Subsequently, it calls the DSA framework's shutdown func= tion + * to ensure a proper shutdown of the DSA switch. */ void ksz_switch_shutdown(struct ksz_device *dev) { - bool wol_enabled =3D false; - - ksz_wol_pre_shutdown(dev, &wol_enabled); - - if (dev->dev_ops->reset && !wol_enabled) - dev->dev_ops->reset(dev); - + ksz_wol_pre_shutdown(dev); dsa_switch_shutdown(dev->ds); } EXPORT_SYMBOL(ksz_switch_shutdown); @@ -4943,10 +4934,8 @@ int ksz_switch_register(struct ksz_device *dev) } =20 ret =3D dsa_register_switch(dev->ds); - if (ret) { - dev->dev_ops->exit(dev); + if (ret) return ret; - } =20 /* Read MIB counters every 30 seconds to avoid overflow. */ dev->mib_read_interval =3D msecs_to_jiffies(5000); @@ -4966,12 +4955,7 @@ void ksz_switch_remove(struct ksz_device *dev) cancel_delayed_work_sync(&dev->mib_read); } =20 - dev->dev_ops->exit(dev); dsa_unregister_switch(dev->ds); - - if (dev->reset_gpio) - gpiod_set_value_cansleep(dev->reset_gpio, 1); - } EXPORT_SYMBOL(ksz_switch_remove); =20 diff --git a/drivers/net/dsa/microchip/ksz_common.h b/drivers/net/dsa/micro= chip/ksz_common.h index f6dad256a550f..1cdb6661729a6 100644 --- a/drivers/net/dsa/microchip/ksz_common.h +++ b/drivers/net/dsa/microchip/ksz_common.h @@ -421,7 +421,6 @@ struct ksz_dev_ops { int (*enable_stp_addr)(struct ksz_device *dev); int (*reset)(struct ksz_device *dev); int (*init)(struct ksz_device *dev); - void (*exit)(struct ksz_device *dev); =20 int (*pcs_create)(struct ksz_device *dev); }; diff --git a/drivers/net/dsa/microchip/lan937x_main.c b/drivers/net/dsa/mic= rochip/lan937x_main.c index f84548168b371..778e32f568df4 100644 --- a/drivers/net/dsa/microchip/lan937x_main.c +++ b/drivers/net/dsa/microchip/lan937x_main.c @@ -668,11 +668,6 @@ static void lan937x_teardown(struct dsa_switch *ds) =20 } =20 -static void lan937x_switch_exit(struct ksz_device *dev) -{ - lan937x_reset_switch(dev); -} - static enum dsa_tag_protocol lan937x_get_tag_protocol(struct dsa_switch *d= s, int port, enum dsa_tag_protocol mp) @@ -723,7 +718,6 @@ const struct ksz_dev_ops lan937x_dev_ops =3D { .enable_stp_addr =3D ksz9477_enable_stp_addr, .reset =3D lan937x_reset_switch, .init =3D lan937x_switch_init, - .exit =3D lan937x_switch_exit, }; =20 const struct dsa_switch_ops lan937x_switch_ops =3D { --=20 2.53.0 From nobody Fri Jun 12 12:48:12 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7431740DFAE for ; Fri, 15 May 2026 08:38:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778834335; cv=none; b=B4eDPlsWElQHE8J9fiD7vdCKz57sqPRK7+2V0ZR0Y+/CmBlLzKFuvS7Oq3PsUykL5mMpMRVzvQxLyozRaeTGH0juUOvQEszdFPTmjIUpC5nhB2AMmhgDWv5Spg3MJj2RDbhyV/MNc3HwtciaJSX5NdI35VmGNt7jNyJ0nggsZZo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778834335; c=relaxed/simple; bh=3LxElBOxJLRd9Q4qi4cg2fOh9USgK7YBzXtsouHkZ7I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=T8MssKO9FVXuWF0wq5aoxg5WB824CwfCkC8hNLSQkcOlwXDvXYE+9sj6ihLRJN49oCZmQBMBo29qMNyTtkXQfoMxz8ut6blkQ3N6rlHNT/qohQuyqoIF2Lr4EPNvNhD9gxXHgjI4ZBVzhba+wyjqbDIKy1nBwOvcbpbpmsuEXzM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=MtT9m1+d; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="MtT9m1+d" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 94D69C000A5; Fri, 15 May 2026 08:39:43 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 4B7D3606FD; Fri, 15 May 2026 08:38:52 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id D427311AF8FC9; Fri, 15 May 2026 10:38:48 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1778834330; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=Ju3/kyVC5648lwOekB1EhFgUY0zqwPy+KKgsrhJfkEo=; b=MtT9m1+dmENun/kKK6WBJXL9D7nPK9j136Z/HzObOEiSwnUQ/+V8WAV6YoL4KJ60Wwq7oR jx4hoRWsg5RghiIqxlRzO9v7eNIxbbTRxy0W8NyfSZWyLi3E8wnHsNoKCiW3IjWXpnBJTJ viW79Bv/OTW9rUesFfl6oXrDGuigMXD+8H7cYQHstWzCIP+Vqb/jpjVccWSwM5VHjx1GAH FCYkbOafWYYX+jOc6+He7RG465RZ4guBrhYRyDha2yb5egQxviuyB0/FVVqC+SllIbNMYt vnePmGkEAzO5eEEax6/19S8RrIqHewXXZ9FsJyhPUQm5/tFPWHZqkCgSwAlFww== From: Bastien Curutchet Date: Fri, 15 May 2026 10:38:37 +0200 Subject: [PATCH net-next v2 2/8] net: dsa: microchip: bypass dev_ops->setup() and teardown() for lan937x Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260515-clean-ksz-2nd-series-v2-2-35a968a739f6@bootlin.com> References: <20260515-clean-ksz-2nd-series-v2-0-35a968a739f6@bootlin.com> In-Reply-To: <20260515-clean-ksz-2nd-series-v2-0-35a968a739f6@bootlin.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , Richard Cochran Cc: Pascal Eberhard , =?utf-8?q?Miqu=C3=A8l_Raynal?= , Thomas Petazzoni , Tristram Ha , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, "Bastien Curutchet (Schneider Electric)" , Vladimir Oltean X-Mailer: b4 0.14.3 X-Last-TLS-Session-Version: TLSv1.3 From: Vladimir Oltean The KSZ switch families are sufficiently different that a common ds->ops->setup() - ksz_setup() with micro-managed dev_ops->reset(), dev_ops->pcs_create(), dev_ops->config_cpu_port(), dev_ops->enable_stp_addr(), dev_ops->setup() seems to be too convoluted. I am proposing to make each KSZ switch family part ways for dsa_switch_ops :: setup() and teardown(), to allow them greater flexibility. This here is the implementation for lan937x, which is nothing other than a copy of ksz_setup() with the dev_ops function pointers replaced with direct function calls. Signed-off-by: Vladimir Oltean Signed-off-by: Bastien Curutchet (Schneider Electric) --- drivers/net/dsa/microchip/ksz_common.c | 12 ++-- drivers/net/dsa/microchip/ksz_common.h | 6 ++ drivers/net/dsa/microchip/lan937x_main.c | 116 +++++++++++++++++++++++++++= +--- 3 files changed, 116 insertions(+), 18 deletions(-) diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/micro= chip/ksz_common.c index 78d77a60a6ce2..c2624b1930f51 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -2488,7 +2488,7 @@ static int ksz_parse_dt_phy_config(struct ksz_device = *dev, struct mii_bus *bus, * * Return: 0 on success, or a negative error code on failure. */ -static int ksz_mdio_register(struct ksz_device *dev) +int ksz_mdio_register(struct ksz_device *dev) { struct device_node *parent_bus_node; struct mii_bus *parent_bus =3D NULL; @@ -2644,7 +2644,7 @@ static const struct irq_domain_ops ksz_irq_domain_ops= =3D { .xlate =3D irq_domain_xlate_twocell, }; =20 -static void ksz_irq_free(struct ksz_irq *kirq) +void ksz_irq_free(struct ksz_irq *kirq) { int irq, virq; =20 @@ -2713,7 +2713,7 @@ static int ksz_irq_common_setup(struct ksz_device *de= v, struct ksz_irq *kirq) return ret; } =20 -static int ksz_girq_setup(struct ksz_device *dev) +int ksz_girq_setup(struct ksz_device *dev) { struct ksz_irq *girq =3D &dev->girq; =20 @@ -2728,7 +2728,7 @@ static int ksz_girq_setup(struct ksz_device *dev) return ksz_irq_common_setup(dev, girq); } =20 -static int ksz_pirq_setup(struct ksz_device *dev, u8 p) +int ksz_pirq_setup(struct ksz_device *dev, u8 p) { struct ksz_irq *pirq =3D &dev->ports[p].pirq; =20 @@ -2745,8 +2745,6 @@ static int ksz_pirq_setup(struct ksz_device *dev, u8 = p) return ksz_irq_common_setup(dev, pirq); } =20 -static int ksz_parse_drive_strength(struct ksz_device *dev); - int ksz_setup(struct dsa_switch *ds) { struct ksz_device *dev =3D ds->priv; @@ -4698,7 +4696,7 @@ static int ksz88x3_drive_strength_write(struct ksz_de= vice *dev, * * Return: 0 on success, error code otherwise */ -static int ksz_parse_drive_strength(struct ksz_device *dev) +int ksz_parse_drive_strength(struct ksz_device *dev) { struct ksz_driver_strength_prop of_props[] =3D { [KSZ_DRIVER_STRENGTH_HI] =3D { diff --git a/drivers/net/dsa/microchip/ksz_common.h b/drivers/net/dsa/micro= chip/ksz_common.h index 1cdb6661729a6..5fad56c2d067a 100644 --- a/drivers/net/dsa/microchip/ksz_common.h +++ b/drivers/net/dsa/microchip/ksz_common.h @@ -518,6 +518,12 @@ int ksz_hsr_leave(struct dsa_switch *ds, int port, int ksz_suspend(struct dsa_switch *ds); int ksz_resume(struct dsa_switch *ds); =20 +int ksz_mdio_register(struct ksz_device *dev); +int ksz_pirq_setup(struct ksz_device *dev, u8 p); +int ksz_girq_setup(struct ksz_device *dev); +void ksz_irq_free(struct ksz_irq *kirq); +int ksz_parse_drive_strength(struct ksz_device *dev); + /* Common register access functions */ static inline struct regmap *ksz_regmap_8(struct ksz_device *dev) { diff --git a/drivers/net/dsa/microchip/lan937x_main.c b/drivers/net/dsa/mic= rochip/lan937x_main.c index 778e32f568df4..ecb072cd99819 100644 --- a/drivers/net/dsa/microchip/lan937x_main.c +++ b/drivers/net/dsa/microchip/lan937x_main.c @@ -626,8 +626,49 @@ static int lan937x_switch_init(struct ksz_device *dev) static int lan937x_setup(struct dsa_switch *ds) { struct ksz_device *dev =3D ds->priv; + u16 storm_mask, storm_rate; + struct dsa_port *dp; + struct ksz_port *p; + const u16 *regs; int ret; =20 + regs =3D dev->info->regs; + + dev->vlan_cache =3D devm_kcalloc(dev->dev, sizeof(struct vlan_table), + dev->info->num_vlans, GFP_KERNEL); + if (!dev->vlan_cache) + return -ENOMEM; + + ret =3D lan937x_reset_switch(dev); + if (ret) { + dev_err(ds->dev, "failed to reset switch\n"); + return ret; + } + + ret =3D ksz_parse_drive_strength(dev); + if (ret) + return ret; + + /* set broadcast storm protection 10% rate */ + storm_mask =3D BROADCAST_STORM_RATE; + storm_rate =3D (BROADCAST_STORM_VALUE * BROADCAST_STORM_PROT_RATE) / 100; + regmap_update_bits(ksz_regmap_16(dev), regs[S_BROADCAST_CTRL], + storm_mask, storm_rate); + + lan937x_config_cpu_port(ds); + + ksz9477_enable_stp_addr(dev); + + ds->num_tx_queues =3D dev->info->num_tx_queues; + + regmap_update_bits(ksz_regmap_8(dev), regs[S_MULTICAST_CTRL], + MULTICAST_STORM_DISABLE, MULTICAST_STORM_DISABLE); + + ksz_init_mib_timer(dev); + + ds->configure_vlan_while_not_filtering =3D false; + ds->dscp_prio_mapping_is_global =3D true; + /* The VLAN aware is a global setting. Mixed vlan * filterings are not supported. */ @@ -659,13 +700,71 @@ static int lan937x_setup(struct dsa_switch *ds) return ret; =20 /* Disable global VPHY support. Related to CPU interface only? */ - return ksz_rmw32(dev, REG_SW_CFG_STRAP_OVR, SW_VPHY_DISABLE, - SW_VPHY_DISABLE); -} + ret =3D ksz_rmw32(dev, REG_SW_CFG_STRAP_OVR, SW_VPHY_DISABLE, + SW_VPHY_DISABLE); + if (ret < 0) + return ret; =20 -static void lan937x_teardown(struct dsa_switch *ds) -{ + /* Start with learning disabled on standalone user ports, and enabled + * on the CPU port. In lack of other finer mechanisms, learning on the + * CPU port will avoid flooding bridge local addresses on the network + * in some cases. + */ + p =3D &dev->ports[dev->cpu_port]; + p->learning =3D true; =20 + if (dev->irq > 0) { + ret =3D ksz_girq_setup(dev); + if (ret) + return ret; + + dsa_switch_for_each_user_port(dp, dev->ds) { + ret =3D ksz_pirq_setup(dev, dp->index); + if (ret) + goto port_release; + + ret =3D ksz_ptp_irq_setup(ds, dp->index); + if (ret) + goto pirq_release; + } + } + + ret =3D ksz_ptp_clock_register(ds); + if (ret) { + dev_err(dev->dev, "Failed to register PTP clock: %d\n", + ret); + goto port_release; + } + + ret =3D ksz_mdio_register(dev); + if (ret < 0) { + dev_err(dev->dev, "failed to register the mdio"); + goto out_ptp_clock_unregister; + } + + ret =3D ksz_dcb_init(dev); + if (ret) + goto out_ptp_clock_unregister; + + /* start switch */ + regmap_update_bits(ksz_regmap_8(dev), regs[S_START_CTRL], + SW_START, SW_START); + + return 0; + +out_ptp_clock_unregister: + ksz_ptp_clock_unregister(ds); +port_release: + if (dev->irq > 0) { + dsa_switch_for_each_user_port_continue_reverse(dp, dev->ds) { + ksz_ptp_irq_free(ds, dp->index); +pirq_release: + ksz_irq_free(&dev->ports[dp->index].pirq); + } + ksz_irq_free(&dev->girq); + } + + return ret; } =20 static enum dsa_tag_protocol lan937x_get_tag_protocol(struct dsa_switch *d= s, @@ -698,8 +797,6 @@ const struct phylink_mac_ops lan937x_phylink_mac_ops = =3D { }; =20 const struct ksz_dev_ops lan937x_dev_ops =3D { - .setup =3D lan937x_setup, - .teardown =3D lan937x_teardown, .get_port_addr =3D ksz9477_get_port_addr, .cfg_port_member =3D ksz9477_cfg_port_member, .port_setup =3D lan937x_port_setup, @@ -713,10 +810,7 @@ const struct ksz_dev_ops lan937x_dev_ops =3D { .freeze_mib =3D ksz9477_freeze_mib, .port_init_cnt =3D ksz9477_port_init_cnt, .setup_rgmii_delay =3D lan937x_setup_rgmii_delay, - .config_cpu_port =3D lan937x_config_cpu_port, .tc_cbs_set_cinc =3D lan937x_tc_cbs_set_cinc, - .enable_stp_addr =3D ksz9477_enable_stp_addr, - .reset =3D lan937x_reset_switch, .init =3D lan937x_switch_init, }; =20 @@ -724,7 +818,7 @@ const struct dsa_switch_ops lan937x_switch_ops =3D { .get_tag_protocol =3D lan937x_get_tag_protocol, .connect_tag_protocol =3D lan937x_connect_tag_protocol, .get_phy_flags =3D ksz_get_phy_flags, - .setup =3D ksz_setup, + .setup =3D lan937x_setup, .teardown =3D ksz_teardown, .phy_read =3D ksz_phy_read16, .phy_write =3D ksz_phy_write16, --=20 2.53.0 From nobody Fri Jun 12 12:48:12 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4B43540FD9C for ; Fri, 15 May 2026 08:38:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778834337; cv=none; b=Wxj7VnUbUNggBBF2EnbERHFQbEKDifIO5c306meo2bmrY5efuVEGAgnea10NxXOlCQpirry92Wf95DQ2QmkQjexFjb+whgJ3URcZ4BFSiNq8R7ypLebwzpEDcExkpAmzQTRCyGzatjP262C1pMwrZiXwViuis0iwMzsK2ncN8BQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778834337; c=relaxed/simple; bh=ZKfxWajAxYQs1sfsZ9MJXJTY63iDTlUlFlRAAn53PaQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AQwsl2/3raottBaJWybMObN3g38FGSwpqx/8zkLOUqB5pojl2W9rMNLDKti+yEYjbLf1bqc5PnRsZkjxWG08M1d/jOpV58TrOIQepuzEYNseHiZlJ5vCHnyGwEGwdRPn6xEC4S0EUM3++WFkPxHZRdAz0dMGcqV/4uIsClzj13E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=xUkPqnYa; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="xUkPqnYa" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 7707EC5CD6A; Fri, 15 May 2026 08:39:45 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 2F115606FD; Fri, 15 May 2026 08:38:54 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 26C0611AF8DB0; Fri, 15 May 2026 10:38:51 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1778834333; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=PdhuDCwcMhUVRIDe9AhfDuhFhu55EzwmwPrb4Ns3vJA=; b=xUkPqnYau+DYyuv8aB942+lZ/jYJI54gCBn/oytJ2MRTYtmlMJ/Uqz7A32zxk0MSyOHJA9 prWhU8VoSpqQs0n0+ILB6pbuCSnvz6jpCryPR/HhNItSKosOFVl1HZOUTGFBE1Ku8S/qqf veUZPcHjkQnl1HAkZ/jYoPqR4T7HfBSHkIMrFnNIrLhfjjt7JwKA15NZ6KOiLgia1ZxudF 8hkl5XWSOkQ5I7gsK1AEeMGXl1dRL5Agah2BcCOpwgvGNtjH6VWud/S3Vzhip4GJ4QdGUW wGQ4mFGD3cqz0G73x4ymrXKXjN1EwIaorgpm3RRkAU/IW4aAV3UNmXs9rl9UfQ== From: Bastien Curutchet Date: Fri, 15 May 2026 10:38:38 +0200 Subject: [PATCH net-next v2 3/8] net: dsa: microchip: bypass dev_ops->setup() and teardown() for ksz9477 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260515-clean-ksz-2nd-series-v2-3-35a968a739f6@bootlin.com> References: <20260515-clean-ksz-2nd-series-v2-0-35a968a739f6@bootlin.com> In-Reply-To: <20260515-clean-ksz-2nd-series-v2-0-35a968a739f6@bootlin.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , Richard Cochran Cc: Pascal Eberhard , =?utf-8?q?Miqu=C3=A8l_Raynal?= , Thomas Petazzoni , Tristram Ha , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, "Bastien Curutchet (Schneider Electric)" , Vladimir Oltean X-Mailer: b4 0.14.3 X-Last-TLS-Session-Version: TLSv1.3 From: Vladimir Oltean The KSZ switch families are sufficiently different that a common ds->ops->setup() - ksz_setup() with micro-managed dev_ops->reset(), dev_ops->pcs_create(), dev_ops->config_cpu_port(), dev_ops->enable_stp_addr(), dev_ops->setup() seems to be too convoluted. I am proposing to make each KSZ switch family part ways for dsa_switch_ops :: setup() and teardown(), to allow them greater flexibility. This here is the implementation for ksz9477, which is nothing other than a copy of ksz_setup() with the dev_ops function pointers replaced with direct function calls. Signed-off-by: Vladimir Oltean Signed-off-by: Bastien Curutchet (Schneider Electric) --- drivers/net/dsa/microchip/ksz9477.c | 127 ++++++++++++++++++++++++++++++++= +--- 1 file changed, 118 insertions(+), 9 deletions(-) diff --git a/drivers/net/dsa/microchip/ksz9477.c b/drivers/net/dsa/microchi= p/ksz9477.c index 88a5ff62aae89..7385aa4e788a1 100644 --- a/drivers/net/dsa/microchip/ksz9477.c +++ b/drivers/net/dsa/microchip/ksz9477.c @@ -1477,9 +1477,54 @@ int ksz9477_enable_stp_addr(struct ksz_device *dev) static int ksz9477_setup(struct dsa_switch *ds) { struct ksz_device *dev =3D ds->priv; - const u16 *regs =3D dev->info->regs; - int ret =3D 0; + u16 storm_mask, storm_rate; + struct dsa_port *dp; + struct ksz_port *p; + const u16 *regs; + int ret; + + regs =3D dev->info->regs; + + dev->vlan_cache =3D devm_kcalloc(dev->dev, sizeof(struct vlan_table), + dev->info->num_vlans, GFP_KERNEL); + if (!dev->vlan_cache) + return -ENOMEM; + + ret =3D ksz9477_reset_switch(dev); + if (ret) { + dev_err(ds->dev, "failed to reset switch\n"); + return ret; + } + + ret =3D ksz_parse_drive_strength(dev); + if (ret) + return ret; =20 + if (ksz_has_sgmii_port(dev)) { + ret =3D ksz9477_pcs_create(dev); + if (ret) + return ret; + } + + /* set broadcast storm protection 10% rate */ + storm_mask =3D BROADCAST_STORM_RATE; + storm_rate =3D (BROADCAST_STORM_VALUE * BROADCAST_STORM_PROT_RATE) / 100; + regmap_update_bits(ksz_regmap_16(dev), regs[S_BROADCAST_CTRL], + storm_mask, storm_rate); + + ksz9477_config_cpu_port(ds); + + ksz9477_enable_stp_addr(dev); + + ds->num_tx_queues =3D dev->info->num_tx_queues; + + regmap_update_bits(ksz_regmap_8(dev), regs[S_MULTICAST_CTRL], + MULTICAST_STORM_DISABLE, MULTICAST_STORM_DISABLE); + + ksz_init_mib_timer(dev); + + ds->configure_vlan_while_not_filtering =3D false; + ds->dscp_prio_mapping_is_global =3D true; ds->mtu_enforcement_ingress =3D true; =20 /* Required for port partitioning. */ @@ -1512,7 +1557,76 @@ static int ksz9477_setup(struct dsa_switch *ds) * be enabled by ksz_wol_pre_shutdown(). Otherwise, some PMICs * do not like PME events changes before shutdown. */ - return ksz_write8(dev, regs[REG_SW_PME_CTRL], 0); + ret =3D ksz_write8(dev, regs[REG_SW_PME_CTRL], 0); + if (ret < 0) + return ret; + + /* Start with learning disabled on standalone user ports, and enabled + * on the CPU port. In lack of other finer mechanisms, learning on the + * CPU port will avoid flooding bridge local addresses on the network + * in some cases. + */ + p =3D &dev->ports[dev->cpu_port]; + p->learning =3D true; + + if (dev->irq > 0) { + ret =3D ksz_girq_setup(dev); + if (ret) + return ret; + + dsa_switch_for_each_user_port(dp, dev->ds) { + ret =3D ksz_pirq_setup(dev, dp->index); + if (ret) + goto port_release; + + if (dev->info->ptp_capable) { + ret =3D ksz_ptp_irq_setup(ds, dp->index); + if (ret) + goto pirq_release; + } + } + } + + if (dev->info->ptp_capable) { + ret =3D ksz_ptp_clock_register(ds); + if (ret) { + dev_err(dev->dev, "Failed to register PTP clock: %d\n", + ret); + goto port_release; + } + } + + ret =3D ksz_mdio_register(dev); + if (ret < 0) { + dev_err(dev->dev, "failed to register the mdio"); + goto out_ptp_clock_unregister; + } + + ret =3D ksz_dcb_init(dev); + if (ret) + goto out_ptp_clock_unregister; + + /* start switch */ + regmap_update_bits(ksz_regmap_8(dev), regs[S_START_CTRL], + SW_START, SW_START); + + return 0; + +out_ptp_clock_unregister: + if (dev->info->ptp_capable) + ksz_ptp_clock_unregister(ds); +port_release: + if (dev->irq > 0) { + dsa_switch_for_each_user_port_continue_reverse(dp, dev->ds) { + if (dev->info->ptp_capable) + ksz_ptp_irq_free(ds, dp->index); +pirq_release: + ksz_irq_free(&dev->ports[dp->index].pirq); + } + ksz_irq_free(&dev->girq); + } + + return ret; } =20 u32 ksz9477_get_port_addr(int port, int offset) @@ -1779,7 +1893,6 @@ const struct phylink_mac_ops ksz9477_phylink_mac_ops = =3D { }; =20 const struct ksz_dev_ops ksz9477_dev_ops =3D { - .setup =3D ksz9477_setup, .get_port_addr =3D ksz9477_get_port_addr, .cfg_port_member =3D ksz9477_cfg_port_member, .port_setup =3D ksz9477_port_setup, @@ -1793,19 +1906,15 @@ const struct ksz_dev_ops ksz9477_dev_ops =3D { .pme_write8 =3D ksz_write8, .pme_pread8 =3D ksz_pread8, .pme_pwrite8 =3D ksz_pwrite8, - .config_cpu_port =3D ksz9477_config_cpu_port, .tc_cbs_set_cinc =3D ksz9477_tc_cbs_set_cinc, - .enable_stp_addr =3D ksz9477_enable_stp_addr, - .reset =3D ksz9477_reset_switch, .init =3D ksz9477_switch_init, - .pcs_create =3D ksz9477_pcs_create, }; =20 const struct dsa_switch_ops ksz9477_switch_ops =3D { .get_tag_protocol =3D ksz9477_get_tag_protocol, .connect_tag_protocol =3D ksz9477_connect_tag_protocol, .get_phy_flags =3D ksz_get_phy_flags, - .setup =3D ksz_setup, + .setup =3D ksz9477_setup, .teardown =3D ksz_teardown, .phy_read =3D ksz_phy_read16, .phy_write =3D ksz_phy_write16, --=20 2.53.0 From nobody Fri Jun 12 12:48:12 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 044D741B35F for ; Fri, 15 May 2026 08:38:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778834340; cv=none; b=JyxYYzeo+UgDAQMVJwSuLavpXMSK/1N1khyit22vbj6Ldjnd0cSNl1MkSU/LPjgMVPatMiZ9n5Cq3ujZHCulesxC4H/uR0uzhWSSCErcqBo1Dtji3nxSwZqFc0NbXNid/y3ahj7xgyBiA4NR5LR8huNsyurYmbq7lVkYhh9g0+w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778834340; c=relaxed/simple; bh=8INYcjCosLoWjf5+22nOoZPK/DuHVkrMWEiegOfQqE8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=qVQusjHlqyKepzC6OO+cN4JJTdbvx4uUkn4Z4g4t6yxNo8HHT30obP8Yj9GHtCBLTaTZpcOXc8VnQEonFCc9pjv+kcEQOOZeLkodZ3kIHsWeQCtd04sajjZQsqlzLAiFiNlItdKmO7AXVw3OnknhS9ccOzoWHwhGhLNT0VTS1pc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=vKgAfTTE; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="vKgAfTTE" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id C001F4E42CAD; Fri, 15 May 2026 08:38:56 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 8DBD0606FD; Fri, 15 May 2026 08:38:56 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 6D7CD11AF8528; Fri, 15 May 2026 10:38:53 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1778834335; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=wagOjcYVHwlbA375YAevU6ZXDvzMYd+YY6qQOZBQMZk=; b=vKgAfTTEKjuyj0b0Di7lMn4TOtmgVXKfy5KuJiHu0EhL+cBN8bhdpcrEWqb+qodqgVhqk+ fyLx3lBDo8oJML336Dk0i/8gTS5KmWZsxJ4rZYyn0VBDi/Q5S1eEXRXAn0Bdo+3HTxoLEk 1Fb4fTIM67pZQ2JQhCWEmhyVdVegJkgj7dipuOE5LpJkKRU2nNihZrxS9CKmTZDPOoD/2U 2atL7K6/aiSyk445nQK/G1HpGnHL5SiRPtty5MbItrBqfEMDnlWLd29tYxX4vNUXHXEjYa tqmk7qDG5xgeav1DbhJuvToXJULjcvbGnumP0IDvoAau6xGzX6UPY41C9HKksw== From: Bastien Curutchet Date: Fri, 15 May 2026 10:38:39 +0200 Subject: [PATCH net-next v2 4/8] net: dsa: microchip: bypass dev_ops->setup() and teardown() for ksz8 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260515-clean-ksz-2nd-series-v2-4-35a968a739f6@bootlin.com> References: <20260515-clean-ksz-2nd-series-v2-0-35a968a739f6@bootlin.com> In-Reply-To: <20260515-clean-ksz-2nd-series-v2-0-35a968a739f6@bootlin.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , Richard Cochran Cc: Pascal Eberhard , =?utf-8?q?Miqu=C3=A8l_Raynal?= , Thomas Petazzoni , Tristram Ha , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, "Bastien Curutchet (Schneider Electric)" , Vladimir Oltean X-Mailer: b4 0.14.3 X-Last-TLS-Session-Version: TLSv1.3 From: Vladimir Oltean The KSZ switch families are sufficiently different that a common ds->ops->setup() - ksz_setup() with micro-managed dev_ops->reset(), dev_ops->pcs_create(), dev_ops->config_cpu_port(), dev_ops->enable_stp_addr(), dev_ops->setup() seems to be too convoluted. I am proposing to make each KSZ switch family part ways for dsa_switch_ops :: setup() and teardown(), to allow them greater flexibility. This here is the implementation for ksz8, which is nothing other than a copy of ksz_setup() with the dev_ops function pointers replaced with direct function calls. Signed-off-by: Vladimir Oltean Signed-off-by: Bastien Curutchet (Schneider Electric) --- drivers/net/dsa/microchip/ksz8.c | 139 +++++++++++++++++++++++++++++++++--= ---- 1 file changed, 119 insertions(+), 20 deletions(-) diff --git a/drivers/net/dsa/microchip/ksz8.c b/drivers/net/dsa/microchip/k= sz8.c index ccbc3480717f0..acc898c68f985 100644 --- a/drivers/net/dsa/microchip/ksz8.c +++ b/drivers/net/dsa/microchip/ksz8.c @@ -1935,9 +1935,52 @@ static int ksz8_enable_stp_addr(struct ksz_device *d= ev) static int ksz8_setup(struct dsa_switch *ds) { struct ksz_device *dev =3D ds->priv; - const u16 *regs =3D dev->info->regs; - int i, ret =3D 0; + u16 storm_mask, storm_rate; + struct dsa_port *dp; + struct ksz_port *p; + const u16 *regs; + int i, ret; + + regs =3D dev->info->regs; + + dev->vlan_cache =3D devm_kcalloc(dev->dev, sizeof(struct vlan_table), + dev->info->num_vlans, GFP_KERNEL); + if (!dev->vlan_cache) + return -ENOMEM; + + ret =3D ksz8_reset_switch(dev); + if (ret) { + dev_err(ds->dev, "failed to reset switch\n"); + return ret; + } + + ret =3D ksz_parse_drive_strength(dev); + if (ret) + return ret; + + /* set broadcast storm protection 10% rate */ + storm_mask =3D BROADCAST_STORM_RATE; + storm_rate =3D (BROADCAST_STORM_VALUE * BROADCAST_STORM_PROT_RATE) / 100; + if (ksz_is_ksz8463(dev)) { + storm_mask =3D swab16(storm_mask); + storm_rate =3D swab16(storm_rate); + } + regmap_update_bits(ksz_regmap_16(dev), regs[S_BROADCAST_CTRL], + storm_mask, storm_rate); + + ksz8_config_cpu_port(ds); + + ksz8_enable_stp_addr(dev); + + ds->num_tx_queues =3D dev->info->num_tx_queues; + + regmap_update_bits(ksz_regmap_8(dev), regs[S_MULTICAST_CTRL], + MULTICAST_STORM_DISABLE, MULTICAST_STORM_DISABLE); + + ksz_init_mib_timer(dev); =20 + ds->configure_vlan_while_not_filtering =3D false; + ds->dscp_prio_mapping_is_global =3D true; ds->mtu_enforcement_ingress =3D true; =20 /* We rely on software untagging on the CPU port, so that we @@ -1987,12 +2030,80 @@ static int ksz8_setup(struct dsa_switch *ds) ret =3D ksz8_pme_write8(dev, regs[REG_SW_PME_CTRL], 0); if (!ret) ret =3D ksz_rmw8(dev, REG_INT_ENABLE, INT_PME, 0); + if (ret) + return ret; } =20 - if (!ret) - return ksz8_handle_global_errata(ds); - else + ret =3D ksz8_handle_global_errata(ds); + if (ret) return ret; + + /* Start with learning disabled on standalone user ports, and enabled + * on the CPU port. In lack of other finer mechanisms, learning on the + * CPU port will avoid flooding bridge local addresses on the network + * in some cases. + */ + p =3D &dev->ports[dev->cpu_port]; + p->learning =3D true; + + if (dev->irq > 0) { + ret =3D ksz_girq_setup(dev); + if (ret) + return ret; + + dsa_switch_for_each_user_port(dp, dev->ds) { + ret =3D ksz_pirq_setup(dev, dp->index); + if (ret) + goto port_release; + + if (dev->info->ptp_capable) { + ret =3D ksz_ptp_irq_setup(ds, dp->index); + if (ret) + goto pirq_release; + } + } + } + + if (dev->info->ptp_capable) { + ret =3D ksz_ptp_clock_register(ds); + if (ret) { + dev_err(dev->dev, "Failed to register PTP clock: %d\n", + ret); + goto port_release; + } + } + + ret =3D ksz_mdio_register(dev); + if (ret < 0) { + dev_err(dev->dev, "failed to register the mdio"); + goto out_ptp_clock_unregister; + } + + ret =3D ksz_dcb_init(dev); + if (ret) + goto out_ptp_clock_unregister; + + /* start switch */ + regmap_update_bits(ksz_regmap_8(dev), regs[S_START_CTRL], + SW_START, SW_START); + + return 0; + +out_ptp_clock_unregister: + if (dev->info->ptp_capable) + ksz_ptp_clock_unregister(ds); +port_release: + if (dev->irq > 0) { + dsa_switch_for_each_user_port_continue_reverse(dp, dev->ds) { + if (dev->info->ptp_capable) + ksz_ptp_irq_free(ds, dp->index); +pirq_release: + ksz_irq_free(&dev->ports[dp->index].pirq); + } + ksz_irq_free(&dev->girq); + } + + return ret; } =20 static void ksz8_phylink_get_caps(struct dsa_switch *ds, int port, @@ -2206,7 +2317,6 @@ const struct phylink_mac_ops ksz8_phylink_mac_ops =3D= { }; =20 const struct ksz_dev_ops ksz8463_dev_ops =3D { - .setup =3D ksz8_setup, .get_port_addr =3D ksz8463_get_port_addr, .cfg_port_member =3D ksz8_cfg_port_member, .port_setup =3D ksz8_port_setup, @@ -2217,14 +2327,10 @@ const struct ksz_dev_ops ksz8463_dev_ops =3D { .r_mib_stat64 =3D ksz88xx_r_mib_stats64, .freeze_mib =3D ksz8_freeze_mib, .port_init_cnt =3D ksz8_port_init_cnt, - .config_cpu_port =3D ksz8_config_cpu_port, - .enable_stp_addr =3D ksz8_enable_stp_addr, - .reset =3D ksz8_reset_switch, .init =3D ksz8_switch_init, }; =20 const struct ksz_dev_ops ksz87xx_dev_ops =3D { - .setup =3D ksz8_setup, .get_port_addr =3D ksz8_get_port_addr, .cfg_port_member =3D ksz8_cfg_port_member, .port_setup =3D ksz8_port_setup, @@ -2235,9 +2341,6 @@ const struct ksz_dev_ops ksz87xx_dev_ops =3D { .r_mib_stat64 =3D ksz_r_mib_stats64, .freeze_mib =3D ksz8_freeze_mib, .port_init_cnt =3D ksz8_port_init_cnt, - .config_cpu_port =3D ksz8_config_cpu_port, - .enable_stp_addr =3D ksz8_enable_stp_addr, - .reset =3D ksz8_reset_switch, .init =3D ksz8_switch_init, .pme_write8 =3D ksz8_pme_write8, .pme_pread8 =3D ksz8_pme_pread8, @@ -2245,7 +2348,6 @@ const struct ksz_dev_ops ksz87xx_dev_ops =3D { }; =20 const struct ksz_dev_ops ksz88xx_dev_ops =3D { - .setup =3D ksz8_setup, .get_port_addr =3D ksz8_get_port_addr, .cfg_port_member =3D ksz8_cfg_port_member, .port_setup =3D ksz8_port_setup, @@ -2256,9 +2358,6 @@ const struct ksz_dev_ops ksz88xx_dev_ops =3D { .r_mib_stat64 =3D ksz88xx_r_mib_stats64, .freeze_mib =3D ksz8_freeze_mib, .port_init_cnt =3D ksz8_port_init_cnt, - .config_cpu_port =3D ksz8_config_cpu_port, - .enable_stp_addr =3D ksz8_enable_stp_addr, - .reset =3D ksz8_reset_switch, .init =3D ksz8_switch_init, .pme_write8 =3D ksz8_pme_write8, .pme_pread8 =3D ksz8_pme_pread8, @@ -2269,7 +2368,7 @@ const struct dsa_switch_ops ksz8463_switch_ops =3D { .get_tag_protocol =3D ksz8463_get_tag_protocol, .connect_tag_protocol =3D ksz8463_connect_tag_protocol, .get_phy_flags =3D ksz_get_phy_flags, - .setup =3D ksz_setup, + .setup =3D ksz8_setup, .teardown =3D ksz_teardown, .phy_read =3D ksz_phy_read16, .phy_write =3D ksz_phy_write16, @@ -2329,7 +2428,7 @@ const struct dsa_switch_ops ksz87xx_switch_ops =3D { .get_tag_protocol =3D ksz87xx_get_tag_protocol, .connect_tag_protocol =3D ksz87xx_connect_tag_protocol, .get_phy_flags =3D ksz_get_phy_flags, - .setup =3D ksz_setup, + .setup =3D ksz8_setup, .teardown =3D ksz_teardown, .phy_read =3D ksz_phy_read16, .phy_write =3D ksz_phy_write16, @@ -2389,7 +2488,7 @@ const struct dsa_switch_ops ksz88xx_switch_ops =3D { .get_tag_protocol =3D ksz88xx_get_tag_protocol, .connect_tag_protocol =3D ksz88xx_connect_tag_protocol, .get_phy_flags =3D ksz_get_phy_flags, - .setup =3D ksz_setup, + .setup =3D ksz8_setup, .teardown =3D ksz_teardown, .phy_read =3D ksz_phy_read16, .phy_write =3D ksz_phy_write16, --=20 2.53.0 From nobody Fri Jun 12 12:48:12 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5445A4218BE for ; Fri, 15 May 2026 08:39:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778834342; cv=none; b=HorVPcYnBPPYT72dlotRawwcEGRKndjr82Z++1S/Z+CgksHzJqmNTu46hHFFm5yKi2t7xCc9dTrMFPitD5qpx9X69SQQkVEUmqLPNATaw3F8wVEIKCAjY1Wawa0G/AcIx9l46t+fi3py+61DuGul0e4705uv8C3RdZsQpfAufbA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778834342; c=relaxed/simple; bh=ll46DGOyhjsJvmihlV5o0j5gGJoeA0LP/URMNEHa6Zo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GPTCpJNNvb7dOEwXkV2dHANao+Wth4lWxc52Fo0lWpyr4L2Ay1erWrubBmtqqJ6Qu3/EocMWuo0dTD0Rq0um45zDdJ5b43KiEo+UcQNH2RTFrSjCbpwmaFH99JjKaK9ftplBZ/4ovPvVSg6122s96os4BvCTxR1LRtl7MoeErnM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=wfyWD6au; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="wfyWD6au" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id F3D4C1A35DD; Fri, 15 May 2026 08:38:58 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id C9702606FD; Fri, 15 May 2026 08:38:58 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id A5C5811AF87BB; Fri, 15 May 2026 10:38:55 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1778834337; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=zlhduSZrPeOgu/P9X7lc6Qzasj1anHxVDOvRSMRYXuU=; b=wfyWD6auJ1bxT7KMMD93nqDR9wl4OTvoDr5DVqj7TAXuQ4VbbBqYkmutdtwO6m7BEt3GoJ r5hiZaEGu4iER/C4ko0p1pCD7qw5SLDyAn9loZ4cJdTaHS6syrzjRk7GYfvHqpxzPb84s6 vgfo3mHb0J3k7ewhyFVRp99EAB3z2E5fJVLHl6UBJtGmbqr0xUk715ZzrmMkqkjEuX8uuW ZYph6WDUOzAaPN9+P6X3BFZGz7OI/tWzm5CrMZq48r8fGhbpV1vn+fxD5Yfut4tV72DIzI +hS5lC2uxnIDxjtDL4MgFM3w+BcKyt6ZkSrWWtKREKnBhgII91rde9bcndn4aA== From: Bastien Curutchet Date: Fri, 15 May 2026 10:38:40 +0200 Subject: [PATCH net-next v2 5/8] net: dsa: microchip: remove dev_ops->setup() and teardown() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260515-clean-ksz-2nd-series-v2-5-35a968a739f6@bootlin.com> References: <20260515-clean-ksz-2nd-series-v2-0-35a968a739f6@bootlin.com> In-Reply-To: <20260515-clean-ksz-2nd-series-v2-0-35a968a739f6@bootlin.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , Richard Cochran Cc: Pascal Eberhard , =?utf-8?q?Miqu=C3=A8l_Raynal?= , Thomas Petazzoni , Tristram Ha , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, "Bastien Curutchet (Schneider Electric)" , Vladimir Oltean X-Mailer: b4 0.14.3 X-Last-TLS-Session-Version: TLSv1.3 From: Vladimir Oltean All switch families have been converted to have their own ds->ops->setup() methods and to call the common ksz_teardown(). Remove the no longer used ksz_setup() function and the associated ksz_dev_ops callbacks. Signed-off-by: Vladimir Oltean Signed-off-by: Bastien Curutchet (Schneider Electric) --- drivers/net/dsa/microchip/ksz_common.c | 133 -----------------------------= ---- drivers/net/dsa/microchip/ksz_common.h | 8 -- 2 files changed, 141 deletions(-) diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/micro= chip/ksz_common.c index c2624b1930f51..60edb02846481 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -2745,136 +2745,6 @@ int ksz_pirq_setup(struct ksz_device *dev, u8 p) return ksz_irq_common_setup(dev, pirq); } =20 -int ksz_setup(struct dsa_switch *ds) -{ - struct ksz_device *dev =3D ds->priv; - u16 storm_mask, storm_rate; - struct dsa_port *dp; - struct ksz_port *p; - const u16 *regs; - int ret; - - regs =3D dev->info->regs; - - dev->vlan_cache =3D devm_kcalloc(dev->dev, sizeof(struct vlan_table), - dev->info->num_vlans, GFP_KERNEL); - if (!dev->vlan_cache) - return -ENOMEM; - - ret =3D dev->dev_ops->reset(dev); - if (ret) { - dev_err(ds->dev, "failed to reset switch\n"); - return ret; - } - - ret =3D ksz_parse_drive_strength(dev); - if (ret) - return ret; - - if (ksz_has_sgmii_port(dev) && dev->dev_ops->pcs_create) { - ret =3D dev->dev_ops->pcs_create(dev); - if (ret) - return ret; - } - - /* set broadcast storm protection 10% rate */ - storm_mask =3D BROADCAST_STORM_RATE; - storm_rate =3D (BROADCAST_STORM_VALUE * BROADCAST_STORM_PROT_RATE) / 100; - if (ksz_is_ksz8463(dev)) { - storm_mask =3D swab16(storm_mask); - storm_rate =3D swab16(storm_rate); - } - regmap_update_bits(ksz_regmap_16(dev), regs[S_BROADCAST_CTRL], - storm_mask, storm_rate); - - dev->dev_ops->config_cpu_port(ds); - - dev->dev_ops->enable_stp_addr(dev); - - ds->num_tx_queues =3D dev->info->num_tx_queues; - - regmap_update_bits(ksz_regmap_8(dev), regs[S_MULTICAST_CTRL], - MULTICAST_STORM_DISABLE, MULTICAST_STORM_DISABLE); - - ksz_init_mib_timer(dev); - - ds->configure_vlan_while_not_filtering =3D false; - ds->dscp_prio_mapping_is_global =3D true; - - if (dev->dev_ops->setup) { - ret =3D dev->dev_ops->setup(ds); - if (ret) - return ret; - } - - /* Start with learning disabled on standalone user ports, and enabled - * on the CPU port. In lack of other finer mechanisms, learning on the - * CPU port will avoid flooding bridge local addresses on the network - * in some cases. - */ - p =3D &dev->ports[dev->cpu_port]; - p->learning =3D true; - - if (dev->irq > 0) { - ret =3D ksz_girq_setup(dev); - if (ret) - return ret; - - dsa_switch_for_each_user_port(dp, dev->ds) { - ret =3D ksz_pirq_setup(dev, dp->index); - if (ret) - goto port_release; - - if (dev->info->ptp_capable) { - ret =3D ksz_ptp_irq_setup(ds, dp->index); - if (ret) - goto pirq_release; - } - } - } - - if (dev->info->ptp_capable) { - ret =3D ksz_ptp_clock_register(ds); - if (ret) { - dev_err(dev->dev, "Failed to register PTP clock: %d\n", - ret); - goto port_release; - } - } - - ret =3D ksz_mdio_register(dev); - if (ret < 0) { - dev_err(dev->dev, "failed to register the mdio"); - goto out_ptp_clock_unregister; - } - - ret =3D ksz_dcb_init(dev); - if (ret) - goto out_ptp_clock_unregister; - - /* start switch */ - regmap_update_bits(ksz_regmap_8(dev), regs[S_START_CTRL], - SW_START, SW_START); - - return 0; - -out_ptp_clock_unregister: - if (dev->info->ptp_capable) - ksz_ptp_clock_unregister(ds); -port_release: - if (dev->irq > 0) { - dsa_switch_for_each_user_port_continue_reverse(dp, dev->ds) { - if (dev->info->ptp_capable) - ksz_ptp_irq_free(ds, dp->index); -pirq_release: - ksz_irq_free(&dev->ports[dp->index].pirq); - } - ksz_irq_free(&dev->girq); - } - - return ret; -} - void ksz_teardown(struct dsa_switch *ds) { struct ksz_device *dev =3D ds->priv; @@ -2893,9 +2763,6 @@ void ksz_teardown(struct dsa_switch *ds) =20 ksz_irq_free(&dev->girq); } - - if (dev->dev_ops->teardown) - dev->dev_ops->teardown(ds); } =20 static void port_r_cnt(struct ksz_device *dev, int port) diff --git a/drivers/net/dsa/microchip/ksz_common.h b/drivers/net/dsa/micro= chip/ksz_common.h index 5fad56c2d067a..f80034488cd1b 100644 --- a/drivers/net/dsa/microchip/ksz_common.h +++ b/drivers/net/dsa/microchip/ksz_common.h @@ -359,8 +359,6 @@ struct alu_struct { }; =20 struct ksz_dev_ops { - int (*setup)(struct dsa_switch *ds); - void (*teardown)(struct dsa_switch *ds); u32 (*get_port_addr)(int port, int offset); void (*cfg_port_member)(struct ksz_device *dev, int port, u8 member); void (*port_setup)(struct ksz_device *dev, int port, bool cpu_port); @@ -417,12 +415,7 @@ struct ksz_dev_ops { void (*port_init_cnt)(struct ksz_device *dev, int port); void (*setup_rgmii_delay)(struct ksz_device *dev, int port); int (*tc_cbs_set_cinc)(struct ksz_device *dev, int port, u32 val); - void (*config_cpu_port)(struct dsa_switch *ds); - int (*enable_stp_addr)(struct ksz_device *dev); - int (*reset)(struct ksz_device *dev); int (*init)(struct ksz_device *dev); - - int (*pcs_create)(struct ksz_device *dev); }; =20 struct ksz_device *ksz_switch_alloc(struct device *base, @@ -433,7 +426,6 @@ void ksz_switch_remove(struct ksz_device *dev); int ksz_switch_suspend(struct device *dev); int ksz_switch_resume(struct device *dev); =20 -int ksz_setup(struct dsa_switch *ds); void ksz_teardown(struct dsa_switch *ds); int ksz_port_setup(struct dsa_switch *ds, int port); void ksz_port_teardown(struct dsa_switch *ds, int port); --=20 2.53.0 From nobody Fri Jun 12 12:48:12 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 62BEA42317B for ; Fri, 15 May 2026 08:39:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778834346; cv=none; b=XatcNLO+JhiWWflIBOPq07IeRCnEdkQ4j/mBzyPzHuqes4+S+qxgWM7tNMiCwMeY1MYiDBLUN+kj5b6MIZYhScgH6i2xwZ1sG3xe9s7xxe50DpPiO+Hd+549P95r7FMrc14mVW3i28LT9IXw3bighlFzwMvGkWvCtKMtBPG0d7Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778834346; c=relaxed/simple; bh=H3MINwaBiWqPwonahVnUoFmEb4zJsYe9K7w57KAs6U8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Cm0ngyEAlq7BCPy00xQtyPjoY9ZT1/SMot5E/ecoEXyjhMWvQJ8TEstd5KW2atV+SGaR4g34xlbpwufFqz04FNKXyZdMf9e+qTEtGlPFrV78ExAuoH1XMVCYFCFN0SVrxN0Cy9Ix4sofFc+2z8ImnrAJpGw453s7J6eaWwq2n5Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=mIH7HrfZ; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="mIH7HrfZ" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id F0A444E42CAD; Fri, 15 May 2026 08:39:00 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id C6943606FD; Fri, 15 May 2026 08:39:00 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id D646A11AF8FC7; Fri, 15 May 2026 10:38:57 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1778834339; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=KJ9ZmxNdwxoet9gUqFaXHJK3JCVAl+KSVC405L2FOJA=; b=mIH7HrfZpgT33flR50JMfcEyhfaC3du+iOWUtG00XKWg72slK6cv0sIt+8s8FjI9rpPpMQ U4Xm68nZQSFZuiVW4uD6E/wBG6x7OR/VPxBBY3NzpSuGZ+JPbGtoUr2RjmRp7qvxj0NOYa G7t2vn+LbROMWGJllI2zoEBwdkz6g7m04vKof4IYgHdit/neQvuqh9p2yJNzwKe71AW9Mz FtG+U1mLd75WT2su6Ujfmd5uEWPi1NxlLoA47vkkfEUavqMaxy0Qw5oj6LSwds+iLjRqQW gdc7aRpWiPX0sWl6uo3LvQOM+47f1qeCIUTlG5bMUgCA5kJEVjY/Tif1ZQiJgg== From: "Bastien Curutchet (Schneider Electric)" Date: Fri, 15 May 2026 10:38:41 +0200 Subject: [PATCH net-next v2 6/8] net: dsa: microchip: bypass dev_ops for port_setup() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260515-clean-ksz-2nd-series-v2-6-35a968a739f6@bootlin.com> References: <20260515-clean-ksz-2nd-series-v2-0-35a968a739f6@bootlin.com> In-Reply-To: <20260515-clean-ksz-2nd-series-v2-0-35a968a739f6@bootlin.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , Richard Cochran Cc: Pascal Eberhard , =?utf-8?q?Miqu=C3=A8l_Raynal?= , Thomas Petazzoni , Tristram Ha , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, "Bastien Curutchet (Schneider Electric)" X-Mailer: b4 0.14.3 X-Last-TLS-Session-Version: TLSv1.3 port_setup() is handled through a common function that redirects the treatment to ksz_dev_ops callbacks. This layer of indirection isn't needed since we now have a dsa_switch_ops for each switch family Remove one indirection layer for KSZ switches, by connecting the ksz_dev_ops :: port_setup() operations directly to dsa_switch_ops. Make ksz9477_set_default_prio_queue_mapping() non-static since it's used by ksz_common for tc operations and by ksz9477.c for this port_setup(). Remove the now unused port_setup() callback from ksz_dev_ops. Signed-off-by: Bastien Curutchet (Schneider Electric) --- drivers/net/dsa/microchip/ksz8.c | 20 ++++++++++++++------ drivers/net/dsa/microchip/ksz9477.c | 20 ++++++++++++++++++-- drivers/net/dsa/microchip/ksz_common.c | 27 +-------------------------- drivers/net/dsa/microchip/ksz_common.h | 3 +-- drivers/net/dsa/microchip/lan937x_main.c | 20 ++++++++++++++++++-- 5 files changed, 52 insertions(+), 38 deletions(-) diff --git a/drivers/net/dsa/microchip/ksz8.c b/drivers/net/dsa/microchip/k= sz8.c index acc898c68f985..09968aec65063 100644 --- a/drivers/net/dsa/microchip/ksz8.c +++ b/drivers/net/dsa/microchip/ksz8.c @@ -1692,6 +1692,17 @@ static void ksz8_port_setup(struct ksz_device *dev, = int port, bool cpu_port) ksz8_pme_pwrite8(dev, port, regs[REG_PORT_PME_CTRL], 0); } =20 +static int ksz8_dsa_port_setup(struct dsa_switch *ds, int port) +{ + struct ksz_device *dev =3D ds->priv; + + if (!dsa_is_user_port(ds, port)) + return 0; + + ksz8_port_setup(dev, port, false); + return ksz_dcb_init_port(dev, port); +} + static void ksz88x3_config_rmii_clk(struct ksz_device *dev) { struct dsa_port *cpu_dp =3D dsa_to_port(dev->ds, dev->cpu_port); @@ -2319,7 +2330,6 @@ const struct phylink_mac_ops ksz8_phylink_mac_ops =3D= { const struct ksz_dev_ops ksz8463_dev_ops =3D { .get_port_addr =3D ksz8463_get_port_addr, .cfg_port_member =3D ksz8_cfg_port_member, - .port_setup =3D ksz8_port_setup, .r_phy =3D ksz8463_r_phy, .w_phy =3D ksz8463_w_phy, .r_mib_cnt =3D ksz8_r_mib_cnt, @@ -2333,7 +2343,6 @@ const struct ksz_dev_ops ksz8463_dev_ops =3D { const struct ksz_dev_ops ksz87xx_dev_ops =3D { .get_port_addr =3D ksz8_get_port_addr, .cfg_port_member =3D ksz8_cfg_port_member, - .port_setup =3D ksz8_port_setup, .r_phy =3D ksz8_r_phy, .w_phy =3D ksz8_w_phy, .r_mib_cnt =3D ksz8_r_mib_cnt, @@ -2350,7 +2359,6 @@ const struct ksz_dev_ops ksz87xx_dev_ops =3D { const struct ksz_dev_ops ksz88xx_dev_ops =3D { .get_port_addr =3D ksz8_get_port_addr, .cfg_port_member =3D ksz8_cfg_port_member, - .port_setup =3D ksz8_port_setup, .r_phy =3D ksz8_r_phy, .w_phy =3D ksz8_w_phy, .r_mib_cnt =3D ksz8_r_mib_cnt, @@ -2373,7 +2381,7 @@ const struct dsa_switch_ops ksz8463_switch_ops =3D { .phy_read =3D ksz_phy_read16, .phy_write =3D ksz_phy_write16, .phylink_get_caps =3D ksz8_phylink_get_caps, - .port_setup =3D ksz_port_setup, + .port_setup =3D ksz8_dsa_port_setup, .get_strings =3D ksz_get_strings, .get_ethtool_stats =3D ksz_get_ethtool_stats, .get_sset_count =3D ksz_sset_count, @@ -2433,7 +2441,7 @@ const struct dsa_switch_ops ksz87xx_switch_ops =3D { .phy_read =3D ksz_phy_read16, .phy_write =3D ksz_phy_write16, .phylink_get_caps =3D ksz8_phylink_get_caps, - .port_setup =3D ksz_port_setup, + .port_setup =3D ksz8_dsa_port_setup, .get_strings =3D ksz_get_strings, .get_ethtool_stats =3D ksz_get_ethtool_stats, .get_sset_count =3D ksz_sset_count, @@ -2493,7 +2501,7 @@ const struct dsa_switch_ops ksz88xx_switch_ops =3D { .phy_read =3D ksz_phy_read16, .phy_write =3D ksz_phy_write16, .phylink_get_caps =3D ksz8_phylink_get_caps, - .port_setup =3D ksz_port_setup, + .port_setup =3D ksz8_dsa_port_setup, .get_strings =3D ksz_get_strings, .get_ethtool_stats =3D ksz_get_ethtool_stats, .get_sset_count =3D ksz_sset_count, diff --git a/drivers/net/dsa/microchip/ksz9477.c b/drivers/net/dsa/microchi= p/ksz9477.c index 7385aa4e788a1..aac7fc478eda8 100644 --- a/drivers/net/dsa/microchip/ksz9477.c +++ b/drivers/net/dsa/microchip/ksz9477.c @@ -1309,6 +1309,23 @@ static void ksz9477_port_setup(struct ksz_device *de= v, int port, bool cpu_port) ksz_pwrite8(dev, port, regs[REG_PORT_PME_CTRL], 0); } =20 +static int ksz9477_dsa_port_setup(struct dsa_switch *ds, int port) +{ + struct ksz_device *dev =3D ds->priv; + int ret; + + if (!dsa_is_user_port(ds, port)) + return 0; + + ksz9477_port_setup(dev, port, false); + + ret =3D ksz9477_set_default_prio_queue_mapping(dev, port); + if (ret) + return ret; + + return ksz_dcb_init_port(dev, port); +} + static void ksz9477_config_cpu_port(struct dsa_switch *ds) { struct ksz_device *dev =3D ds->priv; @@ -1895,7 +1912,6 @@ const struct phylink_mac_ops ksz9477_phylink_mac_ops = =3D { const struct ksz_dev_ops ksz9477_dev_ops =3D { .get_port_addr =3D ksz9477_get_port_addr, .cfg_port_member =3D ksz9477_cfg_port_member, - .port_setup =3D ksz9477_port_setup, .r_phy =3D ksz9477_r_phy, .w_phy =3D ksz9477_w_phy, .r_mib_cnt =3D ksz9477_r_mib_cnt, @@ -1919,7 +1935,7 @@ const struct dsa_switch_ops ksz9477_switch_ops =3D { .phy_read =3D ksz_phy_read16, .phy_write =3D ksz_phy_write16, .phylink_get_caps =3D ksz9477_phylink_get_caps, - .port_setup =3D ksz_port_setup, + .port_setup =3D ksz9477_dsa_port_setup, .set_ageing_time =3D ksz9477_set_ageing_time, .get_strings =3D ksz_get_strings, .get_ethtool_stats =3D ksz_get_ethtool_stats, diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/micro= chip/ksz_common.c index 60edb02846481..f44974cf4e595 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -2947,8 +2947,7 @@ void ksz_port_bridge_leave(struct dsa_switch *ds, int= port, */ } =20 -static int ksz9477_set_default_prio_queue_mapping(struct ksz_device *dev, - int port) +int ksz9477_set_default_prio_queue_mapping(struct ksz_device *dev, int por= t) { u32 queue_map =3D 0; int ipm; @@ -2970,30 +2969,6 @@ static int ksz9477_set_default_prio_queue_mapping(st= ruct ksz_device *dev, return ksz_pwrite32(dev, port, KSZ9477_PORT_MRI_TC_MAP__4, queue_map); } =20 -int ksz_port_setup(struct dsa_switch *ds, int port) -{ - struct ksz_device *dev =3D ds->priv; - int ret; - - if (!dsa_is_user_port(ds, port)) - return 0; - - /* setup user port */ - dev->dev_ops->port_setup(dev, port, false); - - if (!is_ksz8(dev)) { - ret =3D ksz9477_set_default_prio_queue_mapping(dev, port); - if (ret) - return ret; - } - - /* port_stp_state_set() will be called after to enable the port so - * there is no need to do anything. - */ - - return ksz_dcb_init_port(dev, port); -} - void ksz_port_stp_state_set(struct dsa_switch *ds, int port, u8 state) { struct ksz_device *dev =3D ds->priv; diff --git a/drivers/net/dsa/microchip/ksz_common.h b/drivers/net/dsa/micro= chip/ksz_common.h index f80034488cd1b..c66d75347c6cb 100644 --- a/drivers/net/dsa/microchip/ksz_common.h +++ b/drivers/net/dsa/microchip/ksz_common.h @@ -361,7 +361,6 @@ struct alu_struct { struct ksz_dev_ops { u32 (*get_port_addr)(int port, int offset); void (*cfg_port_member)(struct ksz_device *dev, int port, u8 member); - void (*port_setup)(struct ksz_device *dev, int port, bool cpu_port); =20 /** * @mdio_bus_preinit: Function pointer to pre-initialize the MDIO bus @@ -427,7 +426,6 @@ int ksz_switch_suspend(struct device *dev); int ksz_switch_resume(struct device *dev); =20 void ksz_teardown(struct dsa_switch *ds); -int ksz_port_setup(struct dsa_switch *ds, int port); void ksz_port_teardown(struct dsa_switch *ds, int port); =20 void ksz_init_mib_timer(struct ksz_device *dev); @@ -515,6 +513,7 @@ int ksz_pirq_setup(struct ksz_device *dev, u8 p); int ksz_girq_setup(struct ksz_device *dev); void ksz_irq_free(struct ksz_irq *kirq); int ksz_parse_drive_strength(struct ksz_device *dev); +int ksz9477_set_default_prio_queue_mapping(struct ksz_device *dev, int por= t); =20 /* Common register access functions */ static inline struct regmap *ksz_regmap_8(struct ksz_device *dev) diff --git a/drivers/net/dsa/microchip/lan937x_main.c b/drivers/net/dsa/mic= rochip/lan937x_main.c index ecb072cd99819..690f99da0bfee 100644 --- a/drivers/net/dsa/microchip/lan937x_main.c +++ b/drivers/net/dsa/microchip/lan937x_main.c @@ -411,6 +411,23 @@ static void lan937x_port_setup(struct ksz_device *dev,= int port, bool cpu_port) dev->dev_ops->cfg_port_member(dev, port, member); } =20 +static int lan937x_dsa_port_setup(struct dsa_switch *ds, int port) +{ + struct ksz_device *dev =3D ds->priv; + int ret; + + if (!dsa_is_user_port(ds, port)) + return 0; + + lan937x_port_setup(dev, port, false); + + ret =3D ksz9477_set_default_prio_queue_mapping(dev, port); + if (ret) + return ret; + + return ksz_dcb_init_port(dev, port); +} + static void lan937x_config_cpu_port(struct dsa_switch *ds) { struct ksz_device *dev =3D ds->priv; @@ -799,7 +816,6 @@ const struct phylink_mac_ops lan937x_phylink_mac_ops = =3D { const struct ksz_dev_ops lan937x_dev_ops =3D { .get_port_addr =3D ksz9477_get_port_addr, .cfg_port_member =3D ksz9477_cfg_port_member, - .port_setup =3D lan937x_port_setup, .mdio_bus_preinit =3D lan937x_mdio_bus_preinit, .create_phy_addr_map =3D lan937x_create_phy_addr_map, .r_phy =3D lan937x_r_phy, @@ -823,7 +839,7 @@ const struct dsa_switch_ops lan937x_switch_ops =3D { .phy_read =3D ksz_phy_read16, .phy_write =3D ksz_phy_write16, .phylink_get_caps =3D lan937x_phylink_get_caps, - .port_setup =3D ksz_port_setup, + .port_setup =3D lan937x_dsa_port_setup, .set_ageing_time =3D lan937x_set_ageing_time, .get_strings =3D ksz_get_strings, .get_ethtool_stats =3D ksz_get_ethtool_stats, --=20 2.53.0 From nobody Fri Jun 12 12:48:12 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C658540245C for ; Fri, 15 May 2026 08:39:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778834347; cv=none; b=T06/0TOCU0IwscaH3Rx69/g7luB7Ktq0TUEG+8RGfDcQbRrdiQFLdr6cJrrCDhVH4sj6f/FAGJM0S7BcR9riojiovz3el4bUaU6vV2xErPasFzjFGupH8F7tiEuZ25GxmYeTwFi/pmDGs7IZeJ73lgBeq00hTR2eOpqWg1R6B9Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778834347; c=relaxed/simple; bh=EOwMc4cnN6mjXx+lNAo0TmGO3icV95F/RHTdgA6irSE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sIIlZVDSpSSZ2LDdfSsijX5VuusNoSW2/oYuQZjh7EtAzsVPeO/WRIQqyn10K62alWe5UJXEXrA9emsze3izUjfHyUNShYPw6R7g/kZsbV/4mAywqCwDoySxO0dqUoaEZzMuQ6UaA2RjOh39MFGietvBrM7czwq+1NoBeaqzgRc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=ryqJmcT6; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="ryqJmcT6" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 6DB54C000A5; Fri, 15 May 2026 08:39:54 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 2576C606FD; Fri, 15 May 2026 08:39:03 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 0A57C11AF8FCA; Fri, 15 May 2026 10:38:59 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1778834342; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=NmRmaxENCbzVfYEf7DmKsuBOHPJgb9fR4nlBynu9nU4=; b=ryqJmcT6nglwvjv5mhUGB5keB1lD9oi4oEmNW05gMM4teVmc3NyF120t8PjxebJe8Ad0HD bKdvH3JnFLnfag4tzYz100wmqwj7JuFwjYt/j2iICjJp741fhmyDNxYzGb6y6/JYIDQ/xz MyMZIj8kAGDGhg+DuSQ5UbyZwraa72SW/UL1uOijoFcE3nHl4mVAkWineh+vv2K1438X11 8dp3exgpbYUo/vGP0LG9j+4nk/uL/ABRWvlEB+l3oMrP2VAL1H9sJjdZJlkhHdXYnpIBMJ aOZ9fpjltXNVRHcgyT3dQh0nMxDY+ISP4pkd24rFs3q0p3UbI9cUBnZHJzxnKA== From: "Bastien Curutchet (Schneider Electric)" Date: Fri, 15 May 2026 10:38:42 +0200 Subject: [PATCH net-next v2 7/8] net: dsa: microchip: call DSA's phy_{read/write} to do mdio {read/write} Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260515-clean-ksz-2nd-series-v2-7-35a968a739f6@bootlin.com> References: <20260515-clean-ksz-2nd-series-v2-0-35a968a739f6@bootlin.com> In-Reply-To: <20260515-clean-ksz-2nd-series-v2-0-35a968a739f6@bootlin.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , Richard Cochran Cc: Pascal Eberhard , =?utf-8?q?Miqu=C3=A8l_Raynal?= , Thomas Petazzoni , Tristram Ha , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, "Bastien Curutchet (Schneider Electric)" X-Mailer: b4 0.14.3 X-Last-TLS-Session-Version: TLSv1.3 ksz_sw_mdio_read() and ksz_sw_mdio_write() respectively call ksz_dev_ops::phy_r() and ksz_dev_ops::phy_w() just like dsa_switch_ops::phy_read() and dsa_switch_ops::phy_write() do. Call dsa_switch_ops::phy_read() from ksz_sw_mdio_read() and dsa_switch_ops::phy_write() from ksz_sw_mdio_write() so we'll be able to get rid of the useless indirections provided by ksz_dev_ops in upcoming patch. Signed-off-by: Bastien Curutchet (Schneider Electric) --- drivers/net/dsa/microchip/ksz_common.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/micro= chip/ksz_common.c index f44974cf4e595..0d66592dff703 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -2260,22 +2260,18 @@ static void ksz_update_port_member(struct ksz_devic= e *dev, int port) static int ksz_sw_mdio_read(struct mii_bus *bus, int addr, int regnum) { struct ksz_device *dev =3D bus->priv; - u16 val; - int ret; - - ret =3D dev->dev_ops->r_phy(dev, addr, regnum, &val); - if (ret < 0) - return ret; + struct dsa_switch *ds =3D dev->ds; =20 - return val; + return ds->ops->phy_read(ds, addr, regnum); } =20 static int ksz_sw_mdio_write(struct mii_bus *bus, int addr, int regnum, u16 val) { struct ksz_device *dev =3D bus->priv; + struct dsa_switch *ds =3D dev->ds; =20 - return dev->dev_ops->w_phy(dev, addr, regnum, val); + return ds->ops->phy_write(ds, addr, regnum, val); } =20 /** --=20 2.53.0 From nobody Fri Jun 12 12:48:12 2026 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EB26042669D; Fri, 15 May 2026 08:39:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778834351; cv=none; b=lDpzifGcbnbKrGNAUu8vgRJYF+4INV9n6T/GRx5urBhPxPeLrQbHtzVZsxByKFD2fOUr0zf6sRmw28XSMGvcAHEmGLcMb2DPz2O8CtOJ/K6q0Wr+w4E95yTi7wvp+joobuyre/gKwofr1mVRah7WvTIxe2sgiIuBqqhsehYK6RI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778834351; c=relaxed/simple; bh=WlotFfFm26e+ll06bVwW7NXbn3tqGF41QjD1Gk0Umrk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CczsaKpKtWVnBsNIu/PcGRmpdnzk+Rb2HSSkKWDAiSkA3w7KzZPqI28RSc0h2mP0osJkUc27+O2W4X7iGLeG+xbYM+5x0johf+POw9u2cHgxY/xw4vDkDW5VrmYpCXY/1N46/V9/2J1pBPp3PltYbyq4w8NC82NyaqOXyt9hevI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=nbxgwGPd; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="nbxgwGPd" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 7C8571A1E92; Fri, 15 May 2026 08:39:06 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 4A949606FD; Fri, 15 May 2026 08:39:06 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 577D011AF901E; Fri, 15 May 2026 10:39:02 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1778834345; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=Ek+meJNWtx4HoWXvowMfK7LnKbneqWm3u6A9/CDQGgQ=; b=nbxgwGPdoA8c7lOpTOhdNjYz+x3gPGKk/wagvnL3VttPBpcOGdHS4e0DC4us31v6YpSa+w IldXHaOfOlQ3viyMdtZ36Tued6oUHVb69z/pqQ4L7rjCLRdF/ssJejNbr7YYLblLco6MZg 9Fd6alYO+ELp5Mc/dnbi8Xu33U2ctKqKCpp18AQ06iEWoBs7CgSprnE3+Ru3NMvMv0lgio hocZBql0G5LTNCoYQn7AAiJ7kOgvYvoknoysqspBORYyXYeKZ1YyRL/ntCacsEk8t50GS/ yRX3O6075RAR9a2N1vFA7xkh6xmwf0LV7ohnkaZIFKsbQtFVoJj0szLLFI1tpw== From: "Bastien Curutchet (Schneider Electric)" Date: Fri, 15 May 2026 10:38:43 +0200 Subject: [PATCH net-next v2 8/8] net: dsa: microchip: bypass dev_ops for phy_read()/phy_write() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260515-clean-ksz-2nd-series-v2-8-35a968a739f6@bootlin.com> References: <20260515-clean-ksz-2nd-series-v2-0-35a968a739f6@bootlin.com> In-Reply-To: <20260515-clean-ksz-2nd-series-v2-0-35a968a739f6@bootlin.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Russell King , Richard Cochran Cc: Pascal Eberhard , =?utf-8?q?Miqu=C3=A8l_Raynal?= , Thomas Petazzoni , Tristram Ha , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, "Bastien Curutchet (Schneider Electric)" X-Mailer: b4 0.14.3 X-Last-TLS-Session-Version: TLSv1.3 phy_read() and phy_write() are handled through common functions that redirect the treatment to ksz_dev_ops callbacks. This layer of indirection isn't needed since we now have a dsa_switch_ops for each kind of switch Remove one indirection layer for KSZ switches, by connecting the ksz_dev_ops::phy_r() and ksz_dev_ops::phy_w() operations directly to dsa_switch_ops. Remove the now unused phy_r()/phy_w() callbacks from ksz_dev_ops. Signed-off-by: Bastien Curutchet (Schneider Electric) --- drivers/net/dsa/microchip/ksz8.c | 68 ++++++++++++++++++++++++++--= ---- drivers/net/dsa/microchip/ksz9477.c | 31 +++++++++++++-- drivers/net/dsa/microchip/ksz_common.c | 25 ------------ drivers/net/dsa/microchip/ksz_common.h | 4 -- drivers/net/dsa/microchip/lan937x_main.c | 29 ++++++++++---- 5 files changed, 104 insertions(+), 53 deletions(-) diff --git a/drivers/net/dsa/microchip/ksz8.c b/drivers/net/dsa/microchip/k= sz8.c index 09968aec65063..0f84b2e7d25d8 100644 --- a/drivers/net/dsa/microchip/ksz8.c +++ b/drivers/net/dsa/microchip/ksz8.c @@ -1057,6 +1057,19 @@ static int ksz8_r_phy(struct ksz_device *dev, u16 ph= y, u16 reg, u16 *val) return 0; } =20 +static int ksz8_phy_read16(struct dsa_switch *ds, int addr, int reg) +{ + struct ksz_device *dev =3D ds->priv; + u16 val =3D 0xffff; + int ret; + + ret =3D ksz8_r_phy(dev, addr, reg, &val); + if (ret) + return ret; + + return val; +} + /** * ksz8_w_phy_ctrl - Translates and writes to the SMI interface from a MII= M PHY * Control register (Reg. 31). @@ -1266,6 +1279,18 @@ static int ksz8_w_phy(struct ksz_device *dev, u16 ph= y, u16 reg, u16 val) return 0; } =20 +static int ksz8_phy_write16(struct dsa_switch *ds, int addr, int reg, u16 = val) +{ + struct ksz_device *dev =3D ds->priv; + int ret; + + ret =3D ksz8_w_phy(dev, addr, reg, val); + if (ret) + return ret; + + return 0; +} + static void ksz8_cfg_port_member(struct ksz_device *dev, int port, u8 memb= er) { int offset =3D P_MIRROR_CTRL; @@ -2194,6 +2219,19 @@ static int ksz8463_r_phy(struct ksz_device *dev, u16= phy, u16 reg, u16 *val) return 0; } =20 +static int ksz8463_phy_read16(struct dsa_switch *ds, int addr, int reg) +{ + struct ksz_device *dev =3D ds->priv; + u16 val =3D 0xffff; + int ret; + + ret =3D ksz8463_r_phy(dev, addr, reg, &val); + if (ret) + return ret; + + return val; +} + static int ksz8463_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val) { u16 sw_reg =3D 0; @@ -2222,6 +2260,18 @@ static int ksz8463_w_phy(struct ksz_device *dev, u16= phy, u16 reg, u16 val) return 0; } =20 +static int ksz8463_phy_write16(struct dsa_switch *ds, int addr, int reg, u= 16 val) +{ + struct ksz_device *dev =3D ds->priv; + int ret; + + ret =3D ksz8463_w_phy(dev, addr, reg, val); + if (ret) + return ret; + + return 0; +} + static int ksz8_switch_init(struct ksz_device *dev) { dev->cpu_port =3D fls(dev->info->cpu_ports) - 1; @@ -2330,8 +2380,6 @@ const struct phylink_mac_ops ksz8_phylink_mac_ops =3D= { const struct ksz_dev_ops ksz8463_dev_ops =3D { .get_port_addr =3D ksz8463_get_port_addr, .cfg_port_member =3D ksz8_cfg_port_member, - .r_phy =3D ksz8463_r_phy, - .w_phy =3D ksz8463_w_phy, .r_mib_cnt =3D ksz8_r_mib_cnt, .r_mib_pkt =3D ksz8_r_mib_pkt, .r_mib_stat64 =3D ksz88xx_r_mib_stats64, @@ -2343,8 +2391,6 @@ const struct ksz_dev_ops ksz8463_dev_ops =3D { const struct ksz_dev_ops ksz87xx_dev_ops =3D { .get_port_addr =3D ksz8_get_port_addr, .cfg_port_member =3D ksz8_cfg_port_member, - .r_phy =3D ksz8_r_phy, - .w_phy =3D ksz8_w_phy, .r_mib_cnt =3D ksz8_r_mib_cnt, .r_mib_pkt =3D ksz8_r_mib_pkt, .r_mib_stat64 =3D ksz_r_mib_stats64, @@ -2359,8 +2405,6 @@ const struct ksz_dev_ops ksz87xx_dev_ops =3D { const struct ksz_dev_ops ksz88xx_dev_ops =3D { .get_port_addr =3D ksz8_get_port_addr, .cfg_port_member =3D ksz8_cfg_port_member, - .r_phy =3D ksz8_r_phy, - .w_phy =3D ksz8_w_phy, .r_mib_cnt =3D ksz8_r_mib_cnt, .r_mib_pkt =3D ksz8_r_mib_pkt, .r_mib_stat64 =3D ksz88xx_r_mib_stats64, @@ -2378,8 +2422,8 @@ const struct dsa_switch_ops ksz8463_switch_ops =3D { .get_phy_flags =3D ksz_get_phy_flags, .setup =3D ksz8_setup, .teardown =3D ksz_teardown, - .phy_read =3D ksz_phy_read16, - .phy_write =3D ksz_phy_write16, + .phy_read =3D ksz8463_phy_read16, + .phy_write =3D ksz8463_phy_write16, .phylink_get_caps =3D ksz8_phylink_get_caps, .port_setup =3D ksz8_dsa_port_setup, .get_strings =3D ksz_get_strings, @@ -2438,8 +2482,8 @@ const struct dsa_switch_ops ksz87xx_switch_ops =3D { .get_phy_flags =3D ksz_get_phy_flags, .setup =3D ksz8_setup, .teardown =3D ksz_teardown, - .phy_read =3D ksz_phy_read16, - .phy_write =3D ksz_phy_write16, + .phy_read =3D ksz8_phy_read16, + .phy_write =3D ksz8_phy_write16, .phylink_get_caps =3D ksz8_phylink_get_caps, .port_setup =3D ksz8_dsa_port_setup, .get_strings =3D ksz_get_strings, @@ -2498,8 +2542,8 @@ const struct dsa_switch_ops ksz88xx_switch_ops =3D { .get_phy_flags =3D ksz_get_phy_flags, .setup =3D ksz8_setup, .teardown =3D ksz_teardown, - .phy_read =3D ksz_phy_read16, - .phy_write =3D ksz_phy_write16, + .phy_read =3D ksz8_phy_read16, + .phy_write =3D ksz8_phy_write16, .phylink_get_caps =3D ksz8_phylink_get_caps, .port_setup =3D ksz8_dsa_port_setup, .get_strings =3D ksz_get_strings, diff --git a/drivers/net/dsa/microchip/ksz9477.c b/drivers/net/dsa/microchi= p/ksz9477.c index aac7fc478eda8..c1395322e54ba 100644 --- a/drivers/net/dsa/microchip/ksz9477.c +++ b/drivers/net/dsa/microchip/ksz9477.c @@ -575,6 +575,19 @@ static int ksz9477_r_phy(struct ksz_device *dev, u16 a= ddr, u16 reg, u16 *data) return 0; } =20 +static int ksz9477_phy_read16(struct dsa_switch *ds, int addr, int reg) +{ + struct ksz_device *dev =3D ds->priv; + u16 val =3D 0xffff; + int ret; + + ret =3D ksz9477_r_phy(dev, addr, reg, &val); + if (ret) + return ret; + + return val; +} + static int ksz9477_w_phy(struct ksz_device *dev, u16 addr, u16 reg, u16 va= l) { u32 mask, val32; @@ -600,6 +613,18 @@ static int ksz9477_w_phy(struct ksz_device *dev, u16 a= ddr, u16 reg, u16 val) return ksz_prmw32(dev, addr, 0x100 + (reg << 1), mask, val32); } =20 +static int ksz9477_phy_write16(struct dsa_switch *ds, int addr, int reg, u= 16 val) +{ + struct ksz_device *dev =3D ds->priv; + int ret; + + ret =3D ksz9477_w_phy(dev, addr, reg, val); + if (ret) + return ret; + + return 0; +} + void ksz9477_cfg_port_member(struct ksz_device *dev, int port, u8 member) { ksz_pwrite32(dev, port, REG_PORT_VLAN_MEMBERSHIP__4, member); @@ -1912,8 +1937,6 @@ const struct phylink_mac_ops ksz9477_phylink_mac_ops = =3D { const struct ksz_dev_ops ksz9477_dev_ops =3D { .get_port_addr =3D ksz9477_get_port_addr, .cfg_port_member =3D ksz9477_cfg_port_member, - .r_phy =3D ksz9477_r_phy, - .w_phy =3D ksz9477_w_phy, .r_mib_cnt =3D ksz9477_r_mib_cnt, .r_mib_pkt =3D ksz9477_r_mib_pkt, .r_mib_stat64 =3D ksz_r_mib_stats64, @@ -1932,8 +1955,8 @@ const struct dsa_switch_ops ksz9477_switch_ops =3D { .get_phy_flags =3D ksz_get_phy_flags, .setup =3D ksz9477_setup, .teardown =3D ksz_teardown, - .phy_read =3D ksz_phy_read16, - .phy_write =3D ksz_phy_write16, + .phy_read =3D ksz9477_phy_read16, + .phy_write =3D ksz9477_phy_write16, .phylink_get_caps =3D ksz9477_phylink_get_caps, .port_setup =3D ksz9477_dsa_port_setup, .set_ageing_time =3D ksz9477_set_ageing_time, diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/micro= chip/ksz_common.c index 0d66592dff703..95aa3ab5b5719 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -2838,31 +2838,6 @@ void ksz_init_mib_timer(struct ksz_device *dev) } } =20 -int ksz_phy_read16(struct dsa_switch *ds, int addr, int reg) -{ - struct ksz_device *dev =3D ds->priv; - u16 val =3D 0xffff; - int ret; - - ret =3D dev->dev_ops->r_phy(dev, addr, reg, &val); - if (ret) - return ret; - - return val; -} - -int ksz_phy_write16(struct dsa_switch *ds, int addr, int reg, u16 val) -{ - struct ksz_device *dev =3D ds->priv; - int ret; - - ret =3D dev->dev_ops->w_phy(dev, addr, reg, val); - if (ret) - return ret; - - return 0; -} - u32 ksz_get_phy_flags(struct dsa_switch *ds, int port) { struct ksz_device *dev =3D ds->priv; diff --git a/drivers/net/dsa/microchip/ksz_common.h b/drivers/net/dsa/micro= chip/ksz_common.h index c66d75347c6cb..b67038cf1bd09 100644 --- a/drivers/net/dsa/microchip/ksz_common.h +++ b/drivers/net/dsa/microchip/ksz_common.h @@ -398,8 +398,6 @@ struct ksz_dev_ops { * - Negative error code on failure (e.g., invalid configuration). */ int (*create_phy_addr_map)(struct ksz_device *dev, bool side_mdio); - int (*r_phy)(struct ksz_device *dev, u16 phy, u16 reg, u16 *val); - int (*w_phy)(struct ksz_device *dev, u16 phy, u16 reg, u16 val); void (*r_mib_cnt)(struct ksz_device *dev, int port, u16 addr, u64 *cnt); void (*r_mib_pkt)(struct ksz_device *dev, int port, u16 addr, @@ -442,8 +440,6 @@ void ksz_switch_macaddr_put(struct dsa_switch *ds); void ksz_switch_shutdown(struct ksz_device *dev); int ksz_handle_wake_reason(struct ksz_device *dev, int port); =20 -int ksz_phy_read16(struct dsa_switch *ds, int addr, int reg); -int ksz_phy_write16(struct dsa_switch *ds, int addr, int reg, u16 val); u32 ksz_get_phy_flags(struct dsa_switch *ds, int port); =20 int ksz_sset_count(struct dsa_switch *ds, int port, int sset); diff --git a/drivers/net/dsa/microchip/lan937x_main.c b/drivers/net/dsa/mic= rochip/lan937x_main.c index 690f99da0bfee..536153886f7b8 100644 --- a/drivers/net/dsa/microchip/lan937x_main.c +++ b/drivers/net/dsa/microchip/lan937x_main.c @@ -334,14 +334,29 @@ static int lan937x_internal_phy_read(struct ksz_devic= e *dev, int addr, int reg, return ksz_read16(dev, REG_VPHY_IND_DATA__2, val); } =20 -static int lan937x_r_phy(struct ksz_device *dev, u16 addr, u16 reg, u16 *d= ata) +static int lan937x_phy_read16(struct dsa_switch *ds, int addr, int reg) { - return lan937x_internal_phy_read(dev, addr, reg, data); + struct ksz_device *dev =3D ds->priv; + u16 val =3D 0xffff; + int ret; + + ret =3D lan937x_internal_phy_read(dev, addr, reg, &val); + if (ret) + return ret; + + return val; } =20 -static int lan937x_w_phy(struct ksz_device *dev, u16 addr, u16 reg, u16 va= l) +static int lan937x_phy_write16(struct dsa_switch *ds, int addr, int reg, u= 16 val) { - return lan937x_internal_phy_write(dev, addr, reg, val); + struct ksz_device *dev =3D ds->priv; + int ret; + + ret =3D lan937x_internal_phy_write(dev, addr, reg, val); + if (ret) + return ret; + + return 0; } =20 static int lan937x_reset_switch(struct ksz_device *dev) @@ -818,8 +833,6 @@ const struct ksz_dev_ops lan937x_dev_ops =3D { .cfg_port_member =3D ksz9477_cfg_port_member, .mdio_bus_preinit =3D lan937x_mdio_bus_preinit, .create_phy_addr_map =3D lan937x_create_phy_addr_map, - .r_phy =3D lan937x_r_phy, - .w_phy =3D lan937x_w_phy, .r_mib_cnt =3D ksz9477_r_mib_cnt, .r_mib_pkt =3D ksz9477_r_mib_pkt, .r_mib_stat64 =3D ksz_r_mib_stats64, @@ -836,8 +849,8 @@ const struct dsa_switch_ops lan937x_switch_ops =3D { .get_phy_flags =3D ksz_get_phy_flags, .setup =3D lan937x_setup, .teardown =3D ksz_teardown, - .phy_read =3D ksz_phy_read16, - .phy_write =3D ksz_phy_write16, + .phy_read =3D lan937x_phy_read16, + .phy_write =3D lan937x_phy_write16, .phylink_get_caps =3D lan937x_phylink_get_caps, .port_setup =3D lan937x_dsa_port_setup, .set_ageing_time =3D lan937x_set_ageing_time, --=20 2.53.0