Message ID | 20191122215111.21723-4-saeedm@mellanox.com |
---|---|
State | Superseded |
Delegated to: | David Miller |
Headers | show |
Series | mlxfw: Improve error reporting | expand |
On Fri, 2019-11-22 at 21:51 +0000, Saeed Mahameed wrote: > Report unique and standard error codes corresponding to the specific > FW flash error and report more detailed error messages to netlink. > > Before: > $ devlink dev flash pci/0000:05:00.0 file ... > Error: mlxfw: Firmware flash failed. > devlink answers: Invalid argument > > After: > $ devlink dev flash pci/0000:05:00.0 file ... > Error: mlxfw: Firmware flash failed: pending reset. > devlink answers: Operation already in progress > > Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> > Reviewed-by: Ido Schimmel <idosch@mellanox.com> > Acked-by: Jiri Pirko <jiri@mellanox.com> > --- > .../net/ethernet/mellanox/mlxfw/mlxfw_fsm.c | 55 > +++++++++++++++++-- > 1 file changed, 49 insertions(+), 6 deletions(-) > > diff --git a/drivers/net/ethernet/mellanox/mlxfw/mlxfw_fsm.c > b/drivers/net/ethernet/mellanox/mlxfw/mlxfw_fsm.c > index afcdc579578c..ba1e5b276c54 100644 > --- a/drivers/net/ethernet/mellanox/mlxfw/mlxfw_fsm.c > +++ b/drivers/net/ethernet/mellanox/mlxfw/mlxfw_fsm.c > @@ -39,6 +39,52 @@ static const char * const > mlxfw_fsm_state_err_str[] = { > "unknown error" > }; > > +static int mlxfw_fsm_state_err(struct netlink_ext_ack *extack, > + enum mlxfw_fsm_state_err fsm_state_err) > +{ > +#define MLXFW_ERR_PRFX "Firmware flash failed: " > +#define MLXFW_FSM_STATE_ERR_NL(extack, msg) \ > + NL_SET_ERR_MSG_MOD((extack), MLXFW_ERR_PRFX msg) > + > + fsm_state_err = min_t(enum mlxfw_fsm_state_err, fsm_state_err, > + MLXFW_FSM_STATE_ERR_MAX); > + pr_err(MLXFW_ERR_PRFX "%s\n", > mlxfw_fsm_state_err_str[fsm_state_err]); > + switch (fsm_state_err) { > + case MLXFW_FSM_STATE_ERR_ERROR: > + MLXFW_FSM_STATE_ERR_NL(extack, "general error"); > + return -EREMOTEIO; > + case MLXFW_FSM_STATE_ERR_REJECTED_DIGEST_ERR: > + MLXFW_FSM_STATE_ERR_NL(extack, "component hash > mismatch"); > + return -EBADMSG; > + case MLXFW_FSM_STATE_ERR_REJECTED_NOT_APPLICABLE: > + MLXFW_FSM_STATE_ERR_NL(extack, "component not > applicable"); > + return -ENOENT; > + case MLXFW_FSM_STATE_ERR_REJECTED_UNKNOWN_KEY: > + MLXFW_FSM_STATE_ERR_NL(extack, "unknown key"); > + return -ENOKEY; > + case MLXFW_FSM_STATE_ERR_REJECTED_AUTH_FAILED: > + MLXFW_FSM_STATE_ERR_NL(extack, "authentication > failed"); > + return -EACCES; > + case MLXFW_FSM_STATE_ERR_REJECTED_UNSIGNED: > + MLXFW_FSM_STATE_ERR_NL(extack, "component was not > signed"); > + return -EKEYREVOKED; > + case MLXFW_FSM_STATE_ERR_REJECTED_KEY_NOT_APPLICABLE: > + MLXFW_FSM_STATE_ERR_NL(extack, "key not applicable"); > + return -EKEYREJECTED; > + case MLXFW_FSM_STATE_ERR_REJECTED_BAD_FORMAT: > + MLXFW_FSM_STATE_ERR_NL(extack, "bad format"); > + return -ENOEXEC; > + case MLXFW_FSM_STATE_ERR_BLOCKED_PENDING_RESET: > + MLXFW_FSM_STATE_ERR_NL(extack, "pending reset"); > + return -EALREADY; > + case MLXFW_FSM_STATE_ERR_OK: /* should never happen */ > + case MLXFW_FSM_STATE_ERR_MAX: > + MLXFW_FSM_STATE_ERR_NL(extack, "unknown error"); > + return -EINVAL; > + } Actually with the introduction of the formattable extack buffer in first patch this whole switch case can be reduced to + NL_SET_ERR_MSG_MOD(extack, MLXFW_ERR_PRFX "%s", + mlxfw_fsm_state_err_str[fsm_state_err]); I will send V2.
diff --git a/drivers/net/ethernet/mellanox/mlxfw/mlxfw_fsm.c b/drivers/net/ethernet/mellanox/mlxfw/mlxfw_fsm.c index afcdc579578c..ba1e5b276c54 100644 --- a/drivers/net/ethernet/mellanox/mlxfw/mlxfw_fsm.c +++ b/drivers/net/ethernet/mellanox/mlxfw/mlxfw_fsm.c @@ -39,6 +39,52 @@ static const char * const mlxfw_fsm_state_err_str[] = { "unknown error" }; +static int mlxfw_fsm_state_err(struct netlink_ext_ack *extack, + enum mlxfw_fsm_state_err fsm_state_err) +{ +#define MLXFW_ERR_PRFX "Firmware flash failed: " +#define MLXFW_FSM_STATE_ERR_NL(extack, msg) \ + NL_SET_ERR_MSG_MOD((extack), MLXFW_ERR_PRFX msg) + + fsm_state_err = min_t(enum mlxfw_fsm_state_err, fsm_state_err, + MLXFW_FSM_STATE_ERR_MAX); + pr_err(MLXFW_ERR_PRFX "%s\n", mlxfw_fsm_state_err_str[fsm_state_err]); + switch (fsm_state_err) { + case MLXFW_FSM_STATE_ERR_ERROR: + MLXFW_FSM_STATE_ERR_NL(extack, "general error"); + return -EREMOTEIO; + case MLXFW_FSM_STATE_ERR_REJECTED_DIGEST_ERR: + MLXFW_FSM_STATE_ERR_NL(extack, "component hash mismatch"); + return -EBADMSG; + case MLXFW_FSM_STATE_ERR_REJECTED_NOT_APPLICABLE: + MLXFW_FSM_STATE_ERR_NL(extack, "component not applicable"); + return -ENOENT; + case MLXFW_FSM_STATE_ERR_REJECTED_UNKNOWN_KEY: + MLXFW_FSM_STATE_ERR_NL(extack, "unknown key"); + return -ENOKEY; + case MLXFW_FSM_STATE_ERR_REJECTED_AUTH_FAILED: + MLXFW_FSM_STATE_ERR_NL(extack, "authentication failed"); + return -EACCES; + case MLXFW_FSM_STATE_ERR_REJECTED_UNSIGNED: + MLXFW_FSM_STATE_ERR_NL(extack, "component was not signed"); + return -EKEYREVOKED; + case MLXFW_FSM_STATE_ERR_REJECTED_KEY_NOT_APPLICABLE: + MLXFW_FSM_STATE_ERR_NL(extack, "key not applicable"); + return -EKEYREJECTED; + case MLXFW_FSM_STATE_ERR_REJECTED_BAD_FORMAT: + MLXFW_FSM_STATE_ERR_NL(extack, "bad format"); + return -ENOEXEC; + case MLXFW_FSM_STATE_ERR_BLOCKED_PENDING_RESET: + MLXFW_FSM_STATE_ERR_NL(extack, "pending reset"); + return -EALREADY; + case MLXFW_FSM_STATE_ERR_OK: /* should never happen */ + case MLXFW_FSM_STATE_ERR_MAX: + MLXFW_FSM_STATE_ERR_NL(extack, "unknown error"); + return -EINVAL; + } + return -EINVAL; +}; + static void mlxfw_status_notify(struct mlxfw_dev *mlxfw_dev, const char *msg, const char *comp_name, u32 done_bytes, u32 total_bytes) @@ -63,12 +109,9 @@ static int mlxfw_fsm_state_wait(struct mlxfw_dev *mlxfw_dev, u32 fwhandle, if (err) return err; - if (fsm_state_err != MLXFW_FSM_STATE_ERR_OK) { - pr_err("Firmware flash failed: %s\n", - mlxfw_fsm_state_err_str[fsm_state_err]); - NL_SET_ERR_MSG_MOD(extack, "Firmware flash failed"); - return -EINVAL; - } + if (fsm_state_err != MLXFW_FSM_STATE_ERR_OK) + return mlxfw_fsm_state_err(extack, fsm_state_err); + if (curr_fsm_state != fsm_state) { if (--times == 0) { pr_err("Timeout reached on FSM state change");