max_rd_addr = cpp_rd_addr + be32_to_cpu(spec_csr->cpp.dump_length);
 
        while (cpp_rd_addr < max_rd_addr) {
-               if (is_xpb_read(&spec_csr->cpp.cpp_id))
-                       bytes_read = nfp_xpb_readl(pf->cpp, cpp_rd_addr,
-                                                  (u32 *)dest);
-               else
+               if (is_xpb_read(&spec_csr->cpp.cpp_id)) {
+                       err = nfp_xpb_readl(pf->cpp, cpp_rd_addr, (u32 *)dest);
+               } else {
                        bytes_read = nfp_cpp_read(pf->cpp, cpp_id, cpp_rd_addr,
                                                  dest, reg_sz);
-               if (bytes_read != reg_sz) {
-                       if (bytes_read >= 0)
-                               bytes_read = -EIO;
-                       dump_header->error = cpu_to_be32(bytes_read);
+                       err = bytes_read == reg_sz ? 0 : -EIO;
+               }
+               if (err) {
+                       dump_header->error = cpu_to_be32(err);
                        dump_header->error_offset = cpu_to_be32(cpp_rd_addr);
                        break;
                }
                                   NFP_IND_ME_REFL_WR_SIG_INIT,
                                   cpp_params.token, cpp_params.island);
        result = nfp_cpp_writel(cpp, cpp_id, csr_ctx_ptr_offs, context);
-       if (result != sizeof(context))
-               return result < 0 ? result : -EIO;
+       if (result)
+               return result;
 
        cpp_id = nfp_get_numeric_cpp_id(&cpp_params);
        result = nfp_cpp_read(cpp, cpp_id, csr_ctx_ptr_offs, dest, reg_sz);
 
  * @offset:    Offset into area
  * @value:     Pointer to read buffer
  *
- * Return: length of the io, or -ERRNO
+ * Return: 0 on success, or -ERRNO
  */
 int nfp_cpp_area_readl(struct nfp_cpp_area *area,
                       unsigned long offset, u32 *value)
 {
        u8 tmp[4];
-       int err;
+       int n;
 
-       err = nfp_cpp_area_read(area, offset, &tmp, sizeof(tmp));
-       *value = get_unaligned_le32(tmp);
+       n = nfp_cpp_area_read(area, offset, &tmp, sizeof(tmp));
+       if (n != sizeof(tmp))
+               return n < 0 ? n : -EIO;
 
-       return err;
+       *value = get_unaligned_le32(tmp);
+       return 0;
 }
 
 /**
  * @offset:    Offset into area
  * @value:     Value to write
  *
- * Return: length of the io, or -ERRNO
+ * Return: 0 on success, or -ERRNO
  */
 int nfp_cpp_area_writel(struct nfp_cpp_area *area,
                        unsigned long offset, u32 value)
 {
        u8 tmp[4];
+       int n;
 
        put_unaligned_le32(value, tmp);
+       n = nfp_cpp_area_write(area, offset, &tmp, sizeof(tmp));
 
-       return nfp_cpp_area_write(area, offset, &tmp, sizeof(tmp));
+       return n == sizeof(tmp) ? 0 : n < 0 ? n : -EIO;
 }
 
 /**
  * @offset:    Offset into area
  * @value:     Pointer to read buffer
  *
- * Return: length of the io, or -ERRNO
+ * Return: 0 on success, or -ERRNO
  */
 int nfp_cpp_area_readq(struct nfp_cpp_area *area,
                       unsigned long offset, u64 *value)
 {
        u8 tmp[8];
-       int err;
+       int n;
 
-       err = nfp_cpp_area_read(area, offset, &tmp, sizeof(tmp));
-       *value = get_unaligned_le64(tmp);
+       n = nfp_cpp_area_read(area, offset, &tmp, sizeof(tmp));
+       if (n != sizeof(tmp))
+               return n < 0 ? n : -EIO;
 
-       return err;
+       *value = get_unaligned_le64(tmp);
+       return 0;
 }
 
 /**
  * @offset:    Offset into area
  * @value:     Value to write
  *
- * Return: length of the io, or -ERRNO
+ * Return: 0 on success, or -ERRNO
  */
 int nfp_cpp_area_writeq(struct nfp_cpp_area *area,
                        unsigned long offset, u64 value)
 {
        u8 tmp[8];
+       int n;
 
        put_unaligned_le64(value, tmp);
+       n = nfp_cpp_area_write(area, offset, &tmp, sizeof(tmp));
 
-       return nfp_cpp_area_write(area, offset, &tmp, sizeof(tmp));
+       return n == sizeof(tmp) ? 0 : n < 0 ? n : -EIO;
 }
 
 /**
  * @xpb_addr:  Address for operation
  * @value:     Pointer to read buffer
  *
- * Return: length of the io, or -ERRNO
+ * Return: 0 on success, or -ERRNO
  */
 int nfp_xpb_readl(struct nfp_cpp *cpp, u32 xpb_addr, u32 *value)
 {
  * @xpb_addr:  Address for operation
  * @value:     Value to write
  *
- * Return: length of the io, or -ERRNO
+ * Return: 0 on success, or -ERRNO
  */
 int nfp_xpb_writel(struct nfp_cpp *cpp, u32 xpb_addr, u32 value)
 {
  *
  * KERNEL: This operation is safe to call in interrupt or softirq context.
  *
- * Return: length of the io, or -ERRNO
+ * Return: 0 on success, or -ERRNO
  */
 int nfp_xpb_writelm(struct nfp_cpp *cpp, u32 xpb_tgt,
                    u32 mask, u32 value)
 
  * @address:   Address for operation
  * @value:     Pointer to read buffer
  *
- * Return: length of the io, or -ERRNO
+ * Return: 0 on success, or -ERRNO
  */
 int nfp_cpp_readl(struct nfp_cpp *cpp, u32 cpp_id,
                  unsigned long long address, u32 *value)
 {
        u8 tmp[4];
-       int err;
+       int n;
 
-       err = nfp_cpp_read(cpp, cpp_id, address, tmp, sizeof(tmp));
-       *value = get_unaligned_le32(tmp);
+       n = nfp_cpp_read(cpp, cpp_id, address, tmp, sizeof(tmp));
+       if (n != sizeof(tmp))
+               return n < 0 ? n : -EIO;
 
-       return err;
+       *value = get_unaligned_le32(tmp);
+       return 0;
 }
 
 /**
  * @address:   Address for operation
  * @value:     Value to write
  *
- * Return: length of the io, or -ERRNO
+ * Return: 0 on success, or -ERRNO
  */
 int nfp_cpp_writel(struct nfp_cpp *cpp, u32 cpp_id,
                   unsigned long long address, u32 value)
 {
        u8 tmp[4];
+       int n;
 
        put_unaligned_le32(value, tmp);
-       return nfp_cpp_write(cpp, cpp_id, address, tmp, sizeof(tmp));
+       n = nfp_cpp_write(cpp, cpp_id, address, tmp, sizeof(tmp));
+
+       return n == sizeof(tmp) ? 0 : n < 0 ? n : -EIO;
 }
 
 /**
  * @address:   Address for operation
  * @value:     Pointer to read buffer
  *
- * Return: length of the io, or -ERRNO
+ * Return: 0 on success, or -ERRNO
  */
 int nfp_cpp_readq(struct nfp_cpp *cpp, u32 cpp_id,
                  unsigned long long address, u64 *value)
 {
        u8 tmp[8];
-       int err;
+       int n;
 
-       err = nfp_cpp_read(cpp, cpp_id, address, tmp, sizeof(tmp));
-       *value = get_unaligned_le64(tmp);
+       n = nfp_cpp_read(cpp, cpp_id, address, tmp, sizeof(tmp));
+       if (n != sizeof(tmp))
+               return n < 0 ? n : -EIO;
 
-       return err;
+       *value = get_unaligned_le64(tmp);
+       return 0;
 }
 
 /**
  * @address:   Address for operation
  * @value:     Value to write
  *
- * Return: length of the io, or -ERRNO
+ * Return: 0 on success, or -ERRNO
  */
 int nfp_cpp_writeq(struct nfp_cpp *cpp, u32 cpp_id,
                   unsigned long long address, u64 value)
 {
        u8 tmp[8];
+       int n;
 
        put_unaligned_le64(value, tmp);
-       return nfp_cpp_write(cpp, cpp_id, address, tmp, sizeof(tmp));
+       n = nfp_cpp_write(cpp, cpp_id, address, tmp, sizeof(tmp));
+
+       return n == sizeof(tmp) ? 0 : n < 0 ? n : -EIO;
 }
 
 /* NOTE: This code should not use nfp_xpb_* functions,
 
                break;
        }
 
-       if (err == sym->size)
-               err = 0;
-       else if (err >= 0)
-               err = -EIO;
 exit:
        if (error)
                *error = err;