1. 26 Jan, 2020 22 commits
    • Mert Dirik's avatar
      ar5523: Add USB ID of SMCWUSBT-G2 wireless adapter · 5b362498
      Mert Dirik authored
      Add the required USB ID for running SMCWUSBT-G2 wireless adapter (SMC
      "EZ Connect g").
      
      This device uses ar5523 chipset and requires firmware to be loaded. Even
      though pid of the device is 4507, this patch adds it as 4506 so that
      AR5523_DEVICE_UG macro can set the AR5523_FLAG_PRE_FIRMWARE flag for pid
      4507.
      Signed-off-by: default avatarMert Dirik <mertdirik@gmail.com>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      5b362498
    • Stephen Boyd's avatar
      ath10k: Use device_get_match_data() to simplify code · fa43e99d
      Stephen Boyd authored
      Use device_get_match_data() here to simplify the code a bit.
      Signed-off-by: default avatarStephen Boyd <swboyd@chromium.org>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      fa43e99d
    • Stephen Boyd's avatar
      ath10k: Add newlines to printk messages · 79a4b788
      Stephen Boyd authored
      Some printks in here don't have newlines at the end, meaning the log
      will be sort of hard to read. Add newlines.
      Signed-off-by: default avatarStephen Boyd <swboyd@chromium.org>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      79a4b788
    • Rakesh Pillai's avatar
      ath10k: Correct the DMA direction for management tx buffers · 6ba8b3b6
      Rakesh Pillai authored
      The management packets, send to firmware via WMI, are
      mapped using the direction DMA_TO_DEVICE. Currently in
      case of wmi cleanup, these buffers are being unmapped
      using an incorrect DMA direction. This can cause unwanted
      behavior when the host driver is handling a restart
      of the wlan firmware.
      
      We might see a trace like below
      
      [<ffffff8008098b18>] __dma_inv_area+0x28/0x58
      [<ffffff8001176734>] ath10k_wmi_mgmt_tx_clean_up_pending+0x60/0xb0 [ath10k_core]
      [<ffffff80088c7c50>] idr_for_each+0x78/0xe4
      [<ffffff80011766a4>] ath10k_wmi_detach+0x4c/0x7c [ath10k_core]
      [<ffffff8001163d7c>] ath10k_core_stop+0x58/0x68 [ath10k_core]
      [<ffffff800114fb74>] ath10k_halt+0xec/0x13c [ath10k_core]
      [<ffffff8001165110>] ath10k_core_restart+0x11c/0x1a8 [ath10k_core]
      [<ffffff80080c36bc>] process_one_work+0x16c/0x31c
      
      Fix the incorrect DMA direction during the wmi
      management tx buffer cleanup.
      
      Tested HW: WCN3990
      Tested FW: WLAN.HL.3.1-00784-QCAHLSWMTPLZ-1
      
      Fixes: dc405152 ("ath10k: handle mgmt tx completion event")
      Signed-off-by: default avatarRakesh Pillai <pillair@codeaurora.org>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      6ba8b3b6
    • Dan Carpenter's avatar
      ath11k: fix up some error paths · 7195c874
      Dan Carpenter authored
      There are two error paths where "ret" wasn't set.  Also one error path
      we set the error code to -EINVAL but we should just preserve the error
      code from ath11k_hal_srng_get_entrysize().  That function only returns
      -EINVAL so this doesn't change anything.
      
      I removed the "ret = 0;" initializers so that hopefully GCC will be able
      to detect these sorts of bugs in the future.
      
      Fixes: d5c65159 ("ath11k: driver for Qualcomm IEEE 802.11ax devices")
      Signed-off-by: default avatarDan Carpenter <dan.carpenter@oracle.com>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      7195c874
    • John Crispin's avatar
      ath11k: make sure to also report the RX bandwidth inside radiotap · 93634c61
      John Crispin authored
      Add IEEE80211_RADIOTAP_HE_DATA1_BW_RU_ALLOC_KNOWN to the list of known
      fields. Not doing so will result in wireshark not calculating the
      bitrate correctly.
      Signed-off-by: default avatarJohn Crispin <john@phrozen.org>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      93634c61
    • Colin Ian King's avatar
      ath11k: avoid null pointer dereference when pointer band is null · 3b451683
      Colin Ian King authored
      In the unlikely event that cap->supported_bands has neither
      WMI_HOST_WLAN_2G_CAP set or WMI_HOST_WLAN_5G_CAP set then pointer
      band is null and a null dereference occurs when assigning
      band->n_iftype_data.  Move the assignment to the if blocks to
      avoid this.  Cleans up static analysis warnings.
      
      Addresses-Coverity: ("Explicit null dereference")
      Fixes: 9f056ed8 ("ath11k: add HE support")
      Signed-off-by: default avatarColin Ian King <colin.king@canonical.com>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      3b451683
    • Bhagavathi Perumal S's avatar
      ath11k: Add missing pdev rx rate stats · 875603b3
      Bhagavathi Perumal S authored
      This adds missing rx rate info stats like pilot evm,
      per chain rssi, per user ul ppdu and mpdu counts and
      ul ofdma rate info etc.
      
      And add null checks for memory alloc failures.
      Signed-off-by: default avatarBhagavathi Perumal S <bperumal@codeaurora.org>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      875603b3
    • Colin Ian King's avatar
      ath11k: ensure ts.flags is initialized before bit-wise or'ing in values · eefca584
      Colin Ian King authored
      Currently the structure ts is not inititalized and ts.flags contains
      garbage values from the stack.  This is being passed into function
      ath11k_dp_tx_status_parse that bit-wise or'ing in settings into the
      ts.flags field.  To avoid flags (and other fields) from containing
      garbage, initialize the structure to zero before use.
      
      Addresses-Coverity: ("Uninitialized scalar variable)"
      Fixes: d5c65159 ("ath11k: driver for Qualcomm IEEE 802.11ax devices")
      Signed-off-by: default avatarColin Ian King <colin.king@canonical.com>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      eefca584
    • Bhagavathi Perumal S's avatar
      ath11k: set TxBf parameters after vdev start · 5815719d
      Bhagavathi Perumal S authored
      The channel info parameters are required by the firmware to process TxBf
      parameters. Currently TxBf is passed prior to the channel info. This patch
      moves TxBf setup after the channel setup.
      Signed-off-by: default avatarJohn Crispin <john@phrozen.org>
      Signed-off-by: default avatarBhagavathi Perumal S <bperumal@codeaurora.org>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      5815719d
    • Anilkumar Kolli's avatar
      ath11k: enable HE tlvs in ppdu stats for pktlog lite · 1e93a781
      Anilkumar Kolli authored
      This patch enables HE tlvs in ppdu stats for pktlog lite mode.
      Signed-off-by: default avatarJohn Crispin <john@phrozen.org>
      Signed-off-by: default avatarAnilkumar Kolli <akolli@codeaurora.org>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      1e93a781
    • Arnd Bergmann's avatar
      ath11k: fix debugfs build failure · a45ceea5
      Arnd Bergmann authored
      When CONFIG_ATH11K_DEBUGFS is disabled, but CONFIG_MAC80211_DEBUGFS
      is turned on, the driver fails to build:
      
      drivers/net/wireless/ath/ath11k/debugfs_sta.c: In function 'ath11k_dbg_sta_open_htt_peer_stats':
      drivers/net/wireless/ath/ath11k/debugfs_sta.c:416:4: error: 'struct ath11k' has no member named 'debug'
        ar->debug.htt_stats.stats_req = stats_req;
          ^~
      
      It appears that just using the former symbol is sufficient here,
      adding a Kconfig dependency takes care of the corner cases.
      
      Fixes: d5c65159 ("ath11k: driver for Qualcomm IEEE 802.11ax devices")
      Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      a45ceea5
    • Govind Singh's avatar
      ath10k: Don't call SCM interface for statically mapped msa region · ab000ea6
      Govind Singh authored
      For some targets ex: QCS404, SCM permissions for MSA region is
      statically configured in TrustZone fw. Add SCM call disable option
      for such targets to avoid duplicate permissions.
      
      Testing: Tested on WCN3990 HW
      Tested FW: WLAN.HL.3.1-01040-QCAHLSWMTPLZ-1
      Signed-off-by: default avatarGovind Singh <govinds@codeaurora.org>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      ab000ea6
    • Govind Singh's avatar
      dt: bindings: add dt entry flag to skip SCM call for msa region · 6ca71a10
      Govind Singh authored
      Add boolean context flag to disable SCM call for statically
      mapped msa region.
      Signed-off-by: default avatarGovind Singh <govinds@codeaurora.org>
      Acked-by: default avatarRob Herring <robh@kernel.org>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      6ca71a10
    • Zhi Chen's avatar
      Revert "ath10k: fix DMA related firmware crashes on multiple devices" · a1769bb6
      Zhi Chen authored
      This reverts commit 76d164f5.
      PCIe hung issue was observed on multiple platforms. The issue was reproduced
      when DUT was configured as AP and associated with 50+ STAs.
      
      For QCA9984/QCA9888, the DMA_BURST_SIZE register controls the AXI burst size
      of the RD/WR access to the HOST MEM.
      0 - No split , RAW read/write transfer size from MAC is put out on bus
          as burst length
      1 - Split at 256 byte boundary
      2,3 - Reserved
      
      With PCIe protocol analyzer, we can see DMA Read crossing 4KB boundary when
      issue happened. It broke PCIe spec and caused PCIe stuck. So revert
      the default value from 0 to 1.
      
      Tested:  IPQ8064 + QCA9984 with firmware 10.4-3.10-00047
               QCS404 + QCA9984 with firmware 10.4-3.9.0.2--00044
               Synaptics AS370 + QCA9888  with firmware 10.4-3.9.0.2--00040
      Signed-off-by: default avatarZhi Chen <zhichen@codeaurora.org>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      a1769bb6
    • Wen Gong's avatar
      ath10k: drop RX skb with invalid length for sdio · 218f646d
      Wen Gong authored
      When simulate random transfer fail for sdio write and read, it crash
      sometimes.
      
      Test steps:
      1. Add config and update kernel:
      CONFIG_FAIL_MMC_REQUEST=y
      CONFIG_FAULT_INJECTION=y
      CONFIG_FAULT_INJECTION_DEBUG_FS=y
      
      2. run simulate fail:
      cd /sys/kernel/debug/mmc1/fail_mmc_request
      echo 10 > probability
      echo 10 > times # repeat until hitting issues
      
      3. it crash, the act len of ath10k_htc_hdr is higher than allocate len, it cause panic:
      [   99.723482] skbuff: skb_over_panic: text:00000000caa0f780 len:57013 put:57013 head:000000004116f24a data:0000000019ecb4dc tail:0xdef5 end:0x640 dev:<NULL>
      [   99.737697] ------------[ cut here ]------------
      [   99.742327] kernel BUG at /mnt/host/source/src/third_party/kernel/v4.19/net/core/skbuff.c:104!
      [   99.750937] Internal error: Oops - BUG: 0 [#1] PREEMPT SMP
      [   99.831154] Process kworker/0:2 (pid: 151, stack limit = 0x00000000728010bf)
      [   99.838200] CPU: 0 PID: 151 Comm: kworker/0:2 Tainted: G W 4.19.85 #48
      [   99.846022] Hardware name: MediaTek krane sku0 board (DT)
      [   99.851429] Workqueue: events sdio_irq_work
      [   99.855614] pstate: 60000005 (nZCv daif -PAN -UAO)
      [   99.860402] pc : skb_panic+0x64/0x68
      [   99.863974] lr : skb_panic+0x64/0x68
      [   99.867542] sp : ffffff8008833a90
      [   99.870850] x29: ffffff8008833ac0 x28: ffffffe52e337370
      [   99.876159] x27: ffffffe52e328a90 x26: 000000000000e0d0
      [   99.881469] x25: ffffffe52e336b60 x24: 000000000000deb5
      [   99.886779] x23: ffffffe52e340680 x22: ffffffe4efd47e00
      [   99.892088] x21: 000000000000deb5 x20: ffffffa516d85b4c
      [   99.897397] x19: ffffffa526928037 x18: 0000000000000000
      [   99.902706] x17: 000000000000003c x16: ffffffa5265b6c80
      [   99.908015] x15: 0000000000000006 x14: 3a76656420303436
      [   99.913325] x13: 0000000000029bf0 x12: 0000000000000000
      [   99.918634] x11: 0000000000000000 x10: 0000000000000000
      [   99.923943] x9 : a3b907e4b2783000 x8 : a3b907e4b2783000
      [   99.929253] x7 : 0000000000000000 x6 : ffffffa526f66d76
      [   99.934563] x5 : 0000000000000000 x4 : 0000000000000000
      [   99.939872] x3 : 000000000002a5ab x2 : ffffffe53feed918
      [   99.945182] x1 : ffffffe53fee4a08 x0 : 000000000000008e
      [   99.950491] Call trace:
      [   99.952937]  skb_panic+0x64/0x68
      [   99.956165]  skb_put+0x7c/0x84
      [   99.959224]  ath10k_sdio_irq_handler+0x740/0xbb8 [ath10k_sdio]
      [   99.965055]  process_sdio_pending_irqs+0x58/0x1a4
      [   99.969758]  sdio_run_irqs+0x34/0x60
      [   99.973329]  sdio_irq_work+0x1c/0x28
      [   99.974930] cros-ec-spi spi2.0: SPI transfer timed out
      [   99.976904]  process_one_work+0x210/0x410
      [   99.976911]  worker_thread+0x234/0x3dc
      [   99.976923]  kthread+0x120/0x130
      [   99.982090] cros-ec-spi spi2.0: spi transfer failed: -110
      [   99.986054]  ret_from_fork+0x10/0x18
      [   99.986063] Code: aa1403e2 2a1503e4 a90023e9 97e37d1a (d4210000)
      [   99.986068] ---[ end trace cb6d948c5a0fd6c7 ]---
      [  100.017250] Kernel panic - not syncing: Fatal exception
      [  100.018879] cros-ec-spi spi2.0: Command xfer error (err:-110)
      [  100.023659] SMP: stopping secondary CPUs
      [  100.023703] Kernel Offset: 0x251dc00000 from 0xffffff8008000000
      [  100.023707] CPU features: 0x0,2188200c
      [  100.023709] Memory Limit: none
      
      The simulate fail of sdio is not a real sdio transter fail, it only
      set an error status in mmc_should_fail_request after the transfer end,
      actually the transfer is success, then sdio_io_rw_ext_helper will
      return error status and stop transfer the left data. For example,
      the really RX len is 286 bytes, then it will split to 2 blocks in
      sdio_io_rw_ext_helper, one is 256 bytes, left is 30 bytes, if the
      first 256 bytes get an error status by mmc_should_fail_request,then
      the left 30 bytes will not read in this RX operation. Then when the
      next RX arrive, the left 30 bytes will be considered as the header
      of the read, the top 8 bytes will be considered as ath10k_htc_hdr,
      but actually the 8 bytes is not the ath10k_htc_hdr, so the act_len
      from this ath10k_htc_hdr is not correct, if it is a big value, such
      as 57013, it will trigger skb_panic.
      
      Drop the skb with invalid length will be reasonable.
      
      This patch only effect sdio chips.
      
      Tested with QCA6174 SDIO with firmware WLAN.RMH.4.4.1-00029.
      Signed-off-by: default avatarWen Gong <wgong@codeaurora.org>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      218f646d
    • zhengbin's avatar
      ath10k: use true,false for bool variable · 0f7ab288
      zhengbin authored
      Fixes coccicheck warning:
      
      drivers/net/wireless/ath/ath10k/htt_rx.c:2143:2-31: WARNING: Assignment of 0/1 to bool variable
      Reported-by: default avatarHulk Robot <hulkci@huawei.com>
      Signed-off-by: default avatarzhengbin <zhengbin13@huawei.com>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      0f7ab288
    • Bjorn Andersson's avatar
      ath10k: Add optional qdss clk · 57a3b60d
      Bjorn Andersson authored
      The WiFi firmware found on sm8150 requires that the QDSS clock is
      ticking in order to operate, so add an optional clock to the binding to
      allow this to be specified in the sm8150 dts and add the clock to the
      list of clocks in the driver.
      Signed-off-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
      Acked-by: default avatarRob Herring <robh@kernel.org>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      57a3b60d
    • Bryan O'Donoghue's avatar
      ath10k: pci: Fix comment on ath10k_pci_dump_memory_sram · 63ec5cbc
      Bryan O'Donoghue authored
      The description of ath10k_pci_dump_memory_sram() is inaccurate, an error
      can never be returned, it is always the length. Update the comment to
      reflect.
      
      Fixes: 219cc084 ("ath10k: add memory dump support QCA9984")
      Signed-off-by: default avatarBryan O'Donoghue <bryan.odonoghue@linaro.org>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      63ec5cbc
    • Bryan O'Donoghue's avatar
      ath10k: pci: Only dump ATH10K_MEM_REGION_TYPE_IOREG when safe · d2393801
      Bryan O'Donoghue authored
      ath10k_pci_dump_memory_reg() will try to access memory of type
      ATH10K_MEM_REGION_TYPE_IOREG however, if a hardware restart is in progress
      this can crash a system.
      
      Individual ioread32() time has been observed to jump from 15-20 ticks to >
      80k ticks followed by a secure-watchdog bite and a system reset.
      
      Work around this corner case by only issuing the read transaction when the
      driver state is ATH10K_STATE_ON.
      
      Tested-on: QCA9988 PCI 10.4-3.9.0.2-00044
      
      Fixes: 219cc084 ("ath10k: add memory dump support QCA9984")
      Signed-off-by: default avatarBryan O'Donoghue <bryan.odonoghue@linaro.org>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      d2393801
    • zhengbin's avatar
      wil6210: use true,false for bool variable · f89ee992
      zhengbin authored
      Fixes coccicheck warning:
      
      drivers/net/wireless/ath/wil6210/main.c:765:1-14: WARNING: Assignment of 0/1 to bool variable
      drivers/net/wireless/ath/wil6210/txrx.c:1143:1-19: WARNING: Assignment of 0/1 to bool variable
      drivers/net/wireless/ath/wil6210/wmi.c:1516:4-23: WARNING: Assignment of 0/1 to bool variable
      drivers/net/wireless/ath/wil6210/wmi.c:1523:4-23: WARNING: Assignment of 0/1 to bool variable
      drivers/net/wireless/ath/wil6210/wmi.c:1538:4-30: WARNING: Assignment of 0/1 to bool variable
      drivers/net/wireless/ath/wil6210/wmi.c:1545:4-30: WARNING: Assignment of 0/1 to bool variable
      Reported-by: default avatarHulk Robot <hulkci@huawei.com>
      Signed-off-by: default avatarzhengbin <zhengbin13@huawei.com>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      f89ee992
    • zhengbin's avatar
      ath9k: use true,false for bool variable · d27c768f
      zhengbin authored
      Fixes coccicheck warning:
      
      drivers/net/wireless/ath/ath9k/ar9003_aic.c:409:2-12: WARNING: Assignment of 0/1 to bool variable
      Reported-by: default avatarHulk Robot <hulkci@huawei.com>
      Signed-off-by: default avatarzhengbin <zhengbin13@huawei.com>
      Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
      d27c768f
  2. 13 Jan, 2020 2 commits
  3. 12 Jan, 2020 11 commits
  4. 11 Jan, 2020 5 commits
    • David S. Miller's avatar
      Merge branch 'hns3-next' · 5c9166f0
      David S. Miller authored
      Huazhong Tan says:
      
      ====================
      net: hns3: add some misc update about reset issue
      
      This series includes some misc update relating to reset issue.
      [patch 1/7] & [patch 2/7] splits hclge_reset()/hclgevf_reset()
      into two parts: preparing and rebuilding. Since the procedure
      of FLR should be separated out from the reset task([patch 3/7 &
      patch 3/7]), then the FLR's processing can reuse these codes.
      
      pci_error_handlers.reset_prepare() is void type function, so
      [patch 6/7] & [patch 7/7] factor some codes related to PF
      function reset to make the preparing done before .reset_prepare()
      return.
      
      BTW, [patch 5/7] enlarges the waiting time of reset for matching
      the hardware's.
      ====================
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      5c9166f0
    • Huazhong Tan's avatar
      net: hns3: refactor the notification scheme of PF reset · c7554dcd
      Huazhong Tan authored
      hclge_reset_prepare_down() is only used to inform VF that PF is
      going to do function reset, then using hclge_func_reset_sync_vf()
      in hclge_reset_prepare_wait() to query whether VF is ready before
      asserting PF function reset. To make the code more readable,
      this patch uses a new function hclge_function_reset_notify_vf()
      to do this job.
      Signed-off-by: default avatarHuazhong Tan <tanhuazhong@huawei.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      c7554dcd
    • Huazhong Tan's avatar
      net: hns3: modify hclge_func_reset_sync_vf()'s return type to void · c3106cac
      Huazhong Tan authored
      When synchronizes with VFs fail before PF function reset,
      PF driver should go on its function reset, otherwise it
      can not run normally anymore. So, hclge_func_reset_sync_vf()
      should not affect the processing of PF reset, this patch
      modifies its return type to void.
      Signed-off-by: default avatarHuazhong Tan <tanhuazhong@huawei.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      c3106cac
    • Huazhong Tan's avatar
      net: hns3: enlarge HCLGE_RESET_WAIT_CNT · 5bb784e9
      Huazhong Tan authored
      When the load of firmware is high, its reset task may takes
      more time(which will be as long as 35 seconds). So this
      patch modifies HCLGE_RESET_WAIT_CNT to match the firmware's.
      Signed-off-by: default avatarHuazhong Tan <tanhuazhong@huawei.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      5bb784e9
    • Huazhong Tan's avatar
      net: hns3: refactor the procedure of VF FLR · f28368bb
      Huazhong Tan authored
      Currently, the actual work of VF FLR is handled in the reset task,
      which is asynchronous. So in some case, if the preparing and
      rebuilding are not done, then the VF FLR will trigger some problems,
      for example, makes hardware go into chaos.
      
      So this patch separates the process of VF FLR from reset task, and
      adds a semaphore to serialize this reset and others.
      
      When FLR's preparing fails, if there has other higher level reset
      pending or failing times less than the HCLGE_FLR_RETRY_CNT, this
      preparing should be retried, otherwise it will get into a wrong state.
      
      BTW, while the hardware reports misc interrupt during pcie_flr(),
      the driver can not receive this interrupt anymore, so disable it
      when hclgevf_flr_prepare() return, and re-enable it when enter
      hclgevf_flr_done().
      
      Avoid declaring internal function hclgevf_enable_vector(), this patch
      also moves its definition forward, and removes unused enum
      hnae3_flr_state.
      Signed-off-by: default avatarHuazhong Tan <tanhuazhong@huawei.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      f28368bb