From nobody Sat Jul 25 21:59:22 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 D097836920D; Mon, 13 Jul 2026 07:11:30 +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=1783926694; cv=none; b=mrLXi915fAKAhLeKQeB8ElHuosGm5kv0TJW748aJMbU4oAZeA+G8dHVHivwS5OjR2zQTi/aG9WImwOgqEqPrSgxp4wOVoxwVySArDLfSEKuUPv/CSLKd3q//hsPyo88RBt0PCuRPyGVjxPc5jP2Y6DIWG1NTfARGOSsd5Lpz/G8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783926694; c=relaxed/simple; bh=9+s59vVF/Gq4K01YMEay/qs0kVj7lrirrvWr/fntb7I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UG3ydC6wB8yyU8GRQQLDYkPXCGLcXyTskt55PB9afyvfCK88nZnHl16dyDrMooDBK97M5NJh0Dm+JhOdyh9v48bgdyKV0yHa8U37CnQBC0pxFG3sXql/scSAJebpCs5ExS+l0PbY4BDpjWKBqFuBAR5B5nOIvh4F4FAJMZDWZAQ= 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=ULONoqUn; 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="ULONoqUn" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 776274E40D82; Mon, 13 Jul 2026 07:11:29 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 4B96260341; Mon, 13 Jul 2026 07:11:29 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 1BBF711BD0B6C; Mon, 13 Jul 2026 09:11:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1783926687; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=MM4O3FKQ8UCoY9QGTkKJE3vnVRNbZTCtLocOkRLeTwM=; b=ULONoqUnPziRw6rQgDjVGCp5MxEBaqjt+lo97iqCE6kjbb3BmVn/UMSHjDd9RXy21oaUM8 VJeB50U0Op9J2oEyJcbykYdxNMp6KC49E2ipuvOwLiJal3UewNCwrIe6wuxi2+b7I1qpzP +4vZ1J/JlOzMiKclNxSW5yVGvA2+era+U9KztVorYyGZFrb2vxMMLnc6/A3Go9ay7WuA15 9HS61XMlUziergggbVxp9VkWnJuvAnYX012ZjZO6THrvPmy7weDlDwl+5dCukOVzRWLag5 OBefMHI18gIcyY7qvppveVeOL2X7aOlNzgRhkhPX2p3ajeIyWx66c3BsvxIPSQ== From: "Bastien Curutchet (Schneider Electric)" Date: Mon, 13 Jul 2026 09:11:20 +0200 Subject: [PATCH net-next v2 01/10] net: dsa: microchip: implement ksz8463_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: <20260713-ksz-new-ptp-v2-1-7209c05058ef@bootlin.com> References: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> In-Reply-To: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , Russell King , Simon Horman , Maxime Chevallier Cc: Pascal Eberhard , =?utf-8?q?Miqu=C3=A8l_Raynal?= , Thomas Petazzoni , 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 KSZ8463 uses the ksz8_setup() as setup() callback for its DSA operations. Its behavior is quite different than other KSZ8 switches, especially its interrupt scheme. Remove from the ksz8_setup()/ksz8_reset_switch() everything that is ksz8463-related. Create a dedicated ksz8463_setup() and a ksz8463_reset_switch() function. This new ksz8463_setup() is widely inspired from ksz8_setup, it has following differences: - it doesn't configure drive strength (not supported on KSZ8463) - it uses the ksz8463_reset_switch() - it doesn't call ksz8_handle_global_errata() (the handled errata only affects the KSZ87xx variant) - it doesn't configure IRQs. Note that ksz8_setup()'s IRQ initialization doesn't work for the KSZ8463 anyway. Proper support for it comes in upcoming patches. Remove the teardown implementation from the KSZ8463 operations. Since PTP and interrupts aren't setup, the common ksz_teardown() wouldn't do anything anyway. Signed-off-by: Bastien Curutchet (Schneider Electric) --- drivers/net/dsa/microchip/ksz8.c | 126 +++++++++++++++++++++++++++++++++++= ---- 1 file changed, 114 insertions(+), 12 deletions(-) diff --git a/drivers/net/dsa/microchip/ksz8.c b/drivers/net/dsa/microchip/k= sz8.c index c4c769028a20..5ed63f425013 100644 --- a/drivers/net/dsa/microchip/ksz8.c +++ b/drivers/net/dsa/microchip/ksz8.c @@ -181,6 +181,14 @@ static int ksz8_pme_pwrite8(struct ksz_device *dev, in= t port, int offset, u8 dat return ksz8_ind_write8(dev, table, (u8)(offset), data); } =20 +static int ksz8463_reset_switch(struct ksz_device *dev) +{ + ksz_cfg(dev, KSZ8463_REG_SW_RESET, KSZ8463_GLOBAL_SOFTWARE_RESET, true); + ksz_cfg(dev, KSZ8463_REG_SW_RESET, KSZ8463_GLOBAL_SOFTWARE_RESET, + false); + return 0; +} + static int ksz8_reset_switch(struct ksz_device *dev) { if (ksz_is_ksz88x3(dev)) { @@ -189,11 +197,6 @@ static int ksz8_reset_switch(struct ksz_device *dev) KSZ8863_GLOBAL_SOFTWARE_RESET | KSZ8863_PCS_RESET, true); ksz_cfg(dev, KSZ8863_REG_SW_RESET, KSZ8863_GLOBAL_SOFTWARE_RESET | KSZ8863_PCS_RESET, false); - } else if (ksz_is_ksz8463(dev)) { - ksz_cfg(dev, KSZ8463_REG_SW_RESET, - KSZ8463_GLOBAL_SOFTWARE_RESET, true); - ksz_cfg(dev, KSZ8463_REG_SW_RESET, - KSZ8463_GLOBAL_SOFTWARE_RESET, false); } else { /* reset switch */ ksz_write8(dev, REG_POWER_MANAGEMENT_1, @@ -2300,6 +2303,110 @@ static void ksz88xx_r_mib_stats64(struct ksz_device= *dev, int port) spin_unlock(&mib->stats64_lock); } =20 +static int ksz8463_setup(struct dsa_switch *ds) +{ + struct ksz_device *dev =3D ds->priv; + u16 storm_mask, storm_rate; + 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 ksz8463_reset_switch(dev); + if (ret) { + dev_err(ds->dev, "failed to reset switch\n"); + 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; + 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); + + ds->configure_vlan_while_not_filtering =3D false; + ds->dscp_prio_mapping_is_global =3D true; + ds->mtu_enforcement_ingress =3D true; + + /* We rely on software untagging on the CPU port, so that we + * can support both tagged and untagged VLANs + */ + ds->untag_bridge_pvid =3D true; + + /* VLAN filtering is partly controlled by the global VLAN + * Enable flag + */ + ds->vlan_filtering_is_global =3D true; + + /* Enable automatic fast aging when link changed detected. */ + ksz_cfg(dev, S_LINK_AGING_CTRL, SW_LINK_AUTO_AGING, true); + + /* Enable aggressive back off algorithm in half duplex mode. */ + ret =3D ksz_rmw8(dev, REG_SW_CTRL_1, SW_AGGR_BACKOFF, SW_AGGR_BACKOFF); + if (ret) + return ret; + + /* + * Make sure unicast VLAN boundary is set as default and + * enable no excessive collision drop. + */ + ret =3D ksz_rmw8(dev, REG_SW_CTRL_2, + UNICAST_VLAN_BOUNDARY | NO_EXC_COLLISION_DROP, + UNICAST_VLAN_BOUNDARY | NO_EXC_COLLISION_DROP); + if (ret) + return ret; + + ksz_cfg(dev, S_REPLACE_VID_CTRL, SW_REPLACE_VID, false); + + ksz_cfg(dev, S_MIRROR_CTRL, SW_MIRROR_RX_TX, false); + + for (i =3D 0; i < (dev->info->num_vlans / 4); i++) + ksz8_r_vlan_entries(dev, i); + + /* 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; + + ret =3D ksz_mdio_register(dev); + if (ret < 0) { + dev_err(dev->dev, "failed to register the mdio"); + return ret; + } + + ret =3D ksz_dcb_init(dev); + if (ret) + return ret; + + /* start switch */ + regmap_update_bits(ksz_regmap_8(dev), regs[S_START_CTRL], + SW_START, SW_START); + + return 0; +} + /** * ksz88x3_drive_strength_write() - Set the drive strength configuration f= or * KSZ8863 compatible chip variants. @@ -2445,10 +2552,6 @@ static int ksz8_setup(struct dsa_switch *ds) /* 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); =20 @@ -2499,7 +2602,7 @@ static int ksz8_setup(struct dsa_switch *ds) =20 ksz_cfg(dev, S_MIRROR_CTRL, SW_MIRROR_RX_TX, false); =20 - if (!ksz_is_ksz88x3(dev) && !ksz_is_ksz8463(dev)) + if (!ksz_is_ksz88x3(dev)) ksz_cfg(dev, REG_SW_CTRL_19, SW_INS_TAG_ENABLE, true); =20 for (i =3D 0; i < (dev->info->num_vlans / 4); i++) @@ -2889,8 +2992,7 @@ const struct ksz_dev_ops ksz88xx_dev_ops =3D { 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, - .setup =3D ksz8_setup, - .teardown =3D ksz_teardown, + .setup =3D ksz8463_setup, .phy_read =3D ksz8463_phy_read16, .phy_write =3D ksz8463_phy_write16, .phylink_get_caps =3D ksz8_phylink_get_caps, --=20 2.54.0 From nobody Sat Jul 25 21:59:22 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 9EBA7365A00 for ; Mon, 13 Jul 2026 07:11:33 +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=1783926699; cv=none; b=EqionMFzKEwSshdU2DN2unKEyk+Hnq/YHT8mWliMtN3XiwUeR7bxdYZst4ospJeNmf/6v9govT/S/eLfcdDUO8fafmYqlnecsGqh6SzP3HbSvjAv1eWLtFISI8hQ01Ald8mQs83fzx+roG91eiWMLR5a4Jc0M3qYwJYpQ+flSoc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783926699; c=relaxed/simple; bh=P5TH9CzfbS5dkSpvlLQ1d15P7EmXyIYvCH7xhBfxBOg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WzpdrR2e/KqJd4J0T9sEj5Zs0FPe1PtHtlAmqm3D4sp+P+O5+4t2aN77Tlswg1pqQhqj4+M9LPu/uyuqggpDFg3PkhVAgZSr0uXFZHn0/ceQgyp6kGNq+0fsS+twiYNHk/2qxckSrKrDujdsSN522kN6qRuEEOY6HZXhncIzE5c= 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=jrnNd1rc; 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="jrnNd1rc" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 0A4611A0F8E; Mon, 13 Jul 2026 07:11:32 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id D240460341; Mon, 13 Jul 2026 07:11:31 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 491A711BD3A35; Mon, 13 Jul 2026 09:11:28 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1783926690; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=Ix/aq7vTMxcCHYMxpuabfOhDU7m0NOPjq6CDnvxJ/Lc=; b=jrnNd1rcHK3Y8edr87+t1F6GUZO3TW0Wtuw2Ahsg+4P6Dn8v/smdQq4zPvUDAkE9GmHLke lPPqu7oEHYLIJe7Pu3H4apGsBcoRfgw5CZf1m4E211q3m8WKPdVET25w0HXiRCcfxPSZp7 x4TxhJFKp5tyJegeZPjGqAGDBkpNIqfxDcGirCF6iV+d4miqMbYnLogN35U+J2pK+bUD+8 un49Jzb+vGxCUVn0QwaLboJWXOH4zZafKEK7if7WO/ngiy8lfnVJ09Aq6DSdruE339HacE ZwdSVO8G5Y4sIlZtWMRzMP+z44kJHATKYvcNReQiaAawoijXLMPRfYzrkLsSDg== From: "Bastien Curutchet (Schneider Electric)" Date: Mon, 13 Jul 2026 09:11:21 +0200 Subject: [PATCH net-next v2 02/10] net: dsa: microchip: split ksz8_config_cpu_port() 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: <20260713-ksz-new-ptp-v2-2-7209c05058ef@bootlin.com> References: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> In-Reply-To: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , Russell King , Simon Horman , Maxime Chevallier Cc: Pascal Eberhard , =?utf-8?q?Miqu=C3=A8l_Raynal?= , Thomas Petazzoni , 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 ksz8_config_cpu_port() is only called twice, once by ksz8_setup() and once by ksz8463_setup(). It contains a ksz8463 branch that could be avoided in the ksz8_setup() case and a ksz87xx/ksz88xx branches that could be avoided in ksz8463_setup() case. Create ksz8463_config_cpu_port() that only handles the ksz8463 case and remove the ksz8463 specificities from the common ksz8_config_cpu_port(). Signed-off-by: Bastien Curutchet (Schneider Electric) --- drivers/net/dsa/microchip/ksz8.c | 73 +++++++++++++++++++++++++-----------= ---- 1 file changed, 45 insertions(+), 28 deletions(-) diff --git a/drivers/net/dsa/microchip/ksz8.c b/drivers/net/dsa/microchip/k= sz8.c index 5ed63f425013..3bbca6f9cfc5 100644 --- a/drivers/net/dsa/microchip/ksz8.c +++ b/drivers/net/dsa/microchip/ksz8.c @@ -2029,6 +2029,50 @@ static void ksz88x3_config_rmii_clk(struct ksz_devic= e *dev) KSZ88X3_PORT3_RMII_CLK_INTERNAL, rmii_clk_internal); } =20 +static void ksz8463_config_cpu_port(struct dsa_switch *ds) +{ + struct ksz_device *dev =3D ds->priv; + struct ksz_port *p; + u8 fiber_ports =3D 0; + const u32 *masks; + const u16 *regs; + int i; + + masks =3D dev->info->masks; + regs =3D dev->info->regs; + + ksz_cfg(dev, regs[S_TAIL_TAG_CTRL], masks[SW_TAIL_TAG_ENABLE], true); + + ksz8_port_setup(dev, dev->cpu_port, true); + + for (i =3D 0; i < dev->phy_port_cnt; i++) + ksz_port_stp_state_set(ds, i, BR_STATE_DISABLED); + + for (i =3D 0; i < dev->phy_port_cnt; i++) { + p =3D &dev->ports[i]; + ksz_port_cfg(dev, i, regs[P_STP_CTRL], PORT_FORCE_FLOW_CTRL, + p->fiber); + if (p->fiber) + fiber_ports |=3D (1 << i); + } + + /* Setup fiber ports. */ + if (fiber_ports) { + fiber_ports &=3D 3; + regmap_update_bits(ksz_regmap_16(dev), KSZ8463_REG_CFG_CTRL, + fiber_ports << PORT_COPPER_MODE_S, + 0); + regmap_update_bits(ksz_regmap_16(dev), KSZ8463_REG_DSP_CTRL_6, + COPPER_RECEIVE_ADJUSTMENT, 0); + } + + /* Turn off PTP function as the switch enables it by default */ + regmap_update_bits(ksz_regmap_16(dev), KSZ8463_PTP_MSG_CONF1, + PTP_ENABLE, 0); + regmap_update_bits(ksz_regmap_16(dev), KSZ8463_PTP_CLK_CTRL, + PTP_CLK_ENABLE, 0); +} + static void ksz8_config_cpu_port(struct dsa_switch *ds) { struct ksz_device *dev =3D ds->priv; @@ -2036,7 +2080,6 @@ static void ksz8_config_cpu_port(struct dsa_switch *d= s) const u32 *masks; const u16 *regs; u8 remote; - u8 fiber_ports =3D 0; int i; =20 masks =3D dev->info->masks; @@ -2067,32 +2110,6 @@ static void ksz8_config_cpu_port(struct dsa_switch *= ds) else ksz_port_cfg(dev, i, regs[P_STP_CTRL], PORT_FORCE_FLOW_CTRL, false); - if (p->fiber) - fiber_ports |=3D (1 << i); - } - if (ksz_is_ksz8463(dev)) { - /* Setup fiber ports. */ - if (fiber_ports) { - fiber_ports &=3D 3; - regmap_update_bits(ksz_regmap_16(dev), - KSZ8463_REG_CFG_CTRL, - fiber_ports << PORT_COPPER_MODE_S, - 0); - regmap_update_bits(ksz_regmap_16(dev), - KSZ8463_REG_DSP_CTRL_6, - COPPER_RECEIVE_ADJUSTMENT, 0); - } - - /* Turn off PTP function as the switch's proprietary way of - * handling timestamp is not supported in current Linux PTP - * stack implementation. - */ - regmap_update_bits(ksz_regmap_16(dev), - KSZ8463_PTP_MSG_CONF1, - PTP_ENABLE, 0); - regmap_update_bits(ksz_regmap_16(dev), - KSZ8463_PTP_CLK_CTRL, - PTP_CLK_ENABLE, 0); } } =20 @@ -2332,7 +2349,7 @@ static int ksz8463_setup(struct dsa_switch *ds) regmap_update_bits(ksz_regmap_16(dev), regs[S_BROADCAST_CTRL], storm_mask, storm_rate); =20 - ksz8_config_cpu_port(ds); + ksz8463_config_cpu_port(ds); =20 ksz8_enable_stp_addr(dev); =20 --=20 2.54.0 From nobody Sat Jul 25 21:59:22 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 4057636997A for ; Mon, 13 Jul 2026 07:11:35 +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=1783926700; cv=none; b=YkacufFe+UDAsYZczdnhs1lVAhY0Tb1TnmFWmHETAaD08pzeGzAmlt2mIVxzBMalO1FdcKSULpBDo9KfWS/GFk35Y6mmPcNb0430wms+A5Gs99diM2YQIdBywKy/Flz/M6t5lmuMT3FsEdxtaZtlccVZBaovDW3zAPO4pbfON7g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783926700; c=relaxed/simple; bh=hWw4xiAaOHbn0Lxb1RJ9sP1ExOiCtbQjGmsfJ6RvU0Y=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OvKE61HH6CJNZklscMO9yx7e/eDkT+L8z4iqVyltQEiP44OtgI8C8gUHEGujitnp26kEme4jKicGlIC1WDrQTmaiqT8PZdgmhEsocV1X5EElyIqy6BmxeC5HNiWcH9WHnWm8x+9OazKltY9WGChmDeA6r8ynsICYBTFgVY/7/5E= 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=GDBxKdys; 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="GDBxKdys" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id E65D34E40D81; Mon, 13 Jul 2026 07:11:33 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id B2F9E60341; Mon, 13 Jul 2026 07:11:33 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 12EC311BD3A37; Mon, 13 Jul 2026 09:11:30 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1783926692; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=VmVvjxYNp9LkN0emJrGpqwbiGfhUTLyxiUgQJDJv1kU=; b=GDBxKdysIePXadG8hiAVOqH5TNfwbt6CI9iL20gIHIiiopY5lBjguskcbunvRd5isQpk/U LyDcOYsXcggWJWocWsFLhDH0NTdNw+jVqG6xMkIPzSktcoeFduw+qnMYGDq0Gmh9fUq+4k +HZUPSw7cLkGYqVaKI3nMQW6o+aEeW+IBu3PrLoyA8oCH7DdLA7bcg+qbE+1tHZGzEKuCh bJ0Pf3m3274zAGbTmD2bXoJRb+BHJWITHVUOn+L+a1iWS6c5A4QacAy9BJgpwyTY6/Kbj7 5WjJK9Bhaud0PTdnMpDIkU4OANj/aHOmWL6Exs1byNCnD0OlkfJbDqEjA1s4tg== From: "Bastien Curutchet (Schneider Electric)" Date: Mon, 13 Jul 2026 09:11:22 +0200 Subject: [PATCH net-next v2 03/10] net: dsa: microchip: allow the use of other IRQ operations. 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: <20260713-ksz-new-ptp-v2-3-7209c05058ef@bootlin.com> References: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> In-Reply-To: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , Russell King , Simon Horman , Maxime Chevallier Cc: Pascal Eberhard , =?utf-8?q?Miqu=C3=A8l_Raynal?= , Thomas Petazzoni , 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 The IRQ setup uses an hardcoded set of IRQ operations. These operations don't fit with the KSZ8463 which has an inverted bit logic (it uses an 'enable irq' register instead of a 'mask irq' one) and 16-bits registers. Take the IRQ domain operations as input of ksz_irq_common_setup() to allow KSZ8463 to use the already existing setup with its own set of IRQ operations. Expose ksz_irq_common_setup() and ksz_irq_bus_lock/unlock() so they can be used by ksz8.c. Signed-off-by: Bastien Curutchet (Schneider Electric) --- drivers/net/dsa/microchip/ksz_common.c | 15 ++++++++------- drivers/net/dsa/microchip/ksz_common.h | 5 +++++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/micro= chip/ksz_common.c index 67ab6ddb9e53..ff1be540b546 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -2419,14 +2419,14 @@ static void ksz_irq_unmask(struct irq_data *d) kirq->masked &=3D ~BIT(d->hwirq); } =20 -static void ksz_irq_bus_lock(struct irq_data *d) +void ksz_irq_bus_lock(struct irq_data *d) { struct ksz_irq *kirq =3D irq_data_get_irq_chip_data(d); =20 mutex_lock(&kirq->dev->lock_irq); } =20 -static void ksz_irq_bus_sync_unlock(struct irq_data *d) +void ksz_irq_bus_sync_unlock(struct irq_data *d) { struct ksz_irq *kirq =3D irq_data_get_irq_chip_data(d); struct ksz_device *dev =3D kirq->dev; @@ -2504,14 +2504,15 @@ static irqreturn_t ksz_irq_thread_fn(int irq, void = *dev_id) return (nhandled > 0 ? IRQ_HANDLED : IRQ_NONE); } =20 -static int ksz_irq_common_setup(struct ksz_device *dev, struct ksz_irq *ki= rq) +int ksz_irq_common_setup(struct ksz_device *dev, struct ksz_irq *kirq, + const struct irq_domain_ops *ops) { int ret, n; =20 kirq->dev =3D dev; =20 - kirq->domain =3D irq_domain_create_simple(dev_fwnode(dev->dev), kirq->nir= qs, 0, - &ksz_irq_domain_ops, kirq); + kirq->domain =3D irq_domain_create_simple(dev_fwnode(dev->dev), + kirq->nirqs, 0, ops, kirq); if (!kirq->domain) return -ENOMEM; =20 @@ -2543,7 +2544,7 @@ int ksz_girq_setup(struct ksz_device *dev) =20 girq->irq_num =3D dev->irq; =20 - return ksz_irq_common_setup(dev, girq); + return ksz_irq_common_setup(dev, girq, &ksz_irq_domain_ops); } =20 int ksz_pirq_setup(struct ksz_device *dev, u8 p) @@ -2560,7 +2561,7 @@ int ksz_pirq_setup(struct ksz_device *dev, u8 p) if (!pirq->irq_num) return -EINVAL; =20 - return ksz_irq_common_setup(dev, pirq); + return ksz_irq_common_setup(dev, pirq, &ksz_irq_domain_ops); } =20 void ksz_teardown(struct dsa_switch *ds) diff --git a/drivers/net/dsa/microchip/ksz_common.h b/drivers/net/dsa/micro= chip/ksz_common.h index acaf70e6f393..0f2abb22ca91 100644 --- a/drivers/net/dsa/microchip/ksz_common.h +++ b/drivers/net/dsa/microchip/ksz_common.h @@ -8,6 +8,7 @@ #define __KSZ_COMMON_H =20 #include +#include #include #include #include @@ -508,6 +509,10 @@ int ksz_sw_mdio_write(struct mii_bus *bus, int addr, i= nt regnum, u16 val); int ksz_parent_mdio_read(struct mii_bus *bus, int addr, int regnum); int ksz_parent_mdio_write(struct mii_bus *bus, int addr, int regnum, u16 v= al); int ksz_mdio_register(struct ksz_device *dev); +void ksz_irq_bus_lock(struct irq_data *d); +void ksz_irq_bus_sync_unlock(struct irq_data *d); +int ksz_irq_common_setup(struct ksz_device *dev, struct ksz_irq *kirq, + const struct irq_domain_ops *ops); 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); --=20 2.54.0 From nobody Sat Jul 25 21:59:22 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 48D3E369991 for ; Mon, 13 Jul 2026 07:11:37 +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=1783926706; cv=none; b=tFPfA1/zQNFkKQr2roILFSJevVZiGGELOQrNFXTxOvTgJXbWqn/DomDSssdppZ81It6GRCKhtKatKFha9t8WEgb2ufshnlipHHS/RcqLMN/Dpt7O2s2/t7SqEASFi6h/r/qtWt1ium0e6L+IMbV9pK438rv4FiR7g7YbaFpCbpo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783926706; c=relaxed/simple; bh=uLBsbgmaCtzWNPc7EFgj136/4QpNUYTi1s1We/t6BWU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kIaw9b6CJ3Pnb/XNTX9O35Wt7wy67pkWXddK3las2l1ZcbyodFkBZZ63xu2t6a3Rv9cDINyF+oInrvAd3GFrDpLwALPD1+83YOBwebh41uGMCU5mUtxrfY5Bm4gpsQLxDhWw6GX/P4f7651jDoAlaJc+DsUPxVwgZHu5yEwGaDA= 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=tJF4JBmK; 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="tJF4JBmK" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id CF3FCC2BB13; Mon, 13 Jul 2026 07:11:51 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id DA2A760341; Mon, 13 Jul 2026 07:11:35 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 06F7411BD39F5; Mon, 13 Jul 2026 09:11:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1783926694; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=ijrwmHBHgcyT5IDoh+XNYGuziVn49C8hIpQpFC8Cizo=; b=tJF4JBmKKE5kSrXv3bh8gDC9EDwMXFZmPGApwHIborlyJpG4ybK1XJBocgoBFH+5jiLjPW HUYpomybFwuhCmaM20TvRgj253hKPvBwAd1TWb9J1Q+NVk4mmfZNS0h13weSS3TjwoWhb1 agNGxrDDL5uIj22ctImh6qHDpjob8Jjb68w3333QULQY3eezv4l4+t/lpHuzIrRL7/CQzu Sw9Z97seAR4XSBXrUXbRNd4YH3QMnDl5lXZE1qxLVaqxPk7CcSRJ/9uPaJ9Oy8L1sa/Dxf EghjqwQ59JnB3b6EhpbLiZsgN0TPD3R+zCvFShmiqeTblc7ooPBQrfAiuyqvKQ== From: "Bastien Curutchet (Schneider Electric)" Date: Mon, 13 Jul 2026 09:11:23 +0200 Subject: [PATCH net-next v2 04/10] net: dsa: microchip: add PTP interrupt handling for KSZ8463 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: <20260713-ksz-new-ptp-v2-4-7209c05058ef@bootlin.com> References: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> In-Reply-To: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , Russell King , Simon Horman , Maxime Chevallier Cc: Pascal Eberhard , =?utf-8?q?Miqu=C3=A8l_Raynal?= , Thomas Petazzoni , 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 KSZ8463 PTP interrupts aren't handled by the driver. The interrupt layout in KSZ8463 has nothing to do with the other switches: - Its global interrupt enable register is 16-bits long and follow an 'enable' logic, instead of a 'mask' one - all the interrupts of all ports are grouped into one status register while others have one interrupt register per port - xdelay_req and pdresp timestamps share one single interrupt bit on the KSZ8463 while each of them has its own interrupt bit on other switches Create a KSZ8463-specific set of interrupt domain operations to handle the global IRQ layer. To limit code duplication, it uses the same interrupt handler than the other switches. Since other switches have 8-bits registers, only the high-byte of the interrupt status/enable registers are used. This high-byte is where the PTP interrupts are located. The low-byte contains the wake-up detection interrupts so if at some points these interrupts are needed we'll need a bit of rework here. Create KSZ8463-specific functions to setup the PTP interrupts. The created IRQ domain is tied to the first port of the KSZ8463. Again, the same PTP interrupt handler than the others switches is used. Implement the teardown callback to release the interrupts. Signed-off-by: Bastien Curutchet (Schneider Electric) --- drivers/net/dsa/microchip/ksz8.c | 93 ++++++++++++++++++++++- drivers/net/dsa/microchip/ksz_ptp.c | 131 ++++++++++++++++++++++++++++= ++++ drivers/net/dsa/microchip/ksz_ptp.h | 9 +++ drivers/net/dsa/microchip/ksz_ptp_reg.h | 6 ++ 4 files changed, 237 insertions(+), 2 deletions(-) diff --git a/drivers/net/dsa/microchip/ksz8.c b/drivers/net/dsa/microchip/k= sz8.c index 3bbca6f9cfc5..c099a7005808 100644 --- a/drivers/net/dsa/microchip/ksz8.c +++ b/drivers/net/dsa/microchip/ksz8.c @@ -36,6 +36,13 @@ #include "ksz8_reg.h" #include "ksz8.h" =20 +/* + * We use only the high-byte (so odd addresses) of the 16-bits registers t= o fit + * in the common IRQ framework + */ +#define KSZ8463_REG_ISR 0x191 +#define KSZ8463_REG_IER 0x193 + /* ksz88x3_drive_strengths - Drive strength mapping for KSZ8863, KSZ8873, = .. * variants. * This values are documented in KSZ8873 and KSZ8863 datasheets. @@ -181,6 +188,58 @@ static int ksz8_pme_pwrite8(struct ksz_device *dev, in= t port, int offset, u8 dat return ksz8_ind_write8(dev, table, (u8)(offset), data); } =20 +static void ksz8463_irq_mask(struct irq_data *d) +{ + struct ksz_irq *kirq =3D irq_data_get_irq_chip_data(d); + + kirq->masked &=3D ~BIT(d->hwirq); +} + +static void ksz8463_irq_unmask(struct irq_data *d) +{ + struct ksz_irq *kirq =3D irq_data_get_irq_chip_data(d); + + kirq->masked |=3D BIT(d->hwirq); +} + +static const struct irq_chip ksz8463_irq_chip =3D { + .name =3D "ksz8463-irq", + .irq_mask =3D ksz8463_irq_mask, + .irq_unmask =3D ksz8463_irq_unmask, + .irq_bus_lock =3D ksz_irq_bus_lock, + .irq_bus_sync_unlock =3D ksz_irq_bus_sync_unlock, +}; + +static int ksz8463_irq_domain_map(struct irq_domain *d, + unsigned int irq, irq_hw_number_t hwirq) +{ + irq_set_chip_data(irq, d->host_data); + irq_set_chip_and_handler(irq, &ksz8463_irq_chip, handle_level_irq); + irq_set_noprobe(irq); + + return 0; +} + +static const struct irq_domain_ops ksz8463_irq_domain_ops =3D { + .map =3D ksz8463_irq_domain_map, + .xlate =3D irq_domain_xlate_twocell, +}; + +static int ksz8463_girq_setup(struct ksz_device *dev) +{ + struct ksz_irq *girq =3D &dev->girq; + + girq->nirqs =3D 8; + girq->reg_mask =3D KSZ8463_REG_IER; + girq->reg_status =3D KSZ8463_REG_ISR; + girq->masked =3D 0; + snprintf(girq->name, sizeof(girq->name), "ksz8463-girq"); + + girq->irq_num =3D dev->irq; + + return ksz_irq_common_setup(dev, girq, &ksz8463_irq_domain_ops); +} + static int ksz8463_reset_switch(struct ksz_device *dev) { ksz_cfg(dev, KSZ8463_REG_SW_RESET, KSZ8463_GLOBAL_SOFTWARE_RESET, true); @@ -2407,21 +2466,50 @@ static int ksz8463_setup(struct dsa_switch *ds) p =3D &dev->ports[dev->cpu_port]; p->learning =3D true; =20 + if (dev->irq > 0) { + ret =3D ksz8463_girq_setup(dev); + if (ret) + return ret; + + ret =3D ksz8463_ptp_irq_setup(ds); + if (ret) + goto free_girq; + } + ret =3D ksz_mdio_register(dev); if (ret < 0) { dev_err(dev->dev, "failed to register the mdio"); - return ret; + goto free_ptp_irq; } =20 ret =3D ksz_dcb_init(dev); if (ret) - return ret; + goto free_ptp_irq; =20 /* start switch */ regmap_update_bits(ksz_regmap_8(dev), regs[S_START_CTRL], SW_START, SW_START); =20 return 0; + +free_ptp_irq: + if (dev->irq > 0) + ksz8463_ptp_irq_free(ds); +free_girq: + if (dev->irq > 0) + ksz_irq_free(&dev->girq); + + return ret; +} + +static void ksz8463_teardown(struct dsa_switch *ds) +{ + struct ksz_device *dev =3D ds->priv; + + if (dev->irq > 0) { + ksz8463_ptp_irq_free(ds); + ksz_irq_free(&dev->girq); + } } =20 /** @@ -3010,6 +3098,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, .setup =3D ksz8463_setup, + .teardown =3D ksz8463_teardown, .phy_read =3D ksz8463_phy_read16, .phy_write =3D ksz8463_phy_write16, .phylink_get_caps =3D ksz8_phylink_get_caps, diff --git a/drivers/net/dsa/microchip/ksz_ptp.c b/drivers/net/dsa/microchi= p/ksz_ptp.c index 8b98039320ad..89fbc1253f25 100644 --- a/drivers/net/dsa/microchip/ksz_ptp.c +++ b/drivers/net/dsa/microchip/ksz_ptp.c @@ -32,6 +32,15 @@ =20 #define KSZ_PTP_INT_START 13 =20 +/* + * PTP interrupt bit is the bit 12 of the 16-bits ISR/IER. But ksz_common.= c only + * accesses the high-byte of these registers so the PTP interrupt bit beco= mes 4. + */ +#define KSZ8463_SRC_PTP_INT 4 +#define KSZ8463_PTP_PORT1_INT_START 12 +#define KSZ8463_PTP_PORT2_INT_START 14 +#define KSZ8463_PTP_INT_START KSZ8463_PTP_PORT1_INT_START + static int ksz_ptp_tou_gpio(struct ksz_device *dev) { int ret; @@ -1129,6 +1138,128 @@ static int ksz_ptp_msg_irq_setup(struct ksz_port *p= ort, u8 n) return ret; } =20 +static int ksz8463_ptp_port_irq_setup(struct ksz_irq *ptpirq, + struct ksz_port *port, int hw_irq) +{ + u16 ts_reg[] =3D {KSZ8463_REG_PORT_SYNC_TS, KSZ8463_REG_PORT_DREQ_TS}; + static const char * const name[] =3D {"sync-msg", "delay-msg"}; + const struct ksz_dev_ops *ops =3D port->ksz_dev->dev_ops; + struct ksz_ptp_irq *ptpmsg_irq; + int ret; + int i; + + init_completion(&port->tstamp_msg_comp); + + for (i =3D 0; i < 2; i++) { + ptpmsg_irq =3D &port->ptpmsg_irq[i]; + ptpmsg_irq->num =3D irq_create_mapping(ptpirq->domain, + hw_irq + i); + if (!ptpmsg_irq->num) { + ret =3D -EINVAL; + goto release_msg_irq; + } + + ptpmsg_irq->port =3D port; + ptpmsg_irq->ts_reg =3D ops->get_port_addr(port->num, ts_reg[i]); + + strscpy(ptpmsg_irq->name, name[i]); + + ret =3D request_threaded_irq(ptpmsg_irq->num, NULL, + ksz_ptp_msg_thread_fn, IRQF_ONESHOT, + ptpmsg_irq->name, ptpmsg_irq); + if (ret) { + irq_dispose_mapping(ptpmsg_irq->num); + goto release_msg_irq; + } + } + + return 0; + +release_msg_irq: + while (i--) + ksz_ptp_msg_irq_free(port, i); + + return ret; +} + +static void ksz8463_ptp_port_irq_teardown(struct ksz_port *port) +{ + int i; + + for (i =3D 0; i < 2; i++) + ksz_ptp_msg_irq_free(port, i); +} + +int ksz8463_ptp_irq_setup(struct dsa_switch *ds) +{ + struct ksz_device *dev =3D ds->priv; + struct ksz_port *port1, *port2; + struct ksz_irq *ptpirq; + int ret; + + port1 =3D &dev->ports[0]; + port2 =3D &dev->ports[1]; + ptpirq =3D &port1->ptpirq; + + ptpirq->irq_num =3D irq_find_mapping(dev->girq.domain, + KSZ8463_SRC_PTP_INT); + if (!ptpirq->irq_num) + return -EINVAL; + + ptpirq->dev =3D dev; + ptpirq->nirqs =3D 4; + ptpirq->reg_mask =3D KSZ8463_PTP_TS_IER; + ptpirq->reg_status =3D KSZ8463_PTP_TS_ISR; + ptpirq->irq0_offset =3D KSZ8463_PTP_INT_START; + snprintf(ptpirq->name, sizeof(ptpirq->name), "ptp-irq"); + + ptpirq->domain =3D irq_domain_create_linear(dev_fwnode(dev->dev), + ptpirq->nirqs, + &ksz_ptp_irq_domain_ops, + ptpirq); + if (!ptpirq->domain) + return -ENOMEM; + + ret =3D ksz8463_ptp_port_irq_setup(ptpirq, port1, + KSZ8463_PTP_PORT1_INT_START - KSZ8463_PTP_INT_START); + if (ret) + goto release_domain; + + ret =3D ksz8463_ptp_port_irq_setup(ptpirq, port2, + KSZ8463_PTP_PORT2_INT_START - KSZ8463_PTP_INT_START); + if (ret) + goto free_port1; + + ret =3D request_threaded_irq(ptpirq->irq_num, NULL, ksz_ptp_irq_thread_fn, + IRQF_ONESHOT, ptpirq->name, ptpirq); + if (ret) + goto free_port2; + + return 0; + +free_port2: + ksz8463_ptp_port_irq_teardown(port2); +free_port1: + ksz8463_ptp_port_irq_teardown(port1); +release_domain: + irq_domain_remove(ptpirq->domain); + + return ret; +} + +void ksz8463_ptp_irq_free(struct dsa_switch *ds) +{ + struct ksz_device *dev =3D ds->priv; + struct ksz_port *port1 =3D &dev->ports[0]; + struct ksz_port *port2 =3D &dev->ports[1]; + struct ksz_irq *ptpirq =3D &port1->ptpirq; + + free_irq(ptpirq->irq_num, ptpirq); + ksz8463_ptp_port_irq_teardown(port2); + ksz8463_ptp_port_irq_teardown(port1); + irq_domain_remove(ptpirq->domain); +} + int ksz_ptp_irq_setup(struct dsa_switch *ds, u8 p) { struct ksz_device *dev =3D ds->priv; diff --git a/drivers/net/dsa/microchip/ksz_ptp.h b/drivers/net/dsa/microchi= p/ksz_ptp.h index 3086e519b1b6..11408580031d 100644 --- a/drivers/net/dsa/microchip/ksz_ptp.h +++ b/drivers/net/dsa/microchip/ksz_ptp.h @@ -50,6 +50,8 @@ bool ksz_port_rxtstamp(struct dsa_switch *ds, int port, s= truct sk_buff *skb, unsigned int type); int ksz_ptp_irq_setup(struct dsa_switch *ds, u8 p); void ksz_ptp_irq_free(struct dsa_switch *ds, u8 p); +int ksz8463_ptp_irq_setup(struct dsa_switch *ds); +void ksz8463_ptp_irq_free(struct dsa_switch *ds); =20 #else =20 @@ -72,6 +74,13 @@ static inline int ksz_ptp_irq_setup(struct dsa_switch *d= s, u8 p) =20 static inline void ksz_ptp_irq_free(struct dsa_switch *ds, u8 p) {} =20 +static inline int ksz8463_ptp_irq_setup(struct dsa_switch *ds) +{ + return 0; +} + +static inline void ksz8463_ptp_irq_free(struct dsa_switch *ds) {} + #define ksz_get_ts_info NULL =20 #define ksz_hwtstamp_get NULL diff --git a/drivers/net/dsa/microchip/ksz_ptp_reg.h b/drivers/net/dsa/micr= ochip/ksz_ptp_reg.h index eab9aecb7fa8..1a669d6ee889 100644 --- a/drivers/net/dsa/microchip/ksz_ptp_reg.h +++ b/drivers/net/dsa/microchip/ksz_ptp_reg.h @@ -121,6 +121,12 @@ #define REG_PTP_PORT_SYNC_TS 0x0C0C #define REG_PTP_PORT_PDRESP_TS 0x0C10 =20 +#define KSZ8463_REG_PORT_DREQ_TS 0x0648 +#define KSZ8463_REG_PORT_SYNC_TS 0x064C +#define KSZ8463_REG_PORT_DRESP_TS 0x0650 +#define KSZ8463_PTP_TS_ISR 0x068C +#define KSZ8463_PTP_TS_IER 0x068E + #define REG_PTP_PORT_TX_INT_STATUS__2 0x0C14 #define REG_PTP_PORT_TX_INT_ENABLE__2 0x0C16 =20 --=20 2.54.0 From nobody Sat Jul 25 21:59:22 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 6B675369D59 for ; Mon, 13 Jul 2026 07:11:39 +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=1783926701; cv=none; b=MLUlB1x9Nrd9Z4oKqzNJIQmhqbuIu2iGgzIvuxGJ8zyzeNdwtNfB/YBny3qwHnL1cZZwQN+URsodGGmvm3DQt+JdIYSJRHKKTlVIR6kq2f9aR0/vGMLMhHRFwxk3wIOk4QuDc5I5lAO6R0LXDZlLj5gvCOtV4Ku72QB90Fr76dQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783926701; c=relaxed/simple; bh=zdvdHrDhFsiioZd4xYI/niYPtEbX5wxU1RXufUxhCpc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tlwHZnFMWbymEXsse5ttVcrbKCtC2sy0bpXboCoqE/M76jxWPMJiOCUEmgE8A8F9e4/Z/gbBvbMk+u+oo0s4UldFt6quWWr83tNyfRxfmONCfC2cPkVzlZhbjasJfFlw7Pel9q8R4MuykPqWTNPBosL+no/T8qHISU80fQ3l5Ww= 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=C5LY4/BS; 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="C5LY4/BS" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 309C84E40D84; Mon, 13 Jul 2026 07:11:38 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 0530860341; Mon, 13 Jul 2026 07:11:38 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 128F911BD39F4; Mon, 13 Jul 2026 09:11:34 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1783926696; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=fkkEtUFwnD/scngtxS+aRb1iK4Va5shp4fS189Y6VRE=; b=C5LY4/BSRdonJHES2v0gCd3QKLdactXElkJNwuCnc7piVexqjxG+ImHeAnX5u1VCKmz6DW 98x2Kx3sZl0ouU9CsBEjDB6J2hHTSIwIgddpjyPpkkRSre+9eevn5eoIi4ORVHZgPmP7Zi FlyiFrGotS3Ckx+bgq2mYctK3tuOg94RYs51gQuHFGXhTIwLeUUFEpDVxICy0PiZGpn5SW 8O5SuLOgEgJkD2R8Wc6T0OyrEFtukalN5qe9SMqTaLZyPR9BDCFLkF69orjILYP+U4YLrk trGRKYCfOjdPba5CV3hsHhJv5gkYD330Cnudl3tXaiXwjfdsgTN/GmLqoI+SBw== From: "Bastien Curutchet (Schneider Electric)" Date: Mon, 13 Jul 2026 09:11:24 +0200 Subject: [PATCH net-next v2 05/10] net: dsa: microchip: adapt port offset for KSZ8463's PTP register 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: <20260713-ksz-new-ptp-v2-5-7209c05058ef@bootlin.com> References: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> In-Reply-To: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , Russell King , Simon Horman , Maxime Chevallier Cc: Pascal Eberhard , =?utf-8?q?Miqu=C3=A8l_Raynal?= , Thomas Petazzoni , 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 In KSZ8463 register's layout, the offset between port 1 and port 2 registers isn't the same in the generic control register area than in the PTP register area. The get_port_addr() always uses the same offset so it doesn't work when it's used to access PTP registers. Adapt the port offset in get_port_addr() when the accessed register is in the PTP area. Signed-off-by: Bastien Curutchet (Schneider Electric) --- drivers/net/dsa/microchip/ksz8.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/net/dsa/microchip/ksz8.c b/drivers/net/dsa/microchip/k= sz8.c index c099a7005808..5e5bfc5cae2d 100644 --- a/drivers/net/dsa/microchip/ksz8.c +++ b/drivers/net/dsa/microchip/ksz8.c @@ -2831,6 +2831,9 @@ static u32 ksz8_get_port_addr(int port, int offset) =20 static u32 ksz8463_get_port_addr(int port, int offset) { + if (offset >=3D KSZ8463_PTP_CLK_CTRL) + return offset + 0x20 * port; + return offset + 0x18 * port; } =20 --=20 2.54.0 From nobody Sat Jul 25 21:59:22 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 8A351369D6D; Mon, 13 Jul 2026 07:11:41 +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=1783926707; cv=none; b=jWa0Y3Ptz8rW0UgbofWm7SD6QvvShpcVSiY9cIyPuxpj4IgzkL1KlZBvnItjudcUB37bYY5A8dh+yzisdFtYGTHeaY1fu5e2RNtjuyUolECgSmJDKQcZJ525N4OzMr6mio55viXrgqPjgfn7bdIqLS5IDHbCWWN0ZqBBzyYWUaU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783926707; c=relaxed/simple; bh=w/SxAb4Naw1RupB4FjbSArAI84yzXTJXB+MRwVhcX9s=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tqGEsx+XLVv8WApWILZvaZt5s8ta7TOER8eV7lmxsGf8sqNUFOTq6PEeLqxkD5nAAbv2fAg9i3CqLblgUfm+jf0FaUF7YTo/fCjBmn+wC6YMqr4HSFFjWr2M0g5OH1CIVaWiYBxgwHWEO1fLT82dC2fNxXGit8VFE9WyS+WPXrA= 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=N4sfphw3; 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="N4sfphw3" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 0C8A0C2BB0F; Mon, 13 Jul 2026 07:11:56 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 15CFB60341; Mon, 13 Jul 2026 07:11:40 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 57F6711BD3A3A; Mon, 13 Jul 2026 09:11:37 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1783926698; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=yoOtR2HWNljx7819Q66dKQeYgock7C9Bppqch7osah4=; b=N4sfphw3M7b6iy0ASKKklEML/iW8W0XYaPLC33+DJMRTtMmdCbZ0kORHaZNT6RA9j8McVH FO58VlDLXIr7MOIkTYu1h7kBraipK9PQ1xxqn1xZjONrAohTbH0utBnXiTTmrd2bnEJUMS MTG1TPGRqOUDPlumAeqKnBL225DY2BawMQTE6ww/nGVRajLbZzyhn3M7nvrQ2J7dTKT9g6 jauC1QVuZCtyBNDUb9D2clcgIICyEkZmkoFLXYpTIXtM4A7MOghT9By4rnTki9uOAfKWmv 4MGhkWbrocqtf6oDPd2A9bXGMUFOpEyqbF4fkXpJRj1LcOq9dx/XkqI/EcI8Mw== From: "Bastien Curutchet (Schneider Electric)" Date: Mon, 13 Jul 2026 09:11:25 +0200 Subject: [PATCH net-next v2 06/10] net: dsa: tag_ksz: move the KSZ8795 tag handling below ksz_xmit_timestamp() 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: <20260713-ksz-new-ptp-v2-6-7209c05058ef@bootlin.com> References: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> In-Reply-To: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , Russell King , Simon Horman , Maxime Chevallier Cc: Pascal Eberhard , =?utf-8?q?Miqu=C3=A8l_Raynal?= , Thomas Petazzoni , 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 Upcoming patch reduces code duplication between KSZ8795 and KSZ9893 by introducing a common xmit() function. This rework needs the KSZ8795 handlers to be implemented below ksz_defer_xmit(). Do the move now to reduce the noise in next patch. No functionnal change is intended in this patch. Signed-off-by: Bastien Curutchet (Schneider Electric) --- net/dsa/tag_ksz.c | 132 +++++++++++++++++++++++++++-----------------------= ---- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/net/dsa/tag_ksz.c b/net/dsa/tag_ksz.c index 67fa89f102e0..f58ce0f0e9e4 100644 --- a/net/dsa/tag_ksz.c +++ b/net/dsa/tag_ksz.c @@ -103,72 +103,6 @@ static struct sk_buff *ksz_common_rcv(struct sk_buff *= skb, return skb; } =20 -/* - * For Ingress (Host -> KSZ8795), 1 byte is added before FCS. - * -----------------------------------------------------------------------= ---- - * DA(6bytes)|SA(6bytes)|....|Data(nbytes)|tag(1byte)|FCS(4bytes) - * -----------------------------------------------------------------------= ---- - * tag : each bit represents port (eg, 0x01=3Dport1, 0x02=3Dport2, 0x10=3D= port5) - * - * For Egress (KSZ8795 -> Host), 1 byte is added before FCS. - * -----------------------------------------------------------------------= ---- - * DA(6bytes)|SA(6bytes)|....|Data(nbytes)|tag0(1byte)|FCS(4bytes) - * -----------------------------------------------------------------------= ---- - * tag0 : zero-based value represents port - * (eg, 0x0=3Dport1, 0x2=3Dport3, 0x3=3Dport4) - */ - -#define KSZ8795_TAIL_TAG_EG_PORT_M GENMASK(1, 0) -#define KSZ8795_TAIL_TAG_OVERRIDE BIT(6) -#define KSZ8795_TAIL_TAG_LOOKUP BIT(7) - -static struct sk_buff *ksz8795_xmit(struct sk_buff *skb, struct net_device= *dev) -{ - struct ethhdr *hdr; - u8 *tag; - - if (skb->ip_summed =3D=3D CHECKSUM_PARTIAL && skb_checksum_help(skb)) { - kfree_skb(skb); - return NULL; - } - - /* Tag encoding */ - tag =3D skb_put(skb, KSZ_INGRESS_TAG_LEN); - hdr =3D skb_eth_hdr(skb); - - *tag =3D dsa_xmit_port_mask(skb, dev); - if (is_link_local_ether_addr(hdr->h_dest)) - *tag |=3D KSZ8795_TAIL_TAG_OVERRIDE; - - return skb; -} - -static struct sk_buff *ksz8795_rcv(struct sk_buff *skb, struct net_device = *dev) -{ - u8 *tag; - - if (skb_linearize(skb)) { - kfree_skb(skb); - return NULL; - } - - tag =3D skb_tail_pointer(skb) - KSZ_EGRESS_TAG_LEN; - - return ksz_common_rcv(skb, dev, tag[0] & KSZ8795_TAIL_TAG_EG_PORT_M, - KSZ_EGRESS_TAG_LEN); -} - -static const struct dsa_device_ops ksz8795_netdev_ops =3D { - .name =3D KSZ8795_NAME, - .proto =3D DSA_TAG_PROTO_KSZ8795, - .xmit =3D ksz8795_xmit, - .rcv =3D ksz8795_rcv, - .needed_tailroom =3D KSZ_INGRESS_TAG_LEN, -}; - -DSA_TAG_DRIVER(ksz8795_netdev_ops); -MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_KSZ8795, KSZ8795_NAME); - /* * For Ingress (Host -> KSZ9477), 2/6 bytes are added before FCS. * -----------------------------------------------------------------------= ---- @@ -353,6 +287,72 @@ static const struct dsa_device_ops ksz9477_netdev_ops = =3D { DSA_TAG_DRIVER(ksz9477_netdev_ops); MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_KSZ9477, KSZ9477_NAME); =20 +/* + * For Ingress (Host -> KSZ8795), 1 byte is added before FCS. + * -----------------------------------------------------------------------= ---- + * DA(6bytes)|SA(6bytes)|....|Data(nbytes)|tag(1byte)|FCS(4bytes) + * -----------------------------------------------------------------------= ---- + * tag : each bit represents port (eg, 0x01=3Dport1, 0x02=3Dport2, 0x10=3D= port5) + * + * For Egress (KSZ8795 -> Host), 1 byte is added before FCS. + * -----------------------------------------------------------------------= ---- + * DA(6bytes)|SA(6bytes)|....|Data(nbytes)|tag0(1byte)|FCS(4bytes) + * -----------------------------------------------------------------------= ---- + * tag0 : zero-based value represents port + * (eg, 0x0=3Dport1, 0x2=3Dport3, 0x3=3Dport4) + */ + +#define KSZ8795_TAIL_TAG_EG_PORT_M GENMASK(1, 0) +#define KSZ8795_TAIL_TAG_OVERRIDE BIT(6) +#define KSZ8795_TAIL_TAG_LOOKUP BIT(7) + +static struct sk_buff *ksz8795_xmit(struct sk_buff *skb, struct net_device= *dev) +{ + struct ethhdr *hdr; + u8 *tag; + + if (skb->ip_summed =3D=3D CHECKSUM_PARTIAL && skb_checksum_help(skb)) { + kfree_skb(skb); + return NULL; + } + + /* Tag encoding */ + tag =3D skb_put(skb, KSZ_INGRESS_TAG_LEN); + hdr =3D skb_eth_hdr(skb); + + *tag =3D dsa_xmit_port_mask(skb, dev); + if (is_link_local_ether_addr(hdr->h_dest)) + *tag |=3D KSZ8795_TAIL_TAG_OVERRIDE; + + return skb; +} + +static struct sk_buff *ksz8795_rcv(struct sk_buff *skb, struct net_device = *dev) +{ + u8 *tag; + + if (skb_linearize(skb)) { + kfree_skb(skb); + return NULL; + } + + tag =3D skb_tail_pointer(skb) - KSZ_EGRESS_TAG_LEN; + + return ksz_common_rcv(skb, dev, tag[0] & KSZ8795_TAIL_TAG_EG_PORT_M, + KSZ_EGRESS_TAG_LEN); +} + +static const struct dsa_device_ops ksz8795_netdev_ops =3D { + .name =3D KSZ8795_NAME, + .proto =3D DSA_TAG_PROTO_KSZ8795, + .xmit =3D ksz8795_xmit, + .rcv =3D ksz8795_rcv, + .needed_tailroom =3D KSZ_INGRESS_TAG_LEN, +}; + +DSA_TAG_DRIVER(ksz8795_netdev_ops); +MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_KSZ8795, KSZ8795_NAME); + #define KSZ9893_TAIL_TAG_PRIO GENMASK(4, 3) #define KSZ9893_TAIL_TAG_OVERRIDE BIT(5) #define KSZ9893_TAIL_TAG_LOOKUP BIT(6) --=20 2.54.0 From nobody Sat Jul 25 21:59:22 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 9DCD836AB5A for ; Mon, 13 Jul 2026 07:11:47 +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=1783926709; cv=none; b=otNsdb+ip+DEzvVMYzIBKyOzuVoTSZQ+vH3Sy3oDWStlyI5hvTsW5f2vLXikEaGmk+Y53AV5sr1lWzRJ6UxA9oU6QT6GYIgou/lFfqmBUGfawLMSt7Yohln/pFuS3PayAb+l1Q2SzZ2D6vDfvAoQAiN2QggMPLUoFa9zJALoDH8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783926709; c=relaxed/simple; bh=KcRnAacbUb1U1qpPj32Xg0y3dcBts07hc7eNi6V5GcI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Eug3KbcPGwr7EBUT7FopIJ7SV1JqA/OJ/MbtwqL9fS+5028jNfQ+z+hCgV110vQt+GesiN7et/Bs5JiukjvJ/jk6ct2C6Hr2o3crsIQfoa94Oivh52KefEbcCP0Zdh9R/j0KsN0rOhupGTzjvSjijbDp5x7BQJE3Stncd0mDJk8= 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=Y8C0t6Zl; 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="Y8C0t6Zl" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 59BAA1A0F8F; Mon, 13 Jul 2026 07:11:42 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 2850960341; Mon, 13 Jul 2026 07:11:42 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 628C311BD3A1E; Mon, 13 Jul 2026 09:11:39 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1783926701; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=DB/AuADM3cKTTPWyDwbhPOvmCpqeymWC83FnlPAt0eM=; b=Y8C0t6ZlIDOkOVoIQCUBAi2GUlG5tXhA+pzLuqoyIwnwk3NF5LTPTXt7kli8bLNOyO0q07 wN/eKoQFtWYSISWCUsqZCyU3+DozT8r7L4hl5hQu7ZgnZZwo4/C7wgrZVunGtAlEuorJsn omJmc/39vL8PsxWLiLhR91qOgOKcHcR88KwA9os5aPgcxfWYjrt6wuuve40U4WiWVyYYtY KSrvWBlZ76mKsrOyBrb+0agsNc3hOX4yHkAfWgTsv+v7Rd8dP0lysFf6pHtBIkQENLwqUE eFDo6WcJtOnRoMjLTFCh9DVDcMeJtgMBfXkpFo+lJxVNus5whuqr+3LyKaTCJw== From: "Bastien Curutchet (Schneider Electric)" Date: Mon, 13 Jul 2026 09:11:26 +0200 Subject: [PATCH net-next v2 07/10] net: dsa: tag_ksz: share code for KSZ8795 and KSZ9893 xmit operations 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: <20260713-ksz-new-ptp-v2-7-7209c05058ef@bootlin.com> References: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> In-Reply-To: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , Russell King , Simon Horman , Maxime Chevallier Cc: Pascal Eberhard , =?utf-8?q?Miqu=C3=A8l_Raynal?= , Thomas Petazzoni , 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 KSZ8795 and KSZ9893 have very similar tag handling in the xmit path, leading to code duplication. There are only two differences between the two ksz*_xmit(): - the KSZ8795 doesn't handle priorities between frames - ksz8795_xmit() directly returns the SKB instead of calling ksz_defer_xmit(). Yet, ksz_defer_xmit() also returns directly the SKB if no clone is present inside the SKB. Clones are only created by the KSZ driver when the PTP feature is enabled. Since KSZ8795 doesn't support PTP, returning the SKB directly or ksz_defer_xmit() is the same. The upcoming support for the KSZ8463 also requires a similar xmit(). Gather the common code from ksz8795_xmit() and ksz9893_xmit() into a new ksz_common_xmit() function that takes three input arguments: - do_tstamp to tell whether ksz_xmit_timestamp() should be called - prio to give the priority tag (if any) - override_mask to give the location of the override bit (if any) Signed-off-by: Bastien Curutchet (Schneider Electric) --- net/dsa/tag_ksz.c | 73 ++++++++++++++++++++++++++-------------------------= ---- 1 file changed, 35 insertions(+), 38 deletions(-) diff --git a/net/dsa/tag_ksz.c b/net/dsa/tag_ksz.c index f58ce0f0e9e4..f8b40437c5fa 100644 --- a/net/dsa/tag_ksz.c +++ b/net/dsa/tag_ksz.c @@ -218,6 +218,37 @@ static struct sk_buff *ksz_defer_xmit(struct dsa_port = *dp, struct sk_buff *skb) return NULL; } =20 +static struct sk_buff *ksz_common_xmit(struct sk_buff *skb, + struct net_device *dev, + bool do_tstamp, + u8 prio, + u8 override_mask) +{ + struct dsa_port *dp =3D dsa_user_to_port(dev); + struct ethhdr *hdr; + u8 *tag; + + if (skb->ip_summed =3D=3D CHECKSUM_PARTIAL && skb_checksum_help(skb)) { + kfree_skb(skb); + return NULL; + } + + /* Tag encoding */ + if (do_tstamp) + ksz_xmit_timestamp(dp, skb); + + tag =3D skb_put(skb, KSZ_INGRESS_TAG_LEN); + hdr =3D skb_eth_hdr(skb); + + *tag =3D dsa_xmit_port_mask(skb, dev); + *tag |=3D prio; + + if (is_link_local_ether_addr(hdr->h_dest)) + *tag |=3D override_mask; + + return ksz_defer_xmit(dp, skb); +} + static struct sk_buff *ksz9477_xmit(struct sk_buff *skb, struct net_device *dev) { @@ -308,23 +339,7 @@ MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_KSZ9477, KSZ= 9477_NAME); =20 static struct sk_buff *ksz8795_xmit(struct sk_buff *skb, struct net_device= *dev) { - struct ethhdr *hdr; - u8 *tag; - - if (skb->ip_summed =3D=3D CHECKSUM_PARTIAL && skb_checksum_help(skb)) { - kfree_skb(skb); - return NULL; - } - - /* Tag encoding */ - tag =3D skb_put(skb, KSZ_INGRESS_TAG_LEN); - hdr =3D skb_eth_hdr(skb); - - *tag =3D dsa_xmit_port_mask(skb, dev); - if (is_link_local_ether_addr(hdr->h_dest)) - *tag |=3D KSZ8795_TAIL_TAG_OVERRIDE; - - return skb; + return ksz_common_xmit(skb, dev, false, 0, KSZ8795_TAIL_TAG_OVERRIDE); } =20 static struct sk_buff *ksz8795_rcv(struct sk_buff *skb, struct net_device = *dev) @@ -362,28 +377,10 @@ static struct sk_buff *ksz9893_xmit(struct sk_buff *s= kb, { u16 queue_mapping =3D skb_get_queue_mapping(skb); u8 prio =3D netdev_txq_to_tc(dev, queue_mapping); - struct dsa_port *dp =3D dsa_user_to_port(dev); - struct ethhdr *hdr; - u8 *tag; - - if (skb->ip_summed =3D=3D CHECKSUM_PARTIAL && skb_checksum_help(skb)) { - kfree_skb(skb); - return NULL; - } - - /* Tag encoding */ - ksz_xmit_timestamp(dp, skb); - - tag =3D skb_put(skb, KSZ_INGRESS_TAG_LEN); - hdr =3D skb_eth_hdr(skb); - - *tag =3D dsa_xmit_port_mask(skb, dev); - *tag |=3D FIELD_PREP(KSZ9893_TAIL_TAG_PRIO, prio); =20 - if (is_link_local_ether_addr(hdr->h_dest)) - *tag |=3D KSZ9893_TAIL_TAG_OVERRIDE; - - return ksz_defer_xmit(dp, skb); + return ksz_common_xmit(skb, dev, true, + FIELD_PREP(KSZ9893_TAIL_TAG_PRIO, prio), + KSZ9893_TAIL_TAG_OVERRIDE); } =20 static const struct dsa_device_ops ksz9893_netdev_ops =3D { --=20 2.54.0 From nobody Sat Jul 25 21:59:22 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 8555C367B99 for ; Mon, 13 Jul 2026 07:11:45 +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=1783926707; cv=none; b=VopGrNFWmsAVpxsw7DreV4nyb0Bt+dYYmthRikP9S0namVJ2u6Pj7bwUS+qqIgdNnFXrt0++4JLCGwsVlFw79bQUeapHVQujesJTxpjQcckZhqR6xPuM3f2FmYSEmVX2PtchtYYEf+yQ3mfu+jQ/wcgA194OzdVIklfhDzY22ww= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783926707; c=relaxed/simple; bh=q9+CaBE2p5hxqIvTumuH42Mw0MOLqWg2nAFMQc5Vwh0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=c75hsqocSn6gNu4/wN6S/7OEX++N27/bulgjlmMD8/c5WL5eIG2vYvN9MmtMl5CU3YNFQpqhVyMCyAGx5DaK11gyzLG9bIf0p98WbzbHC4FyxhZLLxyUarcGcVEFQUXZywKTEUca1Aaqt5OKi+ZNu8sJKoztaDJGVMeDVxx63eE= 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=FkIGHL7R; 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="FkIGHL7R" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 418E4C2BB10; Mon, 13 Jul 2026 07:12:00 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 4B76060341; Mon, 13 Jul 2026 07:11:44 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 5458511BD0B6C; Mon, 13 Jul 2026 09:11:41 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1783926703; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=ikfybQHyWnsEsqOHcwnA08WniODFLXWOoRVlNWE1okI=; b=FkIGHL7RxNM70MwcyIi6FTcN6akfmg1oDIxP6/mGfHM4ZktVcJ+N0Qy751jI9/fW/As9x7 JbqT2bzbo9g9xvZwZUnQYI2/miz23HH9lG/8kasFN9MBrejsl/Z4mnlK99gaeztaxziqI1 GsJFa4qBjLDBGrJAnRnOYMY45WMcM1phE5/4tpFlSZk++5WkftA78VJ2hnlDxd7YqYay7w b1z+imEhS2v9Rh9DMG353B9u4HUd1oZNUOJFREBuFWA0WDlzQRXcC1D/7qpA1JNB6Ne+wa xV9xSUm0UMbihXrg8N/t1Otp5aTnrlAlm0lVUTLjnwCTdALJNLBe/8QPwwk0Hw== From: "Bastien Curutchet (Schneider Electric)" Date: Mon, 13 Jul 2026 09:11:27 +0200 Subject: [PATCH net-next v2 08/10] net: dsa: microchip: add KSZ8463 tail tag handling 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: <20260713-ksz-new-ptp-v2-8-7209c05058ef@bootlin.com> References: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> In-Reply-To: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , Russell King , Simon Horman , Maxime Chevallier Cc: Pascal Eberhard , =?utf-8?q?Miqu=C3=A8l_Raynal?= , Thomas Petazzoni , 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 KSZ8463 uses the KSZ9893 DSA TAG driver. However, the KSZ8463 doesn't use the tail tag to convey timestamps to the host as KSZ9893 does. It uses the reserved fields in the PTP header instead. Add a KSZ8463-specific DSA_TAG driver to handle KSZ8463 timestamps. There is no information in the tail tag to distinguish PTP packets from others so use the ptp_classify_raw() helper to find the PTP packets and extract the timestamp from their PTP headers. Signed-off-by: Bastien Curutchet (Schneider Electric) --- drivers/net/dsa/microchip/ksz8.c | 4 +-- include/net/dsa.h | 2 ++ net/dsa/tag_ksz.c | 65 ++++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 69 insertions(+), 2 deletions(-) diff --git a/drivers/net/dsa/microchip/ksz8.c b/drivers/net/dsa/microchip/k= sz8.c index 5e5bfc5cae2d..ac9e8ef5774a 100644 --- a/drivers/net/dsa/microchip/ksz8.c +++ b/drivers/net/dsa/microchip/ksz8.c @@ -2966,7 +2966,7 @@ static enum dsa_tag_protocol ksz8463_get_tag_protocol= (struct dsa_switch *ds, int port, enum dsa_tag_protocol mp) { - return DSA_TAG_PROTO_KSZ9893; + return DSA_TAG_PROTO_KSZ8463; } =20 static int ksz8463_connect_tag_protocol(struct dsa_switch *ds, @@ -2974,7 +2974,7 @@ static int ksz8463_connect_tag_protocol(struct dsa_sw= itch *ds, { struct ksz_tagger_data *tagger_data; =20 - if (proto !=3D DSA_TAG_PROTO_KSZ9893) + if (proto !=3D DSA_TAG_PROTO_KSZ8463) return -EPROTONOSUPPORT; =20 tagger_data =3D ksz_tagger_data(ds); diff --git a/include/net/dsa.h b/include/net/dsa.h index 8c16ef23cc10..6f7f5c17b532 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -59,6 +59,7 @@ struct tc_action; #define DSA_TAG_PROTO_MXL_GSW1XX_VALUE 31 #define DSA_TAG_PROTO_MXL862_VALUE 32 #define DSA_TAG_PROTO_NETC_VALUE 33 +#define DSA_TAG_PROTO_KSZ8463_VALUE 34 =20 enum dsa_tag_protocol { DSA_TAG_PROTO_NONE =3D DSA_TAG_PROTO_NONE_VALUE, @@ -95,6 +96,7 @@ enum dsa_tag_protocol { DSA_TAG_PROTO_MXL_GSW1XX =3D DSA_TAG_PROTO_MXL_GSW1XX_VALUE, DSA_TAG_PROTO_MXL862 =3D DSA_TAG_PROTO_MXL862_VALUE, DSA_TAG_PROTO_NETC =3D DSA_TAG_PROTO_NETC_VALUE, + DSA_TAG_PROTO_KSZ8463 =3D DSA_TAG_PROTO_KSZ8463_VALUE, }; =20 struct dsa_switch; diff --git a/net/dsa/tag_ksz.c b/net/dsa/tag_ksz.c index f8b40437c5fa..477f2997c1a3 100644 --- a/net/dsa/tag_ksz.c +++ b/net/dsa/tag_ksz.c @@ -12,6 +12,7 @@ =20 #include "tag.h" =20 +#define KSZ8463_NAME "ksz8463" #define KSZ8795_NAME "ksz8795" #define KSZ9477_NAME "ksz9477" #define KSZ9893_NAME "ksz9893" @@ -396,6 +397,69 @@ static const struct dsa_device_ops ksz9893_netdev_ops = =3D { DSA_TAG_DRIVER(ksz9893_netdev_ops); MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_KSZ9893, KSZ9893_NAME); =20 +#define KSZ8463_TAIL_TAG_PRIO GENMASK(4, 3) +#define KSZ8463_TAIL_TAG_EG_PORT_M GENMASK(2, 0) + +static struct sk_buff *ksz8463_xmit(struct sk_buff *skb, + struct net_device *dev) +{ + u16 queue_mapping =3D skb_get_queue_mapping(skb); + u8 prio =3D netdev_txq_to_tc(dev, queue_mapping); + + return ksz_common_xmit(skb, dev, false, + FIELD_PREP(KSZ8463_TAIL_TAG_PRIO, prio), + 0); +} + +static struct sk_buff *ksz8463_rcv(struct sk_buff *skb, struct net_device = *dev) +{ + unsigned int len =3D KSZ_EGRESS_TAG_LEN; + struct ptp_header *ptp_hdr; + unsigned int ptp_class; + unsigned int port; + ktime_t ts; + u8 *tag; + + if (skb_linearize(skb)) { + kfree_skb(skb); + return NULL; + } + + /* Tag decoding */ + tag =3D skb_tail_pointer(skb) - KSZ_EGRESS_TAG_LEN; + port =3D tag[0] & KSZ8463_TAIL_TAG_EG_PORT_M; + + __skb_push(skb, ETH_HLEN); + ptp_class =3D ptp_classify_raw(skb); + __skb_pull(skb, ETH_HLEN); + if (ptp_class =3D=3D PTP_CLASS_NONE) + goto common_rcv; + + ptp_hdr =3D ptp_parse_header(skb, ptp_class); + if (ptp_hdr) { + ts =3D ksz_decode_tstamp(get_unaligned_be32(&ptp_hdr->reserved2)); + KSZ_SKB_CB(skb)->tstamp =3D ts; + ptp_hdr->reserved2 =3D 0; + skb->ip_summed =3D CHECKSUM_NONE; + } + +common_rcv: + return ksz_common_rcv(skb, dev, port, len); +} + +static const struct dsa_device_ops ksz8463_netdev_ops =3D { + .name =3D KSZ8463_NAME, + .proto =3D DSA_TAG_PROTO_KSZ8463, + .xmit =3D ksz8463_xmit, + .rcv =3D ksz8463_rcv, + .connect =3D ksz_connect, + .disconnect =3D ksz_disconnect, + .needed_tailroom =3D KSZ_INGRESS_TAG_LEN, +}; + +DSA_TAG_DRIVER(ksz8463_netdev_ops); +MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_KSZ8463, KSZ8463_NAME); + /* For xmit, 2/6 bytes are added before FCS. * -----------------------------------------------------------------------= ---- * DA(6bytes)|SA(6bytes)|....|Data(nbytes)|ts(4bytes)|tag0(1byte)|tag1(1by= te)| @@ -468,6 +532,7 @@ DSA_TAG_DRIVER(lan937x_netdev_ops); MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_LAN937X, LAN937X_NAME); =20 static struct dsa_tag_driver *dsa_tag_driver_array[] =3D { + &DSA_TAG_DRIVER_NAME(ksz8463_netdev_ops), &DSA_TAG_DRIVER_NAME(ksz8795_netdev_ops), &DSA_TAG_DRIVER_NAME(ksz9477_netdev_ops), &DSA_TAG_DRIVER_NAME(ksz9893_netdev_ops), --=20 2.54.0 From nobody Sat Jul 25 21:59:22 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 6CD53370D4D for ; Mon, 13 Jul 2026 07:11:48 +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=1783926710; cv=none; b=DvseZKEuRC+thnhNMxe23ROiTTLqjN1hSHwREMxuUNq8I65sSZrAGRs5u5oPWAFp9quyIeM67bqBiwA+rZRGSzb3UbskjffrUzrwdfxCopAkiNYYrgeC7eWNSPp0CKeChSopSOHhcb2AFabmT6XNJCB0ZT4QVanfxI5qKAIizKE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783926710; c=relaxed/simple; bh=0tx5h/gOw7mSpA6bQ0Ivylr29fJutlF0yRBcE/DtAMQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bi8Z7vWGY3jawoo2khw3/bsPp9iKTs93vxqmMEgFUNA9xAd7eYmix/nd1V6/rVraDnFCC9dnw49ek9W+BEUslKmEc0HDoJBbGdBTRnNeuK5gTqyxUgNykmtEmHSB4MQ5shNl+bkx4/ERP2BpohlN7+k3B/MxNr9xN29gl37tDAw= 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=STJovxC/; 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="STJovxC/" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 44EEFC2BB11; Mon, 13 Jul 2026 07:12:03 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 4C7A860341; Mon, 13 Jul 2026 07:11:47 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 9F36911BD3A3D; Mon, 13 Jul 2026 09:11:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1783926705; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=lNaj+7pmUwVXwV8Z90r3nasLl/i2CdZABVfDqyXQdbo=; b=STJovxC/VfEKBizaWvwjz4PuaSUSXqXT0t0n0+hSHVLNMa25RFtQEZlmqNhz+WJo8lDBZ8 4NLNN+na/vHxA8TAPYGPxAAQmPmKpIL7KPGYyucuQMnHTYOSPZ9qHlkheSXNEcBds6BU8Y XQPhWomUU1WoxvDEdBsXqS2+8WA8dVJvDvXh6gIuRl115HuK56pByX06aaCi3bcKeRehv4 HH/QSWqjeddYarySxrWc6BaaWTzJWXBYtfz35OQXJAajIoTL/iE0g6K5zFjcbXL9WOsi4V NjW8UJJQJZU1KJ6WtKtjZPMtbjo+woC4OCSq3lyaT+BcNVtfy3vYQs5M+90ptg== From: "Bastien Curutchet (Schneider Electric)" Date: Mon, 13 Jul 2026 09:11:28 +0200 Subject: [PATCH net-next v2 09/10] net: dsa: microchip: explicitly enable detection of L2 PTP frames 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: <20260713-ksz-new-ptp-v2-9-7209c05058ef@bootlin.com> References: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> In-Reply-To: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , Russell King , Simon Horman , Maxime Chevallier Cc: Pascal Eberhard , =?utf-8?q?Miqu=C3=A8l_Raynal?= , Thomas Petazzoni , 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 Detection of L2 PTP frames needs to be enabled for PTP to work at the L2 layer. The bit enabling this detection is set by default on the switches currently supported by the driver, but it is unset by default on the KSZ8463 for which support will be added in upcoming patches. Explicitly enable the detection of L2 PTP frames for all switches when PTP is enabled. Signed-off-by: Bastien Curutchet (Schneider Electric) --- drivers/net/dsa/microchip/ksz_ptp.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/net/dsa/microchip/ksz_ptp.c b/drivers/net/dsa/microchi= p/ksz_ptp.c index 89fbc1253f25..be6b8240ac03 100644 --- a/drivers/net/dsa/microchip/ksz_ptp.c +++ b/drivers/net/dsa/microchip/ksz_ptp.c @@ -953,8 +953,9 @@ int ksz_ptp_clock_register(struct dsa_switch *ds) /* Currently only P2P mode is supported. When 802_1AS bit is set, it * forwards all PTP packets to host port and none to other ports. */ - ret =3D ksz_rmw16(dev, regs[PTP_MSG_CONF1], PTP_TC_P2P | PTP_802_1AS, - PTP_TC_P2P | PTP_802_1AS); + ret =3D ksz_rmw16(dev, regs[PTP_MSG_CONF1], + PTP_TC_P2P | PTP_802_1AS | PTP_ETH_ENABLE, + PTP_TC_P2P | PTP_802_1AS | PTP_ETH_ENABLE); if (ret) return ret; =20 --=20 2.54.0 From nobody Sat Jul 25 21:59:22 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 2347638D69D; Mon, 13 Jul 2026 07:11:50 +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=1783926713; cv=none; b=FOxUa32IVjKQRhzLcg2w7nw2wGYHdT54YIUlJq/AaVw80Qn/CdgPY9A273qwZQvEX5xkGr3laCn9lm2mK9i1gGv4mCdUME2Svsg8HOgPmeJwlCy7X033BfDEzDLxPPrOlaxbo0xAKkl3ETlPV+wf/JUypN3xUKarIOVIKrxmc0c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783926713; c=relaxed/simple; bh=Wclv/BHO+taVENsrAHn67R6CCgmYWP2bMP0vR1LvhyQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=f3ijHkQvkLGcB3vfV+eYg9QOELkcgyKNG2ie46eRa7ZMi4QBAB7kLKlnJNd1TdaJN6yGpKzDGmfrzWdigfx7BfAIUT2e5ivPAxeppHE485W11YRBrMTVK8MxeY6ND4ZlfrHZygchJAOjt5lFpiRw3QJJAIxtDl0LdBMKk9SVCv0= 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=xUpHShP/; 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="xUpHShP/" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id C6F2B1A0F8F; Mon, 13 Jul 2026 07:11:49 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 9AA9460341; Mon, 13 Jul 2026 07:11:49 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 65B5911BD3A38; Mon, 13 Jul 2026 09:11:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1783926708; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=x1wE4bzG1YByHcV2pcvoWqVC4cjm1fuZsw8pRiim5t0=; b=xUpHShP/7TAt2/ijsDqCkQKaU1tzMdzQzvBz0fMAFAKrosX2HoY5uTthsfwxDZZ75gDPHP jXpnSkuB2h+IrlByrp+gwuCp2Dxk6tMwWbCQbgVUao8CXB2L8A6xGtcI/0jBb+NaNiLSCV 2ZhikHfU1p7fIcYNIE5eCI3Qm/of2xrmO6fHg2KowryD54O41fdR7F8f+MIJT4Uut5+2lb lQ5Ho9EuM4v6Y1AcitBEkRK/qM4An7QouH8z4LL6TT8NTziP9MFwx0mLsIudgcz/9/ukJ1 P4QhYan/vLtDTVqoe/U2seTE6zhZVuKkFzqQizN4dXsPZ9/JXhktYq9DCBL3ww== From: "Bastien Curutchet (Schneider Electric)" Date: Mon, 13 Jul 2026 09:11:29 +0200 Subject: [PATCH net-next v2 10/10] net: dsa: microchip: add two-steps PTP support for KSZ8463 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: <20260713-ksz-new-ptp-v2-10-7209c05058ef@bootlin.com> References: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> In-Reply-To: <20260713-ksz-new-ptp-v2-0-7209c05058ef@bootlin.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , Russell King , Simon Horman , Maxime Chevallier Cc: Pascal Eberhard , =?utf-8?q?Miqu=C3=A8l_Raynal?= , Thomas Petazzoni , 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 The KSZ8463 switch supports PTP but it's not supported by the driver. Add L2 two-step PTP support for the KSZ8463. IPv4 and IPv6 layers aren't supported. Neither is one-step PTP. Use KSZ8463-specific implementations of the .get_ts_info and .port_hwtstamp_set callbacks. The pdelay_req and pdelay_resp timestamps share one interrupt bit status while they're located in two different registers. So introduce last_tx_is_pdelayresp to keep track of the last sent event type. This flag is set by the xmit worker right before sending the packet and then used in the interrupt handler to retrieve the timestamp location. Signed-off-by: Bastien Curutchet (Schneider Electric) --- drivers/net/dsa/microchip/ksz8.c | 26 +++++-- drivers/net/dsa/microchip/ksz8_reg.h | 1 + drivers/net/dsa/microchip/ksz_common.h | 1 + drivers/net/dsa/microchip/ksz_ptp.c | 130 ++++++++++++++++++++++++++++= +++- drivers/net/dsa/microchip/ksz_ptp.h | 7 ++ drivers/net/dsa/microchip/ksz_ptp_reg.h | 4 + 6 files changed, 162 insertions(+), 7 deletions(-) diff --git a/drivers/net/dsa/microchip/ksz8.c b/drivers/net/dsa/microchip/k= sz8.c index ac9e8ef5774a..941ae9f66f70 100644 --- a/drivers/net/dsa/microchip/ksz8.c +++ b/drivers/net/dsa/microchip/ksz8.c @@ -242,8 +242,11 @@ static int ksz8463_girq_setup(struct ksz_device *dev) =20 static int ksz8463_reset_switch(struct ksz_device *dev) { - ksz_cfg(dev, KSZ8463_REG_SW_RESET, KSZ8463_GLOBAL_SOFTWARE_RESET, true); - ksz_cfg(dev, KSZ8463_REG_SW_RESET, KSZ8463_GLOBAL_SOFTWARE_RESET, + ksz_cfg(dev, KSZ8463_REG_SW_RESET, + KSZ8463_GLOBAL_SOFTWARE_RESET | KSZ8463_PTP_SOFTWARE_RESET, + true); + ksz_cfg(dev, KSZ8463_REG_SW_RESET, + KSZ8463_GLOBAL_SOFTWARE_RESET | KSZ8463_PTP_SOFTWARE_RESET, false); return 0; } @@ -2474,17 +2477,24 @@ static int ksz8463_setup(struct dsa_switch *ds) ret =3D ksz8463_ptp_irq_setup(ds); if (ret) goto free_girq; + + ret =3D ksz_ptp_clock_register(ds); + if (ret) { + dev_err(dev->dev, "Failed to register PTP clock: %d\n", + ret); + goto free_ptp_irq; + } } =20 ret =3D ksz_mdio_register(dev); if (ret < 0) { dev_err(dev->dev, "failed to register the mdio"); - goto free_ptp_irq; + goto ptp_clock_unregister; } =20 ret =3D ksz_dcb_init(dev); if (ret) - goto free_ptp_irq; + goto ptp_clock_unregister; =20 /* start switch */ regmap_update_bits(ksz_regmap_8(dev), regs[S_START_CTRL], @@ -2492,6 +2502,9 @@ static int ksz8463_setup(struct dsa_switch *ds) =20 return 0; =20 +ptp_clock_unregister: + if (dev->irq > 0) + ksz_ptp_clock_unregister(ds); free_ptp_irq: if (dev->irq > 0) ksz8463_ptp_irq_free(ds); @@ -2507,6 +2520,7 @@ static void ksz8463_teardown(struct dsa_switch *ds) struct ksz_device *dev =3D ds->priv; =20 if (dev->irq > 0) { + ksz_ptp_clock_unregister(ds); ksz8463_ptp_irq_free(ds); ksz_irq_free(&dev->girq); } @@ -3129,9 +3143,9 @@ const struct dsa_switch_ops ksz8463_switch_ops =3D { .port_max_mtu =3D ksz88xx_max_mtu, .suspend =3D ksz_suspend, .resume =3D ksz_resume, - .get_ts_info =3D ksz_get_ts_info, + .get_ts_info =3D ksz8463_get_ts_info, .port_hwtstamp_get =3D ksz_hwtstamp_get, - .port_hwtstamp_set =3D ksz_hwtstamp_set, + .port_hwtstamp_set =3D ksz8463_hwtstamp_set, .port_txtstamp =3D ksz_port_txtstamp, .port_rxtstamp =3D ksz_port_rxtstamp, .port_setup_tc =3D ksz8_setup_tc, diff --git a/drivers/net/dsa/microchip/ksz8_reg.h b/drivers/net/dsa/microch= ip/ksz8_reg.h index 981ab441d9b7..6bc511da1f7d 100644 --- a/drivers/net/dsa/microchip/ksz8_reg.h +++ b/drivers/net/dsa/microchip/ksz8_reg.h @@ -786,6 +786,7 @@ #define KSZ8463_REG_SW_RESET 0x126 =20 #define KSZ8463_GLOBAL_SOFTWARE_RESET BIT(0) +#define KSZ8463_PTP_SOFTWARE_RESET BIT(2) =20 #define KSZ8463_PTP_CLK_CTRL 0x600 =20 diff --git a/drivers/net/dsa/microchip/ksz_common.h b/drivers/net/dsa/micro= chip/ksz_common.h index 0f2abb22ca91..cbe98494578c 100644 --- a/drivers/net/dsa/microchip/ksz_common.h +++ b/drivers/net/dsa/microchip/ksz_common.h @@ -194,6 +194,7 @@ struct ksz_port { struct kernel_hwtstamp_config tstamp_config; bool hwts_tx_en; bool hwts_rx_en; + bool last_tx_is_pdelayresp; struct ksz_irq ptpirq; struct ksz_ptp_irq ptpmsg_irq[3]; ktime_t tstamp_msg; diff --git a/drivers/net/dsa/microchip/ksz_ptp.c b/drivers/net/dsa/microchi= p/ksz_ptp.c index be6b8240ac03..1cd2940c7bef 100644 --- a/drivers/net/dsa/microchip/ksz_ptp.c +++ b/drivers/net/dsa/microchip/ksz_ptp.c @@ -297,6 +297,31 @@ static int ksz_ptp_enable_mode(struct ksz_device *dev) tag_en ? PTP_ENABLE : 0); } =20 +int ksz8463_get_ts_info(struct dsa_switch *ds, int port, + struct kernel_ethtool_ts_info *ts) +{ + struct ksz_device *dev =3D ds->priv; + struct ksz_ptp_data *ptp_data; + + ptp_data =3D &dev->ptp_data; + + if (!ptp_data->clock) + return -ENODEV; + + ts->so_timestamping =3D SOF_TIMESTAMPING_TX_HARDWARE | + SOF_TIMESTAMPING_RX_HARDWARE | + SOF_TIMESTAMPING_RAW_HARDWARE; + + ts->tx_types =3D BIT(HWTSTAMP_TX_OFF) | BIT(HWTSTAMP_TX_ON); + + ts->rx_filters =3D BIT(HWTSTAMP_FILTER_NONE) | + BIT(HWTSTAMP_FILTER_PTP_V2_L2_EVENT); + + ts->phc_index =3D ptp_clock_index(ptp_data->clock); + + return 0; +} + /* The function is return back the capability of timestamping feature when * requested through ethtool -T utility */ @@ -341,6 +366,72 @@ int ksz_hwtstamp_get(struct dsa_switch *ds, int port, return 0; } =20 +static int ksz8463_set_hwtstamp_config(struct ksz_device *dev, + struct ksz_port *prt, + struct kernel_hwtstamp_config *config) +{ + const u16 *regs =3D dev->info->regs; + int ret; + + if (config->flags) + return -EINVAL; + + switch (config->tx_type) { + case HWTSTAMP_TX_OFF: + prt->ptpmsg_irq[KSZ8463_SYNC_MSG].ts_en =3D false; + prt->ptpmsg_irq[KSZ8463_XDREQ_PDRES_MSG].ts_en =3D false; + prt->hwts_tx_en =3D false; + break; + case HWTSTAMP_TX_ON: + prt->ptpmsg_irq[KSZ8463_SYNC_MSG].ts_en =3D true; + prt->ptpmsg_irq[KSZ8463_XDREQ_PDRES_MSG].ts_en =3D true; + prt->hwts_tx_en =3D true; + + ret =3D ksz_rmw16(dev, regs[PTP_MSG_CONF1], PTP_1STEP, 0); + if (ret) + return ret; + + break; + default: + return -ERANGE; + } + + switch (config->rx_filter) { + case HWTSTAMP_FILTER_NONE: + prt->hwts_rx_en =3D false; + break; + case HWTSTAMP_FILTER_PTP_V2_L2_EVENT: + case HWTSTAMP_FILTER_PTP_V2_L2_SYNC: + config->rx_filter =3D HWTSTAMP_FILTER_PTP_V2_L2_EVENT; + prt->hwts_rx_en =3D true; + break; + default: + config->rx_filter =3D HWTSTAMP_FILTER_NONE; + return -ERANGE; + } + + return ksz_ptp_enable_mode(dev); +} + +int ksz8463_hwtstamp_set(struct dsa_switch *ds, int port, + struct kernel_hwtstamp_config *config, + struct netlink_ext_ack *extack) +{ + struct ksz_device *dev =3D ds->priv; + struct ksz_port *prt; + int ret; + + prt =3D &dev->ports[port]; + + ret =3D ksz8463_set_hwtstamp_config(dev, prt, config); + if (ret) + return ret; + + prt->tstamp_config =3D *config; + + return 0; +} + static int ksz_set_hwtstamp_config(struct ksz_device *dev, struct ksz_port *prt, struct kernel_hwtstamp_config *config) @@ -571,6 +662,31 @@ static void ksz_ptp_txtstamp_skb(struct ksz_device *de= v, skb_complete_tx_timestamp(skb, &hwtstamps); } =20 +static void ksz8463_set_pdelayresp_flag(struct ksz_port *prt, + struct sk_buff *skb) +{ + struct ptp_header *hdr; + unsigned int type; + u8 ptp_msg_type; + + if (!ksz_is_ksz8463(prt->ksz_dev)) + return; + + if (skb_linearize(skb)) + return; + + type =3D ptp_classify_raw(skb); + if (type =3D=3D PTP_CLASS_NONE) + return; + + hdr =3D ptp_parse_header(skb, type); + if (!hdr) + return; + + ptp_msg_type =3D ptp_get_msgtype(hdr, type); + prt->last_tx_is_pdelayresp =3D (ptp_msg_type =3D=3D PTP_MSGTYPE_PDELAY_RE= SP); +} + void ksz_port_deferred_xmit(struct kthread_work *work) { struct ksz_deferred_xmit_work *xmit_work =3D work_to_xmit_work(work); @@ -587,6 +703,8 @@ void ksz_port_deferred_xmit(struct kthread_work *work) =20 reinit_completion(&prt->tstamp_msg_comp); =20 + ksz8463_set_pdelayresp_flag(prt, skb); + dsa_enqueue_skb(skb, skb->dev); =20 ksz_ptp_txtstamp_skb(dev, prt, clone); @@ -979,7 +1097,17 @@ void ksz_ptp_clock_unregister(struct dsa_switch *ds) =20 static int ksz_read_ts(struct ksz_port *port, u16 reg, u32 *ts) { - return ksz_read32(port->ksz_dev, reg, ts); + u16 ts_reg =3D reg; + + /** + * On KSZ8463 DREQ and DRESP timestamps share one interrupt line + * so we have to check the nature of the latest event sent to know + * where the timestamp is located + */ + if (ksz_is_ksz8463(port->ksz_dev) && port->last_tx_is_pdelayresp) + ts_reg +=3D KSZ8463_DRESP_TS_OFFSET; + + return ksz_read32(port->ksz_dev, ts_reg, ts); } =20 static irqreturn_t ksz_ptp_msg_thread_fn(int irq, void *dev_id) diff --git a/drivers/net/dsa/microchip/ksz_ptp.h b/drivers/net/dsa/microchi= p/ksz_ptp.h index 11408580031d..7067ec9bd1e6 100644 --- a/drivers/net/dsa/microchip/ksz_ptp.h +++ b/drivers/net/dsa/microchip/ksz_ptp.h @@ -39,11 +39,16 @@ void ksz_ptp_clock_unregister(struct dsa_switch *ds); =20 int ksz_get_ts_info(struct dsa_switch *ds, int port, struct kernel_ethtool_ts_info *ts); +int ksz8463_get_ts_info(struct dsa_switch *ds, int port, + struct kernel_ethtool_ts_info *ts); int ksz_hwtstamp_get(struct dsa_switch *ds, int port, struct kernel_hwtstamp_config *config); int ksz_hwtstamp_set(struct dsa_switch *ds, int port, struct kernel_hwtstamp_config *config, struct netlink_ext_ack *extack); +int ksz8463_hwtstamp_set(struct dsa_switch *ds, int port, + struct kernel_hwtstamp_config *config, + struct netlink_ext_ack *extack); void ksz_port_txtstamp(struct dsa_switch *ds, int port, struct sk_buff *sk= b); void ksz_port_deferred_xmit(struct kthread_work *work); bool ksz_port_rxtstamp(struct dsa_switch *ds, int port, struct sk_buff *sk= b, @@ -82,10 +87,12 @@ static inline int ksz8463_ptp_irq_setup(struct dsa_swit= ch *ds) static inline void ksz8463_ptp_irq_free(struct dsa_switch *ds) {} =20 #define ksz_get_ts_info NULL +#define ksz8463_get_ts_info NULL =20 #define ksz_hwtstamp_get NULL =20 #define ksz_hwtstamp_set NULL +#define ksz8463_hwtstamp_set NULL =20 #define ksz_port_rxtstamp NULL =20 diff --git a/drivers/net/dsa/microchip/ksz_ptp_reg.h b/drivers/net/dsa/micr= ochip/ksz_ptp_reg.h index 1a669d6ee889..65ea8577af75 100644 --- a/drivers/net/dsa/microchip/ksz_ptp_reg.h +++ b/drivers/net/dsa/microchip/ksz_ptp_reg.h @@ -137,4 +137,8 @@ #define KSZ_XDREQ_MSG 1 #define KSZ_PDRES_MSG 0 =20 +#define KSZ8463_DRESP_TS_OFFSET (KSZ8463_REG_PORT_DRESP_TS - KSZ8463_REG_= PORT_DREQ_TS) +#define KSZ8463_SYNC_MSG 0 +#define KSZ8463_XDREQ_PDRES_MSG 1 + #endif --=20 2.54.0