From nobody Fri Apr 3 05:00:01 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 5E5353A2546; Wed, 4 Mar 2026 10:19:12 +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=1772619556; cv=none; b=Z7VM+TRLRrbyIM7zoCB4HcVLaF9H8YxtobKfkXTO3AoYKZI7OexOM2etaBr0+kbUANUj5NI8P7qyVl/Y6g6mO6vEdqg2kQUMADYSjNlPO6HSRHFrRBcujn5gVggPxDDqhgWJPiU0XtHy9ASkma2ETUSnH9140qTw3THSH+W3SJo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772619556; c=relaxed/simple; bh=SS2r0x9fJePpa8zmgS9MB4sz3aG3ECRVaSr1UTx4t2Y=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=caJZcTh3twz4B6mRdqsILe98sv2Gnv38W7yFileGGRlsxjX/9azPAKNVseiQVQNswgTiQNeEvBzL4StPpt52WRmPkGYEqMueb86blxwHXQeKkS7B/5o1omdFJrlOT3TLS5haX5onXtSyEsphmYbeUt4zWcgNWeMw7UQmZrPZdrY= 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=Dam2SYT5; 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="Dam2SYT5" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 10A3FC40FBD; Wed, 4 Mar 2026 10:19:29 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 032475FF5C; Wed, 4 Mar 2026 10:19:11 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 2D0D310369785; Wed, 4 Mar 2026 11:19:08 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1772619549; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:references; bh=RCz7ZiFxHupdO6m0tzR5VygQNoN38bElGRsCY7k3JYI=; b=Dam2SYT5PxrMe9cvohV8tgLtKJQ8s9HMrhyWO8H6hzauM/zwY7ATNSqsl6nbYZBDChylwx 42ZBr6aIFE4oOTcJaZ4C5+YFP72fnyAGAorgQmZpXukRyLctL8lfdd8fKC6AKCBPX9eJR+ C2qe12nE/0QXIJnLxGRpkR+yLQncF1lpzBdYj0XW5vytipWJ5BPnVwoztZ2N7DPMghwE9A pAORoQkLRKzNBrbD7Wm8xob/svz17MsgnZxsMKox/OmuCEXnGhnlHjM7fS2viM8+72uH/0 FUK+2t06WuMU1BMq7eJOJ3pWzDe+GplPr4Z3uQKIaBLJZFXcXYwSr4BNToK3Vw== From: "Bastien Curutchet (Schneider Electric)" Date: Wed, 04 Mar 2026 11:18:56 +0100 Subject: [PATCH net-next v6 5/9] 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: <20260304-ksz8463-ptp-v6-5-3f4c47954c71@bootlin.com> References: <20260304-ksz8463-ptp-v6-0-3f4c47954c71@bootlin.com> In-Reply-To: <20260304-ksz8463-ptp-v6-0-3f4c47954c71@bootlin.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , Simon Horman 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.2 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(). Move KSZ8795 operations below the definition of ksz_defer_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 | 161 +++++++++++++++++++++++++++-----------------------= ---- 1 file changed, 80 insertions(+), 81 deletions(-) diff --git a/net/dsa/tag_ksz.c b/net/dsa/tag_ksz.c index d2475c3bbb7d227bb42b0368914275b00fb2784a..6ec9bcb324a953d988ef665a177= 566159e27027f 100644 --- a/net/dsa/tag_ksz.c +++ b/net/dsa/tag_ksz.c @@ -99,68 +99,6 @@ static struct sk_buff *ksz_common_rcv(struct sk_buff *sk= b, 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)) - 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)) - 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. * -----------------------------------------------------------------------= ---- @@ -274,6 +212,35 @@ 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)) + 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) { @@ -339,35 +306,67 @@ 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 -#define KSZ9893_TAIL_TAG_PRIO GENMASK(4, 3) -#define KSZ9893_TAIL_TAG_OVERRIDE BIT(5) -#define KSZ9893_TAIL_TAG_LOOKUP BIT(6) +/* + * 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) + */ =20 -static struct sk_buff *ksz9893_xmit(struct sk_buff *skb, - struct net_device *dev) +#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) +{ + return ksz_common_xmit(skb, dev, false, 0, KSZ8795_TAIL_TAG_OVERRIDE); +} + +static struct sk_buff *ksz8795_rcv(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); - struct dsa_port *dp =3D dsa_user_to_port(dev); - struct ethhdr *hdr; u8 *tag; =20 - if (skb->ip_summed =3D=3D CHECKSUM_PARTIAL && skb_checksum_help(skb)) + if (skb_linearize(skb)) return NULL; =20 - /* Tag encoding */ - ksz_xmit_timestamp(dp, skb); + tag =3D skb_tail_pointer(skb) - KSZ_EGRESS_TAG_LEN; =20 - tag =3D skb_put(skb, KSZ_INGRESS_TAG_LEN); - hdr =3D skb_eth_hdr(skb); + return ksz_common_rcv(skb, dev, tag[0] & KSZ8795_TAIL_TAG_EG_PORT_M, + KSZ_EGRESS_TAG_LEN); +} =20 - *tag =3D dsa_xmit_port_mask(skb, dev); - *tag |=3D FIELD_PREP(KSZ9893_TAIL_TAG_PRIO, prio); +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, +}; =20 - if (is_link_local_ether_addr(hdr->h_dest)) - *tag |=3D KSZ9893_TAIL_TAG_OVERRIDE; +DSA_TAG_DRIVER(ksz8795_netdev_ops); +MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_KSZ8795, KSZ8795_NAME); =20 - return ksz_defer_xmit(dp, skb); +#define KSZ9893_TAIL_TAG_PRIO GENMASK(4, 3) +#define KSZ9893_TAIL_TAG_OVERRIDE BIT(5) +#define KSZ9893_TAIL_TAG_LOOKUP BIT(6) + +static struct sk_buff *ksz9893_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, 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.53.0