devlink: Add support for get/set driverinit value
authorMoshe Shemesh <moshe@mellanox.com>
Wed, 4 Jul 2018 11:30:31 +0000 (14:30 +0300)
committerDavid S. Miller <davem@davemloft.net>
Thu, 5 Jul 2018 10:58:35 +0000 (19:58 +0900)
"driverinit" configuration mode value is held by devlink to enable
the driver query the value after reload. Two additional functions
added to help the driver get/set the value from/to devlink:
devlink_param_driverinit_value_set() and
devlink_param_driverinit_value_get().

Signed-off-by: Moshe Shemesh <moshe@mellanox.com>
Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/devlink.h
net/core/devlink.c

index 88062752dcd70908cbc7f853086309c3b9afec4f..3302e43b09a4e244f34d22de70f900111a084458 100644 (file)
@@ -503,6 +503,10 @@ int devlink_params_register(struct devlink *devlink,
 void devlink_params_unregister(struct devlink *devlink,
                               const struct devlink_param *params,
                               size_t params_count);
+int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
+                                      union devlink_param_value *init_val);
+int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
+                                      union devlink_param_value init_val);
 
 #else
 
@@ -711,6 +715,20 @@ devlink_params_unregister(struct devlink *devlink,
 
 }
 
+static inline int
+devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
+                                  union devlink_param_value *init_val)
+{
+       return -EOPNOTSUPP;
+}
+
+static inline int
+devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
+                                  union devlink_param_value init_val)
+{
+       return -EOPNOTSUPP;
+}
+
 #endif
 
 #endif /* _NET_DEVLINK_H_ */
index 0cd7a42dcec2ed4d9982bb87deca2d03b1da55d4..3af08f4562b57cce238531171269929522b4a96e 100644 (file)
@@ -2645,6 +2645,17 @@ devlink_param_find_by_name(struct list_head *param_list,
        return NULL;
 }
 
+static struct devlink_param_item *
+devlink_param_find_by_id(struct list_head *param_list, u32 param_id)
+{
+       struct devlink_param_item *param_item;
+
+       list_for_each_entry(param_item, param_list, list)
+               if (param_item->param->id == param_id)
+                       return param_item;
+       return NULL;
+}
+
 static bool
 devlink_param_cmode_is_supported(const struct devlink_param *param,
                                 enum devlink_param_cmode cmode)
@@ -3966,6 +3977,72 @@ void devlink_params_unregister(struct devlink *devlink,
 }
 EXPORT_SYMBOL_GPL(devlink_params_unregister);
 
+/**
+ *     devlink_param_driverinit_value_get - get configuration parameter
+ *                                          value for driver initializing
+ *
+ *     @devlink: devlink
+ *     @param_id: parameter ID
+ *     @init_val: value of parameter in driverinit configuration mode
+ *
+ *     This function should be used by the driver to get driverinit
+ *     configuration for initialization after reload command.
+ */
+int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
+                                      union devlink_param_value *init_val)
+{
+       struct devlink_param_item *param_item;
+
+       if (!devlink->ops || !devlink->ops->reload)
+               return -EOPNOTSUPP;
+
+       param_item = devlink_param_find_by_id(&devlink->param_list, param_id);
+       if (!param_item)
+               return -EINVAL;
+
+       if (!param_item->driverinit_value_valid ||
+           !devlink_param_cmode_is_supported(param_item->param,
+                                             DEVLINK_PARAM_CMODE_DRIVERINIT))
+               return -EOPNOTSUPP;
+
+       *init_val = param_item->driverinit_value;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(devlink_param_driverinit_value_get);
+
+/**
+ *     devlink_param_driverinit_value_set - set value of configuration
+ *                                          parameter for driverinit
+ *                                          configuration mode
+ *
+ *     @devlink: devlink
+ *     @param_id: parameter ID
+ *     @init_val: value of parameter to set for driverinit configuration mode
+ *
+ *     This function should be used by the driver to set driverinit
+ *     configuration mode default value.
+ */
+int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
+                                      union devlink_param_value init_val)
+{
+       struct devlink_param_item *param_item;
+
+       param_item = devlink_param_find_by_id(&devlink->param_list, param_id);
+       if (!param_item)
+               return -EINVAL;
+
+       if (!devlink_param_cmode_is_supported(param_item->param,
+                                             DEVLINK_PARAM_CMODE_DRIVERINIT))
+               return -EOPNOTSUPP;
+
+       param_item->driverinit_value = init_val;
+       param_item->driverinit_value_valid = true;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(devlink_param_driverinit_value_set);
+
 static int __init devlink_module_init(void)
 {
        return genl_register_family(&devlink_nl_family);