]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
Merge tag 'rdma-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 21 Feb 2015 20:53:21 +0000 (12:53 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 21 Feb 2015 20:53:21 +0000 (12:53 -0800)
Pull InfiniBand/RDMA updates from Roland Dreier:
 - Re-enable on-demand paging changes with stable ABI
 - Fairly large set of ocrdma HW driver fixes
 - Some qib HW driver fixes
 - Other miscellaneous changes

* tag 'rdma-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland/infiniband: (43 commits)
  IB/qib: Add blank line after declaration
  IB/qib: Fix checkpatch warnings
  IB/mlx5: Enable the ODP capability query verb
  IB/core: Add on demand paging caps to ib_uverbs_ex_query_device
  IB/core: Add support for extended query device caps
  RDMA/cxgb4: Don't hang threads forever waiting on WR replies
  RDMA/ocrdma: Fix off by one in ocrdma_query_gid()
  RDMA/ocrdma: Use unsigned for bit index
  RDMA/ocrdma: Help gcc generate better code for ocrdma_srq_toggle_bit
  RDMA/ocrdma: Update the ocrdma module version string
  RDMA/ocrdma: set vlan present bit for user AH
  RDMA/ocrdma: remove reference of ocrdma_dev out of ocrdma_qp structure
  RDMA/ocrdma: Add support for interrupt moderation
  RDMA/ocrdma: Honor return value of ocrdma_resolve_dmac
  RDMA/ocrdma: Allow expansion of the SQ CQEs via buddy CQ expansion of the QP
  RDMA/ocrdma: Discontinue support of RDMA-READ-WITH-INVALIDATE
  RDMA/ocrdma: Host crash on destroying device resources
  RDMA/ocrdma: Report correct state in ibv_query_qp
  RDMA/ocrdma: Debugfs enhancments for ocrdma driver
  RDMA/ocrdma: Report correct count of interrupt vectors while registering ocrdma device
  ...

1  2 
MAINTAINERS
drivers/infiniband/hw/cxgb4/ev.c
drivers/infiniband/hw/mlx4/cq.c
drivers/infiniband/hw/mlx4/main.c
drivers/infiniband/hw/mlx4/qp.c

diff --combined MAINTAINERS
index 574321803958647a11cd88b4089ced0a0b7f718a,d2357a1da410bc872e5040f17c24177ee6e71c59..63d83bd6931f22011ac3ab1f5f18a3794e0d7ecc
@@@ -34,7 -34,7 +34,7 @@@ trivial patch so apply some common sens
        generalized kernel feature ready for next time.
  
        PLEASE check your patch with the automated style checker
 -      (scripts/checkpatch.pl) to catch trival style violations.
 +      (scripts/checkpatch.pl) to catch trivial style violations.
        See Documentation/CodingStyle for guidance here.
  
        PLEASE CC: the maintainers and mailing lists that are generated
@@@ -270,12 -270,12 +270,12 @@@ F:      drivers/acpi
  F:    drivers/pnp/pnpacpi/
  F:    include/linux/acpi.h
  F:    include/acpi/
 -F:    Documentation/acpi
 +F:    Documentation/acpi/
  F:    Documentation/ABI/testing/sysfs-bus-acpi
  F:    drivers/pci/*acpi*
  F:    drivers/pci/*/*acpi*
  F:    drivers/pci/*/*/*acpi*
 -F:    tools/power/acpi
 +F:    tools/power/acpi/
  
  ACPI COMPONENT ARCHITECTURE (ACPICA)
  M:    Robert Moore <robert.moore@intel.com>
@@@ -563,12 -563,6 +563,12 @@@ S:       Odd Fixe
  L:    linux-alpha@vger.kernel.org
  F:    arch/alpha/
  
 +ALTERA MAILBOX DRIVER
 +M:    Ley Foon Tan <lftan@altera.com>
 +L:    nios2-dev@lists.rocketboards.org (moderated for non-subscribers)
 +S:    Maintained
 +F:    drivers/mailbox/mailbox-altera.c
 +
  ALTERA TRIPLE SPEED ETHERNET DRIVER
  M:    Vince Bridgers <vbridger@opensource.altera.com>
  L:    netdev@vger.kernel.org
@@@ -630,8 -624,6 +630,8 @@@ L:      dri-devel@lists.freedesktop.or
  T:      git git://people.freedesktop.org/~gabbayo/linux.git
  S:      Supported
  F:      drivers/gpu/drm/amd/amdkfd/
 +F:    drivers/gpu/drm/amd/include/cik_structs.h
 +F:    drivers/gpu/drm/amd/include/kgd_kfd_interface.h
  F:      drivers/gpu/drm/radeon/radeon_kfd.c
  F:      drivers/gpu/drm/radeon/radeon_kfd.h
  F:      include/uapi/linux/kfd_ioctl.h
@@@ -667,13 -659,6 +667,13 @@@ L:       linux-media@vger.kernel.or
  S:    Maintained
  F:    drivers/media/i2c/ad9389b*
  
 +ANALOG DEVICES INC ADV7180 DRIVER
 +M:    Lars-Peter Clausen <lars@metafoo.de>
 +L:    linux-media@vger.kernel.org
 +W:    http://ez.analog.com/community/linux-device-drivers
 +S:    Supported
 +F:    drivers/media/i2c/adv7180.c
 +
  ANALOG DEVICES INC ADV7511 DRIVER
  M:    Hans Verkuil <hans.verkuil@cisco.com>
  L:    linux-media@vger.kernel.org
@@@ -895,7 -880,6 +895,7 @@@ F: arch/arm/boot/dts/at91*.dt
  F:    arch/arm/boot/dts/at91*.dtsi
  F:    arch/arm/boot/dts/sama*.dts
  F:    arch/arm/boot/dts/sama*.dtsi
 +F:    arch/arm/include/debug/at91.S
  
  ARM/ATMEL AT91 Clock Support
  M:    Boris Brezillon <boris.brezillon@free-electrons.com>
@@@ -977,7 -961,7 +977,7 @@@ S: Maintaine
  F:    arch/arm/mach-prima2/
  F:    drivers/clk/sirf/
  F:    drivers/clocksource/timer-prima2.c
 -F:    drivers/clocksource/timer-marco.c
 +F:    drivers/clocksource/timer-atlas7.c
  N:    [^a-z]sirf
  
  ARM/EBSA110 MACHINE SUPPORT
@@@ -1176,7 -1160,6 +1176,7 @@@ M:      Sebastian Hesselbarth <sebastian.hes
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    arch/arm/mach-mvebu/
 +F:    drivers/rtc/armada38x-rtc
  
  ARM/Marvell Berlin SoC support
  M:    Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
@@@ -1310,13 -1293,10 +1310,13 @@@ S:   Maintaine
  
  ARM/QUALCOMM SUPPORT
  M:    Kumar Gala <galak@codeaurora.org>
 +M:    Andy Gross <agross@codeaurora.org>
  M:    David Brown <davidb@codeaurora.org>
  L:    linux-arm-msm@vger.kernel.org
 +L:    linux-soc@vger.kernel.org
  S:    Maintained
  F:    arch/arm/mach-qcom/
 +F:    drivers/soc/qcom/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/galak/linux-qcom.git
  
  ARM/RADISYS ENP2611 MACHINE SUPPORT
@@@ -1418,6 -1398,7 +1418,6 @@@ F:      arch/arm/configs/ape6evm_defconfi
  F:    arch/arm/configs/armadillo800eva_defconfig
  F:    arch/arm/configs/bockw_defconfig
  F:    arch/arm/configs/kzm9g_defconfig
 -F:    arch/arm/configs/lager_defconfig
  F:    arch/arm/configs/mackerel_defconfig
  F:    arch/arm/configs/marzen_defconfig
  F:    arch/arm/configs/shmobile_defconfig
@@@ -1605,14 -1586,12 +1605,14 @@@ N:   xilin
  F:    drivers/clocksource/cadence_ttc_timer.c
  F:    drivers/i2c/busses/i2c-cadence.c
  F:    drivers/mmc/host/sdhci-of-arasan.c
 +F:    drivers/edac/synopsys_edac.c
  
  ARM SMMU DRIVER
  M:    Will Deacon <will.deacon@arm.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    drivers/iommu/arm-smmu.c
 +F:    drivers/iommu/io-pgtable-arm.c
  
  ARM64 PORT (AARCH64 ARCHITECTURE)
  M:    Catalin Marinas <catalin.marinas@arm.com>
@@@ -1681,6 -1660,7 +1681,6 @@@ M:      Jiri Slaby <jirislaby@gmail.com
  M:    Nick Kossifidis <mickflemm@gmail.com>
  M:    "Luis R. Rodriguez" <mcgrof@do-not-panic.com>
  L:    linux-wireless@vger.kernel.org
 -L:    ath5k-devel@lists.ath5k.org
  W:    http://wireless.kernel.org/en/users/Drivers/ath5k
  S:    Maintained
  F:    drivers/net/wireless/ath/ath5k/
@@@ -2147,7 -2127,7 +2147,7 @@@ F:      arch/arm/boot/dts/bcm470
  BROADCOM BCM63XX ARM ARCHITECTURE
  M:    Florian Fainelli <f.fainelli@gmail.com>
  L:    linux-arm-kernel@lists.infradead.org
 -T:    git git://git.github.com/brcm/linux.git
 +T:    git git://github.com/broadcom/arm-bcm63xx.git
  S:    Maintained
  F:    arch/arm/mach-bcm/bcm63xx.c
  F:    arch/arm/include/debug/bcm63xx.S
@@@ -2164,7 -2144,6 +2164,7 @@@ M:      Brian Norris <computersforpeace@gmai
  M:    Gregory Fong <gregory.0xf0@gmail.com>
  M:    Florian Fainelli <f.fainelli@gmail.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +T:    git git://github.com/broadcom/stblinux.git
  S:    Maintained
  F:    arch/arm/mach-bcm/*brcmstb*
  F:    arch/arm/boot/dts/bcm7*.dts*
@@@ -2174,7 -2153,6 +2174,7 @@@ BROADCOM BMIPS MIPS ARCHITECTUR
  M:    Kevin Cernekee <cernekee@gmail.com>
  M:    Florian Fainelli <f.fainelli@gmail.com>
  L:    linux-mips@linux-mips.org
 +T:    git git://github.com/broadcom/stblinux.git
  S:    Maintained
  F:    arch/mips/bmips/*
  F:    arch/mips/include/asm/mach-bmips/*
@@@ -2217,7 -2195,7 +2217,7 @@@ M:      Ray Jui <rjui@broadcom.com
  M:    Scott Branden <sbranden@broadcom.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    bcm-kernel-feedback-list@broadcom.com
 -T:    git git://git.github.com/brcm/linux.git
 +T:    git git://github.com/broadcom/cygnus-linux.git
  S:    Maintained
  N:    iproc
  N:    cygnus
@@@ -2406,12 -2384,6 +2406,12 @@@ F:    security/capability.
  F:    security/commoncap.c
  F:    kernel/capability.c
  
 +CAPELLA MICROSYSTEMS LIGHT SENSOR DRIVER
 +M:    Kevin Tsai <ktsai@capellamicro.com>
 +S:    Maintained
 +F:    drivers/iio/light/cm*
 +F:    Documentation/devicetree/bindings/i2c/trivial-devices.txt
 +
  CC2520 IEEE-802.15.4 RADIO DRIVER
  M:    Varka Bhadram <varkabhadram@gmail.com>
  L:    linux-wpan@vger.kernel.org
@@@ -2433,8 -2405,7 +2433,8 @@@ F:      arch/powerpc/oprofile/*cell
  F:    arch/powerpc/platforms/cell/
  
  CEPH DISTRIBUTED FILE SYSTEM CLIENT
 -M:    Sage Weil <sage@inktank.com>
 +M:    Yan, Zheng <zyan@redhat.com>
 +M:    Sage Weil <sage@redhat.com>
  L:    ceph-devel@vger.kernel.org
  W:    http://ceph.com/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client.git
@@@ -2971,12 -2942,6 +2971,12 @@@ S:    Supporte
  F:    drivers/input/touchscreen/cyttsp*
  F:    include/linux/input/cyttsp.h
  
 +DALLAS/MAXIM DS1685-FAMILY REAL TIME CLOCK
 +M:    Joshua Kinard <kumba@gentoo.org>
 +S:    Maintained
 +F:    drivers/rtc/rtc-ds1685.c
 +F:    include/linux/rtc/ds1685.h
 +
  DAMA SLAVE for AX.25
  M:    Joerg Reuter <jreuter@yaina.de>
  W:    http://yaina.de/jreuter/
@@@ -3053,7 -3018,6 +3053,7 @@@ F:      drivers/platform/x86/dell-laptop.
  
  DELL LAPTOP SMM DRIVER
  M:    Guenter Roeck <linux@roeck-us.net>
 +S:    Maintained
  F:    drivers/char/i8k.c
  F:    include/uapi/linux/i8k.h
  
@@@ -3069,7 -3033,7 +3069,7 @@@ S:      Maintaine
  F:    drivers/platform/x86/dell-wmi.c
  
  DESIGNWARE USB2 DRD IP DRIVER
 -M:    Paul Zimmerman <paulz@synopsys.com>
 +M:    John Youn <johnyoun@synopsys.com>
  L:    linux-usb@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
  S:    Maintained
@@@ -3165,12 -3129,6 +3165,12 @@@ L:    linux-i2c@vger.kernel.or
  S:    Maintained
  F:    drivers/i2c/busses/i2c-diolan-u2c.c
  
 +DIRECT ACCESS (DAX)
 +M:    Matthew Wilcox <willy@linux.intel.com>
 +L:    linux-fsdevel@vger.kernel.org
 +S:    Supported
 +F:    fs/dax.c
 +
  DIRECTORY NOTIFICATION (DNOTIFY)
  M:    Eric Paris <eparis@parisplace.org>
  S:    Maintained
@@@ -3255,7 -3213,6 +3255,7 @@@ F:      Documentation
  X:    Documentation/ABI/
  X:    Documentation/devicetree/
  X:    Documentation/[a-z][a-z]_[A-Z][A-Z]/
 +T:    git git://git.lwn.net/linux-2.6.git docs-next
  
  DOUBLETALK DRIVER
  M:    "James R. Van Zandt" <jrv@vanzandt.mv.com>
@@@ -3515,14 -3472,6 +3515,14 @@@ M:    "Maciej W. Rozycki" <macro@linux-mip
  S:    Maintained
  F:    drivers/tty/serial/dz.*
  
 +E3X0 POWER BUTTON DRIVER
 +M:    Moritz Fischer <moritz.fischer@ettus.com>
 +L:    usrp-users@lists.ettus.com
 +W:    http://www.ettus.com
 +S:    Supported
 +F:    drivers/input/misc/e3x0-button.c
 +F:    Documentation/devicetree/bindings/input/e3x0-button.txt
 +
  E4000 MEDIA DRIVER
  M:    Antti Palosaari <crope@iki.fi>
  L:    linux-media@vger.kernel.org
@@@ -3564,8 -3513,6 +3564,8 @@@ M:      Borislav Petkov <bp@alien8.de
  M:    Mauro Carvalho Chehab <mchehab@osg.samsung.com>
  L:    linux-edac@vger.kernel.org
  W:    bluesmoke.sourceforge.net
 +T:    git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp.git#for-next
 +T:    git://git.kernel.org/pub/linux/kernel/git/mchehab/linux-edac.git#linux_next
  S:    Supported
  F:    Documentation/edac.txt
  F:    drivers/edac/
@@@ -3930,12 -3877,6 +3930,12 @@@ S:    Supporte
  F:    Documentation/fault-injection/
  F:    lib/fault-inject.c
  
 +FBTFT Framebuffer drivers
 +M:    Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
 +M:    Noralf Trønnes <noralf@tronnes.org>
 +S:    Maintained
 +F:    drivers/staging/fbtft/
 +
  FCOE SUBSYSTEM (libfc, libfcoe, fcoe)
  M:    Robert Love <robert.w.love@intel.com>
  L:    fcoe-devel@open-fcoe.org
@@@ -4093,12 -4034,6 +4093,12 @@@ S:    Maintaine
  F:    include/linux/platform_data/video-imxfb.h
  F:    drivers/video/fbdev/imxfb.c
  
 +FREESCALE QUAD SPI DRIVER
 +M:    Han Xu <han.xu@freescale.com>
 +L:    linux-mtd@lists.infradead.org
 +S:    Maintained
 +F:    drivers/mtd/spi-nor/fsl-quadspi.c
 +
  FREESCALE SOC FS_ENET DRIVER
  M:    Pantelis Antoniou <pantelis.antoniou@gmail.com>
  M:    Vitaly Bordug <vbordug@ru.mvista.com>
@@@ -4239,11 -4174,6 +4239,11 @@@ W:    http://www.icp-vortex.com
  S:    Supported
  F:    drivers/scsi/gdt*
  
 +GDB KERNEL DEBUGGING HELPER SCRIPTS
 +M:    Jan Kiszka <jan.kiszka@siemens.com>
 +S:    Supported
 +F:    scripts/gdb/
 +
  GEMTEK FM RADIO RECEIVER DRIVER
  M:    Hans Verkuil <hverkuil@xs4all.nl>
  L:    linux-media@vger.kernel.org
@@@ -4478,7 -4408,6 +4478,7 @@@ F:      include/linux/hwmon*.
  HARDWARE RANDOM NUMBER GENERATOR CORE
  M:    Matt Mackall <mpm@selenic.com>
  M:    Herbert Xu <herbert@gondor.apana.org.au>
 +L:    linux-crypto@vger.kernel.org
  S:    Odd fixes
  F:    Documentation/hw_random.txt
  F:    drivers/char/hw_random/
@@@ -4964,7 -4893,7 +4964,7 @@@ F:      drivers/ipack
  
  INTEGRITY MEASUREMENT ARCHITECTURE (IMA)
  M:    Mimi Zohar <zohar@linux.vnet.ibm.com>
 -M:    Dmitry Kasatkin <d.kasatkin@samsung.com>
 +M:    Dmitry Kasatkin <dmitry.kasatkin@gmail.com>
  L:    linux-ima-devel@lists.sourceforge.net
  L:    linux-ima-user@lists.sourceforge.net
  L:    linux-security-module@vger.kernel.org
@@@ -5921,21 -5850,6 +5921,21 @@@ F:    Documentation/misc-devices/lis3lv02
  F:    drivers/misc/lis3lv02d/
  F:    drivers/platform/x86/hp_accel.c
  
 +LIVE PATCHING
 +M:    Josh Poimboeuf <jpoimboe@redhat.com>
 +M:    Seth Jennings <sjenning@redhat.com>
 +M:    Jiri Kosina <jkosina@suse.cz>
 +M:    Vojtech Pavlik <vojtech@suse.cz>
 +S:    Maintained
 +F:    kernel/livepatch/
 +F:    include/linux/livepatch.h
 +F:    arch/x86/include/asm/livepatch.h
 +F:    arch/x86/kernel/livepatch.c
 +F:    Documentation/ABI/testing/sysfs-kernel-livepatch
 +F:    samples/livepatch/
 +L:    live-patching@vger.kernel.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/livepatching.git
 +
  LLC (802.2)
  M:    Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
  S:    Maintained
@@@ -6234,33 -6148,6 +6234,33 @@@ F:    Documentation/devicetree/bindings/i2
  F:    drivers/hwmon/max6697.c
  F:    include/linux/platform_data/max6697.h
  
 +MAXIM MUIC CHARGER DRIVERS FOR EXYNOS BASED BOARDS
 +M:    Krzysztof Kozlowski <k.kozlowski@samsung.com>
 +L:    linux-pm@vger.kernel.org
 +S:    Supported
 +F:    drivers/power/max14577_charger.c
 +F:    drivers/power/max77693_charger.c
 +
 +MAXIM PMIC AND MUIC DRIVERS FOR EXYNOS BASED BOARDS
 +M:    Chanwoo Choi <cw00.choi@samsung.com>
 +M:    Krzysztof Kozlowski <k.kozlowski@samsung.com>
 +L:    linux-kernel@vger.kernel.org
 +S:    Supported
 +F:    drivers/*/max14577.c
 +F:    drivers/*/max77686.c
 +F:    drivers/*/max77693.c
 +F:    drivers/extcon/extcon-max14577.c
 +F:    drivers/extcon/extcon-max77693.c
 +F:    drivers/rtc/rtc-max77686.c
 +F:    drivers/clk/clk-max77686.c
 +F:    Documentation/devicetree/bindings/mfd/max14577.txt
 +F:    Documentation/devicetree/bindings/mfd/max77686.txt
 +F:    Documentation/devicetree/bindings/mfd/max77693.txt
 +F:    Documentation/devicetree/bindings/clock/maxim,max77686.txt
 +F:    include/linux/mfd/max14577*.h
 +F:    include/linux/mfd/max77686*.h
 +F:    include/linux/mfd/max77693*.h
 +
  MAXIRADIO FM RADIO RECEIVER DRIVER
  M:    Hans Verkuil <hverkuil@xs4all.nl>
  L:    linux-media@vger.kernel.org
@@@ -6291,6 -6178,14 +6291,6 @@@ F:     include/uapi/linux/meye.
  F:    include/uapi/linux/ivtv*
  F:    include/uapi/linux/uvcvideo.h
  
 -MEDIAVISION PRO MOVIE STUDIO DRIVER
 -M:    Hans Verkuil <hverkuil@xs4all.nl>
 -L:    linux-media@vger.kernel.org
 -T:    git git://linuxtv.org/media_tree.git
 -W:    http://linuxtv.org
 -S:    Odd Fixes
 -F:    drivers/media/parport/pms*
 -
  MEGARAID SCSI/SAS DRIVERS
  M:    Kashyap Desai <kashyap.desai@avagotech.com>
  M:    Sumit Saxena <sumit.saxena@avagotech.com>
@@@ -6708,10 -6603,9 +6708,10 @@@ F:    include/uapi/linux/netrom.
  F:    net/netrom/
  
  NETWORK BLOCK DEVICE (NBD)
 -M:    Paul Clements <Paul.Clements@steeleye.com>
 +M:    Markus Pargmann <mpa@pengutronix.de>
  S:    Maintained
  L:    nbd-general@lists.sourceforge.net
 +T:    git git://git.pengutronix.de/git/mpa/linux-nbd.git
  F:    Documentation/blockdev/nbd.txt
  F:    drivers/block/nbd.c
  F:    include/linux/nbd.h
@@@ -6740,7 -6634,6 +6740,7 @@@ F:      include/linux/netdevice.
  F:    include/uapi/linux/in.h
  F:    include/uapi/linux/net.h
  F:    include/uapi/linux/netdevice.h
 +F:    include/uapi/linux/net_namespace.h
  F:    tools/net/
  F:    tools/testing/selftests/net/
  F:    lib/random32.c
@@@ -6845,7 -6738,6 +6845,7 @@@ F:      Documentation/devicetree/bindings/ne
  
  NFS, SUNRPC, AND LOCKD CLIENTS
  M:    Trond Myklebust <trond.myklebust@primarydata.com>
 +M:    Anna Schumaker <anna.schumaker@netapp.com>
  L:    linux-nfs@vger.kernel.org
  W:    http://client.linux-nfs.org
  T:    git git://git.linux-nfs.org/projects/trondmy/linux-nfs.git
@@@ -6888,7 -6780,7 +6888,7 @@@ F:      drivers/scsi/nsp32
  NIOS2 ARCHITECTURE
  M:    Ley Foon Tan <lftan@altera.com>
  L:    nios2-dev@lists.rocketboards.org (moderated for non-subscribers)
 -T:    git git://git.rocketboards.org/linux-socfpga.git
 +T:    git git://git.rocketboards.org/linux-socfpga-next.git
  S:    Maintained
  F:    arch/nios2/
  
@@@ -7061,12 -6953,6 +7061,12 @@@ L:    linux-omap@vger.kernel.or
  S:    Maintained
  F:    arch/arm/mach-omap2/omap_hwmod.*
  
 +OMAP HWMOD DATA
 +M:    Paul Walmsley <paul@pwsan.com>
 +L:    linux-omap@vger.kernel.org
 +S:    Maintained
 +F:    arch/arm/mach-omap2/omap_hwmod*data*
 +
  OMAP HWMOD DATA FOR OMAP4-BASED DEVICES
  M:    BenoĂ®t Cousson <bcousson@baylibre.com>
  L:    linux-omap@vger.kernel.org
@@@ -7186,12 -7072,11 +7186,12 @@@ F:   arch/openrisc
  
  OPENVSWITCH
  M:    Pravin Shelar <pshelar@nicira.com>
 +L:    netdev@vger.kernel.org
  L:    dev@openvswitch.org
  W:    http://openvswitch.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pshelar/openvswitch.git
  S:    Maintained
  F:    net/openvswitch/
 +F:    include/uapi/linux/openvswitch.h
  
  OPL4 DRIVER
  M:    Clemens Ladisch <clemens@ladisch.de>
@@@ -7303,7 -7188,7 +7303,7 @@@ M:      Alok Kataria <akataria@vmware.com
  M:    Rusty Russell <rusty@rustcorp.com.au>
  L:    virtualization@lists.linux-foundation.org
  S:    Supported
 -F:    Documentation/ia64/paravirt_ops.txt
 +F:    Documentation/virtual/paravirt_ops.txt
  F:    arch/*/kernel/paravirt*
  F:    arch/*/include/asm/paravirt.h
  
@@@ -7389,14 -7274,6 +7389,14 @@@ F:    include/linux/pci
  F:    arch/x86/pci/
  F:    arch/x86/kernel/quirks.c
  
 +PCI DRIVER FOR ARM VERSATILE PLATFORM
 +M:    Rob Herring <robh@kernel.org>
 +L:    linux-pci@vger.kernel.org
 +L:    linux-arm-kernel@lists.infradead.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/pci/versatile.txt
 +F:    drivers/pci/host/pci-versatile.c
 +
  PCI DRIVER FOR APPLIEDMICRO XGENE
  M:    Tanmay Inamdar <tinamdar@apm.com>
  L:    linux-pci@vger.kernel.org
@@@ -7998,9 -7875,17 +7998,9 @@@ T:     git git://github.com/KrasnikovEugene
  S:    Supported
  F:    drivers/net/wireless/ath/wcn36xx/
  
 -QUICKCAM PARALLEL PORT WEBCAMS
 -M:    Hans Verkuil <hverkuil@xs4all.nl>
 -L:    linux-media@vger.kernel.org
 -T:    git git://linuxtv.org/media_tree.git
 -W:    http://linuxtv.org
 -S:    Odd Fixes
 -F:    drivers/media/parport/*-qcam*
 -
  RADOS BLOCK DEVICE (RBD)
 -M:    Yehuda Sadeh <yehuda@inktank.com>
 -M:    Sage Weil <sage@inktank.com>
 +M:    Ilya Dryomov <idryomov@gmail.com>
 +M:    Sage Weil <sage@redhat.com>
  M:    Alex Elder <elder@kernel.org>
  M:    ceph-devel@vger.kernel.org
  W:    http://ceph.com/
@@@ -8186,13 -8071,6 +8186,13 @@@ S:    Maintaine
  F:    Documentation/rfkill.txt
  F:    net/rfkill/
  
 +RHASHTABLE
 +M:    Thomas Graf <tgraf@suug.ch>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    lib/rhashtable.c
 +F:    include/linux/rhashtable.h
 +
  RICOH SMARTMEDIA/XD DRIVER
  M:    Maxim Levitsky <maximlevitsky@gmail.com>
  S:    Maintained
@@@ -8504,7 -8382,6 +8504,7 @@@ SYNOPSYS DESIGNWARE DMAC DRIVE
  M:    Viresh Kumar <viresh.linux@gmail.com>
  M:    Andy Shevchenko <andriy.shevchenko@linux.intel.com>
  S:    Maintained
 +F:    include/linux/dma/dw.h
  F:    include/linux/platform_data/dma-dw.h
  F:    drivers/dma/dw/
  
@@@ -8536,6 -8413,12 +8536,6 @@@ F:     kernel/time/clocksource.
  F:    kernel/time/time*.c
  F:    kernel/time/ntp.c
  
 -TLG2300 VIDEO4LINUX-2 DRIVER
 -M:    Huang Shijie <shijie8@gmail.com>
 -M:    Hans Verkuil <hverkuil@xs4all.nl>
 -S:    Odd Fixes
 -F:    drivers/media/usb/tlg2300/
 -
  SC1200 WDT DRIVER
  M:    Zwane Mwaikambo <zwanem@gmail.com>
  S:    Maintained
@@@ -8567,7 -8450,7 +8567,7 @@@ S:      Maintaine
  F:    drivers/scsi/sr*
  
  SCSI RDMA PROTOCOL (SRP) INITIATOR
- M:    Bart Van Assche <bvanassche@acm.org>
+ M:    Bart Van Assche <bart.vanassche@sandisk.com>
  L:    linux-rdma@vger.kernel.org
  S:    Supported
  W:    http://www.openfabrics.org
@@@ -8901,15 -8784,6 +8901,15 @@@ S:    Maintaine
  F:    drivers/media/platform/davinci/
  F:    include/media/davinci/
  
 +TI AM437X VPFE DRIVER
 +M:    Lad, Prabhakar <prabhakar.csengg@gmail.com>
 +L:    linux-media@vger.kernel.org
 +W:    http://linuxtv.org/
 +Q:    http://patchwork.linuxtv.org/project/linux-media/list/
 +T:    git git://linuxtv.org/mhadli/v4l-dvb-davinci_devices.git
 +S:    Maintained
 +F:    drivers/media/platform/am437x/
 +
  SIS 190 ETHERNET DRIVER
  M:    Francois Romieu <romieu@fr.zoreil.com>
  L:    netdev@vger.kernel.org
@@@ -8991,8 -8865,6 +8991,8 @@@ F:      drivers/media/i2c/smiapp
  F:    include/media/smiapp.h
  F:    drivers/media/i2c/smiapp-pll.c
  F:    drivers/media/i2c/smiapp-pll.h
 +F:    include/uapi/linux/smiapp.h
 +F:    Documentation/devicetree/bindings/media/i2c/nokia,smia.txt
  
  SMM665 HARDWARE MONITOR DRIVER
  M:    Guenter Roeck <linux@roeck-us.net>
@@@ -9059,7 -8931,6 +9059,7 @@@ SOFTLOGIC 6x10 MPEG CODE
  M:    Bluecherry Maintainers <maintainers@bluecherrydvr.com>
  M:    Andrey Utkin <andrey.utkin@corp.bluecherry.net>
  M:    Andrey Utkin <andrey.krieger.utkin@gmail.com>
 +M:    Ismael Luceno <ismael@iodev.co.uk>
  L:    linux-media@vger.kernel.org
  S:    Supported
  F:    drivers/media/pci/solo6x10/
@@@ -9332,14 -9203,6 +9332,14 @@@ L:    linux-wireless@vger.kernel.or
  S:    Maintained
  F:    drivers/staging/rtl8723au/
  
 +STAGING - SILICON MOTION SM7XX FRAME BUFFER DRIVER
 +M:    Sudip Mukherjee <sudipm.mukherjee@gmail.com>
 +M:    Teddy Wang <teddy.wang@siliconmotion.com>
 +M:    Sudip Mukherjee <sudip@vectorindia.org>
 +L:    linux-fbdev@vger.kernel.org
 +S:    Maintained
 +F:    drivers/staging/sm7xxfb/
 +
  STAGING - SLICOSS
  M:    Lior Dotan <liodot@gmail.com>
  M:    Christopher Harrer <charrer@alacritech.com>
@@@ -9380,13 -9243,6 +9380,13 @@@ F:    arch/m68k/sun3*
  F:    arch/m68k/include/asm/sun3*
  F:    drivers/net/ethernet/i825xx/sun3*
  
 +SUN4I LOW RES ADC ATTACHED TABLET KEYS DRIVER
 +M:    Hans de Goede <hdegoede@redhat.com>
 +L:    linux-input@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/input/sun4i-lradc-keys.txt
 +F:    drivers/input/keyboard/sun4i-lradc-keys.c
 +
  SUNDANCE NETWORK DRIVER
  M:    Denis Kirjanov <kda@linux-powerpc.org>
  L:    netdev@vger.kernel.org
@@@ -9719,11 -9575,6 +9719,11 @@@ L:    linux-omap@vger.kernel.or
  S:    Maintained
  F:    drivers/thermal/ti-soc-thermal/
  
 +TI CDCE706 CLOCK DRIVER
 +M:    Max Filippov <jcmvbkbc@gmail.com>
 +S:    Maintained
 +F:    drivers/clk/clk-cdce706.c
 +
  TI CLOCK DRIVER
  M:    Tero Kristo <t-kristo@ti.com>
  L:    linux-omap@vger.kernel.org
@@@ -9778,13 -9629,6 +9778,13 @@@ F:    drivers/power/lp8788-charger.
  F:    drivers/regulator/lp8788-*.c
  F:    include/linux/mfd/lp8788*.h
  
 +TI NETCP ETHERNET DRIVER
 +M:    Wingman Kwok <w-kwok2@ti.com>
 +M:    Murali Karicheri <m-karicheri2@ti.com>
 +L:    netdev@vger.kernel.org
 +S:    Maintained
 +F:    drivers/net/ethernet/ti/netcp*
 +
  TI TWL4030 SERIES SOC CODEC DRIVER
  M:    Peter Ujfalusi <peter.ujfalusi@ti.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
@@@ -9812,7 -9656,7 +9812,7 @@@ F:      net/tipc
  
  TILE ARCHITECTURE
  M:    Chris Metcalf <cmetcalf@ezchip.com>
 -W:    http://www.tilera.com/scm/
 +W:    http://www.ezchip.com/scm/
  S:    Supported
  F:    arch/tile/
  F:    drivers/char/tile-srom.c
@@@ -9905,21 -9749,13 +9905,21 @@@ F:   drivers/media/pci/tw68
  
  TPM DEVICE DRIVER
  M:    Peter Huewe <peterhuewe@gmx.de>
 -M:    Ashley Lai <ashley@ashleylai.com>
  M:    Marcel Selhorst <tpmdd@selhorst.net>
  W:    http://tpmdd.sourceforge.net
  L:    tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers)
 +Q:    git git://github.com/PeterHuewe/linux-tpmdd.git
 +T:    https://github.com/PeterHuewe/linux-tpmdd
  S:    Maintained
  F:    drivers/char/tpm/
  
 +TPM IBM_VTPM DEVICE DRIVER
 +M:    Ashley Lai <ashleydlai@gmail.com>
 +W:    http://tpmdd.sourceforge.net
 +L:    tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers)
 +S:    Maintained
 +F:    drivers/char/tpm/tpm_ibmvtpm*
 +
  TRACING
  M:    Steven Rostedt <rostedt@goodmis.org>
  M:    Ingo Molnar <mingo@redhat.com>
@@@ -10074,15 -9910,20 +10074,15 @@@ F: drivers/scsi/ufs
  
  UNSORTED BLOCK IMAGES (UBI)
  M:    Artem Bityutskiy <dedekind1@gmail.com>
 +M:    Richard Weinberger <richard@nod.at>
  W:    http://www.linux-mtd.infradead.org/
  L:    linux-mtd@lists.infradead.org
  T:    git git://git.infradead.org/ubifs-2.6.git
 -S:    Maintained
 +S:    Supported
  F:    drivers/mtd/ubi/
  F:    include/linux/mtd/ubi.h
  F:    include/uapi/mtd/ubi-user.h
  
 -UNSORTED BLOCK IMAGES (UBI) Fastmap
 -M:    Richard Weinberger <richard@nod.at>
 -L:    linux-mtd@lists.infradead.org
 -S:    Maintained
 -F:    drivers/mtd/ubi/fastmap.c
 -
  USB ACM DRIVER
  M:    Oliver Neukum <oliver@neukum.org>
  L:    linux-usb@vger.kernel.org
@@@ -10772,7 -10613,6 +10772,7 @@@ F:   drivers/pci/*xen
  
  XEN BLOCK SUBSYSTEM
  M:    Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
 +M:    Roger Pau MonnĂ© <roger.pau@citrix.com>
  L:    xen-devel@lists.xenproject.org (moderated for non-subscribers)
  S:    Supported
  F:    drivers/block/xen-blkback/*
@@@ -10828,7 -10668,6 +10828,7 @@@ M:   Max Filippov <jcmvbkbc@gmail.com
  L:    linux-xtensa@linux-xtensa.org
  S:    Maintained
  F:    drivers/spi/spi-xtensa-xtfpga.c
 +F:    sound/soc/xtensa/xtfpga-i2s.c
  
  YAM DRIVER FOR AX.25
  M:    Jean-Paul Roubelat <jpr@f6fbb.org>
index 794555dc86a598a78125edc38a01299157e9caeb,4498a89f4cedffed855251540b2e89299227139c..bdfac2ccb704ab43403a5245448ef1184143e738
@@@ -50,12 -50,12 +50,12 @@@ static void print_tpte(struct c4iw_dev 
        PDBG("stag idx 0x%x valid %d key 0x%x state %d pdid %d "
               "perm 0x%x ps %d len 0x%llx va 0x%llx\n",
               stag & 0xffffff00,
 -             G_FW_RI_TPTE_VALID(ntohl(tpte.valid_to_pdid)),
 -             G_FW_RI_TPTE_STAGKEY(ntohl(tpte.valid_to_pdid)),
 -             G_FW_RI_TPTE_STAGSTATE(ntohl(tpte.valid_to_pdid)),
 -             G_FW_RI_TPTE_PDID(ntohl(tpte.valid_to_pdid)),
 -             G_FW_RI_TPTE_PERM(ntohl(tpte.locread_to_qpid)),
 -             G_FW_RI_TPTE_PS(ntohl(tpte.locread_to_qpid)),
 +             FW_RI_TPTE_VALID_G(ntohl(tpte.valid_to_pdid)),
 +             FW_RI_TPTE_STAGKEY_G(ntohl(tpte.valid_to_pdid)),
 +             FW_RI_TPTE_STAGSTATE_G(ntohl(tpte.valid_to_pdid)),
 +             FW_RI_TPTE_PDID_G(ntohl(tpte.valid_to_pdid)),
 +             FW_RI_TPTE_PERM_G(ntohl(tpte.locread_to_qpid)),
 +             FW_RI_TPTE_PS_G(ntohl(tpte.locread_to_qpid)),
               ((u64)ntohl(tpte.len_hi) << 32) | ntohl(tpte.len_lo),
               ((u64)ntohl(tpte.va_hi) << 32) | ntohl(tpte.va_lo_fbo));
  }
@@@ -225,13 -225,20 +225,20 @@@ int c4iw_ev_handler(struct c4iw_dev *de
        struct c4iw_cq *chp;
        unsigned long flag;
  
+       spin_lock_irqsave(&dev->lock, flag);
        chp = get_chp(dev, qid);
        if (chp) {
+               atomic_inc(&chp->refcnt);
+               spin_unlock_irqrestore(&dev->lock, flag);
                t4_clear_cq_armed(&chp->cq);
                spin_lock_irqsave(&chp->comp_handler_lock, flag);
                (*chp->ibcq.comp_handler)(&chp->ibcq, chp->ibcq.cq_context);
                spin_unlock_irqrestore(&chp->comp_handler_lock, flag);
-       } else
+               if (atomic_dec_and_test(&chp->refcnt))
+                       wake_up(&chp->wait);
+       } else {
                PDBG("%s unknown cqid 0x%x\n", __func__, qid);
+               spin_unlock_irqrestore(&dev->lock, flag);
+       }
        return 0;
  }
index 543ecdd8667bad824fa3313a5b45be9693a5fc69,cb63ecd2276f4c47675eb69287314e85a424df35..0176caa5792c4576276470c2c3f86f0fca16a7bd
@@@ -188,8 -188,6 +188,8 @@@ struct ib_cq *mlx4_ib_create_cq(struct 
        spin_lock_init(&cq->lock);
        cq->resize_buf = NULL;
        cq->resize_umem = NULL;
 +      INIT_LIST_HEAD(&cq->send_qp_list);
 +      INIT_LIST_HEAD(&cq->recv_qp_list);
  
        if (context) {
                struct mlx4_ib_create_cq ucmd;
@@@ -369,8 -367,7 +369,7 @@@ int mlx4_ib_resize_cq(struct ib_cq *ibc
        int err;
  
        mutex_lock(&cq->resize_mutex);
-       if (entries < 1) {
+       if (entries < 1 || entries > dev->dev->caps.max_cqes) {
                err = -EINVAL;
                goto out;
        }
                goto out;
        }
  
-       if (entries > dev->dev->caps.max_cqes) {
+       if (entries > dev->dev->caps.max_cqes + 1) {
                err = -EINVAL;
                goto out;
        }
                /* Can't be smaller than the number of outstanding CQEs */
                outst_cqe = mlx4_ib_get_outstanding_cqes(cq);
                if (entries < outst_cqe + 1) {
-                       err = 0;
+                       err = -EINVAL;
                        goto out;
                }
  
@@@ -596,55 -593,6 +595,55 @@@ static int use_tunnel_data(struct mlx4_
        return 0;
  }
  
 +static void mlx4_ib_qp_sw_comp(struct mlx4_ib_qp *qp, int num_entries,
 +                             struct ib_wc *wc, int *npolled, int is_send)
 +{
 +      struct mlx4_ib_wq *wq;
 +      unsigned cur;
 +      int i;
 +
 +      wq = is_send ? &qp->sq : &qp->rq;
 +      cur = wq->head - wq->tail;
 +
 +      if (cur == 0)
 +              return;
 +
 +      for (i = 0;  i < cur && *npolled < num_entries; i++) {
 +              wc->wr_id = wq->wrid[wq->tail & (wq->wqe_cnt - 1)];
 +              wc->status = IB_WC_WR_FLUSH_ERR;
 +              wc->vendor_err = MLX4_CQE_SYNDROME_WR_FLUSH_ERR;
 +              wq->tail++;
 +              (*npolled)++;
 +              wc->qp = &qp->ibqp;
 +              wc++;
 +      }
 +}
 +
 +static void mlx4_ib_poll_sw_comp(struct mlx4_ib_cq *cq, int num_entries,
 +                               struct ib_wc *wc, int *npolled)
 +{
 +      struct mlx4_ib_qp *qp;
 +
 +      *npolled = 0;
 +      /* Find uncompleted WQEs belonging to that cq and retrun
 +       * simulated FLUSH_ERR completions
 +       */
 +      list_for_each_entry(qp, &cq->send_qp_list, cq_send_list) {
 +              mlx4_ib_qp_sw_comp(qp, num_entries, wc, npolled, 1);
 +              if (*npolled >= num_entries)
 +                      goto out;
 +      }
 +
 +      list_for_each_entry(qp, &cq->recv_qp_list, cq_recv_list) {
 +              mlx4_ib_qp_sw_comp(qp, num_entries, wc + *npolled, npolled, 0);
 +              if (*npolled >= num_entries)
 +                      goto out;
 +      }
 +
 +out:
 +      return;
 +}
 +
  static int mlx4_ib_poll_one(struct mlx4_ib_cq *cq,
                            struct mlx4_ib_qp **cur_qp,
                            struct ib_wc *wc)
@@@ -887,13 -835,8 +886,13 @@@ int mlx4_ib_poll_cq(struct ib_cq *ibcq
        unsigned long flags;
        int npolled;
        int err = 0;
 +      struct mlx4_ib_dev *mdev = to_mdev(cq->ibcq.device);
  
        spin_lock_irqsave(&cq->lock, flags);
 +      if (mdev->dev->persist->state & MLX4_DEVICE_STATE_INTERNAL_ERROR) {
 +              mlx4_ib_poll_sw_comp(cq, num_entries, wc, &npolled);
 +              goto out;
 +      }
  
        for (npolled = 0; npolled < num_entries; ++npolled) {
                err = mlx4_ib_poll_one(cq, &cur_qp, wc + npolled);
  
        mlx4_cq_set_ci(&cq->mcq);
  
 +out:
        spin_unlock_irqrestore(&cq->lock, flags);
  
        if (err == 0 || err == -EAGAIN)
index eb8e215f1613ee95ae7fb6253ba6b06220f1b00c,0b280b1c98dfb8c4bfa5eab04d202dda5899205f..ac6e2b710ea6fef928271869f0e170f2bbdb158d
@@@ -198,7 -198,7 +198,7 @@@ static int mlx4_ib_query_device(struct 
  
        props->vendor_id           = be32_to_cpup((__be32 *) (out_mad->data + 36)) &
                0xffffff;
 -      props->vendor_part_id      = dev->dev->pdev->device;
 +      props->vendor_part_id      = dev->dev->persist->pdev->device;
        props->hw_ver              = be32_to_cpup((__be32 *) (out_mad->data + 32));
        memcpy(&props->sys_image_guid, out_mad->data +  4, 8);
  
@@@ -351,7 -351,6 +351,7 @@@ static int eth_link_query_port(struct i
        enum ib_mtu tmp;
        struct mlx4_cmd_mailbox *mailbox;
        int err = 0;
 +      int is_bonded = mlx4_is_bonded(mdev->dev);
  
        mailbox = mlx4_alloc_cmd_mailbox(mdev->dev);
        if (IS_ERR(mailbox))
        props->state            = IB_PORT_DOWN;
        props->phys_state       = state_to_phys_state(props->state);
        props->active_mtu       = IB_MTU_256;
 +      if (is_bonded)
 +              rtnl_lock(); /* required to get upper dev */
        spin_lock_bh(&iboe->lock);
        ndev = iboe->netdevs[port - 1];
 +      if (ndev && is_bonded)
 +              ndev = netdev_master_upper_dev_get(ndev);
        if (!ndev)
                goto out_unlock;
  
        props->phys_state       = state_to_phys_state(props->state);
  out_unlock:
        spin_unlock_bh(&iboe->lock);
 +      if (is_bonded)
 +              rtnl_unlock();
  out:
        mlx4_free_cmd_mailbox(mdev->dev, mailbox);
        return err;
@@@ -851,7 -844,7 +851,7 @@@ int mlx4_ib_add_mc(struct mlx4_ib_dev *
  
  struct mlx4_ib_steering {
        struct list_head list;
 -      u64 reg_id;
 +      struct mlx4_flow_reg_id reg_id;
        union ib_gid gid;
  };
  
@@@ -1142,11 -1135,9 +1142,11 @@@ static struct ib_flow *mlx4_ib_create_f
                                    struct ib_flow_attr *flow_attr,
                                    int domain)
  {
 -      int err = 0, i = 0;
 +      int err = 0, i = 0, j = 0;
        struct mlx4_ib_flow *mflow;
        enum mlx4_net_trans_promisc_mode type[2];
 +      struct mlx4_dev *dev = (to_mdev(qp->device))->dev;
 +      int is_bonded = mlx4_is_bonded(dev);
  
        memset(type, 0, sizeof(type));
  
  
        while (i < ARRAY_SIZE(type) && type[i]) {
                err = __mlx4_ib_create_flow(qp, flow_attr, domain, type[i],
 -                                          &mflow->reg_id[i]);
 +                                          &mflow->reg_id[i].id);
                if (err)
                        goto err_create_flow;
                i++;
 +              if (is_bonded) {
 +                      /* Application always sees one port so the mirror rule
 +                       * must be on port #2
 +                       */
 +                      flow_attr->port = 2;
 +                      err = __mlx4_ib_create_flow(qp, flow_attr,
 +                                                  domain, type[j],
 +                                                  &mflow->reg_id[j].mirror);
 +                      flow_attr->port = 1;
 +                      if (err)
 +                              goto err_create_flow;
 +                      j++;
 +              }
 +
        }
  
        if (i < ARRAY_SIZE(type) && flow_attr->type == IB_FLOW_ATTR_NORMAL) {
 -              err = mlx4_ib_tunnel_steer_add(qp, flow_attr, &mflow->reg_id[i]);
 +              err = mlx4_ib_tunnel_steer_add(qp, flow_attr,
 +                                             &mflow->reg_id[i].id);
                if (err)
                        goto err_create_flow;
                i++;
 +              if (is_bonded) {
 +                      flow_attr->port = 2;
 +                      err = mlx4_ib_tunnel_steer_add(qp, flow_attr,
 +                                                     &mflow->reg_id[j].mirror);
 +                      flow_attr->port = 1;
 +                      if (err)
 +                              goto err_create_flow;
 +                      j++;
 +              }
 +              /* function to create mirror rule */
        }
  
        return &mflow->ibflow;
  
  err_create_flow:
        while (i) {
 -              (void)__mlx4_ib_destroy_flow(to_mdev(qp->device)->dev, mflow->reg_id[i]);
 +              (void)__mlx4_ib_destroy_flow(to_mdev(qp->device)->dev,
 +                                           mflow->reg_id[i].id);
                i--;
        }
 +
 +      while (j) {
 +              (void)__mlx4_ib_destroy_flow(to_mdev(qp->device)->dev,
 +                                           mflow->reg_id[j].mirror);
 +              j--;
 +      }
  err_free:
        kfree(mflow);
        return ERR_PTR(err);
@@@ -1245,16 -1204,10 +1245,16 @@@ static int mlx4_ib_destroy_flow(struct 
        struct mlx4_ib_dev *mdev = to_mdev(flow_id->qp->device);
        struct mlx4_ib_flow *mflow = to_mflow(flow_id);
  
 -      while (i < ARRAY_SIZE(mflow->reg_id) && mflow->reg_id[i]) {
 -              err = __mlx4_ib_destroy_flow(mdev->dev, mflow->reg_id[i]);
 +      while (i < ARRAY_SIZE(mflow->reg_id) && mflow->reg_id[i].id) {
 +              err = __mlx4_ib_destroy_flow(mdev->dev, mflow->reg_id[i].id);
                if (err)
                        ret = err;
 +              if (mflow->reg_id[i].mirror) {
 +                      err = __mlx4_ib_destroy_flow(mdev->dev,
 +                                                   mflow->reg_id[i].mirror);
 +                      if (err)
 +                              ret = err;
 +              }
                i++;
        }
  
@@@ -1266,12 -1219,10 +1266,11 @@@ static int mlx4_ib_mcg_attach(struct ib
  {
        int err;
        struct mlx4_ib_dev *mdev = to_mdev(ibqp->device);
 +      struct mlx4_dev *dev = mdev->dev;
        struct mlx4_ib_qp *mqp = to_mqp(ibqp);
 -      u64 reg_id;
        struct mlx4_ib_steering *ib_steering = NULL;
-       enum mlx4_protocol prot = (gid->raw[1] == 0x0e) ?
-               MLX4_PROT_IB_IPV4 : MLX4_PROT_IB_IPV6;
+       enum mlx4_protocol prot = MLX4_PROT_IB_IPV6;
 +      struct mlx4_flow_reg_id reg_id;
  
        if (mdev->dev->caps.steering_mode ==
            MLX4_STEERING_MODE_DEVICE_MANAGED) {
        err = mlx4_multicast_attach(mdev->dev, &mqp->mqp, gid->raw, mqp->port,
                                    !!(mqp->flags &
                                       MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK),
 -                                  prot, &reg_id);
 +                                  prot, &reg_id.id);
-       if (err)
+       if (err) {
+               pr_err("multicast attach op failed, err %d\n", err);
                goto err_malloc;
+       }
  
 +      reg_id.mirror = 0;
 +      if (mlx4_is_bonded(dev)) {
 +              err = mlx4_multicast_attach(mdev->dev, &mqp->mqp, gid->raw,
 +                                          (mqp->port == 1) ? 2 : 1,
 +                                          !!(mqp->flags &
 +                                          MLX4_IB_QP_BLOCK_MULTICAST_LOOPBACK),
 +                                          prot, &reg_id.mirror);
 +              if (err)
 +                      goto err_add;
 +      }
 +
        err = add_gid_entry(ibqp, gid);
        if (err)
                goto err_add;
  
  err_add:
        mlx4_multicast_detach(mdev->dev, &mqp->mqp, gid->raw,
 -                            prot, reg_id);
 +                            prot, reg_id.id);
 +      if (reg_id.mirror)
 +              mlx4_multicast_detach(mdev->dev, &mqp->mqp, gid->raw,
 +                                    prot, reg_id.mirror);
  err_malloc:
        kfree(ib_steering);
  
@@@ -1343,14 -1282,11 +1344,12 @@@ static int mlx4_ib_mcg_detach(struct ib
  {
        int err;
        struct mlx4_ib_dev *mdev = to_mdev(ibqp->device);
 +      struct mlx4_dev *dev = mdev->dev;
        struct mlx4_ib_qp *mqp = to_mqp(ibqp);
        struct net_device *ndev;
        struct mlx4_ib_gid_entry *ge;
 -      u64 reg_id = 0;
 +      struct mlx4_flow_reg_id reg_id = {0, 0};
-       enum mlx4_protocol prot = (gid->raw[1] == 0x0e) ?
-               MLX4_PROT_IB_IPV4 : MLX4_PROT_IB_IPV6;
+       enum mlx4_protocol prot =  MLX4_PROT_IB_IPV6;
  
        if (mdev->dev->caps.steering_mode ==
            MLX4_STEERING_MODE_DEVICE_MANAGED) {
        }
  
        err = mlx4_multicast_detach(mdev->dev, &mqp->mqp, gid->raw,
 -                                  prot, reg_id);
 +                                  prot, reg_id.id);
        if (err)
                return err;
  
 +      if (mlx4_is_bonded(dev)) {
 +              err = mlx4_multicast_detach(mdev->dev, &mqp->mqp, gid->raw,
 +                                          prot, reg_id.mirror);
 +              if (err)
 +                      return err;
 +      }
 +
        mutex_lock(&mqp->mutex);
        ge = find_gid_entry(mqp, gid->raw);
        if (ge) {
@@@ -1447,7 -1376,7 +1446,7 @@@ static ssize_t show_hca(struct device *
  {
        struct mlx4_ib_dev *dev =
                container_of(device, struct mlx4_ib_dev, ib_dev.dev);
 -      return sprintf(buf, "MT%d\n", dev->dev->pdev->device);
 +      return sprintf(buf, "MT%d\n", dev->dev->persist->pdev->device);
  }
  
  static ssize_t show_fw_ver(struct device *device, struct device_attribute *attr,
@@@ -1511,7 -1440,6 +1510,7 @@@ static void update_gids_task(struct wor
        union ib_gid *gids;
        int err;
        struct mlx4_dev *dev = gw->dev->dev;
 +      int is_bonded = mlx4_is_bonded(dev);
  
        if (!gw->dev->ib_active)
                return;
        if (err)
                pr_warn("set port command failed\n");
        else
 -              mlx4_ib_dispatch_event(gw->dev, gw->port, IB_EVENT_GID_CHANGE);
 +              if ((gw->port == 1) || !is_bonded)
 +                      mlx4_ib_dispatch_event(gw->dev,
 +                                             is_bonded ? 1 : gw->port,
 +                                             IB_EVENT_GID_CHANGE);
  
        mlx4_free_cmd_mailbox(dev, mailbox);
        kfree(gw);
@@@ -1950,8 -1875,7 +1949,8 @@@ static void mlx4_ib_scan_netdevs(struc
                                 * don't want the bond IP based gids in the table since
                                 * flows that select port by gid may get the down port.
                                */
 -                              if (port_state == IB_PORT_DOWN) {
 +                              if (port_state == IB_PORT_DOWN &&
 +                                  !mlx4_is_bonded(ibdev->dev)) {
                                        reset_gid_table(ibdev, port);
                                        mlx4_ib_set_default_gid(ibdev,
                                                                curr_netdev,
@@@ -2014,8 -1938,7 +2013,8 @@@ static void init_pkeys(struct mlx4_ib_d
        int i;
  
        if (mlx4_is_master(ibdev->dev)) {
 -              for (slave = 0; slave <= ibdev->dev->num_vfs; ++slave) {
 +              for (slave = 0; slave <= ibdev->dev->persist->num_vfs;
 +                   ++slave) {
                        for (port = 1; port <= ibdev->dev->caps.num_ports; ++port) {
                                for (i = 0;
                                     i < ibdev->dev->phys_caps.pkey_phys_table_len[port];
@@@ -2072,7 -1995,7 +2071,7 @@@ static void mlx4_ib_alloc_eqs(struct ml
        mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_IB) {
                for (j = 0; j < eq_per_port; j++) {
                        snprintf(name, sizeof(name), "mlx4-ib-%d-%d@%s",
 -                               i, j, dev->pdev->bus->name);
 +                               i, j, dev->persist->pdev->bus->name);
                        /* Set IRQ for specific name (per ring) */
                        if (mlx4_assign_eq(dev, name, NULL,
                                           &ibdev->eq_table[eq])) {
@@@ -2123,7 -2046,6 +2122,7 @@@ static void *mlx4_ib_add(struct mlx4_de
        int err;
        struct mlx4_ib_iboe *iboe;
        int ib_num_ports = 0;
 +      int num_req_counters;
  
        pr_info_once("%s", mlx4_ib_version);
  
  
        ibdev = (struct mlx4_ib_dev *) ib_alloc_device(sizeof *ibdev);
        if (!ibdev) {
 -              dev_err(&dev->pdev->dev, "Device struct alloc failed\n");
 +              dev_err(&dev->persist->pdev->dev,
 +                      "Device struct alloc failed\n");
                return NULL;
        }
  
        MLX4_INIT_DOORBELL_LOCK(&ibdev->uar_lock);
  
        ibdev->dev = dev;
 +      ibdev->bond_next_port   = 0;
  
        strlcpy(ibdev->ib_dev.name, "mlx4_%d", IB_DEVICE_NAME_MAX);
        ibdev->ib_dev.owner             = THIS_MODULE;
        ibdev->ib_dev.node_type         = RDMA_NODE_IB_CA;
        ibdev->ib_dev.local_dma_lkey    = dev->caps.reserved_lkey;
        ibdev->num_ports                = num_ports;
 -      ibdev->ib_dev.phys_port_cnt     = ibdev->num_ports;
 +      ibdev->ib_dev.phys_port_cnt     = mlx4_is_bonded(dev) ?
 +                                              1 : ibdev->num_ports;
        ibdev->ib_dev.num_comp_vectors  = dev->caps.num_comp_vectors;
 -      ibdev->ib_dev.dma_device        = &dev->pdev->dev;
 +      ibdev->ib_dev.dma_device        = &dev->persist->pdev->dev;
  
        if (dev->caps.userspace_caps)
                ibdev->ib_dev.uverbs_abi_ver = MLX4_IB_UVERBS_ABI_VERSION;
        if (init_node_data(ibdev))
                goto err_map;
  
 -      for (i = 0; i < ibdev->num_ports; ++i) {
 +      num_req_counters = mlx4_is_bonded(dev) ? 1 : ibdev->num_ports;
 +      for (i = 0; i < num_req_counters; ++i) {
                mutex_init(&ibdev->qp1_proxy_lock[i]);
                if (mlx4_ib_port_link_layer(&ibdev->ib_dev, i + 1) ==
                                                IB_LINK_LAYER_ETHERNET) {
                        ibdev->counters[i] = -1;
                }
        }
 +      if (mlx4_is_bonded(dev))
 +              for (i = 1; i < ibdev->num_ports ; ++i)
 +                      ibdev->counters[i] = ibdev->counters[0];
 +
  
        mlx4_foreach_port(i, dev, MLX4_PORT_TYPE_IB)
                ib_num_ports++;
  
        spin_lock_init(&ibdev->sm_lock);
        mutex_init(&ibdev->cap_mask_mutex);
 +      INIT_LIST_HEAD(&ibdev->qp_list);
 +      spin_lock_init(&ibdev->reset_flow_resource_lock);
  
        if (ibdev->steering_support == MLX4_STEERING_MODE_DEVICE_MANAGED &&
            ib_num_ports) {
                                sizeof(long),
                                GFP_KERNEL);
                if (!ibdev->ib_uc_qpns_bitmap) {
 -                      dev_err(&dev->pdev->dev, "bit map alloc failed\n");
 +                      dev_err(&dev->persist->pdev->dev,
 +                              "bit map alloc failed\n");
                        goto err_steer_qp_release;
                }
  
        return;
  }
  
 +static void mlx4_ib_handle_catas_error(struct mlx4_ib_dev *ibdev)
 +{
 +      struct mlx4_ib_qp *mqp;
 +      unsigned long flags_qp;
 +      unsigned long flags_cq;
 +      struct mlx4_ib_cq *send_mcq, *recv_mcq;
 +      struct list_head    cq_notify_list;
 +      struct mlx4_cq *mcq;
 +      unsigned long flags;
 +
 +      pr_warn("mlx4_ib_handle_catas_error was started\n");
 +      INIT_LIST_HEAD(&cq_notify_list);
 +
 +      /* Go over qp list reside on that ibdev, sync with create/destroy qp.*/
 +      spin_lock_irqsave(&ibdev->reset_flow_resource_lock, flags);
 +
 +      list_for_each_entry(mqp, &ibdev->qp_list, qps_list) {
 +              spin_lock_irqsave(&mqp->sq.lock, flags_qp);
 +              if (mqp->sq.tail != mqp->sq.head) {
 +                      send_mcq = to_mcq(mqp->ibqp.send_cq);
 +                      spin_lock_irqsave(&send_mcq->lock, flags_cq);
 +                      if (send_mcq->mcq.comp &&
 +                          mqp->ibqp.send_cq->comp_handler) {
 +                              if (!send_mcq->mcq.reset_notify_added) {
 +                                      send_mcq->mcq.reset_notify_added = 1;
 +                                      list_add_tail(&send_mcq->mcq.reset_notify,
 +                                                    &cq_notify_list);
 +                              }
 +                      }
 +                      spin_unlock_irqrestore(&send_mcq->lock, flags_cq);
 +              }
 +              spin_unlock_irqrestore(&mqp->sq.lock, flags_qp);
 +              /* Now, handle the QP's receive queue */
 +              spin_lock_irqsave(&mqp->rq.lock, flags_qp);
 +              /* no handling is needed for SRQ */
 +              if (!mqp->ibqp.srq) {
 +                      if (mqp->rq.tail != mqp->rq.head) {
 +                              recv_mcq = to_mcq(mqp->ibqp.recv_cq);
 +                              spin_lock_irqsave(&recv_mcq->lock, flags_cq);
 +                              if (recv_mcq->mcq.comp &&
 +                                  mqp->ibqp.recv_cq->comp_handler) {
 +                                      if (!recv_mcq->mcq.reset_notify_added) {
 +                                              recv_mcq->mcq.reset_notify_added = 1;
 +                                              list_add_tail(&recv_mcq->mcq.reset_notify,
 +                                                            &cq_notify_list);
 +                                      }
 +                              }
 +                              spin_unlock_irqrestore(&recv_mcq->lock,
 +                                                     flags_cq);
 +                      }
 +              }
 +              spin_unlock_irqrestore(&mqp->rq.lock, flags_qp);
 +      }
 +
 +      list_for_each_entry(mcq, &cq_notify_list, reset_notify) {
 +              mcq->comp(mcq);
 +      }
 +      spin_unlock_irqrestore(&ibdev->reset_flow_resource_lock, flags);
 +      pr_warn("mlx4_ib_handle_catas_error ended\n");
 +}
 +
 +static void handle_bonded_port_state_event(struct work_struct *work)
 +{
 +      struct ib_event_work *ew =
 +              container_of(work, struct ib_event_work, work);
 +      struct mlx4_ib_dev *ibdev = ew->ib_dev;
 +      enum ib_port_state bonded_port_state = IB_PORT_NOP;
 +      int i;
 +      struct ib_event ibev;
 +
 +      kfree(ew);
 +      spin_lock_bh(&ibdev->iboe.lock);
 +      for (i = 0; i < MLX4_MAX_PORTS; ++i) {
 +              struct net_device *curr_netdev = ibdev->iboe.netdevs[i];
 +
 +              enum ib_port_state curr_port_state =
 +                      (netif_running(curr_netdev) &&
 +                       netif_carrier_ok(curr_netdev)) ?
 +                      IB_PORT_ACTIVE : IB_PORT_DOWN;
 +
 +              bonded_port_state = (bonded_port_state != IB_PORT_ACTIVE) ?
 +                      curr_port_state : IB_PORT_ACTIVE;
 +      }
 +      spin_unlock_bh(&ibdev->iboe.lock);
 +
 +      ibev.device = &ibdev->ib_dev;
 +      ibev.element.port_num = 1;
 +      ibev.event = (bonded_port_state == IB_PORT_ACTIVE) ?
 +              IB_EVENT_PORT_ACTIVE : IB_EVENT_PORT_ERR;
 +
 +      ib_dispatch_event(&ibev);
 +}
 +
  static void mlx4_ib_event(struct mlx4_dev *dev, void *ibdev_ptr,
                          enum mlx4_dev_event event, unsigned long param)
  {
        struct ib_event_work *ew;
        int p = 0;
  
 +      if (mlx4_is_bonded(dev) &&
 +          ((event == MLX4_DEV_EVENT_PORT_UP) ||
 +          (event == MLX4_DEV_EVENT_PORT_DOWN))) {
 +              ew = kmalloc(sizeof(*ew), GFP_ATOMIC);
 +              if (!ew)
 +                      return;
 +              INIT_WORK(&ew->work, handle_bonded_port_state_event);
 +              ew->ib_dev = ibdev;
 +              queue_work(wq, &ew->work);
 +              return;
 +      }
 +
        if (event == MLX4_DEV_EVENT_PORT_MGMT_CHANGE)
                eqe = (struct mlx4_eqe *)param;
        else
        case MLX4_DEV_EVENT_CATASTROPHIC_ERROR:
                ibdev->ib_active = false;
                ibev.event = IB_EVENT_DEVICE_FATAL;
 +              mlx4_ib_handle_catas_error(ibdev);
                break;
  
        case MLX4_DEV_EVENT_PORT_MGMT_CHANGE:
        }
  
        ibev.device           = ibdev_ptr;
 -      ibev.element.port_num = (u8) p;
 +      ibev.element.port_num = mlx4_is_bonded(ibdev->dev) ? 1 : (u8)p;
  
        ib_dispatch_event(&ibev);
  }
@@@ -2808,8 -2613,7 +2807,8 @@@ static struct mlx4_interface mlx4_ib_in
        .add            = mlx4_ib_add,
        .remove         = mlx4_ib_remove,
        .event          = mlx4_ib_event,
 -      .protocol       = MLX4_PROT_IB_IPV6
 +      .protocol       = MLX4_PROT_IB_IPV6,
 +      .flags          = MLX4_INTFF_BONDING
  };
  
  static int __init mlx4_ib_init(void)
index dfc6ca128a7e355ef737976dceee50a7033e62b7,c880329b4d64691e3596490b2c18ad67c6ab4ef9..ed2bd6701f9b131c3dc3261cb2eae21a2d835524
  #include <rdma/ib_addr.h>
  #include <rdma/ib_mad.h>
  
 +#include <linux/mlx4/driver.h>
  #include <linux/mlx4/qp.h>
  
  #include "mlx4_ib.h"
  #include "user.h"
  
 +static void mlx4_ib_lock_cqs(struct mlx4_ib_cq *send_cq,
 +                           struct mlx4_ib_cq *recv_cq);
 +static void mlx4_ib_unlock_cqs(struct mlx4_ib_cq *send_cq,
 +                             struct mlx4_ib_cq *recv_cq);
 +
  enum {
        MLX4_IB_ACK_REQ_FREQ    = 8,
  };
@@@ -99,6 -93,17 +99,6 @@@ enum 
  #ifndef ETH_ALEN
  #define ETH_ALEN        6
  #endif
 -static inline u64 mlx4_mac_to_u64(u8 *addr)
 -{
 -      u64 mac = 0;
 -      int i;
 -
 -      for (i = 0; i < ETH_ALEN; i++) {
 -              mac <<= 8;
 -              mac |= addr[i];
 -      }
 -      return mac;
 -}
  
  static const __be32 mlx4_ib_opcode[] = {
        [IB_WR_SEND]                            = cpu_to_be32(MLX4_OPCODE_SEND),
@@@ -623,8 -628,6 +623,8 @@@ static int create_qp_common(struct mlx4
        struct mlx4_ib_sqp *sqp;
        struct mlx4_ib_qp *qp;
        enum mlx4_ib_qp_type qp_type = (enum mlx4_ib_qp_type) init_attr->qp_type;
 +      struct mlx4_ib_cq *mcq;
 +      unsigned long flags;
  
        /* When tunneling special qps, we use a plain UD qp */
        if (sqpn) {
        qp->mqp.event = mlx4_ib_qp_event;
        if (!*caller_qp)
                *caller_qp = qp;
 +
 +      spin_lock_irqsave(&dev->reset_flow_resource_lock, flags);
 +      mlx4_ib_lock_cqs(to_mcq(init_attr->send_cq),
 +                       to_mcq(init_attr->recv_cq));
 +      /* Maintain device to QPs access, needed for further handling
 +       * via reset flow
 +       */
 +      list_add_tail(&qp->qps_list, &dev->qp_list);
 +      /* Maintain CQ to QPs access, needed for further handling
 +       * via reset flow
 +       */
 +      mcq = to_mcq(init_attr->send_cq);
 +      list_add_tail(&qp->cq_send_list, &mcq->send_qp_list);
 +      mcq = to_mcq(init_attr->recv_cq);
 +      list_add_tail(&qp->cq_recv_list, &mcq->recv_qp_list);
 +      mlx4_ib_unlock_cqs(to_mcq(init_attr->send_cq),
 +                         to_mcq(init_attr->recv_cq));
 +      spin_unlock_irqrestore(&dev->reset_flow_resource_lock, flags);
        return 0;
  
  err_qpn:
@@@ -911,13 -896,13 +911,13 @@@ static void mlx4_ib_lock_cqs(struct mlx
        __acquires(&send_cq->lock) __acquires(&recv_cq->lock)
  {
        if (send_cq == recv_cq) {
 -              spin_lock_irq(&send_cq->lock);
 +              spin_lock(&send_cq->lock);
                __acquire(&recv_cq->lock);
        } else if (send_cq->mcq.cqn < recv_cq->mcq.cqn) {
 -              spin_lock_irq(&send_cq->lock);
 +              spin_lock(&send_cq->lock);
                spin_lock_nested(&recv_cq->lock, SINGLE_DEPTH_NESTING);
        } else {
 -              spin_lock_irq(&recv_cq->lock);
 +              spin_lock(&recv_cq->lock);
                spin_lock_nested(&send_cq->lock, SINGLE_DEPTH_NESTING);
        }
  }
@@@ -927,13 -912,13 +927,13 @@@ static void mlx4_ib_unlock_cqs(struct m
  {
        if (send_cq == recv_cq) {
                __release(&recv_cq->lock);
 -              spin_unlock_irq(&send_cq->lock);
 +              spin_unlock(&send_cq->lock);
        } else if (send_cq->mcq.cqn < recv_cq->mcq.cqn) {
                spin_unlock(&recv_cq->lock);
 -              spin_unlock_irq(&send_cq->lock);
 +              spin_unlock(&send_cq->lock);
        } else {
                spin_unlock(&send_cq->lock);
 -              spin_unlock_irq(&recv_cq->lock);
 +              spin_unlock(&recv_cq->lock);
        }
  }
  
@@@ -978,7 -963,6 +978,7 @@@ static void destroy_qp_common(struct ml
                              int is_user)
  {
        struct mlx4_ib_cq *send_cq, *recv_cq;
 +      unsigned long flags;
  
        if (qp->state != IB_QPS_RESET) {
                if (mlx4_qp_modify(dev->dev, NULL, to_mlx4_state(qp->state),
  
        get_cqs(qp, &send_cq, &recv_cq);
  
 +      spin_lock_irqsave(&dev->reset_flow_resource_lock, flags);
        mlx4_ib_lock_cqs(send_cq, recv_cq);
  
 +      /* del from lists under both locks above to protect reset flow paths */
 +      list_del(&qp->qps_list);
 +      list_del(&qp->cq_send_list);
 +      list_del(&qp->cq_recv_list);
        if (!is_user) {
                __mlx4_ib_cq_clean(recv_cq, qp->mqp.qpn,
                                 qp->ibqp.srq ? to_msrq(qp->ibqp.srq): NULL);
        mlx4_qp_remove(dev->dev, &qp->mqp);
  
        mlx4_ib_unlock_cqs(send_cq, recv_cq);
 +      spin_unlock_irqrestore(&dev->reset_flow_resource_lock, flags);
  
        mlx4_qp_free(dev->dev, &qp->mqp);
  
@@@ -1696,8 -1674,10 +1696,10 @@@ static int __mlx4_ib_modify_qp(struct i
                            qp->mlx4_ib_qp_type == MLX4_IB_QPT_PROXY_GSI ||
                            qp->mlx4_ib_qp_type == MLX4_IB_QPT_TUN_GSI) {
                                err = handle_eth_ud_smac_index(dev, qp, (u8 *)attr->smac, context);
-                               if (err)
-                                       return -EINVAL;
+                               if (err) {
+                                       err = -EINVAL;
+                                       goto out;
+                               }
                                if (qp->mlx4_ib_qp_type == MLX4_IB_QPT_PROXY_GSI)
                                        dev->qp1_proxy[qp->port - 1] = qp;
                        }
@@@ -1937,22 -1917,6 +1939,22 @@@ int mlx4_ib_modify_qp(struct ib_qp *ibq
                goto out;
        }
  
 +      if (mlx4_is_bonded(dev->dev) && (attr_mask & IB_QP_PORT)) {
 +              if ((cur_state == IB_QPS_RESET) && (new_state == IB_QPS_INIT)) {
 +                      if ((ibqp->qp_type == IB_QPT_RC) ||
 +                          (ibqp->qp_type == IB_QPT_UD) ||
 +                          (ibqp->qp_type == IB_QPT_UC) ||
 +                          (ibqp->qp_type == IB_QPT_RAW_PACKET) ||
 +                          (ibqp->qp_type == IB_QPT_XRC_INI)) {
 +                              attr->port_num = mlx4_ib_bond_next_port(dev);
 +                      }
 +              } else {
 +                      /* no sense in changing port_num
 +                       * when ports are bonded */
 +                      attr_mask &= ~IB_QP_PORT;
 +              }
 +      }
 +
        if ((attr_mask & IB_QP_PORT) &&
            (attr->port_num == 0 || attr->port_num > dev->num_ports)) {
                pr_debug("qpn 0x%x: invalid port number (%d) specified "
  
        err = __mlx4_ib_modify_qp(ibqp, attr, attr_mask, cur_state, new_state);
  
 +      if (mlx4_is_bonded(dev->dev) && (attr_mask & IB_QP_PORT))
 +              attr->port_num = 1;
 +
  out:
        mutex_unlock(&qp->mutex);
        return err;
@@@ -2650,15 -2611,8 +2652,15 @@@ int mlx4_ib_post_send(struct ib_qp *ibq
        __be32 uninitialized_var(lso_hdr_sz);
        __be32 blh;
        int i;
 +      struct mlx4_ib_dev *mdev = to_mdev(ibqp->device);
  
        spin_lock_irqsave(&qp->sq.lock, flags);
 +      if (mdev->dev->persist->state & MLX4_DEVICE_STATE_INTERNAL_ERROR) {
 +              err = -EIO;
 +              *bad_wr = wr;
 +              nreq = 0;
 +              goto out;
 +      }
  
        ind = qp->sq_next_wqe;
  
@@@ -2956,18 -2910,10 +2958,18 @@@ int mlx4_ib_post_recv(struct ib_qp *ibq
        int ind;
        int max_gs;
        int i;
 +      struct mlx4_ib_dev *mdev = to_mdev(ibqp->device);
  
        max_gs = qp->rq.max_gs;
        spin_lock_irqsave(&qp->rq.lock, flags);
  
 +      if (mdev->dev->persist->state & MLX4_DEVICE_STATE_INTERNAL_ERROR) {
 +              err = -EIO;
 +              *bad_wr = wr;
 +              nreq = 0;
 +              goto out;
 +      }
 +
        ind = qp->rq.head & (qp->rq.wqe_cnt - 1);
  
        for (nreq = 0; wr; ++nreq, wr = wr->next) {