]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: dsa: microchip: split ksz_connect_tag_protocol()
authorBastien Curutchet (Schneider Electric) <bastien.curutchet@bootlin.com>
Tue, 5 May 2026 14:25:09 +0000 (16:25 +0200)
committerJakub Kicinski <kuba@kernel.org>
Sat, 9 May 2026 02:09:14 +0000 (19:09 -0700)
All the KSZ switches use the same ksz_connect_tag_protocol while they
don't support all the KSZ tag protocols. So if, for some reason, a given
switch tries to connect another KSZ tag protocol, it won't fail.

Split the common ksz_connect_tag_protocol() into switch-specific
operations. This way, each switch will only accept to connect the tag
protocol it supports.
Remove the no longer used common operation.

Signed-off-by: Bastien Curutchet (Schneider Electric) <bastien.curutchet@bootlin.com>
Link: https://patch.msgid.link/20260505-clean-ksz-driver-v1-9-05d70fa42461@bootlin.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/dsa/microchip/ksz8.c
drivers/net/dsa/microchip/ksz9477.c
drivers/net/dsa/microchip/ksz_common.c
drivers/net/dsa/microchip/ksz_common.h
drivers/net/dsa/microchip/lan937x_main.c

index fa2e1256323c2b71bfd949d075cad7ea2ec0220d..abee0dc5ec04b85113e7af24ec116b3371df5dc1 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <linux/bitfield.h>
 #include <linux/delay.h>
+#include <linux/dsa/ksz_common.h>
 #include <linux/export.h>
 #include <linux/gpio.h>
 #include <linux/if_vlan.h>
@@ -2107,6 +2108,20 @@ static enum dsa_tag_protocol ksz8463_get_tag_protocol(struct dsa_switch *ds,
        return DSA_TAG_PROTO_KSZ9893;
 }
 
+static int ksz8463_connect_tag_protocol(struct dsa_switch *ds,
+                                       enum dsa_tag_protocol proto)
+{
+       struct ksz_tagger_data *tagger_data;
+
+       if (proto != DSA_TAG_PROTO_KSZ9893)
+               return -EPROTONOSUPPORT;
+
+       tagger_data = ksz_tagger_data(ds);
+       tagger_data->xmit_work_fn = ksz_port_deferred_xmit;
+
+       return 0;
+}
+
 static enum dsa_tag_protocol ksz87xx_get_tag_protocol(struct dsa_switch *ds,
                                                      int port,
                                                      enum dsa_tag_protocol mp)
@@ -2114,6 +2129,15 @@ static enum dsa_tag_protocol ksz87xx_get_tag_protocol(struct dsa_switch *ds,
        return DSA_TAG_PROTO_KSZ8795;
 }
 
+static int ksz87xx_connect_tag_protocol(struct dsa_switch *ds,
+                                       enum dsa_tag_protocol proto)
+{
+       if (proto != DSA_TAG_PROTO_KSZ8795)
+               return -EPROTONOSUPPORT;
+
+       return 0;
+}
+
 static enum dsa_tag_protocol ksz88xx_get_tag_protocol(struct dsa_switch *ds,
                                                      int port,
                                                      enum dsa_tag_protocol mp)
@@ -2126,6 +2150,27 @@ static enum dsa_tag_protocol ksz88xx_get_tag_protocol(struct dsa_switch *ds,
        return DSA_TAG_PROTO_KSZ9893;
 }
 
+static int ksz88xx_connect_tag_protocol(struct dsa_switch *ds,
+                                       enum dsa_tag_protocol proto)
+{
+       struct ksz_tagger_data *tagger_data;
+
+       if (ksz_is_8895_family(ds->priv)) { /* KSZ8864, KSZ8895 */
+               if (proto != DSA_TAG_PROTO_KSZ8795)
+                       return -EPROTONOSUPPORT;
+
+               return 0;
+       }
+
+       if (proto != DSA_TAG_PROTO_KSZ9893)
+               return -EPROTONOSUPPORT;
+
+       tagger_data = ksz_tagger_data(ds);
+       tagger_data->xmit_work_fn = ksz_port_deferred_xmit;
+
+       return 0;
+}
+
 static void ksz88x3_phylink_mac_config(struct phylink_config *config,
                                       unsigned int mode,
                                       const struct phylink_link_state *state)
@@ -2256,7 +2301,7 @@ const struct ksz_dev_ops ksz88xx_dev_ops = {
 
 const struct dsa_switch_ops ksz8463_switch_ops = {
        .get_tag_protocol       = ksz8463_get_tag_protocol,
-       .connect_tag_protocol   = ksz_connect_tag_protocol,
+       .connect_tag_protocol   = ksz8463_connect_tag_protocol,
        .get_phy_flags          = ksz_get_phy_flags,
        .setup                  = ksz_setup,
        .teardown               = ksz_teardown,
@@ -2317,7 +2362,7 @@ const struct dsa_switch_ops ksz8463_switch_ops = {
 
 const struct dsa_switch_ops ksz87xx_switch_ops = {
        .get_tag_protocol       = ksz87xx_get_tag_protocol,
-       .connect_tag_protocol   = ksz_connect_tag_protocol,
+       .connect_tag_protocol   = ksz87xx_connect_tag_protocol,
        .get_phy_flags          = ksz_get_phy_flags,
        .setup                  = ksz_setup,
        .teardown               = ksz_teardown,
@@ -2378,7 +2423,7 @@ const struct dsa_switch_ops ksz87xx_switch_ops = {
 
 const struct dsa_switch_ops ksz88xx_switch_ops = {
        .get_tag_protocol       = ksz88xx_get_tag_protocol,
-       .connect_tag_protocol   = ksz_connect_tag_protocol,
+       .connect_tag_protocol   = ksz88xx_connect_tag_protocol,
        .get_phy_flags          = ksz_get_phy_flags,
        .setup                  = ksz_setup,
        .teardown               = ksz_teardown,
index 9bac95bb079ffe5916351aee5ba42c68dcca7133..ac2c63fe0588c9c0dda393f559368d04e04d8ba4 100644 (file)
@@ -5,6 +5,7 @@
  * Copyright (C) 2017-2025 Microchip Technology Inc.
  */
 
+#include <linux/dsa/ksz_common.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/iopoll.h>
@@ -1624,6 +1625,20 @@ static enum dsa_tag_protocol ksz9477_get_tag_protocol(struct dsa_switch *ds,
        return DSA_TAG_PROTO_KSZ9477;
 }
 
+static int ksz9477_connect_tag_protocol(struct dsa_switch *ds,
+                                       enum dsa_tag_protocol proto)
+{
+       struct ksz_tagger_data *tagger_data;
+
+       if (proto != DSA_TAG_PROTO_KSZ9893 && proto != DSA_TAG_PROTO_KSZ9477)
+               return -EPROTONOSUPPORT;
+
+       tagger_data = ksz_tagger_data(ds);
+       tagger_data->xmit_work_fn = ksz_port_deferred_xmit;
+
+       return 0;
+}
+
 static void ksz9477_set_gbit(struct ksz_device *dev, int port, bool gbit)
 {
        const u8 *bitval = dev->info->xmii_ctrl1;
@@ -1790,7 +1805,7 @@ const struct ksz_dev_ops ksz9477_dev_ops = {
 
 const struct dsa_switch_ops ksz9477_switch_ops = {
        .get_tag_protocol       = ksz9477_get_tag_protocol,
-       .connect_tag_protocol   = ksz_connect_tag_protocol,
+       .connect_tag_protocol   = ksz9477_connect_tag_protocol,
        .get_phy_flags          = ksz_get_phy_flags,
        .setup                  = ksz_setup,
        .teardown               = ksz_teardown,
index 1be055d3f1994f54afdf5fde595e7f8590f886ca..426414a21845552c079ea721db68c724b55f9370 100644 (file)
@@ -3304,25 +3304,6 @@ int ksz_port_bridge_flags(struct dsa_switch *ds, int port,
        return 0;
 }
 
-int ksz_connect_tag_protocol(struct dsa_switch *ds,
-                            enum dsa_tag_protocol proto)
-{
-       struct ksz_tagger_data *tagger_data;
-
-       switch (proto) {
-       case DSA_TAG_PROTO_KSZ8795:
-               return 0;
-       case DSA_TAG_PROTO_KSZ9893:
-       case DSA_TAG_PROTO_KSZ9477:
-       case DSA_TAG_PROTO_LAN937X:
-               tagger_data = ksz_tagger_data(ds);
-               tagger_data->xmit_work_fn = ksz_port_deferred_xmit;
-               return 0;
-       default:
-               return -EPROTONOSUPPORT;
-       }
-}
-
 int ksz_port_vlan_filtering(struct dsa_switch *ds, int port,
                            bool flag, struct netlink_ext_ack *extack)
 {
index 39486b5571bd69bc33414483ef6edc1a87469f1f..3dde7e771727260b4680782269a9d8acee1e6073 100644 (file)
@@ -473,8 +473,6 @@ void ksz_teardown(struct dsa_switch *ds);
 int ksz_port_setup(struct dsa_switch *ds, int port);
 void ksz_port_teardown(struct dsa_switch *ds, int port);
 
-int ksz_connect_tag_protocol(struct dsa_switch *ds,
-                            enum dsa_tag_protocol proto);
 void ksz_init_mib_timer(struct ksz_device *dev);
 bool ksz_is_port_mac_global_usable(struct dsa_switch *ds, int port);
 void ksz_r_mib_stats64(struct ksz_device *dev, int port);
index c39be6eb50121bfea3386080fda505706aae61a1..e522990cce22e7839f6cd8993095ae0b1912ae03 100644 (file)
@@ -2,6 +2,7 @@
 /* Microchip LAN937X switch driver main logic
  * Copyright (C) 2019-2024 Microchip Technology Inc.
  */
+#include <linux/dsa/ksz_common.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/iopoll.h>
@@ -674,6 +675,20 @@ static enum dsa_tag_protocol lan937x_get_tag_protocol(struct dsa_switch *ds,
        return DSA_TAG_PROTO_LAN937X;
 }
 
+static int lan937x_connect_tag_protocol(struct dsa_switch *ds,
+                                       enum dsa_tag_protocol proto)
+{
+       struct ksz_tagger_data *tagger_data;
+
+       if (proto != DSA_TAG_PROTO_LAN937X)
+               return -EPROTONOSUPPORT;
+
+       tagger_data = ksz_tagger_data(ds);
+       tagger_data->xmit_work_fn = ksz_port_deferred_xmit;
+
+       return 0;
+}
+
 const struct phylink_mac_ops lan937x_phylink_mac_ops = {
        .mac_config     = ksz_phylink_mac_config,
        .mac_link_down  = ksz_phylink_mac_link_down,
@@ -722,7 +737,7 @@ const struct ksz_dev_ops lan937x_dev_ops = {
 
 const struct dsa_switch_ops lan937x_switch_ops = {
        .get_tag_protocol       = lan937x_get_tag_protocol,
-       .connect_tag_protocol   = ksz_connect_tag_protocol,
+       .connect_tag_protocol   = lan937x_connect_tag_protocol,
        .get_phy_flags          = ksz_get_phy_flags,
        .setup                  = ksz_setup,
        .teardown               = ksz_teardown,