tree:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 
master
head:   22942498ccebf13b076859f8746be161dc0c6d89
commit: d398231219116da5697bbe090e478dd68a2259ed [58/94] enetc: add hardware 
timestamping support
reproduce:
        # apt-get install sparse
        # sparse version: v0.6.1-rc1-7-g2b96cd8-dirty
        git checkout d398231219116da5697bbe090e478dd68a2259ed
        make ARCH=x86_64 allmodconfig
        make C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__'

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


sparse warnings: (new ones prefixed by >>)

>> drivers/net/ethernet/freescale/enetc/enetc.c:314:27: sparse: sparse: 
>> restricted __le32 degrades to integer
   drivers/net/ethernet/freescale/enetc/enetc.c:316:43: sparse: sparse: 
restricted __le32 degrades to integer
>> drivers/net/ethernet/freescale/enetc/enetc.c:489:20: sparse: sparse: 
>> restricted __le16 degrades to integer
   drivers/net/ethernet/freescale/enetc/enetc.c:492:34: sparse: sparse: 
restricted __le32 degrades to integer
   drivers/net/ethernet/freescale/enetc/enetc.c:495:49: sparse: sparse: 
restricted __le32 degrades to integer

vim +314 drivers/net/ethernet/freescale/enetc/enetc.c

   306  
   307  static void enetc_get_tx_tstamp(struct enetc_hw *hw, union enetc_tx_bd 
*txbd,
   308                                  u64 *tstamp)
   309  {
   310          u32 lo, hi;
   311  
   312          lo = enetc_rd(hw, ENETC_SICTR0);
   313          hi = enetc_rd(hw, ENETC_SICTR1);
 > 314          if (lo <= txbd->wb.tstamp)
   315                  hi -= 1;
   316          *tstamp = (u64)hi << 32 | txbd->wb.tstamp;
   317  }
   318  
   319  static void enetc_tstamp_tx(struct sk_buff *skb, u64 tstamp)
   320  {
   321          struct skb_shared_hwtstamps shhwtstamps;
   322  
   323          if (skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS) {
   324                  memset(&shhwtstamps, 0, sizeof(shhwtstamps));
   325                  shhwtstamps.hwtstamp = ns_to_ktime(tstamp);
   326                  skb_tstamp_tx(skb, &shhwtstamps);
   327          }
   328  }
   329  
   330  static bool enetc_clean_tx_ring(struct enetc_bdr *tx_ring, int 
napi_budget)
   331  {
   332          struct net_device *ndev = tx_ring->ndev;
   333          int tx_frm_cnt = 0, tx_byte_cnt = 0;
   334          struct enetc_tx_swbd *tx_swbd;
   335          int i, bds_to_clean;
   336          bool do_tstamp;
   337          u64 tstamp = 0;
   338  
   339          i = tx_ring->next_to_clean;
   340          tx_swbd = &tx_ring->tx_swbd[i];
   341          bds_to_clean = enetc_bd_ready_count(tx_ring, i);
   342  
   343          do_tstamp = false;
   344  
   345          while (bds_to_clean && tx_frm_cnt < ENETC_DEFAULT_TX_WORK) {
   346                  bool is_eof = !!tx_swbd->skb;
   347  
   348                  if (unlikely(tx_swbd->check_wb)) {
   349                          struct enetc_ndev_priv *priv = 
netdev_priv(ndev);
   350                          union enetc_tx_bd *txbd;
   351  
   352                          txbd = ENETC_TXBD(*tx_ring, i);
   353  
   354                          if (txbd->flags & ENETC_TXBD_FLAGS_W &&
   355                              tx_swbd->do_tstamp) {
   356                                  enetc_get_tx_tstamp(&priv->si->hw, txbd,
   357                                                      &tstamp);
   358                                  do_tstamp = true;
   359                          }
   360                  }
   361  
   362                  if (likely(tx_swbd->dma))
   363                          enetc_unmap_tx_buff(tx_ring, tx_swbd);
   364  
   365                  if (is_eof) {
   366                          if (unlikely(do_tstamp)) {
   367                                  enetc_tstamp_tx(tx_swbd->skb, tstamp);
   368                                  do_tstamp = false;
   369                          }
   370                          napi_consume_skb(tx_swbd->skb, napi_budget);
   371                          tx_swbd->skb = NULL;
   372                  }
   373  
   374                  tx_byte_cnt += tx_swbd->len;
   375  
   376                  bds_to_clean--;
   377                  tx_swbd++;
   378                  i++;
   379                  if (unlikely(i == tx_ring->bd_count)) {
   380                          i = 0;
   381                          tx_swbd = tx_ring->tx_swbd;
   382                  }
   383  
   384                  /* BD iteration loop end */
   385                  if (is_eof) {
   386                          tx_frm_cnt++;
   387                          /* re-arm interrupt source */
   388                          enetc_wr_reg(tx_ring->idr, BIT(tx_ring->index) |
   389                                       BIT(16 + tx_ring->index));
   390                  }
   391  
   392                  if (unlikely(!bds_to_clean))
   393                          bds_to_clean = enetc_bd_ready_count(tx_ring, i);
   394          }
   395  
   396          tx_ring->next_to_clean = i;
   397          tx_ring->stats.packets += tx_frm_cnt;
   398          tx_ring->stats.bytes += tx_byte_cnt;
   399  
   400          if (unlikely(tx_frm_cnt && netif_carrier_ok(ndev) &&
   401                       __netif_subqueue_stopped(ndev, tx_ring->index) &&
   402                       (enetc_bd_unused(tx_ring) >= 
ENETC_TXBDS_MAX_NEEDED))) {
   403                  netif_wake_subqueue(ndev, tx_ring->index);
   404          }
   405  
   406          return tx_frm_cnt != ENETC_DEFAULT_TX_WORK;
   407  }
   408  
   409  static bool enetc_new_page(struct enetc_bdr *rx_ring,
   410                             struct enetc_rx_swbd *rx_swbd)
   411  {
   412          struct page *page;
   413          dma_addr_t addr;
   414  
   415          page = dev_alloc_page();
   416          if (unlikely(!page))
   417                  return false;
   418  
   419          addr = dma_map_page(rx_ring->dev, page, 0, PAGE_SIZE, 
DMA_FROM_DEVICE);
   420          if (unlikely(dma_mapping_error(rx_ring->dev, addr))) {
   421                  __free_page(page);
   422  
   423                  return false;
   424          }
   425  
   426          rx_swbd->dma = addr;
   427          rx_swbd->page = page;
   428          rx_swbd->page_offset = ENETC_RXB_PAD;
   429  
   430          return true;
   431  }
   432  
   433  static int enetc_refill_rx_ring(struct enetc_bdr *rx_ring, const int 
buff_cnt)
   434  {
   435          struct enetc_rx_swbd *rx_swbd;
   436          union enetc_rx_bd *rxbd;
   437          int i, j;
   438  
   439          i = rx_ring->next_to_use;
   440          rx_swbd = &rx_ring->rx_swbd[i];
   441          rxbd = ENETC_RXBD(*rx_ring, i);
   442  
   443          for (j = 0; j < buff_cnt; j++) {
   444                  /* try reuse page */
   445                  if (unlikely(!rx_swbd->page)) {
   446                          if (unlikely(!enetc_new_page(rx_ring, 
rx_swbd))) {
   447                                  rx_ring->stats.rx_alloc_errs++;
   448                                  break;
   449                          }
   450                  }
   451  
   452                  /* update RxBD */
   453                  rxbd->w.addr = cpu_to_le64(rx_swbd->dma +
   454                                             rx_swbd->page_offset);
   455                  /* clear 'R" as well */
   456                  rxbd->r.lstatus = 0;
   457  
   458                  rx_swbd++;
   459                  rxbd++;
   460                  i++;
   461                  if (unlikely(i == rx_ring->bd_count)) {
   462                          i = 0;
   463                          rx_swbd = rx_ring->rx_swbd;
   464                          rxbd = ENETC_RXBD(*rx_ring, 0);
   465                  }
   466          }
   467  
   468          if (likely(j)) {
   469                  rx_ring->next_to_alloc = i; /* keep track from page 
reuse */
   470                  rx_ring->next_to_use = i;
   471                  /* update ENETC's consumer index */
   472                  enetc_wr_reg(rx_ring->rcir, i);
   473          }
   474  
   475          return j;
   476  }
   477  
   478  #ifdef CONFIG_FSL_ENETC_HW_TIMESTAMPING
   479  static void enetc_get_rx_tstamp(struct net_device *ndev,
   480                                  union enetc_rx_bd *rxbd,
   481                                  struct sk_buff *skb)
   482  {
   483          struct skb_shared_hwtstamps *shhwtstamps = skb_hwtstamps(skb);
   484          struct enetc_ndev_priv *priv = netdev_priv(ndev);
   485          struct enetc_hw *hw = &priv->si->hw;
   486          u32 lo, hi;
   487          u64 tstamp;
   488  
 > 489          if (rxbd->r.flags & ENETC_RXBD_FLAG_TSTMP) {
   490                  lo = enetc_rd(hw, ENETC_SICTR0);
   491                  hi = enetc_rd(hw, ENETC_SICTR1);
   492                  if (lo <= rxbd->r.tstamp)
   493                          hi -= 1;
   494  
   495                  tstamp = (u64)hi << 32 | rxbd->r.tstamp;
   496                  memset(shhwtstamps, 0, sizeof(*shhwtstamps));
   497                  shhwtstamps->hwtstamp = ns_to_ktime(tstamp);
   498          }
   499  }
   500  #endif
   501  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Reply via email to