Commit 3fc0c519 authored by Jiri Pirko's avatar Jiri Pirko Committed by Jakub Kicinski
Browse files

mlxsw: core_linecards: Expose device PSID over device info



Use tunneled MGIR to obtain PSID of line card device and extend
device_info_get() op to fill up the info with that.

Example:

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

Signed-off-by: default avatarJiri Pirko <jiri@nvidia.com>
Reviewed-by: default avatarIdo Schimmel <idosch@nvidia.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 8f9b0513
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -75,6 +75,9 @@ The ``mlxsw`` driver reports the following versions for line card auxiliary devi
   * - ``ini.version``
     - running
     - Version of line card INI loaded
   * - ``fw.psid``
     - fixed
     - Line card device PSID
   * - ``fw.version``
     - running
     - Three digit firmware version of line card device
+1 −0
Original line number Diff line number Diff line
@@ -570,6 +570,7 @@ struct mlxsw_linecard_device_info {
	u16 fw_major;
	u16 fw_minor;
	u16 fw_sub_minor;
	char psid[MLXSW_REG_MGIR_FW_INFO_PSID_SIZE];
};

struct mlxsw_linecard {
+31 −0
Original line number Diff line number Diff line
@@ -87,6 +87,27 @@ static const char *mlxsw_linecard_type_name(struct mlxsw_linecard *linecard)
	return linecard->name;
}

static int mlxsw_linecard_device_psid_get(struct mlxsw_linecard *linecard,
					  u8 device_index, char *psid)
{
	struct mlxsw_core *mlxsw_core = linecard->linecards->mlxsw_core;
	char mddt_pl[MLXSW_REG_MDDT_LEN];
	char *mgir_pl;
	int err;

	mlxsw_reg_mddt_pack(mddt_pl, linecard->slot_index, device_index,
			    MLXSW_REG_MDDT_METHOD_QUERY,
			    MLXSW_REG(mgir), &mgir_pl);

	mlxsw_reg_mgir_pack(mgir_pl);
	err = mlxsw_reg_query(mlxsw_core, MLXSW_REG(mddt), mddt_pl);
	if (err)
		return err;

	mlxsw_reg_mgir_fw_info_psid_memcpy_from(mgir_pl, psid);
	return 0;
}

static int mlxsw_linecard_device_info_update(struct mlxsw_linecard *linecard)
{
	struct mlxsw_core *mlxsw_core = linecard->linecards->mlxsw_core;
@@ -121,6 +142,12 @@ static int mlxsw_linecard_device_info_update(struct mlxsw_linecard *linecard)
				      linecard->slot_index);
			return 0;
		}

		err = mlxsw_linecard_device_psid_get(linecard, device_index,
						     info.psid);
		if (err)
			return err;

		linecard->device.info = info;
		flashable_found = true;
	} while (msg_seq);
@@ -293,6 +320,10 @@ int mlxsw_linecard_devlink_info_get(struct mlxsw_linecard *linecard,
	if (linecard->active) {
		struct mlxsw_linecard_device_info *info = &linecard->device.info;

		err = devlink_info_version_fixed_put(req,
						     DEVLINK_INFO_VERSION_GENERIC_FW_PSID,
						     info->psid);

		sprintf(buf, "%u.%u.%u", info->fw_major, info->fw_minor,
			info->fw_sub_minor);
		err = devlink_info_version_running_put(req,