Hi Edward,

I love your patch! Perhaps something to improve:

[auto build test WARNING on net-next/master]

url:    
https://github.com/0day-ci/linux/commits/Edward-Cree/sfc_ef100-driver-for-EF100-family-NICs-part-1/20200703-233750
base:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 
8c8278a5b1a81e099ba883d8a0f9e3df9bdb1a74
config: i386-randconfig-s002-20200702 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-14) 9.3.0
reproduce:
        # apt-get install sparse
        # sparse version: v0.6.2-3-gfa153962-dirty
        # save the attached .config to linux build tree
        make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=i386 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <l...@intel.com>

All warnings (new ones prefixed by >>):

   In file included from include/linux/skbuff.h:31,
                    from include/linux/if_ether.h:19,
                    from include/uapi/linux/ethtool.h:19,
                    from include/linux/ethtool.h:18,
                    from include/linux/netdevice.h:37,
                    from drivers/net/ethernet/sfc/net_driver.h:13,
                    from drivers/net/ethernet/sfc/ef100.c:12:
   drivers/net/ethernet/sfc/ef100.c: In function 
'ef100_pci_parse_continue_entry':
>> include/linux/dma-mapping.h:139:25: warning: conversion from 'long long 
>> unsigned int' to 'dma_addr_t' {aka 'unsigned int'} changes value from 
>> '18446744073709551615' to '4294967295' [-Woverflow]
     139 | #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
         |                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/net/ethernet/sfc/ef100.c:144:6: note: in expansion of macro 
>> 'DMA_BIT_MASK'
     144 |      DMA_BIT_MASK(ESF_GZ_TX_SEND_ADDR_WIDTH),
         |      ^~~~~~~~~~~~
>> include/linux/dma-mapping.h:139:25: warning: conversion from 'long long 
>> unsigned int' to 'dma_addr_t' {aka 'unsigned int'} changes value from 
>> '18446744073709551615' to '4294967295' [-Woverflow]
     139 | #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
         |                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/net/ethernet/sfc/ef100.c:162:6: note: in expansion of macro 
'DMA_BIT_MASK'
     162 |      DMA_BIT_MASK(ESF_GZ_TX_SEND_ADDR_WIDTH),
         |      ^~~~~~~~~~~~
   drivers/net/ethernet/sfc/ef100.c: In function 'ef100_pci_parse_xilinx_cap':
>> include/linux/dma-mapping.h:139:25: warning: conversion from 'long long 
>> unsigned int' to 'dma_addr_t' {aka 'unsigned int'} changes value from 
>> '18446744073709551615' to '4294967295' [-Woverflow]
     139 | #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
         |                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/net/ethernet/sfc/ef100.c:339:5: note: in expansion of macro 
'DMA_BIT_MASK'
     339 |     DMA_BIT_MASK(ESF_GZ_TX_SEND_ADDR_WIDTH),
         |     ^~~~~~~~~~~~
   drivers/net/ethernet/sfc/ef100.c: In function 'ef100_pci_probe':
>> include/linux/dma-mapping.h:139:25: warning: conversion from 'long long 
>> unsigned int' to 'dma_addr_t' {aka 'unsigned int'} changes value from 
>> '18446744073709551615' to '4294967295' [-Woverflow]
     139 | #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
         |                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/net/ethernet/sfc/ef100.c:503:5: note: in expansion of macro 
'DMA_BIT_MASK'
     503 |     DMA_BIT_MASK(ESF_GZ_TX_SEND_ADDR_WIDTH),
         |     ^~~~~~~~~~~~
--
>> drivers/net/ethernet/sfc/ef100_netdev.c:45:13: warning: no previous 
>> prototype for 'ef100_hard_start_xmit' [-Wmissing-prototypes]
      45 | netdev_tx_t ef100_hard_start_xmit(struct sk_buff *skb,
         |             ^~~~~~~~~~~~~~~~~~~~~
--
>> drivers/net/ethernet/sfc/ef100_rx.c:15:6: warning: no previous prototype for 
>> '__efx_rx_packet' [-Wmissing-prototypes]
      15 | void __efx_rx_packet(struct efx_channel *channel)
         |      ^~~~~~~~~~~~~~~
--
>> drivers/net/ethernet/sfc/ef100_tx.c:16:5: warning: no previous prototype for 
>> 'efx_enqueue_skb_tso' [-Wmissing-prototypes]
      16 | int efx_enqueue_skb_tso(struct efx_tx_queue *tx_queue, struct 
sk_buff *skb,
         |     ^~~~~~~~~~~~~~~~~~~

sparse warnings: (new ones prefixed by >>)

>> drivers/net/ethernet/sfc/ef100_netdev.c:45:13: sparse: sparse: symbol 
>> 'ef100_hard_start_xmit' was not declared. Should it be static?

Please review and possibly fold the followup patch.

vim +/DMA_BIT_MASK +144 drivers/net/ethernet/sfc/ef100.c

  > 12  #include "net_driver.h"
    13  #include <linux/module.h>
    14  #include <linux/aer.h>
    15  #include "efx_common.h"
    16  #include "efx_channels.h"
    17  #include "io.h"
    18  #include "ef100_nic.h"
    19  #include "ef100_netdev.h"
    20  #include "ef100_regs.h"
    21  
    22  #define EFX_EF100_PCI_DEFAULT_BAR       2
    23  
    24  /* Number of bytes at start of vendor specified extended capability 
that indicate
    25   * that the capability is vendor specified. i.e. offset from value 
returned by
    26   * pci_find_next_ext_capability() to beginning of vendor specified 
capability
    27   * header.
    28   */
    29  #define PCI_EXT_CAP_HDR_LENGTH  4
    30  
    31  /* Expected size of a Xilinx continuation address table entry. */
    32  #define ESE_GZ_CFGBAR_CONT_CAP_MIN_LENGTH      16
    33  
    34  struct ef100_func_ctl_window {
    35          bool valid;
    36          unsigned int bar;
    37          u64 offset;
    38  };
    39  
    40  static int ef100_pci_walk_xilinx_table(struct efx_nic *efx, u64 offset,
    41                                         struct ef100_func_ctl_window 
*result);
    42  
    43  /* Number of bytes to offset when reading bit position x with dword 
accessors. */
    44  #define ROUND_DOWN_TO_DWORD(x) (((x) & (~31)) >> 3)
    45  
    46  #define EXTRACT_BITS(x, lbn, width) \
    47          ((x) >> ((lbn) & 31)) & ((1ull << (width)) - 1)
    48  
    49  static u32 _ef100_pci_get_bar_bits_with_width(struct efx_nic *efx,
    50                                                int structure_start,
    51                                                int lbn, int width)
    52  {
    53          efx_dword_t dword;
    54  
    55          efx_readd(efx, &dword, structure_start + 
ROUND_DOWN_TO_DWORD(lbn));
    56  
    57          return EXTRACT_BITS(le32_to_cpu(dword.u32[0]), lbn, width);
    58  }
    59  
    60  #define ef100_pci_get_bar_bits(efx, entry_location, bitdef) \
    61          _ef100_pci_get_bar_bits_with_width(efx, entry_location, \
    62                  bitdef ## _LBN, bitdef ## _WIDTH)
    63  
    64  static int ef100_pci_parse_ef100_entry(struct efx_nic *efx, int 
entry_location,
    65                                         struct ef100_func_ctl_window 
*result)
    66  {
    67          u32 bar = ef100_pci_get_bar_bits(efx, entry_location,
    68                                           ESF_GZ_CFGBAR_EF100_BAR);
    69          u64 offset = ef100_pci_get_bar_bits(efx, entry_location,
    70                                              
ESF_GZ_CFGBAR_EF100_FUNC_CTL_WIN_OFF) << ESE_GZ_EF100_FUNC_CTL_WIN_OFF_SHIFT;
    71  
    72          netif_dbg(efx, probe, efx->net_dev,
    73                    "Found EF100 function control window bar=%d 
offset=0x%llx\n",
    74                    bar, offset);
    75  
    76          if (result->valid) {
    77                  netif_err(efx, probe, efx->net_dev,
    78                            "Duplicated EF100 table entry.\n");
    79                  return -EINVAL;
    80          }
    81  
    82          if ((bar == ESE_GZ_CFGBAR_EF100_BAR_NUM_EXPANSION_ROM) ||
    83              (bar == ESE_GZ_CFGBAR_EF100_BAR_NUM_INVALID)) {
    84                  netif_err(efx, probe, efx->net_dev,
    85                            "Bad BAR value of %d in Xilinx capabilities 
EF100 entry.\n",
    86                            bar);
    87                  return -EINVAL;
    88          }
    89  
    90          result->bar = bar;
    91          result->offset = offset;
    92          result->valid = true;
    93          return 0;
    94  }
    95  
    96  static bool ef100_pci_does_bar_overflow(struct efx_nic *efx, int bar,
    97                                          u64 next_entry)
    98  {
    99          return next_entry + ESE_GZ_CFGBAR_ENTRY_HEADER_SIZE >
   100                  pci_resource_len(efx->pci_dev, bar);
   101  }
   102  
   103  /* Parse a Xilinx capabilities table entry describing a continuation to 
a new
   104   * sub-table.
   105   */
   106  static int ef100_pci_parse_continue_entry(struct efx_nic *efx, int 
entry_location,
   107                                            struct ef100_func_ctl_window 
*result)
   108  {
   109          unsigned int previous_bar;
   110          efx_oword_t entry;
   111          u64 offset;
   112          int rc = 0;
   113          u32 bar;
   114  
   115          efx_reado(efx, &entry, entry_location);
   116  
   117          bar = EFX_OWORD_FIELD32(entry, ESF_GZ_CFGBAR_CONT_CAP_BAR);
   118  
   119          offset = EFX_OWORD_FIELD64(entry, 
ESF_GZ_CFGBAR_CONT_CAP_OFFSET) <<
   120                  ESE_GZ_CONT_CAP_OFFSET_BYTES_SHIFT;
   121  
   122          previous_bar = efx->mem_bar;
   123  
   124          if ((bar == ESE_GZ_VSEC_BAR_NUM_EXPANSION_ROM) ||
   125              (bar == ESE_GZ_VSEC_BAR_NUM_INVALID)) {
   126                  netif_err(efx, probe, efx->net_dev,
   127                            "Bad BAR value of %d in Xilinx capabilities 
sub-table.\n",
   128                            bar);
   129                  return -EINVAL;
   130          }
   131  
   132          if (bar != previous_bar) {
   133                  efx_fini_io(efx);
   134  
   135                  if (ef100_pci_does_bar_overflow(efx, bar, offset)) {
   136                          netif_err(efx, probe, efx->net_dev,
   137                                    "Xilinx table will overrun BAR[%d] 
offset=0x%llx\n",
   138                                    bar, offset);
   139                          return -EINVAL;
   140                  }
   141  
   142                  /* Temporarily map new BAR. */
   143                  rc = efx_init_io(efx, bar,
 > 144                                   
 > DMA_BIT_MASK(ESF_GZ_TX_SEND_ADDR_WIDTH),
   145                                   pci_resource_len(efx->pci_dev, bar));
   146                  if (rc) {
   147                          netif_err(efx, probe, efx->net_dev,
   148                                    "Mapping new BAR for Xilinx table 
failed, rc=%d\n", rc);
   149                          return rc;
   150                  }
   151          }
   152  
   153          rc = ef100_pci_walk_xilinx_table(efx, offset, result);
   154          if (rc)
   155                  return rc;
   156  
   157          if (bar != previous_bar) {
   158                  efx_fini_io(efx);
   159  
   160                  /* Put old BAR back. */
   161                  rc = efx_init_io(efx, previous_bar,
   162                                   
DMA_BIT_MASK(ESF_GZ_TX_SEND_ADDR_WIDTH),
   163                                   pci_resource_len(efx->pci_dev, 
previous_bar));
   164                  if (rc) {
   165                          netif_err(efx, probe, efx->net_dev,
   166                                    "Putting old BAR back failed, 
rc=%d\n", rc);
   167                          return rc;
   168                  }
   169          }
   170  
   171          return 0;
   172  }
   173  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-...@lists.01.org

Attachment: .config.gz
Description: application/gzip

Reply via email to