nfp: add extended error messages
authorJakub Kicinski <jakub.kicinski@netronome.com>
Tue, 4 Apr 2017 23:12:33 +0000 (16:12 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 5 Apr 2017 17:49:12 +0000 (10:49 -0700)
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: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Simon Horman <simon.horman@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp.c

index 225d0781537510546d741a4a55f3bce93398e2de..96bb5f6bd87b81e47781ce0b51de8897f58cbe00 100644 (file)
@@ -97,6 +97,13 @@ enum nfp_nsp_cmd {
        __MAX_SPCODE,
 };
 
+static const struct {
+       int code;
+       const char *msg;
+} nsp_errors[] = {
+       { 0, "success" } /* placeholder to avoid warnings */
+};
+
 struct nfp_nsp {
        struct nfp_cpp *cpp;
        struct nfp_resource *res;
@@ -149,6 +156,18 @@ void nfp_nsp_config_clear_state(struct nfp_nsp *state)
        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)
 {
        struct nfp_cpp *cpp = state->cpp;
@@ -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,
                           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;
        u32 nsp_cpp;
        int err;
@@ -335,18 +354,20 @@ static int nfp_nsp_command(struct nfp_nsp *state, u16 code, u32 option,
                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);
        if (err) {
-               nfp_warn(cpp, "Result (error) code set: %d command: %d\n",
-                        -err, code);
+               nfp_warn(cpp, "Result (error) code set: %d (%d) command: %d\n",
+                        -err, (int)ret_val, code);
+               nfp_nsp_print_extended_error(state, ret_val);
                return -err;
        }
 
-       err = nfp_cpp_readq(cpp, nsp_cpp, nsp_command, &reg);
-       if (err < 0)
-               return err;
-
-       return FIELD_GET(NSP_COMMAND_OPTION, reg);
+       return ret_val;
 }
 
 static int nfp_nsp_command_buf(struct nfp_nsp *nsp, u16 code, u32 option,