]> git.itanic.dy.fi Git - linux-stable/commitdiff
net: dsa: propagate extack to ds->ops->port_hsr_join()
authorVladimir Oltean <vladimir.oltean@nxp.com>
Fri, 22 Sep 2023 13:31:04 +0000 (15:31 +0200)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 3 Oct 2023 11:51:02 +0000 (13:51 +0200)
Drivers can provide meaningful error messages which state a reason why
they can't perform an offload, and dsa_slave_changeupper() already has
the infrastructure to propagate these over netlink rather than printing
to the kernel log. So pass the extack argument and modify the xrs700x
driver's port_hsr_join() prototype.

Also take the opportunity and use the extack for the 2 -EOPNOTSUPP cases
from xrs700x_hsr_join().

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: Lukasz Majewski <lukma@denx.de>
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/dsa/xrs700x/xrs700x.c
include/net/dsa.h
net/dsa/port.c
net/dsa/port.h
net/dsa/slave.c

index 753fef757f11669b074c0c60357110bdd7560e20..5b02e9e426fdfadc878aef3746bb16acb0d424f7 100644 (file)
@@ -548,7 +548,8 @@ static void xrs700x_bridge_leave(struct dsa_switch *ds, int port,
 }
 
 static int xrs700x_hsr_join(struct dsa_switch *ds, int port,
-                           struct net_device *hsr)
+                           struct net_device *hsr,
+                           struct netlink_ext_ack *extack)
 {
        unsigned int val = XRS_HSR_CFG_HSR_PRP;
        struct dsa_port *partner = NULL, *dp;
@@ -562,16 +563,21 @@ static int xrs700x_hsr_join(struct dsa_switch *ds, int port,
        if (ret)
                return ret;
 
-       /* Only ports 1 and 2 can be HSR/PRP redundant ports. */
-       if (port != 1 && port != 2)
+       if (port != 1 && port != 2) {
+               NL_SET_ERR_MSG_MOD(extack,
+                                  "Only ports 1 and 2 can offload HSR/PRP");
                return -EOPNOTSUPP;
+       }
 
-       if (ver == HSR_V1)
+       if (ver == HSR_V1) {
                val |= XRS_HSR_CFG_HSR;
-       else if (ver == PRP_V1)
+       } else if (ver == PRP_V1) {
                val |= XRS_HSR_CFG_PRP;
-       else
+       } else {
+               NL_SET_ERR_MSG_MOD(extack,
+                                  "Only HSR v1 and PRP v1 can be offloaded");
                return -EOPNOTSUPP;
+       }
 
        dsa_hsr_foreach_port(dp, ds, hsr) {
                if (dp->index != port) {
index 0b9c6aa2704748ac843e17043144643bab254115..426724808e7677ea063dc54f26b625e973a521d6 100644 (file)
@@ -1198,7 +1198,8 @@ struct dsa_switch_ops {
         * HSR integration
         */
        int     (*port_hsr_join)(struct dsa_switch *ds, int port,
-                                struct net_device *hsr);
+                                struct net_device *hsr,
+                                struct netlink_ext_ack *extack);
        int     (*port_hsr_leave)(struct dsa_switch *ds, int port,
                                  struct net_device *hsr);
 
index 37ab238e83042a179dc3e16f1e87df53e552b6bf..5f01bd4f9decf61963c05eac012790079e34f106 100644 (file)
@@ -2024,7 +2024,8 @@ void dsa_shared_port_link_unregister_of(struct dsa_port *dp)
                dsa_shared_port_setup_phy_of(dp, false);
 }
 
-int dsa_port_hsr_join(struct dsa_port *dp, struct net_device *hsr)
+int dsa_port_hsr_join(struct dsa_port *dp, struct net_device *hsr,
+                     struct netlink_ext_ack *extack)
 {
        struct dsa_switch *ds = dp->ds;
        int err;
@@ -2034,7 +2035,7 @@ int dsa_port_hsr_join(struct dsa_port *dp, struct net_device *hsr)
 
        dp->hsr_dev = hsr;
 
-       err = ds->ops->port_hsr_join(ds, dp->index, hsr);
+       err = ds->ops->port_hsr_join(ds, dp->index, hsr, extack);
        if (err)
                dp->hsr_dev = NULL;
 
index dc812512fd0eadd8f1cd16fd7bee550a1736d3b4..334879964e2c1d9e0b601802c34ef51b4b164d2b 100644 (file)
@@ -103,7 +103,8 @@ int dsa_port_phylink_create(struct dsa_port *dp);
 void dsa_port_phylink_destroy(struct dsa_port *dp);
 int dsa_shared_port_link_register_of(struct dsa_port *dp);
 void dsa_shared_port_link_unregister_of(struct dsa_port *dp);
-int dsa_port_hsr_join(struct dsa_port *dp, struct net_device *hsr);
+int dsa_port_hsr_join(struct dsa_port *dp, struct net_device *hsr,
+                     struct netlink_ext_ack *extack);
 void dsa_port_hsr_leave(struct dsa_port *dp, struct net_device *hsr);
 int dsa_port_tag_8021q_vlan_add(struct dsa_port *dp, u16 vid, bool broadcast);
 void dsa_port_tag_8021q_vlan_del(struct dsa_port *dp, u16 vid, bool broadcast);
index 48db91b33390bb5d24f4ed1adfb034dfdc74c2a4..2b3d89b771218c86768e7ecd1a5dda70b146bbad 100644 (file)
@@ -2862,7 +2862,7 @@ static int dsa_slave_changeupper(struct net_device *dev,
                }
        } else if (is_hsr_master(info->upper_dev)) {
                if (info->linking) {
-                       err = dsa_port_hsr_join(dp, info->upper_dev);
+                       err = dsa_port_hsr_join(dp, info->upper_dev, extack);
                        if (err == -EOPNOTSUPP) {
                                NL_SET_ERR_MSG_WEAK_MOD(extack,
                                                        "Offloading not supported");