1. 26 3月, 2021 2 次提交
  2. 25 3月, 2021 1 次提交
  3. 19 3月, 2021 2 次提交
  4. 18 3月, 2021 2 次提交
    • O
      net: stmmac: add per-queue TX & RX coalesce ethtool support · db2f2842
      Ong Boon Leong 提交于
      Extending the driver to support per-queue RX and TX coalesce settings in
      order to support below commands:
      
      To show per-queue coalesce setting:-
       $ ethtool --per-queue <DEVNAME> queue_mask <MASK> --show-coalesce
      
      To set per-queue coalesce setting:-
       $ ethtool --per-queue <DEVNAME> queue_mask <MASK> --coalesce \
           [rx-usecs N] [rx-frames M] [tx-usecs P] [tx-frames Q]
      Signed-off-by: NOng Boon Leong <boon.leong.ong@intel.com>
      Acked-by: NJakub Kicinski <kuba@kernel.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      db2f2842
    • V
      net: stmmac: add timestamp correction to rid CDC sync error · 3600be5f
      Voon Weifeng 提交于
      According to Synopsis DesignWare EQoS Databook, the Clock Domain Cross
      synchronization error is introduced tue to the clock(GMII Tx/Rx clock)
      being different at the capture as compared to the PTP
      clock(clk_ptp_ref_i) that is used to generate the time.
      
      The CDC synchronization error is almost equal to 2 times the clock
      period of the PTP clock(clk_ptp_ref_i).
      
      On a Intel Tigerlake platform (with Marvell 88E2110 external PHY):
      
      Before applying this patch (with CDC synchronization error):
      ptp4l[64.044]: rms    8 max   13 freq +30877 +/-  11 delay   216 +/-   0
      ptp4l[65.047]: rms   13 max   20 freq +30869 +/-  17 delay   213 +/-   0
      ptp4l[66.050]: rms   12 max   20 freq +30857 +/-  11 delay   213 +/-   0
      ptp4l[67.052]: rms   11 max   22 freq +30849 +/-  10 delay   215 +/-   0
      ptp4l[68.055]: rms   10 max   16 freq +30853 +/-  13 delay   215 +/-   0
      ptp4l[69.057]: rms    7 max   13 freq +30848 +/-   9 delay   216 +/-   0
      ptp4l[70.060]: rms    8 max   13 freq +30846 +/-  10 delay   216 +/-   0
      ptp4l[71.063]: rms    9 max   15 freq +30836 +/-   8 delay   218 +/-   0
      
      After applying this patch (CDC syncrhonization error is taken care of):
      ptp4l[61.516]: rms  773 max  824 freq +31526 +/- 158 delay   200 +/-   0
      ptp4l[62.519]: rms  427 max  596 freq +31668 +/-  39 delay   198 +/-   0
      ptp4l[63.522]: rms  113 max  206 freq +31482 +/-  57 delay   198 +/-   0
      ptp4l[64.525]: rms   40 max   56 freq +31316 +/-  29 delay   200 +/-   0
      ptp4l[65.528]: rms   47 max   56 freq +31255 +/-  17 delay   200 +/-   0
      ptp4l[66.531]: rms   26 max   36 freq +31246 +/-   9 delay   200 +/-   0
      ptp4l[67.534]: rms   12 max   18 freq +31254 +/-  12 delay   202 +/-   0
      ptp4l[68.537]: rms    7 max   12 freq +31263 +/-  10 delay   202 +/-   0
      Signed-off-by: NVoon Weifeng <weifeng.voon@intel.com>
      Signed-off-by: NWong Vee Khee <vee.khee.wong@intel.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      3600be5f
  5. 16 3月, 2021 4 次提交
  6. 06 3月, 2021 1 次提交
    • O
      net: stmmac: Fix VLAN filter delete timeout issue in Intel mGBE SGMII · 9a7b3950
      Ong Boon Leong 提交于
      For Intel mGbE controller, MAC VLAN filter delete operation will time-out
      if serdes power-down sequence happened first during driver remove() with
      below message.
      
      [82294.764958] intel-eth-pci 0000:00:1e.4 eth2: stmmac_dvr_remove: removing driver
      [82294.778677] intel-eth-pci 0000:00:1e.4 eth2: Timeout accessing MAC_VLAN_Tag_Filter
      [82294.779997] intel-eth-pci 0000:00:1e.4 eth2: failed to kill vid 0081/0
      [82294.947053] intel-eth-pci 0000:00:1d.2 eth1: stmmac_dvr_remove: removing driver
      [82295.002091] intel-eth-pci 0000:00:1d.1 eth0: stmmac_dvr_remove: removing driver
      
      Therefore, we delay the serdes power-down to be after unregister_netdev()
      which triggers the VLAN filter delete.
      
      Fixes: b9663b7c ("net: stmmac: Enable SERDES power up/down sequence")
      Signed-off-by: NOng Boon Leong <boon.leong.ong@intel.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      9a7b3950
  7. 27 2月, 2021 4 次提交
    • J
      net: stmmac: re-init rx buffers when mac resume back · 9c63faaa
      Joakim Zhang 提交于
      During suspend/resume stress test, we found descriptor write back by DMA
      could exhibit unusual behavior, e.g.:
      	003 [0xc4310030]: 0x0 0x40 0x0 0xb5010040
      
      We can see that desc3 write back is 0xb5010040, it is still ownd by DMA,
      so application would not recycle this buffer. It will trigger fatal bus
      error when DMA try to use this descriptor again. To fix this issue, we
      should re-init all rx buffers when mac resume back.
      Signed-off-by: NJoakim Zhang <qiangqing.zhang@nxp.com>
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      9c63faaa
    • J
      net: stmmac: fix wrongly set buffer2 valid when sph unsupport · 396e13e1
      Joakim Zhang 提交于
      In current driver, buffer2 available only when hardware supports split
      header. Wrongly set buffer2 valid in stmmac_rx_refill when refill buffer
      address. You can see that desc3 is 0x81000000 after initialization, but
      turn out to be 0x83000000 after refill.
      
      Fixes: 67afd6d1 ("net: stmmac: Add Split Header support and enable it in XGMAC cores")
      Signed-off-by: NJoakim Zhang <qiangqing.zhang@nxp.com>
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      396e13e1
    • J
      net: stmmac: fix dma physical address of descriptor when display ring · bfaf91ca
      Joakim Zhang 提交于
      Driver uses dma_alloc_coherent to allocate dma memory for descriptors,
      dma_alloc_coherent will return both the virtual address and physical
      address. AFAIK, virt_to_phys could not convert virtual address to
      physical address, for which memory is allocated by dma_alloc_coherent.
      
      dwmac4_display_ring() function is broken for various descriptor, it only
      support normal descriptor(struct dma_desc) now, this patch also extends to
      support all descriptor types.
      Signed-off-by: NJoakim Zhang <qiangqing.zhang@nxp.com>
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      bfaf91ca
    • J
      net: stmmac: fix watchdog timeout during suspend/resume stress test · c511819d
      Joakim Zhang 提交于
      stmmac_xmit() call stmmac_tx_timer_arm() at the end to modify tx timer to
      do the transmission cleanup work. Imagine such a situation, stmmac enters
      suspend immediately after tx timer modified, it's expire callback
      stmmac_tx_clean() would not be invoked. This could affect BQL, since
      netdev_tx_sent_queue() has been called, but netdev_tx_completed_queue()
      have not been involved, as a result, dql_avail(&dev_queue->dql) finally
      always return a negative value.
      
      __dev_queue_xmit->__dev_xmit_skb->qdisc_run->__qdisc_run->qdisc_restart->dequeue_skb:
      	if ((q->flags & TCQ_F_ONETXQUEUE) &&
      		netif_xmit_frozen_or_stopped(txq)) // __QUEUE_STATE_STACK_XOFF is set
      
      Net core will stop transmitting any more. Finillay, net watchdong would timeout.
      To fix this issue, we should call netdev_tx_reset_queue() in stmmac_resume().
      
      Fixes: 54139cf3 ("net: stmmac: adding multiple buffers for rx")
      Signed-off-by: NJoakim Zhang <qiangqing.zhang@nxp.com>
      Signed-off-by: NJakub Kicinski <kuba@kernel.org>
      c511819d
  8. 14 1月, 2021 2 次提交
  9. 09 12月, 2020 4 次提交
    • F
      net: stmmac: overwrite the dma_cap.addr64 according to HW design · f119cc98
      Fugang Duan 提交于
      The current IP register MAC_HW_Feature1[ADDR64] only defines
      32/40/64 bit width, but some SOCs support others like i.MX8MP
      support 34 bits but it maps to 40 bits width in MAC_HW_Feature1[ADDR64].
      So overwrite dma_cap.addr64 according to HW real design.
      
      Fixes: 94abdad6 ("net: ethernet: dwmac: add ethernet glue logic for NXP imx8 chip")
      Signed-off-by: NFugang Duan <fugang.duan@nxp.com>
      Signed-off-by: NJoakim Zhang <qiangqing.zhang@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      f119cc98
    • F
      net: stmmac: delete the eee_ctrl_timer after napi disabled · 5f585913
      Fugang Duan 提交于
      There have chance to re-enable the eee_ctrl_timer and fire the timer
      in napi callback after delete the timer in .stmmac_release(), which
      introduces to access eee registers in the timer function after clocks
      are disabled then causes system hang. Found this issue when do
      suspend/resume and reboot stress test.
      
      It is safe to delete the timer after napi disabled and disable lpi mode.
      
      Fixes: d765955d ("stmmac: add the Energy Efficient Ethernet support")
      Signed-off-by: NFugang Duan <fugang.duan@nxp.com>
      Signed-off-by: NJoakim Zhang <qiangqing.zhang@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      5f585913
    • F
      net: stmmac: free tx skb buffer in stmmac_resume() · 4ec236c7
      Fugang Duan 提交于
      When do suspend/resume test, there have WARN_ON() log dump from
      stmmac_xmit() funciton, the code logic:
      	entry = tx_q->cur_tx;
      	first_entry = entry;
      	WARN_ON(tx_q->tx_skbuff[first_entry]);
      
      In normal case, tx_q->tx_skbuff[txq->cur_tx] should be NULL because
      the skb should be handled and freed in stmmac_tx_clean().
      
      But stmmac_resume() reset queue parameters like below, skb buffers
      may not be freed.
      	tx_q->cur_tx = 0;
      	tx_q->dirty_tx = 0;
      
      So free tx skb buffer in stmmac_resume() to avoid warning and
      memory leak.
      
      log:
      [   46.139824] ------------[ cut here ]------------
      [   46.144453] WARNING: CPU: 0 PID: 0 at drivers/net/ethernet/stmicro/stmmac/stmmac_main.c:3235 stmmac_xmit+0x7a0/0x9d0
      [   46.154969] Modules linked in: crct10dif_ce vvcam(O) flexcan can_dev
      [   46.161328] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G           O      5.4.24-2.1.0+g2ad925d15481 #1
      [   46.170369] Hardware name: NXP i.MX8MPlus EVK board (DT)
      [   46.175677] pstate: 80000005 (Nzcv daif -PAN -UAO)
      [   46.180465] pc : stmmac_xmit+0x7a0/0x9d0
      [   46.184387] lr : dev_hard_start_xmit+0x94/0x158
      [   46.188913] sp : ffff800010003cc0
      [   46.192224] x29: ffff800010003cc0 x28: ffff000177e2a100
      [   46.197533] x27: ffff000176ef0840 x26: ffff000176ef0090
      [   46.202842] x25: 0000000000000000 x24: 0000000000000000
      [   46.208151] x23: 0000000000000003 x22: ffff8000119ddd30
      [   46.213460] x21: ffff00017636f000 x20: ffff000176ef0cc0
      [   46.218769] x19: 0000000000000003 x18: 0000000000000000
      [   46.224078] x17: 0000000000000000 x16: 0000000000000000
      [   46.229386] x15: 0000000000000079 x14: 0000000000000000
      [   46.234695] x13: 0000000000000003 x12: 0000000000000003
      [   46.240003] x11: 0000000000000010 x10: 0000000000000010
      [   46.245312] x9 : ffff00017002b140 x8 : 0000000000000000
      [   46.250621] x7 : ffff00017636f000 x6 : 0000000000000010
      [   46.255930] x5 : 0000000000000001 x4 : ffff000176ef0000
      [   46.261238] x3 : 0000000000000003 x2 : 00000000ffffffff
      [   46.266547] x1 : ffff000177e2a000 x0 : 0000000000000000
      [   46.271856] Call trace:
      [   46.274302]  stmmac_xmit+0x7a0/0x9d0
      [   46.277874]  dev_hard_start_xmit+0x94/0x158
      [   46.282056]  sch_direct_xmit+0x11c/0x338
      [   46.285976]  __qdisc_run+0x118/0x5f0
      [   46.289549]  net_tx_action+0x110/0x198
      [   46.293297]  __do_softirq+0x120/0x23c
      [   46.296958]  irq_exit+0xb8/0xd8
      [   46.300098]  __handle_domain_irq+0x64/0xb8
      [   46.304191]  gic_handle_irq+0x5c/0x148
      [   46.307936]  el1_irq+0xb8/0x180
      [   46.311076]  cpuidle_enter_state+0x84/0x360
      [   46.315256]  cpuidle_enter+0x34/0x48
      [   46.318829]  call_cpuidle+0x18/0x38
      [   46.322314]  do_idle+0x1e0/0x280
      [   46.325539]  cpu_startup_entry+0x24/0x40
      [   46.329460]  rest_init+0xd4/0xe0
      [   46.332687]  arch_call_rest_init+0xc/0x14
      [   46.336695]  start_kernel+0x420/0x44c
      [   46.340353] ---[ end trace bc1ee695123cbacd ]---
      
      Fixes: 47dd7a54 ("net: add support for STMicroelectronics Ethernet controllers.")
      Signed-off-by: NFugang Duan <fugang.duan@nxp.com>
      Signed-off-by: NJoakim Zhang <qiangqing.zhang@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      4ec236c7
    • F
      net: stmmac: start phylink instance before stmmac_hw_setup() · 36d18b56
      Fugang Duan 提交于
      Start phylink instance and resume back the PHY to supply
      RX clock to MAC before MAC layer initialization by calling
      .stmmac_hw_setup(), since DMA reset depends on the RX clock,
      otherwise DMA reset cost maximum timeout value then finally
      timeout.
      
      Fixes: 74371272 ("net: stmmac: Convert to phylink and remove phylib logic")
      Signed-off-by: NFugang Duan <fugang.duan@nxp.com>
      Signed-off-by: NJoakim Zhang <qiangqing.zhang@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      36d18b56
  10. 25 11月, 2020 1 次提交
  11. 17 11月, 2020 1 次提交
  12. 31 10月, 2020 2 次提交
  13. 04 10月, 2020 1 次提交
    • V
      net: stmmac: Modify configuration method of EEE timers · 388e201d
      Vineetha G. Jaya Kumaran 提交于
      Ethtool manual stated that the tx-timer is the "the amount of time the
      device should stay in idle mode prior to asserting its Tx LPI". The
      previous implementation for "ethtool --set-eee tx-timer" sets the LPI TW
      timer duration which is not correct. Hence, this patch fixes the
      "ethtool --set-eee tx-timer" to configure the EEE LPI timer.
      
      The LPI TW Timer will be using the defined default value instead of
      "ethtool --set-eee tx-timer" which follows the EEE LS timer implementation.
      
      Changelog V2
      *Not removing/modifying the eee_timer.
      *EEE LPI timer can be configured through ethtool and also the eee_timer
      module param.
      *EEE TW Timer will be configured with default value only, not able to be
      configured through ethtool or module param. This follows the implementation
      of the EEE LS Timer.
      
      Fixes: d765955d ("stmmac: add the Energy Efficient Ethernet support")
      Signed-off-by: NVineetha G. Jaya Kumaran <vineetha.g.jaya.kumaran@intel.com>
      Signed-off-by: NVoon Weifeng <weifeng.voon@intel.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      388e201d
  14. 26 9月, 2020 2 次提交
    • C
      net: stmmac: Add option for VLAN filter fail queue enable · e0f9956a
      Chuah, Kim Tatt 提交于
      Add option in plat_stmmacenet_data struct to enable VLAN Filter Fail
      Queuing. This option allows packets that fail VLAN filter to be routed
      to a specific Rx queue when Receive All is also set.
      
      When this option is enabled:
      - Enable VFFQ only when entering promiscuous mode, because Receive All
        will pass up all rx packets that failed address filtering (similar to
        promiscuous mode).
      - VLAN-promiscuous mode is never entered to allow rx packet to fail VLAN
        filters and get routed to selected VFFQ Rx queue.
      Reviewed-by: NVoon Weifeng <weifeng.voon@intel.com>
      Reviewed-by: NOng Boon Leong <boon.leong.ong@intel.com>
      Signed-off-by: NChuah, Kim Tatt <kim.tatt.chuah@intel.com>
      Signed-off-by: NOng Boon Leong <boon.leong.ong@intel.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      e0f9956a
    • J
      drivers/net/ethernet: clean up mis-targeted comments · d0ea5cbd
      Jesse Brandeburg 提交于
      As part of the W=1 cleanups for ethernet, a million [*] driver
      comments had to be cleaned up to get the W=1 compilation to
      succeed. This change finally makes the drivers/net/ethernet tree
      compile with W=1 set on the command line. NOTE: The kernel uses
      kdoc style (see Documentation/process/kernel-doc.rst) when
      documenting code, not doxygen or other styles.
      
      After this patch the x86_64 build has no warnings from W=1, however
      scripts/kernel-doc says there are 1545 more warnings in source files, that
      I need to develop a script to fix in a followup patch.
      
      The errors fixed here are all kdoc of a few classes, with a few outliers:
      In file included from drivers/net/ethernet/qlogic/netxen/netxen_nic_hw.c:10:
      drivers/net/ethernet/qlogic/netxen/netxen_nic.h:1193:18: warning: ‘FW_DUMP_LEVELS’ defined but not used [-Wunused-const-variable=]
       1193 | static const u32 FW_DUMP_LEVELS[] = { 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff };
            |                  ^~~~~~~~~~~~~~
      ... repeats 4 times...
      drivers/net/ethernet/sun/cassini.c:2084:24: warning: suggest braces around empty body in an ‘else’ statement [-Wempty-body]
       2084 |    RX_USED_ADD(page, i);
      drivers/net/ethernet/natsemi/ns83820.c: In function ‘phy_intr’:
      drivers/net/ethernet/natsemi/ns83820.c:603:6: warning: variable ‘tbisr’ set but not used [-Wunused-but-set-variable]
        603 |  u32 tbisr, tanar, tanlpar;
            |      ^~~~~
      drivers/net/ethernet/natsemi/ns83820.c: In function ‘ns83820_get_link_ksettings’:
      drivers/net/ethernet/natsemi/ns83820.c:1207:11: warning: variable ‘tanar’ set but not used [-Wunused-but-set-variable]
       1207 |  u32 cfg, tanar, tbicr;
            |           ^~~~~
      drivers/net/ethernet/packetengines/yellowfin.c:1063:18: warning: variable ‘yf_size’ set but not used [-Wunused-but-set-variable]
       1063 |   int data_size, yf_size;
            |                  ^~~~~~~
      
      Normal kdoc fixes:
      warning: Function parameter or member 'x' not described in 'y'
      warning: Excess function parameter 'x' description in 'y'
      warning: Cannot understand <string> on line <NNN> - I thought it was a doc line
      
      [*] - ok it wasn't quite a million, but it felt like it.
      Signed-off-by: NJesse Brandeburg <jesse.brandeburg@intel.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      d0ea5cbd
  15. 17 9月, 2020 1 次提交
  16. 16 9月, 2020 3 次提交
  17. 12 9月, 2020 1 次提交
  18. 08 9月, 2020 1 次提交
  19. 29 7月, 2020 3 次提交
  20. 27 5月, 2020 1 次提交
    • F
      net: stmmac: enable timestamp snapshot for required PTP packets in dwmac v5.10a · f2fb6b62
      Fugang Duan 提交于
      For rx filter 'HWTSTAMP_FILTER_PTP_V2_EVENT', it should be
      PTP v2/802.AS1, any layer, any kind of event packet, but HW only
      take timestamp snapshot for below PTP message: sync, Pdelay_req,
      Pdelay_resp.
      
      Then it causes below issue when test E2E case:
      ptp4l[2479.534]: port 1: received DELAY_REQ without timestamp
      ptp4l[2481.423]: port 1: received DELAY_REQ without timestamp
      ptp4l[2481.758]: port 1: received DELAY_REQ without timestamp
      ptp4l[2483.524]: port 1: received DELAY_REQ without timestamp
      ptp4l[2484.233]: port 1: received DELAY_REQ without timestamp
      ptp4l[2485.750]: port 1: received DELAY_REQ without timestamp
      ptp4l[2486.888]: port 1: received DELAY_REQ without timestamp
      ptp4l[2487.265]: port 1: received DELAY_REQ without timestamp
      ptp4l[2487.316]: port 1: received DELAY_REQ without timestamp
      
      Timestamp snapshot dependency on register bits in received path:
      SNAPTYPSEL TSMSTRENA TSEVNTENA 	PTP_Messages
      01         x         0          SYNC, Follow_Up, Delay_Req,
                                      Delay_Resp, Pdelay_Req, Pdelay_Resp,
                                      Pdelay_Resp_Follow_Up
      01         0         1          SYNC, Pdelay_Req, Pdelay_Resp
      
      For dwmac v5.10a, enabling all events by setting register
      DWC_EQOS_TIME_STAMPING[SNAPTYPSEL] to 2’b01, clearing bit [TSEVNTENA]
      to 0’b0, which can support all required events.
      Signed-off-by: NFugang Duan <fugang.duan@nxp.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      f2fb6b62
  21. 24 5月, 2020 1 次提交
    • L
      net: stmmac: don't attach interface until resume finishes · 31096c3e
      Leon Yu 提交于
      Commit 14b41a29 ("net: stmmac: Delete txtimer in suspend") was the
      first attempt to fix a race between mod_timer() and setup_timer()
      during stmmac_resume(). However the issue still exists as the commit
      only addressed half of the issue.
      
      Same race can still happen as stmmac_resume() re-attaches interface
      way too early - even before hardware is fully initialized.  Worse,
      doing so allows network traffic to restart and stmmac_tx_timer_arm()
      being called in the middle of stmmac_resume(), which re-init tx timers
      in stmmac_init_coalesce().  timer_list will be corrupted and system
      crashes as a result of race between mod_timer() and setup_timer().
      
        systemd--1995    2.... 552950018us : stmmac_suspend: 4994
        ksoftirq-9       0..s2 553123133us : stmmac_tx_timer_arm: 2276
        systemd--1995    0.... 553127896us : stmmac_resume: 5101
        systemd--320     7...2 553132752us : stmmac_tx_timer_arm: 2276
        (sd-exec-1999    5...2 553135204us : stmmac_tx_timer_arm: 2276
        ---------------------------------
        pc : run_timer_softirq+0x468/0x5e0
        lr : run_timer_softirq+0x570/0x5e0
        Call trace:
         run_timer_softirq+0x468/0x5e0
         __do_softirq+0x124/0x398
         irq_exit+0xd8/0xe0
         __handle_domain_irq+0x6c/0xc0
         gic_handle_irq+0x60/0xb0
         el1_irq+0xb8/0x180
         arch_cpu_idle+0x38/0x230
         default_idle_call+0x24/0x3c
         do_idle+0x1e0/0x2b8
         cpu_startup_entry+0x28/0x48
         secondary_start_kernel+0x1b4/0x208
      
      Fix this by deferring netif_device_attach() to the end of
      stmmac_resume().
      Signed-off-by: NLeon Yu <leoyu@nvidia.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      31096c3e