From nobody Sat Feb 7 06:21:47 2026 Received: from pidgin.makrotopia.org (pidgin.makrotopia.org [185.142.180.65]) (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 942372E9ED6; Sun, 18 Jan 2026 03:45:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.142.180.65 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768707947; cv=none; b=fIx+XlDvl5DfbHxMAz2Y63Hr+WlsS9yxIFFaJMU9FjD12tP1qTquJuTsxchI4KxvG7a2P2gw5bJhggEH0NJFhee6Z7Xr2LFHsbPwphcKASpGMeF9tBFMn+4p5qyctuiDdre4EiFx1qNxYBZxn+zte6E3AO8Ul7y1p1X6/c6tpR4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768707947; c=relaxed/simple; bh=P+ZWT1a6FxBSlCD6AjPEmohSAJWxUihMMhPNqM7vbEM=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=d8bwH/ikekzyV/TxlM2T/manjl46JzAKb5PfM6iYBfiWEzkblk0OSjLwhl5hN+2NKM9N3zR5JF4M9c1uTWpBToXn/TM/vU/kn9Qx4hZW/5EyX6luFcVKF7UrCou59jkNsrGMy9TUsCKYGi/+vCaYd5nb/AzjxkeKCME3jb9Ncaw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=makrotopia.org; spf=pass smtp.mailfrom=makrotopia.org; arc=none smtp.client-ip=185.142.180.65 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=makrotopia.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=makrotopia.org Received: from local by pidgin.makrotopia.org with esmtpsa (TLS1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.99) (envelope-from ) id 1vhJjR-000000000jq-41bo; Sun, 18 Jan 2026 03:45:42 +0000 Date: Sun, 18 Jan 2026 03:45:33 +0000 From: Daniel Golle To: Daniel Golle , Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Heiner Kallweit , Russell King , Simon Horman , netdev@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Frank Wunderlich , Chad Monroe , Cezary Wilmanski , Avinash Jayaraman , Bing tao Xu , Liang Xu , Juraj Povazanec , "Fanni (Fang-Yi) Chan" , "Benny (Ying-Tsan) Weng" , "Livia M. Rosu" , John Crispin Subject: [PATCH v7 net-next 2/4] net: dsa: add tag format for MxL862xx switches Message-ID: <83b7dc3d7e689696b09bb25ea8991444ea578f68.1768707226.git.daniel@makrotopia.org> References: Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add proprietary special tag format for the MaxLinear MXL862xx family of switches. While using the same Ethertype as MaxLinear's GSW1xx switches, the actual tag format differs significantly, hence we need a dedicated tag driver for that. Signed-off-by: Daniel Golle --- v7: no changes v6: * remove unnecessary check for skb !=3D NULL * merge consecutively printed warnings into single dev_warn_ratelimited v5: * remove unused macro definitions RFC v4: * describe fields and variables with comments * sub-interface is only 5 bits * harmonize Kconfig symbol name * maintain alphabetic order in Kconfig * fix typo s/beginnig/beginning/ * fix typo s/swtiches/switches/ * arrange local variables in reverse xmas tree order RFC v3: no changes RFC v2: make sure all tag fields are initialized --- MAINTAINERS | 1 + include/net/dsa.h | 2 + net/dsa/Kconfig | 7 +++ net/dsa/Makefile | 1 + net/dsa/tag_mxl862xx.c | 112 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 123 insertions(+) create mode 100644 net/dsa/tag_mxl862xx.c diff --git a/MAINTAINERS b/MAINTAINERS index c5e07152ee30b..e7f87b1677146 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -15627,6 +15627,7 @@ M: Daniel Golle L: netdev@vger.kernel.org S: Maintained F: Documentation/devicetree/bindings/net/dsa/maxlinear,mxl862xx.yaml +F: net/dsa/tag_mxl862xx.c =20 MCAN DEVICE DRIVER M: Markus Schneider-Pargmann diff --git a/include/net/dsa.h b/include/net/dsa.h index 6b2b5ed64ea4c..1e33242b6d94d 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -57,6 +57,7 @@ struct tc_action; #define DSA_TAG_PROTO_BRCM_LEGACY_FCS_VALUE 29 #define DSA_TAG_PROTO_YT921X_VALUE 30 #define DSA_TAG_PROTO_MXL_GSW1XX_VALUE 31 +#define DSA_TAG_PROTO_MXL862_VALUE 32 =20 enum dsa_tag_protocol { DSA_TAG_PROTO_NONE =3D DSA_TAG_PROTO_NONE_VALUE, @@ -91,6 +92,7 @@ enum dsa_tag_protocol { DSA_TAG_PROTO_VSC73XX_8021Q =3D DSA_TAG_PROTO_VSC73XX_8021Q_VALUE, DSA_TAG_PROTO_YT921X =3D DSA_TAG_PROTO_YT921X_VALUE, DSA_TAG_PROTO_MXL_GSW1XX =3D DSA_TAG_PROTO_MXL_GSW1XX_VALUE, + DSA_TAG_PROTO_MXL862 =3D DSA_TAG_PROTO_MXL862_VALUE, }; =20 struct dsa_switch; diff --git a/net/dsa/Kconfig b/net/dsa/Kconfig index f86b30742122f..efc95759a10e1 100644 --- a/net/dsa/Kconfig +++ b/net/dsa/Kconfig @@ -104,6 +104,13 @@ config NET_DSA_TAG_MTK Say Y or M if you want to enable support for tagging frames for Mediatek switches. =20 +config NET_DSA_TAG_MXL_862XX + tristate "Tag driver for MxL862xx switches" + help + Say Y or M if you want to enable support for tagging frames for the + Maxlinear MxL86252 and MxL86282 switches using their native 8-byte + tagging protocol. + config NET_DSA_TAG_MXL_GSW1XX tristate "Tag driver for MaxLinear GSW1xx switches" help diff --git a/net/dsa/Makefile b/net/dsa/Makefile index 42d173f5a7013..bf7247759a64a 100644 --- a/net/dsa/Makefile +++ b/net/dsa/Makefile @@ -28,6 +28,7 @@ obj-$(CONFIG_NET_DSA_TAG_HELLCREEK) +=3D tag_hellcreek.o obj-$(CONFIG_NET_DSA_TAG_KSZ) +=3D tag_ksz.o obj-$(CONFIG_NET_DSA_TAG_LAN9303) +=3D tag_lan9303.o obj-$(CONFIG_NET_DSA_TAG_MTK) +=3D tag_mtk.o +obj-$(CONFIG_NET_DSA_TAG_MXL_862XX) +=3D tag_mxl862xx.o obj-$(CONFIG_NET_DSA_TAG_MXL_GSW1XX) +=3D tag_mxl-gsw1xx.o obj-$(CONFIG_NET_DSA_TAG_NONE) +=3D tag_none.o obj-$(CONFIG_NET_DSA_TAG_OCELOT) +=3D tag_ocelot.o diff --git a/net/dsa/tag_mxl862xx.c b/net/dsa/tag_mxl862xx.c new file mode 100644 index 0000000000000..def7be0d5d15f --- /dev/null +++ b/net/dsa/tag_mxl862xx.c @@ -0,0 +1,112 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * DSA Special Tag for MaxLinear 862xx switch chips + * + * Copyright (C) 2025 Daniel Golle + * Copyright (C) 2024 MaxLinear Inc. + */ + +#include +#include +#include +#include +#include "tag.h" + +#define MXL862_NAME "mxl862xx" + +#define MXL862_HEADER_LEN 8 + +/* Word 0 -> EtherType */ + +/* Word 2 */ +#define MXL862_SUBIF_ID GENMASK(4, 0) + +/* Word 3 */ +#define MXL862_IGP_EGP GENMASK(3, 0) + +static struct sk_buff *mxl862_tag_xmit(struct sk_buff *skb, + struct net_device *dev) +{ + unsigned int cpu_port, usr_port, sub_interface; + struct dsa_port *dp =3D dsa_user_to_port(dev); + struct dsa_port *cpu_dp =3D dp->cpu_dp; + __be16 *mxl862_tag; + + /* switch firmware expects ports to be counted starting from 1 */ + cpu_port =3D cpu_dp->index + 1; + usr_port =3D dp->index + 1; + + /* target port sub-interface ID relative to the CPU port */ + sub_interface =3D usr_port + 16 - cpu_port; + + /* provide additional space 'MXL862_HEADER_LEN' bytes */ + skb_push(skb, MXL862_HEADER_LEN); + + /* shift MAC address to the beginning of the enlarged buffer, + * releasing the space required for DSA tag (between MAC address and + * Ethertype) + */ + dsa_alloc_etype_header(skb, MXL862_HEADER_LEN); + + /* special tag ingress */ + mxl862_tag =3D dsa_etype_header_pos_tx(skb); + mxl862_tag[0] =3D htons(ETH_P_MXLGSW); + mxl862_tag[1] =3D 0; + mxl862_tag[2] =3D htons(FIELD_PREP(MXL862_SUBIF_ID, sub_interface)); + mxl862_tag[3] =3D htons(FIELD_PREP(MXL862_IGP_EGP, cpu_port)); + + return skb; +} + +static struct sk_buff *mxl862_tag_rcv(struct sk_buff *skb, + struct net_device *dev) +{ + __be16 *mxl862_tag; + int port; + + if (unlikely(!pskb_may_pull(skb, MXL862_HEADER_LEN))) { + dev_warn_ratelimited(&dev->dev, "Cannot pull SKB, packet dropped\n"); + return NULL; + } + + mxl862_tag =3D dsa_etype_header_pos_rx(skb); + + if (unlikely(mxl862_tag[0] !=3D htons(ETH_P_MXLGSW))) { + dev_warn_ratelimited(&dev->dev, + "Invalid special tag marker, packet dropped, tag: %8ph\n", + mxl862_tag); + return NULL; + } + + /* Get source port information */ + port =3D FIELD_GET(MXL862_IGP_EGP, ntohs(mxl862_tag[3])) - 1; + skb->dev =3D dsa_conduit_find_user(dev, 0, port); + if (unlikely(!skb->dev)) { + dev_warn_ratelimited(&dev->dev, + "Invalid source port, packet dropped, tag: %8ph\n", + mxl862_tag); + return NULL; + } + + /* remove the MxL862xx special tag between the MAC addresses and the + * current ethertype field. + */ + skb_pull_rcsum(skb, MXL862_HEADER_LEN); + dsa_strip_etype_header(skb, MXL862_HEADER_LEN); + + return skb; +} + +static const struct dsa_device_ops mxl862_netdev_ops =3D { + .name =3D "mxl862", + .proto =3D DSA_TAG_PROTO_MXL862, + .xmit =3D mxl862_tag_xmit, + .rcv =3D mxl862_tag_rcv, + .needed_headroom =3D MXL862_HEADER_LEN, +}; + +MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_MXL862, MXL862_NAME); +MODULE_DESCRIPTION("DSA tag driver for MaxLinear MxL862xx switches"); +MODULE_LICENSE("GPL"); + +module_dsa_tag_driver(mxl862_netdev_ops); --=20 2.52.0