From: Moshe Shemesh <mo...@mellanox.com>

Add param extack messages support to param->set() function.
This will enable providing clear reasoning to user on setting new value
failure. Note that param->validate() already supports extack messages,
but it is not enough as input validation can pass or even not needed and
still setting new value may fail for some reason, such as device state,
FW support, etc.

Signed-off-by: Moshe Shemesh <mo...@mellanox.com>
Signed-off-by: Jiri Pirko <j...@mellanox.com>
Signed-off-by: Saeed Mahameed <sae...@mellanox.com>
---
 drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | 3 ++-
 drivers/net/ethernet/mellanox/mlx4/main.c         | 6 ++++--
 include/net/devlink.h                             | 3 ++-
 net/core/devlink.c                                | 7 ++++---
 4 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c 
b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
index 7bd96ab4f7c5..97b987f31881 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
@@ -91,7 +91,8 @@ static int bnxt_dl_nvm_param_get(struct devlink *dl, u32 id,
 }
 
 static int bnxt_dl_nvm_param_set(struct devlink *dl, u32 id,
-                                struct devlink_param_gset_ctx *ctx)
+                                struct devlink_param_gset_ctx *ctx,
+                                struct netlink_ext_ack *extack)
 {
        struct hwrm_nvm_set_variable_input req = {0};
        struct bnxt *bp = bnxt_get_bp_from_dl(dl);
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c 
b/drivers/net/ethernet/mellanox/mlx4/main.c
index d2d59444f562..629a5c2a4971 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -186,7 +186,8 @@ static int mlx4_devlink_ierr_reset_get(struct devlink 
*devlink, u32 id,
 }
 
 static int mlx4_devlink_ierr_reset_set(struct devlink *devlink, u32 id,
-                                      struct devlink_param_gset_ctx *ctx)
+                                      struct devlink_param_gset_ctx *ctx,
+                                      struct netlink_ext_ack *extack)
 {
        mlx4_internal_err_reset = ctx->val.vbool;
        return 0;
@@ -203,7 +204,8 @@ static int mlx4_devlink_crdump_snapshot_get(struct devlink 
*devlink, u32 id,
 }
 
 static int mlx4_devlink_crdump_snapshot_set(struct devlink *devlink, u32 id,
-                                           struct devlink_param_gset_ctx *ctx)
+                                           struct devlink_param_gset_ctx *ctx,
+                                           struct netlink_ext_ack *extack)
 {
        struct mlx4_priv *priv = devlink_priv(devlink);
        struct mlx4_dev *dev = &priv->dev;
diff --git a/include/net/devlink.h b/include/net/devlink.h
index 99efc156a309..84294f4c2580 100644
--- a/include/net/devlink.h
+++ b/include/net/devlink.h
@@ -344,7 +344,8 @@ struct devlink_param {
        int (*get)(struct devlink *devlink, u32 id,
                   struct devlink_param_gset_ctx *ctx);
        int (*set)(struct devlink *devlink, u32 id,
-                  struct devlink_param_gset_ctx *ctx);
+                  struct devlink_param_gset_ctx *ctx,
+                  struct netlink_ext_ack *extack);
        int (*validate)(struct devlink *devlink, u32 id,
                        union devlink_param_value val,
                        struct netlink_ext_ack *extack);
diff --git a/net/core/devlink.c b/net/core/devlink.c
index 367564099357..54ba7e55b1de 100644
--- a/net/core/devlink.c
+++ b/net/core/devlink.c
@@ -2746,11 +2746,12 @@ static int devlink_param_get(struct devlink *devlink,
 
 static int devlink_param_set(struct devlink *devlink,
                             const struct devlink_param *param,
-                            struct devlink_param_gset_ctx *ctx)
+                            struct devlink_param_gset_ctx *ctx,
+                            struct netlink_ext_ack *extack)
 {
        if (!param->set)
                return -EOPNOTSUPP;
-       return param->set(devlink, param->id, ctx);
+       return param->set(devlink, param->id, ctx, extack);
 }
 
 static int
@@ -3112,7 +3113,7 @@ static int devlink_nl_cmd_param_set_doit(struct sk_buff 
*skb,
                        return -EOPNOTSUPP;
                ctx.val = value;
                ctx.cmode = cmode;
-               err = devlink_param_set(devlink, param, &ctx);
+               err = devlink_param_set(devlink, param, &ctx, info->extack);
                if (err)
                        return err;
        }
-- 
2.17.0

Reply via email to