config NET_DSA_LOOP
        tristate "DSA mock-up Ethernet switch chip support"
+       select NET_DSA_TAG_NONE
        select FIXED_PHY
        help
          This enables support for a fake mock-up switch chip which
 
 config NET_DSA_VITESSE_VSC73XX
        tristate
+       select NET_DSA_TAG_NONE
        select FIXED_PHY
        select VITESSE_PHY
        select GPIOLIB
 
 menuconfig B53
        tristate "Broadcom BCM53xx managed switch support"
        depends on NET_DSA
+       select NET_DSA_TAG_NONE
        select NET_DSA_TAG_BRCM
        select NET_DSA_TAG_BRCM_LEGACY
        select NET_DSA_TAG_BRCM_PREPEND
 
        tristate "Microchip KSZ8795/KSZ9477/LAN937x series switch support"
        depends on NET_DSA
        select NET_DSA_TAG_KSZ
+       select NET_DSA_TAG_NONE
        help
          This driver adds support for Microchip KSZ9477 series switch and
          KSZ8795/KSZ88x3 switch chips.
 
 
 # Drivers must select the appropriate tagging format(s)
 
+config NET_DSA_TAG_NONE
+       tristate "No-op tag driver"
+       help
+         Say Y or M if you want to enable support for switches which don't tag
+         frames over the CPU port.
+
 config NET_DSA_TAG_AR9331
        tristate "Tag driver for Atheros AR9331 SoC with built-in switch"
        help
 
 obj-$(CONFIG_NET_DSA_TAG_KSZ) += tag_ksz.o
 obj-$(CONFIG_NET_DSA_TAG_LAN9303) += tag_lan9303.o
 obj-$(CONFIG_NET_DSA_TAG_MTK) += tag_mtk.o
+obj-$(CONFIG_NET_DSA_TAG_NONE) += tag_none.o
 obj-$(CONFIG_NET_DSA_TAG_OCELOT) += tag_ocelot.o
 obj-$(CONFIG_NET_DSA_TAG_OCELOT_8021Q) += tag_ocelot_8021q.o
 obj-$(CONFIG_NET_DSA_TAG_QCA) += tag_qca.o
 
 static LIST_HEAD(dsa_tag_drivers_list);
 static DEFINE_MUTEX(dsa_tag_drivers_lock);
 
-static struct sk_buff *dsa_slave_notag_xmit(struct sk_buff *skb,
-                                           struct net_device *dev)
-{
-       /* Just return the original SKB */
-       return skb;
-}
-
-static const struct dsa_device_ops none_ops = {
-       .name   = "none",
-       .proto  = DSA_TAG_PROTO_NONE,
-       .xmit   = dsa_slave_notag_xmit,
-       .rcv    = NULL,
-};
-
-DSA_TAG_DRIVER(none_ops);
-
 static void dsa_tag_driver_register(struct dsa_tag_driver *dsa_tag_driver,
                                    struct module *owner)
 {
 
        dev_add_pack(&dsa_pack_type);
 
-       dsa_tag_driver_register(&DSA_TAG_DRIVER_NAME(none_ops),
-                               THIS_MODULE);
-
        rc = rtnl_link_register(&dsa_link_ops);
        if (rc)
                goto netlink_register_fail;
        return 0;
 
 netlink_register_fail:
-       dsa_tag_driver_unregister(&DSA_TAG_DRIVER_NAME(none_ops));
        dsa_slave_unregister_notifier();
        dev_remove_pack(&dsa_pack_type);
 register_notifier_fail:
 static void __exit dsa_cleanup_module(void)
 {
        rtnl_link_unregister(&dsa_link_ops);
-       dsa_tag_driver_unregister(&DSA_TAG_DRIVER_NAME(none_ops));
 
        dsa_slave_unregister_notifier();
        dev_remove_pack(&dsa_pack_type);
 
                           struct netlink_ext_ack *extack);
 
 /* slave.c */
-extern const struct dsa_device_ops notag_netdev_ops;
 extern struct notifier_block dsa_slave_switchdev_notifier;
 extern struct notifier_block dsa_slave_switchdev_blocking_notifier;
 
 
--- /dev/null
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * net/dsa/tag_none.c - Traffic handling for switches with no tag
+ * Copyright (c) 2008-2009 Marvell Semiconductor
+ * Copyright (c) 2013 Florian Fainelli <florian@openwrt.org>
+ *
+ * WARNING: do not use this for new switches. In case of no hardware
+ * tagging support, look at tag_8021q.c instead.
+ */
+
+#include "dsa_priv.h"
+
+#define NONE_NAME      "none"
+
+static struct sk_buff *dsa_slave_notag_xmit(struct sk_buff *skb,
+                                           struct net_device *dev)
+{
+       /* Just return the original SKB */
+       return skb;
+}
+
+static const struct dsa_device_ops none_ops = {
+       .name   = NONE_NAME,
+       .proto  = DSA_TAG_PROTO_NONE,
+       .xmit   = dsa_slave_notag_xmit,
+};
+
+module_dsa_tag_driver(none_ops);
+MODULE_ALIAS_DSA_TAG_DRIVER(DSA_TAG_PROTO_NONE, NONE_NAME);
+MODULE_LICENSE("GPL");