From: Parav Pandit <pa...@nvidia.com>

Prepare code to fill zero or more port function optional attributes.
Subsequent patch makes use of this to fill more port function
attributes.

changelog:
v5->v6:
 - change function name from 'port_function' to 'port_fn'
 - align to 80 characters limit

Signed-off-by: Parav Pandit <pa...@nvidia.com>
Reviewed-by: Jiri Pirko <j...@nvidia.com>
Reviewed-by: Vu Pham <vuhu...@nvidia.com>
Signed-off-by: Saeed Mahameed <sae...@nvidia.com>
---
 net/core/devlink.c | 64 ++++++++++++++++++++++++----------------------
 1 file changed, 33 insertions(+), 31 deletions(-)

diff --git a/net/core/devlink.c b/net/core/devlink.c
index ee828e4b1007..c39496311b71 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -712,6 +712,31 @@ static int devlink_nl_port_attrs_put(struct sk_buff *msg,
        return 0;
 }
 
+static int
+devlink_port_fn_hw_addr_fill(struct devlink *devlink, const struct devlink_ops 
*ops,
+                            struct devlink_port *port, struct sk_buff *msg,
+                            struct netlink_ext_ack *extack, bool *msg_updated)
+{
+       u8 hw_addr[MAX_ADDR_LEN];
+       int hw_addr_len;
+       int err;
+
+       if (!ops->port_function_hw_addr_get)
+               return 0;
+
+       err = ops->port_function_hw_addr_get(devlink, port, hw_addr, 
&hw_addr_len, extack);
+       if (err) {
+               if (err == -EOPNOTSUPP)
+                       return 0;
+               return err;
+       }
+       err = nla_put(msg, DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR, hw_addr_len, 
hw_addr);
+       if (err)
+               return err;
+       *msg_updated = true;
+       return 0;
+}
+
 static int
 devlink_nl_port_function_attrs_put(struct sk_buff *msg, struct devlink_port 
*port,
                                   struct netlink_ext_ack *extack)
@@ -719,36 +744,17 @@ devlink_nl_port_function_attrs_put(struct sk_buff *msg, 
struct devlink_port *por
        struct devlink *devlink = port->devlink;
        const struct devlink_ops *ops;
        struct nlattr *function_attr;
-       bool empty_nest = true;
-       int err = 0;
+       bool msg_updated = false;
+       int err;
 
        function_attr = nla_nest_start_noflag(msg, DEVLINK_ATTR_PORT_FUNCTION);
        if (!function_attr)
                return -EMSGSIZE;
 
        ops = devlink->ops;
-       if (ops->port_function_hw_addr_get) {
-               int hw_addr_len;
-               u8 hw_addr[MAX_ADDR_LEN];
-
-               err = ops->port_function_hw_addr_get(devlink, port, hw_addr, 
&hw_addr_len, extack);
-               if (err == -EOPNOTSUPP) {
-                       /* Port function attributes are optional for a port. If 
port doesn't
-                        * support function attribute, returning -EOPNOTSUPP is 
not an error.
-                        */
-                       err = 0;
-                       goto out;
-               } else if (err) {
-                       goto out;
-               }
-               err = nla_put(msg, DEVLINK_PORT_FUNCTION_ATTR_HW_ADDR, 
hw_addr_len, hw_addr);
-               if (err)
-                       goto out;
-               empty_nest = false;
-       }
-
-out:
-       if (err || empty_nest)
+       err = devlink_port_fn_hw_addr_fill(devlink, ops, port, msg,
+                                          extack, &msg_updated);
+       if (err || !msg_updated)
                nla_nest_cancel(msg, function_attr);
        else
                nla_nest_end(msg, function_attr);
@@ -986,7 +992,6 @@ devlink_port_function_hw_addr_set(struct devlink *devlink, 
struct devlink_port *
        const struct devlink_ops *ops;
        const u8 *hw_addr;
        int hw_addr_len;
-       int err;
 
        hw_addr = nla_data(attr);
        hw_addr_len = nla_len(attr);
@@ -1011,12 +1016,7 @@ devlink_port_function_hw_addr_set(struct devlink 
*devlink, struct devlink_port *
                return -EOPNOTSUPP;
        }
 
-       err = ops->port_function_hw_addr_set(devlink, port, hw_addr, 
hw_addr_len, extack);
-       if (err)
-               return err;
-
-       devlink_port_notify(port, DEVLINK_CMD_PORT_NEW);
-       return 0;
+       return ops->port_function_hw_addr_set(devlink, port, hw_addr, 
hw_addr_len, extack);
 }
 
 static int
@@ -1037,6 +1037,8 @@ devlink_port_function_set(struct devlink *devlink, struct 
devlink_port *port,
        if (attr)
                err = devlink_port_function_hw_addr_set(devlink, port, attr, 
extack);
 
+       if (!err)
+               devlink_port_notify(port, DEVLINK_CMD_PORT_NEW);
        return err;
 }
 
-- 
2.26.2

Reply via email to