Commit 44f18db5 authored by Jiri Pirko's avatar Jiri Pirko Committed by David S. Miller

mlxfw: Propagate error messages through extack

Currently the error messages are printed to dmesg. Propagate them also
to directly to user doing the flashing through extack.
Signed-off-by: default avatarJiri Pirko <jiri@mellanox.com>
Reviewed-by: default avatarIdo Schimmel <idosch@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9c8bca26
...@@ -552,7 +552,8 @@ static const struct mlxfw_dev_ops mlx5_mlxfw_dev_ops = { ...@@ -552,7 +552,8 @@ static const struct mlxfw_dev_ops mlx5_mlxfw_dev_ops = {
}; };
int mlx5_firmware_flash(struct mlx5_core_dev *dev, int mlx5_firmware_flash(struct mlx5_core_dev *dev,
const struct firmware *firmware) const struct firmware *firmware,
struct netlink_ext_ack *extack)
{ {
struct mlx5_mlxfw_dev mlx5_mlxfw_dev = { struct mlx5_mlxfw_dev mlx5_mlxfw_dev = {
.mlxfw_dev = { .mlxfw_dev = {
...@@ -571,5 +572,6 @@ int mlx5_firmware_flash(struct mlx5_core_dev *dev, ...@@ -571,5 +572,6 @@ int mlx5_firmware_flash(struct mlx5_core_dev *dev,
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
return mlxfw_firmware_flash(&mlx5_mlxfw_dev.mlxfw_dev, firmware); return mlxfw_firmware_flash(&mlx5_mlxfw_dev.mlxfw_dev,
firmware, extack);
} }
...@@ -1230,7 +1230,7 @@ static int mlx5_devlink_flash_update(struct devlink *devlink, ...@@ -1230,7 +1230,7 @@ static int mlx5_devlink_flash_update(struct devlink *devlink,
if (err) if (err)
return err; return err;
return mlx5_firmware_flash(dev, fw); return mlx5_firmware_flash(dev, fw, extack);
} }
static const struct devlink_ops mlx5_devlink_ops = { static const struct devlink_ops mlx5_devlink_ops = {
......
...@@ -184,7 +184,8 @@ int mlx5_set_mtppse(struct mlx5_core_dev *mdev, u8 pin, u8 arm, u8 mode); ...@@ -184,7 +184,8 @@ int mlx5_set_mtppse(struct mlx5_core_dev *mdev, u8 pin, u8 arm, u8 mode);
MLX5_CAP_MCAM_FEATURE((mdev), mtpps_fs) && \ MLX5_CAP_MCAM_FEATURE((mdev), mtpps_fs) && \
MLX5_CAP_MCAM_FEATURE((mdev), mtpps_enh_out_per_adj)) MLX5_CAP_MCAM_FEATURE((mdev), mtpps_enh_out_per_adj))
int mlx5_firmware_flash(struct mlx5_core_dev *dev, const struct firmware *fw); int mlx5_firmware_flash(struct mlx5_core_dev *dev, const struct firmware *fw,
struct netlink_ext_ack *extack);
void mlx5e_init(void); void mlx5e_init(void);
void mlx5e_cleanup(void); void mlx5e_cleanup(void);
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#define _MLXFW_H #define _MLXFW_H
#include <linux/firmware.h> #include <linux/firmware.h>
#include <linux/netlink.h>
enum mlxfw_fsm_state { enum mlxfw_fsm_state {
MLXFW_FSM_STATE_IDLE, MLXFW_FSM_STATE_IDLE,
...@@ -67,11 +68,13 @@ struct mlxfw_dev { ...@@ -67,11 +68,13 @@ struct mlxfw_dev {
#if IS_REACHABLE(CONFIG_MLXFW) #if IS_REACHABLE(CONFIG_MLXFW)
int mlxfw_firmware_flash(struct mlxfw_dev *mlxfw_dev, int mlxfw_firmware_flash(struct mlxfw_dev *mlxfw_dev,
const struct firmware *firmware); const struct firmware *firmware,
struct netlink_ext_ack *extack);
#else #else
static inline static inline
int mlxfw_firmware_flash(struct mlxfw_dev *mlxfw_dev, int mlxfw_firmware_flash(struct mlxfw_dev *mlxfw_dev,
const struct firmware *firmware) const struct firmware *firmware,
struct netlink_ext_ack *extack)
{ {
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
......
...@@ -40,7 +40,8 @@ static const char * const mlxfw_fsm_state_err_str[] = { ...@@ -40,7 +40,8 @@ static const char * const mlxfw_fsm_state_err_str[] = {
}; };
static int mlxfw_fsm_state_wait(struct mlxfw_dev *mlxfw_dev, u32 fwhandle, static int mlxfw_fsm_state_wait(struct mlxfw_dev *mlxfw_dev, u32 fwhandle,
enum mlxfw_fsm_state fsm_state) enum mlxfw_fsm_state fsm_state,
struct netlink_ext_ack *extack)
{ {
enum mlxfw_fsm_state_err fsm_state_err; enum mlxfw_fsm_state_err fsm_state_err;
enum mlxfw_fsm_state curr_fsm_state; enum mlxfw_fsm_state curr_fsm_state;
...@@ -57,11 +58,13 @@ static int mlxfw_fsm_state_wait(struct mlxfw_dev *mlxfw_dev, u32 fwhandle, ...@@ -57,11 +58,13 @@ static int mlxfw_fsm_state_wait(struct mlxfw_dev *mlxfw_dev, u32 fwhandle,
if (fsm_state_err != MLXFW_FSM_STATE_ERR_OK) { if (fsm_state_err != MLXFW_FSM_STATE_ERR_OK) {
pr_err("Firmware flash failed: %s\n", pr_err("Firmware flash failed: %s\n",
mlxfw_fsm_state_err_str[fsm_state_err]); mlxfw_fsm_state_err_str[fsm_state_err]);
NL_SET_ERR_MSG_MOD(extack, "Firmware flash failed");
return -EINVAL; return -EINVAL;
} }
if (curr_fsm_state != fsm_state) { if (curr_fsm_state != fsm_state) {
if (--times == 0) { if (--times == 0) {
pr_err("Timeout reached on FSM state change"); pr_err("Timeout reached on FSM state change");
NL_SET_ERR_MSG_MOD(extack, "Timeout reached on FSM state change");
return -ETIMEDOUT; return -ETIMEDOUT;
} }
msleep(MLXFW_FSM_STATE_WAIT_CYCLE_MS); msleep(MLXFW_FSM_STATE_WAIT_CYCLE_MS);
...@@ -76,7 +79,8 @@ static int mlxfw_fsm_state_wait(struct mlxfw_dev *mlxfw_dev, u32 fwhandle, ...@@ -76,7 +79,8 @@ static int mlxfw_fsm_state_wait(struct mlxfw_dev *mlxfw_dev, u32 fwhandle,
static int mlxfw_flash_component(struct mlxfw_dev *mlxfw_dev, static int mlxfw_flash_component(struct mlxfw_dev *mlxfw_dev,
u32 fwhandle, u32 fwhandle,
struct mlxfw_mfa2_component *comp) struct mlxfw_mfa2_component *comp,
struct netlink_ext_ack *extack)
{ {
u16 comp_max_write_size; u16 comp_max_write_size;
u8 comp_align_bits; u8 comp_align_bits;
...@@ -96,6 +100,7 @@ static int mlxfw_flash_component(struct mlxfw_dev *mlxfw_dev, ...@@ -96,6 +100,7 @@ static int mlxfw_flash_component(struct mlxfw_dev *mlxfw_dev,
if (comp->data_size > comp_max_size) { if (comp->data_size > comp_max_size) {
pr_err("Component %d is of size %d which is bigger than limit %d\n", pr_err("Component %d is of size %d which is bigger than limit %d\n",
comp->index, comp->data_size, comp_max_size); comp->index, comp->data_size, comp_max_size);
NL_SET_ERR_MSG_MOD(extack, "Component is bigger than limit");
return -EINVAL; return -EINVAL;
} }
...@@ -110,7 +115,7 @@ static int mlxfw_flash_component(struct mlxfw_dev *mlxfw_dev, ...@@ -110,7 +115,7 @@ static int mlxfw_flash_component(struct mlxfw_dev *mlxfw_dev,
return err; return err;
err = mlxfw_fsm_state_wait(mlxfw_dev, fwhandle, err = mlxfw_fsm_state_wait(mlxfw_dev, fwhandle,
MLXFW_FSM_STATE_DOWNLOAD); MLXFW_FSM_STATE_DOWNLOAD, extack);
if (err) if (err)
goto err_out; goto err_out;
...@@ -134,7 +139,8 @@ static int mlxfw_flash_component(struct mlxfw_dev *mlxfw_dev, ...@@ -134,7 +139,8 @@ static int mlxfw_flash_component(struct mlxfw_dev *mlxfw_dev,
if (err) if (err)
goto err_out; goto err_out;
err = mlxfw_fsm_state_wait(mlxfw_dev, fwhandle, MLXFW_FSM_STATE_LOCKED); err = mlxfw_fsm_state_wait(mlxfw_dev, fwhandle,
MLXFW_FSM_STATE_LOCKED, extack);
if (err) if (err)
goto err_out; goto err_out;
return 0; return 0;
...@@ -145,7 +151,8 @@ static int mlxfw_flash_component(struct mlxfw_dev *mlxfw_dev, ...@@ -145,7 +151,8 @@ static int mlxfw_flash_component(struct mlxfw_dev *mlxfw_dev,
} }
static int mlxfw_flash_components(struct mlxfw_dev *mlxfw_dev, u32 fwhandle, static int mlxfw_flash_components(struct mlxfw_dev *mlxfw_dev, u32 fwhandle,
struct mlxfw_mfa2_file *mfa2_file) struct mlxfw_mfa2_file *mfa2_file,
struct netlink_ext_ack *extack)
{ {
u32 component_count; u32 component_count;
int err; int err;
...@@ -156,6 +163,7 @@ static int mlxfw_flash_components(struct mlxfw_dev *mlxfw_dev, u32 fwhandle, ...@@ -156,6 +163,7 @@ static int mlxfw_flash_components(struct mlxfw_dev *mlxfw_dev, u32 fwhandle,
&component_count); &component_count);
if (err) { if (err) {
pr_err("Could not find device PSID in MFA2 file\n"); pr_err("Could not find device PSID in MFA2 file\n");
NL_SET_ERR_MSG_MOD(extack, "Could not find device PSID in MFA2 file");
return err; return err;
} }
...@@ -168,7 +176,7 @@ static int mlxfw_flash_components(struct mlxfw_dev *mlxfw_dev, u32 fwhandle, ...@@ -168,7 +176,7 @@ static int mlxfw_flash_components(struct mlxfw_dev *mlxfw_dev, u32 fwhandle,
return PTR_ERR(comp); return PTR_ERR(comp);
pr_info("Flashing component type %d\n", comp->index); pr_info("Flashing component type %d\n", comp->index);
err = mlxfw_flash_component(mlxfw_dev, fwhandle, comp); err = mlxfw_flash_component(mlxfw_dev, fwhandle, comp, extack);
mlxfw_mfa2_file_component_put(comp); mlxfw_mfa2_file_component_put(comp);
if (err) if (err)
return err; return err;
...@@ -177,7 +185,8 @@ static int mlxfw_flash_components(struct mlxfw_dev *mlxfw_dev, u32 fwhandle, ...@@ -177,7 +185,8 @@ static int mlxfw_flash_components(struct mlxfw_dev *mlxfw_dev, u32 fwhandle,
} }
int mlxfw_firmware_flash(struct mlxfw_dev *mlxfw_dev, int mlxfw_firmware_flash(struct mlxfw_dev *mlxfw_dev,
const struct firmware *firmware) const struct firmware *firmware,
struct netlink_ext_ack *extack)
{ {
struct mlxfw_mfa2_file *mfa2_file; struct mlxfw_mfa2_file *mfa2_file;
u32 fwhandle; u32 fwhandle;
...@@ -185,6 +194,7 @@ int mlxfw_firmware_flash(struct mlxfw_dev *mlxfw_dev, ...@@ -185,6 +194,7 @@ int mlxfw_firmware_flash(struct mlxfw_dev *mlxfw_dev,
if (!mlxfw_mfa2_check(firmware)) { if (!mlxfw_mfa2_check(firmware)) {
pr_err("Firmware file is not MFA2\n"); pr_err("Firmware file is not MFA2\n");
NL_SET_ERR_MSG_MOD(extack, "Firmware file is not MFA2");
return -EINVAL; return -EINVAL;
} }
...@@ -196,15 +206,16 @@ int mlxfw_firmware_flash(struct mlxfw_dev *mlxfw_dev, ...@@ -196,15 +206,16 @@ int mlxfw_firmware_flash(struct mlxfw_dev *mlxfw_dev,
err = mlxfw_dev->ops->fsm_lock(mlxfw_dev, &fwhandle); err = mlxfw_dev->ops->fsm_lock(mlxfw_dev, &fwhandle);
if (err) { if (err) {
pr_err("Could not lock the firmware FSM\n"); pr_err("Could not lock the firmware FSM\n");
NL_SET_ERR_MSG_MOD(extack, "Could not lock the firmware FSM");
goto err_fsm_lock; goto err_fsm_lock;
} }
err = mlxfw_fsm_state_wait(mlxfw_dev, fwhandle, err = mlxfw_fsm_state_wait(mlxfw_dev, fwhandle,
MLXFW_FSM_STATE_LOCKED); MLXFW_FSM_STATE_LOCKED, extack);
if (err) if (err)
goto err_state_wait_idle_to_locked; goto err_state_wait_idle_to_locked;
err = mlxfw_flash_components(mlxfw_dev, fwhandle, mfa2_file); err = mlxfw_flash_components(mlxfw_dev, fwhandle, mfa2_file, extack);
if (err) if (err)
goto err_flash_components; goto err_flash_components;
...@@ -212,10 +223,12 @@ int mlxfw_firmware_flash(struct mlxfw_dev *mlxfw_dev, ...@@ -212,10 +223,12 @@ int mlxfw_firmware_flash(struct mlxfw_dev *mlxfw_dev,
err = mlxfw_dev->ops->fsm_activate(mlxfw_dev, fwhandle); err = mlxfw_dev->ops->fsm_activate(mlxfw_dev, fwhandle);
if (err) { if (err) {
pr_err("Could not activate the downloaded image\n"); pr_err("Could not activate the downloaded image\n");
NL_SET_ERR_MSG_MOD(extack, "Could not activate the downloaded image");
goto err_fsm_activate; goto err_fsm_activate;
} }
err = mlxfw_fsm_state_wait(mlxfw_dev, fwhandle, MLXFW_FSM_STATE_LOCKED); err = mlxfw_fsm_state_wait(mlxfw_dev, fwhandle,
MLXFW_FSM_STATE_LOCKED, extack);
if (err) if (err)
goto err_state_wait_activate_to_locked; goto err_state_wait_activate_to_locked;
......
...@@ -307,7 +307,8 @@ static const struct mlxfw_dev_ops mlxsw_sp_mlxfw_dev_ops = { ...@@ -307,7 +307,8 @@ static const struct mlxfw_dev_ops mlxsw_sp_mlxfw_dev_ops = {
}; };
static int mlxsw_sp_firmware_flash(struct mlxsw_sp *mlxsw_sp, static int mlxsw_sp_firmware_flash(struct mlxsw_sp *mlxsw_sp,
const struct firmware *firmware) const struct firmware *firmware,
struct netlink_ext_ack *extack)
{ {
struct mlxsw_sp_mlxfw_dev mlxsw_sp_mlxfw_dev = { struct mlxsw_sp_mlxfw_dev mlxsw_sp_mlxfw_dev = {
.mlxfw_dev = { .mlxfw_dev = {
...@@ -320,7 +321,8 @@ static int mlxsw_sp_firmware_flash(struct mlxsw_sp *mlxsw_sp, ...@@ -320,7 +321,8 @@ static int mlxsw_sp_firmware_flash(struct mlxsw_sp *mlxsw_sp,
int err; int err;
mlxsw_core_fw_flash_start(mlxsw_sp->core); mlxsw_core_fw_flash_start(mlxsw_sp->core);
err = mlxfw_firmware_flash(&mlxsw_sp_mlxfw_dev.mlxfw_dev, firmware); err = mlxfw_firmware_flash(&mlxsw_sp_mlxfw_dev.mlxfw_dev,
firmware, extack);
mlxsw_core_fw_flash_end(mlxsw_sp->core); mlxsw_core_fw_flash_end(mlxsw_sp->core);
return err; return err;
...@@ -374,7 +376,7 @@ static int mlxsw_sp_fw_rev_validate(struct mlxsw_sp *mlxsw_sp) ...@@ -374,7 +376,7 @@ static int mlxsw_sp_fw_rev_validate(struct mlxsw_sp *mlxsw_sp)
return err; return err;
} }
err = mlxsw_sp_firmware_flash(mlxsw_sp, firmware); err = mlxsw_sp_firmware_flash(mlxsw_sp, firmware, NULL);
release_firmware(firmware); release_firmware(firmware);
if (err) if (err)
dev_err(mlxsw_sp->bus_info->dev, "Could not upgrade firmware\n"); dev_err(mlxsw_sp->bus_info->dev, "Could not upgrade firmware\n");
...@@ -403,7 +405,7 @@ static int mlxsw_sp_flash_update(struct mlxsw_core *mlxsw_core, ...@@ -403,7 +405,7 @@ static int mlxsw_sp_flash_update(struct mlxsw_core *mlxsw_core,
mlxsw_sp->bus_info->dev); mlxsw_sp->bus_info->dev);
if (err) if (err)
return err; return err;
err = mlxsw_sp_firmware_flash(mlxsw_sp, firmware); err = mlxsw_sp_firmware_flash(mlxsw_sp, firmware, extack);
release_firmware(firmware); release_firmware(firmware);
return err; return err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment