]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/commitdiff
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 15 Dec 2016 20:03:32 +0000 (12:03 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 15 Dec 2016 20:03:32 +0000 (12:03 -0800)
Pull rdma updates from Doug Ledford:
 "This is the complete update for the rdma stack for this release cycle.

  Most of it is typical driver and core updates, but there is the
  entirely new VMWare pvrdma driver. You may have noticed that there
  were changes in DaveM's pull request to the bnxt Ethernet driver to
  support a RoCE RDMA driver. The bnxt_re driver was tentatively set to
  be pulled in this release cycle, but it simply wasn't ready in time
  and was dropped (a few review comments still to address, and some
  multi-arch build issues like prefetch() not working across all
  arches).

  Summary:

   - shared mlx5 updates with net stack (will drop out on merge if
     Dave's tree has already been merged)

   - driver updates: cxgb4, hfi1, hns-roce, i40iw, mlx4, mlx5, qedr, rxe

   - debug cleanups

   - new connection rejection helpers

   - SRP updates

   - various misc fixes

   - new paravirt driver from vmware"

* tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma: (210 commits)
  IB: Add vmw_pvrdma driver
  IB/mlx4: fix improper return value
  IB/ocrdma: fix bad initialization
  infiniband: nes: return value of skb_linearize should be handled
  MAINTAINERS: Update Intel RDMA RNIC driver maintainers
  MAINTAINERS: Remove Mitesh Ahuja from emulex maintainers
  IB/core: fix unmap_sg argument
  qede: fix general protection fault may occur on probe
  IB/mthca: Replace pci_pool_alloc by pci_pool_zalloc
  mlx5, calc_sq_size(): Make a debug message more informative
  mlx5: Remove a set-but-not-used variable
  mlx5: Use { } instead of { 0 } to init struct
  IB/srp: Make writing the add_target sysfs attr interruptible
  IB/srp: Make mapping failures easier to debug
  IB/srp: Make login failures easier to debug
  IB/srp: Introduce a local variable in srp_add_one()
  IB/srp: Fix CONFIG_DYNAMIC_DEBUG=n build
  IB/multicast: Check ib_find_pkey() return value
  IPoIB: Avoid reading an uninitialized member variable
  IB/mad: Fix an array index check
  ...

35 files changed:
1  2 
MAINTAINERS
drivers/infiniband/core/cm.c
drivers/infiniband/core/cma.c
drivers/infiniband/core/core_priv.h
drivers/infiniband/core/roce_gid_mgmt.c
drivers/infiniband/core/umem.c
drivers/infiniband/core/uverbs_main.c
drivers/infiniband/hw/cxgb4/device.c
drivers/infiniband/hw/hfi1/affinity.c
drivers/infiniband/hw/hfi1/affinity.h
drivers/infiniband/hw/hfi1/chip.c
drivers/infiniband/hw/hfi1/driver.c
drivers/infiniband/hw/hfi1/hfi.h
drivers/infiniband/hw/hfi1/pio.c
drivers/infiniband/hw/hfi1/rc.c
drivers/infiniband/hw/hfi1/sdma.c
drivers/infiniband/hw/hfi1/user_sdma.c
drivers/infiniband/hw/mlx4/ah.c
drivers/infiniband/hw/mlx5/cq.c
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/mlx5_ib.h
drivers/infiniband/hw/mlx5/mr.c
drivers/infiniband/hw/mlx5/qp.c
drivers/infiniband/hw/nes/nes.c
drivers/infiniband/hw/nes/nes_nic.c
drivers/infiniband/sw/rxe/rxe_net.c
drivers/infiniband/sw/rxe/rxe_req.c
drivers/infiniband/ulp/ipoib/ipoib_cm.c
drivers/infiniband/ulp/ipoib/ipoib_ib.c
drivers/infiniband/ulp/ipoib/ipoib_main.c
drivers/infiniband/ulp/ipoib/ipoib_multicast.c
drivers/nvme/host/rdma.c
drivers/nvme/target/rdma.c
include/linux/mlx5/mlx5_ifc.h
include/linux/pci_ids.h

diff --combined MAINTAINERS
index 3ef316759e0174a7fb79a31189e80fafad65ae18,2c7a7b6ba7bf60a245d104ac3116ee53b6a6ba75..9c481470e27763f2ff5b548876ebf6a6f8e457d9
@@@ -35,13 -35,13 +35,13 @@@ trivial patch so apply some common sens
  
        PLEASE check your patch with the automated style checker
        (scripts/checkpatch.pl) to catch trivial style violations.
 -      See Documentation/CodingStyle for guidance here.
 +      See Documentation/process/coding-style.rst for guidance here.
  
        PLEASE CC: the maintainers and mailing lists that are generated
        by scripts/get_maintainer.pl.  The results returned by the
        script will be best if you have git installed and are making
        your changes in a branch derived from Linus' latest git tree.
 -      See Documentation/SubmittingPatches for details.
 +      See Documentation/process/submitting-patches.rst for details.
  
        PLEASE try to include any credit lines you want added with the
        patch. It avoids people being missed off by mistake and makes
@@@ -54,7 -54,7 +54,7 @@@
        of the Linux Foundation certificate of contribution and should
        include a Signed-off-by: line.  The current version of this
        "Developer's Certificate of Origin" (DCO) is listed in the file
 -      Documentation/SubmittingPatches.
 +      Documentation/process/submitting-patches.rst.
  
  6.    Make sure you have the right to send any changes you make. If you
        do changes at work you may find your employer owns the patch
@@@ -74,14 -74,9 +74,14 @@@ Descriptions of section entries
           These reviewers should be CCed on patches.
        L: Mailing list that is relevant to this area
        W: Web-page with status/info
 +      B: URI for where to file bugs. A web-page with detailed bug
 +         filing info, a direct bug tracker link, or a mailto: URI.
 +      C: URI for chat protocol, server and channel where developers
 +         usually hang out, for example irc://server/channel.
        Q: Patchwork web based patch tracking system site
        T: SCM tree type and location.
           Type is one of: git, hg, quilt, stgit, topgit
 +      B: Bug tracking system location.
        S: Status, one of the following:
           Supported:   Someone is actually paid to look after this.
           Maintained:  Someone actually looks after it.
@@@ -260,12 -255,6 +260,12 @@@ L:       linux-gpio@vger.kernel.or
  S:    Maintained
  F:    drivers/gpio/gpio-104-idio-16.c
  
 +ACCES 104-QUAD-8 IIO DRIVER
 +M:    William Breathitt Gray <vilhelm.gray@gmail.com>
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    drivers/iio/counter/104-quad-8.c
 +
  ACENIC DRIVER
  M:    Jes Sorensen <jes@trained-monkey.org>
  L:    linux-acenic@sunsite.dk
@@@ -292,7 -281,6 +292,7 @@@ L: linux-acpi@vger.kernel.or
  W:    https://01.org/linux-acpi
  Q:    https://patchwork.kernel.org/project/linux-acpi/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
 +B:    https://bugzilla.kernel.org
  S:    Supported
  F:    drivers/acpi/
  F:    drivers/pnp/pnpacpi/
@@@ -316,8 -304,6 +316,8 @@@ W: https://acpica.org
  W:    https://github.com/acpica/acpica/
  Q:    https://patchwork.kernel.org/project/linux-acpi/list/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
 +B:    https://bugzilla.kernel.org
 +B:    https://bugs.acpica.org
  S:    Supported
  F:    drivers/acpi/acpica/
  F:    include/acpi/
@@@ -327,7 -313,6 +327,7 @@@ ACPI FAN DRIVE
  M:    Zhang Rui <rui.zhang@intel.com>
  L:    linux-acpi@vger.kernel.org
  W:    https://01.org/linux-acpi
 +B:    https://bugzilla.kernel.org
  S:    Supported
  F:    drivers/acpi/fan.c
  
@@@ -343,7 -328,6 +343,7 @@@ ACPI THERMAL DRIVE
  M:    Zhang Rui <rui.zhang@intel.com>
  L:    linux-acpi@vger.kernel.org
  W:    https://01.org/linux-acpi
 +B:    https://bugzilla.kernel.org
  S:    Supported
  F:    drivers/acpi/*thermal*
  
@@@ -351,7 -335,6 +351,7 @@@ ACPI VIDEO DRIVE
  M:    Zhang Rui <rui.zhang@intel.com>
  L:    linux-acpi@vger.kernel.org
  W:    https://01.org/linux-acpi
 +B:    https://bugzilla.kernel.org
  S:    Supported
  F:    drivers/acpi/acpi_video.c
  
@@@ -540,7 -523,6 +540,7 @@@ S: Supporte
  F:    fs/afs/
  F:    include/net/af_rxrpc.h
  F:    net/rxrpc/af_rxrpc.c
 +W:    https://www.infradead.org/~dhowells/kafs/
  
  AGPGART DRIVER
  M:    David Airlie <airlied@linux.ie>
@@@ -588,11 -570,6 +588,11 @@@ T:       git git://linuxtv.org/anttip/media_t
  S:    Maintained
  F:    drivers/media/usb/airspy/
  
 +ALACRITECH GIGABIT ETHERNET DRIVER
 +M:    Lino Sanfilippo <LinoSanfilippo@gmx.de>
 +S:    Maintained
 +F:    drivers/net/ethernet/alacritech/*
 +
  ALCATEL SPEEDTOUCH USB DRIVER
  M:    Duncan Sands <duncan.sands@free.fr>
  L:    linux-usb@vger.kernel.org
@@@ -810,7 -787,7 +810,7 @@@ S: Supporte
  F:    drivers/iio/*/ad*
  X:    drivers/iio/*/adjd*
  F:    drivers/staging/iio/*/ad*
 -F:    staging/iio/trigger/iio-trig-bfin-timer.c
 +F:    drivers/staging/iio/trigger/iio-trig-bfin-timer.c
  
  ANALOG DEVICES INC DMA DRIVERS
  M:    Lars-Peter Clausen <lars@metafoo.de>
@@@ -1059,7 -1036,6 +1059,7 @@@ F:      arch/arm/mach-meson
  F:    arch/arm/boot/dts/meson*
  F:    arch/arm64/boot/dts/amlogic/
  F:    drivers/pinctrl/meson/
 +F:    drivers/mmc/host/meson*
  N:    meson
  
  ARM/Annapurna Labs ALPINE ARCHITECTURE
@@@ -1799,7 -1775,6 +1799,7 @@@ F:      drivers/char/hw_random/st-rng.
  F:    drivers/clocksource/arm_global_timer.c
  F:    drivers/clocksource/clksrc_st_lpc.c
  F:    drivers/cpufreq/sti-cpufreq.c
 +F:    drivers/dma/st_fdma*
  F:    drivers/i2c/busses/i2c-st.c
  F:    drivers/media/rc/st_rc.c
  F:    drivers/media/platform/sti/c8sectpfe/
@@@ -1810,7 -1785,6 +1810,7 @@@ F:      drivers/phy/phy-stih407-usb.
  F:    drivers/phy/phy-stih41x-usb.c
  F:    drivers/pinctrl/pinctrl-st.c
  F:    drivers/remoteproc/st_remoteproc.c
 +F:    drivers/remoteproc/st_slim_rproc.c
  F:    drivers/reset/sti/
  F:    drivers/rtc/rtc-st-lpc.c
  F:    drivers/tty/serial/st-asc.c
@@@ -1819,7 -1793,6 +1819,7 @@@ F:      drivers/usb/host/ehci-st.
  F:    drivers/usb/host/ohci-st.c
  F:    drivers/watchdog/st_lpc_wdt.c
  F:    drivers/ata/ahci_st.c
 +F:    include/linux/remoteproc/st_slim_rproc.h
  
  ARM/STM32 ARCHITECTURE
  M:    Maxime Coquelin <mcoquelin.stm32@gmail.com>
@@@ -2345,13 -2318,6 +2345,13 @@@ F:    include/uapi/linux/ax25.
  F:    include/net/ax25.h
  F:    net/ax25/
  
 +AXENTIA ASOC DRIVERS
 +M:    Peter Rosin <peda@axentia.se>
 +L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/sound/axentia,*
 +F:    sound/soc/atmel/tse850-pcm5142.c
 +
  AZ6007 DVB DRIVER
  M:    Mauro Carvalho Chehab <mchehab@s-opensource.com>
  M:    Mauro Carvalho Chehab <mchehab@kernel.org>
@@@ -2564,8 -2530,6 +2564,8 @@@ L:      netdev@vger.kernel.or
  L:    linux-kernel@vger.kernel.org
  S:    Supported
  F:    kernel/bpf/
 +F:    tools/testing/selftests/bpf/
 +F:    lib/test_bpf.c
  
  BROADCOM B44 10/100 ETHERNET DRIVER
  M:    Michael Chan <michael.chan@broadcom.com>
@@@ -2588,18 -2552,15 +2588,18 @@@ S:   Supporte
  F:    drivers/net/ethernet/broadcom/genet/
  
  BROADCOM BNX2 GIGABIT ETHERNET DRIVER
 -M:    Sony Chacko <sony.chacko@qlogic.com>
 -M:    Dept-HSGLinuxNICDev@qlogic.com
 +M:    Rasesh Mody <rasesh.mody@cavium.com>
 +M:    Harish Patil <harish.patil@cavium.com>
 +M:    Dept-GELinuxNICDev@cavium.com
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/broadcom/bnx2.*
  F:    drivers/net/ethernet/broadcom/bnx2_*
  
  BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER
 -M:    Ariel Elior <ariel.elior@qlogic.com>
 +M:    Yuval Mintz <Yuval.Mintz@cavium.com>
 +M:    Ariel Elior <ariel.elior@cavium.com>
 +M:    everest-linux-l2@cavium.com
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/broadcom/bnx2x/
@@@ -2626,7 -2587,6 +2626,7 @@@ L:      linux-arm-kernel@lists.infradead.or
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rpi/linux-rpi.git
  S:    Maintained
  N:    bcm2835
 +F:    drivers/staging/vc04_services
  
  BROADCOM BCM47XX MIPS ARCHITECTURE
  M:    Hauke Mehrtens <hauke@hauke-m.de>
@@@ -2779,14 -2739,6 +2779,14 @@@ L:    bcm-kernel-feedback-list@broadcom.co
  S:    Maintained
  F:    drivers/mtd/nand/brcmnand/
  
 +BROADCOM STB AVS CPUFREQ DRIVER
 +M:    Markus Mayer <mmayer@broadcom.com>
 +M:    bcm-kernel-feedback-list@broadcom.com
 +L:    linux-pm@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/cpufreq/brcm,stb-avs-cpu-freq.txt
 +F:    drivers/cpufreq/brcmstb*
 +
  BROADCOM SPECIFIC AMBA DRIVER (BCMA)
  M:    RafaÅ‚ MiÅ‚ecki <zajec5@gmail.com>
  L:    linux-wireless@vger.kernel.org
@@@ -2815,9 -2767,7 +2815,9 @@@ S:      Supporte
  F:    drivers/scsi/bfa/
  
  BROCADE BNA 10 GIGABIT ETHERNET DRIVER
 -M:    Rasesh Mody <rasesh.mody@qlogic.com>
 +M:    Rasesh Mody <rasesh.mody@cavium.com>
 +M:    Sudarsana Kalluru <sudarsana.kalluru@cavium.com>
 +M:    Dept-GELinuxNICDev@cavium.com
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/brocade/bna/
@@@ -2975,7 -2925,7 +2975,7 @@@ CAPELLA MICROSYSTEMS LIGHT SENSOR DRIVE
  M:    Kevin Tsai <ktsai@capellamicro.com>
  S:    Maintained
  F:    drivers/iio/light/cm*
 -F:    Documentation/devicetree/bindings/i2c/trivial-devices.txt
 +F:    Documentation/devicetree/bindings/i2c/trivial-admin-guide/devices.rst
  
  CAVIUM I2C DRIVER
  M:    Jan Glauber <jglauber@cavium.com>
@@@ -3075,12 -3025,6 +3075,12 @@@ F:    drivers/usb/host/whci
  F:    drivers/usb/wusbcore/
  F:    include/linux/usb/wusb*
  
 +HT16K33 LED CONTROLLER DRIVER
 +M:    Robin van der Gracht <robin@protonic.nl>
 +S:    Maintained
 +F:    drivers/auxdisplay/ht16k33.c
 +F:    Documentation/devicetree/bindings/display/ht16k33.txt
 +
  CFAG12864B LCD DRIVER
  M:    Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>
  W:    http://miguelojeda.es/auxdisplay.htm
@@@ -3129,7 -3073,7 +3129,7 @@@ M:      Harry Wei <harryxiyou@gmail.com
  L:    xiyoulinuxkernelgroup@googlegroups.com (subscribers-only)
  L:    linux-kernel@zh-kernel.org (moderated for non-subscribers)
  S:    Maintained
 -F:    Documentation/zh_CN/
 +F:    Documentation/translations/zh_CN/
  
  CHIPIDEA USB HIGH SPEED DUAL ROLE CONTROLLER
  M:    Peter Chen <Peter.Chen@nxp.com>
@@@ -3200,15 -3144,15 +3200,15 @@@ S:   Supporte
  F:    drivers/clocksource
  
  CISCO FCOE HBA DRIVER
 -M:    Hiral Patel <hiralpat@cisco.com>
 -M:    Suma Ramars <sramars@cisco.com>
 -M:    Brian Uchino <buchino@cisco.com>
 +M:    Satish Kharat <satishkh@cisco.com>
 +M:    Sesidhar Baddela <sebaddel@cisco.com>
 +M:    Karan Tilak Kumar <kartilak@cisco.com>
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    drivers/scsi/fnic/
  
  CISCO SCSI HBA DRIVER
 -M:    Narsimhulu Musini <nmusini@cisco.com>
 +M:    Karan Tilak Kumar <kartilak@cisco.com>
  M:    Sesidhar Baddela <sebaddel@cisco.com>
  L:    linux-scsi@vger.kernel.org
  S:    Supported
@@@ -3385,7 -3329,6 +3385,7 @@@ L:      linux-pm@vger.kernel.or
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
  T:    git git://git.linaro.org/people/vireshk/linux.git (For ARM Updates)
 +B:    https://bugzilla.kernel.org
  F:    Documentation/cpu-freq/
  F:    drivers/cpufreq/
  F:    include/linux/cpufreq.h
@@@ -3425,7 -3368,6 +3425,7 @@@ M:      Daniel Lezcano <daniel.lezcano@linar
  L:    linux-pm@vger.kernel.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
 +B:    https://bugzilla.kernel.org
  F:    drivers/cpuidle/*
  F:    include/linux/cpuidle.h
  
@@@ -3471,7 -3413,6 +3471,7 @@@ F:      arch/*/crypto
  F:    crypto/
  F:    drivers/crypto/
  F:    include/crypto/
 +F:    include/linux/crypto*
  
  CRYPTOGRAPHIC RANDOM NUMBER GENERATOR
  M:    Neil Horman <nhorman@tuxdriver.com>
@@@ -3965,7 -3906,7 +3965,7 @@@ F:      include/linux/dma-buf
  F:    include/linux/reservation.h
  F:    include/linux/*fence.h
  F:    Documentation/dma-buf-sharing.txt
 -T:    git git://git.linaro.org/people/sumitsemwal/linux-dma-buf.git
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
  
  SYNC FILE FRAMEWORK
  M:    Sumit Semwal <sumit.semwal@linaro.org>
@@@ -3973,12 -3914,10 +3973,12 @@@ R:   Gustavo Padovan <gustavo@padovan.org
  S:    Maintained
  L:    linux-media@vger.kernel.org
  L:    dri-devel@lists.freedesktop.org
 -F:    drivers/dma-buf/sync_file.c
 +F:    drivers/dma-buf/sync_*
 +F:    drivers/dma-buf/sw_sync.c
  F:    include/linux/sync_file.h
 +F:    include/uapi/linux/sync_file.h
  F:    Documentation/sync_file.txt
 -T:    git git://git.linaro.org/people/sumitsemwal/linux-dma-buf.git
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
  
  DMA GENERIC OFFLOAD ENGINE SUBSYSTEM
  M:    Vinod Koul <vinod.koul@intel.com>
@@@ -4066,8 -4005,6 +4066,8 @@@ DRM DRIVER
  M:    David Airlie <airlied@linux.ie>
  L:    dri-devel@lists.freedesktop.org
  T:    git git://people.freedesktop.org/~airlied/linux
 +B:    https://bugs.freedesktop.org/
 +C:    irc://chat.freenode.net/dri-devel
  S:    Maintained
  F:    drivers/gpu/drm/
  F:    drivers/gpu/vga/
@@@ -4078,30 -4015,11 +4078,30 @@@ F:   Documentation/gpu
  F:    include/drm/
  F:    include/uapi/drm/
  
 +DRM DRIVERS AND MISC GPU PATCHES
 +M:    Daniel Vetter <daniel.vetter@intel.com>
 +M:    Jani Nikula <jani.nikula@linux.intel.com>
 +M:    Sean Paul <seanpaul@chromium.org>
 +W:    https://01.org/linuxgraphics/gfx-docs/maintainer-tools/drm-misc.html
 +S:    Maintained
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
 +F:    Documentation/gpu/
 +F:    drivers/gpu/vga/
 +F:    drivers/gpu/drm/*
 +F:    include/drm/drm*
 +F:    include/uapi/drm/drm*
 +
  DRM DRIVER FOR AST SERVER GRAPHICS CHIPS
  M:    Dave Airlie <airlied@redhat.com>
  S:    Odd Fixes
  F:    drivers/gpu/drm/ast/
  
 +DRM DRIVERS FOR BRIDGE CHIPS
 +M:    Archit Taneja <architt@codeaurora.org>
 +S:    Maintained
 +T:    git git://anongit.freedesktop.org/drm/drm-misc
 +F:    drivers/gpu/drm/bridge/
 +
  DRM DRIVER FOR BOCHS VIRTUAL GPU
  M:    Gerd Hoffmann <kraxel@redhat.com>
  S:    Odd Fixes
@@@ -4137,9 -4055,8 +4137,9 @@@ INTEL DRM DRIVERS (excluding Poulsbo, M
  M:    Daniel Vetter <daniel.vetter@intel.com>
  M:    Jani Nikula <jani.nikula@linux.intel.com>
  L:    intel-gfx@lists.freedesktop.org
 -L:    dri-devel@lists.freedesktop.org
  W:    https://01.org/linuxgraphics/
 +B:    https://01.org/linuxgraphics/documentation/how-report-bugs
 +C:    irc://chat.freenode.net/intel-gfx
  Q:    http://patchwork.freedesktop.org/project/intel-gfx/
  T:    git git://anongit.freedesktop.org/drm-intel
  S:    Supported
@@@ -4148,16 -4065,6 +4148,16 @@@ F:    include/drm/i915
  F:    include/uapi/drm/i915_drm.h
  F:    Documentation/gpu/i915.rst
  
 +INTEL GVT-g DRIVERS (Intel GPU Virtualization)
 +M:      Zhenyu Wang <zhenyuw@linux.intel.com>
 +M:      Zhi Wang <zhi.a.wang@intel.com>
 +L:      igvt-g-dev@lists.01.org
 +L:      intel-gfx@lists.freedesktop.org
 +W:      https://01.org/igvt-g
 +T:      git https://github.com/01org/gvt-linux.git
 +S:      Supported
 +F:      drivers/gpu/drm/i915/gvt/
 +
  DRM DRIVERS FOR ATMEL HLCDC
  M:    Boris Brezillon <boris.brezillon@free-electrons.com>
  L:    dri-devel@lists.freedesktop.org
@@@ -4172,15 -4079,6 +4172,15 @@@ S:    Supporte
  F:    drivers/gpu/drm/sun4i/
  F:    Documentation/devicetree/bindings/display/sunxi/sun4i-drm.txt
  
 +DRM DRIVERS FOR AMLOGIC SOCS
 +M:    Neil Armstrong <narmstrong@baylibre.com>
 +L:    dri-devel@lists.freedesktop.org
 +L:    linux-amlogic@lists.infradead.org
 +W:    http://linux-meson.com/
 +S:    Supported
 +F:    drivers/gpu/drm/meson/
 +F:    Documentation/devicetree/bindings/display/amlogic,meson-vpu.txt
 +
  DRM DRIVERS FOR EXYNOS
  M:    Inki Dae <inki.dae@samsung.com>
  M:    Joonyoung Shim <jy0922.shim@samsung.com>
@@@ -4220,7 -4118,6 +4220,7 @@@ F:      drivers/gpu/drm/gma500
  
  DRM DRIVERS FOR HISILICON
  M:    Xinliang Liu <z.liuxinliang@hisilicon.com>
 +M:    Rongrong Zou <zourongrong@gmail.com>
  R:    Xinwei Kong <kong.kongxinwei@hisilicon.com>
  R:    Chen Feng <puck.chen@hisilicon.com>
  L:    dri-devel@lists.freedesktop.org
@@@ -4345,7 -4242,6 +4345,7 @@@ DRM DRIVERS FOR VIVANTE GPU I
  M:    Lucas Stach <l.stach@pengutronix.de>
  R:    Russell King <linux+etnaviv@armlinux.org.uk>
  R:    Christian Gmeiner <christian.gmeiner@gmail.com>
 +L:    etnaviv@lists.freedesktop.org
  L:    dri-devel@lists.freedesktop.org
  S:    Maintained
  F:    drivers/gpu/drm/etnaviv/
@@@ -4386,13 -4282,6 +4386,13 @@@ S:    Maintaine
  F:    drivers/gpu/drm/tilcdc/
  F:    Documentation/devicetree/bindings/display/tilcdc/
  
 +DRM DRIVERS FOR ZTE ZX
 +M:    Shawn Guo <shawnguo@kernel.org>
 +L:    dri-devel@lists.freedesktop.org
 +S:    Maintained
 +F:    drivers/gpu/drm/zte/
 +F:    Documentation/devicetree/bindings/display/zte,vou.txt
 +
  DSBR100 USB FM RADIO DRIVER
  M:    Alexey Klimov <klimov.linux@gmail.com>
  L:    linux-media@vger.kernel.org
@@@ -4737,14 -4626,12 +4737,14 @@@ L:   linux-efi@vger.kernel.or
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi.git
  S:    Maintained
  F:    Documentation/efi-stub.txt
 -F:    arch/ia64/kernel/efi.c
 +F:    arch/*/kernel/efi.c
  F:    arch/x86/boot/compressed/eboot.[ch]
 -F:    arch/x86/include/asm/efi.h
 +F:    arch/*/include/asm/efi.h
  F:    arch/x86/platform/efi/
  F:    drivers/firmware/efi/
  F:    include/linux/efi*.h
 +F:    arch/arm/boot/compressed/efi-header.S
 +F:    arch/arm64/kernel/efi-entry.S
  
  EFI VARIABLE FILESYSTEM
  M:    Matthew Garrett <matthew.garrett@nebula.com>
@@@ -4796,11 -4683,11 +4796,11 @@@ M:   David Woodhouse <dwmw2@infradead.org
  L:    linux-embedded@vger.kernel.org
  S:    Maintained
  
 -EMULEX/AVAGO LPFC FC/FCOE SCSI DRIVER
 -M:    James Smart <james.smart@avagotech.com>
 -M:    Dick Kennedy <dick.kennedy@avagotech.com>
 +EMULEX/BROADCOM LPFC FC/FCOE SCSI DRIVER
 +M:    James Smart <james.smart@broadcom.com>
 +M:    Dick Kennedy <dick.kennedy@broadcom.com>
  L:    linux-scsi@vger.kernel.org
 -W:    http://www.avagotech.com
 +W:    http://www.broadcom.com
  S:    Supported
  F:    drivers/scsi/lpfc/
  
@@@ -5058,9 -4945,7 +5058,9 @@@ K:      fmc_d.*registe
  FPGA MANAGER FRAMEWORK
  M:    Alan Tull <atull@opensource.altera.com>
  R:    Moritz Fischer <moritz.fischer@ettus.com>
 +L:    linux-fpga@vger.kernel.org
  S:    Maintained
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/atull/linux-fpga.git
  F:    drivers/fpga/
  F:    include/linux/fpga/fpga-mgr.h
  W:    http://www.rocketboards.org
@@@ -5078,9 -4963,10 +5078,9 @@@ F:     drivers/net/wan/dlci.
  F:    drivers/net/wan/sdla.c
  
  FRAMEBUFFER LAYER
 -M:    Tomi Valkeinen <tomi.valkeinen@ti.com>
  L:    linux-fbdev@vger.kernel.org
  Q:    http://patchwork.kernel.org/project/linux-fbdev/list/
 -S:    Maintained
 +S:    Orphan
  F:    Documentation/fb/
  F:    drivers/video/
  F:    include/video/
@@@ -5088,14 -4974,6 +5088,14 @@@ F:    include/linux/fb.
  F:    include/uapi/video/
  F:    include/uapi/linux/fb.h
  
 +FREESCALE CAAM (Cryptographic Acceleration and Assurance Module) DRIVER
 +M:    Horia Geantă <horia.geanta@nxp.com>
 +M:    Dan Douglass <dan.douglass@nxp.com>
 +L:    linux-crypto@vger.kernel.org
 +S:    Maintained
 +F:    drivers/crypto/caam/
 +F:    Documentation/devicetree/bindings/crypto/fsl-sec4.txt
 +
  FREESCALE DIU FRAMEBUFFER DRIVER
  M:    Timur Tabi <timur@tabi.org>
  L:    linux-fbdev@vger.kernel.org
@@@ -5161,18 -5039,9 +5161,18 @@@ S:    Maintaine
  F:    drivers/net/ethernet/freescale/fman
  F:    Documentation/devicetree/bindings/powerpc/fsl/fman.txt
  
 +FREESCALE SOC DRIVERS
 +M:    Scott Wood <oss@buserror.net>
 +L:    linuxppc-dev@lists.ozlabs.org
 +L:    linux-arm-kernel@lists.infradead.org
 +S:    Maintained
 +F:    drivers/soc/fsl/
 +F:    include/linux/fsl/
 +
  FREESCALE QUICC ENGINE LIBRARY
 +M:    Qiang Zhao <qiang.zhao@nxp.com>
  L:    linuxppc-dev@lists.ozlabs.org
 -S:    Orphan
 +S:    Maintained
  F:    drivers/soc/fsl/qe/
  F:    include/soc/fsl/*qe*.h
  F:    include/soc/fsl/*ucc*.h
@@@ -5224,6 -5093,13 +5224,6 @@@ F:     sound/soc/fsl/fsl
  F:    sound/soc/fsl/imx*
  F:    sound/soc/fsl/mpc8610_hpcd.c
  
 -FREESCALE QORIQ MANAGEMENT COMPLEX DRIVER
 -M:    "J. German Rivera" <German.Rivera@freescale.com>
 -M:    Stuart Yoder <stuart.yoder@nxp.com>
 -L:    linux-kernel@vger.kernel.org
 -S:    Maintained
 -F:    drivers/staging/fsl-mc/
 -
  FREEVXFS FILESYSTEM
  M:    Christoph Hellwig <hch@infradead.org>
  W:    ftp://ftp.openlinux.org/pub/people/hch/vxfs
@@@ -5257,7 -5133,6 +5257,7 @@@ F:      include/linux/fscache*.
  FS-CRYPTO: FILE SYSTEM LEVEL ENCRYPTION SUPPORT
  M:    Theodore Y. Ts'o <tytso@mit.edu>
  M:    Jaegeuk Kim <jaegeuk@kernel.org>
 +L:    linux-fsdevel@vger.kernel.org
  S:    Supported
  F:    fs/crypto/
  F:    include/linux/fscrypto.h
@@@ -5322,7 -5197,6 +5322,7 @@@ L:      kernel-hardening@lists.openwall.co
  S:    Maintained
  F:    scripts/gcc-plugins/
  F:    scripts/gcc-plugin.sh
 +F:    scripts/Makefile.gcc-plugins
  F:    Documentation/gcc-plugins.txt
  
  GCOV BASED KERNEL PROFILING
@@@ -5734,6 -5608,7 +5734,6 @@@ F:      drivers/watchdog/hpwdt.
  
  HEWLETT-PACKARD SMART ARRAY RAID DRIVER (hpsa)
  M:    Don Brace <don.brace@microsemi.com>
 -L:    iss_storagedev@hp.com
  L:    esc.storagedev@microsemi.com
  L:    linux-scsi@vger.kernel.org
  S:    Supported
@@@ -5744,6 -5619,7 +5744,6 @@@ F:      include/uapi/linux/cciss*.
  
  HEWLETT-PACKARD SMART CISS RAID DRIVER (cciss)
  M:    Don Brace <don.brace@microsemi.com>
 -L:    iss_storagedev@hp.com
  L:    esc.storagedev@microsemi.com
  L:    linux-scsi@vger.kernel.org
  S:    Supported
@@@ -5782,7 -5658,6 +5782,7 @@@ HIBERNATION (aka Software Suspend, aka 
  M:    "Rafael J. Wysocki" <rjw@rjwysocki.net>
  M:    Pavel Machek <pavel@ucw.cz>
  L:    linux-pm@vger.kernel.org
 +B:    https://bugzilla.kernel.org
  S:    Supported
  F:    arch/x86/power/
  F:    drivers/base/power/
@@@ -5964,7 -5839,6 +5964,7 @@@ F:      drivers/input/serio/hyperv-keyboard.
  F:    drivers/pci/host/pci-hyperv.c
  F:    drivers/net/hyperv/
  F:    drivers/scsi/storvsc_drv.c
 +F:    drivers/uio/uio_hv_generic.c
  F:    drivers/video/fbdev/hyperv_fb.c
  F:    include/linux/hyperv.h
  F:    tools/hv/
@@@ -6208,9 -6082,14 +6208,9 @@@ S:     Maintaine
  F:    Documentation/cdrom/ide-cd
  F:    drivers/ide/ide-cd*
  
 -IDLE-I7300
 -M:    Andy Henroid <andrew.d.henroid@intel.com>
 -L:    linux-pm@vger.kernel.org
 -S:    Supported
 -F:    drivers/idle/i7300_idle.c
 -
  IEEE 802.15.4 SUBSYSTEM
  M:    Alexander Aring <aar@pengutronix.de>
 +M:    Stefan Schmidt <stefan@osg.samsung.com>
  L:    linux-wpan@vger.kernel.org
  W:    http://wpan.cakelab.org/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth.git
@@@ -6240,22 -6119,6 +6240,22 @@@ L:    linux-media@vger.kernel.or
  S:    Maintained
  F:    drivers/media/rc/iguanair.c
  
 +IIO DIGITAL POTENTIOMETER DAC
 +M:    Peter Rosin <peda@axentia.se>
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/ABI/testing/sysfs-bus-iio-dac-dpot-dac
 +F:    Documentation/devicetree/bindings/iio/dac/dpot-dac.txt
 +F:    drivers/iio/dac/dpot-dac.c
 +
 +IIO ENVELOPE DETECTOR
 +M:    Peter Rosin <peda@axentia.se>
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/ABI/testing/sysfs-bus-iio-adc-envelope-detector
 +F:    Documentation/devicetree/bindings/iio/adc/envelope-detector.txt
 +F:    drivers/iio/adc/envelope-detector.c
 +
  IIO SUBSYSTEM AND DRIVERS
  M:    Jonathan Cameron <jic23@kernel.org>
  R:    Hartmut Knaack <knaack.h@gmx.de>
@@@ -6413,11 -6276,9 +6413,11 @@@ S:    Maintaine
  F:    drivers/platform/x86/intel-vbtn.c
  
  INTEL IDLE DRIVER
 +M:    Jacob Pan <jacob.jun.pan@linux.intel.com>
  M:    Len Brown <lenb@kernel.org>
  L:    linux-pm@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux.git
 +B:    https://bugzilla.kernel.org
  S:    Supported
  F:    drivers/idle/intel_idle.c
  
@@@ -6515,10 -6376,7 +6515,7 @@@ F:     drivers/net/ethernet/intel/*
  
  INTEL RDMA RNIC DRIVER
  M:     Faisal Latif <faisal.latif@intel.com>
- R:     Chien Tin Tung <chien.tin.tung@intel.com>
- R:     Mustafa Ismail <mustafa.ismail@intel.com>
- R:     Shiraz Saleem <shiraz.saleem@intel.com>
- R:     Tatyana Nikolova <tatyana.e.nikolova@intel.com>
+ M:     Shiraz Saleem <shiraz.saleem@intel.com>
  L:     linux-rdma@vger.kernel.org
  S:     Supported
  F:     drivers/infiniband/hw/i40iw/
@@@ -6637,13 -6495,6 +6634,13 @@@ S:    Maintaine
  F:    arch/x86/include/asm/pmc_core.h
  F:    drivers/platform/x86/intel_pmc_core*
  
 +INVENSENSE MPU-3050 GYROSCOPE DRIVER
 +M:    Linus Walleij <linus.walleij@linaro.org>
 +L:    linux-iio@vger.kernel.org
 +S:    Maintained
 +F:    drivers/iio/gyro/mpu3050*
 +F:    Documentation/devicetree/bindings/iio/gyroscope/inv,mpu3050.txt
 +
  IOC3 ETHERNET DRIVER
  M:    Ralf Baechle <ralf@linux-mips.org>
  L:    linux-mips@linux-mips.org
@@@ -7225,7 -7076,6 +7222,7 @@@ F:      drivers/scsi/53c700
  LED SUBSYSTEM
  M:    Richard Purdie <rpurdie@rpsys.net>
  M:    Jacek Anaszewski <j.anaszewski@samsung.com>
 +M:    Pavel Machek <pavel@ucw.cz>
  L:    linux-leds@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/j.anaszewski/linux-leds.git
  S:    Maintained
@@@ -7698,10 -7548,8 +7695,10 @@@ S:    Maintaine
  MARVELL 88E6XXX ETHERNET SWITCH FABRIC DRIVER
  M:    Andrew Lunn <andrew@lunn.ch>
  M:    Vivien Didelot <vivien.didelot@savoirfairelinux.com>
 +L:    netdev@vger.kernel.org
  S:    Maintained
  F:    drivers/net/dsa/mv88e6xxx/
 +F:    Documentation/devicetree/bindings/net/dsa/marvell.txt
  
  MARVELL ARMADA DRM SUPPORT
  M:    Russell King <rmk+kernel@armlinux.org.uk>
@@@ -7851,7 -7699,6 +7848,7 @@@ MCP4531 MICROCHIP DIGITAL POTENTIOMETE
  M:    Peter Rosin <peda@axentia.se>
  L:    linux-iio@vger.kernel.org
  S:    Maintained
 +F:    Documentation/ABI/testing/sysfs-bus-iio-potentiometer-mcp4531
  F:    drivers/iio/potentiometer/mcp4531.c
  
  MEASUREMENT COMPUTING CIO-DAC IIO DRIVER
@@@ -7983,12 -7830,12 +7980,12 @@@ S:   Maintaine
  F:    drivers/net/wireless/mediatek/mt7601u/
  
  MEGARAID SCSI/SAS DRIVERS
 -M:    Kashyap Desai <kashyap.desai@avagotech.com>
 -M:    Sumit Saxena <sumit.saxena@avagotech.com>
 -M:    Uday Lingala <uday.lingala@avagotech.com>
 -L:    megaraidlinux.pdl@avagotech.com
 +M:    Kashyap Desai <kashyap.desai@broadcom.com>
 +M:    Sumit Saxena <sumit.saxena@broadcom.com>
 +M:    Shivasharan S <shivasharan.srikanteshwara@broadcom.com>
 +L:    megaraidlinux.pdl@broadcom.com
  L:    linux-scsi@vger.kernel.org
 -W:    http://www.lsi.com
 +W:    http://www.avagotech.com/support/
  S:    Maintained
  F:    Documentation/scsi/megaraid.txt
  F:    drivers/scsi/megaraid.*
@@@ -8070,10 -7917,6 +8067,10 @@@ F:    mm
  MEMORY TECHNOLOGY DEVICES (MTD)
  M:    David Woodhouse <dwmw2@infradead.org>
  M:    Brian Norris <computersforpeace@gmail.com>
 +M:    Boris Brezillon <boris.brezillon@free-electrons.com>
 +M:    Marek Vasut <marek.vasut@gmail.com>
 +M:    Richard Weinberger <richard@nod.at>
 +M:    Cyrille Pitchen <cyrille.pitchen@atmel.com>
  L:    linux-mtd@lists.infradead.org
  W:    http://www.linux-mtd.infradead.org/
  Q:    http://patchwork.ozlabs.org/project/linux-mtd/list/
@@@ -8202,7 -8045,6 +8199,7 @@@ F:      drivers/infiniband/hw/mlx4
  F:    include/linux/mlx4/
  
  MELLANOX MLX5 core VPI driver
 +M:    Saeed Mahameed <saeedm@mellanox.com>
  M:    Matan Barak <matanb@mellanox.com>
  M:    Leon Romanovsky <leonro@mellanox.com>
  L:    netdev@vger.kernel.org
@@@ -8416,12 -8258,6 +8413,12 @@@ T:    git git://linuxtv.org/mkrufky/tuners
  S:    Maintained
  F:    drivers/media/tuners/mxl5007t.*
  
 +MXSFB DRM DRIVER
 +M:    Marek Vasut <marex@denx.de>
 +S:    Supported
 +F:    drivers/gpu/drm/mxsfb/
 +F:    Documentation/devicetree/bindings/display/mxsfb-drm.txt
 +
  MYRICOM MYRI-10G 10GbE DRIVER (MYRI10GE)
  M:    Hyong-Youb Kim <hykim@myri.com>
  L:    netdev@vger.kernel.org
@@@ -8468,6 -8304,7 +8465,6 @@@ F:      drivers/scsi/arm/oak.
  F:    drivers/scsi/atari_scsi.*
  F:    drivers/scsi/dmx3191d.c
  F:    drivers/scsi/g_NCR5380.*
 -F:    drivers/scsi/g_NCR5380_mmio.c
  F:    drivers/scsi/mac_scsi.*
  F:    drivers/scsi/sun3_scsi.*
  F:    drivers/scsi/sun3_scsi_vme.c
@@@ -8598,6 -8435,7 +8595,6 @@@ F:      include/uapi/linux/net_namespace.
  F:    tools/net/
  F:    tools/testing/selftests/net/
  F:    lib/random32.c
 -F:    lib/test_bpf.c
  
  NETWORKING [IPv4/IPv6]
  M:    "David S. Miller" <davem@davemloft.net>
@@@ -8676,10 -8514,11 +8673,10 @@@ F:   Documentation/devicetree/bindings/ne
  F:    drivers/net/wireless/
  
  NETXEN (1/10) GbE SUPPORT
 -M:    Manish Chopra <manish.chopra@qlogic.com>
 -M:    Sony Chacko <sony.chacko@qlogic.com>
 -M:    Rajesh Borundia <rajesh.borundia@qlogic.com>
 +M:    Manish Chopra <manish.chopra@cavium.com>
 +M:    Rahul Verma <rahul.verma@cavium.com>
 +M:    Dept-GELinuxNICDev@cavium.com
  L:    netdev@vger.kernel.org
 -W:    http://www.qlogic.com
  S:    Supported
  F:    drivers/net/ethernet/qlogic/netxen/
  
@@@ -8826,16 -8665,6 +8823,16 @@@ L:    linux-nvme@lists.infradead.or
  S:    Supported
  F:    drivers/nvme/target/
  
 +NVM EXPRESS FC TRANSPORT DRIVERS
 +M:    James Smart <james.smart@broadcom.com>
 +L:    linux-nvme@lists.infradead.org
 +S:    Supported
 +F:    include/linux/nvme-fc.h
 +F:    include/linux/nvme-fc-driver.h
 +F:    drivers/nvme/host/fc.c
 +F:    drivers/nvme/target/fc.c
 +F:    drivers/nvme/target/fcloop.c
 +
  NVMEM FRAMEWORK
  M:    Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
  M:    Maxime Ripard <maxime.ripard@free-electrons.com>
@@@ -8898,7 -8727,6 +8895,7 @@@ F:      drivers/regulator/tps65217-regulator
  F:    drivers/regulator/tps65218-regulator.c
  F:    drivers/regulator/tps65910-regulator.c
  F:    drivers/regulator/twl-regulator.c
 +F:    drivers/regulator/twl6030-regulator.c
  F:    include/linux/i2c-omap.h
  
  OMAP DEVICE TREE SUPPORT
@@@ -9119,11 -8947,9 +9116,11 @@@ F:    drivers/of/resolver.
  
  OPENRISC ARCHITECTURE
  M:    Jonas Bonn <jonas@southpole.se>
 -W:    http://openrisc.net
 +M:    Stefan Kristiansson <stefan.kristiansson@saunalahti.fi>
 +M:    Stafford Horne <shorne@gmail.com>
 +L:    openrisc@lists.librecores.org
 +W:    http://openrisc.io
  S:    Maintained
 -T:    git git://openrisc.net/~jonas/linux
  F:    arch/openrisc/
  
  OPENVSWITCH
@@@ -9255,7 -9081,7 +9252,7 @@@ F:      drivers/misc/panel.
  
  PARALLEL PORT SUBSYSTEM
  M:    Sudip Mukherjee <sudipm.mukherjee@gmail.com>
 -M:    Sudip Mukherjee <sudip@vectorindia.org>
 +M:    Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
  L:    linux-parport@lists.infradead.org (subscribers-only)
  S:    Maintained
  F:    drivers/parport/
@@@ -9410,12 -9236,11 +9407,12 @@@ S:   Maintaine
  F:    drivers/pci/host/*layerscape*
  
  PCI DRIVER FOR IMX6
 -M:    Richard Zhu <Richard.Zhu@freescale.com>
 +M:    Richard Zhu <hongxing.zhu@nxp.com>
  M:    Lucas Stach <l.stach@pengutronix.de>
  L:    linux-pci@vger.kernel.org
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 +F:    Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt
  F:    drivers/pci/host/*imx6*
  
  PCI DRIVER FOR TI KEYSTONE
@@@ -9474,11 -9299,17 +9471,11 @@@ F:   drivers/pci/host/pci-exynos.
  
  PCI DRIVER FOR SYNOPSIS DESIGNWARE
  M:    Jingoo Han <jingoohan1@gmail.com>
 -M:    Pratyush Anand <pratyush.anand@gmail.com>
 -L:    linux-pci@vger.kernel.org
 -S:    Maintained
 -F:    drivers/pci/host/*designware*
 -
 -PCI DRIVER FOR SYNOPSYS PROTOTYPING DEVICE
 -M:    Jose Abreu <Jose.Abreu@synopsys.com>
 +M:    Joao Pinto <Joao.Pinto@synopsys.com>
  L:    linux-pci@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/pci/designware-pcie.txt
 -F:    drivers/pci/host/pcie-designware-plat.c
 +F:    drivers/pci/host/*designware*
  
  PCI DRIVER FOR GENERIC OF HOSTS
  M:    Will Deacon <will.deacon@arm.com>
@@@ -9493,7 -9324,7 +9490,7 @@@ PCI DRIVER FOR INTEL VOLUME MANAGEMENT 
  M:    Keith Busch <keith.busch@intel.com>
  L:    linux-pci@vger.kernel.org
  S:    Supported
 -F:    arch/x86/pci/vmd.c
 +F:    drivers/pci/host/vmd.c
  
  PCIE DRIVER FOR ST SPEAR13XX
  M:    Pratyush Anand <pratyush.anand@gmail.com>
@@@ -9726,8 -9557,8 +9723,8 @@@ F:      arch/mips/boot/dts/pistachio
  F:      arch/mips/configs/pistachio*_defconfig
  
  PKTCDVD DRIVER
 -M:    Jiri Kosina <jikos@kernel.org>
 -S:    Maintained
 +S:    Orphan
 +M:    linux-block@vger.kernel.org
  F:    drivers/block/pktcdvd.c
  F:    include/linux/pktcdvd.h
  F:    include/uapi/linux/pktcdvd.h
@@@ -9780,7 -9611,6 +9777,7 @@@ POWER MANAGEMENT COR
  M:    "Rafael J. Wysocki" <rjw@rjwysocki.net>
  L:    linux-pm@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
 +B:    https://bugzilla.kernel.org
  S:    Supported
  F:    drivers/base/power/
  F:    include/linux/pm.h
@@@ -9962,7 -9792,7 +9959,7 @@@ F:      drivers/media/usb/pwc/
  
  PWM FAN DRIVER
  M:    Kamil Debski <kamil@wypas.org>
 -M:    Lukasz Majewski <l.majewski@samsung.com>
 +M:    Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
  L:    linux-hwmon@vger.kernel.org
  S:    Supported
  F:    Documentation/devicetree/bindings/hwmon/pwm-fan.txt
@@@ -10064,32 -9894,33 +10061,32 @@@ F: Documentation/scsi/LICENSE.qla4xx
  F:    drivers/scsi/qla4xxx/
  
  QLOGIC QLA3XXX NETWORK DRIVER
 -M:    Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
 -M:    Ron Mercer <ron.mercer@qlogic.com>
 -M:    linux-driver@qlogic.com
 +M:    Dept-GELinuxNICDev@cavium.com
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    Documentation/networking/LICENSE.qla3xxx
  F:    drivers/net/ethernet/qlogic/qla3xxx.*
  
  QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER
 -M:    Dept-GELinuxNICDev@qlogic.com
 +M:    Harish Patil <harish.patil@cavium.com>
 +M:    Manish Chopra <manish.chopra@cavium.com>
 +M:    Dept-GELinuxNICDev@cavium.com
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/qlogic/qlcnic/
  
  QLOGIC QLGE 10Gb ETHERNET DRIVER
 -M:    Harish Patil <harish.patil@qlogic.com>
 -M:    Sudarsana Kalluru <sudarsana.kalluru@qlogic.com>
 -M:    Dept-GELinuxNICDev@qlogic.com
 -M:    linux-driver@qlogic.com
 +M:    Harish Patil <harish.patil@cavium.com>
 +M:    Manish Chopra <manish.chopra@cavium.com>
 +M:    Dept-GELinuxNICDev@cavium.com
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/qlogic/qlge/
  
  QLOGIC QL4xxx ETHERNET DRIVER
 -M:    Yuval Mintz <Yuval.Mintz@qlogic.com>
 -M:    Ariel Elior <Ariel.Elior@qlogic.com>
 -M:    everest-linux-l2@qlogic.com
 +M:    Yuval Mintz <Yuval.Mintz@cavium.com>
 +M:    Ariel Elior <Ariel.Elior@cavium.com>
 +M:    everest-linux-l2@cavium.com
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    drivers/net/ethernet/qlogic/qed/
@@@ -10104,12 -9935,6 +10101,12 @@@ F:  fs/qnx4
  F:    include/uapi/linux/qnx4_fs.h
  F:    include/uapi/linux/qnxtypes.h
  
 +QORIQ DPAA2 FSL-MC BUS DRIVER
 +M:    Stuart Yoder <stuart.yoder@nxp.com>
 +L:    linux-kernel@vger.kernel.org
 +S:    Maintained
 +F:    drivers/staging/fsl-mc/
 +
  QT1010 MEDIA DRIVER
  M:    Antti Palosaari <crope@iki.fi>
  L:    linux-media@vger.kernel.org
@@@ -10572,7 -10397,7 +10569,7 @@@ F:   arch/s390/pci
  F:    drivers/pci/hotplug/s390_pci_hpc.c
  
  S390 ZCRYPT DRIVER
 -M:    Ingo Tuchscherer <ingo.tuchscherer@de.ibm.com>
 +M:    Harald Freudenberger <freude@de.ibm.com>
  L:    linux-s390@vger.kernel.org
  W:    http://www.ibm.com/developerworks/linux/linux390/
  S:    Supported
@@@ -10739,7 -10564,7 +10736,7 @@@ L:   netdev@vger.kernel.or
  F:    drivers/net/ethernet/samsung/sxgbe/
  
  SAMSUNG THERMAL DRIVER
 -M:    Lukasz Majewski <l.majewski@samsung.com>
 +M:    Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
  L:    linux-pm@vger.kernel.org
  L:    linux-samsung-soc@vger.kernel.org
  S:    Supported
@@@ -10865,11 -10690,6 +10862,11 @@@ W: http://www.sunplus.co
  S:    Supported
  F:    arch/score/
  
 +SCR24X CHIP CARD INTERFACE DRIVER
 +M:    Lubomir Rintel <lkundrak@v3.sk>
 +S:    Supported
 +F:    drivers/char/pcmcia/scr24x_cs.c
 +
  SYSTEM CONTROL & POWER INTERFACE (SCPI) Message Protocol drivers
  M:    Sudeep Holla <sudeep.holla@arm.com>
  L:    linux-arm-kernel@lists.infradead.org
@@@ -11078,7 -10898,6 +11075,6 @@@ F:   drivers/net/ethernet/emulex/benet
  EMULEX ONECONNECT ROCE DRIVER
  M:    Selvin Xavier <selvin.xavier@avagotech.com>
  M:    Devesh Sharma <devesh.sharma@avagotech.com>
- M:    Mitesh Ahuja <mitesh.ahuja@avagotech.com>
  L:    linux-rdma@vger.kernel.org
  W:    http://www.emulex.com
  S:    Supported
@@@ -11273,7 -11092,7 +11269,7 @@@ F:   include/media/i2c/ov2659.
  SILICON MOTION SM712 FRAME BUFFER DRIVER
  M:    Sudip Mukherjee <sudipm.mukherjee@gmail.com>
  M:    Teddy Wang <teddy.wang@siliconmotion.com>
 -M:    Sudip Mukherjee <sudip@vectorindia.org>
 +M:    Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
  L:    linux-fbdev@vger.kernel.org
  S:    Maintained
  F:    drivers/video/fbdev/sm712*
@@@ -11578,17 -11397,6 +11574,17 @@@ W: http://www.st.com/spea
  S:    Maintained
  F:    drivers/clk/spear/
  
 +SPI NOR SUBSYSTEM
 +M:    Cyrille Pitchen <cyrille.pitchen@atmel.com>
 +M:    Marek Vasut <marek.vasut@gmail.com>
 +L:    linux-mtd@lists.infradead.org
 +W:    http://www.linux-mtd.infradead.org/
 +Q:    http://patchwork.ozlabs.org/project/linux-mtd/list/
 +T:    git git://github.com/spi-nor/linux.git
 +S:    Maintained
 +F:    drivers/mtd/spi-nor/
 +F:    include/linux/mtd/spi-nor.h
 +
  SPI SUBSYSTEM
  M:    Mark Brown <broonie@kernel.org>
  L:    linux-spi@vger.kernel.org
@@@ -11635,7 -11443,7 +11631,7 @@@ STABLE BRANC
  M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  L:    stable@vger.kernel.org
  S:    Supported
 -F:    Documentation/stable_kernel_rules.txt
 +F:    Documentation/process/stable-kernel-rules.rst
  
  STAGING SUBSYSTEM
  M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
@@@ -11701,11 -11509,17 +11697,11 @@@ F:        drivers/staging/rtl8712
  STAGING - SILICON MOTION SM750 FRAME BUFFER DRIVER
  M:    Sudip Mukherjee <sudipm.mukherjee@gmail.com>
  M:    Teddy Wang <teddy.wang@siliconmotion.com>
 -M:    Sudip Mukherjee <sudip@vectorindia.org>
 +M:    Sudip Mukherjee <sudip.mukherjee@codethink.co.uk>
  L:    linux-fbdev@vger.kernel.org
  S:    Maintained
  F:    drivers/staging/sm750fb/
  
 -STAGING - SLICOSS
 -M:    Lior Dotan <liodot@gmail.com>
 -M:    Christopher Harrer <charrer@alacritech.com>
 -S:    Odd Fixes
 -F:    drivers/staging/slicoss/
 -
  STAGING - SPEAKUP CONSOLE SPEECH DRIVER
  M:    William Hubbs <w.d.hubbs@gmail.com>
  M:    Chris Brannon <chris@the-brannons.com>
@@@ -11775,7 -11589,6 +11771,7 @@@ M:   "Rafael J. Wysocki" <rjw@rjwysocki.n
  M:    Len Brown <len.brown@intel.com>
  M:    Pavel Machek <pavel@ucw.cz>
  L:    linux-pm@vger.kernel.org
 +B:    https://bugzilla.kernel.org
  S:    Supported
  F:    Documentation/power/
  F:    arch/x86/kernel/acpi/
@@@ -12505,12 -12318,6 +12501,12 @@@ S: Maintaine
  F:    Documentation/filesystems/udf.txt
  F:    fs/udf/
  
 +UDRAW TABLET
 +M:    Bastien Nocera <hadess@hadess.net>
 +L:    linux-input@vger.kernel.org
 +S:    Maintained
 +F:    drivers/hid/hid-udraw.c
 +
  UFS FILESYSTEM
  M:    Evgeniy Dushistov <dushistov@mail.ru>
  S:    Maintained
@@@ -12567,8 -12374,7 +12563,8 @@@ F:   Documentation/scsi/ufs.tx
  F:    drivers/scsi/ufs/
  
  UNIVERSAL FLASH STORAGE HOST CONTROLLER DRIVER DWC HOOKS
 -M:    Joao Pinto <Joao.Pinto@synopsys.com>
 +M:    Manjunath M Bettegowda <manjumb@synopsys.com>
 +M:    Prabu Thangamuthu <prabut@synopsys.com>
  L:    linux-scsi@vger.kernel.org
  S:    Supported
  F:    drivers/scsi/ufs/*dwc*
@@@ -12926,15 -12732,6 +12922,15 @@@ F: drivers/vfio
  F:    include/linux/vfio.h
  F:    include/uapi/linux/vfio.h
  
 +VFIO MEDIATED DEVICE DRIVERS
 +M:    Kirti Wankhede <kwankhede@nvidia.com>
 +L:    kvm@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/vfio-mediated-device.txt
 +F:    drivers/vfio/mdev/
 +F:    include/linux/mdev.h
 +F:    samples/vfio-mdev/
 +
  VFIO PLATFORM DRIVER
  M:    Baptiste Reynal <b.reynal@virtualopensystems.com>
  L:    kvm@vger.kernel.org
@@@ -12979,7 -12776,6 +12975,7 @@@ F:   include/uapi/linux/virtio_console.
  
  VIRTIO CORE, NET AND BLOCK DRIVERS
  M:    "Michael S. Tsirkin" <mst@redhat.com>
 +M:    Jason Wang <jasowang@redhat.com>
  L:    virtualization@lists.linux-foundation.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/virtio/
@@@ -13010,7 -12806,6 +13006,7 @@@ F:   include/uapi/linux/virtio_gpu.
  
  VIRTIO HOST (VHOST)
  M:    "Michael S. Tsirkin" <mst@redhat.com>
 +M:    Jason Wang <jasowang@redhat.com>
  L:    kvm@vger.kernel.org
  L:    virtualization@lists.linux-foundation.org
  L:    netdev@vger.kernel.org
@@@ -13087,7 -12882,7 +13083,7 @@@ M:   Greg Kroah-Hartman <gregkh@linuxfoun
  L:    devel@driverdev.osuosl.org
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git
 -F:    Documentation/vme_api.txt
 +F:    Documentation/driver-api/vme.rst
  F:    drivers/staging/vme/
  F:    drivers/vme/
  F:    include/linux/vme*
@@@ -13129,6 -12924,13 +13125,13 @@@ S: Maintaine
  F:    drivers/scsi/vmw_pvscsi.c
  F:    drivers/scsi/vmw_pvscsi.h
  
+ VMWARE PVRDMA DRIVER
+ M:    Adit Ranadive <aditr@vmware.com>
+ M:    VMware PV-Drivers <pv-drivers@vmware.com>
+ L:    linux-rdma@vger.kernel.org
+ S:    Maintained
+ F:    drivers/infiniband/hw/vmw_pvrdma/
  VOLTAGE AND CURRENT REGULATOR FRAMEWORK
  M:    Liam Girdwood <lgirdwood@gmail.com>
  M:    Mark Brown <broonie@kernel.org>
@@@ -13311,7 -13113,7 +13314,7 @@@ T:   git git://git.kernel.org/pub/scm/lin
  S:    Maintained
  F:    include/linux/workqueue.h
  F:    kernel/workqueue.c
 -F:    Documentation/workqueue.txt
 +F:    Documentation/core-api/workqueue.rst
  
  X-POWERS MULTIFUNCTION PMIC DEVICE DRIVERS
  M:    Chen-Yu Tsai <wens@csie.org>
@@@ -13376,6 -13178,7 +13379,6 @@@ F:   drivers/media/tuners/tuner-xc2028.
  
  XEN HYPERVISOR INTERFACE
  M:    Boris Ostrovsky <boris.ostrovsky@oracle.com>
 -M:    David Vrabel <david.vrabel@citrix.com>
  M:    Juergen Gross <jgross@suse.com>
  L:    xen-devel@lists.xenproject.org (moderated for non-subscribers)
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip.git
index 71c7c4c328ef6bb438273395eb9b2d40667e5da3,0d4b114b4011ee580638c97bceb33b25175d3fb5..cf1edfa1cbacafca1687726f69a220c2473e2eee
@@@ -57,6 -57,54 +57,54 @@@ MODULE_AUTHOR("Sean Hefty")
  MODULE_DESCRIPTION("InfiniBand CM");
  MODULE_LICENSE("Dual BSD/GPL");
  
+ static const char * const ibcm_rej_reason_strs[] = {
+       [IB_CM_REJ_NO_QP]                       = "no QP",
+       [IB_CM_REJ_NO_EEC]                      = "no EEC",
+       [IB_CM_REJ_NO_RESOURCES]                = "no resources",
+       [IB_CM_REJ_TIMEOUT]                     = "timeout",
+       [IB_CM_REJ_UNSUPPORTED]                 = "unsupported",
+       [IB_CM_REJ_INVALID_COMM_ID]             = "invalid comm ID",
+       [IB_CM_REJ_INVALID_COMM_INSTANCE]       = "invalid comm instance",
+       [IB_CM_REJ_INVALID_SERVICE_ID]          = "invalid service ID",
+       [IB_CM_REJ_INVALID_TRANSPORT_TYPE]      = "invalid transport type",
+       [IB_CM_REJ_STALE_CONN]                  = "stale conn",
+       [IB_CM_REJ_RDC_NOT_EXIST]               = "RDC not exist",
+       [IB_CM_REJ_INVALID_GID]                 = "invalid GID",
+       [IB_CM_REJ_INVALID_LID]                 = "invalid LID",
+       [IB_CM_REJ_INVALID_SL]                  = "invalid SL",
+       [IB_CM_REJ_INVALID_TRAFFIC_CLASS]       = "invalid traffic class",
+       [IB_CM_REJ_INVALID_HOP_LIMIT]           = "invalid hop limit",
+       [IB_CM_REJ_INVALID_PACKET_RATE]         = "invalid packet rate",
+       [IB_CM_REJ_INVALID_ALT_GID]             = "invalid alt GID",
+       [IB_CM_REJ_INVALID_ALT_LID]             = "invalid alt LID",
+       [IB_CM_REJ_INVALID_ALT_SL]              = "invalid alt SL",
+       [IB_CM_REJ_INVALID_ALT_TRAFFIC_CLASS]   = "invalid alt traffic class",
+       [IB_CM_REJ_INVALID_ALT_HOP_LIMIT]       = "invalid alt hop limit",
+       [IB_CM_REJ_INVALID_ALT_PACKET_RATE]     = "invalid alt packet rate",
+       [IB_CM_REJ_PORT_CM_REDIRECT]            = "port CM redirect",
+       [IB_CM_REJ_PORT_REDIRECT]               = "port redirect",
+       [IB_CM_REJ_INVALID_MTU]                 = "invalid MTU",
+       [IB_CM_REJ_INSUFFICIENT_RESP_RESOURCES] = "insufficient resp resources",
+       [IB_CM_REJ_CONSUMER_DEFINED]            = "consumer defined",
+       [IB_CM_REJ_INVALID_RNR_RETRY]           = "invalid RNR retry",
+       [IB_CM_REJ_DUPLICATE_LOCAL_COMM_ID]     = "duplicate local comm ID",
+       [IB_CM_REJ_INVALID_CLASS_VERSION]       = "invalid class version",
+       [IB_CM_REJ_INVALID_FLOW_LABEL]          = "invalid flow label",
+       [IB_CM_REJ_INVALID_ALT_FLOW_LABEL]      = "invalid alt flow label",
+ };
+ const char *__attribute_const__ ibcm_reject_msg(int reason)
+ {
+       size_t index = reason;
+       if (index < ARRAY_SIZE(ibcm_rej_reason_strs) &&
+           ibcm_rej_reason_strs[index])
+               return ibcm_rej_reason_strs[index];
+       else
+               return "unrecognized reason";
+ }
+ EXPORT_SYMBOL(ibcm_reject_msg);
  static void cm_add_one(struct ib_device *device);
  static void cm_remove_one(struct ib_device *device, void *client_data);
  
@@@ -80,8 -128,6 +128,8 @@@ static struct ib_cm 
        __be32 random_id_operand;
        struct list_head timewait_list;
        struct workqueue_struct *wq;
 +      /* Sync on cm change port state */
 +      spinlock_t state_lock;
  } cm;
  
  /* Counter indexes ordered by attribute ID */
@@@ -163,8 -209,6 +211,8 @@@ struct cm_port 
        struct ib_mad_agent *mad_agent;
        struct kobject port_obj;
        u8 port_num;
 +      struct list_head cm_priv_prim_list;
 +      struct list_head cm_priv_altr_list;
        struct cm_counter_group counter_group[CM_COUNTER_GROUPS];
  };
  
@@@ -245,12 -289,6 +293,12 @@@ struct cm_id_private 
        u8 service_timeout;
        u8 target_ack_delay;
  
 +      struct list_head prim_list;
 +      struct list_head altr_list;
 +      /* Indicates that the send port mad is registered and av is set */
 +      int prim_send_port_not_ready;
 +      int altr_send_port_not_ready;
 +
        struct list_head work_list;
        atomic_t work_count;
  };
@@@ -269,47 -307,20 +317,47 @@@ static int cm_alloc_msg(struct cm_id_pr
        struct ib_mad_agent *mad_agent;
        struct ib_mad_send_buf *m;
        struct ib_ah *ah;
 +      struct cm_av *av;
 +      unsigned long flags, flags2;
 +      int ret = 0;
  
 +      /* don't let the port to be released till the agent is down */
 +      spin_lock_irqsave(&cm.state_lock, flags2);
 +      spin_lock_irqsave(&cm.lock, flags);
 +      if (!cm_id_priv->prim_send_port_not_ready)
 +              av = &cm_id_priv->av;
 +      else if (!cm_id_priv->altr_send_port_not_ready &&
 +               (cm_id_priv->alt_av.port))
 +              av = &cm_id_priv->alt_av;
 +      else {
 +              pr_info("%s: not valid CM id\n", __func__);
 +              ret = -ENODEV;
 +              spin_unlock_irqrestore(&cm.lock, flags);
 +              goto out;
 +      }
 +      spin_unlock_irqrestore(&cm.lock, flags);
 +      /* Make sure the port haven't released the mad yet */
        mad_agent = cm_id_priv->av.port->mad_agent;
 -      ah = ib_create_ah(mad_agent->qp->pd, &cm_id_priv->av.ah_attr);
 -      if (IS_ERR(ah))
 -              return PTR_ERR(ah);
 +      if (!mad_agent) {
 +              pr_info("%s: not a valid MAD agent\n", __func__);
 +              ret = -ENODEV;
 +              goto out;
 +      }
 +      ah = ib_create_ah(mad_agent->qp->pd, &av->ah_attr);
 +      if (IS_ERR(ah)) {
 +              ret = PTR_ERR(ah);
 +              goto out;
 +      }
  
        m = ib_create_send_mad(mad_agent, cm_id_priv->id.remote_cm_qpn,
 -                             cm_id_priv->av.pkey_index,
 +                             av->pkey_index,
                               0, IB_MGMT_MAD_HDR, IB_MGMT_MAD_DATA,
                               GFP_ATOMIC,
                               IB_MGMT_BASE_VERSION);
        if (IS_ERR(m)) {
                ib_destroy_ah(ah);
 -              return PTR_ERR(m);
 +              ret = PTR_ERR(m);
 +              goto out;
        }
  
        /* Timeout set by caller if response is expected. */
        atomic_inc(&cm_id_priv->refcount);
        m->context[0] = cm_id_priv;
        *msg = m;
 -      return 0;
 +
 +out:
 +      spin_unlock_irqrestore(&cm.state_lock, flags2);
 +      return ret;
  }
  
  static int cm_alloc_response_msg(struct cm_port *port,
@@@ -392,8 -400,7 +440,8 @@@ static void cm_init_av_for_response(str
                           grh, &av->ah_attr);
  }
  
 -static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av)
 +static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av,
 +                            struct cm_id_private *cm_id_priv)
  {
        struct cm_device *cm_dev;
        struct cm_port *port = NULL;
                             &av->ah_attr);
        av->timeout = path->packet_life_time + 1;
  
 -      return 0;
 +      spin_lock_irqsave(&cm.lock, flags);
 +      if (&cm_id_priv->av == av)
 +              list_add_tail(&cm_id_priv->prim_list, &port->cm_priv_prim_list);
 +      else if (&cm_id_priv->alt_av == av)
 +              list_add_tail(&cm_id_priv->altr_list, &port->cm_priv_altr_list);
 +      else
 +              ret = -EINVAL;
 +
 +      spin_unlock_irqrestore(&cm.lock, flags);
 +
 +      return ret;
  }
  
  static int cm_alloc_id(struct cm_id_private *cm_id_priv)
@@@ -728,8 -725,6 +776,8 @@@ struct ib_cm_id *ib_create_cm_id(struc
        spin_lock_init(&cm_id_priv->lock);
        init_completion(&cm_id_priv->comp);
        INIT_LIST_HEAD(&cm_id_priv->work_list);
 +      INIT_LIST_HEAD(&cm_id_priv->prim_list);
 +      INIT_LIST_HEAD(&cm_id_priv->altr_list);
        atomic_set(&cm_id_priv->work_count, -1);
        atomic_set(&cm_id_priv->refcount, 1);
        return &cm_id_priv->id;
@@@ -945,15 -940,6 +993,15 @@@ retest
                break;
        }
  
 +      spin_lock_irq(&cm.lock);
 +      if (!list_empty(&cm_id_priv->altr_list) &&
 +          (!cm_id_priv->altr_send_port_not_ready))
 +              list_del(&cm_id_priv->altr_list);
 +      if (!list_empty(&cm_id_priv->prim_list) &&
 +          (!cm_id_priv->prim_send_port_not_ready))
 +              list_del(&cm_id_priv->prim_list);
 +      spin_unlock_irq(&cm.lock);
 +
        cm_free_id(cm_id->local_id);
        cm_deref_id(cm_id_priv);
        wait_for_completion(&cm_id_priv->comp);
@@@ -1254,13 -1240,12 +1302,13 @@@ int ib_send_cm_req(struct ib_cm_id *cm_
                goto out;
        }
  
 -      ret = cm_init_av_by_path(param->primary_path, &cm_id_priv->av);
 +      ret = cm_init_av_by_path(param->primary_path, &cm_id_priv->av,
 +                               cm_id_priv);
        if (ret)
                goto error1;
        if (param->alternate_path) {
                ret = cm_init_av_by_path(param->alternate_path,
 -                                       &cm_id_priv->alt_av);
 +                                       &cm_id_priv->alt_av, cm_id_priv);
                if (ret)
                        goto error1;
        }
@@@ -1582,6 -1567,7 +1630,7 @@@ static struct cm_id_private * cm_match_
        struct cm_id_private *listen_cm_id_priv, *cur_cm_id_priv;
        struct cm_timewait_info *timewait_info;
        struct cm_req_msg *req_msg;
+       struct ib_cm_id *cm_id;
  
        req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad;
  
        timewait_info = cm_insert_remote_qpn(cm_id_priv->timewait_info);
        if (timewait_info) {
                cm_cleanup_timewait(cm_id_priv->timewait_info);
+               cur_cm_id_priv = cm_get_id(timewait_info->work.local_id,
+                                          timewait_info->work.remote_id);
                spin_unlock_irq(&cm.lock);
                cm_issue_rej(work->port, work->mad_recv_wc,
                             IB_CM_REJ_STALE_CONN, CM_MSG_RESPONSE_REQ,
                             NULL, 0);
+               if (cur_cm_id_priv) {
+                       cm_id = &cur_cm_id_priv->id;
+                       ib_send_cm_dreq(cm_id, NULL, 0);
+                       cm_deref_id(cur_cm_id_priv);
+               }
                return NULL;
        }
  
@@@ -1716,8 -1710,7 +1773,8 @@@ static int cm_req_handler(struct cm_wor
                        dev_put(gid_attr.ndev);
                }
                work->path[0].gid_type = gid_attr.gid_type;
 -              ret = cm_init_av_by_path(&work->path[0], &cm_id_priv->av);
 +              ret = cm_init_av_by_path(&work->path[0], &cm_id_priv->av,
 +                                       cm_id_priv);
        }
        if (ret) {
                int err = ib_get_cached_gid(work->port->cm_dev->ib_device,
                goto rejected;
        }
        if (req_msg->alt_local_lid) {
 -              ret = cm_init_av_by_path(&work->path[1], &cm_id_priv->alt_av);
 +              ret = cm_init_av_by_path(&work->path[1], &cm_id_priv->alt_av,
 +                                       cm_id_priv);
                if (ret) {
                        ib_send_cm_rej(cm_id, IB_CM_REJ_INVALID_ALT_GID,
                                       &work->path[0].sgid,
@@@ -1984,6 -1976,9 +2041,9 @@@ static int cm_rep_handler(struct cm_wor
        struct cm_id_private *cm_id_priv;
        struct cm_rep_msg *rep_msg;
        int ret;
+       struct cm_id_private *cur_cm_id_priv;
+       struct ib_cm_id *cm_id;
+       struct cm_timewait_info *timewait_info;
  
        rep_msg = (struct cm_rep_msg *)work->mad_recv_wc->recv_buf.mad;
        cm_id_priv = cm_acquire_id(rep_msg->remote_comm_id, 0);
                goto error;
        }
        /* Check for a stale connection. */
-       if (cm_insert_remote_qpn(cm_id_priv->timewait_info)) {
+       timewait_info = cm_insert_remote_qpn(cm_id_priv->timewait_info);
+       if (timewait_info) {
                rb_erase(&cm_id_priv->timewait_info->remote_id_node,
                         &cm.remote_id_table);
                cm_id_priv->timewait_info->inserted_remote_id = 0;
+               cur_cm_id_priv = cm_get_id(timewait_info->work.local_id,
+                                          timewait_info->work.remote_id);
                spin_unlock(&cm.lock);
                spin_unlock_irq(&cm_id_priv->lock);
                cm_issue_rej(work->port, work->mad_recv_wc,
                             IB_CM_REJ_STALE_CONN, CM_MSG_RESPONSE_REP,
                             NULL, 0);
                ret = -EINVAL;
+               if (cur_cm_id_priv) {
+                       cm_id = &cur_cm_id_priv->id;
+                       ib_send_cm_dreq(cm_id, NULL, 0);
+                       cm_deref_id(cur_cm_id_priv);
+               }
                goto error;
        }
        spin_unlock(&cm.lock);
@@@ -2792,8 -2797,7 +2862,8 @@@ int ib_send_cm_lap(struct ib_cm_id *cm_
                goto out;
        }
  
 -      ret = cm_init_av_by_path(alternate_path, &cm_id_priv->alt_av);
 +      ret = cm_init_av_by_path(alternate_path, &cm_id_priv->alt_av,
 +                               cm_id_priv);
        if (ret)
                goto out;
        cm_id_priv->alt_av.timeout =
@@@ -2905,8 -2909,7 +2975,8 @@@ static int cm_lap_handler(struct cm_wor
        cm_init_av_for_response(work->port, work->mad_recv_wc->wc,
                                work->mad_recv_wc->recv_buf.grh,
                                &cm_id_priv->av);
 -      cm_init_av_by_path(param->alternate_path, &cm_id_priv->alt_av);
 +      cm_init_av_by_path(param->alternate_path, &cm_id_priv->alt_av,
 +                         cm_id_priv);
        ret = atomic_inc_and_test(&cm_id_priv->work_count);
        if (!ret)
                list_add_tail(&work->list, &cm_id_priv->work_list);
@@@ -3098,7 -3101,7 +3168,7 @@@ int ib_send_cm_sidr_req(struct ib_cm_i
                return -EINVAL;
  
        cm_id_priv = container_of(cm_id, struct cm_id_private, id);
 -      ret = cm_init_av_by_path(param->path, &cm_id_priv->av);
 +      ret = cm_init_av_by_path(param->path, &cm_id_priv->av, cm_id_priv);
        if (ret)
                goto out;
  
@@@ -3535,9 -3538,7 +3605,9 @@@ out
  static int cm_migrate(struct ib_cm_id *cm_id)
  {
        struct cm_id_private *cm_id_priv;
 +      struct cm_av tmp_av;
        unsigned long flags;
 +      int tmp_send_port_not_ready;
        int ret = 0;
  
        cm_id_priv = container_of(cm_id, struct cm_id_private, id);
            (cm_id->lap_state == IB_CM_LAP_UNINIT ||
             cm_id->lap_state == IB_CM_LAP_IDLE)) {
                cm_id->lap_state = IB_CM_LAP_IDLE;
 +              /* Swap address vector */
 +              tmp_av = cm_id_priv->av;
                cm_id_priv->av = cm_id_priv->alt_av;
 +              cm_id_priv->alt_av = tmp_av;
 +              /* Swap port send ready state */
 +              tmp_send_port_not_ready = cm_id_priv->prim_send_port_not_ready;
 +              cm_id_priv->prim_send_port_not_ready = cm_id_priv->altr_send_port_not_ready;
 +              cm_id_priv->altr_send_port_not_ready = tmp_send_port_not_ready;
        } else
                ret = -EINVAL;
        spin_unlock_irqrestore(&cm_id_priv->lock, flags);
@@@ -3964,9 -3958,6 +4034,9 @@@ static void cm_add_one(struct ib_devic
                port->cm_dev = cm_dev;
                port->port_num = i;
  
 +              INIT_LIST_HEAD(&port->cm_priv_prim_list);
 +              INIT_LIST_HEAD(&port->cm_priv_altr_list);
 +
                ret = cm_create_port_fs(port);
                if (ret)
                        goto error1;
@@@ -4024,8 -4015,6 +4094,8 @@@ static void cm_remove_one(struct ib_dev
  {
        struct cm_device *cm_dev = client_data;
        struct cm_port *port;
 +      struct cm_id_private *cm_id_priv;
 +      struct ib_mad_agent *cur_mad_agent;
        struct ib_port_modify port_modify = {
                .clr_port_cap_mask = IB_PORT_CM_SUP
        };
  
                port = cm_dev->port[i-1];
                ib_modify_port(ib_device, port->port_num, 0, &port_modify);
 +              /* Mark all the cm_id's as not valid */
 +              spin_lock_irq(&cm.lock);
 +              list_for_each_entry(cm_id_priv, &port->cm_priv_altr_list, altr_list)
 +                      cm_id_priv->altr_send_port_not_ready = 1;
 +              list_for_each_entry(cm_id_priv, &port->cm_priv_prim_list, prim_list)
 +                      cm_id_priv->prim_send_port_not_ready = 1;
 +              spin_unlock_irq(&cm.lock);
                /*
                 * We flush the queue here after the going_down set, this
                 * verify that no new works will be queued in the recv handler,
                 * after that we can call the unregister_mad_agent
                 */
                flush_workqueue(cm.wq);
 -              ib_unregister_mad_agent(port->mad_agent);
 +              spin_lock_irq(&cm.state_lock);
 +              cur_mad_agent = port->mad_agent;
 +              port->mad_agent = NULL;
 +              spin_unlock_irq(&cm.state_lock);
 +              ib_unregister_mad_agent(cur_mad_agent);
                cm_remove_port_fs(port);
        }
 +
        device_unregister(cm_dev->device);
        kfree(cm_dev);
  }
@@@ -4082,7 -4059,6 +4152,7 @@@ static int __init ib_cm_init(void
        INIT_LIST_HEAD(&cm.device_list);
        rwlock_init(&cm.device_lock);
        spin_lock_init(&cm.lock);
 +      spin_lock_init(&cm.state_lock);
        cm.listen_service_table = RB_ROOT;
        cm.listen_service_id = be64_to_cpu(IB_CM_ASSIGN_SERVICE_ID);
        cm.remote_id_table = RB_ROOT;
index 22fcf284dd8b633e2b43f7617d53d76c2dbac832,8c30e3dedebef93f61f3aa934631f9b667264021..e7dcfac877ca2eb7b86601a9115b4c2fc27f4c01
@@@ -101,6 -101,49 +101,49 @@@ const char *__attribute_const__ rdma_ev
  }
  EXPORT_SYMBOL(rdma_event_msg);
  
+ const char *__attribute_const__ rdma_reject_msg(struct rdma_cm_id *id,
+                                               int reason)
+ {
+       if (rdma_ib_or_roce(id->device, id->port_num))
+               return ibcm_reject_msg(reason);
+       if (rdma_protocol_iwarp(id->device, id->port_num))
+               return iwcm_reject_msg(reason);
+       WARN_ON_ONCE(1);
+       return "unrecognized transport";
+ }
+ EXPORT_SYMBOL(rdma_reject_msg);
+ bool rdma_is_consumer_reject(struct rdma_cm_id *id, int reason)
+ {
+       if (rdma_ib_or_roce(id->device, id->port_num))
+               return reason == IB_CM_REJ_CONSUMER_DEFINED;
+       if (rdma_protocol_iwarp(id->device, id->port_num))
+               return reason == -ECONNREFUSED;
+       WARN_ON_ONCE(1);
+       return false;
+ }
+ EXPORT_SYMBOL(rdma_is_consumer_reject);
+ const void *rdma_consumer_reject_data(struct rdma_cm_id *id,
+                                     struct rdma_cm_event *ev, u8 *data_len)
+ {
+       const void *p;
+       if (rdma_is_consumer_reject(id, ev->status)) {
+               *data_len = ev->param.conn.private_data_len;
+               p = ev->param.conn.private_data;
+       } else {
+               *data_len = 0;
+               p = NULL;
+       }
+       return p;
+ }
+ EXPORT_SYMBOL(rdma_consumer_reject_data);
  static void cma_add_one(struct ib_device *device);
  static void cma_remove_one(struct ib_device *device, void *client_data);
  
@@@ -116,7 -159,7 +159,7 @@@ static LIST_HEAD(dev_list)
  static LIST_HEAD(listen_any_list);
  static DEFINE_MUTEX(lock);
  static struct workqueue_struct *cma_wq;
 -static int cma_pernet_id;
 +static unsigned int cma_pernet_id;
  
  struct cma_pernet {
        struct idr tcp_ps;
@@@ -1094,47 -1137,47 +1137,47 @@@ static void cma_save_ib_info(struct soc
        }
  }
  
 -static void cma_save_ip4_info(struct sockaddr *src_addr,
 -                            struct sockaddr *dst_addr,
 +static void cma_save_ip4_info(struct sockaddr_in *src_addr,
 +                            struct sockaddr_in *dst_addr,
                              struct cma_hdr *hdr,
                              __be16 local_port)
  {
 -      struct sockaddr_in *ip4;
 -
        if (src_addr) {
 -              ip4 = (struct sockaddr_in *)src_addr;
 -              ip4->sin_family = AF_INET;
 -              ip4->sin_addr.s_addr = hdr->dst_addr.ip4.addr;
 -              ip4->sin_port = local_port;
 +              *src_addr = (struct sockaddr_in) {
 +                      .sin_family = AF_INET,
 +                      .sin_addr.s_addr = hdr->dst_addr.ip4.addr,
 +                      .sin_port = local_port,
 +              };
        }
  
        if (dst_addr) {
 -              ip4 = (struct sockaddr_in *)dst_addr;
 -              ip4->sin_family = AF_INET;
 -              ip4->sin_addr.s_addr = hdr->src_addr.ip4.addr;
 -              ip4->sin_port = hdr->port;
 +              *dst_addr = (struct sockaddr_in) {
 +                      .sin_family = AF_INET,
 +                      .sin_addr.s_addr = hdr->src_addr.ip4.addr,
 +                      .sin_port = hdr->port,
 +              };
        }
  }
  
 -static void cma_save_ip6_info(struct sockaddr *src_addr,
 -                            struct sockaddr *dst_addr,
 +static void cma_save_ip6_info(struct sockaddr_in6 *src_addr,
 +                            struct sockaddr_in6 *dst_addr,
                              struct cma_hdr *hdr,
                              __be16 local_port)
  {
 -      struct sockaddr_in6 *ip6;
 -
        if (src_addr) {
 -              ip6 = (struct sockaddr_in6 *)src_addr;
 -              ip6->sin6_family = AF_INET6;
 -              ip6->sin6_addr = hdr->dst_addr.ip6;
 -              ip6->sin6_port = local_port;
 +              *src_addr = (struct sockaddr_in6) {
 +                      .sin6_family = AF_INET6,
 +                      .sin6_addr = hdr->dst_addr.ip6,
 +                      .sin6_port = local_port,
 +              };
        }
  
        if (dst_addr) {
 -              ip6 = (struct sockaddr_in6 *)dst_addr;
 -              ip6->sin6_family = AF_INET6;
 -              ip6->sin6_addr = hdr->src_addr.ip6;
 -              ip6->sin6_port = hdr->port;
 +              *dst_addr = (struct sockaddr_in6) {
 +                      .sin6_family = AF_INET6,
 +                      .sin6_addr = hdr->src_addr.ip6,
 +                      .sin6_port = hdr->port,
 +              };
        }
  }
  
@@@ -1159,12 -1202,10 +1202,12 @@@ static int cma_save_ip_info(struct sock
  
        switch (cma_get_ip_ver(hdr)) {
        case 4:
 -              cma_save_ip4_info(src_addr, dst_addr, hdr, port);
 +              cma_save_ip4_info((struct sockaddr_in *)src_addr,
 +                                (struct sockaddr_in *)dst_addr, hdr, port);
                break;
        case 6:
 -              cma_save_ip6_info(src_addr, dst_addr, hdr, port);
 +              cma_save_ip6_info((struct sockaddr_in6 *)src_addr,
 +                                (struct sockaddr_in6 *)dst_addr, hdr, port);
                break;
        default:
                return -EAFNOSUPPORT;
@@@ -2438,18 -2479,6 +2481,18 @@@ static int iboe_tos_to_sl(struct net_de
        return 0;
  }
  
 +static enum ib_gid_type cma_route_gid_type(enum rdma_network_type network_type,
 +                                         unsigned long supported_gids,
 +                                         enum ib_gid_type default_gid)
 +{
 +      if ((network_type == RDMA_NETWORK_IPV4 ||
 +           network_type == RDMA_NETWORK_IPV6) &&
 +          test_bit(IB_GID_TYPE_ROCE_UDP_ENCAP, &supported_gids))
 +              return IB_GID_TYPE_ROCE_UDP_ENCAP;
 +
 +      return default_gid;
 +}
 +
  static int cma_resolve_iboe_route(struct rdma_id_private *id_priv)
  {
        struct rdma_route *route = &id_priv->id.route;
        route->num_paths = 1;
  
        if (addr->dev_addr.bound_dev_if) {
 +              unsigned long supported_gids;
 +
                ndev = dev_get_by_index(&init_net, addr->dev_addr.bound_dev_if);
                if (!ndev) {
                        ret = -ENODEV;
  
                route->path_rec->net = &init_net;
                route->path_rec->ifindex = ndev->ifindex;
 -              route->path_rec->gid_type = id_priv->gid_type;
 +              supported_gids = roce_gid_type_mask_support(id_priv->id.device,
 +                                                          id_priv->id.port_num);
 +              route->path_rec->gid_type =
 +                      cma_route_gid_type(addr->dev_addr.network,
 +                                         supported_gids,
 +                                         id_priv->gid_type);
        }
        if (!ndev) {
                ret = -ENODEV;
index 0c0bea091de86c70b84f454ce0f50da90c7f4bd5,1acc95b3aaa37081dffa41e333982fb4261e0001..d29372624f3a055719e9592a99094bbc951d9f18
@@@ -72,9 -72,6 +72,6 @@@ void ib_device_unregister_sysfs(struct 
  void ib_cache_setup(void);
  void ib_cache_cleanup(void);
  
- int ib_resolve_eth_dmac(struct ib_qp *qp,
-                       struct ib_qp_attr *qp_attr, int *qp_attr_mask);
  typedef void (*roce_netdev_callback)(struct ib_device *device, u8 port,
              struct net_device *idev, void *cookie);
  
@@@ -127,7 -124,14 +124,7 @@@ void ib_cache_release_one(struct ib_dev
  static inline bool rdma_is_upper_dev_rcu(struct net_device *dev,
                                         struct net_device *upper)
  {
 -      struct net_device *_upper = NULL;
 -      struct list_head *iter;
 -
 -      netdev_for_each_all_upper_dev_rcu(dev, _upper, iter)
 -              if (_upper == upper)
 -                      break;
 -
 -      return _upper == upper;
 +      return netdev_has_upper_dev_all_rcu(dev, upper);
  }
  
  int addr_init(void);
index 3a64a0881882eb98a033d3a82296ad9b36ac600d,c86ddcea76757a9660fa2e3a3b25ecdb5e324cec..0621f4455732d83496b1dde0201912985f1ff8de
@@@ -304,10 -304,9 +304,9 @@@ static void enum_netdev_ipv4_ips(struc
        for_ifa(in_dev) {
                struct sin_list *entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
  
-               if (!entry) {
-                       pr_warn("roce_gid_mgmt: couldn't allocate entry for IPv4 update\n");
+               if (!entry)
                        continue;
-               }
                entry->ip.sin_family = AF_INET;
                entry->ip.sin_addr.s_addr = ifa->ifa_address;
                list_add_tail(&entry->list, &sin_list);
@@@ -348,10 -347,8 +347,8 @@@ static void enum_netdev_ipv6_ips(struc
        list_for_each_entry(ifp, &in6_dev->addr_list, if_list) {
                struct sin6_list *entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
  
-               if (!entry) {
-                       pr_warn("roce_gid_mgmt: couldn't allocate entry for IPv6 update\n");
+               if (!entry)
                        continue;
-               }
  
                entry->sin6.sin6_family = AF_INET6;
                entry->sin6.sin6_addr = ifp->addr;
@@@ -437,28 -434,6 +434,26 @@@ static void callback_for_addr_gid_devic
                          &parsed->gid_attr);
  }
  
-       if (!entry) {
-               pr_info("roce_gid_mgmt: couldn't allocate entry to delete ndev\n");
 +struct upper_list {
 +      struct list_head list;
 +      struct net_device *upper;
 +};
 +
 +static int netdev_upper_walk(struct net_device *upper, void *data)
 +{
 +      struct upper_list *entry = kmalloc(sizeof(*entry), GFP_ATOMIC);
 +      struct list_head *upper_list = data;
 +
-       }
++      if (!entry)
 +              return 0;
 +
 +      list_add_tail(&entry->list, upper_list);
 +      dev_hold(upper);
 +      entry->upper = upper;
 +
 +      return 0;
 +}
 +
  static void handle_netdev_upper(struct ib_device *ib_dev, u8 port,
                                void *cookie,
                                void (*handle_netdev)(struct ib_device *ib_dev,
                                                      struct net_device *ndev))
  {
        struct net_device *ndev = (struct net_device *)cookie;
 -      struct upper_list {
 -              struct list_head list;
 -              struct net_device *upper;
 -      };
 -      struct net_device *upper;
 -      struct list_head *iter;
        struct upper_list *upper_iter;
        struct upper_list *upper_temp;
        LIST_HEAD(upper_list);
  
        rcu_read_lock();
 -      netdev_for_each_all_upper_dev_rcu(ndev, upper, iter) {
 -              struct upper_list *entry = kmalloc(sizeof(*entry),
 -                                                 GFP_ATOMIC);
 -
 -              if (!entry)
 -                      continue;
 -
 -              list_add_tail(&entry->list, &upper_list);
 -              dev_hold(upper);
 -              entry->upper = upper;
 -      }
 +      netdev_walk_all_upper_dev_rcu(ndev, netdev_upper_walk, &upper_list);
        rcu_read_unlock();
  
        handle_netdev(ib_dev, port, ndev);
@@@ -559,10 -550,8 +554,8 @@@ static int netdevice_queue_work(struct 
        struct netdev_event_work *ndev_work =
                kmalloc(sizeof(*ndev_work), GFP_KERNEL);
  
-       if (!ndev_work) {
-               pr_warn("roce_gid_mgmt: can't allocate work for netdevice_event\n");
+       if (!ndev_work)
                return NOTIFY_DONE;
-       }
  
        memcpy(ndev_work->cmds, cmds, sizeof(ndev_work->cmds));
        for (i = 0; i < ARRAY_SIZE(ndev_work->cmds) && ndev_work->cmds[i].cb; i++) {
@@@ -696,10 -685,8 +689,8 @@@ static int addr_event(struct notifier_b
        }
  
        work = kmalloc(sizeof(*work), GFP_ATOMIC);
-       if (!work) {
-               pr_warn("roce_gid_mgmt: Couldn't allocate work for addr_event\n");
+       if (!work)
                return NOTIFY_DONE;
-       }
  
        INIT_WORK(&work->work, update_gid_event_work_handler);
  
index 84b4eff90395e5eb2afc7d66a2f932de8afd28f2,0120e7ff449f9db0776c358c508e9e91bcfed254..1e62a5f0cb28203e0732b9915840fd9f02d45701
@@@ -51,7 -51,7 +51,7 @@@ static void __ib_umem_release(struct ib
  
        if (umem->nmap > 0)
                ib_dma_unmap_sg(dev, umem->sg_head.sgl,
-                               umem->nmap,
+                               umem->npages,
                                DMA_BIDIRECTIONAL);
  
        for_each_sg(umem->sg_head.sgl, sg, umem->npages, i) {
@@@ -175,7 -175,7 +175,7 @@@ struct ib_umem *ib_umem_get(struct ib_u
  
        cur_base = addr & PAGE_MASK;
  
 -      if (npages == 0) {
 +      if (npages == 0 || npages > UINT_MAX) {
                ret = -EINVAL;
                goto out;
        }
index 44b1104eb168e50b7d598a2c5f756c5681d1e416,257d0799b526cae13089fd89030927b3c3bd1f22..813593550c4bd65a582ce32c36dc320b7fee0cbc
@@@ -137,6 -137,7 +137,7 @@@ static int (*uverbs_ex_cmd_table[])(str
        [IB_USER_VERBS_EX_CMD_DESTROY_WQ]       = ib_uverbs_ex_destroy_wq,
        [IB_USER_VERBS_EX_CMD_CREATE_RWQ_IND_TBL] = ib_uverbs_ex_create_rwq_ind_table,
        [IB_USER_VERBS_EX_CMD_DESTROY_RWQ_IND_TBL] = ib_uverbs_ex_destroy_rwq_ind_table,
+       [IB_USER_VERBS_EX_CMD_MODIFY_QP]        = ib_uverbs_ex_modify_qp,
  };
  
  static void ib_uverbs_add_one(struct ib_device *device);
@@@ -262,9 -263,12 +263,9 @@@ static int ib_uverbs_cleanup_ucontext(s
                        container_of(uobj, struct ib_uqp_object, uevent.uobject);
  
                idr_remove_uobj(&ib_uverbs_qp_idr, uobj);
 -              if (qp != qp->real_qp) {
 -                      ib_close_qp(qp);
 -              } else {
 +              if (qp == qp->real_qp)
                        ib_uverbs_detach_umcast(qp, uqp);
 -                      ib_destroy_qp(qp);
 -              }
 +              ib_destroy_qp(qp);
                ib_uverbs_release_uevent(file, &uqp->uevent);
                kfree(uqp);
        }
@@@ -746,8 -750,11 +747,11 @@@ static ssize_t ib_uverbs_write(struct f
        int srcu_key;
        ssize_t ret;
  
-       if (WARN_ON_ONCE(!ib_safe_file_access(filp)))
+       if (!ib_safe_file_access(filp)) {
+               pr_err_once("uverbs_write: process %d (%s) changed security contexts after opening file descriptor, this is not allowed.\n",
+                           task_tgid_vnr(current), current->comm);
                return -EACCES;
+       }
  
        if (count < sizeof hdr)
                return -EINVAL;
index 4e5baf4fe15ec3e1d839ef8d70ea9a20f8f4749d,cc7cf18411b874f5f341d9a6a65b94b99f0d1b55..516b0ae6dc3f6d061cc3c7d8ba412196785a599c
@@@ -828,8 -828,10 +828,10 @@@ static int c4iw_rdev_open(struct c4iw_r
        }
        rdev->status_page = (struct t4_dev_status_page *)
                            __get_free_page(GFP_KERNEL);
-       if (!rdev->status_page)
+       if (!rdev->status_page) {
+               err = -ENOMEM;
                goto destroy_ocqp_pool;
+       }
        rdev->status_page->qp_start = rdev->lldi.vr->qp.start;
        rdev->status_page->qp_size = rdev->lldi.vr->qp.size;
        rdev->status_page->cq_start = rdev->lldi.vr->cq.start;
                if (rdev->wr_log) {
                        rdev->wr_log_size = 1 << c4iw_wr_log_size_order;
                        atomic_set(&rdev->wr_log_idx, 0);
-               } else {
-                       pr_err(MOD "error allocating wr_log. Logging disabled\n");
                }
        }
  
@@@ -1424,8 -1424,6 +1424,6 @@@ static void recover_queues(struct uld_c
  
        qp_list.qps = kzalloc(count * sizeof *qp_list.qps, GFP_ATOMIC);
        if (!qp_list.qps) {
-               printk(KERN_ERR MOD "%s: Fatal error - DB overflow recovery failed\n",
-                      pci_name(ctx->lldi.pdev));
                spin_unlock_irq(&ctx->dev->lock);
                return;
        }
@@@ -1481,7 -1479,6 +1479,7 @@@ static int c4iw_uld_control(void *handl
  static struct cxgb4_uld_info c4iw_uld_info = {
        .name = DRV_NAME,
        .nrxq = MAX_ULD_QSETS,
 +      .ntxq = MAX_ULD_QSETS,
        .rxq_size = 511,
        .ciq = true,
        .lro = false,
index 67ea85a569452e82d037b8e1ee8a3f2567d4f07f,4962b6ef1f34506b382a0db478e1f3cb72d72aed..7a3d906b36710f773a7e3eaebf11239efccc8dc2
@@@ -125,6 -125,7 +125,7 @@@ int node_affinity_init(void
                                cpumask_weight(topology_sibling_cpumask(
                                        cpumask_first(&node_affinity.proc.mask)
                                        ));
+       node_affinity.num_possible_nodes = num_possible_nodes();
        node_affinity.num_online_nodes = num_online_nodes();
        node_affinity.num_online_cpus = num_online_cpus();
  
         */
        init_real_cpu_mask();
  
-       hfi1_per_node_cntr = kcalloc(num_possible_nodes(),
+       hfi1_per_node_cntr = kcalloc(node_affinity.num_possible_nodes,
                                     sizeof(*hfi1_per_node_cntr), GFP_KERNEL);
        if (!hfi1_per_node_cntr)
                return -ENOMEM;
@@@ -775,3 -776,75 +776,3 @@@ void hfi1_put_proc_affinity(int cpu
        }
        mutex_unlock(&affinity->lock);
  }
 -
 -int hfi1_set_sdma_affinity(struct hfi1_devdata *dd, const char *buf,
 -                         size_t count)
 -{
 -      struct hfi1_affinity_node *entry;
 -      cpumask_var_t mask;
 -      int ret, i;
 -
 -      mutex_lock(&node_affinity.lock);
 -      entry = node_affinity_lookup(dd->node);
 -
 -      if (!entry) {
 -              ret = -EINVAL;
 -              goto unlock;
 -      }
 -
 -      ret = zalloc_cpumask_var(&mask, GFP_KERNEL);
 -      if (!ret) {
 -              ret = -ENOMEM;
 -              goto unlock;
 -      }
 -
 -      ret = cpulist_parse(buf, mask);
 -      if (ret)
 -              goto out;
 -
 -      if (!cpumask_subset(mask, cpu_online_mask) || cpumask_empty(mask)) {
 -              dd_dev_warn(dd, "Invalid CPU mask\n");
 -              ret = -EINVAL;
 -              goto out;
 -      }
 -
 -      /* reset the SDMA interrupt affinity details */
 -      init_cpu_mask_set(&entry->def_intr);
 -      cpumask_copy(&entry->def_intr.mask, mask);
 -
 -      /* Reassign the affinity for each SDMA interrupt. */
 -      for (i = 0; i < dd->num_msix_entries; i++) {
 -              struct hfi1_msix_entry *msix;
 -
 -              msix = &dd->msix_entries[i];
 -              if (msix->type != IRQ_SDMA)
 -                      continue;
 -
 -              ret = get_irq_affinity(dd, msix);
 -
 -              if (ret)
 -                      break;
 -      }
 -out:
 -      free_cpumask_var(mask);
 -unlock:
 -      mutex_unlock(&node_affinity.lock);
 -      return ret ? ret : strnlen(buf, PAGE_SIZE);
 -}
 -
 -int hfi1_get_sdma_affinity(struct hfi1_devdata *dd, char *buf)
 -{
 -      struct hfi1_affinity_node *entry;
 -
 -      mutex_lock(&node_affinity.lock);
 -      entry = node_affinity_lookup(dd->node);
 -
 -      if (!entry) {
 -              mutex_unlock(&node_affinity.lock);
 -              return -EINVAL;
 -      }
 -
 -      cpumap_print_to_pagebuf(true, buf, &entry->def_intr.mask);
 -      mutex_unlock(&node_affinity.lock);
 -      return strnlen(buf, PAGE_SIZE);
 -}
index 42e63316afd193f4baf932f0c420eeca52738b39,c9453b3d47b49def2038a42602390bd0d7dac339..e78c7aa094e03d9be639f6035e67d0a674c372fb
@@@ -70,14 -70,6 +70,6 @@@ struct cpu_mask_set 
        uint gen;
  };
  
- struct hfi1_affinity {
-       struct cpu_mask_set def_intr;
-       struct cpu_mask_set rcv_intr;
-       struct cpumask real_cpu_mask;
-       /* spin lock to protect affinity struct */
-       spinlock_t lock;
- };
  struct hfi1_msix_entry;
  
  /* Initialize non-HT cpu cores mask */
@@@ -102,6 -94,10 +94,6 @@@ int hfi1_get_proc_affinity(int)
  /* Release a CPU used by a user process. */
  void hfi1_put_proc_affinity(int);
  
 -int hfi1_get_sdma_affinity(struct hfi1_devdata *dd, char *buf);
 -int hfi1_set_sdma_affinity(struct hfi1_devdata *dd, const char *buf,
 -                         size_t count);
 -
  struct hfi1_affinity_node {
        int node;
        struct cpu_mask_set def_intr;
@@@ -115,6 -111,7 +107,7 @@@ struct hfi1_affinity_node_list 
        struct cpumask real_cpu_mask;
        struct cpu_mask_set proc;
        int num_core_siblings;
+       int num_possible_nodes;
        int num_online_nodes;
        int num_online_cpus;
        struct mutex lock; /* protects affinity nodes */
index 24d0820873cf2df220892b9523907aeb9485eb8b,37d8af50cc13b4ec3a6454d8ddac088df70d167d..ef72bc2a9e1db41c195ee8044a8f385f3f018031
@@@ -6301,8 -6301,19 +6301,8 @@@ void set_up_vl15(struct hfi1_devdata *d
        /* leave shared count at zero for both global and VL15 */
        write_global_credit(dd, vau, vl15buf, 0);
  
 -      /* We may need some credits for another VL when sending packets
 -       * with the snoop interface. Dividing it down the middle for VL15
 -       * and VL0 should suffice.
 -       */
 -      if (unlikely(dd->hfi1_snoop.mode_flag == HFI1_PORT_SNOOP_MODE)) {
 -              write_csr(dd, SEND_CM_CREDIT_VL15, (u64)(vl15buf >> 1)
 -                  << SEND_CM_CREDIT_VL15_DEDICATED_LIMIT_VL_SHIFT);
 -              write_csr(dd, SEND_CM_CREDIT_VL, (u64)(vl15buf >> 1)
 -                  << SEND_CM_CREDIT_VL_DEDICATED_LIMIT_VL_SHIFT);
 -      } else {
 -              write_csr(dd, SEND_CM_CREDIT_VL15, (u64)vl15buf
 -                      << SEND_CM_CREDIT_VL15_DEDICATED_LIMIT_VL_SHIFT);
 -      }
 +      write_csr(dd, SEND_CM_CREDIT_VL15, (u64)vl15buf
 +                << SEND_CM_CREDIT_VL15_DEDICATED_LIMIT_VL_SHIFT);
  }
  
  /*
@@@ -8477,7 -8488,10 +8477,10 @@@ static int do_8051_command
         */
        if (type == HCMD_WRITE_LCB_CSR) {
                in_data |= ((*out_data) & 0xffffffffffull) << 8;
-               reg = ((((*out_data) >> 40) & 0xff) <<
+               /* must preserve COMPLETED - it is tied to hardware */
+               reg = read_csr(dd, DC_DC8051_CFG_EXT_DEV_0);
+               reg &= DC_DC8051_CFG_EXT_DEV_0_COMPLETED_SMASK;
+               reg |= ((((*out_data) >> 40) & 0xff) <<
                                DC_DC8051_CFG_EXT_DEV_0_RETURN_CODE_SHIFT)
                      | ((((*out_data) >> 48) & 0xffff) <<
                                DC_DC8051_CFG_EXT_DEV_0_RSP_DATA_SHIFT);
@@@ -9556,11 -9570,11 +9559,11 @@@ int bringup_serdes(struct hfi1_pportdat
        if (HFI1_CAP_IS_KSET(EXTENDED_PSN))
                add_rcvctrl(dd, RCV_CTRL_RCV_EXTENDED_PSN_ENABLE_SMASK);
  
-       guid = ppd->guid;
+       guid = ppd->guids[HFI1_PORT_GUID_INDEX];
        if (!guid) {
                if (dd->base_guid)
                        guid = dd->base_guid + ppd->port - 1;
-               ppd->guid = guid;
+               ppd->guids[HFI1_PORT_GUID_INDEX] = guid;
        }
  
        /* Set linkinit_reason on power up per OPA spec */
@@@ -9904,6 -9918,9 +9907,6 @@@ static void set_lidlmc(struct hfi1_ppor
        u32 mask = ~((1U << ppd->lmc) - 1);
        u64 c1 = read_csr(ppd->dd, DCC_CFG_PORT_CONFIG1);
  
 -      if (dd->hfi1_snoop.mode_flag)
 -              dd_dev_info(dd, "Set lid/lmc while snooping");
 -
        c1 &= ~(DCC_CFG_PORT_CONFIG1_TARGET_DLID_SMASK
                | DCC_CFG_PORT_CONFIG1_DLID_MASK_SMASK);
        c1 |= ((ppd->lid & DCC_CFG_PORT_CONFIG1_TARGET_DLID_MASK)
@@@ -12098,7 -12115,7 +12101,7 @@@ static void update_synth_timer(unsigne
        mod_timer(&dd->synth_stats_timer, jiffies + HZ * SYNTH_CNT_TIME);
  }
  
 -#define C_MAX_NAME 13 /* 12 chars + one for /0 */
 +#define C_MAX_NAME 16 /* 15 chars + one for /0 */
  static int init_cntrs(struct hfi1_devdata *dd)
  {
        int i, rcv_ctxts, j;
@@@ -14449,7 -14466,7 +14452,7 @@@ struct hfi1_devdata *hfi1_init_dd(struc
         * Any error printing is already done by the init code.
         * On return, we have the chip mapped.
         */
 -      ret = hfi1_pcie_ddinit(dd, pdev, ent);
 +      ret = hfi1_pcie_ddinit(dd, pdev);
        if (ret < 0)
                goto bail_free;
  
        if (ret)
                goto bail_free_cntrs;
  
 +      init_completion(&dd->user_comp);
 +
 +      /* The user refcount starts with one to inidicate an active device */
 +      atomic_set(&dd->user_refcount, 1);
 +
        goto bail;
  
  bail_free_rcverr:
index c5efff29c1479138ea37e585395eccd17059640b,d4261163bd25549599750d28a9c6e08279462d25..4fbaee68012bca69c7c843aa93ae571b481b76c4
@@@ -599,6 -599,7 +599,6 @@@ static void __prescan_rxq(struct hfi1_p
                                         dd->rhf_offset;
                struct rvt_qp *qp;
                struct ib_header *hdr;
 -              struct ib_other_headers *ohdr;
                struct rvt_dev_info *rdi = &dd->verbs_dev.rdi;
                u64 rhf = rhf_to_cpu(rhf_addr);
                u32 etype = rhf_rcv_type(rhf), qpn, bth1;
                if (etype != RHF_RCV_TYPE_IB)
                        goto next;
  
 -              hdr = hfi1_get_msgheader(dd, rhf_addr);
 +              packet->hdr = hfi1_get_msgheader(dd, rhf_addr);
 +              hdr = packet->hdr;
  
                lnh = be16_to_cpu(hdr->lrh[0]) & 3;
  
 -              if (lnh == HFI1_LRH_BTH)
 -                      ohdr = &hdr->u.oth;
 -              else if (lnh == HFI1_LRH_GRH)
 -                      ohdr = &hdr->u.l.oth;
 -              else
 +              if (lnh == HFI1_LRH_BTH) {
 +                      packet->ohdr = &hdr->u.oth;
 +              } else if (lnh == HFI1_LRH_GRH) {
 +                      packet->ohdr = &hdr->u.l.oth;
 +                      packet->rcv_flags |= HFI1_HAS_GRH;
 +              } else {
                        goto next; /* just in case */
 +              }
  
 -              bth1 = be32_to_cpu(ohdr->bth[1]);
 +              bth1 = be32_to_cpu(packet->ohdr->bth[1]);
                is_ecn = !!(bth1 & (HFI1_FECN_SMASK | HFI1_BECN_SMASK));
  
                if (!is_ecn)
  
                /* turn off BECN, FECN */
                bth1 &= ~(HFI1_FECN_SMASK | HFI1_BECN_SMASK);
 -              ohdr->bth[1] = cpu_to_be32(bth1);
 +              packet->ohdr->bth[1] = cpu_to_be32(bth1);
  next:
                update_ps_mdata(&mdata, rcd);
        }
@@@ -795,8 -793,7 +795,7 @@@ static inline void process_rcv_qp_work(
                                hfi1_schedule_send(qp);
                        spin_unlock_irqrestore(&qp->s_lock, flags);
                }
-               if (atomic_dec_and_test(&qp->refcount))
-                       wake_up(&qp->wait);
+               rvt_put_qp(qp);
        }
  }
  
@@@ -1362,25 -1359,12 +1361,25 @@@ int process_receive_ib(struct hfi1_pack
  
  int process_receive_bypass(struct hfi1_packet *packet)
  {
 +      struct hfi1_devdata *dd = packet->rcd->dd;
 +
        if (unlikely(rhf_err_flags(packet->rhf)))
                handle_eflags(packet);
  
 -      dd_dev_err(packet->rcd->dd,
 +      dd_dev_err(dd,
                   "Bypass packets are not supported in normal operation. Dropping\n");
 -      incr_cntr64(&packet->rcd->dd->sw_rcv_bypass_packet_errors);
 +      incr_cntr64(&dd->sw_rcv_bypass_packet_errors);
 +      if (!(dd->err_info_rcvport.status_and_code & OPA_EI_STATUS_SMASK)) {
 +              u64 *flits = packet->ebuf;
 +
 +              if (flits && !(packet->rhf & RHF_LEN_ERR)) {
 +                      dd->err_info_rcvport.packet_flit1 = flits[0];
 +                      dd->err_info_rcvport.packet_flit2 =
 +                              packet->tlen > sizeof(flits[0]) ? flits[1] : 0;
 +              }
 +              dd->err_info_rcvport.status_and_code |=
 +                      (OPA_EI_STATUS_SMASK | BAD_L2_ERR);
 +      }
        return RHF_RCV_CONTINUE;
  }
  
index cc87fd4e534bbefd1235be4c010c5df4be9c065c,4163596ce4c91a34d83a5f7e51454b8b84c892ba..751a0fb29fa57bb6546dc483496fa5ff309517de
@@@ -367,6 -367,26 +367,6 @@@ struct hfi1_packet 
        u8 etype;
  };
  
 -/*
 - * Private data for snoop/capture support.
 - */
 -struct hfi1_snoop_data {
 -      int mode_flag;
 -      struct cdev cdev;
 -      struct device *class_dev;
 -      /* protect snoop data */
 -      spinlock_t snoop_lock;
 -      struct list_head queue;
 -      wait_queue_head_t waitq;
 -      void *filter_value;
 -      int (*filter_callback)(void *hdr, void *data, void *value);
 -      u64 dcc_cfg; /* saved value of DCC Cfg register */
 -};
 -
 -/* snoop mode_flag values */
 -#define HFI1_PORT_SNOOP_MODE     1U
 -#define HFI1_PORT_CAPTURE_MODE   2U
 -
  struct rvt_sge_state;
  
  /*
  #define HFI1_MIN_VLS_SUPPORTED 1
  #define HFI1_MAX_VLS_SUPPORTED 8
  
+ #define HFI1_GUIDS_PER_PORT  5
+ #define HFI1_PORT_GUID_INDEX 0
  static inline void incr_cntr64(u64 *cntr)
  {
        if (*cntr < (u64)-1LL)
@@@ -559,11 -582,20 +562,20 @@@ struct hfi1_pportdata 
        struct kobject vl2mtu_kobj;
  
        /* PHY support */
-       u32 port_type;
        struct qsfp_data qsfp_info;
+       /* Values for SI tuning of SerDes */
+       u32 port_type;
+       u32 tx_preset_eq;
+       u32 tx_preset_noeq;
+       u32 rx_preset;
+       u8  local_atten;
+       u8  remote_atten;
+       u8  default_atten;
+       u8  max_power_class;
+       /* GUIDs for this interface, in host order, guids[0] is a port guid */
+       u64 guids[HFI1_GUIDS_PER_PORT];
  
-       /* GUID for this interface, in host order */
-       u64 guid;
        /* GUID for peer interface, in host order */
        u64 neighbor_guid;
  
        struct mutex hls_lock;
        u32 host_link_state;
  
 -      spinlock_t            sdma_alllock ____cacheline_aligned_in_smp;
 -
        u32 lstate;     /* logical link state */
  
        /* these are the "32 bit" regs */
@@@ -826,32 -860,29 +838,29 @@@ struct hfi1_devdata 
        u8 __iomem *kregend;
        /* physical address of chip for io_remap, etc. */
        resource_size_t physaddr;
-       /* receive context data */
-       struct hfi1_ctxtdata **rcd;
+       /* Per VL data. Enough for all VLs but not all elements are set/used. */
+       struct per_vl_data vld[PER_VL_SEND_CONTEXTS];
        /* send context data */
        struct send_context_info *send_contexts;
        /* map hardware send contexts to software index */
        u8 *hw_to_sw;
        /* spinlock for allocating and releasing send context resources */
        spinlock_t sc_lock;
-       /* Per VL data. Enough for all VLs but not all elements are set/used. */
-       struct per_vl_data vld[PER_VL_SEND_CONTEXTS];
        /* lock for pio_map */
        spinlock_t pio_map_lock;
+       /* Send Context initialization lock. */
+       spinlock_t sc_init_lock;
+       /* lock for sdma_map */
+       spinlock_t                          sde_map_lock;
        /* array of kernel send contexts */
        struct send_context **kernel_send_context;
        /* array of vl maps */
        struct pio_vl_map __rcu *pio_map;
-       /* seqlock for sc2vl */
-       seqlock_t sc2vl_lock;
-       u64 sc2vl[4];
-       /* Send Context initialization lock. */
-       spinlock_t sc_init_lock;
+       /* default flags to last descriptor */
+       u64 default_desc1;
  
        /* fields common to all SDMA engines */
  
-       /* default flags to last descriptor */
-       u64 default_desc1;
        volatile __le64                    *sdma_heads_dma; /* DMA'ed by chip */
        dma_addr_t                          sdma_heads_phys;
        void                               *sdma_pad_dma; /* DMA'ed by chip */
        u32                                 chip_sdma_engines;
        /* num used */
        u32                                 num_sdma;
-       /* lock for sdma_map */
-       spinlock_t                          sde_map_lock;
        /* array of engines sized by num_sdma */
        struct sdma_engine                 *per_sdma;
        /* array of vl maps */
        wait_queue_head_t                 sdma_unfreeze_wq;
        atomic_t                          sdma_unfreeze_count;
  
+       u32 lcb_access_count;           /* count of LCB users */
        /* common data between shared ASIC HFIs in this OS */
        struct hfi1_asic_data *asic_data;
  
-       /* hfi1_pportdata, points to array of (physical) port-specific
-        * data structs, indexed by pidx (0..n-1)
-        */
-       struct hfi1_pportdata *pport;
        /* mem-mapped pointer to base of PIO buffers */
        void __iomem *piobase;
        /*
        /* send context numbers and sizes for each type */
        struct sc_config_sizes sc_sizes[SC_MAX];
  
-       u32 lcb_access_count;           /* count of LCB users */
        char *boardname; /* human readable board info */
  
-       /* device (not port) flags, basically device capabilities */
-       u32 flags;
        /* reset value */
        u64 z_int_counter;
        u64 z_rcv_limit;
        u64 z_send_schedule;
-       /* percpu int_counter */
-       u64 __percpu *int_counter;
-       u64 __percpu *rcv_limit;
        u64 __percpu *send_schedule;
        /* number of receive contexts in use by the driver */
        u32 num_rcv_contexts;
        /* base receive interrupt timeout, in CSR units */
        u32 rcv_intr_timeout_csr;
  
+       u32 freezelen; /* max length of freezemsg */
        u64 __iomem *egrtidbase;
        spinlock_t sendctrl_lock; /* protect changes to SendCtrl */
        spinlock_t rcvctrl_lock; /* protect changes to RcvCtrl */
         * IB link status cheaply
         */
        struct hfi1_status *status;
-       u32 freezelen; /* max length of freezemsg */
  
        /* revision register shadow */
        u64 revision;
        u16 rcvegrbufsize_shift;
        /* both sides of the PCIe link are gen3 capable */
        u8 link_gen3_capable;
+       /* default link down value (poll/sleep) */
+       u8 link_default;
        /* localbus width (1, 2,4,8,16,32) from config space  */
        u32 lbus_width;
        /* localbus speed in MHz */
        u8 hfi1_id;
        /* implementation code */
        u8 icode;
-       /* default link down value (poll/sleep) */
-       u8 link_default;
        /* vAU of this device */
        u8 vau;
        /* vCU of this device */
        u16 vl15_init;
  
        /* Misc small ints */
-       /* Number of physical ports available */
-       u8 num_pports;
-       /* Lowest context number which can be used by user processes */
-       u8 first_user_ctxt;
        u8 n_krcv_queues;
        u8 qos_shift;
-       u8 qpn_mask;
  
-       u16 rhf_offset; /* offset of RHF within receive header entry */
        u16 irev;       /* implementation revision */
        u16 dc8051_ver; /* 8051 firmware version */
  
+       spinlock_t hfi1_diag_trans_lock; /* protect diag observer ops */
        struct platform_config platform_config;
        struct platform_config_cache pcfg_cache;
  
        struct diag_client *diag_client;
-       spinlock_t hfi1_diag_trans_lock; /* protect diag observer ops */
-       u8 psxmitwait_supported;
-       /* cycle length of PS* counters in HW (in picoseconds) */
-       u16 psxmitwait_check_rate;
  
        /* MSI-X information */
        struct hfi1_msix_entry *msix_entries;
  
        struct rcv_array_data rcv_entries;
  
+       /* cycle length of PS* counters in HW (in picoseconds) */
+       u16 psxmitwait_check_rate;
        /*
         * 64 bit synthetic counters
         */
        char *portcntrnames;
        size_t portcntrnameslen;
  
 -      struct hfi1_snoop_data hfi1_snoop;
 -
        struct err_info_rcvport err_info_rcvport;
        struct err_info_constraint err_info_rcv_constraint;
        struct err_info_constraint err_info_xmit_constraint;
-       u8 err_info_uncorrectable;
-       u8 err_info_fmconfig;
  
        atomic_t drop_packet;
        u8 do_drop;
+       u8 err_info_uncorrectable;
+       u8 err_info_fmconfig;
  
        /*
         * Software counters for the status bits defined by the
        u64 sw_cce_err_status_aggregate;
        /* Software counter that aggregates all bypass packet rcv errors */
        u64 sw_rcv_bypass_packet_errors;
-       /* receive interrupt functions */
-       rhf_rcv_function_ptr *rhf_rcv_function_map;
+       /* receive interrupt function */
        rhf_rcv_function_ptr normal_rhf_rcv_functions[8];
  
+       /* Save the enabled LCB error bits */
+       u64 lcb_err_en;
        /*
 -       * Handlers for outgoing data so that snoop/capture does not
 -       * have to have its hooks in the send path
 +       * Capability to have different send engines simply by changing a
 +       * pointer value.
         */
-       send_routine process_pio_send;
+       send_routine process_pio_send ____cacheline_aligned_in_smp;
        send_routine process_dma_send;
        void (*pio_inline_send)(struct hfi1_devdata *dd, struct pio_buf *pbuf,
                                u64 pbc, const void *from, size_t count);
+       /* hfi1_pportdata, points to array of (physical) port-specific
+        * data structs, indexed by pidx (0..n-1)
+        */
+       struct hfi1_pportdata *pport;
+       /* receive context data */
+       struct hfi1_ctxtdata **rcd;
+       u64 __percpu *int_counter;
+       /* device (not port) flags, basically device capabilities */
+       u16 flags;
+       /* Number of physical ports available */
+       u8 num_pports;
+       /* Lowest context number which can be used by user processes */
+       u8 first_user_ctxt;
+       /* adding a new field here would make it part of this cacheline */
+       /* seqlock for sc2vl */
+       seqlock_t sc2vl_lock ____cacheline_aligned_in_smp;
+       u64 sc2vl[4];
+       /* receive interrupt functions */
+       rhf_rcv_function_ptr *rhf_rcv_function_map;
+       u64 __percpu *rcv_limit;
+       u16 rhf_offset; /* offset of RHF within receive header entry */
+       /* adding a new field here would make it part of this cacheline */
  
        /* OUI comes from the HW. Used everywhere as 3 separate bytes. */
        u8 oui1;
        u8 oui2;
        u8 oui3;
+       u8 dc_shutdown;
        /* Timer and counter used to detect RcvBufOvflCnt changes */
        struct timer_list rcverr_timer;
-       u32 rcv_ovfl_cnt;
  
        wait_queue_head_t event_queue;
  
-       /* Save the enabled LCB error bits */
-       u64 lcb_err_en;
-       u8 dc_shutdown;
        /* receive context tail dummy address */
        __le64 *rcvhdrtail_dummy_kvaddr;
        dma_addr_t rcvhdrtail_dummy_dma;
  
-       bool eprom_available;   /* true if EPROM is available for this device */
-       bool aspm_supported;    /* Does HW support ASPM */
-       bool aspm_enabled;      /* ASPM state: enabled/disabled */
+       u32 rcv_ovfl_cnt;
        /* Serialize ASPM enable/disable between multiple verbs contexts */
        spinlock_t aspm_lock;
        /* Number of verbs contexts which have disabled ASPM */
        atomic_t aspm_disabled_cnt;
 +      /* Keeps track of user space clients */
 +      atomic_t user_refcount;
 +      /* Used to wait for outstanding user space clients before dev removal */
 +      struct completion user_comp;
  
-       struct hfi1_affinity *affinity;
+       bool eprom_available;   /* true if EPROM is available for this device */
+       bool aspm_supported;    /* Does HW support ASPM */
+       bool aspm_enabled;      /* ASPM state: enabled/disabled */
        struct rhashtable sdma_rht;
        struct kobject kobj;
  };
  
@@@ -1201,6 -1234,8 +1214,6 @@@ struct hfi1_devdata *hfi1_lookup(int un
  extern u32 hfi1_cpulist_count;
  extern unsigned long *hfi1_cpulist;
  
 -extern unsigned int snoop_drop_send;
 -extern unsigned int snoop_force_capture;
  int hfi1_init(struct hfi1_devdata *, int);
  int hfi1_count_units(int *npresentp, int *nupp);
  int hfi1_count_active_units(void);
@@@ -1535,6 -1570,13 +1548,6 @@@ void set_up_vl15(struct hfi1_devdata *d
  void reset_link_credits(struct hfi1_devdata *dd);
  void assign_remote_cm_au_table(struct hfi1_devdata *dd, u8 vcu);
  
 -int snoop_recv_handler(struct hfi1_packet *packet);
 -int snoop_send_dma_handler(struct rvt_qp *qp, struct hfi1_pkt_state *ps,
 -                         u64 pbc);
 -int snoop_send_pio_handler(struct rvt_qp *qp, struct hfi1_pkt_state *ps,
 -                         u64 pbc);
 -void snoop_inline_pio_send(struct hfi1_devdata *dd, struct pio_buf *pbuf,
 -                         u64 pbc, const void *from, size_t count);
  int set_buffer_control(struct hfi1_pportdata *ppd, struct buffer_control *bc);
  
  static inline struct hfi1_devdata *dd_from_ppd(struct hfi1_pportdata *ppd)
@@@ -1603,6 -1645,17 +1616,17 @@@ static inline u16 hfi1_get_pkey(struct 
        return ret;
  }
  
+ /*
+  * Return the indexed GUID from the port GUIDs table.
+  */
+ static inline __be64 get_sguid(struct hfi1_ibport *ibp, unsigned int index)
+ {
+       struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
+       WARN_ON(index >= HFI1_GUIDS_PER_PORT);
+       return cpu_to_be64(ppd->guids[index]);
+ }
  /*
   * Called by readers of cc_state only, must call under rcu_read_lock().
   */
@@@ -1734,7 -1787,8 +1758,7 @@@ int qsfp_dump(struct hfi1_pportdata *pp
  
  int hfi1_pcie_init(struct pci_dev *, const struct pci_device_id *);
  void hfi1_pcie_cleanup(struct pci_dev *);
 -int hfi1_pcie_ddinit(struct hfi1_devdata *, struct pci_dev *,
 -                   const struct pci_device_id *);
 +int hfi1_pcie_ddinit(struct hfi1_devdata *, struct pci_dev *);
  void hfi1_pcie_ddcleanup(struct hfi1_devdata *);
  void hfi1_pcie_flr(struct hfi1_devdata *);
  int pcie_speeds(struct hfi1_devdata *);
@@@ -1769,6 -1823,8 +1793,6 @@@ int kdeth_process_expected(struct hfi1_
  int kdeth_process_eager(struct hfi1_packet *packet);
  int process_receive_invalid(struct hfi1_packet *packet);
  
 -extern rhf_rcv_function_ptr snoop_rhf_rcv_functions[8];
 -
  void update_sge(struct rvt_sge_state *ss, u32 length);
  
  /* global module parameter variables */
@@@ -1795,6 -1851,9 +1819,6 @@@ extern struct mutex hfi1_mutex
  #define DRIVER_NAME           "hfi1"
  #define HFI1_USER_MINOR_BASE     0
  #define HFI1_TRACE_MINOR         127
 -#define HFI1_DIAGPKT_MINOR       128
 -#define HFI1_DIAG_MINOR_BASE     129
 -#define HFI1_SNOOP_CAPTURE_BASE  200
  #define HFI1_NMINORS             255
  
  #define PCI_VENDOR_ID_INTEL 0x8086
  static inline u64 hfi1_pkt_default_send_ctxt_mask(struct hfi1_devdata *dd,
                                                  u16 ctxt_type)
  {
 -      u64 base_sc_integrity =
 +      u64 base_sc_integrity;
 +
 +      /* No integrity checks if HFI1_CAP_NO_INTEGRITY is set */
 +      if (HFI1_CAP_IS_KSET(NO_INTEGRITY))
 +              return 0;
 +
 +      base_sc_integrity =
        SEND_CTXT_CHECK_ENABLE_DISALLOW_BYPASS_BAD_PKT_LEN_SMASK
        | SEND_CTXT_CHECK_ENABLE_DISALLOW_PBC_STATIC_RATE_CONTROL_SMASK
        | SEND_CTXT_CHECK_ENABLE_DISALLOW_TOO_LONG_BYPASS_PACKETS_SMASK
        | SEND_CTXT_CHECK_ENABLE_CHECK_VL_MAPPING_SMASK
        | SEND_CTXT_CHECK_ENABLE_CHECK_OPCODE_SMASK
        | SEND_CTXT_CHECK_ENABLE_CHECK_SLID_SMASK
 -      | SEND_CTXT_CHECK_ENABLE_CHECK_JOB_KEY_SMASK
        | SEND_CTXT_CHECK_ENABLE_CHECK_VL_SMASK
        | SEND_CTXT_CHECK_ENABLE_CHECK_ENABLE_SMASK;
  
        else
                base_sc_integrity |= HFI1_PKT_KERNEL_SC_INTEGRITY;
  
 -      if (is_ax(dd))
 -              /* turn off send-side job key checks - A0 */
 -              return base_sc_integrity &
 -                     ~SEND_CTXT_CHECK_ENABLE_CHECK_JOB_KEY_SMASK;
 +      /* turn on send-side job key checks if !A0 */
 +      if (!is_ax(dd))
 +              base_sc_integrity |= SEND_CTXT_CHECK_ENABLE_CHECK_JOB_KEY_SMASK;
 +
        return base_sc_integrity;
  }
  
  static inline u64 hfi1_pkt_base_sdma_integrity(struct hfi1_devdata *dd)
  {
 -      u64 base_sdma_integrity =
 +      u64 base_sdma_integrity;
 +
 +      /* No integrity checks if HFI1_CAP_NO_INTEGRITY is set */
 +      if (HFI1_CAP_IS_KSET(NO_INTEGRITY))
 +              return 0;
 +
 +      base_sdma_integrity =
        SEND_DMA_CHECK_ENABLE_DISALLOW_BYPASS_BAD_PKT_LEN_SMASK
 -      | SEND_DMA_CHECK_ENABLE_DISALLOW_PBC_STATIC_RATE_CONTROL_SMASK
        | SEND_DMA_CHECK_ENABLE_DISALLOW_TOO_LONG_BYPASS_PACKETS_SMASK
        | SEND_DMA_CHECK_ENABLE_DISALLOW_TOO_LONG_IB_PACKETS_SMASK
        | SEND_DMA_CHECK_ENABLE_DISALLOW_BAD_PKT_LEN_SMASK
        | SEND_DMA_CHECK_ENABLE_CHECK_VL_MAPPING_SMASK
        | SEND_DMA_CHECK_ENABLE_CHECK_OPCODE_SMASK
        | SEND_DMA_CHECK_ENABLE_CHECK_SLID_SMASK
 -      | SEND_DMA_CHECK_ENABLE_CHECK_JOB_KEY_SMASK
        | SEND_DMA_CHECK_ENABLE_CHECK_VL_SMASK
        | SEND_DMA_CHECK_ENABLE_CHECK_ENABLE_SMASK;
  
 -      if (is_ax(dd))
 -              /* turn off send-side job key checks - A0 */
 -              return base_sdma_integrity &
 -                     ~SEND_DMA_CHECK_ENABLE_CHECK_JOB_KEY_SMASK;
 +      if (!HFI1_CAP_IS_KSET(STATIC_RATE_CTRL))
 +              base_sdma_integrity |=
 +              SEND_DMA_CHECK_ENABLE_DISALLOW_PBC_STATIC_RATE_CONTROL_SMASK;
 +
 +      /* turn on send-side job key checks if !A0 */
 +      if (!is_ax(dd))
 +              base_sdma_integrity |=
 +                      SEND_DMA_CHECK_ENABLE_CHECK_JOB_KEY_SMASK;
 +
        return base_sdma_integrity;
  }
  
@@@ -1982,6 -2027,12 +2006,12 @@@ static inline u32 qsfp_resource(struct 
        return i2c_target(dd->hfi1_id);
  }
  
+ /* Is this device integrated or discrete? */
+ static inline bool is_integrated(struct hfi1_devdata *dd)
+ {
+       return dd->pcidev->device == PCI_DEVICE_ID_INTEL1;
+ }
  int hfi1_tempsense_rd(struct hfi1_devdata *dd, struct hfi1_temp *temp);
  
  #define DD_DEV_ENTRY(dd)       __string(dev, dev_name(&(dd)->pcidev->dev))
index d89b8745d4c1c3012e89c8355b3066bb116e26c9,64c9eeb52d86f5b9ded16e7a3e09c10b17990587..615be68e40b30eba1c73671cf381eaee260c0f6e
@@@ -668,12 -668,19 +668,12 @@@ void sc_set_cr_threshold(struct send_co
  void set_pio_integrity(struct send_context *sc)
  {
        struct hfi1_devdata *dd = sc->dd;
 -      u64 reg = 0;
        u32 hw_context = sc->hw_context;
        int type = sc->type;
  
 -      /*
 -       * No integrity checks if HFI1_CAP_NO_INTEGRITY is set, or if
 -       * we're snooping.
 -       */
 -      if (likely(!HFI1_CAP_IS_KSET(NO_INTEGRITY)) &&
 -          dd->hfi1_snoop.mode_flag != HFI1_PORT_SNOOP_MODE)
 -              reg = hfi1_pkt_default_send_ctxt_mask(dd, type);
 -
 -      write_kctxt_csr(dd, hw_context, SC(CHECK_ENABLE), reg);
 +      write_kctxt_csr(dd, hw_context,
 +                      SC(CHECK_ENABLE),
 +                      hfi1_pkt_default_send_ctxt_mask(dd, type));
  }
  
  static u32 get_buffers_allocated(struct send_context *sc)
@@@ -758,6 -765,7 +758,7 @@@ struct send_context *sc_alloc(struct hf
        sc->hw_context = hw_context;
        cr_group_addresses(sc, &dma);
        sc->credits = sci->credits;
+       sc->size = sc->credits * PIO_BLOCK_SIZE;
  
  /* PIO Send Memory Address details */
  #define PIO_ADDR_CONTEXT_MASK 0xfful
@@@ -1242,6 -1250,7 +1243,7 @@@ int sc_enable(struct send_context *sc
        sc->free = 0;
        sc->alloc_free = 0;
        sc->fill = 0;
+       sc->fill_wrap = 0;
        sc->sr_head = 0;
        sc->sr_tail = 0;
        sc->flags = 0;
@@@ -1385,7 -1394,7 +1387,7 @@@ struct pio_buf *sc_buffer_alloc(struct 
        unsigned long flags;
        unsigned long avail;
        unsigned long blocks = dwords_to_blocks(dw_len);
-       unsigned long start_fill;
+       u32 fill_wrap;
        int trycount = 0;
        u32 head, next;
  
@@@ -1410,9 -1419,7 +1412,7 @@@ retry
                        (sc->fill - sc->alloc_free);
                if (blocks > avail) {
                        /* still no room, actively update */
-                       spin_unlock_irqrestore(&sc->alloc_lock, flags);
                        sc_release_update(sc);
-                       spin_lock_irqsave(&sc->alloc_lock, flags);
                        sc->alloc_free = ACCESS_ONCE(sc->free);
                        trycount++;
                        goto retry;
        head = sc->sr_head;
  
        /* "allocate" the buffer */
-       start_fill = sc->fill;
        sc->fill += blocks;
+       fill_wrap = sc->fill_wrap;
+       sc->fill_wrap += blocks;
+       if (sc->fill_wrap >= sc->credits)
+               sc->fill_wrap = sc->fill_wrap - sc->credits;
  
        /*
         * Fill the parts that the releaser looks at before moving the head.
        spin_unlock_irqrestore(&sc->alloc_lock, flags);
  
        /* finish filling in the buffer outside the lock */
-       pbuf->start = sc->base_addr + ((start_fill % sc->credits)
-                                                       * PIO_BLOCK_SIZE);
-       pbuf->size = sc->credits * PIO_BLOCK_SIZE;
-       pbuf->end = sc->base_addr + pbuf->size;
-       pbuf->block_count = blocks;
+       pbuf->start = sc->base_addr + fill_wrap * PIO_BLOCK_SIZE;
+       pbuf->end = sc->base_addr + sc->size;
        pbuf->qw_written = 0;
        pbuf->carry_bytes = 0;
        pbuf->carry.val64 = 0;
@@@ -1573,6 -1580,7 +1573,7 @@@ static void sc_piobufavail(struct send_
                qp = iowait_to_qp(wait);
                priv = qp->priv;
                list_del_init(&priv->s_iowait.list);
+               priv->s_iowait.lock = NULL;
                /* refcount held until actual wake up */
                qps[n++] = qp;
        }
@@@ -2028,29 -2036,17 +2029,17 @@@ freesc15
  int init_credit_return(struct hfi1_devdata *dd)
  {
        int ret;
-       int num_numa;
        int i;
  
-       num_numa = num_online_nodes();
-       /* enforce the expectation that the numas are compact */
-       for (i = 0; i < num_numa; i++) {
-               if (!node_online(i)) {
-                       dd_dev_err(dd, "NUMA nodes are not compact\n");
-                       ret = -EINVAL;
-                       goto done;
-               }
-       }
        dd->cr_base = kcalloc(
-               num_numa,
+               node_affinity.num_possible_nodes,
                sizeof(struct credit_return_base),
                GFP_KERNEL);
        if (!dd->cr_base) {
-               dd_dev_err(dd, "Unable to allocate credit return base\n");
                ret = -ENOMEM;
                goto done;
        }
-       for (i = 0; i < num_numa; i++) {
+       for_each_node_with_cpus(i) {
                int bytes = TXE_NUM_CONTEXTS * sizeof(struct credit_return);
  
                set_dev_node(&dd->pcidev->dev, i);
@@@ -2077,14 -2073,11 +2066,11 @@@ done
  
  void free_credit_return(struct hfi1_devdata *dd)
  {
-       int num_numa;
        int i;
  
        if (!dd->cr_base)
                return;
-       num_numa = num_online_nodes();
-       for (i = 0; i < num_numa; i++) {
+       for (i = 0; i < node_affinity.num_possible_nodes; i++) {
                if (dd->cr_base[i].va) {
                        dma_free_coherent(&dd->pcidev->dev,
                                          TXE_NUM_CONTEXTS *
index 83198a8a87979baeeb58c591fba0e4d06db6e014,9db260fe782a8b3350620d6d619d044a08bd80d2..809b26eb6d3cbba22fe902051a42986a012cf35d
@@@ -89,7 -89,7 +89,7 @@@ void hfi1_add_rnr_timer(struct rvt_qp *
  
        lockdep_assert_held(&qp->s_lock);
        qp->s_flags |= RVT_S_WAIT_RNR;
 -      qp->s_timer.expires = jiffies + usecs_to_jiffies(to);
 +      priv->s_rnr_timer.expires = jiffies + usecs_to_jiffies(to);
        add_timer(&priv->s_rnr_timer);
  }
  
@@@ -276,7 -276,7 +276,7 @@@ static int make_rc_ack(struct hfi1_ibde
                                rvt_get_mr(ps->s_txreq->mr);
                        qp->s_ack_rdma_sge.sge = e->rdma_sge;
                        qp->s_ack_rdma_sge.num_sge = 1;
-                       qp->s_cur_sge = &qp->s_ack_rdma_sge;
+                       ps->s_txreq->ss = &qp->s_ack_rdma_sge;
                        if (len > pmtu) {
                                len = pmtu;
                                qp->s_ack_state = OP(RDMA_READ_RESPONSE_FIRST);
                        bth2 = mask_psn(qp->s_ack_rdma_psn++);
                } else {
                        /* COMPARE_SWAP or FETCH_ADD */
-                       qp->s_cur_sge = NULL;
+                       ps->s_txreq->ss = NULL;
                        len = 0;
                        qp->s_ack_state = OP(ATOMIC_ACKNOWLEDGE);
                        ohdr->u.at.aeth = hfi1_compute_aeth(qp);
                qp->s_ack_state = OP(RDMA_READ_RESPONSE_MIDDLE);
                /* FALLTHROUGH */
        case OP(RDMA_READ_RESPONSE_MIDDLE):
-               qp->s_cur_sge = &qp->s_ack_rdma_sge;
+               ps->s_txreq->ss = &qp->s_ack_rdma_sge;
                ps->s_txreq->mr = qp->s_ack_rdma_sge.sge.mr;
                if (ps->s_txreq->mr)
                        rvt_get_mr(ps->s_txreq->mr);
@@@ -335,7 -335,7 +335,7 @@@ normal
                 */
                qp->s_ack_state = OP(SEND_ONLY);
                qp->s_flags &= ~RVT_S_ACK_PENDING;
-               qp->s_cur_sge = NULL;
+               ps->s_txreq->ss = NULL;
                if (qp->s_nak_state)
                        ohdr->u.aeth =
                                cpu_to_be32((qp->r_msn & HFI1_MSN_MASK) |
        qp->s_rdma_ack_cnt++;
        qp->s_hdrwords = hwords;
        ps->s_txreq->sde = priv->s_sde;
-       qp->s_cur_size = len;
+       ps->s_txreq->s_cur_size = len;
        hfi1_make_ruc_header(qp, ohdr, bth0, bth2, middle, ps);
        /* pbc */
        ps->s_txreq->hdr_dwords = qp->s_hdrwords + 2;
@@@ -801,8 -801,8 +801,8 @@@ int hfi1_make_rc_req(struct rvt_qp *qp
        qp->s_len -= len;
        qp->s_hdrwords = hwords;
        ps->s_txreq->sde = priv->s_sde;
-       qp->s_cur_sge = ss;
-       qp->s_cur_size = len;
+       ps->s_txreq->ss = ss;
+       ps->s_txreq->s_cur_size = len;
        hfi1_make_ruc_header(
                qp,
                ohdr,
@@@ -1146,8 -1146,6 +1146,6 @@@ void hfi1_rc_send_complete(struct rvt_q
  {
        struct ib_other_headers *ohdr;
        struct rvt_swqe *wqe;
-       struct ib_wc wc;
-       unsigned i;
        u32 opcode;
        u32 psn;
  
                qp->s_last = s_last;
                /* see post_send() */
                barrier();
-               for (i = 0; i < wqe->wr.num_sge; i++) {
-                       struct rvt_sge *sge = &wqe->sg_list[i];
-                       rvt_put_mr(sge->mr);
-               }
-               /* Post a send completion queue entry if requested. */
-               if (!(qp->s_flags & RVT_S_SIGNAL_REQ_WR) ||
-                   (wqe->wr.send_flags & IB_SEND_SIGNALED)) {
-                       memset(&wc, 0, sizeof(wc));
-                       wc.wr_id = wqe->wr.wr_id;
-                       wc.status = IB_WC_SUCCESS;
-                       wc.opcode = ib_hfi1_wc_opcode[wqe->wr.opcode];
-                       wc.byte_len = wqe->length;
-                       wc.qp = &qp->ibqp;
-                       rvt_cq_enter(ibcq_to_rvtcq(qp->ibqp.send_cq), &wc, 0);
-               }
+               rvt_put_swqe(wqe);
+               rvt_qp_swqe_complete(qp, wqe, IB_WC_SUCCESS);
        }
        /*
         * If we were waiting for sends to complete before re-sending,
@@@ -1240,9 -1224,6 +1224,6 @@@ static struct rvt_swqe *do_rc_completio
                                         struct rvt_swqe *wqe,
                                         struct hfi1_ibport *ibp)
  {
-       struct ib_wc wc;
-       unsigned i;
        lockdep_assert_held(&qp->s_lock);
        /*
         * Don't decrement refcount and don't generate a
            cmp_psn(qp->s_sending_psn, qp->s_sending_hpsn) > 0) {
                u32 s_last;
  
-               for (i = 0; i < wqe->wr.num_sge; i++) {
-                       struct rvt_sge *sge = &wqe->sg_list[i];
-                       rvt_put_mr(sge->mr);
-               }
+               rvt_put_swqe(wqe);
                s_last = qp->s_last;
                if (++s_last >= qp->s_size)
                        s_last = 0;
                qp->s_last = s_last;
                /* see post_send() */
                barrier();
-               /* Post a send completion queue entry if requested. */
-               if (!(qp->s_flags & RVT_S_SIGNAL_REQ_WR) ||
-                   (wqe->wr.send_flags & IB_SEND_SIGNALED)) {
-                       memset(&wc, 0, sizeof(wc));
-                       wc.wr_id = wqe->wr.wr_id;
-                       wc.status = IB_WC_SUCCESS;
-                       wc.opcode = ib_hfi1_wc_opcode[wqe->wr.opcode];
-                       wc.byte_len = wqe->length;
-                       wc.qp = &qp->ibqp;
-                       rvt_cq_enter(ibcq_to_rvtcq(qp->ibqp.send_cq), &wc, 0);
-               }
+               rvt_qp_swqe_complete(qp, wqe, IB_WC_SUCCESS);
        } else {
                struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
  
@@@ -2295,7 -2262,7 +2262,7 @@@ send_last
                hfi1_copy_sge(&qp->r_sge, data, tlen, 1, copy_last);
                rvt_put_ss(&qp->r_sge);
                qp->r_msn++;
-               if (!test_and_clear_bit(RVT_R_WRID_VALID, &qp->r_aflags))
+               if (!__test_and_clear_bit(RVT_R_WRID_VALID, &qp->r_aflags))
                        break;
                wc.wr_id = qp->r_wr_id;
                wc.status = IB_WC_SUCCESS;
                         * Update the next expected PSN.  We add 1 later
                         * below, so only add the remainder here.
                         */
-                       if (len > pmtu)
-                               qp->r_psn += (len - 1) / pmtu;
+                       qp->r_psn += rvt_div_mtu(qp, len - 1);
                } else {
                        e->rdma_sge.mr = NULL;
                        e->rdma_sge.vaddr = NULL;
index 9cbe52d210778fdce2b3a5ad66d8e06dac801637,7102a076146d7fc189d1c744eb66b9da119f878a..1d81cac1fa6c836faceb97145da095688e4cf2cb
@@@ -375,7 -375,7 +375,7 @@@ static inline void complete_tx(struct s
                           sde->head_sn, tx->sn);
        sde->head_sn++;
  #endif
-       sdma_txclean(sde->dd, tx);
+       __sdma_txclean(sde->dd, tx);
        if (complete)
                (*complete)(tx, res);
        if (wait && iowait_sdma_dec(wait))
@@@ -1643,7 -1643,7 +1643,7 @@@ static inline u8 ahg_mode(struct sdma_t
  }
  
  /**
-  * sdma_txclean() - clean tx of mappings, descp *kmalloc's
+  * __sdma_txclean() - clean tx of mappings, descp *kmalloc's
   * @dd: hfi1_devdata for unmapping
   * @tx: tx request to clean
   *
   * The code can be called multiple times without issue.
   *
   */
- void sdma_txclean(
+ void __sdma_txclean(
        struct hfi1_devdata *dd,
        struct sdma_txreq *tx)
  {
@@@ -2009,6 -2009,11 +2009,6 @@@ static void sdma_hw_start_up(struct sdm
        write_sde_csr(sde, SD(ENG_ERR_CLEAR), reg);
  }
  
 -#define CLEAR_STATIC_RATE_CONTROL_SMASK(r) \
 -(r &= ~SEND_DMA_CHECK_ENABLE_DISALLOW_PBC_STATIC_RATE_CONTROL_SMASK)
 -
 -#define SET_STATIC_RATE_CONTROL_SMASK(r) \
 -(r |= SEND_DMA_CHECK_ENABLE_DISALLOW_PBC_STATIC_RATE_CONTROL_SMASK)
  /*
   * set_sdma_integrity
   *
  static void set_sdma_integrity(struct sdma_engine *sde)
  {
        struct hfi1_devdata *dd = sde->dd;
 -      u64 reg;
 -
 -      if (unlikely(HFI1_CAP_IS_KSET(NO_INTEGRITY)))
 -              return;
 -
 -      reg = hfi1_pkt_base_sdma_integrity(dd);
 -
 -      if (HFI1_CAP_IS_KSET(STATIC_RATE_CTRL))
 -              CLEAR_STATIC_RATE_CONTROL_SMASK(reg);
 -      else
 -              SET_STATIC_RATE_CONTROL_SMASK(reg);
  
 -      write_sde_csr(sde, SD(CHECK_ENABLE), reg);
 +      write_sde_csr(sde, SD(CHECK_ENABLE),
 +                    hfi1_pkt_base_sdma_integrity(dd));
  }
  
  static void init_sdma_regs(
@@@ -3065,7 -3080,7 +3065,7 @@@ static int _extend_sdma_tx_descs(struc
                tx->descp[i] = tx->descs[i];
        return 0;
  enomem:
-       sdma_txclean(dd, tx);
+       __sdma_txclean(dd, tx);
        return -ENOMEM;
  }
  
@@@ -3094,14 -3109,14 +3094,14 @@@ int ext_coal_sdma_tx_descs(struct hfi1_
  
        rval = _extend_sdma_tx_descs(dd, tx);
        if (rval) {
-               sdma_txclean(dd, tx);
+               __sdma_txclean(dd, tx);
                return rval;
        }
  
        /* If coalesce buffer is allocated, copy data into it */
        if (tx->coalesce_buf) {
                if (type == SDMA_MAP_NONE) {
-                       sdma_txclean(dd, tx);
+                       __sdma_txclean(dd, tx);
                        return -EINVAL;
                }
  
                        kvaddr = kmap(page);
                        kvaddr += offset;
                } else if (WARN_ON(!kvaddr)) {
-                       sdma_txclean(dd, tx);
+                       __sdma_txclean(dd, tx);
                        return -EINVAL;
                }
  
                                      DMA_TO_DEVICE);
  
                if (unlikely(dma_mapping_error(&dd->pcidev->dev, addr))) {
-                       sdma_txclean(dd, tx);
+                       __sdma_txclean(dd, tx);
                        return -ENOSPC;
                }
  
@@@ -3181,7 -3196,7 +3181,7 @@@ int _pad_sdma_tx_descs(struct hfi1_devd
        if ((unlikely(tx->num_desc == tx->desc_limit))) {
                rval = _extend_sdma_tx_descs(dd, tx);
                if (rval) {
-                       sdma_txclean(dd, tx);
+                       __sdma_txclean(dd, tx);
                        return rval;
                }
        }
index 77697d690f3eb12add14aed6a9fe19dafd498601,663980ef01a8876942622b1c86f01c9dd219c2c2..7d22f8ee98ef401e901ebccee262a1082ce0bc3b
@@@ -115,6 -115,7 +115,7 @@@ MODULE_PARM_DESC(sdma_comp_size, "Size 
  #define KDETH_HCRC_LOWER_MASK     0xff
  
  #define AHG_KDETH_INTR_SHIFT 12
+ #define AHG_KDETH_SH_SHIFT   13
  
  #define PBC2LRH(x) ((((x) & 0xfff) << 2) - 4)
  #define LRH2PBC(x) ((((x) >> 2) + 1) & 0xfff)
  #define KDETH_OM_LARGE     64
  #define KDETH_OM_MAX_SIZE  (1 << ((KDETH_OM_LARGE / KDETH_OM_SMALL) + 1))
  
- /* Last packet in the request */
- #define TXREQ_FLAGS_REQ_LAST_PKT BIT(0)
+ /* Tx request flag bits */
+ #define TXREQ_FLAGS_REQ_ACK   BIT(0)      /* Set the ACK bit in the header */
+ #define TXREQ_FLAGS_REQ_DISABLE_SH BIT(1) /* Disable header suppression */
  
  /* SDMA request flag bits */
  #define SDMA_REQ_FOR_THREAD 1
@@@ -943,8 -945,13 +945,13 @@@ static int user_sdma_send_pkts(struct u
                tx->busycount = 0;
                INIT_LIST_HEAD(&tx->list);
  
+               /*
+                * For the last packet set the ACK request
+                * and disable header suppression.
+                */
                if (req->seqnum == req->info.npkts - 1)
-                       tx->flags |= TXREQ_FLAGS_REQ_LAST_PKT;
+                       tx->flags |= (TXREQ_FLAGS_REQ_ACK |
+                                     TXREQ_FLAGS_REQ_DISABLE_SH);
  
                /*
                 * Calculate the payload size - this is min of the fragment
                        }
  
                        datalen = compute_data_length(req, tx);
+                       /*
+                        * Disable header suppression for the payload <= 8DWS.
+                        * If there is an uncorrectable error in the receive
+                        * data FIFO when the received payload size is less than
+                        * or equal to 8DWS then the RxDmaDataFifoRdUncErr is
+                        * not reported.There is set RHF.EccErr if the header
+                        * is not suppressed.
+                        */
                        if (!datalen) {
                                SDMA_DBG(req,
                                         "Request has data but pkt len is 0");
                                ret = -EFAULT;
                                goto free_tx;
+                       } else if (datalen <= 32) {
+                               tx->flags |= TXREQ_FLAGS_REQ_DISABLE_SH;
                        }
                }
  
                                                LRH2PBC(lrhlen);
                                        tx->hdr.pbc[0] = cpu_to_le16(pbclen);
                                }
+                               ret = check_header_template(req, &tx->hdr,
+                                                           lrhlen, datalen);
+                               if (ret)
+                                       goto free_tx;
                                ret = sdma_txinit_ahg(&tx->txreq,
                                                      SDMA_TXREQ_F_AHG_COPY,
                                                      sizeof(tx->hdr) + datalen,
@@@ -1144,7 -1166,7 +1166,7 @@@ static int pin_vector_pages(struct user
        rb_node = hfi1_mmu_rb_extract(pq->handler,
                                      (unsigned long)iovec->iov.iov_base,
                                      iovec->iov.iov_len);
 -      if (rb_node && !IS_ERR(rb_node))
 +      if (rb_node)
                node = container_of(rb_node, struct sdma_mmu_node, rb);
        else
                rb_node = NULL;
@@@ -1351,7 -1373,7 +1373,7 @@@ static int set_txreq_header(struct user
                                req->seqnum));
  
        /* Set ACK request on last packet */
-       if (unlikely(tx->flags & TXREQ_FLAGS_REQ_LAST_PKT))
+       if (unlikely(tx->flags & TXREQ_FLAGS_REQ_ACK))
                hdr->bth[2] |= cpu_to_be32(1UL << 31);
  
        /* Set the new offset */
                /* Set KDETH.TID based on value for this TID */
                KDETH_SET(hdr->kdeth.ver_tid_offset, TID,
                          EXP_TID_GET(tidval, IDX));
-               /* Clear KDETH.SH only on the last packet */
-               if (unlikely(tx->flags & TXREQ_FLAGS_REQ_LAST_PKT))
+               /* Clear KDETH.SH when DISABLE_SH flag is set */
+               if (unlikely(tx->flags & TXREQ_FLAGS_REQ_DISABLE_SH))
                        KDETH_SET(hdr->kdeth.ver_tid_offset, SH, 0);
                /*
                 * Set the KDETH.OFFSET and KDETH.OM based on size of
@@@ -1429,7 -1451,7 +1451,7 @@@ static int set_txreq_header_ahg(struct 
        /* BTH.PSN and BTH.A */
        val32 = (be32_to_cpu(hdr->bth[2]) + req->seqnum) &
                (HFI1_CAP_IS_KSET(EXTENDED_PSN) ? 0x7fffffff : 0xffffff);
-       if (unlikely(tx->flags & TXREQ_FLAGS_REQ_LAST_PKT))
+       if (unlikely(tx->flags & TXREQ_FLAGS_REQ_ACK))
                val32 |= 1UL << 31;
        AHG_HEADER_SET(req->ahg, diff, 6, 0, 16, cpu_to_be16(val32 >> 16));
        AHG_HEADER_SET(req->ahg, diff, 6, 16, 16, cpu_to_be16(val32 & 0xffff));
                AHG_HEADER_SET(req->ahg, diff, 7, 0, 16,
                               ((!!(req->omfactor - KDETH_OM_SMALL)) << 15 |
                                ((req->tidoffset / req->omfactor) & 0x7fff)));
-               /* KDETH.TIDCtrl, KDETH.TID */
+               /* KDETH.TIDCtrl, KDETH.TID, KDETH.Intr, KDETH.SH */
                val = cpu_to_le16(((EXP_TID_GET(tidval, CTRL) & 0x3) << 10) |
-                                       (EXP_TID_GET(tidval, IDX) & 0x3ff));
-               /* Clear KDETH.SH on last packet */
-               if (unlikely(tx->flags & TXREQ_FLAGS_REQ_LAST_PKT)) {
-                       val |= cpu_to_le16(KDETH_GET(hdr->kdeth.ver_tid_offset,
-                                                    INTR) <<
-                                          AHG_KDETH_INTR_SHIFT);
-                       val &= cpu_to_le16(~(1U << 13));
-                       AHG_HEADER_SET(req->ahg, diff, 7, 16, 14, val);
+                                  (EXP_TID_GET(tidval, IDX) & 0x3ff));
+               if (unlikely(tx->flags & TXREQ_FLAGS_REQ_DISABLE_SH)) {
+                       val |= cpu_to_le16((KDETH_GET(hdr->kdeth.ver_tid_offset,
+                                                     INTR) <<
+                                           AHG_KDETH_INTR_SHIFT));
                } else {
-                       AHG_HEADER_SET(req->ahg, diff, 7, 16, 12, val);
+                       val |= KDETH_GET(hdr->kdeth.ver_tid_offset, SH) ?
+                              cpu_to_le16(0x1 << AHG_KDETH_SH_SHIFT) :
+                              cpu_to_le16((KDETH_GET(hdr->kdeth.ver_tid_offset,
+                                                     INTR) <<
+                                            AHG_KDETH_INTR_SHIFT));
                }
+               AHG_HEADER_SET(req->ahg, diff, 7, 16, 14, val);
        }
  
        trace_hfi1_sdma_user_header_ahg(pq->dd, pq->ctxt, pq->subctxt,
index b9bf0759f10a54f37e242b8d07c54c56a063e859,20c6d17ac8b828312325053d0f25e9eedc27fae3..077c33d2dc751696941ba9bf6214b300580ad683
@@@ -102,10 -102,7 +102,10 @@@ static struct ib_ah *create_iboe_ah(str
        if (vlan_tag < 0x1000)
                vlan_tag |= (ah_attr->sl & 7) << 13;
        ah->av.eth.port_pd = cpu_to_be32(to_mpd(pd)->pdn | (ah_attr->port_num << 24));
 -      ah->av.eth.gid_index = mlx4_ib_gid_index_to_real_index(ibdev, ah_attr->port_num, ah_attr->grh.sgid_index);
 +      ret = mlx4_ib_gid_index_to_real_index(ibdev, ah_attr->port_num, ah_attr->grh.sgid_index);
 +      if (ret < 0)
 +              return ERR_PTR(ret);
 +      ah->av.eth.gid_index = ret;
        ah->av.eth.vlan = cpu_to_be16(vlan_tag);
        ah->av.eth.hop_limit = ah_attr->grh.hop_limit;
        if (ah_attr->static_rate) {
                       !(1 << ah->av.eth.stat_rate & dev->caps.stat_rate_support))
                        --ah->av.eth.stat_rate;
        }
+       ah->av.eth.sl_tclass_flowlabel |=
+                       cpu_to_be32((ah_attr->grh.traffic_class << 20) |
+                                   ah_attr->grh.flow_label);
        /*
         * HW requires multicast LID so we just choose one.
         */
                ah->av.ib.dlid = cpu_to_be16(0xc000);
  
        memcpy(ah->av.eth.dgid, ah_attr->grh.dgid.raw, 16);
-       ah->av.eth.sl_tclass_flowlabel = cpu_to_be32(ah_attr->sl << 29);
+       ah->av.eth.sl_tclass_flowlabel |= cpu_to_be32(ah_attr->sl << 29);
  
        return &ah->ibah;
  }
  
- struct ib_ah *mlx4_ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr)
+ struct ib_ah *mlx4_ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr,
+                               struct ib_udata *udata)
  {
        struct mlx4_ib_ah *ah;
        struct ib_ah *ret;
index fcd04b881ec1924eb679827e18c0a2f8f6f3fd39,d72a4367c891502bf92274c719d41353fdcc5071..b3ef47c3ab732a9588cd79f8d5ac2f24c68366ac
@@@ -731,7 -731,7 +731,7 @@@ static int create_cq_user(struct mlx5_i
                          int entries, u32 **cqb,
                          int *cqe_size, int *index, int *inlen)
  {
-       struct mlx5_ib_create_cq ucmd;
+       struct mlx5_ib_create_cq ucmd = {};
        size_t ucmdlen;
        int page_shift;
        __be64 *pas;
        if (err)
                goto err_umem;
  
-       mlx5_ib_cont_pages(cq->buf.umem, ucmd.buf_addr, &npages, &page_shift,
+       mlx5_ib_cont_pages(cq->buf.umem, ucmd.buf_addr, 0, &npages, &page_shift,
                           &ncont, NULL);
        mlx5_ib_dbg(dev, "addr 0x%llx, size %u, npages %d, page_shift %d, ncont %d\n",
                    ucmd.buf_addr, entries * ucmd.cqe_size, npages, page_shift, ncont);
  
        *index = to_mucontext(context)->uuari.uars[0].index;
  
+       if (ucmd.cqe_comp_en == 1) {
+               if (unlikely((*cqe_size != 64) ||
+                            !MLX5_CAP_GEN(dev->mdev, cqe_compression))) {
+                       err = -EOPNOTSUPP;
+                       mlx5_ib_warn(dev, "CQE compression is not supported for size %d!\n",
+                                    *cqe_size);
+                       goto err_cqb;
+               }
+               if (unlikely(!ucmd.cqe_comp_res_format ||
+                            !(ucmd.cqe_comp_res_format <
+                              MLX5_IB_CQE_RES_RESERVED) ||
+                            (ucmd.cqe_comp_res_format &
+                             (ucmd.cqe_comp_res_format - 1)))) {
+                       err = -EOPNOTSUPP;
+                       mlx5_ib_warn(dev, "CQE compression res format %d is not supported!\n",
+                                    ucmd.cqe_comp_res_format);
+                       goto err_cqb;
+               }
+               MLX5_SET(cqc, cqc, cqe_comp_en, 1);
+               MLX5_SET(cqc, cqc, mini_cqe_res_format,
+                        ilog2(ucmd.cqe_comp_res_format));
+       }
        return 0;
  
+ err_cqb:
+       kfree(cqb);
  err_db:
        mlx5_ib_db_unmap_user(to_mucontext(context), &cq->db);
  
@@@ -932,7 -960,8 +960,7 @@@ struct ib_cq *mlx5_ib_create_cq(struct 
                if (err)
                        goto err_create;
        } else {
 -              /* for now choose 64 bytes till we have a proper interface */
 -              cqe_size = 64;
 +              cqe_size = cache_line_size() == 128 ? 128 : 64;
                err = create_cq_kernel(dev, cq, entries, cqe_size, &cqb,
                                       &index, &inlen);
                if (err)
@@@ -1124,7 -1153,7 +1152,7 @@@ static int resize_user(struct mlx5_ib_d
                return err;
        }
  
-       mlx5_ib_cont_pages(umem, ucmd.buf_addr, &npages, page_shift,
+       mlx5_ib_cont_pages(umem, ucmd.buf_addr, 0, &npages, page_shift,
                           npas, NULL);
  
        cq->resize_umem = umem;
index 2be65ddf56ba8ba311cce5497258caf030bfc47a,b81736d625fc554cb70ea3da28bb389e85a78f93..d566f673883348f58a2d9b0672313aa5560af80c
@@@ -127,7 -127,7 +127,7 @@@ static int mlx5_netdev_event(struct not
  
                if ((upper == ndev || (!upper && ndev == ibdev->roce.netdev))
                    && ibdev->ib_active) {
-                       struct ib_event ibev = {0};
+                       struct ib_event ibev = { };
  
                        ibev.device = &ibdev->ib_dev;
                        ibev.event = (event == NETDEV_UP) ?
@@@ -496,6 -496,7 +496,7 @@@ static int mlx5_ib_query_device(struct 
        struct mlx5_ib_dev *dev = to_mdev(ibdev);
        struct mlx5_core_dev *mdev = dev->mdev;
        int err = -ENOMEM;
+       int max_sq_desc;
        int max_rq_sg;
        int max_sq_sg;
        u64 min_page_size = 1ull << MLX5_CAP_GEN(mdev, log_pg_sz);
        props->max_qp_wr           = 1 << MLX5_CAP_GEN(mdev, log_max_qp_sz);
        max_rq_sg =  MLX5_CAP_GEN(mdev, max_wqe_sz_rq) /
                     sizeof(struct mlx5_wqe_data_seg);
-       max_sq_sg = (MLX5_CAP_GEN(mdev, max_wqe_sz_sq) -
-                    sizeof(struct mlx5_wqe_ctrl_seg)) /
-                    sizeof(struct mlx5_wqe_data_seg);
+       max_sq_desc = min_t(int, MLX5_CAP_GEN(mdev, max_wqe_sz_sq), 512);
+       max_sq_sg = (max_sq_desc - sizeof(struct mlx5_wqe_ctrl_seg) -
+                    sizeof(struct mlx5_wqe_raddr_seg)) /
+               sizeof(struct mlx5_wqe_data_seg);
        props->max_sge = min(max_rq_sg, max_sq_sg);
        props->max_sge_rd          = MLX5_MAX_SGE_RD;
        props->max_cq              = 1 << MLX5_CAP_GEN(mdev, log_max_cq);
        props->max_total_mcast_qp_attach = props->max_mcast_qp_attach *
                                           props->max_mcast_grp;
        props->max_map_per_fmr = INT_MAX; /* no limit in ConnectIB */
+       props->max_ah = INT_MAX;
        props->hca_core_clock = MLX5_CAP_GEN(mdev, device_frequency_khz);
        props->timestamp_mask = 0x7FFFFFFFFFFFFFFFULL;
  
                        1 << MLX5_CAP_GEN(dev->mdev, log_max_rq);
        }
  
+       if (field_avail(typeof(resp), mlx5_ib_support_multi_pkt_send_wqes,
+                       uhw->outlen)) {
+               resp.mlx5_ib_support_multi_pkt_send_wqes =
+                       MLX5_CAP_ETH(mdev, multi_pkt_send_wqe);
+               resp.response_length +=
+                       sizeof(resp.mlx5_ib_support_multi_pkt_send_wqes);
+       }
+       if (field_avail(typeof(resp), reserved, uhw->outlen))
+               resp.response_length += sizeof(resp.reserved);
+       if (field_avail(typeof(resp), cqe_comp_caps, uhw->outlen)) {
+               resp.cqe_comp_caps.max_num =
+                       MLX5_CAP_GEN(dev->mdev, cqe_compression) ?
+                       MLX5_CAP_GEN(dev->mdev, cqe_compression_max_num) : 0;
+               resp.cqe_comp_caps.supported_format =
+                       MLX5_IB_CQE_RES_FORMAT_HASH |
+                       MLX5_IB_CQE_RES_FORMAT_CSUM;
+               resp.response_length += sizeof(resp.cqe_comp_caps);
+       }
+       if (field_avail(typeof(resp), packet_pacing_caps, uhw->outlen)) {
+               if (MLX5_CAP_QOS(mdev, packet_pacing) &&
+                   MLX5_CAP_GEN(mdev, qos)) {
+                       resp.packet_pacing_caps.qp_rate_limit_max =
+                               MLX5_CAP_QOS(mdev, packet_pacing_max_rate);
+                       resp.packet_pacing_caps.qp_rate_limit_min =
+                               MLX5_CAP_QOS(mdev, packet_pacing_min_rate);
+                       resp.packet_pacing_caps.supported_qpts |=
+                               1 << IB_QPT_RAW_PACKET;
+               }
+               resp.response_length += sizeof(resp.packet_pacing_caps);
+       }
        if (uhw->outlen) {
                err = ib_copy_to_udata(uhw, &resp, resp.response_length);
  
@@@ -1019,7 -1056,7 +1056,7 @@@ static struct ib_ucontext *mlx5_ib_allo
        resp.qp_tab_size = 1 << MLX5_CAP_GEN(dev->mdev, log_max_qp);
        if (mlx5_core_is_pf(dev->mdev) && MLX5_CAP_GEN(dev->mdev, bf))
                resp.bf_reg_size = 1 << MLX5_CAP_GEN(dev->mdev, log_bf_reg_size);
 -      resp.cache_line_size = L1_CACHE_BYTES;
 +      resp.cache_line_size = cache_line_size();
        resp.max_sq_desc_sz = MLX5_CAP_GEN(dev->mdev, max_wqe_sz_sq);
        resp.max_rq_desc_sz = MLX5_CAP_GEN(dev->mdev, max_wqe_sz_rq);
        resp.max_send_wqebb = 1 << MLX5_CAP_GEN(dev->mdev, log_max_qp_sz);
                resp.response_length += sizeof(resp.cqe_version);
  
        if (field_avail(typeof(resp), cmds_supp_uhw, udata->outlen)) {
-               resp.cmds_supp_uhw |= MLX5_USER_CMDS_SUPP_UHW_QUERY_DEVICE;
+               resp.cmds_supp_uhw |= MLX5_USER_CMDS_SUPP_UHW_QUERY_DEVICE |
+                                     MLX5_USER_CMDS_SUPP_UHW_CREATE_AH;
                resp.response_length += sizeof(resp.cmds_supp_uhw);
        }
  
@@@ -1502,6 -1540,22 +1540,22 @@@ static void set_proto(void *outer_c, vo
        MLX5_SET(fte_match_set_lyr_2_4, outer_v, ip_protocol, val);
  }
  
+ static void set_flow_label(void *misc_c, void *misc_v, u8 mask, u8 val,
+                          bool inner)
+ {
+       if (inner) {
+               MLX5_SET(fte_match_set_misc,
+                        misc_c, inner_ipv6_flow_label, mask);
+               MLX5_SET(fte_match_set_misc,
+                        misc_v, inner_ipv6_flow_label, val);
+       } else {
+               MLX5_SET(fte_match_set_misc,
+                        misc_c, outer_ipv6_flow_label, mask);
+               MLX5_SET(fte_match_set_misc,
+                        misc_v, outer_ipv6_flow_label, val);
+       }
+ }
  static void set_tos(void *outer_c, void *outer_v, u8 mask, u8 val)
  {
        MLX5_SET(fte_match_set_lyr_2_4, outer_c, ip_ecn, mask);
  #define LAST_IPV4_FIELD tos
  #define LAST_IPV6_FIELD traffic_class
  #define LAST_TCP_UDP_FIELD src_port
+ #define LAST_TUNNEL_FIELD tunnel_id
  
  /* Field is the last supported field */
  #define FIELDS_NOT_SUPPORTED(filter, field)\
  static int parse_flow_attr(u32 *match_c, u32 *match_v,
                           const union ib_flow_spec *ib_spec)
  {
-       void *outer_headers_c = MLX5_ADDR_OF(fte_match_param, match_c,
-                                            outer_headers);
-       void *outer_headers_v = MLX5_ADDR_OF(fte_match_param, match_v,
-                                            outer_headers);
        void *misc_params_c = MLX5_ADDR_OF(fte_match_param, match_c,
                                           misc_parameters);
        void *misc_params_v = MLX5_ADDR_OF(fte_match_param, match_v,
                                           misc_parameters);
+       void *headers_c;
+       void *headers_v;
+       if (ib_spec->type & IB_FLOW_SPEC_INNER) {
+               headers_c = MLX5_ADDR_OF(fte_match_param, match_c,
+                                        inner_headers);
+               headers_v = MLX5_ADDR_OF(fte_match_param, match_v,
+                                        inner_headers);
+       } else {
+               headers_c = MLX5_ADDR_OF(fte_match_param, match_c,
+                                        outer_headers);
+               headers_v = MLX5_ADDR_OF(fte_match_param, match_v,
+                                        outer_headers);
+       }
  
-       switch (ib_spec->type) {
+       switch (ib_spec->type & ~IB_FLOW_SPEC_INNER) {
        case IB_FLOW_SPEC_ETH:
                if (FIELDS_NOT_SUPPORTED(ib_spec->eth.mask, LAST_ETH_FIELD))
                        return -ENOTSUPP;
  
-               ether_addr_copy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, outer_headers_c,
+               ether_addr_copy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_c,
                                             dmac_47_16),
                                ib_spec->eth.mask.dst_mac);
-               ether_addr_copy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, outer_headers_v,
+               ether_addr_copy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v,
                                             dmac_47_16),
                                ib_spec->eth.val.dst_mac);
  
-               ether_addr_copy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, outer_headers_c,
+               ether_addr_copy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_c,
                                             smac_47_16),
                                ib_spec->eth.mask.src_mac);
-               ether_addr_copy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, outer_headers_v,
+               ether_addr_copy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v,
                                             smac_47_16),
                                ib_spec->eth.val.src_mac);
  
                if (ib_spec->eth.mask.vlan_tag) {
-                       MLX5_SET(fte_match_set_lyr_2_4, outer_headers_c,
+                       MLX5_SET(fte_match_set_lyr_2_4, headers_c,
                                 vlan_tag, 1);
-                       MLX5_SET(fte_match_set_lyr_2_4, outer_headers_v,
+                       MLX5_SET(fte_match_set_lyr_2_4, headers_v,
                                 vlan_tag, 1);
  
-                       MLX5_SET(fte_match_set_lyr_2_4, outer_headers_c,
+                       MLX5_SET(fte_match_set_lyr_2_4, headers_c,
                                 first_vid, ntohs(ib_spec->eth.mask.vlan_tag));
-                       MLX5_SET(fte_match_set_lyr_2_4, outer_headers_v,
+                       MLX5_SET(fte_match_set_lyr_2_4, headers_v,
                                 first_vid, ntohs(ib_spec->eth.val.vlan_tag));
  
-                       MLX5_SET(fte_match_set_lyr_2_4, outer_headers_c,
+                       MLX5_SET(fte_match_set_lyr_2_4, headers_c,
                                 first_cfi,
                                 ntohs(ib_spec->eth.mask.vlan_tag) >> 12);
-                       MLX5_SET(fte_match_set_lyr_2_4, outer_headers_v,
+                       MLX5_SET(fte_match_set_lyr_2_4, headers_v,
                                 first_cfi,
                                 ntohs(ib_spec->eth.val.vlan_tag) >> 12);
  
-                       MLX5_SET(fte_match_set_lyr_2_4, outer_headers_c,
+                       MLX5_SET(fte_match_set_lyr_2_4, headers_c,
                                 first_prio,
                                 ntohs(ib_spec->eth.mask.vlan_tag) >> 13);
-                       MLX5_SET(fte_match_set_lyr_2_4, outer_headers_v,
+                       MLX5_SET(fte_match_set_lyr_2_4, headers_v,
                                 first_prio,
                                 ntohs(ib_spec->eth.val.vlan_tag) >> 13);
                }
-               MLX5_SET(fte_match_set_lyr_2_4, outer_headers_c,
+               MLX5_SET(fte_match_set_lyr_2_4, headers_c,
                         ethertype, ntohs(ib_spec->eth.mask.ether_type));
-               MLX5_SET(fte_match_set_lyr_2_4, outer_headers_v,
+               MLX5_SET(fte_match_set_lyr_2_4, headers_v,
                         ethertype, ntohs(ib_spec->eth.val.ether_type));
                break;
        case IB_FLOW_SPEC_IPV4:
                if (FIELDS_NOT_SUPPORTED(ib_spec->ipv4.mask, LAST_IPV4_FIELD))
                        return -ENOTSUPP;
  
-               MLX5_SET(fte_match_set_lyr_2_4, outer_headers_c,
+               MLX5_SET(fte_match_set_lyr_2_4, headers_c,
                         ethertype, 0xffff);
-               MLX5_SET(fte_match_set_lyr_2_4, outer_headers_v,
+               MLX5_SET(fte_match_set_lyr_2_4, headers_v,
                         ethertype, ETH_P_IP);
  
-               memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, outer_headers_c,
+               memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_c,
                                    src_ipv4_src_ipv6.ipv4_layout.ipv4),
                       &ib_spec->ipv4.mask.src_ip,
                       sizeof(ib_spec->ipv4.mask.src_ip));
-               memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, outer_headers_v,
+               memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v,
                                    src_ipv4_src_ipv6.ipv4_layout.ipv4),
                       &ib_spec->ipv4.val.src_ip,
                       sizeof(ib_spec->ipv4.val.src_ip));
-               memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, outer_headers_c,
+               memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_c,
                                    dst_ipv4_dst_ipv6.ipv4_layout.ipv4),
                       &ib_spec->ipv4.mask.dst_ip,
                       sizeof(ib_spec->ipv4.mask.dst_ip));
-               memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, outer_headers_v,
+               memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v,
                                    dst_ipv4_dst_ipv6.ipv4_layout.ipv4),
                       &ib_spec->ipv4.val.dst_ip,
                       sizeof(ib_spec->ipv4.val.dst_ip));
  
-               set_tos(outer_headers_c, outer_headers_v,
+               set_tos(headers_c, headers_v,
                        ib_spec->ipv4.mask.tos, ib_spec->ipv4.val.tos);
  
-               set_proto(outer_headers_c, outer_headers_v,
+               set_proto(headers_c, headers_v,
                          ib_spec->ipv4.mask.proto, ib_spec->ipv4.val.proto);
                break;
        case IB_FLOW_SPEC_IPV6:
                if (FIELDS_NOT_SUPPORTED(ib_spec->ipv6.mask, LAST_IPV6_FIELD))
                        return -ENOTSUPP;
  
-               MLX5_SET(fte_match_set_lyr_2_4, outer_headers_c,
+               MLX5_SET(fte_match_set_lyr_2_4, headers_c,
                         ethertype, 0xffff);
-               MLX5_SET(fte_match_set_lyr_2_4, outer_headers_v,
+               MLX5_SET(fte_match_set_lyr_2_4, headers_v,
                         ethertype, ETH_P_IPV6);
  
-               memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, outer_headers_c,
+               memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_c,
                                    src_ipv4_src_ipv6.ipv6_layout.ipv6),
                       &ib_spec->ipv6.mask.src_ip,
                       sizeof(ib_spec->ipv6.mask.src_ip));
-               memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, outer_headers_v,
+               memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v,
                                    src_ipv4_src_ipv6.ipv6_layout.ipv6),
                       &ib_spec->ipv6.val.src_ip,
                       sizeof(ib_spec->ipv6.val.src_ip));
-               memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, outer_headers_c,
+               memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_c,
                                    dst_ipv4_dst_ipv6.ipv6_layout.ipv6),
                       &ib_spec->ipv6.mask.dst_ip,
                       sizeof(ib_spec->ipv6.mask.dst_ip));
-               memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, outer_headers_v,
+               memcpy(MLX5_ADDR_OF(fte_match_set_lyr_2_4, headers_v,
                                    dst_ipv4_dst_ipv6.ipv6_layout.ipv6),
                       &ib_spec->ipv6.val.dst_ip,
                       sizeof(ib_spec->ipv6.val.dst_ip));
  
-               set_tos(outer_headers_c, outer_headers_v,
+               set_tos(headers_c, headers_v,
                        ib_spec->ipv6.mask.traffic_class,
                        ib_spec->ipv6.val.traffic_class);
  
-               set_proto(outer_headers_c, outer_headers_v,
+               set_proto(headers_c, headers_v,
                          ib_spec->ipv6.mask.next_hdr,
                          ib_spec->ipv6.val.next_hdr);
  
-               MLX5_SET(fte_match_set_misc, misc_params_c,
-                        outer_ipv6_flow_label,
-                        ntohl(ib_spec->ipv6.mask.flow_label));
-               MLX5_SET(fte_match_set_misc, misc_params_v,
-                        outer_ipv6_flow_label,
-                        ntohl(ib_spec->ipv6.val.flow_label));
+               set_flow_label(misc_params_c, misc_params_v,
+                              ntohl(ib_spec->ipv6.mask.flow_label),
+                              ntohl(ib_spec->ipv6.val.flow_label),
+                              ib_spec->type & IB_FLOW_SPEC_INNER);
                break;
        case IB_FLOW_SPEC_TCP:
                if (FIELDS_NOT_SUPPORTED(ib_spec->tcp_udp.mask,
                                         LAST_TCP_UDP_FIELD))
                        return -ENOTSUPP;
  
-               MLX5_SET(fte_match_set_lyr_2_4, outer_headers_c, ip_protocol,
+               MLX5_SET(fte_match_set_lyr_2_4, headers_c, ip_protocol,
                         0xff);
-               MLX5_SET(fte_match_set_lyr_2_4, outer_headers_v, ip_protocol,
+               MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_protocol,
                         IPPROTO_TCP);
  
-               MLX5_SET(fte_match_set_lyr_2_4, outer_headers_c, tcp_sport,
+               MLX5_SET(fte_match_set_lyr_2_4, headers_c, tcp_sport,
                         ntohs(ib_spec->tcp_udp.mask.src_port));
-               MLX5_SET(fte_match_set_lyr_2_4, outer_headers_v, tcp_sport,
+               MLX5_SET(fte_match_set_lyr_2_4, headers_v, tcp_sport,
                         ntohs(ib_spec->tcp_udp.val.src_port));
  
-               MLX5_SET(fte_match_set_lyr_2_4, outer_headers_c, tcp_dport,
+               MLX5_SET(fte_match_set_lyr_2_4, headers_c, tcp_dport,
                         ntohs(ib_spec->tcp_udp.mask.dst_port));
-               MLX5_SET(fte_match_set_lyr_2_4, outer_headers_v, tcp_dport,
+               MLX5_SET(fte_match_set_lyr_2_4, headers_v, tcp_dport,
                         ntohs(ib_spec->tcp_udp.val.dst_port));
                break;
        case IB_FLOW_SPEC_UDP:
                                         LAST_TCP_UDP_FIELD))
                        return -ENOTSUPP;
  
-               MLX5_SET(fte_match_set_lyr_2_4, outer_headers_c, ip_protocol,
+               MLX5_SET(fte_match_set_lyr_2_4, headers_c, ip_protocol,
                         0xff);
-               MLX5_SET(fte_match_set_lyr_2_4, outer_headers_v, ip_protocol,
+               MLX5_SET(fte_match_set_lyr_2_4, headers_v, ip_protocol,
                         IPPROTO_UDP);
  
-               MLX5_SET(fte_match_set_lyr_2_4, outer_headers_c, udp_sport,
+               MLX5_SET(fte_match_set_lyr_2_4, headers_c, udp_sport,
                         ntohs(ib_spec->tcp_udp.mask.src_port));
-               MLX5_SET(fte_match_set_lyr_2_4, outer_headers_v, udp_sport,
+               MLX5_SET(fte_match_set_lyr_2_4, headers_v, udp_sport,
                         ntohs(ib_spec->tcp_udp.val.src_port));
  
-               MLX5_SET(fte_match_set_lyr_2_4, outer_headers_c, udp_dport,
+               MLX5_SET(fte_match_set_lyr_2_4, headers_c, udp_dport,
                         ntohs(ib_spec->tcp_udp.mask.dst_port));
-               MLX5_SET(fte_match_set_lyr_2_4, outer_headers_v, udp_dport,
+               MLX5_SET(fte_match_set_lyr_2_4, headers_v, udp_dport,
                         ntohs(ib_spec->tcp_udp.val.dst_port));
                break;
+       case IB_FLOW_SPEC_VXLAN_TUNNEL:
+               if (FIELDS_NOT_SUPPORTED(ib_spec->tunnel.mask,
+                                        LAST_TUNNEL_FIELD))
+                       return -ENOTSUPP;
+               MLX5_SET(fte_match_set_misc, misc_params_c, vxlan_vni,
+                        ntohl(ib_spec->tunnel.mask.tunnel_id));
+               MLX5_SET(fte_match_set_misc, misc_params_v, vxlan_vni,
+                        ntohl(ib_spec->tunnel.val.tunnel_id));
+               break;
        default:
                return -EINVAL;
        }
@@@ -1857,7 -1931,7 +1931,7 @@@ static struct mlx5_ib_flow_prio *get_fl
                ft = mlx5_create_auto_grouped_flow_table(ns, priority,
                                                         num_entries,
                                                         num_groups,
 -                                                       0);
 +                                                       0, 0);
  
                if (!IS_ERR(ft)) {
                        prio->refcount = 0;
@@@ -1877,10 -1951,10 +1951,10 @@@ static struct mlx5_ib_flow_handler *cre
  {
        struct mlx5_flow_table  *ft = ft_prio->flow_table;
        struct mlx5_ib_flow_handler *handler;
 +      struct mlx5_flow_act flow_act = {0};
        struct mlx5_flow_spec *spec;
        const void *ib_flow = (const void *)flow_attr + sizeof(*flow_attr);
        unsigned int spec_index;
 -      u32 action;
        int err = 0;
  
        if (!is_valid_attr(flow_attr))
        }
  
        spec->match_criteria_enable = get_match_criteria_enable(spec->match_criteria);
 -      action = dst ? MLX5_FLOW_CONTEXT_ACTION_FWD_DEST :
 +      flow_act.action = dst ? MLX5_FLOW_CONTEXT_ACTION_FWD_DEST :
                MLX5_FLOW_CONTEXT_ACTION_FWD_NEXT_PRIO;
 +      flow_act.flow_tag = MLX5_FS_DEFAULT_FLOW_TAG;
        handler->rule = mlx5_add_flow_rules(ft, spec,
 -                                         action,
 -                                         MLX5_FS_DEFAULT_FLOW_TAG,
 -                                         dst, 1);
 +                                          &flow_act,
 +                                          dst, 1);
  
        if (IS_ERR(handler->rule)) {
                err = PTR_ERR(handler->rule);
@@@ -2311,14 -2385,14 +2385,14 @@@ static void mlx5_ib_event(struct mlx5_c
  {
        struct mlx5_ib_dev *ibdev = (struct mlx5_ib_dev *)context;
        struct ib_event ibev;
 -
 +      bool fatal = false;
        u8 port = 0;
  
        switch (event) {
        case MLX5_DEV_EVENT_SYS_ERROR:
 -              ibdev->ib_active = false;
                ibev.event = IB_EVENT_DEVICE_FATAL;
                mlx5_ib_handle_internal_error(ibdev);
 +              fatal = true;
                break;
  
        case MLX5_DEV_EVENT_PORT_UP:
  
        if (ibdev->ib_active)
                ib_dispatch_event(&ibev);
 +
 +      if (fatal)
 +              ibdev->ib_active = false;
  }
  
  static void get_ext_port_caps(struct mlx5_ib_dev *dev)
@@@ -2721,6 -2792,8 +2795,8 @@@ static int mlx5_port_immutable(struct i
                               struct ib_port_immutable *immutable)
  {
        struct ib_port_attr attr;
+       struct mlx5_ib_dev *dev = to_mdev(ibdev);
+       enum rdma_link_layer ll = mlx5_ib_port_link_layer(ibdev, port_num);
        int err;
  
        err = mlx5_ib_query_port(ibdev, port_num, &attr);
        immutable->pkey_tbl_len = attr.pkey_tbl_len;
        immutable->gid_tbl_len = attr.gid_tbl_len;
        immutable->core_cap_flags = get_core_cap_flags(ibdev);
-       immutable->max_mad_size = IB_MGMT_MAD_SIZE;
+       if ((ll == IB_LINK_LAYER_INFINIBAND) || MLX5_CAP_GEN(dev->mdev, roce))
+               immutable->max_mad_size = IB_MGMT_MAD_SIZE;
  
        return 0;
  }
@@@ -2744,7 -2818,7 +2821,7 @@@ static void get_dev_fw_str(struct ib_de
                       fw_rev_min(dev->mdev), fw_rev_sub(dev->mdev));
  }
  
- static int mlx5_roce_lag_init(struct mlx5_ib_dev *dev)
+ static int mlx5_eth_lag_init(struct mlx5_ib_dev *dev)
  {
        struct mlx5_core_dev *mdev = dev->mdev;
        struct mlx5_flow_namespace *ns = mlx5_get_flow_namespace(mdev,
@@@ -2773,7 -2847,7 +2850,7 @@@ err_destroy_vport_lag
        return err;
  }
  
- static void mlx5_roce_lag_cleanup(struct mlx5_ib_dev *dev)
+ static void mlx5_eth_lag_cleanup(struct mlx5_ib_dev *dev)
  {
        struct mlx5_core_dev *mdev = dev->mdev;
  
        }
  }
  
- static void mlx5_remove_roce_notifier(struct mlx5_ib_dev *dev)
+ static int mlx5_add_netdev_notifier(struct mlx5_ib_dev *dev)
+ {
+       int err;
+       dev->roce.nb.notifier_call = mlx5_netdev_event;
+       err = register_netdevice_notifier(&dev->roce.nb);
+       if (err) {
+               dev->roce.nb.notifier_call = NULL;
+               return err;
+       }
+       return 0;
+ }
+ static void mlx5_remove_netdev_notifier(struct mlx5_ib_dev *dev)
  {
        if (dev->roce.nb.notifier_call) {
                unregister_netdevice_notifier(&dev->roce.nb);
        }
  }
  
- static int mlx5_enable_roce(struct mlx5_ib_dev *dev)
+ static int mlx5_enable_eth(struct mlx5_ib_dev *dev)
  {
        int err;
  
-       dev->roce.nb.notifier_call = mlx5_netdev_event;
-       err = register_netdevice_notifier(&dev->roce.nb);
-       if (err) {
-               dev->roce.nb.notifier_call = NULL;
+       err = mlx5_add_netdev_notifier(dev);
+       if (err)
                return err;
-       }
  
-       err = mlx5_nic_vport_enable_roce(dev->mdev);
-       if (err)
-               goto err_unregister_netdevice_notifier;
+       if (MLX5_CAP_GEN(dev->mdev, roce)) {
+               err = mlx5_nic_vport_enable_roce(dev->mdev);
+               if (err)
+                       goto err_unregister_netdevice_notifier;
+       }
  
-       err = mlx5_roce_lag_init(dev);
+       err = mlx5_eth_lag_init(dev);
        if (err)
                goto err_disable_roce;
  
        return 0;
  
  err_disable_roce:
-       mlx5_nic_vport_disable_roce(dev->mdev);
+       if (MLX5_CAP_GEN(dev->mdev, roce))
+               mlx5_nic_vport_disable_roce(dev->mdev);
  
  err_unregister_netdevice_notifier:
-       mlx5_remove_roce_notifier(dev);
+       mlx5_remove_netdev_notifier(dev);
        return err;
  }
  
- static void mlx5_disable_roce(struct mlx5_ib_dev *dev)
+ static void mlx5_disable_eth(struct mlx5_ib_dev *dev)
  {
-       mlx5_roce_lag_cleanup(dev);
-       mlx5_nic_vport_disable_roce(dev->mdev);
+       mlx5_eth_lag_cleanup(dev);
+       if (MLX5_CAP_GEN(dev->mdev, roce))
+               mlx5_nic_vport_disable_roce(dev->mdev);
  }
  
  static void mlx5_ib_dealloc_q_counters(struct mlx5_ib_dev *dev)
@@@ -2947,9 -3036,6 +3039,6 @@@ static void *mlx5_ib_add(struct mlx5_co
        port_type_cap = MLX5_CAP_GEN(mdev, port_type);
        ll = mlx5_port_type_cap_to_rdma_ll(port_type_cap);
  
-       if ((ll == IB_LINK_LAYER_ETHERNET) && !MLX5_CAP_GEN(mdev, roce))
-               return NULL;
        printk_once(KERN_INFO "%s", mlx5_version);
  
        dev = (struct mlx5_ib_dev *)ib_alloc_device(sizeof(*dev));
                (1ull << IB_USER_VERBS_CMD_QUERY_PORT)          |
                (1ull << IB_USER_VERBS_CMD_ALLOC_PD)            |
                (1ull << IB_USER_VERBS_CMD_DEALLOC_PD)          |
+               (1ull << IB_USER_VERBS_CMD_CREATE_AH)           |
+               (1ull << IB_USER_VERBS_CMD_DESTROY_AH)          |
                (1ull << IB_USER_VERBS_CMD_REG_MR)              |
                (1ull << IB_USER_VERBS_CMD_REREG_MR)            |
                (1ull << IB_USER_VERBS_CMD_DEREG_MR)            |
        dev->ib_dev.uverbs_ex_cmd_mask =
                (1ull << IB_USER_VERBS_EX_CMD_QUERY_DEVICE)     |
                (1ull << IB_USER_VERBS_EX_CMD_CREATE_CQ)        |
-               (1ull << IB_USER_VERBS_EX_CMD_CREATE_QP);
+               (1ull << IB_USER_VERBS_EX_CMD_CREATE_QP)        |
+               (1ull << IB_USER_VERBS_EX_CMD_MODIFY_QP);
  
        dev->ib_dev.query_device        = mlx5_ib_query_device;
        dev->ib_dev.query_port          = mlx5_ib_query_port;
        }
        err = init_node_data(dev);
        if (err)
 -              goto err_dealloc;
 +              goto err_free_port;
  
        mutex_init(&dev->flow_db.lock);
        mutex_init(&dev->cap_mask_mutex);
        spin_lock_init(&dev->reset_flow_resource_lock);
  
        if (ll == IB_LINK_LAYER_ETHERNET) {
-               err = mlx5_enable_roce(dev);
+               err = mlx5_enable_eth(dev);
                if (err)
 -                      goto err_dealloc;
 +                      goto err_free_port;
        }
  
        err = create_dev_resources(&dev->devr);
        if (err)
-               goto err_disable_roce;
+               goto err_disable_eth;
  
        err = mlx5_ib_odp_init_one(dev);
        if (err)
@@@ -3179,10 -3268,10 +3271,10 @@@ err_odp
  err_rsrc:
        destroy_dev_resources(&dev->devr);
  
- err_disable_roce:
+ err_disable_eth:
        if (ll == IB_LINK_LAYER_ETHERNET) {
-               mlx5_disable_roce(dev);
-               mlx5_remove_roce_notifier(dev);
+               mlx5_disable_eth(dev);
+               mlx5_remove_netdev_notifier(dev);
        }
  
  err_free_port:
@@@ -3199,14 -3288,14 +3291,14 @@@ static void mlx5_ib_remove(struct mlx5_
        struct mlx5_ib_dev *dev = context;
        enum rdma_link_layer ll = mlx5_ib_port_link_layer(&dev->ib_dev, 1);
  
-       mlx5_remove_roce_notifier(dev);
+       mlx5_remove_netdev_notifier(dev);
        ib_unregister_device(&dev->ib_dev);
        mlx5_ib_dealloc_q_counters(dev);
        destroy_umrc_res(dev);
        mlx5_ib_odp_remove_one(dev);
        destroy_dev_resources(&dev->devr);
        if (ll == IB_LINK_LAYER_ETHERNET)
-               mlx5_disable_roce(dev);
+               mlx5_disable_eth(dev);
        kfree(dev->port);
        ib_dealloc_device(&dev->ib_dev);
  }
index 854748b6121204bf26eeebe920c6195c35b2dd04,ab8961cc8bca8721ffb290f6cf9b7a51859a5217..6c6057eb60ea8a37f608dfffb6b707c6dc0d5fa6
@@@ -63,6 -63,8 +63,8 @@@ pr_warn("%s:%s:%d:(pid %d): " format, (
  #define MLX5_IB_DEFAULT_UIDX 0xffffff
  #define MLX5_USER_ASSIGNED_UIDX_MASK __mlx5_mask(qpc, user_index)
  
+ #define MLX5_MKEY_PAGE_SHIFT_MASK __mlx5_mask(mkc, log_page_size)
  enum {
        MLX5_IB_MMAP_CMD_SHIFT  = 8,
        MLX5_IB_MMAP_CMD_MASK   = 0xff,
@@@ -387,6 -389,7 +389,7 @@@ struct mlx5_ib_qp 
        struct list_head        qps_list;
        struct list_head        cq_recv_list;
        struct list_head        cq_send_list;
+       u32                     rate_limit;
  };
  
  struct mlx5_ib_cq_buf {
@@@ -418,7 -421,7 +421,7 @@@ struct mlx5_umr_wr 
        struct ib_pd                   *pd;
        unsigned int                    page_shift;
        unsigned int                    npages;
-       u32                             length;
+       u64                             length;
        int                             access_flags;
        u32                             mkey;
  };
@@@ -626,8 -629,6 +629,8 @@@ struct mlx5_ib_dev 
        struct mlx5_ib_resources        devr;
        struct mlx5_mr_cache            cache;
        struct timer_list               delay_timer;
 +      /* Prevents soft lock on massive reg MRs */
 +      struct mutex                    slow_path_mutex;
        int                             fill_delay;
  #ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
        struct ib_odp_caps      odp_caps;
@@@ -739,7 -740,8 +742,8 @@@ void mlx5_ib_free_srq_wqe(struct mlx5_i
  int mlx5_MAD_IFC(struct mlx5_ib_dev *dev, int ignore_mkey, int ignore_bkey,
                 u8 port, const struct ib_wc *in_wc, const struct ib_grh *in_grh,
                 const void *in_mad, void *response_mad);
- struct ib_ah *mlx5_ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr);
+ struct ib_ah *mlx5_ib_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr,
+                               struct ib_udata *udata);
  int mlx5_ib_query_ah(struct ib_ah *ibah, struct ib_ah_attr *ah_attr);
  int mlx5_ib_destroy_ah(struct ib_ah *ah);
  struct ib_srq *mlx5_ib_create_srq(struct ib_pd *pd,
@@@ -825,7 -827,9 +829,9 @@@ int mlx5_ib_query_port(struct ib_devic
                       struct ib_port_attr *props);
  int mlx5_ib_init_fmr(struct mlx5_ib_dev *dev);
  void mlx5_ib_cleanup_fmr(struct mlx5_ib_dev *dev);
- void mlx5_ib_cont_pages(struct ib_umem *umem, u64 addr, int *count, int *shift,
+ void mlx5_ib_cont_pages(struct ib_umem *umem, u64 addr,
+                       unsigned long max_page_shift,
+                       int *count, int *shift,
                        int *ncont, int *order);
  void __mlx5_ib_populate_pas(struct mlx5_ib_dev *dev, struct ib_umem *umem,
                            int page_shift, size_t offset, size_t num_pages,
index 4e9012463c37de6381cddde1c527e4c2ff6e84ae,67985c69f9b99be87df2c37deb330cdfa6eb7545..8f608debe1415a43887527a87c7d03ab93222972
@@@ -610,7 -610,6 +610,7 @@@ int mlx5_mr_cache_init(struct mlx5_ib_d
        int err;
        int i;
  
 +      mutex_init(&dev->slow_path_mutex);
        cache->wq = alloc_ordered_workqueue("mkey_cache", WQ_MEM_RECLAIM);
        if (!cache->wq) {
                mlx5_ib_warn(dev, "failed to create work queue\n");
                ent->order = i + 2;
                ent->dev = dev;
  
-               if (dev->mdev->profile->mask & MLX5_PROF_MASK_MR_CACHE)
+               if ((dev->mdev->profile->mask & MLX5_PROF_MASK_MR_CACHE) &&
+                   (mlx5_core_is_pf(dev->mdev)))
                        limit = dev->mdev->profile->mr_cache[i].limit;
                else
                        limit = 0;
        return 0;
  }
  
+ static void wait_for_async_commands(struct mlx5_ib_dev *dev)
+ {
+       struct mlx5_mr_cache *cache = &dev->cache;
+       struct mlx5_cache_ent *ent;
+       int total = 0;
+       int i;
+       int j;
+       for (i = 0; i < MAX_MR_CACHE_ENTRIES; i++) {
+               ent = &cache->ent[i];
+               for (j = 0 ; j < 1000; j++) {
+                       if (!ent->pending)
+                               break;
+                       msleep(50);
+               }
+       }
+       for (i = 0; i < MAX_MR_CACHE_ENTRIES; i++) {
+               ent = &cache->ent[i];
+               total += ent->pending;
+       }
+       if (total)
+               mlx5_ib_warn(dev, "aborted while there are %d pending mr requests\n", total);
+       else
+               mlx5_ib_warn(dev, "done with all pending requests\n");
+ }
  int mlx5_mr_cache_cleanup(struct mlx5_ib_dev *dev)
  {
        int i;
                clean_keys(dev, i);
  
        destroy_workqueue(dev->cache.wq);
+       wait_for_async_commands(dev);
        del_timer_sync(&dev->delay_timer);
  
        return 0;
@@@ -816,29 -844,34 +845,34 @@@ static void prep_umr_unreg_wqe(struct m
        umrwr->mkey = key;
  }
  
- static struct ib_umem *mr_umem_get(struct ib_pd *pd, u64 start, u64 length,
-                                  int access_flags, int *npages,
-                                  int *page_shift, int *ncont, int *order)
+ static int mr_umem_get(struct ib_pd *pd, u64 start, u64 length,
+                      int access_flags, struct ib_umem **umem,
+                      int *npages, int *page_shift, int *ncont,
+                      int *order)
  {
        struct mlx5_ib_dev *dev = to_mdev(pd->device);
-       struct ib_umem *umem = ib_umem_get(pd->uobject->context, start, length,
-                                          access_flags, 0);
-       if (IS_ERR(umem)) {
+       int err;
+       *umem = ib_umem_get(pd->uobject->context, start, length,
+                           access_flags, 0);
+       err = PTR_ERR_OR_ZERO(*umem);
+       if (err < 0) {
                mlx5_ib_err(dev, "umem get failed (%ld)\n", PTR_ERR(umem));
-               return (void *)umem;
+               return err;
        }
  
-       mlx5_ib_cont_pages(umem, start, npages, page_shift, ncont, order);
+       mlx5_ib_cont_pages(*umem, start, MLX5_MKEY_PAGE_SHIFT_MASK, npages,
+                          page_shift, ncont, order);
        if (!*npages) {
                mlx5_ib_warn(dev, "avoid zero region\n");
-               ib_umem_release(umem);
-               return ERR_PTR(-EINVAL);
+               ib_umem_release(*umem);
+               return -EINVAL;
        }
  
        mlx5_ib_dbg(dev, "npages %d, ncont %d, order %d, page_shift %d\n",
                    *npages, *ncont, *order, *page_shift);
  
-       return umem;
+       return 0;
  }
  
  static void mlx5_ib_umr_done(struct ib_cq *cq, struct ib_wc *wc)
@@@ -1164,11 -1197,11 +1198,11 @@@ struct ib_mr *mlx5_ib_reg_user_mr(struc
  
        mlx5_ib_dbg(dev, "start 0x%llx, virt_addr 0x%llx, length 0x%llx, access_flags 0x%x\n",
                    start, virt_addr, length, access_flags);
-       umem = mr_umem_get(pd, start, length, access_flags, &npages,
+       err = mr_umem_get(pd, start, length, access_flags, &umem, &npages,
                           &page_shift, &ncont, &order);
  
-       if (IS_ERR(umem))
-               return (void *)umem;
+         if (err < 0)
+               return ERR_PTR(err);
  
        if (use_umr(order)) {
                mr = reg_umr(pd, umem, virt_addr, length, ncont, page_shift,
                goto error;
        }
  
 -      if (!mr)
 +      if (!mr) {
 +              mutex_lock(&dev->slow_path_mutex);
                mr = reg_create(NULL, pd, virt_addr, length, umem, ncont,
                                page_shift, access_flags);
 +              mutex_unlock(&dev->slow_path_mutex);
 +      }
  
        if (IS_ERR(mr)) {
                err = PTR_ERR(mr);
@@@ -1345,10 -1375,9 +1379,9 @@@ int mlx5_ib_rereg_user_mr(struct ib_mr 
                 */
                flags |= IB_MR_REREG_TRANS;
                ib_umem_release(mr->umem);
-               mr->umem = mr_umem_get(pd, addr, len, access_flags, &npages,
-                                      &page_shift, &ncont, &order);
-               if (IS_ERR(mr->umem)) {
-                       err = PTR_ERR(mr->umem);
+               err = mr_umem_get(pd, addr, len, access_flags, &mr->umem,
+                                 &npages, &page_shift, &ncont, &order);
+               if (err < 0) {
                        mr->umem = NULL;
                        return err;
                }
index d1e921816bfee3596c961e6671d87a84a3caa0ab,cc24f2d429b9605354f9615e9ba25c22dc577e84..a1b3125f0a6eb3a312539a32414202cefc877df8
@@@ -52,6 -52,7 +52,6 @@@ enum 
  
  enum {
        MLX5_IB_SQ_STRIDE       = 6,
 -      MLX5_IB_CACHE_LINE_SIZE = 64,
  };
  
  static const u32 mlx5_ib_opcode[] = {
@@@ -77,12 -78,14 +77,14 @@@ struct mlx5_wqe_eth_pad 
  
  enum raw_qp_set_mask_map {
        MLX5_RAW_QP_MOD_SET_RQ_Q_CTR_ID         = 1UL << 0,
+       MLX5_RAW_QP_RATE_LIMIT                  = 1UL << 1,
  };
  
  struct mlx5_modify_raw_qp_param {
        u16 operation;
  
        u32 set_mask; /* raw_qp_set_mask_map */
+       u32 rate_limit;
        u8 rq_q_ctr_id;
  };
  
@@@ -351,6 -354,29 +353,29 @@@ static int calc_send_wqe(struct ib_qp_i
                return ALIGN(max_t(int, inl_size, size), MLX5_SEND_WQE_BB);
  }
  
+ static int get_send_sge(struct ib_qp_init_attr *attr, int wqe_size)
+ {
+       int max_sge;
+       if (attr->qp_type == IB_QPT_RC)
+               max_sge = (min_t(int, wqe_size, 512) -
+                          sizeof(struct mlx5_wqe_ctrl_seg) -
+                          sizeof(struct mlx5_wqe_raddr_seg)) /
+                       sizeof(struct mlx5_wqe_data_seg);
+       else if (attr->qp_type == IB_QPT_XRC_INI)
+               max_sge = (min_t(int, wqe_size, 512) -
+                          sizeof(struct mlx5_wqe_ctrl_seg) -
+                          sizeof(struct mlx5_wqe_xrc_seg) -
+                          sizeof(struct mlx5_wqe_raddr_seg)) /
+                       sizeof(struct mlx5_wqe_data_seg);
+       else
+               max_sge = (wqe_size - sq_overhead(attr)) /
+                       sizeof(struct mlx5_wqe_data_seg);
+       return min_t(int, max_sge, wqe_size - sq_overhead(attr) /
+                    sizeof(struct mlx5_wqe_data_seg));
+ }
  static int calc_sq_size(struct mlx5_ib_dev *dev, struct ib_qp_init_attr *attr,
                        struct mlx5_ib_qp *qp)
  {
        wq_size = roundup_pow_of_two(attr->cap.max_send_wr * wqe_size);
        qp->sq.wqe_cnt = wq_size / MLX5_SEND_WQE_BB;
        if (qp->sq.wqe_cnt > (1 << MLX5_CAP_GEN(dev->mdev, log_max_qp_sz))) {
-               mlx5_ib_dbg(dev, "wqe count(%d) exceeds limits(%d)\n",
+               mlx5_ib_dbg(dev, "send queue size (%d * %d / %d -> %d) exceeds limits(%d)\n",
+                           attr->cap.max_send_wr, wqe_size, MLX5_SEND_WQE_BB,
                            qp->sq.wqe_cnt,
                            1 << MLX5_CAP_GEN(dev->mdev, log_max_qp_sz));
                return -ENOMEM;
        }
        qp->sq.wqe_shift = ilog2(MLX5_SEND_WQE_BB);
-       qp->sq.max_gs = attr->cap.max_send_sge;
+       qp->sq.max_gs = get_send_sge(attr, wqe_size);
+       if (qp->sq.max_gs < attr->cap.max_send_sge)
+               return -ENOMEM;
+       attr->cap.max_send_sge = qp->sq.max_gs;
        qp->sq.max_post = wq_size / wqe_size;
        attr->cap.max_send_wr = qp->sq.max_post;
  
@@@ -647,7 -678,7 +677,7 @@@ static int mlx5_ib_umem_get(struct mlx5
                return PTR_ERR(*umem);
        }
  
-       mlx5_ib_cont_pages(*umem, addr, npages, page_shift, ncont, NULL);
+       mlx5_ib_cont_pages(*umem, addr, 0, npages, page_shift, ncont, NULL);
  
        err = mlx5_ib_get_buf_offset(addr, *page_shift, offset);
        if (err) {
@@@ -700,7 -731,7 +730,7 @@@ static int create_user_rq(struct mlx5_i
                return err;
        }
  
-       mlx5_ib_cont_pages(rwq->umem, ucmd->buf_addr, &npages, &page_shift,
+       mlx5_ib_cont_pages(rwq->umem, ucmd->buf_addr, 0, &npages, &page_shift,
                           &ncont, NULL);
        err = mlx5_ib_get_buf_offset(ucmd->buf_addr, page_shift,
                                     &rwq->rq_page_offset);
@@@ -2051,8 -2082,8 +2081,8 @@@ struct ib_qp *mlx5_ib_create_qp(struct 
  
                mlx5_ib_dbg(dev, "ib qpnum 0x%x, mlx qpn 0x%x, rcqn 0x%x, scqn 0x%x\n",
                            qp->ibqp.qp_num, qp->trans_qp.base.mqp.qpn,
 -                          to_mcq(init_attr->recv_cq)->mcq.cqn,
 -                          to_mcq(init_attr->send_cq)->mcq.cqn);
 +                          init_attr->recv_cq ? to_mcq(init_attr->recv_cq)->mcq.cqn : -1,
 +                          init_attr->send_cq ? to_mcq(init_attr->send_cq)->mcq.cqn : -1);
  
                qp->trans_qp.xrcdn = xrcdn;
  
  }
  
  static int modify_raw_packet_qp_sq(struct mlx5_core_dev *dev,
-                                  struct mlx5_ib_sq *sq, int new_state)
+                                  struct mlx5_ib_sq *sq,
+                                  int new_state,
+                                  const struct mlx5_modify_raw_qp_param *raw_qp_param)
  {
+       struct mlx5_ib_qp *ibqp = sq->base.container_mibqp;
+       u32 old_rate = ibqp->rate_limit;
+       u32 new_rate = old_rate;
+       u16 rl_index = 0;
        void *in;
        void *sqc;
        int inlen;
        sqc = MLX5_ADDR_OF(modify_sq_in, in, ctx);
        MLX5_SET(sqc, sqc, state, new_state);
  
+       if (raw_qp_param->set_mask & MLX5_RAW_QP_RATE_LIMIT) {
+               if (new_state != MLX5_SQC_STATE_RDY)
+                       pr_warn("%s: Rate limit can only be changed when SQ is moving to RDY\n",
+                               __func__);
+               else
+                       new_rate = raw_qp_param->rate_limit;
+       }
+       if (old_rate != new_rate) {
+               if (new_rate) {
+                       err = mlx5_rl_add_rate(dev, new_rate, &rl_index);
+                       if (err) {
+                               pr_err("Failed configuring rate %u: %d\n",
+                                      new_rate, err);
+                               goto out;
+                       }
+               }
+               MLX5_SET64(modify_sq_in, in, modify_bitmask, 1);
+               MLX5_SET(sqc, sqc, packet_pacing_rate_limit_index, rl_index);
+       }
        err = mlx5_core_modify_sq(dev, sq->base.mqp.qpn, in, inlen);
-       if (err)
+       if (err) {
+               /* Remove new rate from table if failed */
+               if (new_rate &&
+                   old_rate != new_rate)
+                       mlx5_rl_remove_rate(dev, new_rate);
                goto out;
+       }
+       /* Only remove the old rate after new rate was set */
+       if ((old_rate &&
+           (old_rate != new_rate)) ||
+           (new_state != MLX5_SQC_STATE_RDY))
+               mlx5_rl_remove_rate(dev, old_rate);
  
+       ibqp->rate_limit = new_rate;
        sq->state = new_state;
  
  out:
@@@ -2477,6 -2548,8 +2547,8 @@@ static int modify_raw_packet_qp(struct 
        struct mlx5_ib_raw_packet_qp *raw_packet_qp = &qp->raw_packet_qp;
        struct mlx5_ib_rq *rq = &raw_packet_qp->rq;
        struct mlx5_ib_sq *sq = &raw_packet_qp->sq;
+       int modify_rq = !!qp->rq.wqe_cnt;
+       int modify_sq = !!qp->sq.wqe_cnt;
        int rq_state;
        int sq_state;
        int err;
                rq_state = MLX5_RQC_STATE_RST;
                sq_state = MLX5_SQC_STATE_RST;
                break;
-       case MLX5_CMD_OP_INIT2INIT_QP:
-       case MLX5_CMD_OP_INIT2RTR_QP:
        case MLX5_CMD_OP_RTR2RTS_QP:
        case MLX5_CMD_OP_RTS2RTS_QP:
+               if (raw_qp_param->set_mask ==
+                   MLX5_RAW_QP_RATE_LIMIT) {
+                       modify_rq = 0;
+                       sq_state = sq->state;
+               } else {
+                       return raw_qp_param->set_mask ? -EINVAL : 0;
+               }
+               break;
+       case MLX5_CMD_OP_INIT2INIT_QP:
+       case MLX5_CMD_OP_INIT2RTR_QP:
                if (raw_qp_param->set_mask)
                        return -EINVAL;
                else
                return -EINVAL;
        }
  
-       if (qp->rq.wqe_cnt) {
-               err = modify_raw_packet_qp_rq(dev, rq, rq_state, raw_qp_param);
+       if (modify_rq) {
+               err =  modify_raw_packet_qp_rq(dev, rq, rq_state, raw_qp_param);
                if (err)
                        return err;
        }
  
-       if (qp->sq.wqe_cnt) {
+       if (modify_sq) {
                if (tx_affinity) {
                        err = modify_raw_packet_tx_affinity(dev->mdev, sq,
                                                            tx_affinity);
                                return err;
                }
  
-               return modify_raw_packet_qp_sq(dev->mdev, sq, sq_state);
+               return modify_raw_packet_qp_sq(dev->mdev, sq, sq_state, raw_qp_param);
        }
  
        return 0;
@@@ -2577,7 -2658,6 +2657,6 @@@ static int __mlx5_ib_modify_qp(struct i
        struct mlx5_ib_port *mibport = NULL;
        enum mlx5_qp_state mlx5_cur, mlx5_new;
        enum mlx5_qp_optpar optpar;
-       int sqd_event;
        int mlx5_st;
        int err;
        u16 op;
        if (qp->rq.wqe_cnt && cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT)
                context->db_rec_addr = cpu_to_be64(qp->db.dma);
  
-       if (cur_state == IB_QPS_RTS && new_state == IB_QPS_SQD  &&
-           attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY && attr->en_sqd_async_notify)
-               sqd_event = 1;
-       else
-               sqd_event = 0;
        if (cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT) {
                u8 port_num = (attr_mask & IB_QP_PORT ? attr->port_num :
                               qp->port) - 1;
                        raw_qp_param.rq_q_ctr_id = mibport->q_cnt_id;
                        raw_qp_param.set_mask |= MLX5_RAW_QP_MOD_SET_RQ_Q_CTR_ID;
                }
+               if (attr_mask & IB_QP_RATE_LIMIT) {
+                       raw_qp_param.rate_limit = attr->rate_limit;
+                       raw_qp_param.set_mask |= MLX5_RAW_QP_RATE_LIMIT;
+               }
                err = modify_raw_packet_qp(dev, qp, &raw_qp_param, tx_affinity);
        } else {
                err = mlx5_core_qp_modify(dev->mdev, op, optpar, context,
@@@ -3067,10 -3147,10 +3146,10 @@@ static void set_linv_umr_seg(struct mlx
  {
        memset(umr, 0, sizeof(*umr));
        umr->mkey_mask = cpu_to_be64(MLX5_MKEY_MASK_FREE);
-       umr->flags = 1 << 7;
+       umr->flags = MLX5_UMR_INLINE;
  }
  
- static __be64 get_umr_reg_mr_mask(void)
+ static __be64 get_umr_reg_mr_mask(int atomic)
  {
        u64 result;
  
                 MLX5_MKEY_MASK_KEY             |
                 MLX5_MKEY_MASK_RR              |
                 MLX5_MKEY_MASK_RW              |
-                MLX5_MKEY_MASK_A               |
                 MLX5_MKEY_MASK_FREE;
  
+       if (atomic)
+               result |= MLX5_MKEY_MASK_A;
        return cpu_to_be64(result);
  }
  
@@@ -3146,7 -3228,7 +3227,7 @@@ static __be64 get_umr_update_pd_mask(vo
  }
  
  static void set_reg_umr_segment(struct mlx5_wqe_umr_ctrl_seg *umr,
-                               struct ib_send_wr *wr)
+                               struct ib_send_wr *wr, int atomic)
  {
        struct mlx5_umr_wr *umrwr = umr_wr(wr);
  
                if (wr->send_flags & MLX5_IB_SEND_UMR_UPDATE_PD)
                        umr->mkey_mask |= get_umr_update_pd_mask();
                if (!umr->mkey_mask)
-                       umr->mkey_mask = get_umr_reg_mr_mask();
+                       umr->mkey_mask = get_umr_reg_mr_mask(atomic);
        } else {
                umr->mkey_mask = get_umr_unreg_mr_mask();
        }
@@@ -4024,7 -4106,7 +4105,7 @@@ int mlx5_ib_post_send(struct ib_qp *ibq
                        }
                        qp->sq.wr_data[idx] = MLX5_IB_WR_UMR;
                        ctrl->imm = cpu_to_be32(umr_wr(wr)->mkey);
-                       set_reg_umr_segment(seg, wr);
+                       set_reg_umr_segment(seg, wr, !!(MLX5_CAP_GEN(mdev, atomic)));
                        seg += sizeof(struct mlx5_wqe_umr_ctrl_seg);
                        size += sizeof(struct mlx5_wqe_umr_ctrl_seg) / 16;
                        if (unlikely((seg == qend)))
@@@ -4814,14 -4896,6 +4895,14 @@@ struct ib_rwq_ind_table *mlx5_ib_create
                                 udata->inlen))
                return ERR_PTR(-EOPNOTSUPP);
  
 +      if (init_attr->log_ind_tbl_size >
 +          MLX5_CAP_GEN(dev->mdev, log_max_rqt_size)) {
 +              mlx5_ib_dbg(dev, "log_ind_tbl_size = %d is bigger than supported = %d\n",
 +                          init_attr->log_ind_tbl_size,
 +                          MLX5_CAP_GEN(dev->mdev, log_max_rqt_size));
 +              return ERR_PTR(-EINVAL);
 +      }
 +
        min_resp_len = offsetof(typeof(resp), reserved) + sizeof(resp.reserved);
        if (udata->outlen && udata->outlen < min_resp_len)
                return ERR_PTR(-EINVAL);
index 2baa45a8e4019615e55ae6595704e8ffee90d8a5,9badd0224ec58ab000ee053345d4e211b86915ad..5b9601014f0cf33455d29a2c47bac43109f0172d
@@@ -65,6 -65,7 +65,6 @@@ MODULE_DESCRIPTION("NetEffect RNIC Low-
  MODULE_LICENSE("Dual BSD/GPL");
  MODULE_VERSION(DRV_VERSION);
  
 -int max_mtu = 9000;
  int interrupt_mod_interval = 0;
  
  /* Interoperability */
@@@ -515,7 -516,6 +515,6 @@@ static int nes_probe(struct pci_dev *pc
        /* Allocate hardware structure */
        nesdev = kzalloc(sizeof(struct nes_device), GFP_KERNEL);
        if (!nesdev) {
-               printk(KERN_ERR PFX "%s: Unable to alloc hardware struct\n", pci_name(pcidev));
                ret = -ENOMEM;
                goto bail2;
        }
index 7f8597d6738bb93d31f8b22bedb87bf20decac60,4dcfe669ebad932d16d174bc3b153a7888318740..5921ea3d50ae436996913e3ac38ca0a2d6d60a31
@@@ -662,10 -662,14 +662,14 @@@ tso_sq_no_longer_full
                                nesnic->sq_head &= nesnic->sq_size-1;
                        }
                } else {
-                       nesvnic->linearized_skbs++;
                        hoffset = skb_transport_header(skb) - skb->data;
                        nhoffset = skb_network_header(skb) - skb->data;
-                       skb_linearize(skb);
+                       if (skb_linearize(skb)) {
+                               nesvnic->tx_sw_dropped++;
+                               kfree_skb(skb);
+                               return NETDEV_TX_OK;
+                       }
+                       nesvnic->linearized_skbs++;
                        skb_set_transport_header(skb, hoffset);
                        skb_set_network_header(skb, nhoffset);
                        if (!nes_nic_send(skb, netdev))
@@@ -981,16 -985,20 +985,16 @@@ static int nes_netdev_change_mtu(struc
  {
        struct nes_vnic *nesvnic = netdev_priv(netdev);
        struct nes_device *nesdev = nesvnic->nesdev;
 -      int ret = 0;
        u8 jumbomode = 0;
        u32 nic_active;
        u32 nic_active_bit;
        u32 uc_all_active;
        u32 mc_all_active;
  
 -      if ((new_mtu < ETH_ZLEN) || (new_mtu > max_mtu))
 -              return -EINVAL;
 -
        netdev->mtu = new_mtu;
        nesvnic->max_frame_size = new_mtu + VLAN_ETH_HLEN;
  
 -      if (netdev->mtu > 1500) {
 +      if (netdev->mtu > ETH_DATA_LEN) {
                jumbomode=1;
        }
        nes_nic_init_timer_defaults(nesdev, jumbomode);
                nes_write_indexed(nesdev, NES_IDX_NIC_UNICAST_ALL, nic_active);
        }
  
 -      return ret;
 +      return 0;
  }
  
  
@@@ -1461,7 -1469,8 +1465,8 @@@ static int nes_netdev_set_pauseparam(st
  /**
   * nes_netdev_get_settings
   */
- static int nes_netdev_get_settings(struct net_device *netdev, struct ethtool_cmd *et_cmd)
+ static int nes_netdev_get_link_ksettings(struct net_device *netdev,
+                                        struct ethtool_link_ksettings *cmd)
  {
        struct nes_vnic *nesvnic = netdev_priv(netdev);
        struct nes_device *nesdev = nesvnic->nesdev;
        u8 phy_type = nesadapter->phy_type[mac_index];
        u8 phy_index = nesadapter->phy_index[mac_index];
        u16 phy_data;
+       u32 supported, advertising;
  
-       et_cmd->duplex = DUPLEX_FULL;
-       et_cmd->port   = PORT_MII;
-       et_cmd->maxtxpkt = 511;
-       et_cmd->maxrxpkt = 511;
+       cmd->base.duplex = DUPLEX_FULL;
+       cmd->base.port   = PORT_MII;
  
        if (nesadapter->OneG_Mode) {
-               ethtool_cmd_speed_set(et_cmd, SPEED_1000);
+               cmd->base.speed = SPEED_1000;
                if (phy_type == NES_PHY_TYPE_PUMA_1G) {
-                       et_cmd->supported   = SUPPORTED_1000baseT_Full;
-                       et_cmd->advertising = ADVERTISED_1000baseT_Full;
-                       et_cmd->autoneg     = AUTONEG_DISABLE;
-                       et_cmd->transceiver = XCVR_INTERNAL;
-                       et_cmd->phy_address = mac_index;
+                       supported   = SUPPORTED_1000baseT_Full;
+                       advertising = ADVERTISED_1000baseT_Full;
+                       cmd->base.autoneg     = AUTONEG_DISABLE;
+                       cmd->base.phy_address = mac_index;
                } else {
                        unsigned long flags;
-                       et_cmd->supported   = SUPPORTED_1000baseT_Full
-                                           | SUPPORTED_Autoneg;
-                       et_cmd->advertising = ADVERTISED_1000baseT_Full
-                                           | ADVERTISED_Autoneg;
+                       supported = SUPPORTED_1000baseT_Full
+                               | SUPPORTED_Autoneg;
+                       advertising = ADVERTISED_1000baseT_Full
+                               | ADVERTISED_Autoneg;
                        spin_lock_irqsave(&nesadapter->phy_lock, flags);
                        nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data);
                        spin_unlock_irqrestore(&nesadapter->phy_lock, flags);
                        if (phy_data & 0x1000)
-                               et_cmd->autoneg = AUTONEG_ENABLE;
+                               cmd->base.autoneg = AUTONEG_ENABLE;
                        else
-                               et_cmd->autoneg = AUTONEG_DISABLE;
-                       et_cmd->transceiver = XCVR_EXTERNAL;
-                       et_cmd->phy_address = phy_index;
+                               cmd->base.autoneg = AUTONEG_DISABLE;
+                       cmd->base.phy_address = phy_index;
                }
+               ethtool_convert_legacy_u32_to_link_mode(
+                       cmd->link_modes.supported, supported);
+               ethtool_convert_legacy_u32_to_link_mode(
+                       cmd->link_modes.advertising, advertising);
                return 0;
        }
        if ((phy_type == NES_PHY_TYPE_ARGUS) ||
            (phy_type == NES_PHY_TYPE_SFP_D) ||
            (phy_type == NES_PHY_TYPE_KR)) {
-               et_cmd->transceiver = XCVR_EXTERNAL;
-               et_cmd->port        = PORT_FIBRE;
-               et_cmd->supported   = SUPPORTED_FIBRE;
-               et_cmd->advertising = ADVERTISED_FIBRE;
-               et_cmd->phy_address = phy_index;
+               cmd->base.port        = PORT_FIBRE;
+               supported   = SUPPORTED_FIBRE;
+               advertising = ADVERTISED_FIBRE;
+               cmd->base.phy_address = phy_index;
        } else {
-               et_cmd->transceiver = XCVR_INTERNAL;
-               et_cmd->supported   = SUPPORTED_10000baseT_Full;
-               et_cmd->advertising = ADVERTISED_10000baseT_Full;
-               et_cmd->phy_address = mac_index;
+               supported   = SUPPORTED_10000baseT_Full;
+               advertising = ADVERTISED_10000baseT_Full;
+               cmd->base.phy_address = mac_index;
        }
-       ethtool_cmd_speed_set(et_cmd, SPEED_10000);
-       et_cmd->autoneg = AUTONEG_DISABLE;
+       cmd->base.speed = SPEED_10000;
+       cmd->base.autoneg = AUTONEG_DISABLE;
+       ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.supported,
+                                               supported);
+       ethtool_convert_legacy_u32_to_link_mode(cmd->link_modes.advertising,
+                                               advertising);
        return 0;
  }
  
  /**
   * nes_netdev_set_settings
   */
- static int nes_netdev_set_settings(struct net_device *netdev, struct ethtool_cmd *et_cmd)
+ static int
+ nes_netdev_set_link_ksettings(struct net_device *netdev,
+                             const struct ethtool_link_ksettings *cmd)
  {
        struct nes_vnic *nesvnic = netdev_priv(netdev);
        struct nes_device *nesdev = nesvnic->nesdev;
  
                spin_lock_irqsave(&nesadapter->phy_lock, flags);
                nes_read_1G_phy_reg(nesdev, 0, phy_index, &phy_data);
-               if (et_cmd->autoneg) {
+               if (cmd->base.autoneg) {
                        /* Turn on Full duplex, Autoneg, and restart autonegotiation */
                        phy_data |= 0x1300;
                } else {
  
  static const struct ethtool_ops nes_ethtool_ops = {
        .get_link = ethtool_op_get_link,
-       .get_settings = nes_netdev_get_settings,
-       .set_settings = nes_netdev_set_settings,
        .get_strings = nes_netdev_get_strings,
        .get_sset_count = nes_netdev_get_sset_count,
        .get_ethtool_stats = nes_netdev_get_ethtool_stats,
        .set_coalesce = nes_netdev_set_coalesce,
        .get_pauseparam = nes_netdev_get_pauseparam,
        .set_pauseparam = nes_netdev_set_pauseparam,
+       .get_link_ksettings = nes_netdev_get_link_ksettings,
+       .set_link_ksettings = nes_netdev_set_link_ksettings,
  };
  
  static void nes_vlan_mode(struct net_device *netdev, struct nes_device *nesdev, netdev_features_t features)
@@@ -1654,7 -1670,7 +1666,7 @@@ struct net_device *nes_netdev_init(stru
  
        netdev->watchdog_timeo = NES_TX_TIMEOUT;
        netdev->irq = nesdev->pcidev->irq;
 -      netdev->mtu = ETH_DATA_LEN;
 +      netdev->max_mtu = NES_MAX_MTU;
        netdev->hard_header_len = ETH_HLEN;
        netdev->addr_len = ETH_ALEN;
        netdev->type = ARPHRD_ETHER;
index ffff5a54cb340d9d95d6bef83ce78ff456011d46,a576603304f7d5640f68a6f38218b7312351ae14..16967cdb45dffb6c9841748ac0b13f379d02adb9
@@@ -46,7 -46,7 +46,7 @@@
  #include "rxe_loc.h"
  
  static LIST_HEAD(rxe_dev_list);
- static spinlock_t dev_list_lock; /* spinlock for device list */
+ static DEFINE_SPINLOCK(dev_list_lock); /* spinlock for device list */
  
  struct rxe_dev *net_to_rxe(struct net_device *ndev)
  {
@@@ -243,8 -243,10 +243,8 @@@ static struct socket *rxe_setup_udp_tun
  {
        int err;
        struct socket *sock;
 -      struct udp_port_cfg udp_cfg;
 -      struct udp_tunnel_sock_cfg tnl_cfg;
 -
 -      memset(&udp_cfg, 0, sizeof(udp_cfg));
 +      struct udp_port_cfg udp_cfg = {0};
 +      struct udp_tunnel_sock_cfg tnl_cfg = {0};
  
        if (ipv6) {
                udp_cfg.family = AF_INET6;
                return ERR_PTR(err);
        }
  
 -      tnl_cfg.sk_user_data = NULL;
        tnl_cfg.encap_type = 1;
        tnl_cfg.encap_rcv = rxe_udp_encap_recv;
 -      tnl_cfg.encap_destroy = NULL;
  
        /* Setup UDP tunnel */
        setup_udp_tunnel_sock(net, sock, &tnl_cfg);
@@@ -455,6 -459,8 +455,8 @@@ static int send(struct rxe_dev *rxe, st
                return -EAGAIN;
        }
  
+       if (pkt->qp)
+               atomic_inc(&pkt->qp->skb_out);
        kfree_skb(skb);
  
        return 0;
@@@ -659,8 -665,6 +661,6 @@@ struct notifier_block rxe_net_notifier 
  
  int rxe_net_ipv4_init(void)
  {
-       spin_lock_init(&dev_list_lock);
        recv_sockets.sk4 = rxe_setup_udp_tunnel(&init_net,
                                htons(ROCE_V2_UDP_DPORT), false);
        if (IS_ERR(recv_sockets.sk4)) {
@@@ -676,8 -680,6 +676,6 @@@ int rxe_net_ipv6_init(void
  {
  #if IS_ENABLED(CONFIG_IPV6)
  
-       spin_lock_init(&dev_list_lock);
        recv_sockets.sk6 = rxe_setup_udp_tunnel(&init_net,
                                                htons(ROCE_V2_UDP_DPORT), true);
        if (IS_ERR(recv_sockets.sk6)) {
index 22bd9630dcd924315012019ff0a39242d7476a59,b246653cf713e7fd5b5d507426d308e55ea3bf9c..73d4a97603a1ded959b115072341911120e17da9
@@@ -548,23 -548,23 +548,23 @@@ static void update_wqe_psn(struct rxe_q
  static void save_state(struct rxe_send_wqe *wqe,
                       struct rxe_qp *qp,
                       struct rxe_send_wqe *rollback_wqe,
-                      struct rxe_qp *rollback_qp)
+                      u32 *rollback_psn)
  {
        rollback_wqe->state     = wqe->state;
        rollback_wqe->first_psn = wqe->first_psn;
        rollback_wqe->last_psn  = wqe->last_psn;
-       rollback_qp->req.psn    = qp->req.psn;
+       *rollback_psn           = qp->req.psn;
  }
  
  static void rollback_state(struct rxe_send_wqe *wqe,
                           struct rxe_qp *qp,
                           struct rxe_send_wqe *rollback_wqe,
-                          struct rxe_qp *rollback_qp)
+                          u32 rollback_psn)
  {
        wqe->state     = rollback_wqe->state;
        wqe->first_psn = rollback_wqe->first_psn;
        wqe->last_psn  = rollback_wqe->last_psn;
-       qp->req.psn    = rollback_qp->req.psn;
+       qp->req.psn    = rollback_psn;
  }
  
  static void update_state(struct rxe_qp *qp, struct rxe_send_wqe *wqe,
@@@ -593,8 -593,10 +593,10 @@@ int rxe_requester(void *arg
        int mtu;
        int opcode;
        int ret;
-       struct rxe_qp rollback_qp;
        struct rxe_send_wqe rollback_wqe;
+       u32 rollback_psn;
+       rxe_add_ref(qp);
  
  next_wqe:
        if (unlikely(!qp->valid || qp->req.state == QP_STATE_ERROR))
                                                       qp->req.wqe_index);
                        wqe->state = wqe_state_done;
                        wqe->status = IB_WC_SUCCESS;
 -                      goto complete;
 +                      __rxe_do_task(&qp->comp.task);
++                      rxe_drop_ref(qp);
 +                      return 0;
                }
                payload = mtu;
        }
         * rxe_xmit_packet().
         * Otherwise, completer might initiate an unjustified retry flow.
         */
-       save_state(wqe, qp, &rollback_wqe, &rollback_qp);
+       save_state(wqe, qp, &rollback_wqe, &rollback_psn);
        update_wqe_state(qp, wqe, &pkt);
        update_wqe_psn(qp, wqe, &pkt, payload);
        ret = rxe_xmit_packet(to_rdev(qp->ibqp.device), qp, &pkt, skb);
                qp->need_req_skb = 1;
                kfree_skb(skb);
  
-               rollback_state(wqe, qp, &rollback_wqe, &rollback_qp);
+               rollback_state(wqe, qp, &rollback_wqe, rollback_psn);
  
                if (ret == -EAGAIN) {
                        rxe_run_task(&qp->req.task, 1);
@@@ -746,18 -747,15 +749,17 @@@ err
        wqe->status = IB_WC_LOC_PROT_ERR;
        wqe->state = wqe_state_error;
  
 -complete:
 -      if (qp_type(qp) != IB_QPT_RC) {
 -              while (rxe_completer(qp) == 0)
 -                      ;
 -      }
 -      rxe_drop_ref(qp);
 -      return 0;
 -
 +      /*
 +       * IBA Spec. Section 10.7.3.1 SIGNALED COMPLETIONS
 +       * ---------8<---------8<-------------
 +       * ...Note that if a completion error occurs, a Work Completion
 +       * will always be generated, even if the signaling
 +       * indicator requests an Unsignaled Completion.
 +       * ---------8<---------8<-------------
 +       */
 +      wqe->wr.send_flags |= IB_SEND_SIGNALED;
 +      __rxe_do_task(&qp->comp.task);
-       return -EAGAIN;
  exit:
+       rxe_drop_ref(qp);
        return -EAGAIN;
  }
index 339a1eecdfe3083e2b15d09473a1053113b7acaa,46234f52ee295a5061f7e0916c10b8ae47c96b87..096c4f6fbd6583f97a8aa87385861a474adba698
@@@ -63,8 -63,6 +63,8 @@@ MODULE_PARM_DESC(cm_data_debug_level
  #define IPOIB_CM_RX_DELAY       (3 * 256 * HZ)
  #define IPOIB_CM_RX_UPDATE_MASK (0x3)
  
 +#define IPOIB_CM_RX_RESERVE     (ALIGN(IPOIB_HARD_LEN, 16) - IPOIB_ENCAP_LEN)
 +
  static struct ib_qp_attr ipoib_cm_err_attr = {
        .qp_state = IB_QPS_ERR
  };
@@@ -148,15 -146,15 +148,15 @@@ static struct sk_buff *ipoib_cm_alloc_r
        struct sk_buff *skb;
        int i;
  
 -      skb = dev_alloc_skb(IPOIB_CM_HEAD_SIZE + 12);
 +      skb = dev_alloc_skb(ALIGN(IPOIB_CM_HEAD_SIZE + IPOIB_PSEUDO_LEN, 16));
        if (unlikely(!skb))
                return NULL;
  
        /*
 -       * IPoIB adds a 4 byte header. So we need 12 more bytes to align the
 +       * IPoIB adds a IPOIB_ENCAP_LEN byte header, this will align the
         * IP header to a multiple of 16.
         */
 -      skb_reserve(skb, 12);
 +      skb_reserve(skb, IPOIB_CM_RX_RESERVE);
  
        mapping[0] = ib_dma_map_single(priv->ca, skb->data, IPOIB_CM_HEAD_SIZE,
                                       DMA_FROM_DEVICE);
@@@ -357,11 -355,8 +357,8 @@@ static int ipoib_cm_nonsrq_init_rx(stru
        int i;
  
        rx->rx_ring = vzalloc(ipoib_recvq_size * sizeof *rx->rx_ring);
-       if (!rx->rx_ring) {
-               printk(KERN_WARNING "%s: failed to allocate CM non-SRQ ring (%d entries)\n",
-                      priv->ca->name, ipoib_recvq_size);
+       if (!rx->rx_ring)
                return -ENOMEM;
-       }
  
        t = kmalloc(sizeof *t, GFP_KERNEL);
        if (!t) {
@@@ -626,9 -621,9 +623,9 @@@ void ipoib_cm_handle_rx_wc(struct net_d
        if (wc->byte_len < IPOIB_CM_COPYBREAK) {
                int dlen = wc->byte_len;
  
 -              small_skb = dev_alloc_skb(dlen + 12);
 +              small_skb = dev_alloc_skb(dlen + IPOIB_CM_RX_RESERVE);
                if (small_skb) {
 -                      skb_reserve(small_skb, 12);
 +                      skb_reserve(small_skb, IPOIB_CM_RX_RESERVE);
                        ib_dma_sync_single_for_cpu(priv->ca, rx_ring[wr_id].mapping[0],
                                                   dlen, DMA_FROM_DEVICE);
                        skb_copy_from_linear_data(skb, small_skb->data, dlen);
  
  copied:
        skb->protocol = ((struct ipoib_header *) skb->data)->proto;
 -      skb_reset_mac_header(skb);
 -      skb_pull(skb, IPOIB_ENCAP_LEN);
 +      skb_add_pseudo_hdr(skb);
  
        ++dev->stats.rx_packets;
        dev->stats.rx_bytes += skb->len;
@@@ -1054,8 -1050,6 +1051,6 @@@ static struct ib_qp *ipoib_cm_create_tx
  
        tx_qp = ib_create_qp(priv->pd, &attr);
        if (PTR_ERR(tx_qp) == -EINVAL) {
-               ipoib_warn(priv, "can't use GFP_NOIO for QPs on device %s, using GFP_KERNEL\n",
-                          priv->ca->name);
                attr.create_flags &= ~IB_QP_CREATE_USE_GFP_NOIO;
                tx_qp = ib_create_qp(priv->pd, &attr);
        }
@@@ -1134,7 -1128,6 +1129,6 @@@ static int ipoib_cm_tx_init(struct ipoi
        p->tx_ring = __vmalloc(ipoib_sendq_size * sizeof *p->tx_ring,
                               GFP_NOIO, PAGE_KERNEL);
        if (!p->tx_ring) {
-               ipoib_warn(priv, "failed to allocate tx ring\n");
                ret = -ENOMEM;
                goto err_tx;
        }
@@@ -1550,8 -1543,6 +1544,6 @@@ static void ipoib_cm_create_srq(struct 
  
        priv->cm.srq_ring = vzalloc(ipoib_recvq_size * sizeof *priv->cm.srq_ring);
        if (!priv->cm.srq_ring) {
-               printk(KERN_WARNING "%s: failed to allocate CM SRQ ring (%d entries)\n",
-                      priv->ca->name, ipoib_recvq_size);
                ib_destroy_srq(priv->cm.srq);
                priv->cm.srq = NULL;
                return;
index 830fecb6934c8edf60a4c1d138cd4815be4b1314,43cf8b8a8d2e858f7d3978d688b53879e873e8cc..5038f9d2d753f06d7a9c5f26d9f2e864d76ca570
@@@ -128,15 -128,16 +128,15 @@@ static struct sk_buff *ipoib_alloc_rx_s
  
        buf_size = IPOIB_UD_BUF_SIZE(priv->max_ib_mtu);
  
 -      skb = dev_alloc_skb(buf_size + IPOIB_ENCAP_LEN);
 +      skb = dev_alloc_skb(buf_size + IPOIB_HARD_LEN);
        if (unlikely(!skb))
                return NULL;
  
        /*
 -       * IB will leave a 40 byte gap for a GRH and IPoIB adds a 4 byte
 -       * header.  So we need 4 more bytes to get to 48 and align the
 -       * IP header to a multiple of 16.
 +       * the IP header will be at IPOIP_HARD_LEN + IB_GRH_BYTES, that is
 +       * 64 bytes aligned
         */
 -      skb_reserve(skb, 4);
 +      skb_reserve(skb, sizeof(struct ipoib_pseudo_header));
  
        mapping = priv->rx_ring[id].mapping;
        mapping[0] = ib_dma_map_single(priv->ca, skb->data, buf_size,
@@@ -252,7 -253,8 +252,7 @@@ static void ipoib_ib_handle_rx_wc(struc
        skb_pull(skb, IB_GRH_BYTES);
  
        skb->protocol = ((struct ipoib_header *) skb->data)->proto;
 -      skb_reset_mac_header(skb);
 -      skb_pull(skb, IPOIB_ENCAP_LEN);
 +      skb_add_pseudo_hdr(skb);
  
        ++dev->stats.rx_packets;
        dev->stats.rx_bytes += skb->len;
@@@ -416,11 -418,8 +416,8 @@@ static void ipoib_ib_handle_tx_wc(struc
                           "(status=%d, wrid=%d vend_err %x)\n",
                           wc->status, wr_id, wc->vendor_err);
                qp_work = kzalloc(sizeof(*qp_work), GFP_ATOMIC);
-               if (!qp_work) {
-                       ipoib_warn(priv, "%s Failed alloc ipoib_qp_state_validate for qp: 0x%x\n",
-                                  __func__, priv->qp->qp_num);
+               if (!qp_work)
                        return;
-               }
  
                INIT_WORK(&qp_work->work, ipoib_qp_state_validate_work);
                qp_work->priv = priv;
index c50794fb92db4cf5454507b5c35ecdc4ccf8511f,423b30dfe2d8235afa40540a2ee4f7ce56a185fd..3ce0765a05ab615289760fb9c8257b437854efef
@@@ -292,25 -292,6 +292,25 @@@ static struct net_device *ipoib_get_mas
        return dev;
  }
  
 +struct ipoib_walk_data {
 +      const struct sockaddr *addr;
 +      struct net_device *result;
 +};
 +
 +static int ipoib_upper_walk(struct net_device *upper, void *_data)
 +{
 +      struct ipoib_walk_data *data = _data;
 +      int ret = 0;
 +
 +      if (ipoib_is_dev_match_addr_rcu(data->addr, upper)) {
 +              dev_hold(upper);
 +              data->result = upper;
 +              ret = 1;
 +      }
 +
 +      return ret;
 +}
 +
  /**
   * Find a net_device matching the given address, which is an upper device of
   * the given net_device.
  static struct net_device *ipoib_get_net_dev_match_addr(
                const struct sockaddr *addr, struct net_device *dev)
  {
 -      struct net_device *upper,
 -                        *result = NULL;
 -      struct list_head *iter;
 +      struct ipoib_walk_data data = {
 +              .addr = addr,
 +      };
  
        rcu_read_lock();
        if (ipoib_is_dev_match_addr_rcu(addr, dev)) {
                dev_hold(dev);
 -              result = dev;
 +              data.result = dev;
                goto out;
        }
  
 -      netdev_for_each_all_upper_dev_rcu(dev, upper, iter) {
 -              if (ipoib_is_dev_match_addr_rcu(addr, upper)) {
 -                      dev_hold(upper);
 -                      result = upper;
 -                      break;
 -              }
 -      }
 +      netdev_walk_all_upper_dev_rcu(dev, ipoib_upper_walk, &data);
  out:
        rcu_read_unlock();
 -      return result;
 +      return data.result;
  }
  
  /* returns the number of IPoIB netdevs on top a given ipoib device matching a
@@@ -938,12 -925,9 +938,12 @@@ static void neigh_add_path(struct sk_bu
                                ipoib_neigh_free(neigh);
                                goto err_drop;
                        }
 -                      if (skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE)
 +                      if (skb_queue_len(&neigh->queue) <
 +                          IPOIB_MAX_PATH_REC_QUEUE) {
 +                              /* put pseudoheader back on for next time */
 +                              skb_push(skb, IPOIB_PSEUDO_LEN);
                                __skb_queue_tail(&neigh->queue, skb);
 -                      else {
 +                      else {
                                ipoib_warn(priv, "queue length limit %d. Packet drop.\n",
                                           skb_queue_len(&neigh->queue));
                                goto err_drop;
@@@ -980,7 -964,7 +980,7 @@@ err_drop
  }
  
  static void unicast_arp_send(struct sk_buff *skb, struct net_device *dev,
 -                           struct ipoib_cb *cb)
 +                           struct ipoib_pseudo_header *phdr)
  {
        struct ipoib_dev_priv *priv = netdev_priv(dev);
        struct ipoib_path *path;
  
        spin_lock_irqsave(&priv->lock, flags);
  
 -      path = __path_find(dev, cb->hwaddr + 4);
 +      path = __path_find(dev, phdr->hwaddr + 4);
        if (!path || !path->valid) {
                int new_path = 0;
  
                if (!path) {
 -                      path = path_rec_create(dev, cb->hwaddr + 4);
 +                      path = path_rec_create(dev, phdr->hwaddr + 4);
                        new_path = 1;
                }
                if (path) {
                        if (skb_queue_len(&path->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
 +                              /* put pseudoheader back on for next time */
 +                              skb_push(skb, IPOIB_PSEUDO_LEN);
                                __skb_queue_tail(&path->queue, skb);
                        } else {
                                ++dev->stats.tx_dropped;
                          be16_to_cpu(path->pathrec.dlid));
  
                spin_unlock_irqrestore(&priv->lock, flags);
 -              ipoib_send(dev, skb, path->ah, IPOIB_QPN(cb->hwaddr));
 +              ipoib_send(dev, skb, path->ah, IPOIB_QPN(phdr->hwaddr));
                return;
        } else if ((path->query || !path_rec_start(dev, path)) &&
                   skb_queue_len(&path->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
 +              /* put pseudoheader back on for next time */
 +              skb_push(skb, IPOIB_PSEUDO_LEN);
                __skb_queue_tail(&path->queue, skb);
        } else {
                ++dev->stats.tx_dropped;
@@@ -1046,15 -1026,13 +1046,15 @@@ static int ipoib_start_xmit(struct sk_b
  {
        struct ipoib_dev_priv *priv = netdev_priv(dev);
        struct ipoib_neigh *neigh;
 -      struct ipoib_cb *cb = ipoib_skb_cb(skb);
 +      struct ipoib_pseudo_header *phdr;
        struct ipoib_header *header;
        unsigned long flags;
  
 +      phdr = (struct ipoib_pseudo_header *) skb->data;
 +      skb_pull(skb, sizeof(*phdr));
        header = (struct ipoib_header *) skb->data;
  
 -      if (unlikely(cb->hwaddr[4] == 0xff)) {
 +      if (unlikely(phdr->hwaddr[4] == 0xff)) {
                /* multicast, arrange "if" according to probability */
                if ((header->proto != htons(ETH_P_IP)) &&
                    (header->proto != htons(ETH_P_IPV6)) &&
                        return NETDEV_TX_OK;
                }
                /* Add in the P_Key for multicast*/
 -              cb->hwaddr[8] = (priv->pkey >> 8) & 0xff;
 -              cb->hwaddr[9] = priv->pkey & 0xff;
 +              phdr->hwaddr[8] = (priv->pkey >> 8) & 0xff;
 +              phdr->hwaddr[9] = priv->pkey & 0xff;
  
 -              neigh = ipoib_neigh_get(dev, cb->hwaddr);
 +              neigh = ipoib_neigh_get(dev, phdr->hwaddr);
                if (likely(neigh))
                        goto send_using_neigh;
 -              ipoib_mcast_send(dev, cb->hwaddr, skb);
 +              ipoib_mcast_send(dev, phdr->hwaddr, skb);
                return NETDEV_TX_OK;
        }
  
        case htons(ETH_P_IP):
        case htons(ETH_P_IPV6):
        case htons(ETH_P_TIPC):
 -              neigh = ipoib_neigh_get(dev, cb->hwaddr);
 +              neigh = ipoib_neigh_get(dev, phdr->hwaddr);
                if (unlikely(!neigh)) {
 -                      neigh_add_path(skb, cb->hwaddr, dev);
 +                      neigh_add_path(skb, phdr->hwaddr, dev);
                        return NETDEV_TX_OK;
                }
                break;
        case htons(ETH_P_ARP):
        case htons(ETH_P_RARP):
                /* for unicast ARP and RARP should always perform path find */
 -              unicast_arp_send(skb, dev, cb);
 +              unicast_arp_send(skb, dev, phdr);
                return NETDEV_TX_OK;
        default:
                /* ethertype not supported by IPoIB */
@@@ -1108,13 -1086,11 +1108,13 @@@ send_using_neigh
                        goto unref;
                }
        } else if (neigh->ah) {
 -              ipoib_send(dev, skb, neigh->ah, IPOIB_QPN(cb->hwaddr));
 +              ipoib_send(dev, skb, neigh->ah, IPOIB_QPN(phdr->hwaddr));
                goto unref;
        }
  
        if (skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE) {
 +              /* put pseudoheader back on for next time */
 +              skb_push(skb, sizeof(*phdr));
                spin_lock_irqsave(&priv->lock, flags);
                __skb_queue_tail(&neigh->queue, skb);
                spin_unlock_irqrestore(&priv->lock, flags);
@@@ -1146,8 -1122,8 +1146,8 @@@ static int ipoib_hard_header(struct sk_
                             unsigned short type,
                             const void *daddr, const void *saddr, unsigned len)
  {
 +      struct ipoib_pseudo_header *phdr;
        struct ipoib_header *header;
 -      struct ipoib_cb *cb = ipoib_skb_cb(skb);
  
        header = (struct ipoib_header *) skb_push(skb, sizeof *header);
  
  
        /*
         * we don't rely on dst_entry structure,  always stuff the
 -       * destination address into skb->cb so we can figure out where
 +       * destination address into skb hard header so we can figure out where
         * to send the packet later.
         */
 -      memcpy(cb->hwaddr, daddr, INFINIBAND_ALEN);
 +      phdr = (struct ipoib_pseudo_header *) skb_push(skb, sizeof(*phdr));
 +      memcpy(phdr->hwaddr, daddr, INFINIBAND_ALEN);
  
 -      return sizeof *header;
 +      return IPOIB_HARD_LEN;
  }
  
  static void ipoib_set_mcast_list(struct net_device *dev)
@@@ -1619,11 -1594,8 +1619,8 @@@ int ipoib_dev_init(struct net_device *d
        /* Allocate RX/TX "rings" to hold queued skbs */
        priv->rx_ring = kzalloc(ipoib_recvq_size * sizeof *priv->rx_ring,
                                GFP_KERNEL);
-       if (!priv->rx_ring) {
-               printk(KERN_WARNING "%s: failed to allocate RX ring (%d entries)\n",
-                      ca->name, ipoib_recvq_size);
+       if (!priv->rx_ring)
                goto out;
-       }
  
        priv->tx_ring = vzalloc(ipoib_sendq_size * sizeof *priv->tx_ring);
        if (!priv->tx_ring) {
@@@ -1784,7 -1756,7 +1781,7 @@@ void ipoib_setup(struct net_device *dev
  
        dev->flags              |= IFF_BROADCAST | IFF_MULTICAST;
  
 -      dev->hard_header_len     = IPOIB_ENCAP_LEN;
 +      dev->hard_header_len     = IPOIB_HARD_LEN;
        dev->addr_len            = INFINIBAND_ALEN;
        dev->type                = ARPHRD_INFINIBAND;
        dev->tx_queue_len        = ipoib_sendq_size * 2;
@@@ -2029,7 -2001,6 +2026,7 @@@ static struct net_device *ipoib_add_por
        /* MTU will be reset when mcast join happens */
        priv->dev->mtu  = IPOIB_UD_MTU(priv->max_ib_mtu);
        priv->mcast_mtu  = priv->admin_mtu = priv->dev->mtu;
 +      priv->dev->max_mtu = IPOIB_CM_MTU;
  
        priv->dev->neigh_priv_len = sizeof(struct ipoib_neigh);
  
index 1909dd252c9406ba4700e96d5730a67c51ba1a91,2a3980c2c6708355a192eecf50cd48d6f38b1d29..fddff403d5d21b0c8a3216de6f7ec0170afa3278
@@@ -575,8 -575,11 +575,11 @@@ void ipoib_mcast_join_task(struct work_
        if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags))
                return;
  
-       if (ib_query_port(priv->ca, priv->port, &port_attr) ||
-           port_attr.state != IB_PORT_ACTIVE) {
+       if (ib_query_port(priv->ca, priv->port, &port_attr)) {
+               ipoib_dbg(priv, "ib_query_port() failed\n");
+               return;
+       }
+       if (port_attr.state != IB_PORT_ACTIVE) {
                ipoib_dbg(priv, "port state is not ACTIVE (state = %d) suspending join task\n",
                          port_attr.state);
                return;
@@@ -796,11 -799,9 +799,11 @@@ void ipoib_mcast_send(struct net_devic
                        __ipoib_mcast_add(dev, mcast);
                        list_add_tail(&mcast->list, &priv->multicast_list);
                }
 -              if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
 +              if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE) {
 +                      /* put pseudoheader back on for next time */
 +                      skb_push(skb, sizeof(struct ipoib_pseudo_header));
                        skb_queue_tail(&mcast->pkt_queue, skb);
 -              else {
 +              else {
                        ++dev->stats.tx_dropped;
                        dev_kfree_skb_any(skb);
                }
diff --combined drivers/nvme/host/rdma.c
index f42ab70ffa38b6a03fc9943cc8ddbfe1855bc3d0,accbe8edb6c43b2e52a443f97fc55d76e7f4e5cf..f587af345889eb1b32a1f4f87dbe0c9a3a30ae42
@@@ -28,6 -28,7 +28,6 @@@
  
  #include <rdma/ib_verbs.h>
  #include <rdma/rdma_cm.h>
 -#include <rdma/ib_cm.h>
  #include <linux/nvme-rdma.h>
  
  #include "nvme.h"
  
  #define NVME_RDMA_MAX_INLINE_SEGMENTS 1
  
+ static const char *const nvme_rdma_cm_status_strs[] = {
+       [NVME_RDMA_CM_INVALID_LEN]      = "invalid length",
+       [NVME_RDMA_CM_INVALID_RECFMT]   = "invalid record format",
+       [NVME_RDMA_CM_INVALID_QID]      = "invalid queue ID",
+       [NVME_RDMA_CM_INVALID_HSQSIZE]  = "invalid host SQ size",
+       [NVME_RDMA_CM_INVALID_HRQSIZE]  = "invalid host RQ size",
+       [NVME_RDMA_CM_NO_RSC]           = "resource not found",
+       [NVME_RDMA_CM_INVALID_IRD]      = "invalid IRD",
+       [NVME_RDMA_CM_INVALID_ORD]      = "Invalid ORD",
+ };
+ static const char *nvme_rdma_cm_msg(enum nvme_rdma_cm_status status)
+ {
+       size_t index = status;
+       if (index < ARRAY_SIZE(nvme_rdma_cm_status_strs) &&
+           nvme_rdma_cm_status_strs[index])
+               return nvme_rdma_cm_status_strs[index];
+       else
+               return "unrecognized reason";
+ };
  /*
   * We handle AEN commands ourselves and don't even let the
   * block layer know about them.
@@@ -65,7 -88,6 +87,7 @@@ struct nvme_rdma_qe 
  
  struct nvme_rdma_queue;
  struct nvme_rdma_request {
 +      struct nvme_request     req;
        struct ib_mr            *mr;
        struct nvme_rdma_qe     sqe;
        struct ib_sge           sge[1 + NVME_RDMA_MAX_INLINE_SEGMENTS];
@@@ -83,7 -105,6 +105,7 @@@ enum nvme_rdma_queue_flags 
        NVME_RDMA_Q_CONNECTED = (1 << 0),
        NVME_RDMA_IB_QUEUE_ALLOCATED = (1 << 1),
        NVME_RDMA_Q_DELETING = (1 << 2),
 +      NVME_RDMA_Q_LIVE = (1 << 3),
  };
  
  struct nvme_rdma_queue {
@@@ -241,9 -262,7 +263,9 @@@ out_free_ring
  
  static void nvme_rdma_qp_event(struct ib_event *event, void *context)
  {
 -      pr_debug("QP event %d\n", event->event);
 +      pr_debug("QP event %s (%d)\n",
 +               ib_event_msg(event->event), event->event);
 +
  }
  
  static int nvme_rdma_wait_for_cm(struct nvme_rdma_queue *queue)
@@@ -627,18 -646,10 +649,18 @@@ static int nvme_rdma_connect_io_queues(
  
        for (i = 1; i < ctrl->queue_count; i++) {
                ret = nvmf_connect_io_queue(&ctrl->ctrl, i);
 -              if (ret)
 -                      break;
 +              if (ret) {
 +                      dev_info(ctrl->ctrl.device,
 +                              "failed to connect i/o queue: %d\n", ret);
 +                      goto out_free_queues;
 +              }
 +              set_bit(NVME_RDMA_Q_LIVE, &ctrl->queues[i].flags);
        }
  
 +      return 0;
 +
 +out_free_queues:
 +      nvme_rdma_free_io_queues(ctrl);
        return ret;
  }
  
@@@ -723,8 -734,6 +745,8 @@@ static void nvme_rdma_reconnect_ctrl_wo
        if (ret)
                goto stop_admin_q;
  
 +      set_bit(NVME_RDMA_Q_LIVE, &ctrl->queues[0].flags);
 +
        ret = nvme_enable_ctrl(&ctrl->ctrl, ctrl->cap);
        if (ret)
                goto stop_admin_q;
@@@ -774,10 -783,8 +796,10 @@@ static void nvme_rdma_error_recovery_wo
  
        nvme_stop_keep_alive(&ctrl->ctrl);
  
 -      for (i = 0; i < ctrl->queue_count; i++)
 +      for (i = 0; i < ctrl->queue_count; i++) {
                clear_bit(NVME_RDMA_Q_CONNECTED, &ctrl->queues[i].flags);
 +              clear_bit(NVME_RDMA_Q_LIVE, &ctrl->queues[i].flags);
 +      }
  
        if (ctrl->queue_count > 1)
                nvme_stop_queues(&ctrl->ctrl);
@@@ -965,7 -972,8 +987,7 @@@ static int nvme_rdma_map_data(struct nv
        struct nvme_rdma_request *req = blk_mq_rq_to_pdu(rq);
        struct nvme_rdma_device *dev = queue->device;
        struct ib_device *ibdev = dev->dev;
 -      int nents, count;
 -      int ret;
 +      int count, ret;
  
        req->num_sge = 1;
        req->inline_data = false;
                return nvme_rdma_set_sg_null(c);
  
        req->sg_table.sgl = req->first_sgl;
 -      ret = sg_alloc_table_chained(&req->sg_table, rq->nr_phys_segments,
 -                              req->sg_table.sgl);
 +      ret = sg_alloc_table_chained(&req->sg_table,
 +                      blk_rq_nr_phys_segments(rq), req->sg_table.sgl);
        if (ret)
                return -ENOMEM;
  
 -      nents = blk_rq_map_sg(rq->q, rq, req->sg_table.sgl);
 -      BUG_ON(nents > rq->nr_phys_segments);
 -      req->nents = nents;
 +      req->nents = blk_rq_map_sg(rq->q, rq, req->sg_table.sgl);
  
 -      count = ib_dma_map_sg(ibdev, req->sg_table.sgl, nents,
 +      count = ib_dma_map_sg(ibdev, req->sg_table.sgl, req->nents,
                    rq_data_dir(rq) == WRITE ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
        if (unlikely(count <= 0)) {
                sg_free_table_chained(&req->sg_table, true);
@@@ -1129,10 -1139,13 +1151,10 @@@ static void nvme_rdma_submit_async_even
  static int nvme_rdma_process_nvme_rsp(struct nvme_rdma_queue *queue,
                struct nvme_completion *cqe, struct ib_wc *wc, int tag)
  {
 -      u16 status = le16_to_cpu(cqe->status);
        struct request *rq;
        struct nvme_rdma_request *req;
        int ret = 0;
  
 -      status >>= 1;
 -
        rq = blk_mq_tag_to_rq(nvme_rdma_tagset(queue), cqe->command_id);
        if (!rq) {
                dev_err(queue->ctrl->ctrl.device,
        }
        req = blk_mq_rq_to_pdu(rq);
  
 -      if (rq->cmd_type == REQ_TYPE_DRV_PRIV && rq->special)
 -              memcpy(rq->special, cqe, sizeof(*cqe));
 -
        if (rq->tag == tag)
                ret = 1;
  
            wc->ex.invalidate_rkey == req->mr->rkey)
                req->mr->need_inval = false;
  
 -      blk_mq_complete_request(rq, status);
 -
 +      req->req.result = cqe->result;
 +      blk_mq_complete_request(rq, le16_to_cpu(cqe->status) >> 1);
        return ret;
  }
  
@@@ -1179,8 -1195,7 +1201,8 @@@ static int __nvme_rdma_recv_done(struc
         */
        if (unlikely(nvme_rdma_queue_idx(queue) == 0 &&
                        cqe->command_id >= NVME_RDMA_AQ_BLKMQ_DEPTH))
 -              nvme_complete_async_event(&queue->ctrl->ctrl, cqe);
 +              nvme_complete_async_event(&queue->ctrl->ctrl, cqe->status,
 +                              &cqe->result);
        else
                ret = nvme_rdma_process_nvme_rsp(queue, cqe, wc, tag);
        ib_dma_sync_single_for_device(ibdev, qe->dma, len, DMA_FROM_DEVICE);
@@@ -1214,16 -1229,24 +1236,24 @@@ out_destroy_queue_ib
  static int nvme_rdma_conn_rejected(struct nvme_rdma_queue *queue,
                struct rdma_cm_event *ev)
  {
-       if (ev->param.conn.private_data_len) {
-               struct nvme_rdma_cm_rej *rej =
-                       (struct nvme_rdma_cm_rej *)ev->param.conn.private_data;
+       struct rdma_cm_id *cm_id = queue->cm_id;
+       int status = ev->status;
+       const char *rej_msg;
+       const struct nvme_rdma_cm_rej *rej_data;
+       u8 rej_data_len;
+       rej_msg = rdma_reject_msg(cm_id, status);
+       rej_data = rdma_consumer_reject_data(cm_id, ev, &rej_data_len);
+       if (rej_data && rej_data_len >= sizeof(u16)) {
+               u16 sts = le16_to_cpu(rej_data->sts);
  
                dev_err(queue->ctrl->ctrl.device,
-                       "Connect rejected, status %d.", le16_to_cpu(rej->sts));
-               /* XXX: Think of something clever to do here... */
+                     "Connect rejected: status %d (%s) nvme status %d (%s).\n",
+                     status, rej_msg, sts, nvme_rdma_cm_msg(sts));
        } else {
                dev_err(queue->ctrl->ctrl.device,
-                       "Connect rejected, no private data.\n");
+                       "Connect rejected: status %d (%s).\n", status, rej_msg);
        }
  
        return -ECONNRESET;
@@@ -1385,24 -1408,6 +1415,24 @@@ nvme_rdma_timeout(struct request *rq, b
        return BLK_EH_HANDLED;
  }
  
 +/*
 + * We cannot accept any other command until the Connect command has completed.
 + */
 +static inline bool nvme_rdma_queue_is_ready(struct nvme_rdma_queue *queue,
 +              struct request *rq)
 +{
 +      if (unlikely(!test_bit(NVME_RDMA_Q_LIVE, &queue->flags))) {
 +              struct nvme_command *cmd = (struct nvme_command *)rq->cmd;
 +
 +              if (rq->cmd_type != REQ_TYPE_DRV_PRIV ||
 +                  cmd->common.opcode != nvme_fabrics_command ||
 +                  cmd->fabrics.fctype != nvme_fabrics_type_connect)
 +                      return false;
 +      }
 +
 +      return true;
 +}
 +
  static int nvme_rdma_queue_rq(struct blk_mq_hw_ctx *hctx,
                const struct blk_mq_queue_data *bd)
  {
  
        WARN_ON_ONCE(rq->tag < 0);
  
 +      if (!nvme_rdma_queue_is_ready(queue, rq))
 +              return BLK_MQ_RQ_QUEUE_BUSY;
 +
        dev = queue->device->dev;
        ib_dma_sync_single_for_cpu(dev, sqe->dma,
                        sizeof(struct nvme_command), DMA_TO_DEVICE);
  
        ret = nvme_setup_cmd(ns, rq, c);
 -      if (ret)
 +      if (ret != BLK_MQ_RQ_QUEUE_OK)
                return ret;
  
 -      c->common.command_id = rq->tag;
        blk_mq_start_request(rq);
  
        map_len = nvme_map_len(rq);
@@@ -1571,8 -1574,6 +1601,8 @@@ static int nvme_rdma_configure_admin_qu
        if (error)
                goto out_cleanup_queue;
  
 +      set_bit(NVME_RDMA_Q_LIVE, &ctrl->queues[0].flags);
 +
        error = nvmf_reg_read64(&ctrl->ctrl, NVME_REG_CAP, &ctrl->cap);
        if (error) {
                dev_err(ctrl->ctrl.device,
@@@ -1937,14 -1938,6 +1967,14 @@@ static struct nvme_ctrl *nvme_rdma_crea
                opts->queue_size = ctrl->ctrl.maxcmd;
        }
  
 +      if (opts->queue_size > ctrl->ctrl.sqsize + 1) {
 +              /* warn if sqsize is lower than queue_size */
 +              dev_warn(ctrl->ctrl.device,
 +                      "queue_size %zu > ctrl sqsize %u, clamping down\n",
 +                      opts->queue_size, ctrl->ctrl.sqsize + 1);
 +              opts->queue_size = ctrl->ctrl.sqsize + 1;
 +      }
 +
        if (opts->nr_io_queues) {
                ret = nvme_rdma_create_io_queues(ctrl);
                if (ret)
index 3fbcdb7a583c5410aaf6c269429d801afbfba978,50f237a46ea17baba33569a7dbb030dc7d37ef3c..8c3760a78ac080af522afb5892d471063243bd7b
@@@ -951,7 -951,6 +951,7 @@@ err_destroy_cq
  
  static void nvmet_rdma_destroy_queue_ib(struct nvmet_rdma_queue *queue)
  {
 +      ib_drain_qp(queue->cm_id->qp);
        rdma_destroy_qp(queue->cm_id);
        ib_free_cq(queue->cq);
  }
@@@ -1045,10 -1044,8 +1045,10 @@@ nvmet_rdma_alloc_queue(struct nvmet_rdm
        }
  
        ret = nvmet_sq_init(&queue->nvme_sq);
 -      if (ret)
 +      if (ret) {
 +              ret = NVME_RDMA_CM_NO_RSC;
                goto out_free_queue;
 +      }
  
        ret = nvmet_rdma_parse_cm_connect_req(&event->param.conn, queue);
        if (ret)
        spin_lock_init(&queue->rsp_wr_wait_lock);
        INIT_LIST_HEAD(&queue->free_rsps);
        spin_lock_init(&queue->rsps_lock);
 +      INIT_LIST_HEAD(&queue->queue_list);
  
        queue->idx = ida_simple_get(&nvmet_rdma_queue_ida, 0, 0, GFP_KERNEL);
        if (queue->idx < 0) {
@@@ -1118,7 -1114,6 +1118,7 @@@ out_destroy_sq
  out_free_queue:
        kfree(queue);
  out_reject:
 +      pr_debug("rejecting connect request with status code %d\n", ret);
        nvmet_rdma_cm_reject(cm_id, ret);
        return NULL;
  }
@@@ -1132,8 -1127,7 +1132,8 @@@ static void nvmet_rdma_qp_event(struct 
                rdma_notify(queue->cm_id, event->event);
                break;
        default:
 -              pr_err("received unrecognized IB QP event %d\n", event->event);
 +              pr_err("received IB QP event: %s (%d)\n",
 +                     ib_event_msg(event->event), event->event);
                break;
        }
  }
@@@ -1250,6 -1244,7 +1250,6 @@@ static void __nvmet_rdma_queue_disconne
  
        if (disconnect) {
                rdma_disconnect(queue->cm_id);
 -              ib_drain_qp(queue->cm_id->qp);
                schedule_work(&queue->release_work);
        }
  }
@@@ -1274,12 -1269,7 +1274,12 @@@ static void nvmet_rdma_queue_connect_fa
  {
        WARN_ON_ONCE(queue->state != NVMET_RDMA_Q_CONNECTING);
  
 -      pr_err("failed to connect queue\n");
 +      mutex_lock(&nvmet_rdma_queue_mutex);
 +      if (!list_empty(&queue->queue_list))
 +              list_del_init(&queue->queue_list);
 +      mutex_unlock(&nvmet_rdma_queue_mutex);
 +
 +      pr_err("failed to connect queue %d\n", queue->idx);
        schedule_work(&queue->release_work);
  }
  
@@@ -1362,18 -1352,15 +1362,21 @@@ static int nvmet_rdma_cm_handler(struc
        case RDMA_CM_EVENT_ADDR_CHANGE:
        case RDMA_CM_EVENT_DISCONNECTED:
        case RDMA_CM_EVENT_TIMEWAIT_EXIT:
 -              nvmet_rdma_queue_disconnect(queue);
 +              /*
 +               * We might end up here when we already freed the qp
 +               * which means queue release sequence is in progress,
 +               * so don't get in the way...
 +               */
 +              if (queue)
 +                      nvmet_rdma_queue_disconnect(queue);
                break;
        case RDMA_CM_EVENT_DEVICE_REMOVAL:
                ret = nvmet_rdma_device_removal(cm_id, queue);
                break;
        case RDMA_CM_EVENT_REJECTED:
+               pr_debug("Connection rejected: %s\n",
+                        rdma_reject_msg(cm_id, event->status));
+               /* FALLTHROUGH */
        case RDMA_CM_EVENT_UNREACHABLE:
        case RDMA_CM_EVENT_CONNECT_ERROR:
                nvmet_rdma_queue_connect_fail(cm_id, queue);
index a5f0fbedf1e7c8f303fa6e3cccb7af400e1f1a87,0779ad2e8f51802a953a8e9c31f7da7669f1502e..57bec544e20a81070d999fc59253d0774a4c6c3b
@@@ -83,7 -83,6 +83,7 @@@ enum 
        MLX5_CMD_OP_SET_HCA_CAP                   = 0x109,
        MLX5_CMD_OP_QUERY_ISSI                    = 0x10a,
        MLX5_CMD_OP_SET_ISSI                      = 0x10b,
 +      MLX5_CMD_OP_SET_DRIVER_VERSION            = 0x10d,
        MLX5_CMD_OP_CREATE_MKEY                   = 0x200,
        MLX5_CMD_OP_QUERY_MKEY                    = 0x201,
        MLX5_CMD_OP_DESTROY_MKEY                  = 0x202,
@@@ -577,7 -576,7 +577,7 @@@ struct mlx5_ifc_per_protocol_networking
        u8         self_lb_en_modifiable[0x1];
        u8         reserved_at_9[0x2];
        u8         max_lso_cap[0x5];
-       u8         reserved_at_10[0x2];
+       u8         multi_pkt_send_wqe[0x2];
        u8         wqe_inline_mode[0x2];
        u8         rss_ind_tbl_cap[0x4];
        u8         reg_umr_sq[0x1];
@@@ -825,8 -824,7 +825,8 @@@ struct mlx5_ifc_cmd_hca_cap_bits 
        u8         early_vf_enable[0x1];
        u8         reserved_at_1a9[0x2];
        u8         local_ca_ack_delay[0x5];
 -      u8         reserved_at_1af[0x2];
 +      u8         port_module_event[0x1];
 +      u8         reserved_at_1b0[0x1];
        u8         ports_check[0x1];
        u8         reserved_at_1b2[0x1];
        u8         disable_link_up[0x1];
        u8         log_pg_sz[0x8];
  
        u8         bf[0x1];
 -      u8         reserved_at_261[0x1];
 +      u8         driver_version[0x1];
        u8         pad_tx_eth_packet[0x1];
        u8         reserved_at_263[0x8];
        u8         log_bf_reg_size[0x5];
@@@ -1757,80 -1755,6 +1757,80 @@@ struct mlx5_ifc_eth_802_3_cntrs_grp_dat
        u8         reserved_at_4c0[0x300];
  };
  
 +struct mlx5_ifc_pcie_perf_cntrs_grp_data_layout_bits {
 +      u8         life_time_counter_high[0x20];
 +
 +      u8         life_time_counter_low[0x20];
 +
 +      u8         rx_errors[0x20];
 +
 +      u8         tx_errors[0x20];
 +
 +      u8         l0_to_recovery_eieos[0x20];
 +
 +      u8         l0_to_recovery_ts[0x20];
 +
 +      u8         l0_to_recovery_framing[0x20];
 +
 +      u8         l0_to_recovery_retrain[0x20];
 +
 +      u8         crc_error_dllp[0x20];
 +
 +      u8         crc_error_tlp[0x20];
 +
 +      u8         reserved_at_140[0x680];
 +};
 +
 +struct mlx5_ifc_pcie_tas_cntrs_grp_data_layout_bits {
 +      u8         life_time_counter_high[0x20];
 +
 +      u8         life_time_counter_low[0x20];
 +
 +      u8         time_to_boot_image_start[0x20];
 +
 +      u8         time_to_link_image[0x20];
 +
 +      u8         calibration_time[0x20];
 +
 +      u8         time_to_first_perst[0x20];
 +
 +      u8         time_to_detect_state[0x20];
 +
 +      u8         time_to_l0[0x20];
 +
 +      u8         time_to_crs_en[0x20];
 +
 +      u8         time_to_plastic_image_start[0x20];
 +
 +      u8         time_to_iron_image_start[0x20];
 +
 +      u8         perst_handler[0x20];
 +
 +      u8         times_in_l1[0x20];
 +
 +      u8         times_in_l23[0x20];
 +
 +      u8         dl_down[0x20];
 +
 +      u8         config_cycle1usec[0x20];
 +
 +      u8         config_cycle2to7usec[0x20];
 +
 +      u8         config_cycle_8to15usec[0x20];
 +
 +      u8         config_cycle_16_to_63usec[0x20];
 +
 +      u8         config_cycle_64usec[0x20];
 +
 +      u8         correctable_err_msg_sent[0x20];
 +
 +      u8         non_fatal_err_msg_sent[0x20];
 +
 +      u8         fatal_err_msg_sent[0x20];
 +
 +      u8         reserved_at_2e0[0x4e0];
 +};
 +
  struct mlx5_ifc_cmd_inter_comp_event_bits {
        u8         command_completion_vector[0x20];
  
@@@ -2995,12 -2919,6 +2995,12 @@@ union mlx5_ifc_eth_cntrs_grp_data_layou
        u8         reserved_at_0[0x7c0];
  };
  
 +union mlx5_ifc_pcie_cntrs_grp_data_layout_auto_bits {
 +      struct mlx5_ifc_pcie_perf_cntrs_grp_data_layout_bits pcie_perf_cntrs_grp_data_layout;
 +      struct mlx5_ifc_pcie_tas_cntrs_grp_data_layout_bits pcie_tas_cntrs_grp_data_layout;
 +      u8         reserved_at_0[0x7c0];
 +};
 +
  union mlx5_ifc_event_auto_bits {
        struct mlx5_ifc_comp_event_bits comp_event;
        struct mlx5_ifc_dct_events_bits dct_events;
@@@ -4086,25 -4004,6 +4086,25 @@@ struct mlx5_ifc_query_issi_in_bits 
        u8         reserved_at_40[0x40];
  };
  
 +struct mlx5_ifc_set_driver_version_out_bits {
 +      u8         status[0x8];
 +      u8         reserved_0[0x18];
 +
 +      u8         syndrome[0x20];
 +      u8         reserved_1[0x40];
 +};
 +
 +struct mlx5_ifc_set_driver_version_in_bits {
 +      u8         opcode[0x10];
 +      u8         reserved_0[0x10];
 +
 +      u8         reserved_1[0x10];
 +      u8         op_mod[0x10];
 +
 +      u8         reserved_2[0x40];
 +      u8         driver_version[64][0x8];
 +};
 +
  struct mlx5_ifc_query_hca_vport_pkey_out_bits {
        u8         status[0x8];
        u8         reserved_at_8[0x18];
@@@ -7320,18 -7219,6 +7320,18 @@@ struct mlx5_ifc_ppcnt_reg_bits 
        union mlx5_ifc_eth_cntrs_grp_data_layout_auto_bits counter_set;
  };
  
 +struct mlx5_ifc_mpcnt_reg_bits {
 +      u8         reserved_at_0[0x8];
 +      u8         pcie_index[0x8];
 +      u8         reserved_at_10[0xa];
 +      u8         grp[0x6];
 +
 +      u8         clr[0x1];
 +      u8         reserved_at_21[0x1f];
 +
 +      union mlx5_ifc_pcie_cntrs_grp_data_layout_auto_bits counter_set;
 +};
 +
  struct mlx5_ifc_ppad_reg_bits {
        u8         reserved_at_0[0x3];
        u8         single_mac[0x1];
@@@ -7937,7 -7824,6 +7937,7 @@@ union mlx5_ifc_ports_control_registers_
        struct mlx5_ifc_pmtu_reg_bits pmtu_reg;
        struct mlx5_ifc_ppad_reg_bits ppad_reg;
        struct mlx5_ifc_ppcnt_reg_bits ppcnt_reg;
 +      struct mlx5_ifc_mpcnt_reg_bits mpcnt_reg;
        struct mlx5_ifc_pplm_reg_bits pplm_reg;
        struct mlx5_ifc_pplr_reg_bits pplr_reg;
        struct mlx5_ifc_ppsc_reg_bits ppsc_reg;
diff --combined include/linux/pci_ids.h
index a5e6c7bca610cfcf24198fc85750c171099faaee,98bb455302cf768f3efc17ba296a4dd15942d1b0..abf4aa4691b25b1e4ee0ec24a05e461d8f326f1d
  #define PCI_CLASS_STORAGE_SATA                0x0106
  #define PCI_CLASS_STORAGE_SATA_AHCI   0x010601
  #define PCI_CLASS_STORAGE_SAS         0x0107
 +#define PCI_CLASS_STORAGE_EXPRESS     0x010802
  #define PCI_CLASS_STORAGE_OTHER               0x0180
  
 +
  #define PCI_BASE_CLASS_NETWORK                0x02
  #define PCI_CLASS_NETWORK_ETHERNET    0x0200
  #define PCI_CLASS_NETWORK_TOKEN_RING  0x0201
  #define PCI_DEVICE_ID_RASTEL_2PORT    0x2000
  
  #define PCI_VENDOR_ID_VMWARE          0x15ad
+ #define PCI_DEVICE_ID_VMWARE_VMXNET3  0x07b0
  
  #define PCI_VENDOR_ID_ZOLTRIX         0x15b0
  #define PCI_DEVICE_ID_ZOLTRIX_2BD0    0x2bd0