mlxsw: core_linecards: Expose HW revision and INI version
authorJiri Pirko <jiri@nvidia.com>
Mon, 25 Jul 2022 08:29:18 +0000 (10:29 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 26 Jul 2022 20:56:06 +0000 (13:56 -0700)
Implement info_get() to expose HW revision of a linecard and loaded INI
version.

Example:

$ devlink dev info auxiliary/mlxsw_core.lc.0
auxiliary/mlxsw_core.lc.0:
  versions:
      fixed:
        hw.revision 0
      running:
        ini.version 4

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Documentation/networking/devlink/mlxsw.rst
drivers/net/ethernet/mellanox/mlxsw/core.h
drivers/net/ethernet/mellanox/mlxsw/core_linecard_dev.c
drivers/net/ethernet/mellanox/mlxsw/core_linecards.c

index cf857cb4ba8fc9f92bfc9769a045c4c63c20514c..aededcf68df4fb466b537990c4c9f2ad8ad90fc4 100644 (file)
@@ -58,6 +58,24 @@ The ``mlxsw`` driver reports the following versions
      - running
      - Three digit firmware version
 
+Line card auxiliary device info versions
+========================================
+
+The ``mlxsw`` driver reports the following versions for line card auxiliary device
+
+.. list-table:: devlink info versions implemented
+   :widths: 5 5 90
+
+   * - Name
+     - Type
+     - Description
+   * - ``hw.revision``
+     - fixed
+     - The hardware revision for this line card
+   * - ``ini.version``
+     - running
+     - Version of line card INI loaded
+
 Driver-specific Traps
 =====================
 
index 5fe90438cca5e67f37411cb0239d7b03474a8040..f833b4d248e65914955e5a8f477efbeb98ea02cf 100644 (file)
@@ -601,6 +601,10 @@ mlxsw_linecard_get(struct mlxsw_linecards *linecards, u8 slot_index)
        return &linecards->linecards[slot_index - 1];
 }
 
+int mlxsw_linecard_devlink_info_get(struct mlxsw_linecard *linecard,
+                                   struct devlink_info_req *req,
+                                   struct netlink_ext_ack *extack);
+
 int mlxsw_linecards_init(struct mlxsw_core *mlxsw_core,
                         const struct mlxsw_bus_info *bus_info);
 void mlxsw_linecards_fini(struct mlxsw_core *mlxsw_core);
index b1fa9f6810031165df432a2bdf842e7c99725011..13c20b83b19014538c9f2503672f6ac3bad04fc4 100644 (file)
@@ -98,7 +98,18 @@ void mlxsw_linecard_bdev_del(struct mlxsw_linecard *linecard)
        linecard->bdev = NULL;
 }
 
+static int mlxsw_linecard_dev_devlink_info_get(struct devlink *devlink,
+                                              struct devlink_info_req *req,
+                                              struct netlink_ext_ack *extack)
+{
+       struct mlxsw_linecard_dev *linecard_dev = devlink_priv(devlink);
+       struct mlxsw_linecard *linecard = linecard_dev->linecard;
+
+       return mlxsw_linecard_devlink_info_get(linecard, req, extack);
+}
+
 static const struct devlink_ops mlxsw_linecard_dev_devlink_ops = {
+       .info_get                       = mlxsw_linecard_dev_devlink_info_get,
 };
 
 static int mlxsw_linecard_bdev_probe(struct auxiliary_device *adev,
index 43696d8badcac49036d3cef7679a5a4001bbb12e..ee986dd2c4863a664c6aeb6edaab93f696f70219 100644 (file)
@@ -226,6 +226,34 @@ void mlxsw_linecards_event_ops_unregister(struct mlxsw_core *mlxsw_core,
 }
 EXPORT_SYMBOL(mlxsw_linecards_event_ops_unregister);
 
+int mlxsw_linecard_devlink_info_get(struct mlxsw_linecard *linecard,
+                                   struct devlink_info_req *req,
+                                   struct netlink_ext_ack *extack)
+{
+       char buf[32];
+       int err;
+
+       mutex_lock(&linecard->lock);
+       if (WARN_ON(!linecard->provisioned)) {
+               err = -EOPNOTSUPP;
+               goto unlock;
+       }
+
+       sprintf(buf, "%d", linecard->hw_revision);
+       err = devlink_info_version_fixed_put(req, "hw.revision", buf);
+       if (err)
+               goto unlock;
+
+       sprintf(buf, "%d", linecard->ini_version);
+       err = devlink_info_version_running_put(req, "ini.version", buf);
+       if (err)
+               goto unlock;
+
+unlock:
+       mutex_unlock(&linecard->lock);
+       return err;
+}
+
 static int
 mlxsw_linecard_provision_set(struct mlxsw_linecard *linecard, u8 card_type,
                             u16 hw_revision, u16 ini_version)