Commit 85eb97dd authored by Jakub Kicinski's avatar Jakub Kicinski Committed by David S. Miller

nfp: add extended error messages

Allow NSP to set option code even when error is reported.  This provides
a way for NSP to give user more precise information about why command
failed.
Signed-off-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: default avatarSimon Horman <simon.horman@netronome.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e890ae8e
...@@ -97,6 +97,13 @@ enum nfp_nsp_cmd { ...@@ -97,6 +97,13 @@ enum nfp_nsp_cmd {
__MAX_SPCODE, __MAX_SPCODE,
}; };
static const struct {
int code;
const char *msg;
} nsp_errors[] = {
{ 0, "success" } /* placeholder to avoid warnings */
};
struct nfp_nsp { struct nfp_nsp {
struct nfp_cpp *cpp; struct nfp_cpp *cpp;
struct nfp_resource *res; struct nfp_resource *res;
...@@ -149,6 +156,18 @@ void nfp_nsp_config_clear_state(struct nfp_nsp *state) ...@@ -149,6 +156,18 @@ void nfp_nsp_config_clear_state(struct nfp_nsp *state)
state->idx = 0; state->idx = 0;
} }
static void nfp_nsp_print_extended_error(struct nfp_nsp *state, u32 ret_val)
{
int i;
if (!ret_val)
return;
for (i = 0; i < ARRAY_SIZE(nsp_errors); i++)
if (ret_val == nsp_errors[i].code)
nfp_err(state->cpp, "err msg: %s\n", nsp_errors[i].msg);
}
static int nfp_nsp_check(struct nfp_nsp *state) static int nfp_nsp_check(struct nfp_nsp *state)
{ {
struct nfp_cpp *cpp = state->cpp; struct nfp_cpp *cpp = state->cpp;
...@@ -282,7 +301,7 @@ nfp_nsp_wait_reg(struct nfp_cpp *cpp, u64 *reg, ...@@ -282,7 +301,7 @@ nfp_nsp_wait_reg(struct nfp_cpp *cpp, u64 *reg,
static int nfp_nsp_command(struct nfp_nsp *state, u16 code, u32 option, static int nfp_nsp_command(struct nfp_nsp *state, u16 code, u32 option,
u32 buff_cpp, u64 buff_addr) u32 buff_cpp, u64 buff_addr)
{ {
u64 reg, nsp_base, nsp_buffer, nsp_status, nsp_command; u64 reg, ret_val, nsp_base, nsp_buffer, nsp_status, nsp_command;
struct nfp_cpp *cpp = state->cpp; struct nfp_cpp *cpp = state->cpp;
u32 nsp_cpp; u32 nsp_cpp;
int err; int err;
...@@ -335,18 +354,20 @@ static int nfp_nsp_command(struct nfp_nsp *state, u16 code, u32 option, ...@@ -335,18 +354,20 @@ static int nfp_nsp_command(struct nfp_nsp *state, u16 code, u32 option,
return err; return err;
} }
err = nfp_cpp_readq(cpp, nsp_cpp, nsp_command, &ret_val);
if (err < 0)
return err;
ret_val = FIELD_GET(NSP_COMMAND_OPTION, ret_val);
err = FIELD_GET(NSP_STATUS_RESULT, reg); err = FIELD_GET(NSP_STATUS_RESULT, reg);
if (err) { if (err) {
nfp_warn(cpp, "Result (error) code set: %d command: %d\n", nfp_warn(cpp, "Result (error) code set: %d (%d) command: %d\n",
-err, code); -err, (int)ret_val, code);
nfp_nsp_print_extended_error(state, ret_val);
return -err; return -err;
} }
err = nfp_cpp_readq(cpp, nsp_cpp, nsp_command, &reg); return ret_val;
if (err < 0)
return err;
return FIELD_GET(NSP_COMMAND_OPTION, reg);
} }
static int nfp_nsp_command_buf(struct nfp_nsp *nsp, u16 code, u32 option, static int nfp_nsp_command_buf(struct nfp_nsp *nsp, u16 code, u32 option,
......
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