From: Simon Horman <ho...@kernel.org> Sent: Sunday, February 9, 2025 5:27 PM >On Mon, Feb 03, 2025 at 04:03:17PM +0100, Jedrzej Jagielski wrote: >> Provide devlink .info_get() callback implementation to allow the >> driver to report detailed version information. The following info >> is reported: >> >> "serial_number" -> The PCI DSN of the adapter >> "fw.bundle_id" -> Unique identifier for the combined flash image >> "fw.undi" -> Version of the Option ROM containing the UEFI driver >> "board.id" -> The PBA ID string >> >> Reviewed-by: Mateusz Polchlopek <mateusz.polchlo...@intel.com> >> Signed-off-by: Jedrzej Jagielski <jedrzej.jagiel...@intel.com> > >... > >> diff --git a/drivers/net/ethernet/intel/ixgbe/devlink/devlink.c >> b/drivers/net/ethernet/intel/ixgbe/devlink/devlink.c > >... > >> +static void ixgbe_info_nvm_ver(struct ixgbe_adapter *adapter, >> + struct ixgbe_info_ctx *ctx) >> +{ >> + struct ixgbe_hw *hw = &adapter->hw; >> + struct ixgbe_nvm_version nvm_ver; >> + >> + ixgbe_get_oem_prod_version(hw, &nvm_ver); >> + if (nvm_ver.oem_valid) { >> + snprintf(ctx->buf, sizeof(ctx->buf), "%x.%x.%x", >> + nvm_ver.oem_major, nvm_ver.oem_minor, >> + nvm_ver.oem_release); >> + >> + return; >> + } >> + >> + ixgbe_get_orom_version(hw, &nvm_ver); >> + if (nvm_ver.or_valid) >> + snprintf(ctx->buf, sizeof(ctx->buf), "%d.%d.%d", >> + nvm_ver.or_major, nvm_ver.or_build, nvm_ver.or_patch); > >Hi Jedrzej, > >If neither of the conditions above are met then it seems that ctx->buf will >contain whatever string was present when the function was called. Is >something like the following needed here? > > ctx->buf[0] = '\0';
Hi Simon, thanks for suggestion, it's definitely worth do be incorporated in the next revision. Thanks! > >> +} >> + >> +static void ixgbe_info_eetrack(struct ixgbe_adapter *adapter, >> + struct ixgbe_info_ctx *ctx) >> +{ >> + struct ixgbe_hw *hw = &adapter->hw; >> + struct ixgbe_nvm_version nvm_ver; >> + >> + ixgbe_get_oem_prod_version(hw, &nvm_ver); >> + /* No ETRACK version for OEM */ >> + if (nvm_ver.oem_valid) >> + return; > >Likewise, here. > >> + >> + ixgbe_get_etk_id(hw, &nvm_ver); >> + snprintf(ctx->buf, sizeof(ctx->buf), "0x%08x", nvm_ver.etk_id); >> +} >> + >> +static int ixgbe_devlink_info_get(struct devlink *devlink, >> + struct devlink_info_req *req, >> + struct netlink_ext_ack *extack) >> +{ >> + struct ixgbe_devlink_priv *devlink_private = devlink_priv(devlink); >> + struct ixgbe_adapter *adapter = devlink_private->adapter; >> + struct ixgbe_hw *hw = &adapter->hw; >> + struct ixgbe_info_ctx *ctx; >> + int err; >> + >> + ctx = kmalloc(sizeof(*ctx), GFP_KERNEL); >> + if (!ctx) >> + return -ENOMEM; >> + >> + ixgbe_info_get_dsn(adapter, ctx); >> + err = devlink_info_serial_number_put(req, ctx->buf); >> + if (err) >> + goto free_ctx; >> + >> + ixgbe_info_nvm_ver(adapter, ctx); >> + err = ixgbe_devlink_info_put(req, IXGBE_DL_VERSION_RUNNING, >> + DEVLINK_INFO_VERSION_GENERIC_FW_UNDI, >> + ctx->buf); >> + if (err) >> + goto free_ctx; >> + >> + ixgbe_info_eetrack(adapter, ctx); >> + err = ixgbe_devlink_info_put(req, IXGBE_DL_VERSION_RUNNING, >> + DEVLINK_INFO_VERSION_GENERIC_FW_BUNDLE_ID, >> + ctx->buf); >> + if (err) >> + goto free_ctx; >> + >> + err = ixgbe_read_pba_string_generic(hw, ctx->buf, sizeof(ctx->buf)); >> + if (err) >> + goto free_ctx; >> + >> + err = ixgbe_devlink_info_put(req, IXGBE_DL_VERSION_FIXED, >> + DEVLINK_INFO_VERSION_GENERIC_BOARD_ID, >> + ctx->buf); >> +free_ctx: >> + kfree(ctx); >> + return err; >> +} > >...