From nobody Sun May 24 21:39:23 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 1F048384CF6 for ; Thu, 21 May 2026 06:12:48 +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=1779343971; cv=none; b=aGUUjg53PmschppoD7q2RtZJQphWbaQTmaYICj3xOK7teHyET4ij1WFXIYuS7p3NVTjlDvDreFZXyit1K8p9KNHW7CmH8at6JWKaOwWsFZ5DJsgNUxxfGMbbjbfW9SRHwqbaiyvUrLkXzlsLnxbQ+lI/4mEEY41fCYEILEtI4W4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779343971; c=relaxed/simple; bh=ZyHqgUUbaGBpEzIbSDJO60Y9NW5NbPWwaXLD7lFlaGE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=E+cN+c/Ex1k8h77VeWxl9p0ZbUQasfuoChZpONrTCOE0sy8TnUBWkMhlqGolysGNhzxiaxEkcNBq2uLt2YF86DewW51wQN94WG8hrkGXnRtlIy9IMQbYklFKJmR3vwJySQ2KpuziKlBHfIGyo6EdnCkRY/YQ1MWtA0BP7bUsv7E= 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=KR1p5BDX; 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="KR1p5BDX" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id C87EC1A365A; Thu, 21 May 2026 06:12:47 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 9C64360718; Thu, 21 May 2026 06:12:47 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 45CD9107EA6B7; Thu, 21 May 2026 08:12:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779343966; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=hSyXQPdeEcJyfgWN1LkTnOQpvEunR5kMnuz5yyCH/+U=; b=KR1p5BDXGfe1lk7KxyFqP92JUqUh5r1h/ar8R6u3Lk9X5U7hfFNvAlX5vPN0zqlV06o+yQ j1sOXOX/zJg7d3Zq3fcUWXvohOn7COCJNVc1DWXmP/DWU/2KVUAk/Z0NBTn0KX6eK579UA Cwq8VyTqbpci3Taby2Q//hrrpP9oIgmGLfsvhQLrE8+tP/ZvH9EZfwtdXLywILuFTbb0wJ RFusXDFgjWkRMnG3iROkyEFr6+QCy0uiIFJnIcR0aLiaMr7eK9KplwwTfwdhL8x9AXj894 j6cBKi3x874+2Z5SpGHRfq75z8J8ABCmf8UNhH59iK/FdS7nVG4Ljlsvn1Br2A== From: Bastien Curutchet Date: Thu, 21 May 2026 08:12:36 +0200 Subject: [PATCH net-next v3 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: <20260521-clean-ksz-2nd-series-v3-1-75c38971c19a@bootlin.com> References: <20260521-clean-ksz-2nd-series-v3-0-75c38971c19a@bootlin.com> In-Reply-To: <20260521-clean-ksz-2nd-series-v3-0-75c38971c19a@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 | 38 ++++++++--------------------= ---- drivers/net/dsa/microchip/ksz_common.h | 1 - drivers/net/dsa/microchip/lan937x_main.c | 6 ----- 5 files changed, 9 insertions(+), 50 deletions(-) diff --git a/drivers/net/dsa/microchip/ksz8.c b/drivers/net/dsa/microchip/k= sz8.c index 825133e9ce6e..ccbc3480717f 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 65fd07ef73ad..88a5ff62aae8 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 4a7bcd1a9392..b1fe7428fc3e 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -4162,24 +4162,19 @@ int ksz_set_wol(struct dsa_switch *ds, int port, * ksz_wol_pre_shutdown - Prepares the switch device for shutdown while * considering Wake-on-LAN (WoL) settings. * @dev: The switch device structure. - * @wol_enabled: Pointer to a boolean which will be set to true if WoL is - * enabled on any port. * * This function prepares the switch device for a safe shutdown while taki= ng - * into account the Wake-on-LAN (WoL) settings on the user ports. It updat= es - * the wol_enabled flag accordingly to reflect whether WoL is active on any - * port. + * into account the Wake-on-LAN (WoL) settings on the user ports. */ -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 +4187,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 +4196,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 +4475,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 +4930,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 +4951,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 f6dad256a550..1cdb6661729a 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 f84548168b37..778e32f568df 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.54.0 From nobody Sun May 24 21:39:23 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 E81173947B7 for ; Thu, 21 May 2026 06:12:51 +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=1779343973; cv=none; b=fQYklEzaOx3Vs6jUEpHVhrKY7rNVQ/nT5Wu+gsmIemBCzW8t09OIJi2BZOLSy5DhX176t+IXeLnaFB7QLp4tOHLUX+CSVwY3fsmvWvjrhd1/c3EZwWgfHQTKQJVDvgsWCKii2gXzjNSq37RHbei1g2iPpad0XL9AcQZI3yef1uI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779343973; c=relaxed/simple; bh=6n73pFhTpcZLxQRfz4ivY+stp1pbFDEiow6/MWEdWGU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PzxCaLK8eWIh4FAA04SCIqb9VZ7xdcba7Hmp81M6C+3MVsuacbOOgxCjmWnk15Q0M0tkl/NmRM+Kj/26bF6YoTxKzzFBalNbnwIDeyIsMk9omH53CKCXF/cRPu/yJDzuPVNxquU3lMPjyhkOZSpl7mTipRXgyyBAxzqHIm03bhk= 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=uAGmaRju; 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="uAGmaRju" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 2D3394E42D17; Thu, 21 May 2026 06:12:50 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id ED8C460718; Thu, 21 May 2026 06:12:49 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id C5F54107E8EC0; Thu, 21 May 2026 08:12:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779343968; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=KE7vzd75/LEUS+3wmexVFD85jTpKRD0C/qyM19ErV0g=; b=uAGmaRjuJ7w2rO0i0KClQBiJXOQKzt/f/++BJETd+9GWt8txBUFsmW37VEsvCgVMWKEAlC ddlDOULvdY6dg4bi4JDa5ZYDfjDHz2yIrmXc6ORHLIz5hz7KrH0Taij4wFAcBhMu8jtG8d jbHDW/0JmsAFA9Itd45bB3Ko3HskydwWzC6ERMU9IBfsGEDrQbwXVRnv5jv6HbHqSKhpSc pdPT2zfUl/49Ww5iasEFpAK5RUfBD8Akk7n+fNHhl4eMCZFz/JgpsUJHkgWtquZRA29ceD k0dL2UKDv6NIH3qkDblyL1O5KuyQK8lPmXIOeolXxgrcUrzSVo9LbxtB379Bag== From: Bastien Curutchet Date: Thu, 21 May 2026 08:12:37 +0200 Subject: [PATCH net-next v3 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: <20260521-clean-ksz-2nd-series-v3-2-75c38971c19a@bootlin.com> References: <20260521-clean-ksz-2nd-series-v3-0-75c38971c19a@bootlin.com> In-Reply-To: <20260521-clean-ksz-2nd-series-v3-0-75c38971c19a@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 b1fe7428fc3e..185131399742 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; @@ -4694,7 +4692,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 1cdb6661729a..5fad56c2d067 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 778e32f568df..ecb072cd9981 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.54.0 From nobody Sun May 24 21:39:23 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 DD580394EA5 for ; Thu, 21 May 2026 06:12:53 +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=1779343980; cv=none; b=CF+JWxOlNRw5j14Wm6KOUwIVyA4qKVDKsT/M91TPnn2lmqR/rwCrjunWklqGyGILgJgaytxw1yEh9TzEGsAl2h5goicRqsYu29zXbvZy2vF0qQjpJdYHDKDVpvHtKBRHhTbi7GqKrQ+RGkjnrR4Orx9QrKnDXQ9PLm0k4f/ySH4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779343980; c=relaxed/simple; bh=NltFvwOAM4viNi+4j8BaeJsOC5LZBG6x/Fk+OleHO3c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cJF79fJ2oRm+aEXtBPodrIRcnykgVRlNT5IUuecclnkJNioUMpDlQ+oW52zpykLZFFcDjidL/m8VaeABuyrXmEsw5XuD7dVDfINtTG3lqPK4eagqRIXjUGsQdqZu4tMuxiJd9cz0jqTKM3Lyl1OLJo+L9+xJPhOH2uKISvpYLAw= 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=PKG3zkUW; 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="PKG3zkUW" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 905C64E42D1A; Thu, 21 May 2026 06:12:52 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 64CB060718; Thu, 21 May 2026 06:12:52 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 2B15B107EA39F; Thu, 21 May 2026 08:12:49 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779343971; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=nmENppGHEm6dYHHEJm+QZ3PPtAuIOcxQyD/PO6i+mZY=; b=PKG3zkUWfLHyOAqr5hPT1y0tbw2kbTgd8HYWtBjcWQdKuf2DHyvOGKeUxqyjjdpF7C4teh ivQW0idk70zmnREDUL4v1YzO5w2vRdVNQ61+Y9wW73qEjFH8G4UN4tw3eV+61qckW8u9H4 Kea74VoMoPvxhf4iclGvHaGgCV8FyqiynF/OD40AxSXHa97wZcHtrr3v+xWJoCn3VwMhRq rQvRNJs2x5ubj+qgjtGc8evjEkqLLOB4y0PgRIMuYBv4wUPm99jWb73UgA4rKnK9sDfgXL 43Jx7CgPj6jlRSRpTqP743dwfITk2tQzey7OEqP5pkVvax19qIHnF26hZNTUmA== From: Bastien Curutchet Date: Thu, 21 May 2026 08:12:38 +0200 Subject: [PATCH net-next v3 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: <20260521-clean-ksz-2nd-series-v3-3-75c38971c19a@bootlin.com> References: <20260521-clean-ksz-2nd-series-v3-0-75c38971c19a@bootlin.com> In-Reply-To: <20260521-clean-ksz-2nd-series-v3-0-75c38971c19a@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 88a5ff62aae8..7385aa4e788a 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.54.0 From nobody Sun May 24 21:39:23 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 E21C13932D8 for ; Thu, 21 May 2026 06:12:56 +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=1779343981; cv=none; b=sZUyqfVIHMt+/2B00KsYZmNWgrZXVQdy3nhJ85w5g8fru23bnH6GcIQgAJGVFGP1Qg2TIpJmmCh3GuOUuXv7jnJxNWrnzMItycZXqzF9cY0v30Z13SvU0P73zu/f9jVcWzcFtIYB9yrstMo5E98QTZ3HIKhPXLDYWX3gjCRKkbo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779343981; c=relaxed/simple; bh=jrCjh6Gf7mvqfUCo/Z+WojGkoMK+qVYNKi2MK19UZDw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=e1qgizXncw2TxZS1bImNOIBLOpKmhOH203IrEp8nmL3XOgs9zqiqoK1t4v1+mDQ+GEUQLltTz07rw36NnNtnZ5OFAvtgzhAPOGdIBjd614PvGfIOOBZPX4ynh2UybQbUlPCt0iFAYk9vCetC9/EpYK3bUK946sSSJidip1G2PBM= 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=U9o+ZvT0; 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="U9o+ZvT0" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 9A11A1A365A; Thu, 21 May 2026 06:12:55 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 6767D60718; Thu, 21 May 2026 06:12:55 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 9DD57107EA6B7; Thu, 21 May 2026 08:12:51 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779343973; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=AqtCy147yU/f+Lx+VwPk3eev5t8Y0ZJDO+q3HAMz+74=; b=U9o+ZvT0YszLH84e5C+wWY1yo02d5kSWKPg4rwlpoPzX/W6I83Am2THvUlKcsy6z10SnhA vL/N02oD7A6N8fEoNL/KenDEiG0mXYc7myIvMV6QRBGghR0Yn6ahMOiF00XoXSDMX/XYGs sh/GLVN2lAJ6NMUMIF/YN8AtIbOAVNVCPQt1XfGwoJxcarViSJOrhV8QK0UOvqLlSAlaFH W42zsK7n0oeeywFwu+goqk5YFCSNB1Bbvk2KH3wm4a92/0MdI/SU0WTVP/WDCsZGu1Li0v 0i/ZdHosWsWbKxsgsBFs1g9LRtWkqKVaP/dE9JVX2T/BaNjy+iSFuawa0AKipQ== From: Bastien Curutchet Date: Thu, 21 May 2026 08:12:39 +0200 Subject: [PATCH net-next v3 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: <20260521-clean-ksz-2nd-series-v3-4-75c38971c19a@bootlin.com> References: <20260521-clean-ksz-2nd-series-v3-0-75c38971c19a@bootlin.com> In-Reply-To: <20260521-clean-ksz-2nd-series-v3-0-75c38971c19a@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 ccbc3480717f..acc898c68f98 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.54.0 From nobody Sun May 24 21:39:23 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 299C63939B1 for ; Thu, 21 May 2026 06:13:01 +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=1779343987; cv=none; b=BNiwCAb/xDG9rwgNkXZSgI4OjlDPXoXsW2WenJt6dkEhSwzDPTh+2OdhZWPAnWEC4q3DUb0uX/wapZqNdBhS6SgMV7cAUi/ahHOtoqMMcNVKzsh3fvR7/4N8x6jxYQXIXX0G32HYCj1P5y7n0AM4QuvSHCJUJlePfPYwruJjCDA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779343987; c=relaxed/simple; bh=ld91UU0L0HSmWPpiKNfsfm48VRA3O2pevF+WesUfJ6g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jIym2QCiquwZltneGEQhZsHLTUaXemWnFR+4MxEJtJYCQQWbKXpIf4niyYgCkDIpMAtF5SIFOWxaKZYRSsgDAyygY5i7MlXHqzNMJ+RhvJQqv7Yj03f62A19iDbv/EiJe0EiItGOs/Y5DGTjUcIvKsX5vaDayusutGX/H5/qbBQ= 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=Zx9PTO0c; 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="Zx9PTO0c" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id E43684E42D1B; Thu, 21 May 2026 06:12:57 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id B8E4660718; Thu, 21 May 2026 06:12:57 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 2C965107EA6BB; Thu, 21 May 2026 08:12:54 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779343976; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=sId2BZ8mqqG0hBMYDKCUp5BU4QJP1FhJ+kadyR6vd+w=; b=Zx9PTO0cE5/VKgqGIqj1Age5Eq+nsYgtxucuS4yE9ki4FYTNNosrvNpkn58L9zuQloaRUZ cjY/4ir99MZzynD3JH/eUKwm5nerWXdM7psirfnCQbmTAz2YoI/M9GhpMIjbc2CRnzfhCq 3MEm++gn/u/eDWfH5EeNirEZwmgN2nM147D8nlWOKPNrxVy477pzYi0DAQG25/IEtp4CmT EoCYq+VSNWq00+vVvzFvXUIkg7wqJErsvOwLzD/9uMZCR3RcQQDkPcW0Hf9yIZMkgfKvw1 irHu+ccqTEHUsjSWJO2FO+q04oUqipn17fA0attoGvLA4EPVWceu6LqZ/0L7XQ== From: Bastien Curutchet Date: Thu, 21 May 2026 08:12:40 +0200 Subject: [PATCH net-next v3 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: <20260521-clean-ksz-2nd-series-v3-5-75c38971c19a@bootlin.com> References: <20260521-clean-ksz-2nd-series-v3-0-75c38971c19a@bootlin.com> In-Reply-To: <20260521-clean-ksz-2nd-series-v3-0-75c38971c19a@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 185131399742..103f79179446 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 5fad56c2d067..f80034488cd1 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.54.0 From nobody Sun May 24 21:39:23 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 C76B3386C2C for ; Thu, 21 May 2026 06:13:00 +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=1779343986; cv=none; b=YoXbITtNUdcVhGvUALpwe+51JPn0D7uO/KW7SxIUqLtNMBhzYd0q57G0xEQdT1XcOs38CKu3BmZ118Z8LAMs4Ff33vCJKNPeyJPoodXbJCmnWqRh5SCCDX36KuBCtxT3D5u9B572CPyTTdQ3QRGoBT3yvxIOlxQFjL7mGt+ekyI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779343986; c=relaxed/simple; bh=Md0wzikNPCf+TPpnxuNFjBHTLVmKpSKpRaxCBqmFBfw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RguIJlHMMHKsk+W0NHHCW7FJxcYQlzj7MSTRr8mYlmtSpGJW3e0vy+GcvzWa7qiGth1niJTBsLITPR/TYkPjwmpmXu0Vdlhxuvrsu7WS5mw0pq+Ep2omDtJMZCsQOV/8KSO7PwBIaXSZMZzOC4IwwePPT8lVWYdUBYHb0gPquGo= 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=tvbVXjAW; 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="tvbVXjAW" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id B1D76C2C64E; Thu, 21 May 2026 06:13:53 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id B4DDE60718; Thu, 21 May 2026 06:12:59 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id CACFB107EA6B9; Thu, 21 May 2026 08:12:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779343978; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=A28nketZzT1FJfwd+v8JB6DlzVc1Dye+qMWrkC+5QO4=; b=tvbVXjAW8mi9YTkHFjC1Aw3N8IzgkECm7iM1ap/Rj9Q8K3aslKZ61cTpbxDKcFyMCO//pm fWlqquQ7YD0e2gr0UxgjBHlTLkNwuGJ5igGQ4iNz1mZeEaTagLSXvoepv/b4/d4vWSNjDZ 6XSQ73FGQDsbFYbTT0/iuU8qHawM7GY8xnE9SuXuBcoJvtWoNwGJaW2zyKTe/0KwE82ZGX pFi+rlgfV7r5MHKI2y9fGpaXyEdpCXgsHn/Boi73ARaA2skjGxMb1g3/wgkOenHU+S+Amd WVv4fgosnykECbndAORa3JKYMs5wCtxYVZAu66eCyCzsEXZpIbcXKsbSL3gkTQ== From: "Bastien Curutchet (Schneider Electric)" Date: Thu, 21 May 2026 08:12:41 +0200 Subject: [PATCH net-next v3 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: <20260521-clean-ksz-2nd-series-v3-6-75c38971c19a@bootlin.com> References: <20260521-clean-ksz-2nd-series-v3-0-75c38971c19a@bootlin.com> In-Reply-To: <20260521-clean-ksz-2nd-series-v3-0-75c38971c19a@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 acc898c68f98..09968aec6506 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 7385aa4e788a..aac7fc478eda 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 103f79179446..e3f481c32e09 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 f80034488cd1..c66d75347c6c 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 ecb072cd9981..690f99da0bfe 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.54.0 From nobody Sun May 24 21:39:23 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 4F264386552 for ; Thu, 21 May 2026 06:13:05 +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=1779343986; cv=none; b=ZSj2ebj0lorElWsnzRc1N7z+8K8tLvfAeYB8CRsztdqTyEAU9MHfYHSn6+JiccJ5VC/93DI00AxKnYyUpylzvparNy6icwH/oMhF1eNFuhuCQ9F2/PXdJU1uTdt9B7p2D7HBfrwWhS6BrfLHHZtlFlZZvXAeJI+c5beohzSVTe8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779343986; c=relaxed/simple; bh=88Y5nri+OcUKFzuUVBLjul49JnfAs8UVFOYggCbYR7c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Rpnj3ETlv2IcQZwjJizMJY9K7tp9mlx04jJp0peCxbEMrEn2hUS7T7LHijuNYsQwUGNorpM0oi3POEUBhYSjxkM/dMSF8DWEdjF7xzK8VcsW42aCoAyB+07eCuZIbShSJmW0SgosUjYQE8KDmp7QgnLaEdgLK5f0Fu+B/rQF5DI= 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=Avgy8Kdj; 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="Avgy8Kdj" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 352B2C2C64D; Thu, 21 May 2026 06:13:56 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 36EFA60718; Thu, 21 May 2026 06:13:02 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id F23D3107EA6BA; Thu, 21 May 2026 08:12:58 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779343980; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=FC5x+tJvMo1AFUbcQhgQWVn89tnpJgMlVgF5WlY5jzs=; b=Avgy8Kdjl8QdELAx5ZpBvhUL4kcvs27x/5cttl7XWJXy3IAES57Fwx8r46LOGoz7ygDdw8 VxppLEk0iYnGaVTBcp3bX6LWxY1f8zEr5URbH0sa4inw3nGSncGni9yYpfcyXZiY/aEdV/ w6m5odJWbxQZAGESvnC1+QVQH4J4uawihcx/8NF/CX3azMCIO49v4qjkW4cARYxVp22fv6 7DtshroRYNi/6WXoph8dQNmHOyN6t2YqL2oK5hYmZKYtv/r5vtMG9IKv1WtvEzwhkYTFs0 W8/DADTa6d/H1YtAGIl+KU1rK+PzS24Hgkisc8MRkyP5MUABY/fPdc7ysQUbkQ== From: "Bastien Curutchet (Schneider Electric)" Date: Thu, 21 May 2026 08:12:42 +0200 Subject: [PATCH net-next v3 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: <20260521-clean-ksz-2nd-series-v3-7-75c38971c19a@bootlin.com> References: <20260521-clean-ksz-2nd-series-v3-0-75c38971c19a@bootlin.com> In-Reply-To: <20260521-clean-ksz-2nd-series-v3-0-75c38971c19a@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 e3f481c32e09..3c09bc8ffaec 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.54.0 From nobody Sun May 24 21:39:23 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 4F1CE384CF6; Thu, 21 May 2026 06:13:05 +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=1779343987; cv=none; b=WIOq+hkFVPPUrVozYDsqoEsFgIWB9fX/PK8Mh7NCJYhgKxJ4EZrs/VU/l5BSSDa0UTwOFg1GUpLxSesEgPm3F4gkYFiQuYMHxW2TaCSOs46zEGPpr1piNuk1RlSJK6Y1BYAE7us6BH4bQ9MFHJ3dz/40taYvN0wMwL2hDeYIb8Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779343987; c=relaxed/simple; bh=7bS6i8J5ujqhn019ZgqI1ZeDU3fL9lskmqBwHxM0YRc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Ud0am0Vp/xsvLTqdBFxg69m1tg9ZwJekYKdEzTlikt5OgSD36G9ng/lxr+p3TaFTrd32LyVRJu+3phTQEjZtWO8mcWPK5smAEBaT9QSxhSGYrv7CN4qPzbH75kvMgCsvM0YLT5uI0ue+YMqmwIKXZ7cbOIiAHZII9vZ0wT56H/4= 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=CnkaeMun; 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="CnkaeMun" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 1A83DC2C64F; Thu, 21 May 2026 06:13:58 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 1CB0460718; Thu, 21 May 2026 06:13:04 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 41B49107EA6BE; Thu, 21 May 2026 08:13:01 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1779343983; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=g627vnYilgadl7YKxNubEXPwJoMvFb1HQYQI6T7h0/k=; b=CnkaeMunR0vQEwoclZi6OYXgpAq4ulzPwp9hePRXbsWWcXGNnwz+VvE4mn/M1Hx8J6yhE3 5dy3Yd+6C5AmBA7vJDjaUkYmn/Uy3ZN5rWdDmFBfnBxuB0UjSLPmQcrVln2+g9snTXYeRo Kbv4+cZKQgVaalOo8fnJ/0Ss+qcPJeE3BdNDasADoRytgqni+zCPT1vZ2OUv54eF7fJfF5 EqWBxHn1jUTvM63xHD0lr7PsJc9KxUsgPULEoxSLu0G5H0etKHgGtyI4WkF9TFRUqLYLSW KMWZdPvw8byxXjqYZRPNiKMk7Vg3f7RwYPF8OWJtPXZjM7zhfBXTtrdxaZATzw== From: "Bastien Curutchet (Schneider Electric)" Date: Thu, 21 May 2026 08:12:43 +0200 Subject: [PATCH net-next v3 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: <20260521-clean-ksz-2nd-series-v3-8-75c38971c19a@bootlin.com> References: <20260521-clean-ksz-2nd-series-v3-0-75c38971c19a@bootlin.com> In-Reply-To: <20260521-clean-ksz-2nd-series-v3-0-75c38971c19a@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 09968aec6506..0f84b2e7d25d 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 aac7fc478eda..c1395322e54b 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 3c09bc8ffaec..57c8abfe0147 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 c66d75347c6c..b67038cf1bd0 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 690f99da0bfe..536153886f7b 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.54.0