OSDN Git Service

nfp: nsp: use fractional size of the buffer
authorJakub Kicinski <jakub.kicinski@netronome.com>
Wed, 27 Feb 2019 04:19:30 +0000 (20:19 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 1 Mar 2019 19:36:00 +0000 (11:36 -0800)
NSP expresses the buffer size in MB and 4 kB blocks.  For small
buffers the kB part may make a difference, so count it in.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp.c

index a9d53df..22208b0 100644 (file)
@@ -49,6 +49,7 @@
 #define   NSP_DFLT_BUFFER_ADDRESS      GENMASK_ULL(39, 0)
 
 #define NSP_DFLT_BUFFER_CONFIG 0x20
+#define   NSP_DFLT_BUFFER_SIZE_4KB     GENMASK_ULL(15, 8)
 #define   NSP_DFLT_BUFFER_SIZE_MB      GENMASK_ULL(7, 0)
 
 #define NSP_MAGIC              0xab10
@@ -413,8 +414,8 @@ static int nfp_nsp_command(struct nfp_nsp *state, u16 code)
 static int
 nfp_nsp_command_buf(struct nfp_nsp *nsp, struct nfp_nsp_command_buf_arg *arg)
 {
+       unsigned int def_size, max_size;
        struct nfp_cpp *cpp = nsp->cpp;
-       unsigned int max_size;
        u64 reg, cpp_buf;
        int ret, err;
        u32 cpp_id;
@@ -433,11 +434,11 @@ nfp_nsp_command_buf(struct nfp_nsp *nsp, struct nfp_nsp_command_buf_arg *arg)
                return err;
 
        max_size = max(arg->in_size, arg->out_size);
-       if (FIELD_GET(NSP_DFLT_BUFFER_SIZE_MB, reg) * SZ_1M < max_size) {
-               nfp_err(cpp, "NSP: default buffer too small for command 0x%04x (%llu < %u)\n",
-                       arg->arg.code,
-                       FIELD_GET(NSP_DFLT_BUFFER_SIZE_MB, reg) * SZ_1M,
-                       max_size);
+       def_size = FIELD_GET(NSP_DFLT_BUFFER_SIZE_MB, reg) * SZ_1M +
+                  FIELD_GET(NSP_DFLT_BUFFER_SIZE_4KB, reg) * SZ_4K;
+       if (def_size < max_size) {
+               nfp_err(cpp, "NSP: default buffer too small for command 0x%04x (%u < %u)\n",
+                       arg->arg.code, def_size, max_size);
                return -EINVAL;
        }