E610 devices give possibility to show more detailed info than the previous
boards.
Extend reporting NVM info with following pieces:
 fw.mgmt.api -> version number of the API
 fw.mgmt.build -> identifier of the source for the FW
 fw.psid.api -> version defining the format of the flash contents
 fw.netlist -> version of the netlist module
 fw.netlist.build -> first 4 bytes of the netlist hash

Reviewed-by: Mateusz Polchlopek <mateusz.polchlo...@intel.com>
Co-developed-by: Slawomir Mrozowicz <slawomirx.mrozow...@intel.com>
Signed-off-by: Slawomir Mrozowicz <slawomirx.mrozow...@intel.com>
Co-developed-by: Piotr Kwapulinski <piotr.kwapulin...@intel.com>
Signed-off-by: Piotr Kwapulinski <piotr.kwapulin...@intel.com>
Signed-off-by: Jedrzej Jagielski <jedrzej.jagiel...@intel.com>
---
 Documentation/networking/devlink/ixgbe.rst    |  26 ++++
 .../ethernet/intel/ixgbe/devlink/devlink.c    | 130 +++++++++++++++++-
 2 files changed, 153 insertions(+), 3 deletions(-)

diff --git a/Documentation/networking/devlink/ixgbe.rst 
b/Documentation/networking/devlink/ixgbe.rst
index b63645de37e8..a41073a62776 100644
--- a/Documentation/networking/devlink/ixgbe.rst
+++ b/Documentation/networking/devlink/ixgbe.rst
@@ -38,3 +38,29 @@ The ``ixgbe`` driver reports the following versions
       - 0x80000d0d
       - Unique identifier of the firmware image file that was loaded onto
         the device. Also referred to as the EETRACK identifier of the NVM.
+    * - ``fw.mgmt.api``
+      - running
+      - 1.5.1
+      - 3-digit version number (major.minor.patch) of the API exported over
+        the AdminQ by the management firmware. Used by the driver to
+        identify what commands are supported. Historical versions of the
+        kernel only displayed a 2-digit version number (major.minor).
+    * - ``fw.mgmt.build``
+      - running
+      - 0x305d955f
+      - Unique identifier of the source for the management firmware.
+    * - ``fw.psid.api``
+      - running
+      - 0.80
+      - Version defining the format of the flash contents.
+    * - ``fw.netlist``
+      - running
+      - 1.1.2000-6.7.0
+      - The version of the netlist module. This module defines the device's
+        Ethernet capabilities and default settings, and is used by the
+        management firmware as part of managing link and device
+        connectivity.
+    * - ``fw.netlist.build``
+      - running
+      - 0xee16ced7
+      - The first 4 bytes of the hash of the netlist module contents.
diff --git a/drivers/net/ethernet/intel/ixgbe/devlink/devlink.c 
b/drivers/net/ethernet/intel/ixgbe/devlink/devlink.c
index f3367a7c26bb..c7790e55a527 100644
--- a/drivers/net/ethernet/intel/ixgbe/devlink/devlink.c
+++ b/drivers/net/ethernet/intel/ixgbe/devlink/devlink.c
@@ -19,14 +19,22 @@ static void ixgbe_info_get_dsn(struct ixgbe_adapter 
*adapter,
        snprintf(ctx->buf, sizeof(ctx->buf), "%8phD", dsn);
 }
 
-static void ixgbe_info_nvm_ver(struct ixgbe_adapter *adapter,
-                              struct ixgbe_info_ctx *ctx)
+static void ixgbe_info_orom_ver(struct ixgbe_adapter *adapter,
+                               struct ixgbe_info_ctx *ctx)
 {
        struct ixgbe_hw *hw = &adapter->hw;
        struct ixgbe_nvm_version nvm_ver;
 
        ctx->buf[0] = '\0';
 
+       if (hw->mac.type == ixgbe_mac_e610) {
+               struct ixgbe_orom_info *orom = &adapter->hw.flash.orom;
+
+               snprintf(ctx->buf, sizeof(ctx->buf), "%d.%d.%d",
+                        orom->major, orom->build, orom->patch);
+               return;
+       }
+
        ixgbe_get_oem_prod_version(hw, &nvm_ver);
        if (nvm_ver.oem_valid) {
                snprintf(ctx->buf, sizeof(ctx->buf), "%x.%x.%x",
@@ -48,6 +56,12 @@ static void ixgbe_info_eetrack(struct ixgbe_adapter *adapter,
        struct ixgbe_hw *hw = &adapter->hw;
        struct ixgbe_nvm_version nvm_ver;
 
+       if (hw->mac.type == ixgbe_mac_e610) {
+               snprintf(ctx->buf, sizeof(ctx->buf), "0x%08x",
+                        hw->flash.nvm.eetrack);
+               return;
+       }
+
        ixgbe_get_oem_prod_version(hw, &nvm_ver);
 
        /* No ETRACK version for OEM */
@@ -60,6 +74,112 @@ static void ixgbe_info_eetrack(struct ixgbe_adapter 
*adapter,
        snprintf(ctx->buf, sizeof(ctx->buf), "0x%08x", nvm_ver.etk_id);
 }
 
+static void ixgbe_info_fw_api(struct ixgbe_adapter *adapter,
+                             struct ixgbe_info_ctx *ctx)
+{
+       struct ixgbe_hw *hw = &adapter->hw;
+
+       snprintf(ctx->buf, sizeof(ctx->buf), "%u.%u.%u",
+                hw->api_maj_ver, hw->api_min_ver, hw->api_patch);
+}
+
+static void ixgbe_info_fw_build(struct ixgbe_adapter *adapter,
+                               struct ixgbe_info_ctx *ctx)
+{
+       struct ixgbe_hw *hw = &adapter->hw;
+
+       snprintf(ctx->buf, sizeof(ctx->buf), "0x%08x", hw->fw_build);
+}
+
+static void ixgbe_info_fw_srev(struct ixgbe_adapter *adapter,
+                              struct ixgbe_info_ctx *ctx)
+{
+       struct ixgbe_nvm_info *nvm = &adapter->hw.flash.nvm;
+
+       snprintf(ctx->buf, sizeof(ctx->buf), "%u", nvm->srev);
+}
+
+static void ixgbe_info_orom_srev(struct ixgbe_adapter *adapter,
+                                struct ixgbe_info_ctx *ctx)
+{
+       struct ixgbe_orom_info *orom = &adapter->hw.flash.orom;
+
+       snprintf(ctx->buf, sizeof(ctx->buf), "%u", orom->srev);
+}
+
+static void ixgbe_info_nvm_ver(struct ixgbe_adapter *adapter,
+                              struct ixgbe_info_ctx *ctx)
+{
+       struct ixgbe_nvm_info *nvm = &adapter->hw.flash.nvm;
+
+       snprintf(ctx->buf, sizeof(ctx->buf), "%x.%02x", nvm->major, nvm->minor);
+}
+
+static void ixgbe_info_netlist_ver(struct ixgbe_adapter *adapter,
+                                  struct ixgbe_info_ctx *ctx)
+{
+       struct ixgbe_netlist_info *netlist = &adapter->hw.flash.netlist;
+
+       /* The netlist version fields are BCD formatted */
+       snprintf(ctx->buf, sizeof(ctx->buf), "%x.%x.%x-%x.%x.%x",
+                netlist->major, netlist->minor,
+                netlist->type >> 16, netlist->type & 0xFFFF,
+                netlist->rev, netlist->cust_ver);
+}
+
+static void ixgbe_info_netlist_build(struct ixgbe_adapter *adapter,
+                                    struct ixgbe_info_ctx *ctx)
+{
+       struct ixgbe_netlist_info *netlist = &adapter->hw.flash.netlist;
+
+       snprintf(ctx->buf, sizeof(ctx->buf), "0x%08x", netlist->hash);
+}
+
+static int ixgbe_devlink_info_get_E610(struct ixgbe_adapter *adapter,
+                                      struct devlink_info_req *req,
+                                      struct ixgbe_info_ctx *ctx)
+{
+       int err;
+
+       ixgbe_info_fw_api(adapter, ctx);
+       err = devlink_info_version_running_put(req,
+                               DEVLINK_INFO_VERSION_GENERIC_FW_MGMT_API,
+                               ctx->buf);
+       if (err)
+               return err;
+
+       ixgbe_info_fw_build(adapter, ctx);
+       err = devlink_info_version_running_put(req, "fw.mgmt.build", ctx->buf);
+       if (err)
+               return err;
+
+       ixgbe_info_fw_srev(adapter, ctx);
+       err = devlink_info_version_running_put(req, "fw.mgmt.srev", ctx->buf);
+       if (err)
+               return err;
+
+       ixgbe_info_orom_srev(adapter, ctx);
+       err = devlink_info_version_running_put(req, "fw.undi.srev", ctx->buf);
+       if (err)
+               return err;
+
+       ixgbe_info_nvm_ver(adapter, ctx);
+       err = devlink_info_version_running_put(req, "fw.psid.api", ctx->buf);
+       if (err)
+               return err;
+
+       ixgbe_info_netlist_ver(adapter, ctx);
+       err = devlink_info_version_running_put(req, "fw.netlist", ctx->buf);
+       if (err)
+               return err;
+
+       ixgbe_info_netlist_build(adapter, ctx);
+       err = devlink_info_version_running_put(req, "fw.netlist.build",
+                                              ctx->buf);
+
+       return err;
+}
+
 static int ixgbe_devlink_info_get(struct devlink *devlink,
                                  struct devlink_info_req *req,
                                  struct netlink_ext_ack *extack)
@@ -78,7 +198,7 @@ static int ixgbe_devlink_info_get(struct devlink *devlink,
        if (err)
                goto free_ctx;
 
-       ixgbe_info_nvm_ver(adapter, ctx);
+       ixgbe_info_orom_ver(adapter, ctx);
        err = devlink_info_version_running_put(req,
                                        DEVLINK_INFO_VERSION_GENERIC_FW_UNDI,
                                        ctx->buf);
@@ -100,6 +220,10 @@ static int ixgbe_devlink_info_get(struct devlink *devlink,
                                        DEVLINK_INFO_VERSION_GENERIC_FW_UNDI,
                                        ctx->buf);
 
+       if (err || hw->mac.type != ixgbe_mac_e610)
+               goto free_ctx;
+
+       err = ixgbe_devlink_info_get_E610(adapter, req, ctx);
 free_ctx:
        kfree(ctx);
        return err;
-- 
2.31.1

Reply via email to