[linux-next] LinuxNextTracking branch, master, updated. next-20180328

batman at open-mesh.org batman at open-mesh.org
Thu Mar 29 00:16:37 CEST 2018


The following commit has been merged in the master branch:
commit fa5213912c605138436236d6c12d579f72799067
Merge: 7d1483bb0c7cde6a739696c9e74cb38adc8b15fa 5d22d47b9ed96eddb35821dc2cc4f629f45827f7
Author: Stephen Rothwell <sfr at canb.auug.org.au>
Date:   Wed Mar 28 12:56:51 2018 +1100

    Merge remote-tracking branch 'net-next/master'

diff --combined MAINTAINERS
index a876cbb703be,9107d9241564..51a641b596cc
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@@ -866,17 -866,7 +866,17 @@@ F:	drivers/iio/*/ad
  F:	drivers/iio/adc/ltc2497*
  X:	drivers/iio/*/adjd*
  F:	drivers/staging/iio/*/ad*
 -F:	drivers/staging/iio/trigger/iio-trig-bfin-timer.c
 +
 +ANDES ARCHITECTURE
 +M:	Greentime Hu <green.hu at gmail.com>
 +M:	Vincent Chen <deanbo422 at gmail.com>
 +T:	git https://github.com/andestech/linux.git
 +S:	Supported
 +F:	arch/nds32/
 +F:	Documentation/devicetree/bindings/interrupt-controller/andestech,ativic32.txt
 +F:	Documentation/devicetree/bindings/nds32/
 +K:	nds32
 +N:	nds32
  
  ANDROID CONFIG FRAGMENTS
  M:	Rob Herring <robh at kernel.org>
@@@ -1162,7 -1152,7 +1162,7 @@@ S:	Maintaine
  F:	drivers/clk/sunxi/
  
  ARM/Allwinner sunXi SoC support
 -M:	Maxime Ripard <maxime.ripard at free-electrons.com>
 +M:	Maxime Ripard <maxime.ripard at bootlin.com>
  M:	Chen-Yu Tsai <wens at csie.org>
  L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
  S:	Maintained
@@@ -1246,6 -1236,27 +1246,6 @@@ M:	Boris Brezillon <boris.brezillon at fre
  S:	Maintained
  F:	drivers/clk/at91
  
 -ARM/ATMEL AT91RM9200, AT91SAM9 AND SAMA5 SOC SUPPORT
 -M:	Nicolas Ferre <nicolas.ferre at microchip.com>
 -M:	Alexandre Belloni <alexandre.belloni at bootlin.com>
 -L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
 -W:	http://www.linux4sam.org
 -T:	git git://git.kernel.org/pub/scm/linux/kernel/git/nferre/linux-at91.git
 -S:	Supported
 -N:	at91
 -N:	atmel
 -F:	arch/arm/mach-at91/
 -F:	include/soc/at91/
 -F:	arch/arm/boot/dts/at91*.dts
 -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
 -F:	drivers/memory/atmel*
 -F:	drivers/watchdog/sama5d4_wdt.c
 -X:	drivers/input/touchscreen/atmel_mxt_ts.c
 -X:	drivers/net/wireless/atmel/
 -
  ARM/CALXEDA HIGHBANK ARCHITECTURE
  M:	Rob Herring <robh at kernel.org>
  L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
@@@ -1645,27 -1656,6 +1645,27 @@@ L:	linux-arm-kernel at lists.infradead.or
  F:	arch/arm/mach-ks8695/
  S:	Odd Fixes
  
 +ARM/Microchip (AT91) SoC support
 +M:	Nicolas Ferre <nicolas.ferre at microchip.com>
 +M:	Alexandre Belloni <alexandre.belloni at bootlin.com>
 +L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
 +W:	http://www.linux4sam.org
 +T:	git git://git.kernel.org/pub/scm/linux/kernel/git/nferre/linux-at91.git
 +S:	Supported
 +N:	at91
 +N:	atmel
 +F:	arch/arm/mach-at91/
 +F:	include/soc/at91/
 +F:	arch/arm/boot/dts/at91*.dts
 +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
 +F:	drivers/memory/atmel*
 +F:	drivers/watchdog/sama5d4_wdt.c
 +X:	drivers/input/touchscreen/atmel_mxt_ts.c
 +X:	drivers/net/wireless/atmel/
 +
  ARM/MIOA701 MACHINE SUPPORT
  M:	Robert Jarzmik <robert.jarzmik at free.fr>
  L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
@@@ -1710,20 -1700,6 +1710,20 @@@ F:	Documentation/devicetree/bindings/ar
  F:	Documentation/devicetree/bindings/arm/ux500/
  T:	git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-nomadik.git
  
 +ARM/NUVOTON NPCM ARCHITECTURE
 +M:	Avi Fishman <avifishman70 at gmail.com>
 +M:	Tomer Maimon <tmaimon77 at gmail.com>
 +R:	Patrick Venture <venture at google.com>
 +R:	Nancy Yuen <yuenn at google.com>
 +R:	Brendan Higgins <brendanhiggins at google.com>
 +L:	openbmc at lists.ozlabs.org (moderated for non-subscribers)
 +S:	Supported
 +F:	arch/arm/mach-npcm/
 +F:	arch/arm/boot/dts/nuvoton-npcm*
 +F:	include/dt-bindings/clock/nuvoton,npcm7xx-clks.h
 +F:	drivers/*/*npcm*
 +F:	Documentation/*/*npcm*
 +
  ARM/NUVOTON W90X900 ARM ARCHITECTURE
  M:	Wan ZongShun <mcuos.com at gmail.com>
  L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
@@@ -1887,6 -1863,7 +1887,6 @@@ Q:	https://patchwork.kernel.org/project
  S:	Maintained
  F:	arch/arm/boot/dts/s3c*
  F:	arch/arm/boot/dts/s5p*
 -F:	arch/arm/boot/dts/samsung*
  F:	arch/arm/boot/dts/exynos*
  F:	arch/arm64/boot/dts/exynos/
  F:	arch/arm/plat-samsung/
@@@ -1986,14 -1963,6 +1986,14 @@@ M:	Thor Thayer <thor.thayer at linux.intel
  S:	Maintained
  F:	drivers/edac/altera_edac.
  
 +ARM/SPREADTRUM SoC SUPPORT
 +M:	Orson Zhai <orsonzhai at gmail.com>
 +M:	Baolin Wang <baolin.wang at linaro.org>
 +M:	Chunyan Zhang <zhang.lyra at gmail.com>
 +S:	Maintained
 +F:	arch/arm64/boot/dts/sprd
 +N:	sprd
 +
  ARM/STI ARCHITECTURE
  M:	Patrice Chotard <patrice.chotard at st.com>
  L:	linux-arm-kernel at lists.infradead.org (moderated for non-subscribers)
@@@ -2660,6 -2629,51 +2660,6 @@@ F:	Documentation/filesystems/bfs.tx
  F:	fs/bfs/
  F:	include/uapi/linux/bfs_fs.h
  
 -BLACKFIN ARCHITECTURE
 -L:	adi-buildroot-devel at lists.sourceforge.net (moderated for non-subscribers)
 -T:	git git://git.code.sf.net/p/adi-linux/code
 -W:	http://blackfin.uclinux.org
 -S:	Orphan
 -F:	arch/blackfin/
 -
 -BLACKFIN EMAC DRIVER
 -L:	adi-buildroot-devel at lists.sourceforge.net (moderated for non-subscribers)
 -W:	http://blackfin.uclinux.org
 -S:	Orphan
 -F:	drivers/net/ethernet/adi/
 -
 -BLACKFIN MEDIA DRIVER
 -L:	adi-buildroot-devel at lists.sourceforge.net (moderated for non-subscribers)
 -W:	http://blackfin.uclinux.org/
 -S:	Orphan
 -F:	drivers/media/platform/blackfin/
 -F:	drivers/media/i2c/adv7183*
 -F:	drivers/media/i2c/vs6624*
 -
 -BLACKFIN RTC DRIVER
 -L:	adi-buildroot-devel at lists.sourceforge.net (moderated for non-subscribers)
 -W:	http://blackfin.uclinux.org
 -S:	Orphan
 -F:	drivers/rtc/rtc-bfin.c
 -
 -BLACKFIN SDH DRIVER
 -L:	adi-buildroot-devel at lists.sourceforge.net (moderated for non-subscribers)
 -W:	http://blackfin.uclinux.org
 -S:	Orphan
 -F:	drivers/mmc/host/bfin_sdh.c
 -
 -BLACKFIN SERIAL DRIVER
 -L:	adi-buildroot-devel at lists.sourceforge.net (moderated for non-subscribers)
 -W:	http://blackfin.uclinux.org
 -S:	Orphan
 -F:	drivers/tty/serial/bfin_uart.c
 -
 -BLACKFIN WATCHDOG DRIVER
 -L:	adi-buildroot-devel at lists.sourceforge.net (moderated for non-subscribers)
 -W:	http://blackfin.uclinux.org
 -S:	Orphan
 -F:	drivers/watchdog/bfin_wdt.c
 -
  BLINKM RGB LED DRIVER
  M:	Jan-Simon Moeller <jansimon.moeller at gmx.de>
  S:	Maintained
@@@ -3293,7 -3307,6 +3293,7 @@@ F:	include/media/cec-notifier.
  F:	include/uapi/linux/cec.h
  F:	include/uapi/linux/cec-funcs.h
  F:	Documentation/devicetree/bindings/media/cec.txt
 +F:	Documentation/ABI/testing/debugfs-cec-error-inj
  
  CEC GPIO DRIVER
  M:	Hans Verkuil <hans.verkuil at cisco.com>
@@@ -3736,6 -3749,16 +3736,6 @@@ S:	Maintaine
  F:	Documentation/filesystems/cramfs.txt
  F:	fs/cramfs/
  
 -CRIS PORT
 -M:	Mikael Starvik <starvik at axis.com>
 -M:	Jesper Nilsson <jesper.nilsson at axis.com>
 -L:	linux-cris-kernel at axis.com
 -W:	http://developer.axis.com
 -T:	git git://git.kernel.org/pub/scm/linux/kernel/git/jesper/cris.git
 -S:	Maintained
 -F:	arch/cris/
 -F:	drivers/tty/serial/crisv10.*
 -
  CRYPTO API
  M:	Herbert Xu <herbert at gondor.apana.org.au>
  M:	"David S. Miller" <davem at davemloft.net>
@@@ -4312,7 -4335,6 +4312,7 @@@ Q:	https://patchwork.kernel.org/project
  S:	Maintained
  F:	drivers/dma/
  F:	include/linux/dmaengine.h
 +F:	include/linux/of_dma.h
  F:	Documentation/devicetree/bindings/dma/
  F:	Documentation/driver-api/dmaengine/
  T:	git git://git.infradead.org/users/vkoul/slave-dma.git
@@@ -4604,7 -4626,7 +4604,7 @@@ F:	include/uapi/drm/drm
  F:	include/linux/vga*
  
  DRM DRIVERS FOR ALLWINNER A10
 -M:	Maxime Ripard  <maxime.ripard at free-electrons.com>
 +M:	Maxime Ripard  <maxime.ripard at bootlin.com>
  L:	dri-devel at lists.freedesktop.org
  S:	Supported
  F:	drivers/gpu/drm/sun4i/
@@@ -5777,6 -5799,10 +5777,6 @@@ F:	fs/crypto
  F:	include/linux/fscrypt*.h
  F:	Documentation/filesystems/fscrypt.rst
  
 -FUJITSU FR-V (FRV) PORT
 -S:	Orphan
 -F:	arch/frv/
 -
  FUJITSU LAPTOP EXTRAS
  M:	Jonathan Woithe <jwoithe at just42.net>
  L:	platform-driver-x86 at vger.kernel.org
@@@ -6009,7 -6035,6 +6009,7 @@@ F:	Documentation/ABI/obsolete/sysfs-gpi
  F:	drivers/gpio/
  F:	include/linux/gpio/
  F:	include/linux/gpio.h
 +F:	include/linux/of_gpio.h
  F:	include/asm-generic/gpio.h
  F:	include/uapi/linux/gpio.h
  F:	tools/gpio/
@@@ -6549,7 -6574,7 +6549,7 @@@ F:	drivers/i2c/muxes
  F:	include/linux/i2c-mux.h
  
  I2C MV64XXX MARVELL AND ALLWINNER DRIVER
 -M:	Gregory CLEMENT <gregory.clement at free-electrons.com>
 +M:	Gregory CLEMENT <gregory.clement at bootlin.com>
  L:	linux-i2c at vger.kernel.org
  S:	Maintained
  F:	drivers/i2c/busses/i2c-mv64xxx.c
@@@ -6878,13 -6903,6 +6878,13 @@@ M:	James Hogan <jhogan at kernel.org
  S:	Maintained
  F:	drivers/media/rc/img-ir/
  
 +IMON SOUNDGRAPH USB IR RECEIVER
 +M:	Sean Young <sean at mess.org>
 +L:	linux-media at vger.kernel.org
 +S:	Maintained
 +F:	drivers/media/rc/imon_raw.c
 +F:	drivers/media/rc/imon.c
 +
  IMS TWINTURBO FRAMEBUFFER DRIVER
  L:	linux-fbdev at vger.kernel.org
  S:	Orphan
@@@ -7045,6 -7063,7 +7045,7 @@@ F:	Documentation/networking/ixgbe.tx
  F:	Documentation/networking/ixgbevf.txt
  F:	Documentation/networking/i40e.txt
  F:	Documentation/networking/i40evf.txt
+ F:	Documentation/networking/ice.txt
  F:	drivers/net/ethernet/intel/
  F:	drivers/net/ethernet/intel/*/
  F:	include/linux/avf/virtchnl.h
@@@ -7210,7 -7229,6 +7211,7 @@@ M:	Shiraz Saleem <shiraz.saleem at intel.c
  L:	linux-rdma at vger.kernel.org
  S:	Supported
  F:	drivers/infiniband/hw/i40iw/
 +F:	include/uapi/rdma/i40iw-abi.h
  
  INTEL TELEMETRY DRIVER
  M:	Souvik Kumar Chakravarty <souvik.k.chakravarty at intel.com>
@@@ -7306,7 -7324,6 +7307,7 @@@ S:	Maintaine
  F:	Documentation/devicetree/bindings/iommu/
  F:	drivers/iommu/
  F:	include/linux/iommu.h
 +F:	include/linux/of_iommu.h
  F:	include/linux/iova.h
  
  IP MASQUERADING
@@@ -8296,6 -8313,11 +8297,6 @@@ W:	http://linux-test-project.github.io
  T:	git git://github.com/linux-test-project/ltp.git
  S:	Maintained
  
 -M32R ARCHITECTURE
 -W:	http://www.linux-m32r.org/
 -S:	Orphan
 -F:	arch/m32r/
 -
  M68K ARCHITECTURE
  M:	Geert Uytterhoeven <geert at linux-m68k.org>
  L:	linux-m68k at lists.linux-m68k.org
@@@ -8575,6 -8597,15 +8576,15 @@@ S:	Maintaine
  F:	Documentation/ABI/testing/sysfs-bus-iio-potentiometer-mcp4531
  F:	drivers/iio/potentiometer/mcp4531.c
  
+ MCR20A IEEE-802.15.4 RADIO DRIVER
+ M:	Xue Liu <liuxuenetmail at gmail.com>
+ L:	linux-wpan at vger.kernel.org
+ W:	https://github.com/xueliu/mcr20a-linux
+ S:	Maintained
+ F:	drivers/net/ieee802154/mcr20a.c
+ F:	drivers/net/ieee802154/mcr20a.h
+ F:	Documentation/devicetree/bindings/net/ieee802154/mcr20a.txt
+ 
  MEASUREMENT COMPUTING CIO-DAC IIO DRIVER
  M:	William Breathitt Gray <vilhelm.gray at gmail.com>
  L:	linux-iio at vger.kernel.org
@@@ -8591,14 -8622,6 +8601,14 @@@ T:	git git://linuxtv.org/media_tree.gi
  S:	Supported
  F:	drivers/media/dvb-frontends/ascot2e*
  
 +MEDIA DRIVERS FOR CXD2099AR CI CONTROLLERS
 +M:	Jasmin Jessich <jasmin at anw.at>
 +L:	linux-media at vger.kernel.org
 +W:	https://linuxtv.org
 +T:	git git://linuxtv.org/media_tree.git
 +S:	Maintained
 +F:	drivers/media/dvb-frontends/cxd2099*
 +
  MEDIA DRIVERS FOR CXD2841ER
  M:	Sergey Kozlov <serjk at netup.ru>
  M:	Abylay Ospan <aospan at netup.ru>
@@@ -8609,15 -8632,6 +8619,15 @@@ T:	git git://linuxtv.org/media_tree.gi
  S:	Supported
  F:	drivers/media/dvb-frontends/cxd2841er*
  
 +MEDIA DRIVERS FOR CXD2880
 +M:	Yasunari Takiguchi <Yasunari.Takiguchi at sony.com>
 +L:	linux-media at vger.kernel.org
 +W:	http://linuxtv.org/
 +T:	git git://linuxtv.org/media_tree.git
 +S:	Supported
 +F:	drivers/media/dvb-frontends/cxd2880/*
 +F:	drivers/media/spi/cxd2880*
 +
  MEDIA DRIVERS FOR DIGITAL DEVICES PCIE DEVICES
  M:	Daniel Scheller <d.scheller.oss at gmail.com>
  L:	linux-media at vger.kernel.org
@@@ -8685,16 -8699,6 +8695,16 @@@ T:	git git://linuxtv.org/media_tree.gi
  S:	Supported
  F:	drivers/media/pci/netup_unidvb/*
  
 +MEDIA DRIVERS FOR RENESAS - CEU
 +M:	Jacopo Mondi <jacopo at jmondi.org>
 +L:	linux-media at vger.kernel.org
 +L:	linux-renesas-soc at vger.kernel.org
 +T:	git git://linuxtv.org/media_tree.git
 +S:	Supported
 +F:	Documentation/devicetree/bindings/media/renesas,ceu.txt
 +F:	drivers/media/platform/renesas-ceu.c
 +F:	include/media/drv-intf/renesas-ceu.h
 +
  MEDIA DRIVERS FOR RENESAS - DRIF
  M:	Ramesh Shanmugasundaram <ramesh.shanmugasundaram at bp.renesas.com>
  L:	linux-media at vger.kernel.org
@@@ -9090,6 -9094,20 +9100,6 @@@ F:	drivers/media/platform/meson/ao-cec.
  F:	Documentation/devicetree/bindings/media/meson-ao-cec.txt
  T:	git git://linuxtv.org/media_tree.git
  
 -METAG ARCHITECTURE
 -M:	James Hogan <jhogan at kernel.org>
 -L:	linux-metag at vger.kernel.org
 -T:	git git://git.kernel.org/pub/scm/linux/kernel/git/jhogan/metag.git
 -S:	Odd Fixes
 -F:	arch/metag/
 -F:	Documentation/metag/
 -F:	Documentation/devicetree/bindings/metag/
 -F:	Documentation/devicetree/bindings/interrupt-controller/img,*
 -F:	drivers/clocksource/metag_generic.c
 -F:	drivers/irqchip/irq-metag.c
 -F:	drivers/irqchip/irq-metag-ext.c
 -F:	drivers/tty/metag_da.c
 -
  MICROBLAZE ARCHITECTURE
  M:	Michal Simek <monstr at monstr.eu>
  W:	http://www.monstr.eu/fdt/
@@@ -9144,6 -9162,13 +9154,13 @@@ F:	drivers/net/dsa/microchip/
  F:	include/linux/platform_data/microchip-ksz.h
  F:	Documentation/devicetree/bindings/net/dsa/ksz.txt
  
+ MICROCHIP LAN743X ETHERNET DRIVER
+ M:	Bryan Whitehead <bryan.whitehead at microchip.com>
+ M:	Microchip Linux Driver Support <UNGLinuxDriver at microchip.com>
+ L:	netdev at vger.kernel.org
+ S:	Maintained
+ F:	drivers/net/ethernet/microchip/lan743x_*
+ 
  MICROCHIP USB251XB DRIVER
  M:	Richard Leitner <richard.leitner at skidata.com>
  L:	linux-usb at vger.kernel.org
@@@ -9151,15 -9176,6 +9168,15 @@@ S:	Maintaine
  F:	drivers/usb/misc/usb251xb.c
  F:	Documentation/devicetree/bindings/usb/usb251xb.txt
  
 +MICROSEMI MIPS SOCS
 +M:	Alexandre Belloni <alexandre.belloni at bootlin.com>
 +L:	linux-mips at linux-mips.org
 +S:	Maintained
 +F:	arch/mips/generic/board-ocelot.c
 +F:	arch/mips/configs/generic/board-ocelot.config
 +F:	arch/mips/boot/dts/mscc/
 +F:	Documentation/devicetree/bindings/mips/mscc.txt
 +
  MICROSEMI SMART ARRAY SMARTPQI DRIVER (smartpqi)
  M:	Don Brace <don.brace at microsemi.com>
  L:	esc.storagedev at microsemi.com
@@@ -9380,14 -9396,6 +9397,14 @@@ S:	Maintaine
  F:	drivers/media/i2c/mt9t001.c
  F:	include/media/i2c/mt9t001.h
  
 +MT9T112 APTINA CAMERA SENSOR
 +M:	Jacopo Mondi <jacopo at jmondi.org>
 +L:	linux-media at vger.kernel.org
 +T:	git git://linuxtv.org/media_tree.git
 +S:	Odd Fixes
 +F:	drivers/media/i2c/mt9t112.c
 +F:	include/media/i2c/mt9t112.h
 +
  MT9V032 APTINA CAMERA SENSOR
  M:	Laurent Pinchart <laurent.pinchart at ideasonboard.com>
  L:	linux-media at vger.kernel.org
@@@ -10193,13 -10201,6 +10210,13 @@@ T:	git git://linuxtv.org/media_tree.gi
  S:	Maintained
  F:	drivers/media/i2c/ov13858.c
  
 +OMNIVISION OV2685 SENSOR DRIVER
 +M:	Shunqian Zheng <zhengsq at rock-chips.com>
 +L:	linux-media at vger.kernel.org
 +T:	git git://linuxtv.org/media_tree.git
 +S:	Maintained
 +F:	drivers/media/i2c/ov2685.c
 +
  OMNIVISION OV5640 SENSOR DRIVER
  M:	Steve Longerbeam <slongerbeam at gmail.com>
  L:	linux-media at vger.kernel.org
@@@ -10214,13 -10215,6 +10231,13 @@@ T:	git git://linuxtv.org/media_tree.gi
  S:	Maintained
  F:	drivers/media/i2c/ov5647.c
  
 +OMNIVISION OV5695 SENSOR DRIVER
 +M:	Shunqian Zheng <zhengsq at rock-chips.com>
 +L:	linux-media at vger.kernel.org
 +T:	git git://linuxtv.org/media_tree.git
 +S:	Maintained
 +F:	drivers/media/i2c/ov5695.c
 +
  OMNIVISION OV7670 SENSOR DRIVER
  M:	Jonathan Corbet <corbet at lwn.net>
  L:	linux-media at vger.kernel.org
@@@ -10229,14 -10223,6 +10246,14 @@@ S:	Maintaine
  F:	drivers/media/i2c/ov7670.c
  F:	Documentation/devicetree/bindings/media/i2c/ov7670.txt
  
 +OMNIVISION OV772x SENSOR DRIVER
 +M:	Jacopo Mondi <jacopo at jmondi.org>
 +L:	linux-media at vger.kernel.org
 +T:	git git://linuxtv.org/media_tree.git
 +S:	Odd fixes
 +F:	drivers/media/i2c/ov772x.c
 +F:	include/media/i2c/ov772x.h
 +
  OMNIVISION OV7740 SENSOR DRIVER
  M:	Wenyou Yang <wenyou.yang at microchip.com>
  L:	linux-media at vger.kernel.org
@@@ -10245,16 -10231,6 +10262,16 @@@ S:	Maintaine
  F:	drivers/media/i2c/ov7740.c
  F:	Documentation/devicetree/bindings/media/i2c/ov7740.txt
  
 +OMNIVISION OV9650 SENSOR DRIVER
 +M:	Sakari Ailus <sakari.ailus at linux.intel.com>
 +R:	Akinobu Mita <akinobu.mita at gmail.com>
 +R:	Sylwester Nawrocki <s.nawrocki at samsung.com>
 +L:	linux-media at vger.kernel.org
 +T:	git git://linuxtv.org/media_tree.git
 +S:	Maintained
 +F:	drivers/media/i2c/ov9650.c
 +F:	Documentation/devicetree/bindings/media/i2c/ov9650.txt
 +
  ONENAND FLASH DRIVER
  M:	Kyungmin Park <kyungmin.park at samsung.com>
  L:	linux-mtd at lists.infradead.org
@@@ -10456,6 -10432,14 +10473,6 @@@ L:	platform-driver-x86 at vger.kernel.or
  S:	Maintained
  F:	drivers/platform/x86/panasonic-laptop.c
  
 -PANASONIC MN10300/AM33/AM34 PORT
 -M:	David Howells <dhowells at redhat.com>
 -L:	linux-am33-list at redhat.com (moderated for non-subscribers)
 -W:	ftp://ftp.redhat.com/pub/redhat/gnupro/AM33/
 -S:	Maintained
 -F:	Documentation/mn10300/
 -F:	arch/mn10300/
 -
  PARALLEL LCD/KEYPAD PANEL DRIVER
  M:	Willy Tarreau <willy at haproxy.com>
  M:	Ksenija Stanojevic <ksenija.stanojevic at gmail.com>
@@@ -10756,7 -10740,6 +10773,7 @@@ F:	drivers/acpi/pci
  F:	drivers/pci/
  F:	include/asm-generic/pci*
  F:	include/linux/pci*
 +F:	include/linux/of_pci.h
  F:	include/uapi/linux/pci*
  F:	lib/pci*
  F:	arch/x86/pci/
@@@ -11059,7 -11042,7 +11076,7 @@@ F:	include/linux/pktcdvd.
  F:	include/uapi/linux/pktcdvd.h
  
  PKUNITY SOC DRIVERS
 -M:	Guan Xuetao <gxt at mprc.pku.edu.cn>
 +M:	Guan Xuetao <gxt at pku.edu.cn>
  W:	http://mprc.pku.edu.cn/~guanxuetao/linux
  S:	Maintained
  T:	git git://github.com/gxt/linux.git
@@@ -11385,6 -11368,12 +11402,6 @@@ F:	include/sound/pxa2xx-lib.
  F:	sound/arm/pxa*
  F:	sound/soc/pxa/
  
 -PXA3xx NAND FLASH DRIVER
 -M:	Ezequiel Garcia <ezequiel.garcia at free-electrons.com>
 -L:	linux-mtd at lists.infradead.org
 -S:	Maintained
 -F:	drivers/mtd/nand/pxa3xx_nand.c
 -
  QAT DRIVER
  M:	Giovanni Cabiddu <giovanni.cabiddu at intel.com>
  L:	qat-linux at intel.com
@@@ -12242,7 -12231,6 +12259,7 @@@ M:	Tomasz Figa <tomasz.figa at gmail.com
  M:	Chanwoo Choi <cw00.choi at samsung.com>
  S:	Supported
  L:	linux-samsung-soc at vger.kernel.org (moderated for non-subscribers)
 +T:	git git://git.kernel.org/pub/scm/linux/kernel/git/snawrocki/clk.git
  F:	drivers/clk/samsung/
  F:	include/dt-bindings/clock/exynos*.h
  F:	Documentation/devicetree/bindings/clock/exynos*.txt
@@@ -12304,6 -12292,13 +12321,6 @@@ F:	include/linux/sched.
  F:	include/uapi/linux/sched.h
  F:	include/linux/wait.h
  
 -SCORE ARCHITECTURE
 -M:	Chen Liqin <liqin.linux at gmail.com>
 -M:	Lennox Wu <lennox.wu at gmail.com>
 -W:	http://www.sunplus.com
 -S:	Supported
 -F:	arch/score/
 -
  SCR24X CHIP CARD INTERFACE DRIVER
  M:	Lubomir Rintel <lkundrak at v3.sk>
  S:	Supported
@@@ -12831,9 -12826,10 +12848,9 @@@ S:	Maintaine
  F:	drivers/net/ethernet/smsc/smsc9420.*
  
  SOC-CAMERA V4L2 SUBSYSTEM
 -M:	Guennadi Liakhovetski <g.liakhovetski at gmx.de>
  L:	linux-media at vger.kernel.org
  T:	git git://linuxtv.org/media_tree.git
 -S:	Maintained
 +S:	Orphan
  F:	include/media/soc*
  F:	drivers/media/i2c/soc_camera/
  F:	drivers/media/platform/soc_camera/
@@@ -13425,16 -13421,15 +13442,16 @@@ T:	git git://git.kernel.org/pub/scm/lin
  S:	Supported
  F:	drivers/mfd/syscon.c
  
 -SYSTEM CONTROL & POWER INTERFACE (SCPI) Message Protocol drivers
 +SYSTEM CONTROL & POWER/MANAGEMENT INTERFACE (SCPI/SCMI) Message Protocol drivers
  M:	Sudeep Holla <sudeep.holla at arm.com>
  L:	linux-arm-kernel at lists.infradead.org
  S:	Maintained
 -F:	Documentation/devicetree/bindings/arm/arm,scpi.txt
 -F:	drivers/clk/clk-scpi.c
 -F:	drivers/cpufreq/scpi-cpufreq.c
 +F:	Documentation/devicetree/bindings/arm/arm,sc[mp]i.txt
 +F:	drivers/clk/clk-sc[mp]i.c
 +F:	drivers/cpufreq/sc[mp]i-cpufreq.c
  F:	drivers/firmware/arm_scpi.c
 -F:	include/linux/scpi_protocol.h
 +F:	drivers/firmware/arm_scmi/
 +F:	include/linux/sc[mp]i_protocol.h
  
  SYSTEM RESET/SHUTDOWN DRIVERS
  M:	Sebastian Reichel <sre at kernel.org>
@@@ -13550,14 -13545,6 +13567,14 @@@ T:	git git://linuxtv.org/mkrufky/tuners
  S:	Maintained
  F:	drivers/media/tuners/tda18271*
  
 +TDA1997x MEDIA DRIVER
 +M:	Tim Harvey <tharvey at gateworks.com>
 +L:	linux-media at vger.kernel.org
 +W:	https://linuxtv.org
 +Q:	http://patchwork.linuxtv.org/project/linux-media/list/
 +S:	Maintained
 +F:	drivers/media/i2c/tda1997x.*
 +
  TDA827x MEDIA DRIVER
  M:	Michael Krufky <mkrufky at linuxtv.org>
  L:	linux-media at vger.kernel.org
@@@ -13639,12 -13626,6 +13656,12 @@@ L:	linux-media at vger.kernel.or
  S:	Maintained
  F:	drivers/media/rc/ttusbir.c
  
 +TECHWELL TW9910 VIDEO DECODER
 +L:	linux-media at vger.kernel.org
 +S:	Orphan
 +F:	drivers/media/i2c/tw9910.c
 +F:	include/media/i2c/tw9910.h
 +
  TEE SUBSYSTEM
  M:	Jens Wiklander <jens.wiklander at linaro.org>
  S:	Maintained
@@@ -13680,8 -13661,7 +13697,8 @@@ S:	Supporte
  F:	drivers/i2c/busses/i2c-tegra.c
  
  TEGRA IOMMU DRIVERS
 -M:	Hiroshi Doyu <hdoyu at nvidia.com>
 +M:	Thierry Reding <thierry.reding at gmail.com>
 +L:	linux-tegra at vger.kernel.org
  S:	Supported
  F:	drivers/iommu/tegra*
  
@@@ -13854,13 -13834,6 +13871,13 @@@ F:	arch/arm/mach-davinci
  F:	drivers/i2c/busses/i2c-davinci.c
  F:	arch/arm/boot/dts/da850*
  
 +TI DAVINCI SERIES CLOCK DRIVER
 +M:	David Lechner <david at lechnology.com>
 +R:	Sekhar Nori <nsekhar at ti.com>
 +S:	Maintained
 +F:	Documentation/devicetree/bindings/clock/ti/davinci/
 +F:	drivers/clk/davinci/
 +
  TI DAVINCI SERIES GPIO DRIVER
  M:	Keerthy <j-keerthy at ti.com>
  L:	linux-gpio at vger.kernel.org
@@@ -13976,6 -13949,19 +13993,6 @@@ S:	Orpha
  F:	drivers/net/wireless/ti/
  F:	include/linux/wl12xx.h
  
 -TILE ARCHITECTURE
 -W:	http://www.mellanox.com/repository/solutions/tile-scm/
 -S:	Orphan
 -F:	arch/tile/
 -F:	drivers/char/tile-srom.c
 -F:	drivers/edac/tile_edac.c
 -F:	drivers/net/ethernet/tile/
 -F:	drivers/rtc/rtc-tile.c
 -F:	drivers/tty/hvc/hvc_tile.c
 -F:	drivers/tty/serial/tilegx.c
 -F:	drivers/usb/host/*-tilegx.c
 -F:	include/linux/usb/tilegx.h
 -
  TIMEKEEPING, CLOCKSOURCE CORE, NTP, ALARMTIMER
  M:	John Stultz <john.stultz at linaro.org>
  M:	Thomas Gleixner <tglx at linutronix.de>
@@@ -14301,7 -14287,7 +14318,7 @@@ F:	include/linux/uwb.
  F:	include/linux/uwb/
  
  UNICORE32 ARCHITECTURE:
 -M:	Guan Xuetao <gxt at mprc.pku.edu.cn>
 +M:	Guan Xuetao <gxt at pku.edu.cn>
  W:	http://mprc.pku.edu.cn/~guanxuetao/linux
  S:	Maintained
  T:	git git://github.com/gxt/linux.git
diff --combined arch/arm/boot/dts/armada-370-rd.dts
index 54ee9fa6b58e,c28afb242393..cc2f774eb267
--- a/arch/arm/boot/dts/armada-370-rd.dts
+++ b/arch/arm/boot/dts/armada-370-rd.dts
@@@ -1,4 -1,3 +1,4 @@@
 +// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
  /*
   * Device Tree file for Marvell Armada 370 Reference Design board
   * (RD-88F6710-A1)
@@@ -7,6 -6,44 +7,6 @@@
   *
   *  Copyright (C) 2013 Florian Fainelli <florian at openwrt.org>
   *
 - * This file is dual-licensed: you can use it either under the terms
 - * of the GPL or the X11 license, at your option. Note that this dual
 - * licensing only applies to this file, and not this project as a
 - * whole.
 - *
 - *  a) This file is free software; you can redistribute it and/or
 - *     modify it under the terms of the GNU General Public License as
 - *     published by the Free Software Foundation; either version 2 of the
 - *     License, or (at your option) any later version.
 - *
 - *     This file is distributed in the hope that it will be useful,
 - *     but WITHOUT ANY WARRANTY; without even the implied warranty of
 - *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 - *     GNU General Public License for more details.
 - *
 - * Or, alternatively,
 - *
 - *  b) Permission is hereby granted, free of charge, to any person
 - *     obtaining a copy of this software and associated documentation
 - *     files (the "Software"), to deal in the Software without
 - *     restriction, including without limitation the rights to use,
 - *     copy, modify, merge, publish, distribute, sublicense, and/or
 - *     sell copies of the Software, and to permit persons to whom the
 - *     Software is furnished to do so, subject to the following
 - *     conditions:
 - *
 - *     The above copyright notice and this permission notice shall be
 - *     included in all copies or substantial portions of the Software.
 - *
 - *     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 - *     EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 - *     OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 - *     NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 - *     HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 - *     WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 - *     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 - *     OTHER DEALINGS IN THE SOFTWARE.
 - *
   * Note: this Device Tree assumes that the bootloader has remapped the
   * internal registers to 0xf1000000 (instead of the default
   * 0xd0000000). The 0xf1000000 is the default used by the recent,
@@@ -19,6 -56,7 +19,7 @@@
  
  /dts-v1/;
  #include <dt-bindings/input/input.h>
+ #include <dt-bindings/interrupt-controller/irq.h>
  #include <dt-bindings/gpio/gpio.h>
  #include "armada-370.dtsi"
  
@@@ -206,6 -244,8 +207,8 @@@
  		#address-cells = <1>;
  		#size-cells = <0>;
  		reg = <0x10>;
+ 		interrupt-controller;
+ 		#interrupt-cells = <2>;
  
  		ports {
  			#address-cells = <1>;
@@@ -241,6 -281,35 +244,35 @@@
  				};
  			};
  		};
+ 
+ 		mdio {
+ 			#address-cells = <1>;
+ 			#size-cells = <0>;
+ 
+ 			switchphy0: switchphy at 0 {
+ 				reg = <0>;
+ 				interrupt-parent = <&switch>;
+ 				interrupts = <0 IRQ_TYPE_LEVEL_HIGH>;
+ 			};
+ 
+ 			switchphy1: switchphy at 1 {
+ 				reg = <1>;
+ 				interrupt-parent = <&switch>;
+ 				interrupts = <1 IRQ_TYPE_LEVEL_HIGH>;
+ 			};
+ 
+ 			switchphy2: switchphy at 2 {
+ 				reg = <2>;
+ 				interrupt-parent = <&switch>;
+ 				interrupts = <2 IRQ_TYPE_LEVEL_HIGH>;
+ 			};
+ 
+ 			switchphy3: switchphy at 3 {
+ 				reg = <3>;
+ 				interrupt-parent = <&switch>;
+ 				interrupts = <3 IRQ_TYPE_LEVEL_HIGH>;
+ 			};
+ 		};
  	};
  };
  
diff --combined arch/m68k/mac/config.c
index 36086cceb537,c73eb8209555..0c3275aa0197
--- a/arch/m68k/mac/config.c
+++ b/arch/m68k/mac/config.c
@@@ -26,7 -26,6 +26,7 @@@
  #include <linux/platform_device.h>
  #include <linux/adb.h>
  #include <linux/cuda.h>
 +#include <linux/pmu.h>
  #include <linux/rtc.h>
  
  #include <asm/setup.h>
@@@ -700,7 -699,7 +700,7 @@@ static struct mac_model mac_data_table[
  		.name		= "PowerBook 190",
  		.adb_type	= MAC_ADB_PB2,
  		.via_type	= MAC_VIA_QUADRA,
 -		.scsi_type	= MAC_SCSI_LATE,
 +		.scsi_type	= MAC_SCSI_OLD,
  		.ide_type	= MAC_IDE_BABOON,
  		.scc_type	= MAC_SCC_QUADRA,
  		.floppy_type	= MAC_FLOPPY_SWIM_ADDR2,
@@@ -891,9 -890,6 +891,9 @@@ static void __init mac_identify(void
  #ifdef CONFIG_ADB_CUDA
  	find_via_cuda();
  #endif
 +#ifdef CONFIG_ADB_PMU68K
 +	find_via_pmu();
 +#endif
  }
  
  static void __init mac_report_hardware(void)
@@@ -1065,7 -1061,9 +1065,7 @@@ int __init mac_platform_init(void
  			mac_scsi_old_rsrc, ARRAY_SIZE(mac_scsi_old_rsrc));
  		break;
  	case MAC_SCSI_LATE:
 -		/* PDMA logic in 68040 PowerBooks is somehow different to
 -		 * '030 models. It's probably more like Quadras (see mac_esp).
 -		 */
 +		/* XXX PDMA support for PowerBook 500 series needs testing */
  		platform_device_register_simple("mac_scsi", 0,
  			mac_scsi_late_rsrc, ARRAY_SIZE(mac_scsi_late_rsrc));
  		break;
@@@ -1090,6 -1088,10 +1090,10 @@@
  	    macintosh_config->expansion_type == MAC_EXP_PDS_COMM)
  		platform_device_register_simple("macsonic", -1, NULL, 0);
  
+ 	if (macintosh_config->expansion_type == MAC_EXP_PDS ||
+ 	    macintosh_config->expansion_type == MAC_EXP_PDS_COMM)
+ 		platform_device_register_simple("mac89x0", -1, NULL, 0);
+ 
  	if (macintosh_config->ether_type == MAC_ETHER_MACE)
  		platform_device_register_simple("macmace", -1, NULL, 0);
  
diff --combined drivers/infiniband/core/cma.c
index 8512f633efd6,6ab1059fed66..865d52f6cb2c
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@@ -62,7 -62,6 +62,7 @@@
  #include <rdma/iw_cm.h>
  
  #include "core_priv.h"
 +#include "cma_priv.h"
  
  MODULE_AUTHOR("Sean Hefty");
  MODULE_DESCRIPTION("Generic RDMA CM Agent");
@@@ -328,6 -327,46 +328,6 @@@ struct ib_device *cma_get_ib_dev(struc
   * We do this by disabling removal notification while a callback is in process,
   * and reporting it after the callback completes.
   */
 -struct rdma_id_private {
 -	struct rdma_cm_id	id;
 -
 -	struct rdma_bind_list	*bind_list;
 -	struct hlist_node	node;
 -	struct list_head	list; /* listen_any_list or cma_device.list */
 -	struct list_head	listen_list; /* per device listens */
 -	struct cma_device	*cma_dev;
 -	struct list_head	mc_list;
 -
 -	int			internal_id;
 -	enum rdma_cm_state	state;
 -	spinlock_t		lock;
 -	struct mutex		qp_mutex;
 -
 -	struct completion	comp;
 -	atomic_t		refcount;
 -	struct mutex		handler_mutex;
 -
 -	int			backlog;
 -	int			timeout_ms;
 -	struct ib_sa_query	*query;
 -	int			query_id;
 -	union {
 -		struct ib_cm_id	*ib;
 -		struct iw_cm_id	*iw;
 -	} cm_id;
 -
 -	u32			seq_num;
 -	u32			qkey;
 -	u32			qp_num;
 -	pid_t			owner;
 -	u32			options;
 -	u8			srq;
 -	u8			tos;
 -	bool			tos_set;
 -	u8			reuseaddr;
 -	u8			afonly;
 -	enum ib_gid_type	gid_type;
 -};
  
  struct cma_multicast {
  	struct rdma_id_private *id_priv;
@@@ -466,8 -505,6 +466,8 @@@ static void _cma_attach_to_dev(struct r
  	id_priv->id.route.addr.dev_addr.transport =
  		rdma_node_get_transport(cma_dev->device->node_type);
  	list_add_tail(&id_priv->list, &cma_dev->id_list);
 +	id_priv->res.type = RDMA_RESTRACK_CM_ID;
 +	rdma_restrack_add(&id_priv->res);
  }
  
  static void cma_attach_to_dev(struct rdma_id_private *id_priv,
@@@ -740,10 -777,10 +740,10 @@@ static void cma_deref_id(struct rdma_id
  		complete(&id_priv->comp);
  }
  
 -struct rdma_cm_id *rdma_create_id(struct net *net,
 -				  rdma_cm_event_handler event_handler,
 -				  void *context, enum rdma_port_space ps,
 -				  enum ib_qp_type qp_type)
 +struct rdma_cm_id *__rdma_create_id(struct net *net,
 +				    rdma_cm_event_handler event_handler,
 +				    void *context, enum rdma_port_space ps,
 +				    enum ib_qp_type qp_type, const char *caller)
  {
  	struct rdma_id_private *id_priv;
  
@@@ -751,10 -788,7 +751,10 @@@
  	if (!id_priv)
  		return ERR_PTR(-ENOMEM);
  
 -	id_priv->owner = task_pid_nr(current);
 +	if (caller)
 +		id_priv->res.kern_name = caller;
 +	else
 +		rdma_restrack_set_task(&id_priv->res, current);
  	id_priv->state = RDMA_CM_IDLE;
  	id_priv->id.context = context;
  	id_priv->id.event_handler = event_handler;
@@@ -774,7 -808,7 +774,7 @@@
  
  	return &id_priv->id;
  }
 -EXPORT_SYMBOL(rdma_create_id);
 +EXPORT_SYMBOL(__rdma_create_id);
  
  static int cma_init_ud_qp(struct rdma_id_private *id_priv, struct ib_qp *qp)
  {
@@@ -1300,7 -1334,7 +1300,7 @@@ static bool validate_ipv6_net_dev(struc
  			   IPV6_ADDR_LINKLOCAL;
  	struct rt6_info *rt = rt6_lookup(dev_net(net_dev), &dst_addr->sin6_addr,
  					 &src_addr->sin6_addr, net_dev->ifindex,
- 					 strict);
+ 					 NULL, strict);
  	bool ret;
  
  	if (!rt)
@@@ -1407,12 -1441,21 +1407,12 @@@ static bool cma_match_private_data(stru
  	return true;
  }
  
 -static bool cma_protocol_roce_dev_port(struct ib_device *device, int port_num)
 -{
 -	enum rdma_link_layer ll = rdma_port_get_link_layer(device, port_num);
 -	enum rdma_transport_type transport =
 -		rdma_node_get_transport(device->node_type);
 -
 -	return ll == IB_LINK_LAYER_ETHERNET && transport == RDMA_TRANSPORT_IB;
 -}
 -
  static bool cma_protocol_roce(const struct rdma_cm_id *id)
  {
  	struct ib_device *device = id->device;
  	const int port_num = id->port_num ?: rdma_start_port(device);
  
 -	return cma_protocol_roce_dev_port(device, port_num);
 +	return rdma_protocol_roce(device, port_num);
  }
  
  static bool cma_match_net_dev(const struct rdma_cm_id *id,
@@@ -1425,7 -1468,7 +1425,7 @@@
  		/* This request is an AF_IB request or a RoCE request */
  		return (!id->port_num || id->port_num == port_num) &&
  		       (addr->src_addr.ss_family == AF_IB ||
 -			cma_protocol_roce_dev_port(id->device, port_num));
 +			rdma_protocol_roce(id->device, port_num));
  
  	return !addr->dev_addr.bound_dev_if ||
  	       (net_eq(dev_net(net_dev), addr->dev_addr.net) &&
@@@ -1480,7 -1523,7 +1480,7 @@@ static struct rdma_id_private *cma_id_f
  		if (PTR_ERR(*net_dev) == -EAFNOSUPPORT) {
  			/* Assuming the protocol is AF_IB */
  			*net_dev = NULL;
 -		} else if (cma_protocol_roce_dev_port(req.device, req.port)) {
 +		} else if (rdma_protocol_roce(req.device, req.port)) {
  			/* TODO find the net dev matching the request parameters
  			 * through the RoCE GID table */
  			*net_dev = NULL;
@@@ -1625,7 -1668,6 +1625,7 @@@ void rdma_destroy_id(struct rdma_cm_id 
  	mutex_unlock(&id_priv->handler_mutex);
  
  	if (id_priv->cma_dev) {
 +		rdma_restrack_del(&id_priv->res);
  		if (rdma_cap_ib_cm(id_priv->id.device, 1)) {
  			if (id_priv->cm_id.ib)
  				ib_destroy_cm_id(id_priv->cm_id.ib);
@@@ -1775,7 -1817,6 +1775,7 @@@ static struct rdma_id_private *cma_new_
  					       struct ib_cm_event *ib_event,
  					       struct net_device *net_dev)
  {
 +	struct rdma_id_private *listen_id_priv;
  	struct rdma_id_private *id_priv;
  	struct rdma_cm_id *id;
  	struct rdma_route *rt;
@@@ -1785,11 -1826,9 +1785,11 @@@
  		ib_event->param.req_rcvd.primary_path->service_id;
  	int ret;
  
 -	id = rdma_create_id(listen_id->route.addr.dev_addr.net,
 +	listen_id_priv = container_of(listen_id, struct rdma_id_private, id);
 +	id = __rdma_create_id(listen_id->route.addr.dev_addr.net,
  			    listen_id->event_handler, listen_id->context,
 -			    listen_id->ps, ib_event->param.req_rcvd.qp_type);
 +			    listen_id->ps, ib_event->param.req_rcvd.qp_type,
 +			    listen_id_priv->res.kern_name);
  	if (IS_ERR(id))
  		return NULL;
  
@@@ -1838,17 -1877,14 +1838,17 @@@ static struct rdma_id_private *cma_new_
  					      struct ib_cm_event *ib_event,
  					      struct net_device *net_dev)
  {
 +	struct rdma_id_private *listen_id_priv;
  	struct rdma_id_private *id_priv;
  	struct rdma_cm_id *id;
  	const sa_family_t ss_family = listen_id->route.addr.src_addr.ss_family;
  	struct net *net = listen_id->route.addr.dev_addr.net;
  	int ret;
  
 -	id = rdma_create_id(net, listen_id->event_handler, listen_id->context,
 -			    listen_id->ps, IB_QPT_UD);
 +	listen_id_priv = container_of(listen_id, struct rdma_id_private, id);
 +	id = __rdma_create_id(net, listen_id->event_handler, listen_id->context,
 +			      listen_id->ps, IB_QPT_UD,
 +			      listen_id_priv->res.kern_name);
  	if (IS_ERR(id))
  		return NULL;
  
@@@ -2114,11 -2150,10 +2114,11 @@@ static int iw_conn_req_handler(struct i
  		goto out;
  
  	/* Create a new RDMA id for the new IW CM ID */
 -	new_cm_id = rdma_create_id(listen_id->id.route.addr.dev_addr.net,
 -				   listen_id->id.event_handler,
 -				   listen_id->id.context,
 -				   RDMA_PS_TCP, IB_QPT_RC);
 +	new_cm_id = __rdma_create_id(listen_id->id.route.addr.dev_addr.net,
 +				     listen_id->id.event_handler,
 +				     listen_id->id.context,
 +				     RDMA_PS_TCP, IB_QPT_RC,
 +				     listen_id->res.kern_name);
  	if (IS_ERR(new_cm_id)) {
  		ret = -ENOMEM;
  		goto out;
@@@ -2243,8 -2278,8 +2243,8 @@@ static void cma_listen_on_dev(struct rd
  	if (cma_family(id_priv) == AF_IB && !rdma_cap_ib_cm(cma_dev->device, 1))
  		return;
  
 -	id = rdma_create_id(net, cma_listen_handler, id_priv, id_priv->id.ps,
 -			    id_priv->id.qp_type);
 +	id = __rdma_create_id(net, cma_listen_handler, id_priv, id_priv->id.ps,
 +			      id_priv->id.qp_type, id_priv->res.kern_name);
  	if (IS_ERR(id))
  		return;
  
@@@ -2506,7 -2541,6 +2506,7 @@@ cma_iboe_set_path_rec_l2_fields(struct 
  		gid_type = ib_network_to_gid_type(addr->dev_addr.network);
  	route->path_rec->rec_type = sa_conv_gid_to_pathrec_type(gid_type);
  
 +	route->path_rec->roce.route_resolved = true;
  	sa_path_set_ndev(route->path_rec, addr->dev_addr.net);
  	sa_path_set_ifindex(route->path_rec, ndev->ifindex);
  	sa_path_set_dmac(route->path_rec, addr->dev_addr.dst_dev_addr);
@@@ -3355,10 -3389,8 +3355,10 @@@ int rdma_bind_addr(struct rdma_cm_id *i
  
  	return 0;
  err2:
 -	if (id_priv->cma_dev)
 +	if (id_priv->cma_dev) {
 +		rdma_restrack_del(&id_priv->res);
  		cma_release_dev(id_priv);
 +	}
  err1:
  	cma_comp_exch(id_priv, RDMA_CM_ADDR_BOUND, RDMA_CM_IDLE);
  	return ret;
@@@ -3741,18 -3773,14 +3741,18 @@@ static int cma_send_sidr_rep(struct rdm
  	return ib_send_cm_sidr_rep(id_priv->cm_id.ib, &rep);
  }
  
 -int rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param)
 +int __rdma_accept(struct rdma_cm_id *id, struct rdma_conn_param *conn_param,
 +		  const char *caller)
  {
  	struct rdma_id_private *id_priv;
  	int ret;
  
  	id_priv = container_of(id, struct rdma_id_private, id);
  
 -	id_priv->owner = task_pid_nr(current);
 +	if (caller)
 +		id_priv->res.kern_name = caller;
 +	else
 +		rdma_restrack_set_task(&id_priv->res, current);
  
  	if (!cma_comp(id_priv, RDMA_CM_CONNECT))
  		return -EINVAL;
@@@ -3792,7 -3820,7 +3792,7 @@@ reject
  	rdma_reject(id, NULL, 0);
  	return ret;
  }
 -EXPORT_SYMBOL(rdma_accept);
 +EXPORT_SYMBOL(__rdma_accept);
  
  int rdma_notify(struct rdma_cm_id *id, enum ib_event_type event)
  {
@@@ -3910,14 -3938,10 +3910,14 @@@ static int cma_ib_mc_handler(int status
  			rdma_start_port(id_priv->cma_dev->device)];
  
  		event.event = RDMA_CM_EVENT_MULTICAST_JOIN;
 -		ib_init_ah_from_mcmember(id_priv->id.device,
 -					 id_priv->id.port_num, &multicast->rec,
 -					 ndev, gid_type,
 -					 &event.param.ud.ah_attr);
 +		ret = ib_init_ah_from_mcmember(id_priv->id.device,
 +					       id_priv->id.port_num,
 +					       &multicast->rec,
 +					       ndev, gid_type,
 +					       &event.param.ud.ah_attr);
 +		if (ret)
 +			event.event = RDMA_CM_EVENT_MULTICAST_ERROR;
 +
  		event.param.ud.qp_num = 0xFFFFFF;
  		event.param.ud.qkey = be32_to_cpu(multicast->rec.qkey);
  		if (ndev)
@@@ -4477,7 -4501,7 +4477,7 @@@ static int cma_get_id_stats(struct sk_b
  					  RDMA_NL_RDMA_CM_ATTR_DST_ADDR))
  				goto out;
  
 -			id_stats->pid		= id_priv->owner;
 +			id_stats->pid	= task_pid_vnr(id_priv->res.task);
  			id_stats->port_space	= id->ps;
  			id_stats->cm_state	= id_priv->state;
  			id_stats->qp_num	= id_priv->qp_num;
diff --combined drivers/infiniband/hw/qedr/main.c
index 61aa7c1f2d88,eb32abb0099a..1f032fdbdb19
--- a/drivers/infiniband/hw/qedr/main.c
+++ b/drivers/infiniband/hw/qedr/main.c
@@@ -90,8 -90,8 +90,8 @@@ static struct net_device *qedr_get_netd
  	dev_hold(qdev->ndev);
  
  	/* The HW vendor's device driver must guarantee
- 	 * that this function returns NULL before the net device reaches
- 	 * NETDEV_UNREGISTER_FINAL state.
+ 	 * that this function returns NULL before the net device has finished
+ 	 * NETDEV_UNREGISTER state.
  	 */
  	return qdev->ndev;
  }
@@@ -257,7 -257,6 +257,7 @@@ static int qedr_register_device(struct 
  	dev->ibdev.get_link_layer = qedr_link_layer;
  	dev->ibdev.get_dev_fw_str = qedr_get_dev_fw_str;
  
 +	dev->ibdev.driver_id = RDMA_DRIVER_QEDR;
  	return ib_register_device(&dev->ibdev, NULL);
  }
  
@@@ -834,8 -833,7 +834,8 @@@ static struct qedr_dev *qedr_add(struc
  
  	dev->num_cnq = dev->ops->rdma_get_min_cnq_msix(cdev);
  	if (!dev->num_cnq) {
 -		DP_ERR(dev, "not enough CNQ resources.\n");
 +		DP_ERR(dev, "Failed. At least one CNQ is required.\n");
 +		rc = -ENOMEM;
  		goto init_err;
  	}
  
diff --combined drivers/infiniband/hw/usnic/usnic_ib_main.c
index aed1ca390e30,ca5638091b55..f0538a460328
--- a/drivers/infiniband/hw/usnic/usnic_ib_main.c
+++ b/drivers/infiniband/hw/usnic/usnic_ib_main.c
@@@ -95,24 -95,6 +95,6 @@@ void usnic_ib_log_vf(struct usnic_ib_v
  }
  
  /* Start of netdev section */
- static inline const char *usnic_ib_netdev_event_to_string(unsigned long event)
- {
- 	const char *event2str[] = {"NETDEV_NONE", "NETDEV_UP", "NETDEV_DOWN",
- 		"NETDEV_REBOOT", "NETDEV_CHANGE",
- 		"NETDEV_REGISTER", "NETDEV_UNREGISTER", "NETDEV_CHANGEMTU",
- 		"NETDEV_CHANGEADDR", "NETDEV_GOING_DOWN", "NETDEV_FEAT_CHANGE",
- 		"NETDEV_BONDING_FAILOVER", "NETDEV_PRE_UP",
- 		"NETDEV_PRE_TYPE_CHANGE", "NETDEV_POST_TYPE_CHANGE",
- 		"NETDEV_POST_INT", "NETDEV_UNREGISTER_FINAL", "NETDEV_RELEASE",
- 		"NETDEV_NOTIFY_PEERS", "NETDEV_JOIN"
- 	};
- 
- 	if (event >= ARRAY_SIZE(event2str))
- 		return "UNKNOWN_NETDEV_EVENT";
- 	else
- 		return event2str[event];
- }
- 
  static void usnic_ib_qp_grp_modify_active_to_err(struct usnic_ib_dev *us_ibdev)
  {
  	struct usnic_ib_ucontext *ctx;
@@@ -185,7 -167,7 +167,7 @@@ static void usnic_ib_handle_usdev_event
  			ib_dispatch_event(&ib_event);
  		} else {
  			usnic_dbg("Ignoring %s on %s\n",
- 					usnic_ib_netdev_event_to_string(event),
+ 					netdev_cmd_to_name(event),
  					us_ibdev->ib_dev.name);
  		}
  		break;
@@@ -222,7 -204,7 +204,7 @@@
  		break;
  	default:
  		usnic_dbg("Ignoring event %s on %s",
- 				usnic_ib_netdev_event_to_string(event),
+ 				netdev_cmd_to_name(event),
  				us_ibdev->ib_dev.name);
  	}
  	mutex_unlock(&us_ibdev->usdev_lock);
@@@ -264,7 -246,7 +246,7 @@@ static int usnic_ib_handle_inet_event(s
  	switch (event) {
  	case NETDEV_DOWN:
  		usnic_info("%s via ip notifiers",
- 				usnic_ib_netdev_event_to_string(event));
+ 				netdev_cmd_to_name(event));
  		usnic_fwd_del_ipaddr(us_ibdev->ufdev);
  		usnic_ib_qp_grp_modify_active_to_err(us_ibdev);
  		ib_event.event = IB_EVENT_GID_CHANGE;
@@@ -275,7 -257,7 +257,7 @@@
  	case NETDEV_UP:
  		usnic_fwd_add_ipaddr(us_ibdev->ufdev, ifa->ifa_address);
  		usnic_info("%s via ip notifiers: ip %pI4",
- 				usnic_ib_netdev_event_to_string(event),
+ 				netdev_cmd_to_name(event),
  				&us_ibdev->ufdev->inaddr);
  		ib_event.event = IB_EVENT_GID_CHANGE;
  		ib_event.device = &us_ibdev->ib_dev;
@@@ -284,7 -266,7 +266,7 @@@
  		break;
  	default:
  		usnic_info("Ignoring event %s on %s",
- 				usnic_ib_netdev_event_to_string(event),
+ 				netdev_cmd_to_name(event),
  				us_ibdev->ib_dev.name);
  	}
  	mutex_unlock(&us_ibdev->usdev_lock);
@@@ -433,7 -415,6 +415,7 @@@ static void *usnic_ib_device_add(struc
  	us_ibdev->ib_dev.get_dev_fw_str     = usnic_get_dev_fw_str;
  
  
 +	us_ibdev->ib_dev.driver_id = RDMA_DRIVER_USNIC;
  	if (ib_register_device(&us_ibdev->ib_dev, NULL))
  		goto err_fwd_dealloc;
  
diff --combined drivers/infiniband/hw/usnic/usnic_transport.c
index 2e9bba52a686,67de94343cb4..e0a95538c364
--- a/drivers/infiniband/hw/usnic/usnic_transport.c
+++ b/drivers/infiniband/hw/usnic/usnic_transport.c
@@@ -174,14 -174,13 +174,13 @@@ void usnic_transport_put_socket(struct 
  int usnic_transport_sock_get_addr(struct socket *sock, int *proto,
  					uint32_t *addr, uint16_t *port)
  {
- 	int len;
  	int err;
  	struct sockaddr_in sock_addr;
  
  	err = sock->ops->getname(sock,
  				(struct sockaddr *)&sock_addr,
- 				&len, 0);
- 	if (err)
+ 				0);
+ 	if (err < 0)
  		return err;
  
  	if (sock_addr.sin_family != AF_INET)
@@@ -201,8 -200,10 +200,8 @@@
  int usnic_transport_init(void)
  {
  	roce_bitmap = kzalloc(ROCE_BITMAP_SZ, GFP_KERNEL);
 -	if (!roce_bitmap) {
 -		usnic_err("Failed to allocate bit map");
 +	if (!roce_bitmap)
  		return -ENOMEM;
 -	}
  
  	/* Do not ever allocate bit 0, hence set it here */
  	bitmap_set(roce_bitmap, 0, 1);
diff --combined drivers/net/dsa/mt7530.c
index 4e53c5ce23ff,511ca134f13f..d244c41898dd
--- a/drivers/net/dsa/mt7530.c
+++ b/drivers/net/dsa/mt7530.c
@@@ -604,7 -604,7 +604,7 @@@ mt7530_get_ethtool_stats(struct dsa_swi
  }
  
  static int
- mt7530_get_sset_count(struct dsa_switch *ds)
+ mt7530_get_sset_count(struct dsa_switch *ds, int port)
  {
  	return ARRAY_SIZE(mt7530_mib);
  }
@@@ -1409,7 -1409,6 +1409,7 @@@ static const struct of_device_id mt7530
  	{ .compatible = "mediatek,mt7530" },
  	{ /* sentinel */ },
  };
 +MODULE_DEVICE_TABLE(of, mt7530_of_match);
  
  static struct mdio_driver mt7530_mdio_driver = {
  	.probe  = mt7530_probe,
@@@ -1425,3 -1424,4 +1425,3 @@@ mdio_module_driver(mt7530_mdio_driver)
  MODULE_AUTHOR("Sean Wang <sean.wang at mediatek.com>");
  MODULE_DESCRIPTION("Driver for Mediatek MT7530 Switch");
  MODULE_LICENSE("GPL");
 -MODULE_ALIAS("platform:mediatek-mt7530");
diff --combined drivers/net/ethernet/8390/ne.c
index 4e05953c4fbc,99a2453eb34f..ac99d089ac72
--- a/drivers/net/ethernet/8390/ne.c
+++ b/drivers/net/ethernet/8390/ne.c
@@@ -77,7 -77,7 +77,7 @@@ static u32 ne_msg_enable
  module_param_hw_array(io, int, ioport, NULL, 0);
  module_param_hw_array(irq, int, irq, NULL, 0);
  module_param_array(bad, int, NULL, 0);
- module_param_named(msg_enable, ne_msg_enable, uint, (S_IRUSR|S_IRGRP|S_IROTH));
+ module_param_named(msg_enable, ne_msg_enable, uint, 0444);
  MODULE_PARM_DESC(io, "I/O base address(es),required");
  MODULE_PARM_DESC(irq, "IRQ number(s)");
  MODULE_PARM_DESC(bad, "Accept card(s) with bad signatures");
@@@ -99,7 -99,7 +99,7 @@@ MODULE_LICENSE("GPL")
  that the ne2k probe is the last 8390 based probe to take place (as it
  is at boot) and so the probe will get confused by any other 8390 cards.
  ISA device autoprobes on a running machine are not recommended anyway. */
 -#if !defined(MODULE) && (defined(CONFIG_ISA) || defined(CONFIG_M32R))
 +#if !defined(MODULE) && defined(CONFIG_ISA)
  /* Do we need a portlist for the ISA auto-probe ? */
  #define NEEDS_PORTLIST
  #endif
@@@ -164,7 -164,12 +164,7 @@@ bad_clone_list[] __initdata = 
  #define NESM_START_PG	0x40	/* First page of TX buffer */
  #define NESM_STOP_PG	0x80	/* Last page +1 of RX ring */
  
 -#if defined(CONFIG_PLAT_MAPPI)
 -#  define DCR_VAL 0x4b
 -#elif defined(CONFIG_PLAT_OAKS32R)  || \
 -   defined(CONFIG_MACH_TX49XX)
 -#  define DCR_VAL 0x48		/* 8-bit mode */
 -#elif defined(CONFIG_ATARI)	/* 8-bit mode on Atari, normal on Q40 */
 +#if defined(CONFIG_ATARI)	/* 8-bit mode on Atari, normal on Q40 */
  #  define DCR_VAL (MACH_IS_ATARI ? 0x48 : 0x49)
  #else
  #  define DCR_VAL 0x49
@@@ -417,7 -422,12 +417,7 @@@ static int __init ne_probe1(struct net_
  		stop_page  = NE1SM_STOP_PG;
  	}
  
 -#if  defined(CONFIG_PLAT_MAPPI) || defined(CONFIG_PLAT_OAKS32R)
 -	neX000 = ((SA_prom[14] == 0x57  &&  SA_prom[15] == 0x57)
 -		|| (SA_prom[14] == 0x42 && SA_prom[15] == 0x42));
 -#else
  	neX000 = (SA_prom[14] == 0x57  &&  SA_prom[15] == 0x57);
 -#endif
  	ctron =  (SA_prom[0] == 0x00 && SA_prom[1] == 0x00 && SA_prom[2] == 0x1d);
  	copam =  (SA_prom[14] == 0x49 && SA_prom[15] == 0x00);
  
@@@ -475,7 -485,7 +475,7 @@@
  		mdelay(10);		/* wait 10ms for interrupt to propagate */
  		outb_p(0x00, ioaddr + EN0_IMR); 		/* Mask it again. */
  		dev->irq = probe_irq_off(cookie);
- 		if (netif_msg_probe(ei_local))
+ 		if (ne_msg_enable & NETIF_MSG_PROBE)
  			pr_cont(" autoirq is %d", dev->irq);
  	} else if (dev->irq == 2)
  		/* Fixup for users that don't know that IRQ 2 is really IRQ 9,
@@@ -498,9 -508,18 +498,9 @@@
  
  	dev->base_addr = ioaddr;
  
 -#ifdef CONFIG_PLAT_MAPPI
 -	outb_p(E8390_NODMA + E8390_PAGE1 + E8390_STOP,
 -		ioaddr + E8390_CMD); /* 0x61 */
 -	for (i = 0; i < ETH_ALEN; i++) {
 -		dev->dev_addr[i] = SA_prom[i]
 -			= inb_p(ioaddr + EN1_PHYS_SHIFT(i));
 -	}
 -#else
  	for (i = 0; i < ETH_ALEN; i++) {
  		dev->dev_addr[i] = SA_prom[i];
  	}
 -#endif
  
  	pr_cont("%pM\n", dev->dev_addr);
  
diff --combined drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
index f3302edba8b4,9a7a2f05ab35..a30a2e95d13f
--- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c
@@@ -199,6 -199,10 +199,10 @@@ static const char main_strings[][ETH_GS
  	"rx_xdp_drop",
  	"rx_xdp_tx",
  	"rx_xdp_tx_full",
+ 
+ 	/* phy statistics */
+ 	"rx_packets_phy", "rx_bytes_phy",
+ 	"tx_packets_phy", "tx_bytes_phy",
  };
  
  static const char mlx4_en_test_names[][ETH_GSTRING_LEN]= {
@@@ -411,6 -415,10 +415,10 @@@ static void mlx4_en_get_ethtool_stats(s
  		if (bitmap_iterator_test(&it))
  			data[index++] = ((unsigned long *)&priv->xdp_stats)[i];
  
+ 	for (i = 0; i < NUM_PHY_STATS; i++, bitmap_iterator_inc(&it))
+ 		if (bitmap_iterator_test(&it))
+ 			data[index++] = ((unsigned long *)&priv->phy_stats)[i];
+ 
  	for (i = 0; i < priv->tx_ring_num[TX]; i++) {
  		data[index++] = priv->tx_ring[TX][i]->packets;
  		data[index++] = priv->tx_ring[TX][i]->bytes;
@@@ -490,6 -498,12 +498,12 @@@ static void mlx4_en_get_strings(struct 
  				strcpy(data + (index++) * ETH_GSTRING_LEN,
  				       main_strings[strings]);
  
+ 		for (i = 0; i < NUM_PHY_STATS; i++, strings++,
+ 		     bitmap_iterator_inc(&it))
+ 			if (bitmap_iterator_test(&it))
+ 				strcpy(data + (index++) * ETH_GSTRING_LEN,
+ 				       main_strings[strings]);
+ 
  		for (i = 0; i < priv->tx_ring_num[TX]; i++) {
  			sprintf(data + (index++) * ETH_GSTRING_LEN,
  				"tx%d_packets", i);
@@@ -1046,32 -1060,27 +1060,32 @@@ static int mlx4_en_set_pauseparam(struc
  {
  	struct mlx4_en_priv *priv = netdev_priv(dev);
  	struct mlx4_en_dev *mdev = priv->mdev;
 +	u8 tx_pause, tx_ppp, rx_pause, rx_ppp;
  	int err;
  
  	if (pause->autoneg)
  		return -EINVAL;
  
 -	priv->prof->tx_pause = pause->tx_pause != 0;
 -	priv->prof->rx_pause = pause->rx_pause != 0;
 +	tx_pause = !!(pause->tx_pause);
 +	rx_pause = !!(pause->rx_pause);
 +	rx_ppp = priv->prof->rx_ppp && !(tx_pause || rx_pause);
 +	tx_ppp = priv->prof->tx_ppp && !(tx_pause || rx_pause);
 +
  	err = mlx4_SET_PORT_general(mdev->dev, priv->port,
  				    priv->rx_skb_size + ETH_FCS_LEN,
 -				    priv->prof->tx_pause,
 -				    priv->prof->tx_ppp,
 -				    priv->prof->rx_pause,
 -				    priv->prof->rx_ppp);
 -	if (err)
 -		en_err(priv, "Failed setting pause params\n");
 -	else
 -		mlx4_en_update_pfc_stats_bitmap(mdev->dev, &priv->stats_bitmap,
 -						priv->prof->rx_ppp,
 -						priv->prof->rx_pause,
 -						priv->prof->tx_ppp,
 -						priv->prof->tx_pause);
 +				    tx_pause, tx_ppp, rx_pause, rx_ppp);
 +	if (err) {
 +		en_err(priv, "Failed setting pause params, err = %d\n", err);
 +		return err;
 +	}
 +
 +	mlx4_en_update_pfc_stats_bitmap(mdev->dev, &priv->stats_bitmap,
 +					rx_ppp, rx_pause, tx_ppp, tx_pause);
 +
 +	priv->prof->tx_pause = tx_pause;
 +	priv->prof->rx_pause = rx_pause;
 +	priv->prof->tx_ppp = tx_ppp;
 +	priv->prof->rx_ppp = rx_ppp;
  
  	return err;
  }
diff --combined drivers/net/ethernet/mellanox/mlx4/main.c
index 958619ff24ae,5a26851b4ffd..5af50191c181
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@@ -46,7 -46,6 +46,7 @@@
  #include <linux/etherdevice.h>
  #include <net/devlink.h>
  
 +#include <uapi/rdma/mlx4-abi.h>
  #include <linux/mlx4/device.h>
  #include <linux/mlx4/doorbell.h>
  
@@@ -2994,10 -2993,10 +2994,10 @@@ static int mlx4_init_port_info(struct m
  
  	sprintf(info->dev_name, "mlx4_port%d", port);
  	info->port_attr.attr.name = info->dev_name;
- 	if (mlx4_is_mfunc(dev))
- 		info->port_attr.attr.mode = S_IRUGO;
- 	else {
- 		info->port_attr.attr.mode = S_IRUGO | S_IWUSR;
+ 	if (mlx4_is_mfunc(dev)) {
+ 		info->port_attr.attr.mode = 0444;
+ 	} else {
+ 		info->port_attr.attr.mode = 0644;
  		info->port_attr.store     = set_port_type;
  	}
  	info->port_attr.show      = show_port_type;
@@@ -3012,10 -3011,10 +3012,10 @@@
  
  	sprintf(info->dev_mtu_name, "mlx4_port%d_mtu", port);
  	info->port_mtu_attr.attr.name = info->dev_mtu_name;
- 	if (mlx4_is_mfunc(dev))
- 		info->port_mtu_attr.attr.mode = S_IRUGO;
- 	else {
- 		info->port_mtu_attr.attr.mode = S_IRUGO | S_IWUSR;
+ 	if (mlx4_is_mfunc(dev)) {
+ 		info->port_mtu_attr.attr.mode = 0444;
+ 	} else {
+ 		info->port_mtu_attr.attr.mode = 0644;
  		info->port_mtu_attr.store     = set_port_ib_mtu;
  	}
  	info->port_mtu_attr.show      = show_port_ib_mtu;
diff --combined drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
index 59ebfdae6695,d415e67b557b..869778b39175
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
@@@ -203,9 -203,6 +203,6 @@@ void mlx5e_ethtool_get_ethtool_stats(st
  {
  	int i, idx = 0;
  
- 	if (!data)
- 		return;
- 
  	mutex_lock(&priv->state_lock);
  	mlx5e_update_stats(priv);
  	mutex_unlock(&priv->state_lock);
@@@ -477,9 -474,6 +474,9 @@@ static int mlx5e_get_coalesce(struct ne
  	return mlx5e_ethtool_get_coalesce(priv, coal);
  }
  
 +#define MLX5E_MAX_COAL_TIME		MLX5_MAX_CQ_PERIOD
 +#define MLX5E_MAX_COAL_FRAMES		MLX5_MAX_CQ_COUNT
 +
  static void
  mlx5e_set_priv_channels_coalesce(struct mlx5e_priv *priv, struct ethtool_coalesce *coal)
  {
@@@ -514,20 -508,6 +511,20 @@@ int mlx5e_ethtool_set_coalesce(struct m
  	if (!MLX5_CAP_GEN(mdev, cq_moderation))
  		return -EOPNOTSUPP;
  
 +	if (coal->tx_coalesce_usecs > MLX5E_MAX_COAL_TIME ||
 +	    coal->rx_coalesce_usecs > MLX5E_MAX_COAL_TIME) {
 +		netdev_info(priv->netdev, "%s: maximum coalesce time supported is %lu usecs\n",
 +			    __func__, MLX5E_MAX_COAL_TIME);
 +		return -ERANGE;
 +	}
 +
 +	if (coal->tx_max_coalesced_frames > MLX5E_MAX_COAL_FRAMES ||
 +	    coal->rx_max_coalesced_frames > MLX5E_MAX_COAL_FRAMES) {
 +		netdev_info(priv->netdev, "%s: maximum coalesced frames supported is %lu\n",
 +			    __func__, MLX5E_MAX_COAL_FRAMES);
 +		return -ERANGE;
 +	}
 +
  	mutex_lock(&priv->state_lock);
  	new_channels.params = priv->channels.params;
  
@@@ -1083,6 -1063,57 +1080,57 @@@ static int mlx5e_get_rxnfc(struct net_d
  	return err;
  }
  
+ #define MLX5E_PFC_PREVEN_AUTO_TOUT_MSEC		100
+ #define MLX5E_PFC_PREVEN_TOUT_MAX_MSEC		8000
+ #define MLX5E_PFC_PREVEN_MINOR_PRECENT		85
+ #define MLX5E_PFC_PREVEN_TOUT_MIN_MSEC		80
+ #define MLX5E_DEVICE_STALL_MINOR_WATERMARK(critical_tout) \
+ 	max_t(u16, MLX5E_PFC_PREVEN_TOUT_MIN_MSEC, \
+ 	      (critical_tout * MLX5E_PFC_PREVEN_MINOR_PRECENT) / 100)
+ 
+ static int mlx5e_get_pfc_prevention_tout(struct net_device *netdev,
+ 					 u16 *pfc_prevention_tout)
+ {
+ 	struct mlx5e_priv *priv    = netdev_priv(netdev);
+ 	struct mlx5_core_dev *mdev = priv->mdev;
+ 
+ 	if (!MLX5_CAP_PCAM_FEATURE((priv)->mdev, pfcc_mask) ||
+ 	    !MLX5_CAP_DEBUG((priv)->mdev, stall_detect))
+ 		return -EOPNOTSUPP;
+ 
+ 	return mlx5_query_port_stall_watermark(mdev, pfc_prevention_tout, NULL);
+ }
+ 
+ static int mlx5e_set_pfc_prevention_tout(struct net_device *netdev,
+ 					 u16 pfc_preven)
+ {
+ 	struct mlx5e_priv *priv = netdev_priv(netdev);
+ 	struct mlx5_core_dev *mdev = priv->mdev;
+ 	u16 critical_tout;
+ 	u16 minor;
+ 
+ 	if (!MLX5_CAP_PCAM_FEATURE((priv)->mdev, pfcc_mask) ||
+ 	    !MLX5_CAP_DEBUG((priv)->mdev, stall_detect))
+ 		return -EOPNOTSUPP;
+ 
+ 	critical_tout = (pfc_preven == PFC_STORM_PREVENTION_AUTO) ?
+ 			MLX5E_PFC_PREVEN_AUTO_TOUT_MSEC :
+ 			pfc_preven;
+ 
+ 	if (critical_tout != PFC_STORM_PREVENTION_DISABLE &&
+ 	    (critical_tout > MLX5E_PFC_PREVEN_TOUT_MAX_MSEC ||
+ 	     critical_tout < MLX5E_PFC_PREVEN_TOUT_MIN_MSEC)) {
+ 		netdev_info(netdev, "%s: pfc prevention tout not in range (%d-%d)\n",
+ 			    __func__, MLX5E_PFC_PREVEN_TOUT_MIN_MSEC,
+ 			    MLX5E_PFC_PREVEN_TOUT_MAX_MSEC);
+ 		return -EINVAL;
+ 	}
+ 
+ 	minor = MLX5E_DEVICE_STALL_MINOR_WATERMARK(critical_tout);
+ 	return mlx5_set_port_stall_watermark(mdev, critical_tout,
+ 					     minor);
+ }
+ 
  static int mlx5e_get_tunable(struct net_device *dev,
  			     const struct ethtool_tunable *tuna,
  			     void *data)
@@@ -1094,6 -1125,9 +1142,9 @@@
  	case ETHTOOL_TX_COPYBREAK:
  		*(u32 *)data = priv->channels.params.tx_max_inline;
  		break;
+ 	case ETHTOOL_PFC_PREVENTION_TOUT:
+ 		err = mlx5e_get_pfc_prevention_tout(dev, data);
+ 		break;
  	default:
  		err = -EINVAL;
  		break;
@@@ -1136,6 -1170,9 +1187,9 @@@ static int mlx5e_set_tunable(struct net
  		mlx5e_switch_priv_channels(priv, &new_channels, NULL);
  
  		break;
+ 	case ETHTOOL_PFC_PREVENTION_TOUT:
+ 		err = mlx5e_set_pfc_prevention_tout(dev, *(u16 *)data);
+ 		break;
  	default:
  		err = -EINVAL;
  		break;
diff --combined drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index dc10f61cc0f2,1d36d7569f44..ee101d91cb79
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@@ -615,8 -615,7 +615,7 @@@ static int mlx5e_create_rq(struct mlx5e
  static int mlx5e_modify_rq_state(struct mlx5e_rq *rq, int curr_state,
  				 int next_state)
  {
- 	struct mlx5e_channel *c = rq->channel;
- 	struct mlx5_core_dev *mdev = c->mdev;
+ 	struct mlx5_core_dev *mdev = rq->mdev;
  
  	void *in;
  	void *rqc;
@@@ -1195,13 -1194,10 +1194,13 @@@ static void mlx5e_close_txqsq(struct ml
  {
  	struct mlx5e_channel *c = sq->channel;
  	struct mlx5_core_dev *mdev = c->mdev;
 +	struct mlx5_rate_limit rl = {0};
  
  	mlx5e_destroy_sq(mdev, sq->sqn);
 -	if (sq->rate_limit)
 -		mlx5_rl_remove_rate(mdev, sq->rate_limit);
 +	if (sq->rate_limit) {
 +		rl.rate = sq->rate_limit;
 +		mlx5_rl_remove_rate(mdev, &rl);
 +	}
  	mlx5e_free_txqsq_descs(sq);
  	mlx5e_free_txqsq(sq);
  }
@@@ -1531,7 -1527,6 +1530,7 @@@ static int mlx5e_set_sq_maxrate(struct 
  	struct mlx5e_priv *priv = netdev_priv(dev);
  	struct mlx5_core_dev *mdev = priv->mdev;
  	struct mlx5e_modify_sq_param msp = {0};
 +	struct mlx5_rate_limit rl = {0};
  	u16 rl_index = 0;
  	int err;
  
@@@ -1539,17 -1534,14 +1538,17 @@@
  		/* nothing to do */
  		return 0;
  
 -	if (sq->rate_limit)
 +	if (sq->rate_limit) {
 +		rl.rate = sq->rate_limit;
  		/* remove current rl index to free space to next ones */
 -		mlx5_rl_remove_rate(mdev, sq->rate_limit);
 +		mlx5_rl_remove_rate(mdev, &rl);
 +	}
  
  	sq->rate_limit = 0;
  
  	if (rate) {
 -		err = mlx5_rl_add_rate(mdev, rate, &rl_index);
 +		rl.rate = rate;
 +		err = mlx5_rl_add_rate(mdev, &rl_index, &rl);
  		if (err) {
  			netdev_err(dev, "Failed configuring rate %u: %d\n",
  				   rate, err);
@@@ -1567,7 -1559,7 +1566,7 @@@
  			   rate, err);
  		/* remove the rate from the table */
  		if (rate)
 -			mlx5_rl_remove_rate(mdev, rate);
 +			mlx5_rl_remove_rate(mdev, &rl);
  		return err;
  	}
  
@@@ -1775,14 -1767,16 +1774,16 @@@ static void mlx5e_build_rq_param(struc
  	param->wq.linear = 1;
  }
  
- static void mlx5e_build_drop_rq_param(struct mlx5_core_dev *mdev,
+ static void mlx5e_build_drop_rq_param(struct mlx5e_priv *priv,
  				      struct mlx5e_rq_param *param)
  {
+ 	struct mlx5_core_dev *mdev = priv->mdev;
  	void *rqc = param->rqc;
  	void *wq = MLX5_ADDR_OF(rqc, rqc, wq);
  
  	MLX5_SET(wq, wq, wq_type, MLX5_WQ_TYPE_LINKED_LIST);
  	MLX5_SET(wq, wq, log_wq_stride,    ilog2(sizeof(struct mlx5e_rx_wqe)));
+ 	MLX5_SET(rqc, rqc, counter_set_id, priv->drop_rq_q_counter);
  
  	param->wq.buf_numa_node = dev_to_node(&mdev->pdev->dev);
  }
@@@ -2579,9 -2573,6 +2580,9 @@@ int mlx5e_open(struct net_device *netde
  		mlx5_set_port_admin_status(priv->mdev, MLX5_PORT_UP);
  	mutex_unlock(&priv->state_lock);
  
 +	if (mlx5e_vxlan_allowed(priv->mdev))
 +		udp_tunnel_get_rx_info(netdev);
 +
  	return err;
  }
  
@@@ -2653,15 -2644,16 +2654,16 @@@ static int mlx5e_alloc_drop_cq(struct m
  	return mlx5e_alloc_cq_common(mdev, param, cq);
  }
  
- static int mlx5e_open_drop_rq(struct mlx5_core_dev *mdev,
+ static int mlx5e_open_drop_rq(struct mlx5e_priv *priv,
  			      struct mlx5e_rq *drop_rq)
  {
+ 	struct mlx5_core_dev *mdev = priv->mdev;
  	struct mlx5e_cq_param cq_param = {};
  	struct mlx5e_rq_param rq_param = {};
  	struct mlx5e_cq *cq = &drop_rq->cq;
  	int err;
  
- 	mlx5e_build_drop_rq_param(mdev, &rq_param);
+ 	mlx5e_build_drop_rq_param(priv, &rq_param);
  
  	err = mlx5e_alloc_drop_cq(mdev, cq, &cq_param);
  	if (err)
@@@ -2679,6 -2671,10 +2681,10 @@@
  	if (err)
  		goto err_free_rq;
  
+ 	err = mlx5e_modify_rq_state(drop_rq, MLX5_RQC_STATE_RST, MLX5_RQC_STATE_RDY);
+ 	if (err)
+ 		mlx5_core_warn(priv->mdev, "modify_rq_state failed, rx_if_down_packets won't be counted %d\n", err);
+ 
  	return 0;
  
  err_free_rq:
@@@ -3246,24 -3242,20 +3252,20 @@@ static int mlx5e_set_features(struct ne
  			      netdev_features_t features)
  {
  	netdev_features_t oper_features = netdev->features;
- 	int err;
+ 	int err = 0;
  
- 	err  = mlx5e_handle_feature(netdev, &oper_features, features,
- 				    NETIF_F_LRO, set_feature_lro);
- 	err |= mlx5e_handle_feature(netdev, &oper_features, features,
- 				    NETIF_F_HW_VLAN_CTAG_FILTER,
+ #define MLX5E_HANDLE_FEATURE(feature, handler) \
+ 	mlx5e_handle_feature(netdev, &oper_features, features, feature, handler)
+ 
+ 	err |= MLX5E_HANDLE_FEATURE(NETIF_F_LRO, set_feature_lro);
+ 	err |= MLX5E_HANDLE_FEATURE(NETIF_F_HW_VLAN_CTAG_FILTER,
  				    set_feature_cvlan_filter);
- 	err |= mlx5e_handle_feature(netdev, &oper_features, features,
- 				    NETIF_F_HW_TC, set_feature_tc_num_filters);
- 	err |= mlx5e_handle_feature(netdev, &oper_features, features,
- 				    NETIF_F_RXALL, set_feature_rx_all);
- 	err |= mlx5e_handle_feature(netdev, &oper_features, features,
- 				    NETIF_F_RXFCS, set_feature_rx_fcs);
- 	err |= mlx5e_handle_feature(netdev, &oper_features, features,
- 				    NETIF_F_HW_VLAN_CTAG_RX, set_feature_rx_vlan);
+ 	err |= MLX5E_HANDLE_FEATURE(NETIF_F_HW_TC, set_feature_tc_num_filters);
+ 	err |= MLX5E_HANDLE_FEATURE(NETIF_F_RXALL, set_feature_rx_all);
+ 	err |= MLX5E_HANDLE_FEATURE(NETIF_F_RXFCS, set_feature_rx_fcs);
+ 	err |= MLX5E_HANDLE_FEATURE(NETIF_F_HW_VLAN_CTAG_RX, set_feature_rx_vlan);
  #ifdef CONFIG_RFS_ACCEL
- 	err |= mlx5e_handle_feature(netdev, &oper_features, features,
- 				    NETIF_F_NTUPLE, set_feature_arfs);
+ 	err |= MLX5E_HANDLE_FEATURE(NETIF_F_NTUPLE, set_feature_arfs);
  #endif
  
  	if (err) {
@@@ -3971,7 -3963,7 +3973,7 @@@ void mlx5e_set_rx_cq_mode_params(struc
  				MLX5_CQ_PERIOD_MODE_START_FROM_CQE);
  }
  
- u32 mlx5e_choose_lro_timeout(struct mlx5_core_dev *mdev, u32 wanted_timeout)
+ static u32 mlx5e_choose_lro_timeout(struct mlx5_core_dev *mdev, u32 wanted_timeout)
  {
  	int i;
  
@@@ -4079,7 -4071,7 +4081,7 @@@ static void mlx5e_set_netdev_dev_addr(s
  	}
  }
  
 -#if IS_ENABLED(CONFIG_NET_SWITCHDEV) && IS_ENABLED(CONFIG_MLX5_ESWITCH)
 +#if IS_ENABLED(CONFIG_MLX5_ESWITCH)
  static const struct switchdev_ops mlx5e_switchdev_ops = {
  	.switchdev_port_attr_get	= mlx5e_attr_get,
  };
@@@ -4114,6 -4106,9 +4116,9 @@@ static void mlx5e_build_nic_netdev(stru
  	netdev->vlan_features    |= NETIF_F_RXCSUM;
  	netdev->vlan_features    |= NETIF_F_RXHASH;
  
+ 	netdev->hw_enc_features  |= NETIF_F_HW_VLAN_CTAG_TX;
+ 	netdev->hw_enc_features  |= NETIF_F_HW_VLAN_CTAG_RX;
+ 
  	if (!!MLX5_CAP_ETH(mdev, lro_cap))
  		netdev->vlan_features    |= NETIF_F_LRO;
  
@@@ -4185,7 -4180,7 +4190,7 @@@
  
  	mlx5e_set_netdev_dev_addr(netdev);
  
 -#if IS_ENABLED(CONFIG_NET_SWITCHDEV) && IS_ENABLED(CONFIG_MLX5_ESWITCH)
 +#if IS_ENABLED(CONFIG_MLX5_ESWITCH)
  	if (MLX5_VPORT_MANAGER(mdev))
  		netdev->switchdev_ops = &mlx5e_switchdev_ops;
  #endif
@@@ -4193,7 -4188,7 +4198,7 @@@
  	mlx5e_ipsec_build_netdev(priv);
  }
  
- static void mlx5e_create_q_counter(struct mlx5e_priv *priv)
+ static void mlx5e_create_q_counters(struct mlx5e_priv *priv)
  {
  	struct mlx5_core_dev *mdev = priv->mdev;
  	int err;
@@@ -4203,14 -4198,21 +4208,21 @@@
  		mlx5_core_warn(mdev, "alloc queue counter failed, %d\n", err);
  		priv->q_counter = 0;
  	}
+ 
+ 	err = mlx5_core_alloc_q_counter(mdev, &priv->drop_rq_q_counter);
+ 	if (err) {
+ 		mlx5_core_warn(mdev, "alloc drop RQ counter failed, %d\n", err);
+ 		priv->drop_rq_q_counter = 0;
+ 	}
  }
  
- static void mlx5e_destroy_q_counter(struct mlx5e_priv *priv)
+ static void mlx5e_destroy_q_counters(struct mlx5e_priv *priv)
  {
- 	if (!priv->q_counter)
- 		return;
+ 	if (priv->q_counter)
+ 		mlx5_core_dealloc_q_counter(priv->mdev, priv->q_counter);
  
- 	mlx5_core_dealloc_q_counter(priv->mdev, priv->q_counter);
+ 	if (priv->drop_rq_q_counter)
+ 		mlx5_core_dealloc_q_counter(priv->mdev, priv->drop_rq_q_counter);
  }
  
  static void mlx5e_nic_init(struct mlx5_core_dev *mdev,
@@@ -4337,6 -4339,12 +4349,6 @@@ static void mlx5e_nic_enable(struct mlx
  #ifdef CONFIG_MLX5_CORE_EN_DCB
  	mlx5e_dcbnl_init_app(priv);
  #endif
 -	/* Device already registered: sync netdev system state */
 -	if (mlx5e_vxlan_allowed(mdev)) {
 -		rtnl_lock();
 -		udp_tunnel_get_rx_info(netdev);
 -		rtnl_unlock();
 -	}
  
  	queue_work(priv->wq, &priv->set_rx_mode_work);
  
@@@ -4443,18 -4451,18 +4455,18 @@@ int mlx5e_attach_netdev(struct mlx5e_pr
  	if (err)
  		goto out;
  
- 	err = mlx5e_open_drop_rq(mdev, &priv->drop_rq);
+ 	mlx5e_create_q_counters(priv);
+ 
+ 	err = mlx5e_open_drop_rq(priv, &priv->drop_rq);
  	if (err) {
  		mlx5_core_err(mdev, "open drop rq failed, %d\n", err);
- 		goto err_cleanup_tx;
+ 		goto err_destroy_q_counters;
  	}
  
  	err = profile->init_rx(priv);
  	if (err)
  		goto err_close_drop_rq;
  
- 	mlx5e_create_q_counter(priv);
- 
  	if (profile->enable)
  		profile->enable(priv);
  
@@@ -4463,7 -4471,8 +4475,8 @@@
  err_close_drop_rq:
  	mlx5e_close_drop_rq(&priv->drop_rq);
  
- err_cleanup_tx:
+ err_destroy_q_counters:
+ 	mlx5e_destroy_q_counters(priv);
  	profile->cleanup_tx(priv);
  
  out:
@@@ -4480,9 -4489,9 +4493,9 @@@ void mlx5e_detach_netdev(struct mlx5e_p
  		profile->disable(priv);
  	flush_workqueue(priv->wq);
  
- 	mlx5e_destroy_q_counter(priv);
  	profile->cleanup_rx(priv);
  	mlx5e_close_drop_rq(&priv->drop_rq);
+ 	mlx5e_destroy_q_counters(priv);
  	profile->cleanup_tx(priv);
  	cancel_delayed_work_sync(&priv->update_stats_work);
  }
diff --combined drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
index d83f377986ab,3e4a7e81b67f..4197001f9801
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
@@@ -964,7 -964,7 +964,7 @@@ void mlx5e_tc_update_neigh_used_value(s
  		tbl = &arp_tbl;
  #if IS_ENABLED(CONFIG_IPV6)
  	else if (m_neigh->family == AF_INET6)
 -		tbl = ipv6_stub->nd_tbl;
 +		tbl = &nd_tbl;
  #endif
  	else
  		return;
@@@ -2530,12 -2530,17 +2530,17 @@@ static int parse_tc_fdb_actions(struct 
  			if (tcf_vlan_action(a) == TCA_VLAN_ACT_POP) {
  				attr->action |= MLX5_FLOW_CONTEXT_ACTION_VLAN_POP;
  			} else if (tcf_vlan_action(a) == TCA_VLAN_ACT_PUSH) {
- 				if (tcf_vlan_push_proto(a) != htons(ETH_P_8021Q) ||
- 				    tcf_vlan_push_prio(a))
- 					return -EOPNOTSUPP;
- 
  				attr->action |= MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH;
- 				attr->vlan = tcf_vlan_push_vid(a);
+ 				attr->vlan_vid = tcf_vlan_push_vid(a);
+ 				if (mlx5_eswitch_vlan_actions_supported(priv->mdev)) {
+ 					attr->vlan_prio = tcf_vlan_push_prio(a);
+ 					attr->vlan_proto = tcf_vlan_push_proto(a);
+ 					if (!attr->vlan_proto)
+ 						attr->vlan_proto = htons(ETH_P_8021Q);
+ 				} else if (tcf_vlan_push_proto(a) != htons(ETH_P_8021Q) ||
+ 					   tcf_vlan_push_prio(a)) {
+ 					return -EOPNOTSUPP;
+ 				}
  			} else { /* action is TCA_VLAN_ACT_MODIFY */
  				return -EOPNOTSUPP;
  			}
@@@ -2609,19 -2614,19 +2614,19 @@@ int mlx5e_configure_flower(struct mlx5e
  	if (err != -EAGAIN)
  		flow->flags |= MLX5E_TC_FLOW_OFFLOADED;
  
 +	if (!(flow->flags & MLX5E_TC_FLOW_ESWITCH) ||
 +	    !(flow->esw_attr->action & MLX5_FLOW_CONTEXT_ACTION_ENCAP))
 +		kvfree(parse_attr);
 +
  	err = rhashtable_insert_fast(&tc->ht, &flow->node,
  				     tc->ht_params);
 -	if (err)
 -		goto err_del_rule;
 +	if (err) {
 +		mlx5e_tc_del_flow(priv, flow);
 +		kfree(flow);
 +	}
  
 -	if (flow->flags & MLX5E_TC_FLOW_ESWITCH &&
 -	    !(flow->esw_attr->action & MLX5_FLOW_CONTEXT_ACTION_ENCAP))
 -		kvfree(parse_attr);
  	return err;
  
 -err_del_rule:
 -	mlx5e_tc_del_flow(priv, flow);
 -
  err_free:
  	kvfree(parse_attr);
  	kfree(flow);
diff --combined drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index 997e24dcb053,a9ccd974c620..1904c0323d39
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@@ -1,10 -1,10 +1,10 @@@
  /*
   * drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
-  * Copyright (c) 2016-2017 Mellanox Technologies. All rights reserved.
+  * Copyright (c) 2016-2018 Mellanox Technologies. All rights reserved.
   * Copyright (c) 2016 Jiri Pirko <jiri at mellanox.com>
   * Copyright (c) 2016 Ido Schimmel <idosch at mellanox.com>
   * Copyright (c) 2016 Yotam Gigi <yotamg at mellanox.com>
-  * Copyright (c) 2017 Petr Machata <petrm at mellanox.com>
+  * Copyright (c) 2017-2018 Petr Machata <petrm at mellanox.com>
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions are met:
@@@ -70,6 -70,7 +70,7 @@@
  #include "spectrum_mr.h"
  #include "spectrum_mr_tcam.h"
  #include "spectrum_router.h"
+ #include "spectrum_span.h"
  
  struct mlxsw_sp_fib;
  struct mlxsw_sp_vr;
@@@ -466,7 -467,7 +467,7 @@@ struct mlxsw_sp_vr 
  	unsigned int rif_count;
  	struct mlxsw_sp_fib *fib4;
  	struct mlxsw_sp_fib *fib6;
- 	struct mlxsw_sp_mr_table *mr4_table;
+ 	struct mlxsw_sp_mr_table *mr_table[MLXSW_SP_L3_PROTO_MAX];
  };
  
  static const struct rhashtable_params mlxsw_sp_fib_ht_params;
@@@ -710,7 -711,9 +711,9 @@@ static void mlxsw_sp_lpm_fini(struct ml
  
  static bool mlxsw_sp_vr_is_used(const struct mlxsw_sp_vr *vr)
  {
- 	return !!vr->fib4 || !!vr->fib6 || !!vr->mr4_table;
+ 	return !!vr->fib4 || !!vr->fib6 ||
+ 	       !!vr->mr_table[MLXSW_SP_L3_PROTO_IPV4] ||
+ 	       !!vr->mr_table[MLXSW_SP_L3_PROTO_IPV6];
  }
  
  static struct mlxsw_sp_vr *mlxsw_sp_vr_find_unused(struct mlxsw_sp *mlxsw_sp)
@@@ -788,7 -791,7 +791,7 @@@ static struct mlxsw_sp_vr *mlxsw_sp_vr_
  					      u32 tb_id,
  					      struct netlink_ext_ack *extack)
  {
- 	struct mlxsw_sp_mr_table *mr4_table;
+ 	struct mlxsw_sp_mr_table *mr4_table, *mr6_table;
  	struct mlxsw_sp_fib *fib4;
  	struct mlxsw_sp_fib *fib6;
  	struct mlxsw_sp_vr *vr;
@@@ -796,7 -799,7 +799,7 @@@
  
  	vr = mlxsw_sp_vr_find_unused(mlxsw_sp);
  	if (!vr) {
- 		NL_SET_ERR_MSG(extack, "spectrum: Exceeded number of supported virtual routers");
+ 		NL_SET_ERR_MSG_MOD(extack, "Exceeded number of supported virtual routers");
  		return ERR_PTR(-EBUSY);
  	}
  	fib4 = mlxsw_sp_fib_create(mlxsw_sp, vr, MLXSW_SP_L3_PROTO_IPV4);
@@@ -811,15 -814,25 +814,25 @@@
  					     MLXSW_SP_L3_PROTO_IPV4);
  	if (IS_ERR(mr4_table)) {
  		err = PTR_ERR(mr4_table);
- 		goto err_mr_table_create;
+ 		goto err_mr4_table_create;
  	}
+ 	mr6_table = mlxsw_sp_mr_table_create(mlxsw_sp, vr->id,
+ 					     MLXSW_SP_L3_PROTO_IPV6);
+ 	if (IS_ERR(mr6_table)) {
+ 		err = PTR_ERR(mr6_table);
+ 		goto err_mr6_table_create;
+ 	}
+ 
  	vr->fib4 = fib4;
  	vr->fib6 = fib6;
- 	vr->mr4_table = mr4_table;
+ 	vr->mr_table[MLXSW_SP_L3_PROTO_IPV4] = mr4_table;
+ 	vr->mr_table[MLXSW_SP_L3_PROTO_IPV6] = mr6_table;
  	vr->tb_id = tb_id;
  	return vr;
  
- err_mr_table_create:
+ err_mr6_table_create:
+ 	mlxsw_sp_mr_table_destroy(mr4_table);
+ err_mr4_table_create:
  	mlxsw_sp_fib_destroy(mlxsw_sp, fib6);
  err_fib6_create:
  	mlxsw_sp_fib_destroy(mlxsw_sp, fib4);
@@@ -829,8 -842,10 +842,10 @@@
  static void mlxsw_sp_vr_destroy(struct mlxsw_sp *mlxsw_sp,
  				struct mlxsw_sp_vr *vr)
  {
- 	mlxsw_sp_mr_table_destroy(vr->mr4_table);
- 	vr->mr4_table = NULL;
+ 	mlxsw_sp_mr_table_destroy(vr->mr_table[MLXSW_SP_L3_PROTO_IPV6]);
+ 	vr->mr_table[MLXSW_SP_L3_PROTO_IPV6] = NULL;
+ 	mlxsw_sp_mr_table_destroy(vr->mr_table[MLXSW_SP_L3_PROTO_IPV4]);
+ 	vr->mr_table[MLXSW_SP_L3_PROTO_IPV4] = NULL;
  	mlxsw_sp_fib_destroy(mlxsw_sp, vr->fib6);
  	vr->fib6 = NULL;
  	mlxsw_sp_fib_destroy(mlxsw_sp, vr->fib4);
@@@ -853,7 -868,8 +868,8 @@@ static void mlxsw_sp_vr_put(struct mlxs
  {
  	if (!vr->rif_count && list_empty(&vr->fib4->node_list) &&
  	    list_empty(&vr->fib6->node_list) &&
- 	    mlxsw_sp_mr_table_empty(vr->mr4_table))
+ 	    mlxsw_sp_mr_table_empty(vr->mr_table[MLXSW_SP_L3_PROTO_IPV4]) &&
+ 	    mlxsw_sp_mr_table_empty(vr->mr_table[MLXSW_SP_L3_PROTO_IPV6]))
  		mlxsw_sp_vr_destroy(mlxsw_sp, vr);
  }
  
@@@ -1024,9 -1040,11 +1040,11 @@@ mlxsw_sp_ipip_entry_alloc(struct mlxsw_
  			  enum mlxsw_sp_ipip_type ipipt,
  			  struct net_device *ol_dev)
  {
+ 	const struct mlxsw_sp_ipip_ops *ipip_ops;
  	struct mlxsw_sp_ipip_entry *ipip_entry;
  	struct mlxsw_sp_ipip_entry *ret = NULL;
  
+ 	ipip_ops = mlxsw_sp->router->ipip_ops_arr[ipipt];
  	ipip_entry = kzalloc(sizeof(*ipip_entry), GFP_KERNEL);
  	if (!ipip_entry)
  		return ERR_PTR(-ENOMEM);
@@@ -1040,7 -1058,15 +1058,15 @@@
  
  	ipip_entry->ipipt = ipipt;
  	ipip_entry->ol_dev = ol_dev;
- 	ipip_entry->parms = mlxsw_sp_ipip_netdev_parms(ol_dev);
+ 
+ 	switch (ipip_ops->ul_proto) {
+ 	case MLXSW_SP_L3_PROTO_IPV4:
+ 		ipip_entry->parms4 = mlxsw_sp_ipip_netdev_parms4(ol_dev);
+ 		break;
+ 	case MLXSW_SP_L3_PROTO_IPV6:
+ 		WARN_ON(1);
+ 		break;
+ 	}
  
  	return ipip_entry;
  
@@@ -1380,55 -1406,6 +1406,55 @@@ mlxsw_sp_ipip_entry_ol_up_event(struct 
  						  decap_fib_entry);
  }
  
 +static int
 +mlxsw_sp_rif_ipip_lb_op(struct mlxsw_sp_rif_ipip_lb *lb_rif,
 +			struct mlxsw_sp_vr *ul_vr, bool enable)
 +{
 +	struct mlxsw_sp_rif_ipip_lb_config lb_cf = lb_rif->lb_config;
 +	struct mlxsw_sp_rif *rif = &lb_rif->common;
 +	struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp;
 +	char ritr_pl[MLXSW_REG_RITR_LEN];
 +	u32 saddr4;
 +
 +	switch (lb_cf.ul_protocol) {
 +	case MLXSW_SP_L3_PROTO_IPV4:
 +		saddr4 = be32_to_cpu(lb_cf.saddr.addr4);
 +		mlxsw_reg_ritr_pack(ritr_pl, enable, MLXSW_REG_RITR_LOOPBACK_IF,
 +				    rif->rif_index, rif->vr_id, rif->dev->mtu);
 +		mlxsw_reg_ritr_loopback_ipip4_pack(ritr_pl, lb_cf.lb_ipipt,
 +			    MLXSW_REG_RITR_LOOPBACK_IPIP_OPTIONS_GRE_KEY_PRESET,
 +			    ul_vr->id, saddr4, lb_cf.okey);
 +		break;
 +
 +	case MLXSW_SP_L3_PROTO_IPV6:
 +		return -EAFNOSUPPORT;
 +	}
 +
 +	return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ritr), ritr_pl);
 +}
 +
 +static int mlxsw_sp_netdevice_ipip_ol_update_mtu(struct mlxsw_sp *mlxsw_sp,
 +						 struct net_device *ol_dev)
 +{
 +	struct mlxsw_sp_ipip_entry *ipip_entry;
 +	struct mlxsw_sp_rif_ipip_lb *lb_rif;
 +	struct mlxsw_sp_vr *ul_vr;
 +	int err = 0;
 +
 +	ipip_entry = mlxsw_sp_ipip_entry_find_by_ol_dev(mlxsw_sp, ol_dev);
 +	if (ipip_entry) {
 +		lb_rif = ipip_entry->ol_lb;
 +		ul_vr = &mlxsw_sp->router->vrs[lb_rif->ul_vr_id];
 +		err = mlxsw_sp_rif_ipip_lb_op(lb_rif, ul_vr, true);
 +		if (err)
 +			goto out;
 +		lb_rif->common.mtu = ol_dev->mtu;
 +	}
 +
 +out:
 +	return err;
 +}
 +
  static void mlxsw_sp_netdevice_ipip_ol_up_event(struct mlxsw_sp *mlxsw_sp,
  						struct net_device *ol_dev)
  {
@@@ -1709,8 -1686,6 +1735,8 @@@ int mlxsw_sp_netdevice_ipip_ol_event(st
  		extack = info->extack;
  		return mlxsw_sp_netdevice_ipip_ol_change_event(mlxsw_sp,
  							       ol_dev, extack);
 +	case NETDEV_CHANGEMTU:
 +		return mlxsw_sp_netdevice_ipip_ol_update_mtu(mlxsw_sp, ol_dev);
  	}
  	return 0;
  }
@@@ -2371,6 -2346,8 +2397,8 @@@ static void mlxsw_sp_router_neigh_event
  	read_unlock_bh(&n->lock);
  
  	rtnl_lock();
+ 	mlxsw_sp_span_respin(mlxsw_sp);
+ 
  	entry_connected = nud_state & NUD_VALID && !dead;
  	neigh_entry = mlxsw_sp_neigh_entry_lookup(mlxsw_sp, n);
  	if (!entry_connected && !neigh_entry)
@@@ -2468,7 -2445,8 +2496,8 @@@ static int mlxsw_sp_router_netevent_eve
  		mlxsw_core_schedule_work(&net_work->work);
  		mlxsw_sp_port_dev_put(mlxsw_sp_port);
  		break;
- 	case NETEVENT_MULTIPATH_HASH_UPDATE:
+ 	case NETEVENT_IPV4_MPATH_HASH_UPDATE:
+ 	case NETEVENT_IPV6_MPATH_HASH_UPDATE:
  		net = ptr;
  
  		if (!net_eq(net, &init_net))
@@@ -5415,10 -5393,20 +5444,20 @@@ static int __mlxsw_sp_router_set_abort_
  	return 0;
  }
  
+ static struct mlxsw_sp_mr_table *
+ mlxsw_sp_router_fibmr_family_to_table(struct mlxsw_sp_vr *vr, int family)
+ {
+ 	if (family == RTNL_FAMILY_IPMR)
+ 		return vr->mr_table[MLXSW_SP_L3_PROTO_IPV4];
+ 	else
+ 		return vr->mr_table[MLXSW_SP_L3_PROTO_IPV6];
+ }
+ 
  static int mlxsw_sp_router_fibmr_add(struct mlxsw_sp *mlxsw_sp,
  				     struct mfc_entry_notifier_info *men_info,
  				     bool replace)
  {
+ 	struct mlxsw_sp_mr_table *mrt;
  	struct mlxsw_sp_vr *vr;
  
  	if (mlxsw_sp->router->aborted)
@@@ -5428,12 -5416,14 +5467,14 @@@
  	if (IS_ERR(vr))
  		return PTR_ERR(vr);
  
- 	return mlxsw_sp_mr_route4_add(vr->mr4_table, men_info->mfc, replace);
+ 	mrt = mlxsw_sp_router_fibmr_family_to_table(vr, men_info->info.family);
+ 	return mlxsw_sp_mr_route_add(mrt, men_info->mfc, replace);
  }
  
  static void mlxsw_sp_router_fibmr_del(struct mlxsw_sp *mlxsw_sp,
  				      struct mfc_entry_notifier_info *men_info)
  {
+ 	struct mlxsw_sp_mr_table *mrt;
  	struct mlxsw_sp_vr *vr;
  
  	if (mlxsw_sp->router->aborted)
@@@ -5443,7 -5433,8 +5484,8 @@@
  	if (WARN_ON(!vr))
  		return;
  
- 	mlxsw_sp_mr_route4_del(vr->mr4_table, men_info->mfc);
+ 	mrt = mlxsw_sp_router_fibmr_family_to_table(vr, men_info->info.family);
+ 	mlxsw_sp_mr_route_del(mrt, men_info->mfc);
  	mlxsw_sp_vr_put(mlxsw_sp, vr);
  }
  
@@@ -5451,6 -5442,7 +5493,7 @@@ static in
  mlxsw_sp_router_fibmr_vif_add(struct mlxsw_sp *mlxsw_sp,
  			      struct vif_entry_notifier_info *ven_info)
  {
+ 	struct mlxsw_sp_mr_table *mrt;
  	struct mlxsw_sp_rif *rif;
  	struct mlxsw_sp_vr *vr;
  
@@@ -5461,8 -5453,9 +5504,9 @@@
  	if (IS_ERR(vr))
  		return PTR_ERR(vr);
  
+ 	mrt = mlxsw_sp_router_fibmr_family_to_table(vr, ven_info->info.family);
  	rif = mlxsw_sp_rif_find_by_dev(mlxsw_sp, ven_info->dev);
- 	return mlxsw_sp_mr_vif_add(vr->mr4_table, ven_info->dev,
+ 	return mlxsw_sp_mr_vif_add(mrt, ven_info->dev,
  				   ven_info->vif_index,
  				   ven_info->vif_flags, rif);
  }
@@@ -5471,6 -5464,7 +5515,7 @@@ static voi
  mlxsw_sp_router_fibmr_vif_del(struct mlxsw_sp *mlxsw_sp,
  			      struct vif_entry_notifier_info *ven_info)
  {
+ 	struct mlxsw_sp_mr_table *mrt;
  	struct mlxsw_sp_vr *vr;
  
  	if (mlxsw_sp->router->aborted)
@@@ -5480,7 -5474,8 +5525,8 @@@
  	if (WARN_ON(!vr))
  		return;
  
- 	mlxsw_sp_mr_vif_del(vr->mr4_table, ven_info->vif_index);
+ 	mrt = mlxsw_sp_router_fibmr_family_to_table(vr, ven_info->info.family);
+ 	mlxsw_sp_mr_vif_del(mrt, ven_info->vif_index);
  	mlxsw_sp_vr_put(mlxsw_sp, vr);
  }
  
@@@ -5572,7 -5567,7 +5618,7 @@@ static void mlxsw_sp_vr_fib_flush(struc
  
  static void mlxsw_sp_router_fib_flush(struct mlxsw_sp *mlxsw_sp)
  {
- 	int i;
+ 	int i, j;
  
  	for (i = 0; i < MLXSW_CORE_RES_GET(mlxsw_sp->core, MAX_VRS); i++) {
  		struct mlxsw_sp_vr *vr = &mlxsw_sp->router->vrs[i];
@@@ -5580,7 -5575,8 +5626,8 @@@
  		if (!mlxsw_sp_vr_is_used(vr))
  			continue;
  
- 		mlxsw_sp_mr_table_flush(vr->mr4_table);
+ 		for (j = 0; j < MLXSW_SP_L3_PROTO_MAX; j++)
+ 			mlxsw_sp_mr_table_flush(vr->mr_table[j]);
  		mlxsw_sp_vr_fib_flush(mlxsw_sp, vr, MLXSW_SP_L3_PROTO_IPV4);
  
  		/* If virtual router was only used for IPv4, then it's no
@@@ -5630,6 -5626,8 +5677,8 @@@ static void mlxsw_sp_router_fib4_event_
  
  	/* Protect internal structures from changes */
  	rtnl_lock();
+ 	mlxsw_sp_span_respin(mlxsw_sp);
+ 
  	switch (fib_work->event) {
  	case FIB_EVENT_ENTRY_REPLACE: /* fall through */
  	case FIB_EVENT_ENTRY_APPEND: /* fall through */
@@@ -5672,6 -5670,8 +5721,8 @@@ static void mlxsw_sp_router_fib6_event_
  	int err;
  
  	rtnl_lock();
+ 	mlxsw_sp_span_respin(mlxsw_sp);
+ 
  	switch (fib_work->event) {
  	case FIB_EVENT_ENTRY_REPLACE: /* fall through */
  	case FIB_EVENT_ENTRY_ADD:
@@@ -5715,11 -5715,11 +5766,11 @@@ static void mlxsw_sp_router_fibmr_event
  						replace);
  		if (err)
  			mlxsw_sp_router_fib_abort(mlxsw_sp);
- 		ipmr_cache_put(fib_work->men_info.mfc);
+ 		mr_cache_put(fib_work->men_info.mfc);
  		break;
  	case FIB_EVENT_ENTRY_DEL:
  		mlxsw_sp_router_fibmr_del(mlxsw_sp, &fib_work->men_info);
- 		ipmr_cache_put(fib_work->men_info.mfc);
+ 		mr_cache_put(fib_work->men_info.mfc);
  		break;
  	case FIB_EVENT_VIF_ADD:
  		err = mlxsw_sp_router_fibmr_vif_add(mlxsw_sp,
@@@ -5799,7 -5799,7 +5850,7 @@@ mlxsw_sp_router_fibmr_event(struct mlxs
  	case FIB_EVENT_ENTRY_ADD: /* fall through */
  	case FIB_EVENT_ENTRY_DEL:
  		memcpy(&fib_work->men_info, info, sizeof(fib_work->men_info));
- 		ipmr_cache_hold(fib_work->men_info.mfc);
+ 		mr_cache_hold(fib_work->men_info.mfc);
  		break;
  	case FIB_EVENT_VIF_ADD: /* fall through */
  	case FIB_EVENT_VIF_DEL:
@@@ -5841,10 -5841,14 +5892,14 @@@ static int mlxsw_sp_router_fib_rule_eve
  		if (!ipmr_rule_default(rule) && !rule->l3mdev)
  			err = -1;
  		break;
+ 	case RTNL_FAMILY_IP6MR:
+ 		if (!ip6mr_rule_default(rule) && !rule->l3mdev)
+ 			err = -1;
+ 		break;
  	}
  
  	if (err < 0)
- 		NL_SET_ERR_MSG(extack, "spectrum: FIB rules not supported. Aborting offload");
+ 		NL_SET_ERR_MSG_MOD(extack, "FIB rules not supported. Aborting offload");
  
  	return err;
  }
@@@ -5860,7 -5864,8 +5915,8 @@@ static int mlxsw_sp_router_fib_event(st
  
  	if (!net_eq(info->net, &init_net) ||
  	    (info->family != AF_INET && info->family != AF_INET6 &&
- 	     info->family != RTNL_FAMILY_IPMR))
+ 	     info->family != RTNL_FAMILY_IPMR &&
+ 	     info->family != RTNL_FAMILY_IP6MR))
  		return NOTIFY_DONE;
  
  	router = container_of(nb, struct mlxsw_sp_router, fib_nb);
@@@ -5890,6 -5895,7 +5946,7 @@@
  		INIT_WORK(&fib_work->work, mlxsw_sp_router_fib6_event_work);
  		mlxsw_sp_router_fib6_event(fib_work, info);
  		break;
+ 	case RTNL_FAMILY_IP6MR:
  	case RTNL_FAMILY_IPMR:
  		INIT_WORK(&fib_work->work, mlxsw_sp_router_fibmr_event_work);
  		mlxsw_sp_router_fibmr_event(fib_work, info);
@@@ -6071,7 -6077,7 +6128,7 @@@ mlxsw_sp_rif_create(struct mlxsw_sp *ml
  	struct mlxsw_sp_rif *rif;
  	struct mlxsw_sp_vr *vr;
  	u16 rif_index;
- 	int err;
+ 	int i, err;
  
  	type = mlxsw_sp_dev_rif_type(mlxsw_sp, params->dev);
  	ops = mlxsw_sp->router->rif_ops_arr[type];
@@@ -6083,7 -6089,7 +6140,7 @@@
  
  	err = mlxsw_sp_rif_index_alloc(mlxsw_sp, &rif_index);
  	if (err) {
- 		NL_SET_ERR_MSG(extack, "spectrum: Exceeded number of supported router interfaces");
+ 		NL_SET_ERR_MSG_MOD(extack, "Exceeded number of supported router interfaces");
  		goto err_rif_index_alloc;
  	}
  
@@@ -6111,9 -6117,11 +6168,11 @@@
  	if (err)
  		goto err_configure;
  
- 	err = mlxsw_sp_mr_rif_add(vr->mr4_table, rif);
- 	if (err)
- 		goto err_mr_rif_add;
+ 	for (i = 0; i < MLXSW_SP_L3_PROTO_MAX; i++) {
+ 		err = mlxsw_sp_mr_rif_add(vr->mr_table[i], rif);
+ 		if (err)
+ 			goto err_mr_rif_add;
+ 	}
  
  	mlxsw_sp_rif_counters_alloc(rif);
  	mlxsw_sp->router->rifs[rif_index] = rif;
@@@ -6121,6 -6129,8 +6180,8 @@@
  	return rif;
  
  err_mr_rif_add:
+ 	for (i--; i >= 0; i--)
+ 		mlxsw_sp_mr_rif_del(vr->mr_table[i], rif);
  	ops->deconfigure(rif);
  err_configure:
  	if (fid)
@@@ -6140,13 -6150,15 +6201,15 @@@ void mlxsw_sp_rif_destroy(struct mlxsw_
  	struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp;
  	struct mlxsw_sp_fid *fid = rif->fid;
  	struct mlxsw_sp_vr *vr;
+ 	int i;
  
  	mlxsw_sp_router_rif_gone_sync(mlxsw_sp, rif);
  	vr = &mlxsw_sp->router->vrs[rif->vr_id];
  
  	mlxsw_sp->router->rifs[rif->rif_index] = NULL;
  	mlxsw_sp_rif_counters_free(rif);
- 	mlxsw_sp_mr_rif_del(vr->mr4_table, rif);
+ 	for (i = 0; i < MLXSW_SP_L3_PROTO_MAX; i++)
+ 		mlxsw_sp_mr_rif_del(vr->mr_table[i], rif);
  	ops->deconfigure(rif);
  	if (fid)
  		/* Loopback RIFs are not associated with a FID. */
@@@ -6553,13 -6565,16 +6616,16 @@@ int mlxsw_sp_netdevice_router_port_even
  
  	if (rif->mtu != dev->mtu) {
  		struct mlxsw_sp_vr *vr;
+ 		int i;
  
  		/* The RIF is relevant only to its mr_table instance, as unlike
  		 * unicast routing, in multicast routing a RIF cannot be shared
  		 * between several multicast routing tables.
  		 */
  		vr = &mlxsw_sp->router->vrs[rif->vr_id];
- 		mlxsw_sp_mr_rif_mtu_update(vr->mr4_table, rif, dev->mtu);
+ 		for (i = 0; i < MLXSW_SP_L3_PROTO_MAX; i++)
+ 			mlxsw_sp_mr_rif_mtu_update(vr->mr_table[i],
+ 						   rif, dev->mtu);
  	}
  
  	ether_addr_copy(rif->addr, dev->dev_addr);
@@@ -6895,6 -6910,33 +6961,6 @@@ mlxsw_sp_rif_ipip_lb_setup(struct mlxsw
  }
  
  static int
 -mlxsw_sp_rif_ipip_lb_op(struct mlxsw_sp_rif_ipip_lb *lb_rif,
 -			struct mlxsw_sp_vr *ul_vr, bool enable)
 -{
 -	struct mlxsw_sp_rif_ipip_lb_config lb_cf = lb_rif->lb_config;
 -	struct mlxsw_sp_rif *rif = &lb_rif->common;
 -	struct mlxsw_sp *mlxsw_sp = rif->mlxsw_sp;
 -	char ritr_pl[MLXSW_REG_RITR_LEN];
 -	u32 saddr4;
 -
 -	switch (lb_cf.ul_protocol) {
 -	case MLXSW_SP_L3_PROTO_IPV4:
 -		saddr4 = be32_to_cpu(lb_cf.saddr.addr4);
 -		mlxsw_reg_ritr_pack(ritr_pl, enable, MLXSW_REG_RITR_LOOPBACK_IF,
 -				    rif->rif_index, rif->vr_id, rif->dev->mtu);
 -		mlxsw_reg_ritr_loopback_ipip4_pack(ritr_pl, lb_cf.lb_ipipt,
 -			    MLXSW_REG_RITR_LOOPBACK_IPIP_OPTIONS_GRE_KEY_PRESET,
 -			    ul_vr->id, saddr4, lb_cf.okey);
 -		break;
 -
 -	case MLXSW_SP_L3_PROTO_IPV6:
 -		return -EAFNOSUPPORT;
 -	}
 -
 -	return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ritr), ritr_pl);
 -}
 -
 -static int
  mlxsw_sp_rif_ipip_lb_configure(struct mlxsw_sp_rif *rif)
  {
  	struct mlxsw_sp_rif_ipip_lb *lb_rif = mlxsw_sp_rif_ipip_lb_rif(rif);
@@@ -7037,13 -7079,25 +7103,25 @@@ static void mlxsw_sp_mp4_hash_init(cha
  
  static void mlxsw_sp_mp6_hash_init(char *recr2_pl)
  {
+ 	bool only_l3 = !ip6_multipath_hash_policy(&init_net);
+ 
  	mlxsw_sp_mp_hash_header_set(recr2_pl,
  				    MLXSW_REG_RECR2_IPV6_EN_NOT_TCP_NOT_UDP);
  	mlxsw_sp_mp_hash_header_set(recr2_pl, MLXSW_REG_RECR2_IPV6_EN_TCP_UDP);
  	mlxsw_reg_recr2_ipv6_sip_enable(recr2_pl);
  	mlxsw_reg_recr2_ipv6_dip_enable(recr2_pl);
- 	mlxsw_sp_mp_hash_field_set(recr2_pl, MLXSW_REG_RECR2_IPV6_FLOW_LABEL);
  	mlxsw_sp_mp_hash_field_set(recr2_pl, MLXSW_REG_RECR2_IPV6_NEXT_HEADER);
+ 	if (only_l3) {
+ 		mlxsw_sp_mp_hash_field_set(recr2_pl,
+ 					   MLXSW_REG_RECR2_IPV6_FLOW_LABEL);
+ 	} else {
+ 		mlxsw_sp_mp_hash_header_set(recr2_pl,
+ 					    MLXSW_REG_RECR2_TCP_UDP_EN_IPV6);
+ 		mlxsw_sp_mp_hash_field_set(recr2_pl,
+ 					   MLXSW_REG_RECR2_TCP_UDP_SPORT);
+ 		mlxsw_sp_mp_hash_field_set(recr2_pl,
+ 					   MLXSW_REG_RECR2_TCP_UDP_DPORT);
+ 	}
  }
  
  static int mlxsw_sp_mp_hash_init(struct mlxsw_sp *mlxsw_sp)
diff --combined drivers/net/ethernet/realtek/r8169.c
index b4779acb6b5c,630409e0337f..604ae78381ae
--- a/drivers/net/ethernet/realtek/r8169.c
+++ b/drivers/net/ethernet/realtek/r8169.c
@@@ -99,12 -99,12 +99,12 @@@ static const int multicast_filter_limi
  #define RTL8169_PHY_TIMEOUT	(10*HZ)
  
  /* write/read MMIO register */
- #define RTL_W8(reg, val8)	writeb ((val8), ioaddr + (reg))
- #define RTL_W16(reg, val16)	writew ((val16), ioaddr + (reg))
- #define RTL_W32(reg, val32)	writel ((val32), ioaddr + (reg))
- #define RTL_R8(reg)		readb (ioaddr + (reg))
- #define RTL_R16(reg)		readw (ioaddr + (reg))
- #define RTL_R32(reg)		readl (ioaddr + (reg))
+ #define RTL_W8(tp, reg, val8)	writeb((val8), tp->mmio_addr + (reg))
+ #define RTL_W16(tp, reg, val16)	writew((val16), tp->mmio_addr + (reg))
+ #define RTL_W32(tp, reg, val32)	writel((val32), tp->mmio_addr + (reg))
+ #define RTL_R8(tp, reg)		readb(tp->mmio_addr + (reg))
+ #define RTL_R16(tp, reg)		readw(tp->mmio_addr + (reg))
+ #define RTL_R32(tp, reg)		readl(tp->mmio_addr + (reg))
  
  enum mac_version {
  	RTL_GIGA_MAC_VER_01 = 0,
@@@ -735,12 -735,6 +735,6 @@@ struct ring_info 
  	u8		__pad[sizeof(void *) - sizeof(u32)];
  };
  
- enum features {
- 	RTL_FEATURE_WOL		= (1 << 0),
- 	RTL_FEATURE_MSI		= (1 << 1),
- 	RTL_FEATURE_GMII	= (1 << 2),
- };
- 
  struct rtl8169_counters {
  	__le64	tx_packets;
  	__le64	rx_packets;
@@@ -829,7 -823,7 +823,7 @@@ struct rtl8169_private 
  	void (*phy_reset_enable)(struct rtl8169_private *tp);
  	void (*hw_start)(struct net_device *);
  	unsigned int (*phy_reset_pending)(struct rtl8169_private *tp);
- 	unsigned int (*link_ok)(void __iomem *);
+ 	unsigned int (*link_ok)(struct rtl8169_private *tp);
  	int (*do_ioctl)(struct rtl8169_private *tp, struct mii_ioctl_data *data, int cmd);
  	bool (*tso_csum)(struct rtl8169_private *, struct sk_buff *, u32 *);
  
@@@ -893,6 -887,11 +887,11 @@@ MODULE_FIRMWARE(FIRMWARE_8168H_2)
  MODULE_FIRMWARE(FIRMWARE_8107E_1);
  MODULE_FIRMWARE(FIRMWARE_8107E_2);
  
+ static inline struct device *tp_to_dev(struct rtl8169_private *tp)
+ {
+ 	return &tp->pci_dev->dev;
+ }
+ 
  static void rtl_lock_work(struct rtl8169_private *tp)
  {
  	mutex_lock(&tp->wk.mutex);
@@@ -903,9 -902,9 +902,9 @@@ static void rtl_unlock_work(struct rtl8
  	mutex_unlock(&tp->wk.mutex);
  }
  
- static void rtl_tx_performance_tweak(struct pci_dev *pdev, u16 force)
+ static void rtl_tx_performance_tweak(struct rtl8169_private *tp, u16 force)
  {
- 	pcie_capability_clear_and_set_word(pdev, PCI_EXP_DEVCTL,
+ 	pcie_capability_clear_and_set_word(tp->pci_dev, PCI_EXP_DEVCTL,
  					   PCI_EXP_DEVCTL_READRQ, force);
  }
  
@@@ -984,56 -983,46 +983,46 @@@ static bool rtl_ocp_reg_failure(struct 
  
  DECLARE_RTL_COND(rtl_ocp_gphy_cond)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	return RTL_R32(GPHY_OCP) & OCPAR_FLAG;
+ 	return RTL_R32(tp, GPHY_OCP) & OCPAR_FLAG;
  }
  
  static void r8168_phy_ocp_write(struct rtl8169_private *tp, u32 reg, u32 data)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	if (rtl_ocp_reg_failure(tp, reg))
  		return;
  
- 	RTL_W32(GPHY_OCP, OCPAR_FLAG | (reg << 15) | data);
+ 	RTL_W32(tp, GPHY_OCP, OCPAR_FLAG | (reg << 15) | data);
  
  	rtl_udelay_loop_wait_low(tp, &rtl_ocp_gphy_cond, 25, 10);
  }
  
  static u16 r8168_phy_ocp_read(struct rtl8169_private *tp, u32 reg)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	if (rtl_ocp_reg_failure(tp, reg))
  		return 0;
  
- 	RTL_W32(GPHY_OCP, reg << 15);
+ 	RTL_W32(tp, GPHY_OCP, reg << 15);
  
  	return rtl_udelay_loop_wait_high(tp, &rtl_ocp_gphy_cond, 25, 10) ?
- 		(RTL_R32(GPHY_OCP) & 0xffff) : ~0;
+ 		(RTL_R32(tp, GPHY_OCP) & 0xffff) : ~0;
  }
  
  static void r8168_mac_ocp_write(struct rtl8169_private *tp, u32 reg, u32 data)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	if (rtl_ocp_reg_failure(tp, reg))
  		return;
  
- 	RTL_W32(OCPDR, OCPAR_FLAG | (reg << 15) | data);
+ 	RTL_W32(tp, OCPDR, OCPAR_FLAG | (reg << 15) | data);
  }
  
  static u16 r8168_mac_ocp_read(struct rtl8169_private *tp, u32 reg)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	if (rtl_ocp_reg_failure(tp, reg))
  		return 0;
  
- 	RTL_W32(OCPDR, reg << 15);
+ 	RTL_W32(tp, OCPDR, reg << 15);
  
- 	return RTL_R32(OCPDR);
+ 	return RTL_R32(tp, OCPDR);
  }
  
  #define OCP_STD_PHY_BASE	0xa400
@@@ -1076,16 -1065,12 +1065,12 @@@ static int mac_mcu_read(struct rtl8169_
  
  DECLARE_RTL_COND(rtl_phyar_cond)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	return RTL_R32(PHYAR) & 0x80000000;
+ 	return RTL_R32(tp, PHYAR) & 0x80000000;
  }
  
  static void r8169_mdio_write(struct rtl8169_private *tp, int reg, int value)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W32(PHYAR, 0x80000000 | (reg & 0x1f) << 16 | (value & 0xffff));
+ 	RTL_W32(tp, PHYAR, 0x80000000 | (reg & 0x1f) << 16 | (value & 0xffff));
  
  	rtl_udelay_loop_wait_low(tp, &rtl_phyar_cond, 25, 20);
  	/*
@@@ -1097,13 -1082,12 +1082,12 @@@
  
  static int r8169_mdio_read(struct rtl8169_private *tp, int reg)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
  	int value;
  
- 	RTL_W32(PHYAR, 0x0 | (reg & 0x1f) << 16);
+ 	RTL_W32(tp, PHYAR, 0x0 | (reg & 0x1f) << 16);
  
  	value = rtl_udelay_loop_wait_high(tp, &rtl_phyar_cond, 25, 20) ?
- 		RTL_R32(PHYAR) & 0xffff : ~0;
+ 		RTL_R32(tp, PHYAR) & 0xffff : ~0;
  
  	/*
  	 * According to hardware specs a 20us delay is required after read
@@@ -1116,18 -1100,14 +1100,14 @@@
  
  DECLARE_RTL_COND(rtl_ocpar_cond)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	return RTL_R32(OCPAR) & OCPAR_FLAG;
+ 	return RTL_R32(tp, OCPAR) & OCPAR_FLAG;
  }
  
  static void r8168dp_1_mdio_access(struct rtl8169_private *tp, int reg, u32 data)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W32(OCPDR, data | ((reg & OCPDR_REG_MASK) << OCPDR_GPHY_REG_SHIFT));
- 	RTL_W32(OCPAR, OCPAR_GPHY_WRITE_CMD);
- 	RTL_W32(EPHY_RXER_NUM, 0);
+ 	RTL_W32(tp, OCPDR, data | ((reg & OCPDR_REG_MASK) << OCPDR_GPHY_REG_SHIFT));
+ 	RTL_W32(tp, OCPAR, OCPAR_GPHY_WRITE_CMD);
+ 	RTL_W32(tp, EPHY_RXER_NUM, 0);
  
  	rtl_udelay_loop_wait_low(tp, &rtl_ocpar_cond, 1000, 100);
  }
@@@ -1140,51 -1120,46 +1120,46 @@@ static void r8168dp_1_mdio_write(struc
  
  static int r8168dp_1_mdio_read(struct rtl8169_private *tp, int reg)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	r8168dp_1_mdio_access(tp, reg, OCPDR_READ_CMD);
  
  	mdelay(1);
- 	RTL_W32(OCPAR, OCPAR_GPHY_READ_CMD);
- 	RTL_W32(EPHY_RXER_NUM, 0);
+ 	RTL_W32(tp, OCPAR, OCPAR_GPHY_READ_CMD);
+ 	RTL_W32(tp, EPHY_RXER_NUM, 0);
  
  	return rtl_udelay_loop_wait_high(tp, &rtl_ocpar_cond, 1000, 100) ?
- 		RTL_R32(OCPDR) & OCPDR_DATA_MASK : ~0;
+ 		RTL_R32(tp, OCPDR) & OCPDR_DATA_MASK : ~0;
  }
  
  #define R8168DP_1_MDIO_ACCESS_BIT	0x00020000
  
- static void r8168dp_2_mdio_start(void __iomem *ioaddr)
+ static void r8168dp_2_mdio_start(struct rtl8169_private *tp)
  {
- 	RTL_W32(0xd0, RTL_R32(0xd0) & ~R8168DP_1_MDIO_ACCESS_BIT);
+ 	RTL_W32(tp, 0xd0, RTL_R32(tp, 0xd0) & ~R8168DP_1_MDIO_ACCESS_BIT);
  }
  
- static void r8168dp_2_mdio_stop(void __iomem *ioaddr)
+ static void r8168dp_2_mdio_stop(struct rtl8169_private *tp)
  {
- 	RTL_W32(0xd0, RTL_R32(0xd0) | R8168DP_1_MDIO_ACCESS_BIT);
+ 	RTL_W32(tp, 0xd0, RTL_R32(tp, 0xd0) | R8168DP_1_MDIO_ACCESS_BIT);
  }
  
  static void r8168dp_2_mdio_write(struct rtl8169_private *tp, int reg, int value)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	r8168dp_2_mdio_start(ioaddr);
+ 	r8168dp_2_mdio_start(tp);
  
  	r8169_mdio_write(tp, reg, value);
  
- 	r8168dp_2_mdio_stop(ioaddr);
+ 	r8168dp_2_mdio_stop(tp);
  }
  
  static int r8168dp_2_mdio_read(struct rtl8169_private *tp, int reg)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
  	int value;
  
- 	r8168dp_2_mdio_start(ioaddr);
+ 	r8168dp_2_mdio_start(tp);
  
  	value = r8169_mdio_read(tp, reg);
  
- 	r8168dp_2_mdio_stop(ioaddr);
+ 	r8168dp_2_mdio_stop(tp);
  
  	return value;
  }
@@@ -1229,16 -1204,12 +1204,12 @@@ static int rtl_mdio_read(struct net_dev
  
  DECLARE_RTL_COND(rtl_ephyar_cond)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	return RTL_R32(EPHYAR) & EPHYAR_FLAG;
+ 	return RTL_R32(tp, EPHYAR) & EPHYAR_FLAG;
  }
  
  static void rtl_ephy_write(struct rtl8169_private *tp, int reg_addr, int value)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W32(EPHYAR, EPHYAR_WRITE_CMD | (value & EPHYAR_DATA_MASK) |
+ 	RTL_W32(tp, EPHYAR, EPHYAR_WRITE_CMD | (value & EPHYAR_DATA_MASK) |
  		(reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
  
  	rtl_udelay_loop_wait_low(tp, &rtl_ephyar_cond, 10, 100);
@@@ -1248,41 -1219,33 +1219,33 @@@
  
  static u16 rtl_ephy_read(struct rtl8169_private *tp, int reg_addr)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W32(EPHYAR, (reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
+ 	RTL_W32(tp, EPHYAR, (reg_addr & EPHYAR_REG_MASK) << EPHYAR_REG_SHIFT);
  
  	return rtl_udelay_loop_wait_high(tp, &rtl_ephyar_cond, 10, 100) ?
- 		RTL_R32(EPHYAR) & EPHYAR_DATA_MASK : ~0;
+ 		RTL_R32(tp, EPHYAR) & EPHYAR_DATA_MASK : ~0;
  }
  
  DECLARE_RTL_COND(rtl_eriar_cond)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	return RTL_R32(ERIAR) & ERIAR_FLAG;
+ 	return RTL_R32(tp, ERIAR) & ERIAR_FLAG;
  }
  
  static void rtl_eri_write(struct rtl8169_private *tp, int addr, u32 mask,
  			  u32 val, int type)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	BUG_ON((addr & 3) || (mask == 0));
- 	RTL_W32(ERIDR, val);
- 	RTL_W32(ERIAR, ERIAR_WRITE_CMD | type | mask | addr);
+ 	RTL_W32(tp, ERIDR, val);
+ 	RTL_W32(tp, ERIAR, ERIAR_WRITE_CMD | type | mask | addr);
  
  	rtl_udelay_loop_wait_low(tp, &rtl_eriar_cond, 100, 100);
  }
  
  static u32 rtl_eri_read(struct rtl8169_private *tp, int addr, int type)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W32(ERIAR, ERIAR_READ_CMD | type | ERIAR_MASK_1111 | addr);
+ 	RTL_W32(tp, ERIAR, ERIAR_READ_CMD | type | ERIAR_MASK_1111 | addr);
  
  	return rtl_udelay_loop_wait_high(tp, &rtl_eriar_cond, 100, 100) ?
- 		RTL_R32(ERIDR) : ~0;
+ 		RTL_R32(tp, ERIDR) : ~0;
  }
  
  static void rtl_w0w1_eri(struct rtl8169_private *tp, int addr, u32 mask, u32 p,
@@@ -1296,11 -1259,9 +1259,9 @@@
  
  static u32 r8168dp_ocp_read(struct rtl8169_private *tp, u8 mask, u16 reg)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W32(OCPAR, ((u32)mask & 0x0f) << 12 | (reg & 0x0fff));
+ 	RTL_W32(tp, OCPAR, ((u32)mask & 0x0f) << 12 | (reg & 0x0fff));
  	return rtl_udelay_loop_wait_high(tp, &rtl_ocpar_cond, 100, 20) ?
- 		RTL_R32(OCPDR) : ~0;
+ 		RTL_R32(tp, OCPDR) : ~0;
  }
  
  static u32 r8168ep_ocp_read(struct rtl8169_private *tp, u8 mask, u16 reg)
@@@ -1328,10 -1289,8 +1289,8 @@@ static u32 ocp_read(struct rtl8169_priv
  static void r8168dp_ocp_write(struct rtl8169_private *tp, u8 mask, u16 reg,
  			      u32 data)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W32(OCPDR, data);
- 	RTL_W32(OCPAR, OCPAR_FLAG | ((u32)mask & 0x0f) << 12 | (reg & 0x0fff));
+ 	RTL_W32(tp, OCPDR, data);
+ 	RTL_W32(tp, OCPAR, OCPAR_FLAG | ((u32)mask & 0x0f) << 12 | (reg & 0x0fff));
  	rtl_udelay_loop_wait_low(tp, &rtl_ocpar_cond, 100, 20);
  }
  
@@@ -1393,19 -1352,15 +1352,15 @@@ DECLARE_RTL_COND(rtl_ep_ocp_read_cond
  
  DECLARE_RTL_COND(rtl_ocp_tx_cond)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	return RTL_R8(IBISR0) & 0x20;
+ 	return RTL_R8(tp, IBISR0) & 0x20;
  }
  
  static void rtl8168ep_stop_cmac(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W8(IBCR2, RTL_R8(IBCR2) & ~0x01);
+ 	RTL_W8(tp, IBCR2, RTL_R8(tp, IBCR2) & ~0x01);
  	rtl_msleep_loop_wait_high(tp, &rtl_ocp_tx_cond, 50, 2000);
- 	RTL_W8(IBISR0, RTL_R8(IBISR0) | 0x20);
- 	RTL_W8(IBCR0, RTL_R8(IBCR0) & ~0x01);
+ 	RTL_W8(tp, IBISR0, RTL_R8(tp, IBISR0) | 0x20);
+ 	RTL_W8(tp, IBCR0, RTL_R8(tp, IBCR0) & ~0x01);
  }
  
  static void rtl8168dp_driver_start(struct rtl8169_private *tp)
@@@ -1473,19 -1428,19 +1428,19 @@@ static void rtl8168_driver_stop(struct 
  	}
  }
  
- static int r8168dp_check_dash(struct rtl8169_private *tp)
+ static bool r8168dp_check_dash(struct rtl8169_private *tp)
  {
  	u16 reg = rtl8168_get_ocp_reg(tp);
  
- 	return (ocp_read(tp, 0x0f, reg) & 0x00008000) ? 1 : 0;
+ 	return !!(ocp_read(tp, 0x0f, reg) & 0x00008000);
  }
  
- static int r8168ep_check_dash(struct rtl8169_private *tp)
+ static bool r8168ep_check_dash(struct rtl8169_private *tp)
  {
- 	return (ocp_read(tp, 0x0f, 0x128) & 0x00000001) ? 1 : 0;
+ 	return !!(ocp_read(tp, 0x0f, 0x128) & 0x00000001);
  }
  
- static int r8168_check_dash(struct rtl8169_private *tp)
+ static bool r8168_check_dash(struct rtl8169_private *tp)
  {
  	switch (tp->mac_version) {
  	case RTL_GIGA_MAC_VER_27:
@@@ -1497,7 -1452,7 +1452,7 @@@
  	case RTL_GIGA_MAC_VER_51:
  		return r8168ep_check_dash(tp);
  	default:
- 		return 0;
+ 		return false;
  	}
  }
  
@@@ -1518,49 -1473,37 +1473,37 @@@ static void rtl_write_exgmac_batch(stru
  
  DECLARE_RTL_COND(rtl_efusear_cond)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	return RTL_R32(EFUSEAR) & EFUSEAR_FLAG;
+ 	return RTL_R32(tp, EFUSEAR) & EFUSEAR_FLAG;
  }
  
  static u8 rtl8168d_efuse_read(struct rtl8169_private *tp, int reg_addr)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W32(EFUSEAR, (reg_addr & EFUSEAR_REG_MASK) << EFUSEAR_REG_SHIFT);
+ 	RTL_W32(tp, EFUSEAR, (reg_addr & EFUSEAR_REG_MASK) << EFUSEAR_REG_SHIFT);
  
  	return rtl_udelay_loop_wait_high(tp, &rtl_efusear_cond, 100, 300) ?
- 		RTL_R32(EFUSEAR) & EFUSEAR_DATA_MASK : ~0;
+ 		RTL_R32(tp, EFUSEAR) & EFUSEAR_DATA_MASK : ~0;
  }
  
  static u16 rtl_get_events(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	return RTL_R16(IntrStatus);
+ 	return RTL_R16(tp, IntrStatus);
  }
  
  static void rtl_ack_events(struct rtl8169_private *tp, u16 bits)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W16(IntrStatus, bits);
+ 	RTL_W16(tp, IntrStatus, bits);
  	mmiowb();
  }
  
  static void rtl_irq_disable(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W16(IntrMask, 0);
+ 	RTL_W16(tp, IntrMask, 0);
  	mmiowb();
  }
  
  static void rtl_irq_enable(struct rtl8169_private *tp, u16 bits)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W16(IntrMask, bits);
+ 	RTL_W16(tp, IntrMask, bits);
  }
  
  #define RTL_EVENT_NAPI_RX	(RxOK | RxErr)
@@@ -1574,18 -1517,14 +1517,14 @@@ static void rtl_irq_enable_all(struct r
  
  static void rtl8169_irq_mask_and_ack(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	rtl_irq_disable(tp);
  	rtl_ack_events(tp, RTL_EVENT_NAPI | tp->event_slow);
- 	RTL_R8(ChipCmd);
+ 	RTL_R8(tp, ChipCmd);
  }
  
  static unsigned int rtl8169_tbi_reset_pending(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	return RTL_R32(TBICSR) & TBIReset;
+ 	return RTL_R32(tp, TBICSR) & TBIReset;
  }
  
  static unsigned int rtl8169_xmii_reset_pending(struct rtl8169_private *tp)
@@@ -1593,21 -1532,19 +1532,19 @@@
  	return rtl_readphy(tp, MII_BMCR) & BMCR_RESET;
  }
  
- static unsigned int rtl8169_tbi_link_ok(void __iomem *ioaddr)
+ static unsigned int rtl8169_tbi_link_ok(struct rtl8169_private *tp)
  {
- 	return RTL_R32(TBICSR) & TBILinkOk;
+ 	return RTL_R32(tp, TBICSR) & TBILinkOk;
  }
  
- static unsigned int rtl8169_xmii_link_ok(void __iomem *ioaddr)
+ static unsigned int rtl8169_xmii_link_ok(struct rtl8169_private *tp)
  {
- 	return RTL_R8(PHYstatus) & LinkStatus;
+ 	return RTL_R8(tp, PHYstatus) & LinkStatus;
  }
  
  static void rtl8169_tbi_reset_enable(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W32(TBICSR, RTL_R32(TBICSR) | TBIReset);
+ 	RTL_W32(tp, TBICSR, RTL_R32(tp, TBICSR) | TBIReset);
  }
  
  static void rtl8169_xmii_reset_enable(struct rtl8169_private *tp)
@@@ -1620,7 -1557,6 +1557,6 @@@
  
  static void rtl_link_chg_patch(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
  	struct net_device *dev = tp->dev;
  
  	if (!netif_running(dev))
@@@ -1628,12 -1564,12 +1564,12 @@@
  
  	if (tp->mac_version == RTL_GIGA_MAC_VER_34 ||
  	    tp->mac_version == RTL_GIGA_MAC_VER_38) {
- 		if (RTL_R8(PHYstatus) & _1000bpsF) {
+ 		if (RTL_R8(tp, PHYstatus) & _1000bpsF) {
  			rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x00000011,
  				      ERIAR_EXGMAC);
  			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x00000005,
  				      ERIAR_EXGMAC);
- 		} else if (RTL_R8(PHYstatus) & _100bps) {
+ 		} else if (RTL_R8(tp, PHYstatus) & _100bps) {
  			rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x0000001f,
  				      ERIAR_EXGMAC);
  			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x00000005,
@@@ -1651,7 -1587,7 +1587,7 @@@
  			     ERIAR_EXGMAC);
  	} else if (tp->mac_version == RTL_GIGA_MAC_VER_35 ||
  		   tp->mac_version == RTL_GIGA_MAC_VER_36) {
- 		if (RTL_R8(PHYstatus) & _1000bpsF) {
+ 		if (RTL_R8(tp, PHYstatus) & _1000bpsF) {
  			rtl_eri_write(tp, 0x1bc, ERIAR_MASK_1111, 0x00000011,
  				      ERIAR_EXGMAC);
  			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_1111, 0x00000005,
@@@ -1663,7 -1599,7 +1599,7 @@@
  				      ERIAR_EXGMAC);
  		}
  	} else if (tp->mac_version == RTL_GIGA_MAC_VER_37) {
- 		if (RTL_R8(PHYstatus) & _10bps) {
+ 		if (RTL_R8(tp, PHYstatus) & _10bps) {
  			rtl_eri_write(tp, 0x1d0, ERIAR_MASK_0011, 0x4d02,
  				      ERIAR_EXGMAC);
  			rtl_eri_write(tp, 0x1dc, ERIAR_MASK_0011, 0x0060,
@@@ -1676,20 -1612,21 +1612,21 @@@
  }
  
  static void rtl8169_check_link_status(struct net_device *dev,
- 				      struct rtl8169_private *tp,
- 				      void __iomem *ioaddr)
+ 				      struct rtl8169_private *tp)
  {
- 	if (tp->link_ok(ioaddr)) {
+ 	struct device *d = tp_to_dev(tp);
+ 
+ 	if (tp->link_ok(tp)) {
  		rtl_link_chg_patch(tp);
  		/* This is to cancel a scheduled suspend if there's one. */
- 		pm_request_resume(&tp->pci_dev->dev);
+ 		pm_request_resume(d);
  		netif_carrier_on(dev);
  		if (net_ratelimit())
  			netif_info(tp, ifup, dev, "link up\n");
  	} else {
  		netif_carrier_off(dev);
  		netif_info(tp, ifdown, dev, "link down\n");
- 		pm_runtime_idle(&tp->pci_dev->dev);
+ 		pm_runtime_idle(d);
  	}
  }
  
@@@ -1697,15 -1634,14 +1634,14 @@@
  
  static u32 __rtl8169_get_wol(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
  	u8 options;
  	u32 wolopts = 0;
  
- 	options = RTL_R8(Config1);
+ 	options = RTL_R8(tp, Config1);
  	if (!(options & PMEnable))
  		return 0;
  
- 	options = RTL_R8(Config3);
+ 	options = RTL_R8(tp, Config3);
  	if (options & LinkUp)
  		wolopts |= WAKE_PHY;
  	switch (tp->mac_version) {
@@@ -1735,7 -1671,7 +1671,7 @@@
  		break;
  	}
  
- 	options = RTL_R8(Config5);
+ 	options = RTL_R8(tp, Config5);
  	if (options & UWF)
  		wolopts |= WAKE_UCAST;
  	if (options & BWF)
@@@ -1749,7 -1685,7 +1685,7 @@@
  static void rtl8169_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
- 	struct device *d = &tp->pci_dev->dev;
+ 	struct device *d = tp_to_dev(tp);
  
  	pm_runtime_get_noresume(d);
  
@@@ -1768,7 -1704,6 +1704,6 @@@
  
  static void __rtl8169_set_wol(struct rtl8169_private *tp, u32 wolopts)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
  	unsigned int i, tmp;
  	static const struct {
  		u32 opt;
@@@ -1784,7 -1719,7 +1719,7 @@@
  	};
  	u8 options;
  
- 	RTL_W8(Cfg9346, Cfg9346_Unlock);
+ 	RTL_W8(tp, Cfg9346, Cfg9346_Unlock);
  
  	switch (tp->mac_version) {
  	case RTL_GIGA_MAC_VER_34:
@@@ -1826,43 -1761,39 +1761,39 @@@
  	}
  
  	for (i = 0; i < tmp; i++) {
- 		options = RTL_R8(cfg[i].reg) & ~cfg[i].mask;
+ 		options = RTL_R8(tp, cfg[i].reg) & ~cfg[i].mask;
  		if (wolopts & cfg[i].opt)
  			options |= cfg[i].mask;
- 		RTL_W8(cfg[i].reg, options);
+ 		RTL_W8(tp, cfg[i].reg, options);
  	}
  
  	switch (tp->mac_version) {
  	case RTL_GIGA_MAC_VER_01 ... RTL_GIGA_MAC_VER_17:
- 		options = RTL_R8(Config1) & ~PMEnable;
+ 		options = RTL_R8(tp, Config1) & ~PMEnable;
  		if (wolopts)
  			options |= PMEnable;
- 		RTL_W8(Config1, options);
+ 		RTL_W8(tp, Config1, options);
  		break;
  	default:
- 		options = RTL_R8(Config2) & ~PME_SIGNAL;
+ 		options = RTL_R8(tp, Config2) & ~PME_SIGNAL;
  		if (wolopts)
  			options |= PME_SIGNAL;
- 		RTL_W8(Config2, options);
+ 		RTL_W8(tp, Config2, options);
  		break;
  	}
  
- 	RTL_W8(Cfg9346, Cfg9346_Lock);
+ 	RTL_W8(tp, Cfg9346, Cfg9346_Lock);
  }
  
  static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
- 	struct device *d = &tp->pci_dev->dev;
+ 	struct device *d = tp_to_dev(tp);
  
  	pm_runtime_get_noresume(d);
  
  	rtl_lock_work(tp);
  
- 	if (wol->wolopts)
- 		tp->features |= RTL_FEATURE_WOL;
- 	else
- 		tp->features &= ~RTL_FEATURE_WOL;
  	if (pm_runtime_active(d))
  		__rtl8169_set_wol(tp, wol->wolopts);
  	else
@@@ -1870,7 -1801,7 +1801,7 @@@
  
  	rtl_unlock_work(tp);
  
- 	device_set_wakeup_enable(&tp->pci_dev->dev, wol->wolopts);
+ 	device_set_wakeup_enable(d, wol->wolopts);
  
  	pm_runtime_put_noidle(d);
  
@@@ -1906,16 -1837,15 +1837,15 @@@ static int rtl8169_set_speed_tbi(struc
  				 u8 autoneg, u16 speed, u8 duplex, u32 ignored)
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
- 	void __iomem *ioaddr = tp->mmio_addr;
  	int ret = 0;
  	u32 reg;
  
- 	reg = RTL_R32(TBICSR);
+ 	reg = RTL_R32(tp, TBICSR);
  	if ((autoneg == AUTONEG_DISABLE) && (speed == SPEED_1000) &&
  	    (duplex == DUPLEX_FULL)) {
- 		RTL_W32(TBICSR, reg & ~(TBINwEnable | TBINwRestart));
+ 		RTL_W32(tp, TBICSR, reg & ~(TBINwEnable | TBINwRestart));
  	} else if (autoneg == AUTONEG_ENABLE)
- 		RTL_W32(TBICSR, reg | TBINwEnable | TBINwRestart);
+ 		RTL_W32(tp, TBICSR, reg | TBINwEnable | TBINwRestart);
  	else {
  		netif_warn(tp, link, dev,
  			   "incorrect speed setting refused in TBI mode\n");
@@@ -2040,16 -1970,15 +1970,15 @@@ static void __rtl8169_set_features(stru
  				   netdev_features_t features)
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
- 	void __iomem *ioaddr = tp->mmio_addr;
  	u32 rx_config;
  
- 	rx_config = RTL_R32(RxConfig);
+ 	rx_config = RTL_R32(tp, RxConfig);
  	if (features & NETIF_F_RXALL)
  		rx_config |= (AcceptErr | AcceptRunt);
  	else
  		rx_config &= ~(AcceptErr | AcceptRunt);
  
- 	RTL_W32(RxConfig, rx_config);
+ 	RTL_W32(tp, RxConfig, rx_config);
  
  	if (features & NETIF_F_RXCSUM)
  		tp->cp_cmd |= RxChkSum;
@@@ -2061,10 -1990,10 +1990,10 @@@
  	else
  		tp->cp_cmd &= ~RxVlan;
  
- 	tp->cp_cmd |= RTL_R16(CPlusCmd) & ~(RxVlan | RxChkSum);
+ 	tp->cp_cmd |= RTL_R16(tp, CPlusCmd) & ~(RxVlan | RxChkSum);
  
- 	RTL_W16(CPlusCmd, tp->cp_cmd);
- 	RTL_R16(CPlusCmd);
+ 	RTL_W16(tp, CPlusCmd, tp->cp_cmd);
+ 	RTL_R16(tp, CPlusCmd);
  }
  
  static int rtl8169_set_features(struct net_device *dev,
@@@ -2101,7 -2030,6 +2030,6 @@@ static int rtl8169_get_link_ksettings_t
  					  struct ethtool_link_ksettings *cmd)
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
- 	void __iomem *ioaddr = tp->mmio_addr;
  	u32 status;
  	u32 supported, advertising;
  
@@@ -2109,7 -2037,7 +2037,7 @@@
  		SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_FIBRE;
  	cmd->base.port = PORT_FIBRE;
  
- 	status = RTL_R32(TBICSR);
+ 	status = RTL_R32(tp, TBICSR);
  	advertising = (status & TBINwEnable) ?  ADVERTISED_Autoneg : 0;
  	cmd->base.autoneg = !!(status & TBINwEnable);
  
@@@ -2224,23 -2152,20 +2152,20 @@@ static int rtl8169_get_sset_count(struc
  
  DECLARE_RTL_COND(rtl_counters_cond)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	return RTL_R32(CounterAddrLow) & (CounterReset | CounterDump);
+ 	return RTL_R32(tp, CounterAddrLow) & (CounterReset | CounterDump);
  }
  
  static bool rtl8169_do_counters(struct net_device *dev, u32 counter_cmd)
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
- 	void __iomem *ioaddr = tp->mmio_addr;
  	dma_addr_t paddr = tp->counters_phys_addr;
  	u32 cmd;
  
- 	RTL_W32(CounterAddrHigh, (u64)paddr >> 32);
- 	RTL_R32(CounterAddrHigh);
+ 	RTL_W32(tp, CounterAddrHigh, (u64)paddr >> 32);
+ 	RTL_R32(tp, CounterAddrHigh);
  	cmd = (u64)paddr & DMA_BIT_MASK(32);
- 	RTL_W32(CounterAddrLow, cmd);
- 	RTL_W32(CounterAddrLow, cmd | counter_cmd);
+ 	RTL_W32(tp, CounterAddrLow, cmd);
+ 	RTL_W32(tp, CounterAddrLow, cmd | counter_cmd);
  
  	return rtl_udelay_loop_wait_low(tp, &rtl_counters_cond, 10, 1000);
  }
@@@ -2262,13 -2187,12 +2187,12 @@@ static bool rtl8169_reset_counters(stru
  static bool rtl8169_update_counters(struct net_device *dev)
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
- 	void __iomem *ioaddr = tp->mmio_addr;
  
  	/*
  	 * Some chips are unable to dump tally counters when the receiver
  	 * is disabled.
  	 */
- 	if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0)
+ 	if ((RTL_R8(tp, ChipCmd) & CmdRxEnb) == 0)
  		return true;
  
  	return rtl8169_do_counters(dev, CounterDump);
@@@ -2317,7 -2241,7 +2241,7 @@@ static void rtl8169_get_ethtool_stats(s
  				      struct ethtool_stats *stats, u64 *data)
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
- 	struct device *d = &tp->pci_dev->dev;
+ 	struct device *d = tp_to_dev(tp);
  	struct rtl8169_counters *counters = tp->counters;
  
  	ASSERT_RTNL();
@@@ -2448,7 -2372,6 +2372,6 @@@ static const struct rtl_coalesce_info *
  static int rtl_get_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
- 	void __iomem *ioaddr = tp->mmio_addr;
  	const struct rtl_coalesce_info *ci;
  	const struct rtl_coalesce_scale *scale;
  	struct {
@@@ -2468,10 -2391,10 +2391,10 @@@
  	if (IS_ERR(ci))
  		return PTR_ERR(ci);
  
- 	scale = &ci->scalev[RTL_R16(CPlusCmd) & 3];
+ 	scale = &ci->scalev[RTL_R16(tp, CPlusCmd) & 3];
  
  	/* read IntrMitigate and adjust according to scale */
- 	for (w = RTL_R16(IntrMitigate); w; w >>= RTL_COALESCE_SHIFT, p++) {
+ 	for (w = RTL_R16(tp, IntrMitigate); w; w >>= RTL_COALESCE_SHIFT, p++) {
  		*p->max_frames = (w & RTL_COALESCE_MASK) << 2;
  		w >>= RTL_COALESCE_SHIFT;
  		*p->usecs = w & RTL_COALESCE_MASK;
@@@ -2518,7 -2441,6 +2441,6 @@@ static const struct rtl_coalesce_scale 
  static int rtl_set_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
- 	void __iomem *ioaddr = tp->mmio_addr;
  	const struct rtl_coalesce_scale *scale;
  	struct {
  		u32 frames;
@@@ -2566,11 -2488,11 +2488,11 @@@
  
  	rtl_lock_work(tp);
  
- 	RTL_W16(IntrMitigate, swab16(w));
+ 	RTL_W16(tp, IntrMitigate, swab16(w));
  
  	tp->cp_cmd = (tp->cp_cmd & ~3) | cp01;
- 	RTL_W16(CPlusCmd, tp->cp_cmd);
- 	RTL_R16(CPlusCmd);
+ 	RTL_W16(tp, CPlusCmd, tp->cp_cmd);
+ 	RTL_R16(tp, CPlusCmd);
  
  	rtl_unlock_work(tp);
  
@@@ -2600,17 -2522,16 +2522,16 @@@ static const struct ethtool_ops rtl8169
  static void rtl8169_get_mac_version(struct rtl8169_private *tp,
  				    struct net_device *dev, u8 default_version)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
  	/*
  	 * The driver currently handles the 8168Bf and the 8168Be identically
  	 * but they can be identified more specifically through the test below
  	 * if needed:
  	 *
- 	 * (RTL_R32(TxConfig) & 0x700000) == 0x500000 ? 8168Bf : 8168Be
+ 	 * (RTL_R32(tp, TxConfig) & 0x700000) == 0x500000 ? 8168Bf : 8168Be
  	 *
  	 * Same thing for the 8101Eb and the 8101Ec:
  	 *
- 	 * (RTL_R32(TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
+ 	 * (RTL_R32(tp, TxConfig) & 0x700000) == 0x200000 ? 8101Eb : 8101Ec
  	 */
  	static const struct rtl_mac_info {
  		u32 mask;
@@@ -2708,7 -2629,7 +2629,7 @@@
  	const struct rtl_mac_info *p = mac_info;
  	u32 reg;
  
- 	reg = RTL_R32(TxConfig);
+ 	reg = RTL_R32(tp, TxConfig);
  	while ((reg & p->mask) != p->val)
  		p++;
  	tp->mac_version = p->mac_version;
@@@ -3805,8 -3726,6 +3726,6 @@@ static void rtl8168e_2_hw_phy_config(st
  	rtl_writephy(tp, 0x1f, 0x0005);
  	rtl_w0w1_phy(tp, 0x01, 0x0100, 0x0000);
  	rtl_writephy(tp, 0x1f, 0x0000);
- 	/* soft-reset phy */
- 	rtl_writephy(tp, MII_BMCR, BMCR_RESET | BMCR_ANENABLE | BMCR_ANRESTART);
  
  	/* Broken BIOS workaround: feed GigaMAC registers with MAC address. */
  	rtl_rar_exgmac_set(tp, tp->dev->dev_addr);
@@@ -4591,7 -4510,6 +4510,6 @@@ static void rtl_hw_phy_config(struct ne
  static void rtl_phy_work(struct rtl8169_private *tp)
  {
  	struct timer_list *timer = &tp->timer;
- 	void __iomem *ioaddr = tp->mmio_addr;
  	unsigned long timeout = RTL8169_PHY_TIMEOUT;
  
  	assert(tp->mac_version > RTL_GIGA_MAC_VER_01);
@@@ -4605,7 -4523,7 +4523,7 @@@
  		goto out_mod_timer;
  	}
  
- 	if (tp->link_ok(ioaddr))
+ 	if (tp->link_ok(tp))
  		return;
  
  	netif_dbg(tp, link, tp->dev, "PHY reset until link up\n");
@@@ -4643,21 -4561,17 +4561,17 @@@ static void rtl8169_phy_reset(struct ne
  
  static bool rtl_tbi_enabled(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	return (tp->mac_version == RTL_GIGA_MAC_VER_01) &&
- 	    (RTL_R8(PHYstatus) & TBI_Enable);
+ 	    (RTL_R8(tp, PHYstatus) & TBI_Enable);
  }
  
  static void rtl8169_init_phy(struct net_device *dev, struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	rtl_hw_phy_config(dev);
  
  	if (tp->mac_version <= RTL_GIGA_MAC_VER_06) {
  		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
- 		RTL_W8(0x82, 0x01);
+ 		RTL_W8(tp, 0x82, 0x01);
  	}
  
  	pci_write_config_byte(tp->pci_dev, PCI_LATENCY_TIMER, 0x40);
@@@ -4667,7 -4581,7 +4581,7 @@@
  
  	if (tp->mac_version == RTL_GIGA_MAC_VER_02) {
  		dprintk("Set MAC Reg C+CR Offset 0x82h = 0x01h\n");
- 		RTL_W8(0x82, 0x01);
+ 		RTL_W8(tp, 0x82, 0x01);
  		dprintk("Set PHY Reg 0x0bh = 0x00h\n");
  		rtl_writephy(tp, 0x0b, 0x0000); //w 0x0b 15 0 0
  	}
@@@ -4687,22 -4601,20 +4601,20 @@@
  
  static void rtl_rar_set(struct rtl8169_private *tp, u8 *addr)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	rtl_lock_work(tp);
  
- 	RTL_W8(Cfg9346, Cfg9346_Unlock);
+ 	RTL_W8(tp, Cfg9346, Cfg9346_Unlock);
  
- 	RTL_W32(MAC4, addr[4] | addr[5] << 8);
- 	RTL_R32(MAC4);
+ 	RTL_W32(tp, MAC4, addr[4] | addr[5] << 8);
+ 	RTL_R32(tp, MAC4);
  
- 	RTL_W32(MAC0, addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24);
- 	RTL_R32(MAC0);
+ 	RTL_W32(tp, MAC0, addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24);
+ 	RTL_R32(tp, MAC0);
  
  	if (tp->mac_version == RTL_GIGA_MAC_VER_34)
  		rtl_rar_exgmac_set(tp, addr);
  
- 	RTL_W8(Cfg9346, Cfg9346_Lock);
+ 	RTL_W8(tp, Cfg9346, Cfg9346_Lock);
  
  	rtl_unlock_work(tp);
  }
@@@ -4710,13 -4622,12 +4622,12 @@@
  static int rtl_set_mac_address(struct net_device *dev, void *p)
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
- 	struct device *d = &tp->pci_dev->dev;
- 	struct sockaddr *addr = p;
- 
- 	if (!is_valid_ether_addr(addr->sa_data))
- 		return -EADDRNOTAVAIL;
+ 	struct device *d = tp_to_dev(tp);
+ 	int ret;
  
- 	memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
+ 	ret = eth_mac_addr(dev, p);
+ 	if (ret)
+ 		return ret;
  
  	pm_runtime_get_noresume(d);
  
@@@ -4822,8 -4733,6 +4733,6 @@@ static void rtl_speed_down(struct rtl81
  
  static void rtl_wol_suspend_quirk(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	switch (tp->mac_version) {
  	case RTL_GIGA_MAC_VER_25:
  	case RTL_GIGA_MAC_VER_26:
@@@ -4847,7 -4756,7 +4756,7 @@@
  	case RTL_GIGA_MAC_VER_49:
  	case RTL_GIGA_MAC_VER_50:
  	case RTL_GIGA_MAC_VER_51:
- 		RTL_W32(RxConfig, RTL_R32(RxConfig) |
+ 		RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) |
  			AcceptBroadcast | AcceptMulticast | AcceptMyPhys);
  		break;
  	default:
@@@ -4880,8 -4789,6 +4789,6 @@@ static void r810x_phy_power_up(struct r
  
  static void r810x_pll_power_down(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	if (rtl_wol_pll_power_down(tp))
  		return;
  
@@@ -4896,15 -4803,13 +4803,13 @@@
  	case RTL_GIGA_MAC_VER_16:
  		break;
  	default:
- 		RTL_W8(PMCH, RTL_R8(PMCH) & ~0x80);
+ 		RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) & ~0x80);
  		break;
  	}
  }
  
  static void r810x_pll_power_up(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	r810x_phy_power_up(tp);
  
  	switch (tp->mac_version) {
@@@ -4917,10 -4822,10 +4822,10 @@@
  		break;
  	case RTL_GIGA_MAC_VER_47:
  	case RTL_GIGA_MAC_VER_48:
- 		RTL_W8(PMCH, RTL_R8(PMCH) | 0xc0);
+ 		RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) | 0xc0);
  		break;
  	default:
- 		RTL_W8(PMCH, RTL_R8(PMCH) | 0x80);
+ 		RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) | 0x80);
  		break;
  	}
  }
@@@ -4987,21 -4892,12 +4892,12 @@@ static void r8168_phy_power_down(struc
  
  static void r8168_pll_power_down(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	if ((tp->mac_version == RTL_GIGA_MAC_VER_27 ||
- 	     tp->mac_version == RTL_GIGA_MAC_VER_28 ||
- 	     tp->mac_version == RTL_GIGA_MAC_VER_31 ||
- 	     tp->mac_version == RTL_GIGA_MAC_VER_49 ||
- 	     tp->mac_version == RTL_GIGA_MAC_VER_50 ||
- 	     tp->mac_version == RTL_GIGA_MAC_VER_51) &&
- 	    r8168_check_dash(tp)) {
+ 	if (r8168_check_dash(tp))
  		return;
- 	}
  
  	if ((tp->mac_version == RTL_GIGA_MAC_VER_23 ||
  	     tp->mac_version == RTL_GIGA_MAC_VER_24) &&
- 	    (RTL_R16(CPlusCmd) & ASF)) {
+ 	    (RTL_R16(tp, CPlusCmd) & ASF)) {
  		return;
  	}
  
@@@ -5027,22 -4923,20 +4923,20 @@@
  	case RTL_GIGA_MAC_VER_46:
  	case RTL_GIGA_MAC_VER_50:
  	case RTL_GIGA_MAC_VER_51:
- 		RTL_W8(PMCH, RTL_R8(PMCH) & ~0x80);
+ 		RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) & ~0x80);
  		break;
  	case RTL_GIGA_MAC_VER_40:
  	case RTL_GIGA_MAC_VER_41:
  	case RTL_GIGA_MAC_VER_49:
  		rtl_w0w1_eri(tp, 0x1a8, ERIAR_MASK_1111, 0x00000000,
  			     0xfc000000, ERIAR_EXGMAC);
- 		RTL_W8(PMCH, RTL_R8(PMCH) & ~0x80);
+ 		RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) & ~0x80);
  		break;
  	}
  }
  
  static void r8168_pll_power_up(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	switch (tp->mac_version) {
  	case RTL_GIGA_MAC_VER_25:
  	case RTL_GIGA_MAC_VER_26:
@@@ -5051,19 -4945,19 +4945,19 @@@
  	case RTL_GIGA_MAC_VER_31:
  	case RTL_GIGA_MAC_VER_32:
  	case RTL_GIGA_MAC_VER_33:
- 		RTL_W8(PMCH, RTL_R8(PMCH) | 0x80);
+ 		RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) | 0x80);
  		break;
  	case RTL_GIGA_MAC_VER_44:
  	case RTL_GIGA_MAC_VER_45:
  	case RTL_GIGA_MAC_VER_46:
  	case RTL_GIGA_MAC_VER_50:
  	case RTL_GIGA_MAC_VER_51:
- 		RTL_W8(PMCH, RTL_R8(PMCH) | 0xc0);
+ 		RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) | 0xc0);
  		break;
  	case RTL_GIGA_MAC_VER_40:
  	case RTL_GIGA_MAC_VER_41:
  	case RTL_GIGA_MAC_VER_49:
- 		RTL_W8(PMCH, RTL_R8(PMCH) | 0xc0);
+ 		RTL_W8(tp, PMCH, RTL_R8(tp, PMCH) | 0xc0);
  		rtl_w0w1_eri(tp, 0x1a8, ERIAR_MASK_1111, 0xfc000000,
  			     0x00000000, ERIAR_EXGMAC);
  		break;
@@@ -5153,8 -5047,6 +5047,6 @@@ static void rtl_init_pll_power_ops(stru
  
  static void rtl_init_rxcfg(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	switch (tp->mac_version) {
  	case RTL_GIGA_MAC_VER_01:
  	case RTL_GIGA_MAC_VER_02:
@@@ -5170,7 -5062,7 +5062,7 @@@
  	case RTL_GIGA_MAC_VER_15:
  	case RTL_GIGA_MAC_VER_16:
  	case RTL_GIGA_MAC_VER_17:
- 		RTL_W32(RxConfig, RX_FIFO_THRESH | RX_DMA_BURST);
+ 		RTL_W32(tp, RxConfig, RX_FIFO_THRESH | RX_DMA_BURST);
  		break;
  	case RTL_GIGA_MAC_VER_18:
  	case RTL_GIGA_MAC_VER_19:
@@@ -5181,7 -5073,7 +5073,7 @@@
  	case RTL_GIGA_MAC_VER_24:
  	case RTL_GIGA_MAC_VER_34:
  	case RTL_GIGA_MAC_VER_35:
- 		RTL_W32(RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST);
+ 		RTL_W32(tp, RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST);
  		break;
  	case RTL_GIGA_MAC_VER_40:
  	case RTL_GIGA_MAC_VER_41:
@@@ -5195,10 -5087,10 +5087,10 @@@
  	case RTL_GIGA_MAC_VER_49:
  	case RTL_GIGA_MAC_VER_50:
  	case RTL_GIGA_MAC_VER_51:
- 		RTL_W32(RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST | RX_EARLY_OFF);
+ 		RTL_W32(tp, RxConfig, RX128_INT_EN | RX_MULTI_EN | RX_DMA_BURST | RX_EARLY_OFF);
  		break;
  	default:
- 		RTL_W32(RxConfig, RX128_INT_EN | RX_DMA_BURST);
+ 		RTL_W32(tp, RxConfig, RX128_INT_EN | RX_DMA_BURST);
  		break;
  	}
  }
@@@ -5210,102 -5102,82 +5102,82 @@@ static void rtl8169_init_ring_indexes(s
  
  static void rtl_hw_jumbo_enable(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W8(Cfg9346, Cfg9346_Unlock);
+ 	RTL_W8(tp, Cfg9346, Cfg9346_Unlock);
  	rtl_generic_op(tp, tp->jumbo_ops.enable);
- 	RTL_W8(Cfg9346, Cfg9346_Lock);
+ 	RTL_W8(tp, Cfg9346, Cfg9346_Lock);
  }
  
  static void rtl_hw_jumbo_disable(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W8(Cfg9346, Cfg9346_Unlock);
+ 	RTL_W8(tp, Cfg9346, Cfg9346_Unlock);
  	rtl_generic_op(tp, tp->jumbo_ops.disable);
- 	RTL_W8(Cfg9346, Cfg9346_Lock);
+ 	RTL_W8(tp, Cfg9346, Cfg9346_Lock);
  }
  
  static void r8168c_hw_jumbo_enable(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W8(Config3, RTL_R8(Config3) | Jumbo_En0);
- 	RTL_W8(Config4, RTL_R8(Config4) | Jumbo_En1);
- 	rtl_tx_performance_tweak(tp->pci_dev, PCI_EXP_DEVCTL_READRQ_512B);
+ 	RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
+ 	RTL_W8(tp, Config4, RTL_R8(tp, Config4) | Jumbo_En1);
+ 	rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_512B);
  }
  
  static void r8168c_hw_jumbo_disable(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W8(Config3, RTL_R8(Config3) & ~Jumbo_En0);
- 	RTL_W8(Config4, RTL_R8(Config4) & ~Jumbo_En1);
- 	rtl_tx_performance_tweak(tp->pci_dev, 0x5 << MAX_READ_REQUEST_SHIFT);
+ 	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
+ 	RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~Jumbo_En1);
+ 	rtl_tx_performance_tweak(tp, 0x5 << MAX_READ_REQUEST_SHIFT);
  }
  
  static void r8168dp_hw_jumbo_enable(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W8(Config3, RTL_R8(Config3) | Jumbo_En0);
+ 	RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
  }
  
  static void r8168dp_hw_jumbo_disable(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W8(Config3, RTL_R8(Config3) & ~Jumbo_En0);
+ 	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
  }
  
  static void r8168e_hw_jumbo_enable(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W8(MaxTxPacketSize, 0x3f);
- 	RTL_W8(Config3, RTL_R8(Config3) | Jumbo_En0);
- 	RTL_W8(Config4, RTL_R8(Config4) | 0x01);
- 	rtl_tx_performance_tweak(tp->pci_dev, PCI_EXP_DEVCTL_READRQ_512B);
+ 	RTL_W8(tp, MaxTxPacketSize, 0x3f);
+ 	RTL_W8(tp, Config3, RTL_R8(tp, Config3) | Jumbo_En0);
+ 	RTL_W8(tp, Config4, RTL_R8(tp, Config4) | 0x01);
+ 	rtl_tx_performance_tweak(tp, PCI_EXP_DEVCTL_READRQ_512B);
  }
  
  static void r8168e_hw_jumbo_disable(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W8(MaxTxPacketSize, 0x0c);
- 	RTL_W8(Config3, RTL_R8(Config3) & ~Jumbo_En0);
- 	RTL_W8(Config4, RTL_R8(Config4) & ~0x01);
- 	rtl_tx_performance_tweak(tp->pci_dev, 0x5 << MAX_READ_REQUEST_SHIFT);
+ 	RTL_W8(tp, MaxTxPacketSize, 0x0c);
+ 	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Jumbo_En0);
+ 	RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~0x01);
+ 	rtl_tx_performance_tweak(tp, 0x5 << MAX_READ_REQUEST_SHIFT);
  }
  
  static void r8168b_0_hw_jumbo_enable(struct rtl8169_private *tp)
  {
- 	rtl_tx_performance_tweak(tp->pci_dev,
+ 	rtl_tx_performance_tweak(tp,
  		PCI_EXP_DEVCTL_READRQ_512B | PCI_EXP_DEVCTL_NOSNOOP_EN);
  }
  
  static void r8168b_0_hw_jumbo_disable(struct rtl8169_private *tp)
  {
- 	rtl_tx_performance_tweak(tp->pci_dev,
+ 	rtl_tx_performance_tweak(tp,
  		(0x5 << MAX_READ_REQUEST_SHIFT) | PCI_EXP_DEVCTL_NOSNOOP_EN);
  }
  
  static void r8168b_1_hw_jumbo_enable(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	r8168b_0_hw_jumbo_enable(tp);
  
- 	RTL_W8(Config4, RTL_R8(Config4) | (1 << 0));
+ 	RTL_W8(tp, Config4, RTL_R8(tp, Config4) | (1 << 0));
  }
  
  static void r8168b_1_hw_jumbo_disable(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	r8168b_0_hw_jumbo_disable(tp);
  
- 	RTL_W8(Config4, RTL_R8(Config4) & ~(1 << 0));
+ 	RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~(1 << 0));
  }
  
  static void rtl_init_jumbo_ops(struct rtl8169_private *tp)
@@@ -5372,16 -5244,12 +5244,12 @@@
  
  DECLARE_RTL_COND(rtl_chipcmd_cond)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	return RTL_R8(ChipCmd) & CmdReset;
+ 	return RTL_R8(tp, ChipCmd) & CmdReset;
  }
  
  static void rtl_hw_reset(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W8(ChipCmd, CmdReset);
+ 	RTL_W8(tp, ChipCmd, CmdReset);
  
  	rtl_udelay_loop_wait_low(tp, &rtl_chipcmd_cond, 100, 100);
  }
@@@ -5400,7 -5268,7 +5268,7 @@@ static void rtl_request_uncached_firmwa
  	if (!rtl_fw)
  		goto err_warn;
  
- 	rc = request_firmware(&rtl_fw->fw, name, &tp->pci_dev->dev);
+ 	rc = request_firmware(&rtl_fw->fw, name, tp_to_dev(tp));
  	if (rc < 0)
  		goto err_free;
  
@@@ -5432,29 -5300,21 +5300,21 @@@ static void rtl_request_firmware(struc
  
  static void rtl_rx_close(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W32(RxConfig, RTL_R32(RxConfig) & ~RX_CONFIG_ACCEPT_MASK);
+ 	RTL_W32(tp, RxConfig, RTL_R32(tp, RxConfig) & ~RX_CONFIG_ACCEPT_MASK);
  }
  
  DECLARE_RTL_COND(rtl_npq_cond)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	return RTL_R8(TxPoll) & NPQ;
+ 	return RTL_R8(tp, TxPoll) & NPQ;
  }
  
  DECLARE_RTL_COND(rtl_txcfg_empty_cond)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	return RTL_R32(TxConfig) & TXCFG_EMPTY;
+ 	return RTL_R32(tp, TxConfig) & TXCFG_EMPTY;
  }
  
  static void rtl8169_hw_reset(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	/* Disable interrupts */
  	rtl8169_irq_mask_and_ack(tp);
  
@@@ -5481,10 -5341,10 +5341,10 @@@
  		   tp->mac_version == RTL_GIGA_MAC_VER_49 ||
  		   tp->mac_version == RTL_GIGA_MAC_VER_50 ||
  		   tp->mac_version == RTL_GIGA_MAC_VER_51) {
- 		RTL_W8(ChipCmd, RTL_R8(ChipCmd) | StopReq);
+ 		RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq);
  		rtl_udelay_loop_wait_high(tp, &rtl_txcfg_empty_cond, 100, 666);
  	} else {
- 		RTL_W8(ChipCmd, RTL_R8(ChipCmd) | StopReq);
+ 		RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) | StopReq);
  		udelay(100);
  	}
  
@@@ -5493,10 -5353,8 +5353,8 @@@
  
  static void rtl_set_rx_tx_config_registers(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	/* Set DMA burst size and Interframe Gap Time */
- 	RTL_W32(TxConfig, (TX_DMA_BURST << TxDMAShift) |
+ 	RTL_W32(tp, TxConfig, (TX_DMA_BURST << TxDMAShift) |
  		(InterFrameGap << TxInterFrameGapShift));
  }
  
@@@ -5509,36 -5367,35 +5367,35 @@@ static void rtl_hw_start(struct net_dev
  	rtl_irq_enable_all(tp);
  }
  
- static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp,
- 					 void __iomem *ioaddr)
+ static void rtl_set_rx_tx_desc_registers(struct rtl8169_private *tp)
  {
  	/*
  	 * Magic spell: some iop3xx ARM board needs the TxDescAddrHigh
  	 * register to be written before TxDescAddrLow to work.
  	 * Switching from MMIO to I/O access fixes the issue as well.
  	 */
- 	RTL_W32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr) >> 32);
- 	RTL_W32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr) & DMA_BIT_MASK(32));
- 	RTL_W32(RxDescAddrHigh, ((u64) tp->RxPhyAddr) >> 32);
- 	RTL_W32(RxDescAddrLow, ((u64) tp->RxPhyAddr) & DMA_BIT_MASK(32));
+ 	RTL_W32(tp, TxDescStartAddrHigh, ((u64) tp->TxPhyAddr) >> 32);
+ 	RTL_W32(tp, TxDescStartAddrLow, ((u64) tp->TxPhyAddr) & DMA_BIT_MASK(32));
+ 	RTL_W32(tp, RxDescAddrHigh, ((u64) tp->RxPhyAddr) >> 32);
+ 	RTL_W32(tp, RxDescAddrLow, ((u64) tp->RxPhyAddr) & DMA_BIT_MASK(32));
  }
  
- static u16 rtl_rw_cpluscmd(void __iomem *ioaddr)
+ static u16 rtl_rw_cpluscmd(struct rtl8169_private *tp)
  {
  	u16 cmd;
  
- 	cmd = RTL_R16(CPlusCmd);
- 	RTL_W16(CPlusCmd, cmd);
+ 	cmd = RTL_R16(tp, CPlusCmd);
+ 	RTL_W16(tp, CPlusCmd, cmd);
  	return cmd;
  }
  
- static void rtl_set_rx_max_size(void __iomem *ioaddr, unsigned int rx_buf_sz)
+ static void rtl_set_rx_max_size(struct rtl8169_private *tp, unsigned int rx_buf_sz)
  {
  	/* Low hurts. Let's disable the filtering. */
- 	RTL_W16(RxMaxSize, rx_buf_sz + 1);
+ 	RTL_W16(tp, RxMaxSize, rx_buf_sz + 1);
  }
  
- static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
+ static void rtl8169_set_magic_reg(struct rtl8169_private *tp, unsigned mac_version)
  {
  	static const struct rtl_cfg2_info {
  		u32 mac_version;
@@@ -5554,10 -5411,10 +5411,10 @@@
  	unsigned int i;
  	u32 clk;
  
- 	clk = RTL_R8(Config2) & PCI_Clock_66MHz;
+ 	clk = RTL_R8(tp, Config2) & PCI_Clock_66MHz;
  	for (i = 0; i < ARRAY_SIZE(cfg2_info); i++, p++) {
  		if ((p->mac_version == mac_version) && (p->clk == clk)) {
- 			RTL_W32(0x7c, p->val);
+ 			RTL_W32(tp, 0x7c, p->val);
  			break;
  		}
  	}
@@@ -5566,7 -5423,6 +5423,6 @@@
  static void rtl_set_rx_mode(struct net_device *dev)
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
- 	void __iomem *ioaddr = tp->mmio_addr;
  	u32 mc_filter[2];	/* Multicast hash filter */
  	int rx_mode;
  	u32 tmp = 0;
@@@ -5598,7 -5454,7 +5454,7 @@@
  	if (dev->features & NETIF_F_RXALL)
  		rx_mode |= (AcceptErr | AcceptRunt);
  
- 	tmp = (RTL_R32(RxConfig) & ~RX_CONFIG_ACCEPT_MASK) | rx_mode;
+ 	tmp = (RTL_R32(tp, RxConfig) & ~RX_CONFIG_ACCEPT_MASK) | rx_mode;
  
  	if (tp->mac_version > RTL_GIGA_MAC_VER_06) {
  		u32 data = mc_filter[0];
@@@ -5610,35 -5466,34 +5466,34 @@@
  	if (tp->mac_version == RTL_GIGA_MAC_VER_35)
  		mc_filter[1] = mc_filter[0] = 0xffffffff;
  
- 	RTL_W32(MAR0 + 4, mc_filter[1]);
- 	RTL_W32(MAR0 + 0, mc_filter[0]);
+ 	RTL_W32(tp, MAR0 + 4, mc_filter[1]);
+ 	RTL_W32(tp, MAR0 + 0, mc_filter[0]);
  
- 	RTL_W32(RxConfig, tmp);
+ 	RTL_W32(tp, RxConfig, tmp);
  }
  
  static void rtl_hw_start_8169(struct net_device *dev)
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
- 	void __iomem *ioaddr = tp->mmio_addr;
  	struct pci_dev *pdev = tp->pci_dev;
  
  	if (tp->mac_version == RTL_GIGA_MAC_VER_05) {
- 		RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) | PCIMulRW);
+ 		RTL_W16(tp, CPlusCmd, RTL_R16(tp, CPlusCmd) | PCIMulRW);
  		pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, 0x08);
  	}
  
- 	RTL_W8(Cfg9346, Cfg9346_Unlock);
+ 	RTL_W8(tp, Cfg9346, Cfg9346_Unlock);
  	if (tp->mac_version == RTL_GIGA_MAC_VER_01 ||
  	    tp->mac_version == RTL_GIGA_MAC_VER_02 ||
  	    tp->mac_version == RTL_GIGA_MAC_VER_03 ||
  	    tp->mac_version == RTL_GIGA_MAC_VER_04)
- 		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
+ 		RTL_W8(tp, ChipCmd, CmdTxEnb | CmdRxEnb);
  
  	rtl_init_rxcfg(tp);
  
- 	RTL_W8(EarlyTxThres, NoEarlyTx);
+ 	RTL_W8(tp, EarlyTxThres, NoEarlyTx);
  
- 	rtl_set_rx_max_size(ioaddr, rx_buf_sz);
+ 	rtl_set_rx_max_size(tp, rx_buf_sz);
  
  	if (tp->mac_version == RTL_GIGA_MAC_VER_01 ||
  	    tp->mac_version == RTL_GIGA_MAC_VER_02 ||
@@@ -5646,7 -5501,7 +5501,7 @@@
  	    tp->mac_version == RTL_GIGA_MAC_VER_04)
  		rtl_set_rx_tx_config_registers(tp);
  
- 	tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
+ 	tp->cp_cmd |= rtl_rw_cpluscmd(tp) | PCIMulRW;
  
  	if (tp->mac_version == RTL_GIGA_MAC_VER_02 ||
  	    tp->mac_version == RTL_GIGA_MAC_VER_03) {
@@@ -5655,37 -5510,37 +5510,37 @@@
  		tp->cp_cmd |= (1 << 14);
  	}
  
- 	RTL_W16(CPlusCmd, tp->cp_cmd);
+ 	RTL_W16(tp, CPlusCmd, tp->cp_cmd);
  
- 	rtl8169_set_magic_reg(ioaddr, tp->mac_version);
+ 	rtl8169_set_magic_reg(tp, tp->mac_version);
  
  	/*
  	 * Undocumented corner. Supposedly:
  	 * (TxTimer << 12) | (TxPackets << 8) | (RxTimer << 4) | RxPackets
  	 */
- 	RTL_W16(IntrMitigate, 0x0000);
+ 	RTL_W16(tp, IntrMitigate, 0x0000);
  
- 	rtl_set_rx_tx_desc_registers(tp, ioaddr);
+ 	rtl_set_rx_tx_desc_registers(tp);
  
  	if (tp->mac_version != RTL_GIGA_MAC_VER_01 &&
  	    tp->mac_version != RTL_GIGA_MAC_VER_02 &&
  	    tp->mac_version != RTL_GIGA_MAC_VER_03 &&
  	    tp->mac_version != RTL_GIGA_MAC_VER_04) {
- 		RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
+ 		RTL_W8(tp, ChipCmd, CmdTxEnb | CmdRxEnb);
  		rtl_set_rx_tx_config_registers(tp);
  	}
  
- 	RTL_W8(Cfg9346, Cfg9346_Lock);
+ 	RTL_W8(tp, Cfg9346, Cfg9346_Lock);
  
  	/* Initially a 10 us delay. Turned it into a PCI commit. - FR */
- 	RTL_R8(IntrMask);
+ 	RTL_R8(tp, IntrMask);
  
- 	RTL_W32(RxMissed, 0);
+ 	RTL_W32(tp, RxMissed, 0);
  
  	rtl_set_rx_mode(dev);
  
  	/* no early-rx interrupts */
- 	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
+ 	RTL_W16(tp, MultiIntr, RTL_R16(tp, MultiIntr) & 0xf000);
  }
  
  static void rtl_csi_write(struct rtl8169_private *tp, int addr, int value)
@@@ -5719,17 -5574,13 +5574,13 @@@ static void rtl_csi_access_enable_2(str
  
  DECLARE_RTL_COND(rtl_csiar_cond)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	return RTL_R32(CSIAR) & CSIAR_FLAG;
+ 	return RTL_R32(tp, CSIAR) & CSIAR_FLAG;
  }
  
  static void r8169_csi_write(struct rtl8169_private *tp, int addr, int value)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W32(CSIDR, value);
- 	RTL_W32(CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
+ 	RTL_W32(tp, CSIDR, value);
+ 	RTL_W32(tp, CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
  		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
  
  	rtl_udelay_loop_wait_low(tp, &rtl_csiar_cond, 10, 100);
@@@ -5737,21 -5588,17 +5588,17 @@@
  
  static u32 r8169_csi_read(struct rtl8169_private *tp, int addr)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W32(CSIAR, (addr & CSIAR_ADDR_MASK) |
+ 	RTL_W32(tp, CSIAR, (addr & CSIAR_ADDR_MASK) |
  		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
  
  	return rtl_udelay_loop_wait_high(tp, &rtl_csiar_cond, 10, 100) ?
- 		RTL_R32(CSIDR) : ~0;
+ 		RTL_R32(tp, CSIDR) : ~0;
  }
  
  static void r8402_csi_write(struct rtl8169_private *tp, int addr, int value)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W32(CSIDR, value);
- 	RTL_W32(CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
+ 	RTL_W32(tp, CSIDR, value);
+ 	RTL_W32(tp, CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
  		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT |
  		CSIAR_FUNC_NIC);
  
@@@ -5760,21 -5607,17 +5607,17 @@@
  
  static u32 r8402_csi_read(struct rtl8169_private *tp, int addr)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W32(CSIAR, (addr & CSIAR_ADDR_MASK) | CSIAR_FUNC_NIC |
+ 	RTL_W32(tp, CSIAR, (addr & CSIAR_ADDR_MASK) | CSIAR_FUNC_NIC |
  		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
  
  	return rtl_udelay_loop_wait_high(tp, &rtl_csiar_cond, 10, 100) ?
- 		RTL_R32(CSIDR) : ~0;
+ 		RTL_R32(tp, CSIDR) : ~0;
  }
  
  static void r8411_csi_write(struct rtl8169_private *tp, int addr, int value)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W32(CSIDR, value);
- 	RTL_W32(CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
+ 	RTL_W32(tp, CSIDR, value);
+ 	RTL_W32(tp, CSIAR, CSIAR_WRITE_CMD | (addr & CSIAR_ADDR_MASK) |
  		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT |
  		CSIAR_FUNC_NIC2);
  
@@@ -5783,13 -5626,11 +5626,11 @@@
  
  static u32 r8411_csi_read(struct rtl8169_private *tp, int addr)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	RTL_W32(CSIAR, (addr & CSIAR_ADDR_MASK) | CSIAR_FUNC_NIC2 |
+ 	RTL_W32(tp, CSIAR, (addr & CSIAR_ADDR_MASK) | CSIAR_FUNC_NIC2 |
  		CSIAR_BYTE_ENABLE << CSIAR_BYTE_ENABLE_SHIFT);
  
  	return rtl_udelay_loop_wait_high(tp, &rtl_csiar_cond, 10, 100) ?
- 		RTL_R32(CSIDR) : ~0;
+ 		RTL_R32(tp, CSIDR) : ~0;
  }
  
  static void rtl_init_csi_ops(struct rtl8169_private *tp)
@@@ -5851,31 -5692,30 +5692,30 @@@ static void rtl_ephy_init(struct rtl816
  	}
  }
  
- static void rtl_disable_clock_request(struct pci_dev *pdev)
+ static void rtl_disable_clock_request(struct rtl8169_private *tp)
  {
- 	pcie_capability_clear_word(pdev, PCI_EXP_LNKCTL,
+ 	pcie_capability_clear_word(tp->pci_dev, PCI_EXP_LNKCTL,
  				   PCI_EXP_LNKCTL_CLKREQ_EN);
  }
  
- static void rtl_enable_clock_request(struct pci_dev *pdev)
+ static void rtl_enable_clock_request(struct rtl8169_private *tp)
  {
- 	pcie_capability_set_word(pdev, PCI_EXP_LNKCTL,
+ 	pcie_capability_set_word(tp->pci_dev, PCI_EXP_LNKCTL,
  				 PCI_EXP_LNKCTL_CLKREQ_EN);
  }
  
  static void rtl_pcie_state_l2l3_enable(struct rtl8169_private *tp, bool enable)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
  	u8 data;
  
- 	data = RTL_R8(Config3);
+ 	data = RTL_R8(tp, Config3);
  
  	if (enable)
  		data |= Rdy_to_L23;
  	else
  		data &= ~Rdy_to_L23;
  
- 	RTL_W8(Config3, data);
+ 	RTL_W8(tp, Config3, data);
  }
  
  #define R8168_CPCMD_QUIRK_MASK (\
@@@ -5891,45 -5731,37 +5731,37 @@@
  
  static void rtl_hw_start_8168bb(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 	struct pci_dev *pdev = tp->pci_dev;
+ 	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
  
- 	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
- 
- 	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
+ 	RTL_W16(tp, CPlusCmd, RTL_R16(tp, CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
  
  	if (tp->dev->mtu <= ETH_DATA_LEN) {
- 		rtl_tx_performance_tweak(pdev, (0x5 << MAX_READ_REQUEST_SHIFT) |
+ 		rtl_tx_performance_tweak(tp, (0x5 << MAX_READ_REQUEST_SHIFT) |
  					 PCI_EXP_DEVCTL_NOSNOOP_EN);
  	}
  }
  
  static void rtl_hw_start_8168bef(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	rtl_hw_start_8168bb(tp);
  
- 	RTL_W8(MaxTxPacketSize, TxPacketMax);
+ 	RTL_W8(tp, MaxTxPacketSize, TxPacketMax);
  
- 	RTL_W8(Config4, RTL_R8(Config4) & ~(1 << 0));
+ 	RTL_W8(tp, Config4, RTL_R8(tp, Config4) & ~(1 << 0));
  }
  
  static void __rtl_hw_start_8168cp(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 	struct pci_dev *pdev = tp->pci_dev;
+ 	RTL_W8(tp, Config1, RTL_R8(tp, Config1) | Speed_down);
  
- 	RTL_W8(Config1, RTL_R8(Config1) | Speed_down);
- 
- 	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
+ 	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
  
  	if (tp->dev->mtu <= ETH_DATA_LEN)
- 		rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
+ 		rtl_tx_performance_tweak(tp, 0x5 << MAX_READ_REQUEST_SHIFT);
  
- 	rtl_disable_clock_request(pdev);
+ 	rtl_disable_clock_request(tp);
  
- 	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
+ 	RTL_W16(tp, CPlusCmd, RTL_R16(tp, CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
  }
  
  static void rtl_hw_start_8168cp_1(struct rtl8169_private *tp)
@@@ -5951,42 -5783,35 +5783,35 @@@
  
  static void rtl_hw_start_8168cp_2(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 	struct pci_dev *pdev = tp->pci_dev;
- 
  	rtl_csi_access_enable_2(tp);
  
- 	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
+ 	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
  
  	if (tp->dev->mtu <= ETH_DATA_LEN)
- 		rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
+ 		rtl_tx_performance_tweak(tp, 0x5 << MAX_READ_REQUEST_SHIFT);
  
- 	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
+ 	RTL_W16(tp, CPlusCmd, RTL_R16(tp, CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
  }
  
  static void rtl_hw_start_8168cp_3(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 	struct pci_dev *pdev = tp->pci_dev;
- 
  	rtl_csi_access_enable_2(tp);
  
- 	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
+ 	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
  
  	/* Magic. */
- 	RTL_W8(DBG_REG, 0x20);
+ 	RTL_W8(tp, DBG_REG, 0x20);
  
- 	RTL_W8(MaxTxPacketSize, TxPacketMax);
+ 	RTL_W8(tp, MaxTxPacketSize, TxPacketMax);
  
  	if (tp->dev->mtu <= ETH_DATA_LEN)
- 		rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
+ 		rtl_tx_performance_tweak(tp, 0x5 << MAX_READ_REQUEST_SHIFT);
  
- 	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
+ 	RTL_W16(tp, CPlusCmd, RTL_R16(tp, CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
  }
  
  static void rtl_hw_start_8168c_1(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
  	static const struct ephy_info e_info_8168c_1[] = {
  		{ 0x02, 0x0800,	0x1000 },
  		{ 0x03, 0,	0x0002 },
@@@ -5995,7 -5820,7 +5820,7 @@@
  
  	rtl_csi_access_enable_2(tp);
  
- 	RTL_W8(DBG_REG, 0x06 | FIX_NAK_1 | FIX_NAK_2);
+ 	RTL_W8(tp, DBG_REG, 0x06 | FIX_NAK_1 | FIX_NAK_2);
  
  	rtl_ephy_init(tp, e_info_8168c_1, ARRAY_SIZE(e_info_8168c_1));
  
@@@ -6030,40 -5855,32 +5855,32 @@@ static void rtl_hw_start_8168c_4(struc
  
  static void rtl_hw_start_8168d(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 	struct pci_dev *pdev = tp->pci_dev;
- 
  	rtl_csi_access_enable_2(tp);
  
- 	rtl_disable_clock_request(pdev);
+ 	rtl_disable_clock_request(tp);
  
- 	RTL_W8(MaxTxPacketSize, TxPacketMax);
+ 	RTL_W8(tp, MaxTxPacketSize, TxPacketMax);
  
  	if (tp->dev->mtu <= ETH_DATA_LEN)
- 		rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
+ 		rtl_tx_performance_tweak(tp, 0x5 << MAX_READ_REQUEST_SHIFT);
  
- 	RTL_W16(CPlusCmd, RTL_R16(CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
+ 	RTL_W16(tp, CPlusCmd, RTL_R16(tp, CPlusCmd) & ~R8168_CPCMD_QUIRK_MASK);
  }
  
  static void rtl_hw_start_8168dp(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 	struct pci_dev *pdev = tp->pci_dev;
- 
  	rtl_csi_access_enable_1(tp);
  
  	if (tp->dev->mtu <= ETH_DATA_LEN)
- 		rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
+ 		rtl_tx_performance_tweak(tp, 0x5 << MAX_READ_REQUEST_SHIFT);
  
- 	RTL_W8(MaxTxPacketSize, TxPacketMax);
+ 	RTL_W8(tp, MaxTxPacketSize, TxPacketMax);
  
- 	rtl_disable_clock_request(pdev);
+ 	rtl_disable_clock_request(tp);
  }
  
  static void rtl_hw_start_8168d_4(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 	struct pci_dev *pdev = tp->pci_dev;
  	static const struct ephy_info e_info_8168d_4[] = {
  		{ 0x0b, 0x0000,	0x0048 },
  		{ 0x19, 0x0020,	0x0050 },
@@@ -6072,19 -5889,17 +5889,17 @@@
  
  	rtl_csi_access_enable_1(tp);
  
- 	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
+ 	rtl_tx_performance_tweak(tp, 0x5 << MAX_READ_REQUEST_SHIFT);
  
- 	RTL_W8(MaxTxPacketSize, TxPacketMax);
+ 	RTL_W8(tp, MaxTxPacketSize, TxPacketMax);
  
  	rtl_ephy_init(tp, e_info_8168d_4, ARRAY_SIZE(e_info_8168d_4));
  
- 	rtl_enable_clock_request(pdev);
+ 	rtl_enable_clock_request(tp);
  }
  
  static void rtl_hw_start_8168e_1(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 	struct pci_dev *pdev = tp->pci_dev;
  	static const struct ephy_info e_info_8168e_1[] = {
  		{ 0x00, 0x0200,	0x0100 },
  		{ 0x00, 0x0000,	0x0004 },
@@@ -6106,23 -5921,21 +5921,21 @@@
  	rtl_ephy_init(tp, e_info_8168e_1, ARRAY_SIZE(e_info_8168e_1));
  
  	if (tp->dev->mtu <= ETH_DATA_LEN)
- 		rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
+ 		rtl_tx_performance_tweak(tp, 0x5 << MAX_READ_REQUEST_SHIFT);
  
- 	RTL_W8(MaxTxPacketSize, TxPacketMax);
+ 	RTL_W8(tp, MaxTxPacketSize, TxPacketMax);
  
- 	rtl_disable_clock_request(pdev);
+ 	rtl_disable_clock_request(tp);
  
  	/* Reset tx FIFO pointer */
- 	RTL_W32(MISC, RTL_R32(MISC) | TXPLA_RST);
- 	RTL_W32(MISC, RTL_R32(MISC) & ~TXPLA_RST);
+ 	RTL_W32(tp, MISC, RTL_R32(tp, MISC) | TXPLA_RST);
+ 	RTL_W32(tp, MISC, RTL_R32(tp, MISC) & ~TXPLA_RST);
  
- 	RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);
+ 	RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~Spi_en);
  }
  
  static void rtl_hw_start_8168e_2(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 	struct pci_dev *pdev = tp->pci_dev;
  	static const struct ephy_info e_info_8168e_2[] = {
  		{ 0x09, 0x0000,	0x0080 },
  		{ 0x19, 0x0000,	0x0224 }
@@@ -6133,7 -5946,7 +5946,7 @@@
  	rtl_ephy_init(tp, e_info_8168e_2, ARRAY_SIZE(e_info_8168e_2));
  
  	if (tp->dev->mtu <= ETH_DATA_LEN)
- 		rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
+ 		rtl_tx_performance_tweak(tp, 0x5 << MAX_READ_REQUEST_SHIFT);
  
  	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
  	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
@@@ -6144,29 -5957,26 +5957,26 @@@
  	rtl_w0w1_eri(tp, 0x1b0, ERIAR_MASK_0001, 0x10, 0x00, ERIAR_EXGMAC);
  	rtl_w0w1_eri(tp, 0x0d4, ERIAR_MASK_0011, 0x0c00, 0xff00, ERIAR_EXGMAC);
  
- 	RTL_W8(MaxTxPacketSize, EarlySize);
+ 	RTL_W8(tp, MaxTxPacketSize, EarlySize);
  
- 	rtl_disable_clock_request(pdev);
+ 	rtl_disable_clock_request(tp);
  
- 	RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
- 	RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB);
+ 	RTL_W32(tp, TxConfig, RTL_R32(tp, TxConfig) | TXCFG_AUTO_FIFO);
+ 	RTL_W8(tp, MCU, RTL_R8(tp, MCU) & ~NOW_IS_OOB);
  
  	/* Adjust EEE LED frequency */
- 	RTL_W8(EEE_LED, RTL_R8(EEE_LED) & ~0x07);
+ 	RTL_W8(tp, EEE_LED, RTL_R8(tp, EEE_LED) & ~0x07);
  
- 	RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
- 	RTL_W32(MISC, RTL_R32(MISC) | PWM_EN);
- 	RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);
+ 	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) | PFM_EN);
+ 	RTL_W32(tp, MISC, RTL_R32(tp, MISC) | PWM_EN);
+ 	RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~Spi_en);
  }
  
  static void rtl_hw_start_8168f(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 	struct pci_dev *pdev = tp->pci_dev;
- 
  	rtl_csi_access_enable_2(tp);
  
- 	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
+ 	rtl_tx_performance_tweak(tp, 0x5 << MAX_READ_REQUEST_SHIFT);
  
  	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
  	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
@@@ -6179,20 -5989,19 +5989,19 @@@
  	rtl_eri_write(tp, 0xcc, ERIAR_MASK_1111, 0x00000050, ERIAR_EXGMAC);
  	rtl_eri_write(tp, 0xd0, ERIAR_MASK_1111, 0x00000060, ERIAR_EXGMAC);
  
- 	RTL_W8(MaxTxPacketSize, EarlySize);
+ 	RTL_W8(tp, MaxTxPacketSize, EarlySize);
  
- 	rtl_disable_clock_request(pdev);
+ 	rtl_disable_clock_request(tp);
  
- 	RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
- 	RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB);
- 	RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
- 	RTL_W32(MISC, RTL_R32(MISC) | PWM_EN);
- 	RTL_W8(Config5, RTL_R8(Config5) & ~Spi_en);
+ 	RTL_W32(tp, TxConfig, RTL_R32(tp, TxConfig) | TXCFG_AUTO_FIFO);
+ 	RTL_W8(tp, MCU, RTL_R8(tp, MCU) & ~NOW_IS_OOB);
+ 	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) | PFM_EN);
+ 	RTL_W32(tp, MISC, RTL_R32(tp, MISC) | PWM_EN);
+ 	RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~Spi_en);
  }
  
  static void rtl_hw_start_8168f_1(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
  	static const struct ephy_info e_info_8168f_1[] = {
  		{ 0x06, 0x00c0,	0x0020 },
  		{ 0x08, 0x0001,	0x0002 },
@@@ -6207,7 -6016,7 +6016,7 @@@
  	rtl_w0w1_eri(tp, 0x0d4, ERIAR_MASK_0011, 0x0c00, 0xff00, ERIAR_EXGMAC);
  
  	/* Adjust EEE LED frequency */
- 	RTL_W8(EEE_LED, RTL_R8(EEE_LED) & ~0x07);
+ 	RTL_W8(tp, EEE_LED, RTL_R8(tp, EEE_LED) & ~0x07);
  }
  
  static void rtl_hw_start_8411(struct rtl8169_private *tp)
@@@ -6229,10 -6038,7 +6038,7 @@@
  
  static void rtl_hw_start_8168g(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 	struct pci_dev *pdev = tp->pci_dev;
- 
- 	RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
+ 	RTL_W32(tp, TxConfig, RTL_R32(tp, TxConfig) | TXCFG_AUTO_FIFO);
  
  	rtl_eri_write(tp, 0xc8, ERIAR_MASK_0101, 0x080002, ERIAR_EXGMAC);
  	rtl_eri_write(tp, 0xcc, ERIAR_MASK_0001, 0x38, ERIAR_EXGMAC);
@@@ -6241,20 -6047,20 +6047,20 @@@
  
  	rtl_csi_access_enable_1(tp);
  
- 	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
+ 	rtl_tx_performance_tweak(tp, 0x5 << MAX_READ_REQUEST_SHIFT);
  
  	rtl_w0w1_eri(tp, 0xdc, ERIAR_MASK_0001, 0x00, 0x01, ERIAR_EXGMAC);
  	rtl_w0w1_eri(tp, 0xdc, ERIAR_MASK_0001, 0x01, 0x00, ERIAR_EXGMAC);
  	rtl_eri_write(tp, 0x2f8, ERIAR_MASK_0011, 0x1d8f, ERIAR_EXGMAC);
  
- 	RTL_W32(MISC, RTL_R32(MISC) & ~RXDV_GATED_EN);
- 	RTL_W8(MaxTxPacketSize, EarlySize);
+ 	RTL_W32(tp, MISC, RTL_R32(tp, MISC) & ~RXDV_GATED_EN);
+ 	RTL_W8(tp, MaxTxPacketSize, EarlySize);
  
  	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
  	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
  
  	/* Adjust EEE LED frequency */
- 	RTL_W8(EEE_LED, RTL_R8(EEE_LED) & ~0x07);
+ 	RTL_W8(tp, EEE_LED, RTL_R8(tp, EEE_LED) & ~0x07);
  
  	rtl_w0w1_eri(tp, 0x2fc, ERIAR_MASK_0001, 0x01, 0x06, ERIAR_EXGMAC);
  	rtl_w0w1_eri(tp, 0x1b0, ERIAR_MASK_0011, 0x0000, 0x1000, ERIAR_EXGMAC);
@@@ -6264,7 -6070,6 +6070,6 @@@
  
  static void rtl_hw_start_8168g_1(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
  	static const struct ephy_info e_info_8168g_1[] = {
  		{ 0x00, 0x0000,	0x0008 },
  		{ 0x0c, 0x37d0,	0x0820 },
@@@ -6275,14 -6080,13 +6080,13 @@@
  	rtl_hw_start_8168g(tp);
  
  	/* disable aspm and clock request before access ephy */
- 	RTL_W8(Config2, RTL_R8(Config2) & ~ClkReqEn);
- 	RTL_W8(Config5, RTL_R8(Config5) & ~ASPM_en);
+ 	RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~ClkReqEn);
+ 	RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~ASPM_en);
  	rtl_ephy_init(tp, e_info_8168g_1, ARRAY_SIZE(e_info_8168g_1));
  }
  
  static void rtl_hw_start_8168g_2(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
  	static const struct ephy_info e_info_8168g_2[] = {
  		{ 0x00, 0x0000,	0x0008 },
  		{ 0x0c, 0x3df0,	0x0200 },
@@@ -6293,14 -6097,13 +6097,13 @@@
  	rtl_hw_start_8168g(tp);
  
  	/* disable aspm and clock request before access ephy */
- 	RTL_W8(Config2, RTL_R8(Config2) & ~ClkReqEn);
- 	RTL_W8(Config5, RTL_R8(Config5) & ~ASPM_en);
+ 	RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~ClkReqEn);
+ 	RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~ASPM_en);
  	rtl_ephy_init(tp, e_info_8168g_2, ARRAY_SIZE(e_info_8168g_2));
  }
  
  static void rtl_hw_start_8411_2(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
  	static const struct ephy_info e_info_8411_2[] = {
  		{ 0x00, 0x0000,	0x0008 },
  		{ 0x0c, 0x3df0,	0x0200 },
@@@ -6312,15 -6115,13 +6115,13 @@@
  	rtl_hw_start_8168g(tp);
  
  	/* disable aspm and clock request before access ephy */
- 	RTL_W8(Config2, RTL_R8(Config2) & ~ClkReqEn);
- 	RTL_W8(Config5, RTL_R8(Config5) & ~ASPM_en);
+ 	RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~ClkReqEn);
+ 	RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~ASPM_en);
  	rtl_ephy_init(tp, e_info_8411_2, ARRAY_SIZE(e_info_8411_2));
  }
  
  static void rtl_hw_start_8168h_1(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 	struct pci_dev *pdev = tp->pci_dev;
  	int rg_saw_cnt;
  	u32 data;
  	static const struct ephy_info e_info_8168h_1[] = {
@@@ -6333,11 -6134,11 +6134,11 @@@
  	};
  
  	/* disable aspm and clock request before access ephy */
- 	RTL_W8(Config2, RTL_R8(Config2) & ~ClkReqEn);
- 	RTL_W8(Config5, RTL_R8(Config5) & ~ASPM_en);
+ 	RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~ClkReqEn);
+ 	RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~ASPM_en);
  	rtl_ephy_init(tp, e_info_8168h_1, ARRAY_SIZE(e_info_8168h_1));
  
- 	RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
+ 	RTL_W32(tp, TxConfig, RTL_R32(tp, TxConfig) | TXCFG_AUTO_FIFO);
  
  	rtl_eri_write(tp, 0xc8, ERIAR_MASK_0101, 0x00080002, ERIAR_EXGMAC);
  	rtl_eri_write(tp, 0xcc, ERIAR_MASK_0001, 0x38, ERIAR_EXGMAC);
@@@ -6346,7 -6147,7 +6147,7 @@@
  
  	rtl_csi_access_enable_1(tp);
  
- 	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
+ 	rtl_tx_performance_tweak(tp, 0x5 << MAX_READ_REQUEST_SHIFT);
  
  	rtl_w0w1_eri(tp, 0xdc, ERIAR_MASK_0001, 0x00, 0x01, ERIAR_EXGMAC);
  	rtl_w0w1_eri(tp, 0xdc, ERIAR_MASK_0001, 0x01, 0x00, ERIAR_EXGMAC);
@@@ -6357,19 -6158,19 +6158,19 @@@
  
  	rtl_eri_write(tp, 0x5f0, ERIAR_MASK_0011, 0x4f87, ERIAR_EXGMAC);
  
- 	RTL_W32(MISC, RTL_R32(MISC) & ~RXDV_GATED_EN);
- 	RTL_W8(MaxTxPacketSize, EarlySize);
+ 	RTL_W32(tp, MISC, RTL_R32(tp, MISC) & ~RXDV_GATED_EN);
+ 	RTL_W8(tp, MaxTxPacketSize, EarlySize);
  
  	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
  	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
  
  	/* Adjust EEE LED frequency */
- 	RTL_W8(EEE_LED, RTL_R8(EEE_LED) & ~0x07);
+ 	RTL_W8(tp, EEE_LED, RTL_R8(tp, EEE_LED) & ~0x07);
  
- 	RTL_W8(DLLPR, RTL_R8(DLLPR) & ~PFM_EN);
- 	RTL_W8(MISC_1, RTL_R8(MISC_1) & ~PFM_D3COLD_EN);
+ 	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) & ~PFM_EN);
+ 	RTL_W8(tp, MISC_1, RTL_R8(tp, MISC_1) & ~PFM_D3COLD_EN);
  
- 	RTL_W8(DLLPR, RTL_R8(DLLPR) & ~TX_10M_PS_EN);
+ 	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) & ~TX_10M_PS_EN);
  
  	rtl_w0w1_eri(tp, 0x1b0, ERIAR_MASK_0011, 0x0000, 0x1000, ERIAR_EXGMAC);
  
@@@ -6417,12 -6218,9 +6218,9 @@@
  
  static void rtl_hw_start_8168ep(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 	struct pci_dev *pdev = tp->pci_dev;
- 
  	rtl8168ep_stop_cmac(tp);
  
- 	RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
+ 	RTL_W32(tp, TxConfig, RTL_R32(tp, TxConfig) | TXCFG_AUTO_FIFO);
  
  	rtl_eri_write(tp, 0xc8, ERIAR_MASK_0101, 0x00080002, ERIAR_EXGMAC);
  	rtl_eri_write(tp, 0xcc, ERIAR_MASK_0001, 0x2f, ERIAR_EXGMAC);
@@@ -6431,7 -6229,7 +6229,7 @@@
  
  	rtl_csi_access_enable_1(tp);
  
- 	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
+ 	rtl_tx_performance_tweak(tp, 0x5 << MAX_READ_REQUEST_SHIFT);
  
  	rtl_w0w1_eri(tp, 0xdc, ERIAR_MASK_0001, 0x00, 0x01, ERIAR_EXGMAC);
  	rtl_w0w1_eri(tp, 0xdc, ERIAR_MASK_0001, 0x01, 0x00, ERIAR_EXGMAC);
@@@ -6440,25 -6238,24 +6238,24 @@@
  
  	rtl_eri_write(tp, 0x5f0, ERIAR_MASK_0011, 0x4f87, ERIAR_EXGMAC);
  
- 	RTL_W32(MISC, RTL_R32(MISC) & ~RXDV_GATED_EN);
- 	RTL_W8(MaxTxPacketSize, EarlySize);
+ 	RTL_W32(tp, MISC, RTL_R32(tp, MISC) & ~RXDV_GATED_EN);
+ 	RTL_W8(tp, MaxTxPacketSize, EarlySize);
  
  	rtl_eri_write(tp, 0xc0, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
  	rtl_eri_write(tp, 0xb8, ERIAR_MASK_0011, 0x0000, ERIAR_EXGMAC);
  
  	/* Adjust EEE LED frequency */
- 	RTL_W8(EEE_LED, RTL_R8(EEE_LED) & ~0x07);
+ 	RTL_W8(tp, EEE_LED, RTL_R8(tp, EEE_LED) & ~0x07);
  
  	rtl_w0w1_eri(tp, 0x2fc, ERIAR_MASK_0001, 0x01, 0x06, ERIAR_EXGMAC);
  
- 	RTL_W8(DLLPR, RTL_R8(DLLPR) & ~TX_10M_PS_EN);
+ 	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) & ~TX_10M_PS_EN);
  
  	rtl_pcie_state_l2l3_enable(tp, false);
  }
  
  static void rtl_hw_start_8168ep_1(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
  	static const struct ephy_info e_info_8168ep_1[] = {
  		{ 0x00, 0xffff,	0x10ab },
  		{ 0x06, 0xffff,	0xf030 },
@@@ -6468,8 -6265,8 +6265,8 @@@
  	};
  
  	/* disable aspm and clock request before access ephy */
- 	RTL_W8(Config2, RTL_R8(Config2) & ~ClkReqEn);
- 	RTL_W8(Config5, RTL_R8(Config5) & ~ASPM_en);
+ 	RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~ClkReqEn);
+ 	RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~ASPM_en);
  	rtl_ephy_init(tp, e_info_8168ep_1, ARRAY_SIZE(e_info_8168ep_1));
  
  	rtl_hw_start_8168ep(tp);
@@@ -6477,7 -6274,6 +6274,6 @@@
  
  static void rtl_hw_start_8168ep_2(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
  	static const struct ephy_info e_info_8168ep_2[] = {
  		{ 0x00, 0xffff,	0x10a3 },
  		{ 0x19, 0xffff,	0xfc00 },
@@@ -6485,19 -6281,18 +6281,18 @@@
  	};
  
  	/* disable aspm and clock request before access ephy */
- 	RTL_W8(Config2, RTL_R8(Config2) & ~ClkReqEn);
- 	RTL_W8(Config5, RTL_R8(Config5) & ~ASPM_en);
+ 	RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~ClkReqEn);
+ 	RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~ASPM_en);
  	rtl_ephy_init(tp, e_info_8168ep_2, ARRAY_SIZE(e_info_8168ep_2));
  
  	rtl_hw_start_8168ep(tp);
  
- 	RTL_W8(DLLPR, RTL_R8(DLLPR) & ~PFM_EN);
- 	RTL_W8(MISC_1, RTL_R8(MISC_1) & ~PFM_D3COLD_EN);
+ 	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) & ~PFM_EN);
+ 	RTL_W8(tp, MISC_1, RTL_R8(tp, MISC_1) & ~PFM_D3COLD_EN);
  }
  
  static void rtl_hw_start_8168ep_3(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
  	u32 data;
  	static const struct ephy_info e_info_8168ep_3[] = {
  		{ 0x00, 0xffff,	0x10a3 },
@@@ -6507,14 -6302,14 +6302,14 @@@
  	};
  
  	/* disable aspm and clock request before access ephy */
- 	RTL_W8(Config2, RTL_R8(Config2) & ~ClkReqEn);
- 	RTL_W8(Config5, RTL_R8(Config5) & ~ASPM_en);
+ 	RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~ClkReqEn);
+ 	RTL_W8(tp, Config5, RTL_R8(tp, Config5) & ~ASPM_en);
  	rtl_ephy_init(tp, e_info_8168ep_3, ARRAY_SIZE(e_info_8168ep_3));
  
  	rtl_hw_start_8168ep(tp);
  
- 	RTL_W8(DLLPR, RTL_R8(DLLPR) & ~PFM_EN);
- 	RTL_W8(MISC_1, RTL_R8(MISC_1) & ~PFM_D3COLD_EN);
+ 	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) & ~PFM_EN);
+ 	RTL_W8(tp, MISC_1, RTL_R8(tp, MISC_1) & ~PFM_D3COLD_EN);
  
  	data = r8168_mac_ocp_read(tp, 0xd3e2);
  	data &= 0xf000;
@@@ -6533,19 -6328,18 +6328,18 @@@
  static void rtl_hw_start_8168(struct net_device *dev)
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
- 	void __iomem *ioaddr = tp->mmio_addr;
  
- 	RTL_W8(Cfg9346, Cfg9346_Unlock);
+ 	RTL_W8(tp, Cfg9346, Cfg9346_Unlock);
  
- 	RTL_W8(MaxTxPacketSize, TxPacketMax);
+ 	RTL_W8(tp, MaxTxPacketSize, TxPacketMax);
  
- 	rtl_set_rx_max_size(ioaddr, rx_buf_sz);
+ 	rtl_set_rx_max_size(tp, rx_buf_sz);
  
- 	tp->cp_cmd |= RTL_R16(CPlusCmd) | PktCntrDisable | INTT_1;
+ 	tp->cp_cmd |= RTL_R16(tp, CPlusCmd) | PktCntrDisable | INTT_1;
  
- 	RTL_W16(CPlusCmd, tp->cp_cmd);
+ 	RTL_W16(tp, CPlusCmd, tp->cp_cmd);
  
- 	RTL_W16(IntrMitigate, 0x5151);
+ 	RTL_W16(tp, IntrMitigate, 0x5151);
  
  	/* Work around for RxFIFO overflow. */
  	if (tp->mac_version == RTL_GIGA_MAC_VER_11) {
@@@ -6553,11 -6347,11 +6347,11 @@@
  		tp->event_slow &= ~RxOverflow;
  	}
  
- 	rtl_set_rx_tx_desc_registers(tp, ioaddr);
+ 	rtl_set_rx_tx_desc_registers(tp);
  
  	rtl_set_rx_tx_config_registers(tp);
  
- 	RTL_R8(IntrMask);
+ 	RTL_R8(tp, IntrMask);
  
  	switch (tp->mac_version) {
  	case RTL_GIGA_MAC_VER_11:
@@@ -6663,13 -6457,13 +6457,13 @@@
  		break;
  	}
  
- 	RTL_W8(Cfg9346, Cfg9346_Lock);
+ 	RTL_W8(tp, Cfg9346, Cfg9346_Lock);
  
- 	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
+ 	RTL_W8(tp, ChipCmd, CmdTxEnb | CmdRxEnb);
  
  	rtl_set_rx_mode(dev);
  
- 	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
+ 	RTL_W16(tp, MultiIntr, RTL_R16(tp, MultiIntr) & 0xf000);
  }
  
  #define R810X_CPCMD_QUIRK_MASK (\
@@@ -6685,8 -6479,6 +6479,6 @@@
  
  static void rtl_hw_start_8102e_1(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 	struct pci_dev *pdev = tp->pci_dev;
  	static const struct ephy_info e_info_8102e_1[] = {
  		{ 0x01,	0, 0x6e65 },
  		{ 0x02,	0, 0x091f },
@@@ -6701,32 -6493,29 +6493,29 @@@
  
  	rtl_csi_access_enable_2(tp);
  
- 	RTL_W8(DBG_REG, FIX_NAK_1);
+ 	RTL_W8(tp, DBG_REG, FIX_NAK_1);
  
- 	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
+ 	rtl_tx_performance_tweak(tp, 0x5 << MAX_READ_REQUEST_SHIFT);
  
- 	RTL_W8(Config1,
+ 	RTL_W8(tp, Config1,
  	       LEDS1 | LEDS0 | Speed_down | MEMMAP | IOMAP | VPD | PMEnable);
- 	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
+ 	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
  
- 	cfg1 = RTL_R8(Config1);
+ 	cfg1 = RTL_R8(tp, Config1);
  	if ((cfg1 & LEDS0) && (cfg1 & LEDS1))
- 		RTL_W8(Config1, cfg1 & ~LEDS0);
+ 		RTL_W8(tp, Config1, cfg1 & ~LEDS0);
  
  	rtl_ephy_init(tp, e_info_8102e_1, ARRAY_SIZE(e_info_8102e_1));
  }
  
  static void rtl_hw_start_8102e_2(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 	struct pci_dev *pdev = tp->pci_dev;
- 
  	rtl_csi_access_enable_2(tp);
  
- 	rtl_tx_performance_tweak(pdev, 0x5 << MAX_READ_REQUEST_SHIFT);
+ 	rtl_tx_performance_tweak(tp, 0x5 << MAX_READ_REQUEST_SHIFT);
  
- 	RTL_W8(Config1, MEMMAP | IOMAP | VPD | PMEnable);
- 	RTL_W8(Config3, RTL_R8(Config3) & ~Beacon_en);
+ 	RTL_W8(tp, Config1, MEMMAP | IOMAP | VPD | PMEnable);
+ 	RTL_W8(tp, Config3, RTL_R8(tp, Config3) & ~Beacon_en);
  }
  
  static void rtl_hw_start_8102e_3(struct rtl8169_private *tp)
@@@ -6738,7 -6527,6 +6527,6 @@@
  
  static void rtl_hw_start_8105e_1(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
  	static const struct ephy_info e_info_8105e_1[] = {
  		{ 0x07,	0, 0x4000 },
  		{ 0x19,	0, 0x0200 },
@@@ -6751,13 -6539,13 +6539,13 @@@
  	};
  
  	/* Force LAN exit from ASPM if Rx/Tx are not idle */
- 	RTL_W32(FuncEvent, RTL_R32(FuncEvent) | 0x002800);
+ 	RTL_W32(tp, FuncEvent, RTL_R32(tp, FuncEvent) | 0x002800);
  
  	/* Disable Early Tally Counter */
- 	RTL_W32(FuncEvent, RTL_R32(FuncEvent) & ~0x010000);
+ 	RTL_W32(tp, FuncEvent, RTL_R32(tp, FuncEvent) & ~0x010000);
  
- 	RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET);
- 	RTL_W8(DLLPR, RTL_R8(DLLPR) | PFM_EN);
+ 	RTL_W8(tp, MCU, RTL_R8(tp, MCU) | EN_NDP | EN_OOB_RESET);
+ 	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) | PFM_EN);
  
  	rtl_ephy_init(tp, e_info_8105e_1, ARRAY_SIZE(e_info_8105e_1));
  
@@@ -6772,7 -6560,6 +6560,6 @@@ static void rtl_hw_start_8105e_2(struc
  
  static void rtl_hw_start_8402(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
  	static const struct ephy_info e_info_8402[] = {
  		{ 0x19,	0xffff, 0xff64 },
  		{ 0x1e,	0, 0x4000 }
@@@ -6781,14 -6568,14 +6568,14 @@@
  	rtl_csi_access_enable_2(tp);
  
  	/* Force LAN exit from ASPM if Rx/Tx are not idle */
- 	RTL_W32(FuncEvent, RTL_R32(FuncEvent) | 0x002800);
+ 	RTL_W32(tp, FuncEvent, RTL_R32(tp, FuncEvent) | 0x002800);
  
- 	RTL_W32(TxConfig, RTL_R32(TxConfig) | TXCFG_AUTO_FIFO);
- 	RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB);
+ 	RTL_W32(tp, TxConfig, RTL_R32(tp, TxConfig) | TXCFG_AUTO_FIFO);
+ 	RTL_W8(tp, MCU, RTL_R8(tp, MCU) & ~NOW_IS_OOB);
  
  	rtl_ephy_init(tp, e_info_8402, ARRAY_SIZE(e_info_8402));
  
- 	rtl_tx_performance_tweak(tp->pci_dev, 0x5 << MAX_READ_REQUEST_SHIFT);
+ 	rtl_tx_performance_tweak(tp, 0x5 << MAX_READ_REQUEST_SHIFT);
  
  	rtl_eri_write(tp, 0xc8, ERIAR_MASK_1111, 0x00000002, ERIAR_EXGMAC);
  	rtl_eri_write(tp, 0xe8, ERIAR_MASK_1111, 0x00000006, ERIAR_EXGMAC);
@@@ -6803,14 -6590,12 +6590,12 @@@
  
  static void rtl_hw_start_8106(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	/* Force LAN exit from ASPM if Rx/Tx are not idle */
- 	RTL_W32(FuncEvent, RTL_R32(FuncEvent) | 0x002800);
+ 	RTL_W32(tp, FuncEvent, RTL_R32(tp, FuncEvent) | 0x002800);
  
- 	RTL_W32(MISC, (RTL_R32(MISC) | DISABLE_LAN_EN) & ~EARLY_TALLY_EN);
- 	RTL_W8(MCU, RTL_R8(MCU) | EN_NDP | EN_OOB_RESET);
- 	RTL_W8(DLLPR, RTL_R8(DLLPR) & ~PFM_EN);
+ 	RTL_W32(tp, MISC, (RTL_R32(tp, MISC) | DISABLE_LAN_EN) & ~EARLY_TALLY_EN);
+ 	RTL_W8(tp, MCU, RTL_R8(tp, MCU) | EN_NDP | EN_OOB_RESET);
+ 	RTL_W8(tp, DLLPR, RTL_R8(tp, DLLPR) & ~PFM_EN);
  
  	rtl_pcie_state_l2l3_enable(tp, false);
  }
@@@ -6818,7 -6603,6 +6603,6 @@@
  static void rtl_hw_start_8101(struct net_device *dev)
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
- 	void __iomem *ioaddr = tp->mmio_addr;
  	struct pci_dev *pdev = tp->pci_dev;
  
  	if (tp->mac_version >= RTL_GIGA_MAC_VER_30)
@@@ -6829,16 -6613,16 +6613,16 @@@
  		pcie_capability_set_word(pdev, PCI_EXP_DEVCTL,
  					 PCI_EXP_DEVCTL_NOSNOOP_EN);
  
- 	RTL_W8(Cfg9346, Cfg9346_Unlock);
+ 	RTL_W8(tp, Cfg9346, Cfg9346_Unlock);
  
- 	RTL_W8(MaxTxPacketSize, TxPacketMax);
+ 	RTL_W8(tp, MaxTxPacketSize, TxPacketMax);
  
- 	rtl_set_rx_max_size(ioaddr, rx_buf_sz);
+ 	rtl_set_rx_max_size(tp, rx_buf_sz);
  
  	tp->cp_cmd &= ~R810X_CPCMD_QUIRK_MASK;
- 	RTL_W16(CPlusCmd, tp->cp_cmd);
+ 	RTL_W16(tp, CPlusCmd, tp->cp_cmd);
  
- 	rtl_set_rx_tx_desc_registers(tp, ioaddr);
+ 	rtl_set_rx_tx_desc_registers(tp);
  
  	rtl_set_rx_tx_config_registers(tp);
  
@@@ -6878,17 -6662,17 +6662,17 @@@
  		break;
  	}
  
- 	RTL_W8(Cfg9346, Cfg9346_Lock);
+ 	RTL_W8(tp, Cfg9346, Cfg9346_Lock);
  
- 	RTL_W16(IntrMitigate, 0x0000);
+ 	RTL_W16(tp, IntrMitigate, 0x0000);
  
- 	RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
+ 	RTL_W8(tp, ChipCmd, CmdTxEnb | CmdRxEnb);
  
  	rtl_set_rx_mode(dev);
  
- 	RTL_R8(IntrMask);
+ 	RTL_R8(tp, IntrMask);
  
- 	RTL_W16(MultiIntr, RTL_R16(MultiIntr) & 0xf000);
+ 	RTL_W16(tp, MultiIntr, RTL_R16(tp, MultiIntr) & 0xf000);
  }
  
  static int rtl8169_change_mtu(struct net_device *dev, int new_mtu)
@@@ -6915,7 -6699,7 +6699,7 @@@ static inline void rtl8169_make_unusabl
  static void rtl8169_free_rx_databuff(struct rtl8169_private *tp,
  				     void **data_buff, struct RxDesc *desc)
  {
- 	dma_unmap_single(&tp->pci_dev->dev, le64_to_cpu(desc->addr), rx_buf_sz,
+ 	dma_unmap_single(tp_to_dev(tp), le64_to_cpu(desc->addr), rx_buf_sz,
  			 DMA_FROM_DEVICE);
  
  	kfree(*data_buff);
@@@ -6950,7 -6734,7 +6734,7 @@@ static struct sk_buff *rtl8169_alloc_rx
  {
  	void *data;
  	dma_addr_t mapping;
- 	struct device *d = &tp->pci_dev->dev;
+ 	struct device *d = tp_to_dev(tp);
  	struct net_device *dev = tp->dev;
  	int node = dev->dev.parent ? dev_to_node(dev->dev.parent) : -1;
  
@@@ -7062,7 -6846,7 +6846,7 @@@ static void rtl8169_tx_clear_range(stru
  		if (len) {
  			struct sk_buff *skb = tx_skb->skb;
  
- 			rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb,
+ 			rtl8169_unmap_tx_skb(tp_to_dev(tp), tx_skb,
  					     tp->TxDescArray + entry);
  			if (skb) {
  				dev_consume_skb_any(skb);
@@@ -7098,7 -6882,7 +6882,7 @@@ static void rtl_reset_work(struct rtl81
  	napi_enable(&tp->napi);
  	rtl_hw_start(dev);
  	netif_wake_queue(dev);
- 	rtl8169_check_link_status(dev, tp, tp->mmio_addr);
+ 	rtl8169_check_link_status(dev, tp);
  }
  
  static void rtl8169_tx_timeout(struct net_device *dev)
@@@ -7114,7 -6898,7 +6898,7 @@@ static int rtl8169_xmit_frags(struct rt
  	struct skb_shared_info *info = skb_shinfo(skb);
  	unsigned int cur_frag, entry;
  	struct TxDesc *uninitialized_var(txd);
- 	struct device *d = &tp->pci_dev->dev;
+ 	struct device *d = tp_to_dev(tp);
  
  	entry = tp->cur_tx;
  	for (cur_frag = 0; cur_frag < info->nr_frags; cur_frag++) {
@@@ -7346,8 -7130,7 +7130,7 @@@ static netdev_tx_t rtl8169_start_xmit(s
  	struct rtl8169_private *tp = netdev_priv(dev);
  	unsigned int entry = tp->cur_tx % NUM_TX_DESC;
  	struct TxDesc *txd = tp->TxDescArray + entry;
- 	void __iomem *ioaddr = tp->mmio_addr;
- 	struct device *d = &tp->pci_dev->dev;
+ 	struct device *d = tp_to_dev(tp);
  	dma_addr_t mapping;
  	u32 status, len;
  	u32 opts[2];
@@@ -7406,7 -7189,7 +7189,7 @@@
  
  	tp->cur_tx += frags + 1;
  
- 	RTL_W8(TxPoll, NPQ);
+ 	RTL_W8(tp, TxPoll, NPQ);
  
  	mmiowb();
  
@@@ -7477,11 -7260,9 +7260,9 @@@ static void rtl8169_pcierr_interrupt(st
  
  	/* The infamous DAC f*ckup only happens at boot time */
  	if ((tp->cp_cmd & PCIDAC) && !tp->cur_rx) {
- 		void __iomem *ioaddr = tp->mmio_addr;
- 
  		netif_info(tp, intr, dev, "disabling PCI DAC\n");
  		tp->cp_cmd &= ~PCIDAC;
- 		RTL_W16(CPlusCmd, tp->cp_cmd);
+ 		RTL_W16(tp, CPlusCmd, tp->cp_cmd);
  		dev->features &= ~NETIF_F_HIGHDMA;
  	}
  
@@@ -7513,7 -7294,7 +7294,7 @@@ static void rtl_tx(struct net_device *d
  		 */
  		dma_rmb();
  
- 		rtl8169_unmap_tx_skb(&tp->pci_dev->dev, tx_skb,
+ 		rtl8169_unmap_tx_skb(tp_to_dev(tp), tx_skb,
  				     tp->TxDescArray + entry);
  		if (status & LastFrag) {
  			u64_stats_update_begin(&tp->tx_stats.syncp);
@@@ -7547,11 -7328,8 +7328,8 @@@
  		 * of start_xmit activity is detected (if it is not detected,
  		 * it is slow enough). -- FR
  		 */
- 		if (tp->cur_tx != dirty_tx) {
- 			void __iomem *ioaddr = tp->mmio_addr;
- 
- 			RTL_W8(TxPoll, NPQ);
- 		}
+ 		if (tp->cur_tx != dirty_tx)
+ 			RTL_W8(tp, TxPoll, NPQ);
  	}
  }
  
@@@ -7577,7 -7355,7 +7355,7 @@@ static struct sk_buff *rtl8169_try_rx_c
  					   dma_addr_t addr)
  {
  	struct sk_buff *skb;
- 	struct device *d = &tp->pci_dev->dev;
+ 	struct device *d = tp_to_dev(tp);
  
  	data = rtl8169_align(data);
  	dma_sync_single_for_cpu(d, addr, pkt_size, DMA_FROM_DEVICE);
@@@ -7732,7 -7510,7 +7510,7 @@@ static void rtl_slow_event_work(struct 
  		rtl8169_pcierr_interrupt(dev);
  
  	if (status & LinkChg)
- 		rtl8169_check_link_status(dev, tp, tp->mmio_addr);
+ 		rtl8169_check_link_status(dev, tp);
  
  	rtl_irq_enable_all(tp);
  }
@@@ -7804,21 -7582,20 +7582,20 @@@ static int rtl8169_poll(struct napi_str
  	return work_done;
  }
  
- static void rtl8169_rx_missed(struct net_device *dev, void __iomem *ioaddr)
+ static void rtl8169_rx_missed(struct net_device *dev)
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
  
  	if (tp->mac_version > RTL_GIGA_MAC_VER_06)
  		return;
  
- 	dev->stats.rx_missed_errors += (RTL_R32(RxMissed) & 0xffffff);
- 	RTL_W32(RxMissed, 0);
+ 	dev->stats.rx_missed_errors += RTL_R32(tp, RxMissed) & 0xffffff;
+ 	RTL_W32(tp, RxMissed, 0);
  }
  
  static void rtl8169_down(struct net_device *dev)
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
- 	void __iomem *ioaddr = tp->mmio_addr;
  
  	del_timer_sync(&tp->timer);
  
@@@ -7831,7 -7608,7 +7608,7 @@@
  	 * as netif_running is not true (rtl8169_interrupt, rtl8169_reset_task)
  	 * and napi is disabled (rtl8169_poll).
  	 */
- 	rtl8169_rx_missed(dev, ioaddr);
+ 	rtl8169_rx_missed(dev);
  
  	/* Give a racing hard_start_xmit a few cycles to complete. */
  	synchronize_sched();
@@@ -7861,7 -7638,7 +7638,7 @@@ static int rtl8169_close(struct net_dev
  
  	cancel_work_sync(&tp->wk.work);
  
- 	free_irq(pdev->irq, dev);
+ 	pci_free_irq(pdev, 0, dev);
  
  	dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
  			  tp->RxPhyAddr);
@@@ -7880,14 -7657,13 +7657,13 @@@ static void rtl8169_netpoll(struct net_
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
  
- 	rtl8169_interrupt(tp->pci_dev->irq, dev);
+ 	rtl8169_interrupt(pci_irq_vector(tp->pci_dev, 0), dev);
  }
  #endif
  
  static int rtl_open(struct net_device *dev)
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
- 	void __iomem *ioaddr = tp->mmio_addr;
  	struct pci_dev *pdev = tp->pci_dev;
  	int retval = -ENOMEM;
  
@@@ -7917,9 -7693,8 +7693,8 @@@
  
  	rtl_request_firmware(tp);
  
- 	retval = request_irq(pdev->irq, rtl8169_interrupt,
- 			     (tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED,
- 			     dev->name, dev);
+ 	retval = pci_request_irq(pdev, 0, rtl8169_interrupt, NULL, dev,
+ 				 dev->name);
  	if (retval < 0)
  		goto err_release_fw_2;
  
@@@ -7947,7 -7722,7 +7722,7 @@@
  	tp->saved_wolopts = 0;
  	pm_runtime_put_sync(&pdev->dev);
  
- 	rtl8169_check_link_status(dev, tp, ioaddr);
+ 	rtl8169_check_link_status(dev, tp);
  out:
  	return retval;
  
@@@ -7971,7 -7746,6 +7746,6 @@@ static voi
  rtl8169_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
  {
  	struct rtl8169_private *tp = netdev_priv(dev);
- 	void __iomem *ioaddr = tp->mmio_addr;
  	struct pci_dev *pdev = tp->pci_dev;
  	struct rtl8169_counters *counters = tp->counters;
  	unsigned int start;
@@@ -7979,7 -7753,7 +7753,7 @@@
  	pm_runtime_get_noresume(&pdev->dev);
  
  	if (netif_running(dev) && pm_runtime_active(&pdev->dev))
- 		rtl8169_rx_missed(dev, ioaddr);
+ 		rtl8169_rx_missed(dev);
  
  	do {
  		start = u64_stats_fetch_begin_irq(&tp->rx_stats.syncp);
@@@ -8102,7 -7876,7 +7876,7 @@@ static int rtl8169_runtime_suspend(stru
  	rtl8169_net_suspend(dev);
  
  	/* Update counters before going runtime suspend */
- 	rtl8169_rx_missed(dev, tp->mmio_addr);
+ 	rtl8169_rx_missed(dev);
  	rtl8169_update_counters(dev);
  
  	return 0;
@@@ -8163,8 -7937,6 +7937,6 @@@ static const struct dev_pm_ops rtl8169_
  
  static void rtl_wol_shutdown_quirk(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
  	/* WoL fails with 8168b when the receiver is disabled. */
  	switch (tp->mac_version) {
  	case RTL_GIGA_MAC_VER_11:
@@@ -8172,9 -7944,9 +7944,9 @@@
  	case RTL_GIGA_MAC_VER_17:
  		pci_clear_master(tp->pci_dev);
  
- 		RTL_W8(ChipCmd, CmdRxEnb);
+ 		RTL_W8(tp, ChipCmd, CmdRxEnb);
  		/* PCI commit */
- 		RTL_R8(ChipCmd);
+ 		RTL_R8(tp, ChipCmd);
  		break;
  	default:
  		break;
@@@ -8209,15 -7981,8 +7981,8 @@@ static void rtl_remove_one(struct pci_d
  	struct net_device *dev = pci_get_drvdata(pdev);
  	struct rtl8169_private *tp = netdev_priv(dev);
  
- 	if ((tp->mac_version == RTL_GIGA_MAC_VER_27 ||
- 	     tp->mac_version == RTL_GIGA_MAC_VER_28 ||
- 	     tp->mac_version == RTL_GIGA_MAC_VER_31 ||
- 	     tp->mac_version == RTL_GIGA_MAC_VER_49 ||
- 	     tp->mac_version == RTL_GIGA_MAC_VER_50 ||
- 	     tp->mac_version == RTL_GIGA_MAC_VER_51) &&
- 	    r8168_check_dash(tp)) {
+ 	if (r8168_check_dash(tp))
  		rtl8168_driver_stop(tp);
- 	}
  
  	netif_napi_del(&tp->napi);
  
@@@ -8256,7 -8021,7 +8021,7 @@@ static const struct rtl_cfg_info 
  	unsigned int region;
  	unsigned int align;
  	u16 event_slow;
- 	unsigned features;
+ 	unsigned int has_gmii:1;
  	const struct rtl_coalesce_info *coalesce_info;
  	u8 default_ver;
  } rtl_cfg_infos [] = {
@@@ -8265,7 -8030,7 +8030,7 @@@
  		.region		= 1,
  		.align		= 0,
  		.event_slow	= SYSErr | LinkChg | RxOverflow | RxFIFOOver,
- 		.features	= RTL_FEATURE_GMII,
+ 		.has_gmii	= 1,
  		.coalesce_info	= rtl_coalesce_info_8169,
  		.default_ver	= RTL_GIGA_MAC_VER_01,
  	},
@@@ -8274,7 -8039,7 +8039,7 @@@
  		.region		= 2,
  		.align		= 8,
  		.event_slow	= SYSErr | LinkChg | RxOverflow,
- 		.features	= RTL_FEATURE_GMII | RTL_FEATURE_MSI,
+ 		.has_gmii	= 1,
  		.coalesce_info	= rtl_coalesce_info_8168_8136,
  		.default_ver	= RTL_GIGA_MAC_VER_11,
  	},
@@@ -8284,56 -8049,44 +8049,44 @@@
  		.align		= 8,
  		.event_slow	= SYSErr | LinkChg | RxOverflow | RxFIFOOver |
  				  PCSTimeout,
- 		.features	= RTL_FEATURE_MSI,
  		.coalesce_info	= rtl_coalesce_info_8168_8136,
  		.default_ver	= RTL_GIGA_MAC_VER_13,
  	}
  };
  
- /* Cfg9346_Unlock assumed. */
- static unsigned rtl_try_msi(struct rtl8169_private *tp,
- 			    const struct rtl_cfg_info *cfg)
+ static int rtl_alloc_irq(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 	unsigned msi = 0;
- 	u8 cfg2;
+ 	unsigned int flags;
  
- 	cfg2 = RTL_R8(Config2) & ~MSIEnable;
- 	if (cfg->features & RTL_FEATURE_MSI) {
- 		if (pci_enable_msi(tp->pci_dev)) {
- 			netif_info(tp, hw, tp->dev, "no MSI. Back to INTx.\n");
- 		} else {
- 			cfg2 |= MSIEnable;
- 			msi = RTL_FEATURE_MSI;
- 		}
+ 	if (tp->mac_version <= RTL_GIGA_MAC_VER_06) {
+ 		RTL_W8(tp, Cfg9346, Cfg9346_Unlock);
+ 		RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~MSIEnable);
+ 		RTL_W8(tp, Cfg9346, Cfg9346_Lock);
+ 		flags = PCI_IRQ_LEGACY;
+ 	} else {
+ 		flags = PCI_IRQ_ALL_TYPES;
  	}
- 	if (tp->mac_version <= RTL_GIGA_MAC_VER_06)
- 		RTL_W8(Config2, cfg2);
- 	return msi;
+ 
+ 	return pci_alloc_irq_vectors(tp->pci_dev, 1, 1, flags);
  }
  
  DECLARE_RTL_COND(rtl_link_list_ready_cond)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	return RTL_R8(MCU) & LINK_LIST_RDY;
+ 	return RTL_R8(tp, MCU) & LINK_LIST_RDY;
  }
  
  DECLARE_RTL_COND(rtl_rxtx_empty_cond)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
- 
- 	return (RTL_R8(MCU) & RXTX_EMPTY) == RXTX_EMPTY;
+ 	return (RTL_R8(tp, MCU) & RXTX_EMPTY) == RXTX_EMPTY;
  }
  
  static void rtl_hw_init_8168g(struct rtl8169_private *tp)
  {
- 	void __iomem *ioaddr = tp->mmio_addr;
  	u32 data;
  
  	tp->ocp_base = OCP_STD_PHY_BASE;
  
- 	RTL_W32(MISC, RTL_R32(MISC) | RXDV_GATED_EN);
+ 	RTL_W32(tp, MISC, RTL_R32(tp, MISC) | RXDV_GATED_EN);
  
  	if (!rtl_udelay_loop_wait_high(tp, &rtl_txcfg_empty_cond, 100, 42))
  		return;
@@@ -8341,9 -8094,9 +8094,9 @@@
  	if (!rtl_udelay_loop_wait_high(tp, &rtl_rxtx_empty_cond, 100, 42))
  		return;
  
- 	RTL_W8(ChipCmd, RTL_R8(ChipCmd) & ~(CmdTxEnb | CmdRxEnb));
+ 	RTL_W8(tp, ChipCmd, RTL_R8(tp, ChipCmd) & ~(CmdTxEnb | CmdRxEnb));
  	msleep(1);
- 	RTL_W8(MCU, RTL_R8(MCU) & ~NOW_IS_OOB);
+ 	RTL_W8(tp, MCU, RTL_R8(tp, MCU) & ~NOW_IS_OOB);
  
  	data = r8168_mac_ocp_read(tp, 0xe8de);
  	data &= ~(1 << 14);
@@@ -8397,7 -8150,6 +8150,6 @@@ static int rtl_init_one(struct pci_dev 
  	struct rtl8169_private *tp;
  	struct mii_if_info *mii;
  	struct net_device *dev;
- 	void __iomem *ioaddr;
  	int chipset, i;
  	int rc;
  
@@@ -8423,7 -8175,7 +8175,7 @@@
  	mii->mdio_write = rtl_mdio_write;
  	mii->phy_id_mask = 0x1f;
  	mii->reg_num_mask = 0x1f;
- 	mii->supports_gmii = !!(cfg->features & RTL_FEATURE_GMII);
+ 	mii->supports_gmii = cfg->has_gmii;
  
  	/* disable ASPM completely as that cause random device stop working
  	 * problems as well as full system hangs for some PCIe devices users */
@@@ -8455,20 -8207,13 +8207,13 @@@
  		return -ENODEV;
  	}
  
- 	rc = pci_request_regions(pdev, MODULENAME);
+ 	rc = pcim_iomap_regions(pdev, BIT(region), MODULENAME);
  	if (rc < 0) {
- 		netif_err(tp, probe, dev, "could not request regions\n");
+ 		netif_err(tp, probe, dev, "cannot remap MMIO, aborting\n");
  		return rc;
  	}
  
- 	/* ioremap MMIO region */
- 	ioaddr = devm_ioremap(&pdev->dev, pci_resource_start(pdev, region),
- 			      R8169_REGS_SIZE);
- 	if (!ioaddr) {
- 		netif_err(tp, probe, dev, "cannot remap MMIO, aborting\n");
- 		return -EIO;
- 	}
- 	tp->mmio_addr = ioaddr;
+ 	tp->mmio_addr = pcim_iomap_table(pdev)[region];
  
  	if (!pci_is_pcie(pdev))
  		netif_info(tp, probe, dev, "not PCI Express\n");
@@@ -8518,41 -8263,14 +8263,14 @@@
  	chipset = tp->mac_version;
  	tp->txd_version = rtl_chip_infos[chipset].txd_version;
  
- 	RTL_W8(Cfg9346, Cfg9346_Unlock);
- 	RTL_W8(Config1, RTL_R8(Config1) | PMEnable);
- 	RTL_W8(Config5, RTL_R8(Config5) & (BWF | MWF | UWF | LanWake | PMEStatus));
- 	switch (tp->mac_version) {
- 	case RTL_GIGA_MAC_VER_34:
- 	case RTL_GIGA_MAC_VER_35:
- 	case RTL_GIGA_MAC_VER_36:
- 	case RTL_GIGA_MAC_VER_37:
- 	case RTL_GIGA_MAC_VER_38:
- 	case RTL_GIGA_MAC_VER_40:
- 	case RTL_GIGA_MAC_VER_41:
- 	case RTL_GIGA_MAC_VER_42:
- 	case RTL_GIGA_MAC_VER_43:
- 	case RTL_GIGA_MAC_VER_44:
- 	case RTL_GIGA_MAC_VER_45:
- 	case RTL_GIGA_MAC_VER_46:
- 	case RTL_GIGA_MAC_VER_47:
- 	case RTL_GIGA_MAC_VER_48:
- 	case RTL_GIGA_MAC_VER_49:
- 	case RTL_GIGA_MAC_VER_50:
- 	case RTL_GIGA_MAC_VER_51:
- 		if (rtl_eri_read(tp, 0xdc, ERIAR_EXGMAC) & MagicPacket_v2)
- 			tp->features |= RTL_FEATURE_WOL;
- 		if ((RTL_R8(Config3) & LinkUp) != 0)
- 			tp->features |= RTL_FEATURE_WOL;
- 		break;
- 	default:
- 		if ((RTL_R8(Config3) & (LinkUp | MagicPacket)) != 0)
- 			tp->features |= RTL_FEATURE_WOL;
- 		break;
+ 	rc = rtl_alloc_irq(tp);
+ 	if (rc < 0) {
+ 		netif_err(tp, probe, dev, "Can't allocate interrupt\n");
+ 		return rc;
  	}
- 	if ((RTL_R8(Config5) & (UWF | BWF | MWF)) != 0)
- 		tp->features |= RTL_FEATURE_WOL;
- 	tp->features |= rtl_try_msi(tp, cfg);
- 	RTL_W8(Cfg9346, Cfg9346_Lock);
+ 
+ 	/* override BIOS settings, use userspace tools to enable WOL */
+ 	__rtl8169_set_wol(tp, 0);
  
  	if (rtl_tbi_enabled(tp)) {
  		tp->set_speed = rtl8169_set_speed_tbi;
@@@ -8600,7 -8318,7 +8318,7 @@@
  			rtl_rar_set(tp, (u8 *)mac_addr);
  	}
  	for (i = 0; i < ETH_ALEN; i++)
- 		dev->dev_addr[i] = RTL_R8(MAC0 + i);
+ 		dev->dev_addr[i] = RTL_R8(tp, MAC0 + i);
  
  	dev->ethtool_ops = &rtl8169_ethtool_ops;
  	dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
@@@ -8660,15 -8378,16 +8378,16 @@@
  	if (!tp->counters)
  		return -ENOMEM;
  
 +	pci_set_drvdata(pdev, dev);
 +
  	rc = register_netdev(dev);
  	if (rc < 0)
  		return rc;
  
 -	pci_set_drvdata(pdev, dev);
 -
  	netif_info(tp, probe, dev, "%s at 0x%p, %pM, XID %08x IRQ %d\n",
- 		   rtl_chip_infos[chipset].name, ioaddr, dev->dev_addr,
- 		   (u32)(RTL_R32(TxConfig) & 0x9cf0f8ff), pdev->irq);
+ 		   rtl_chip_infos[chipset].name, tp->mmio_addr, dev->dev_addr,
+ 		   (u32)(RTL_R32(tp, TxConfig) & 0x9cf0f8ff),
+ 		   pci_irq_vector(pdev, 0));
  	if (rtl_chip_infos[chipset].jumbo_max != JUMBO_1K) {
  		netif_info(tp, probe, dev, "jumbo features [frames: %d bytes, "
  			   "tx checksumming: %s]\n",
@@@ -8676,15 -8395,8 +8395,8 @@@
  			   rtl_chip_infos[chipset].jumbo_tx_csum ? "ok" : "ko");
  	}
  
- 	if ((tp->mac_version == RTL_GIGA_MAC_VER_27 ||
- 	     tp->mac_version == RTL_GIGA_MAC_VER_28 ||
- 	     tp->mac_version == RTL_GIGA_MAC_VER_31 ||
- 	     tp->mac_version == RTL_GIGA_MAC_VER_49 ||
- 	     tp->mac_version == RTL_GIGA_MAC_VER_50 ||
- 	     tp->mac_version == RTL_GIGA_MAC_VER_51) &&
- 	    r8168_check_dash(tp)) {
+ 	if (r8168_check_dash(tp))
  		rtl8168_driver_start(tp);
- 	}
  
  	netif_carrier_off(dev);
  
diff --combined drivers/net/team/team.c
index befed2d22bf4,222093e878a8..a6c6ce19eeee
--- a/drivers/net/team/team.c
+++ b/drivers/net/team/team.c
@@@ -1105,14 -1105,15 +1105,15 @@@ static void team_port_disable_netpoll(s
  }
  #endif
  
- static int team_upper_dev_link(struct team *team, struct team_port *port)
+ static int team_upper_dev_link(struct team *team, struct team_port *port,
+ 			       struct netlink_ext_ack *extack)
  {
  	struct netdev_lag_upper_info lag_upper_info;
  	int err;
  
  	lag_upper_info.tx_type = team->mode->lag_tx_type;
  	err = netdev_master_upper_dev_link(port->dev, team->dev, NULL,
- 					   &lag_upper_info, NULL);
+ 					   &lag_upper_info, extack);
  	if (err)
  		return err;
  	port->dev->priv_flags |= IFF_TEAM_PORT;
@@@ -1129,7 -1130,8 +1130,8 @@@ static void __team_port_change_port_add
  static int team_dev_type_check_change(struct net_device *dev,
  				      struct net_device *port_dev);
  
- static int team_port_add(struct team *team, struct net_device *port_dev)
+ static int team_port_add(struct team *team, struct net_device *port_dev,
+ 			 struct netlink_ext_ack *extack)
  {
  	struct net_device *dev = team->dev;
  	struct team_port *port;
@@@ -1137,12 -1139,14 +1139,14 @@@
  	int err;
  
  	if (port_dev->flags & IFF_LOOPBACK) {
+ 		NL_SET_ERR_MSG(extack, "Loopback device can't be added as a team port");
  		netdev_err(dev, "Device %s is loopback device. Loopback devices can't be added as a team port\n",
  			   portname);
  		return -EINVAL;
  	}
  
  	if (team_port_exists(port_dev)) {
+ 		NL_SET_ERR_MSG(extack, "Device is already a port of a team device");
  		netdev_err(dev, "Device %s is already a port "
  				"of a team device\n", portname);
  		return -EBUSY;
@@@ -1150,6 -1154,7 +1154,7 @@@
  
  	if (port_dev->features & NETIF_F_VLAN_CHALLENGED &&
  	    vlan_uses_dev(dev)) {
+ 		NL_SET_ERR_MSG(extack, "Device is VLAN challenged and team device has VLAN set up");
  		netdev_err(dev, "Device %s is VLAN challenged and team device has VLAN set up\n",
  			   portname);
  		return -EPERM;
@@@ -1160,6 -1165,7 +1165,7 @@@
  		return err;
  
  	if (port_dev->flags & IFF_UP) {
+ 		NL_SET_ERR_MSG(extack, "Device is up. Set it down before adding it as a team port");
  		netdev_err(dev, "Device %s is up. Set it down before adding it as a team port\n",
  			   portname);
  		return -EBUSY;
@@@ -1197,6 -1203,11 +1203,6 @@@
  		goto err_dev_open;
  	}
  
 -	netif_addr_lock_bh(dev);
 -	dev_uc_sync_multiple(port_dev, dev);
 -	dev_mc_sync_multiple(port_dev, dev);
 -	netif_addr_unlock_bh(dev);
 -
  	err = vlan_vids_add_by_dev(port_dev, dev);
  	if (err) {
  		netdev_err(dev, "Failed to add vlan ids to device %s\n",
@@@ -1222,7 -1233,7 +1228,7 @@@
  		goto err_handler_register;
  	}
  
- 	err = team_upper_dev_link(team, port);
+ 	err = team_upper_dev_link(team, port, extack);
  	if (err) {
  		netdev_err(dev, "Device %s failed to set upper link\n",
  			   portname);
@@@ -1236,11 -1247,6 +1242,11 @@@
  		goto err_option_port_add;
  	}
  
 +	netif_addr_lock_bh(dev);
 +	dev_uc_sync_multiple(port_dev, dev);
 +	dev_mc_sync_multiple(port_dev, dev);
 +	netif_addr_unlock_bh(dev);
 +
  	port->index = -1;
  	list_add_tail_rcu(&port->list, &team->port_list);
  	team_port_enable(team, port);
@@@ -1265,6 -1271,8 +1271,6 @@@ err_enable_netpoll
  	vlan_vids_del_by_dev(port_dev, dev);
  
  err_vids_add:
 -	dev_uc_unsync(port_dev, dev);
 -	dev_mc_unsync(port_dev, dev);
  	dev_close(port_dev);
  
  err_dev_open:
@@@ -1919,7 -1927,7 +1925,7 @@@ static int team_add_slave(struct net_de
  	int err;
  
  	mutex_lock(&team->lock);
- 	err = team_port_add(team, port_dev);
+ 	err = team_port_add(team, port_dev, extack);
  	mutex_unlock(&team->lock);
  
  	if (!err)
diff --combined drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
index 1ad97a40940d,74a83020c073..5ed718d5f868
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
@@@ -5124,6 -5124,9 +5124,9 @@@ static int brcmf_cfg80211_set_pmk(struc
  	if (WARN_ON(ifp->vif->profile.use_fwsup != BRCMF_PROFILE_FWSUP_1X))
  		return -EINVAL;
  
+ 	if (conf->pmk_len > BRCMF_WSEC_MAX_PSK_LEN)
+ 		return -ERANGE;
+ 
  	return brcmf_set_pmk(ifp, conf->pmk, conf->pmk_len);
  }
  
@@@ -6802,7 -6805,7 +6805,7 @@@ static void brcmf_cfg80211_reg_notifier
  		return;
  
  	/* ignore non-ISO3166 country codes */
 -	for (i = 0; i < sizeof(req->alpha2); i++)
 +	for (i = 0; i < 2; i++)
  		if (req->alpha2[i] < 'A' || req->alpha2[i] > 'Z') {
  			brcmf_err("not an ISO3166 code (0x%02x 0x%02x)\n",
  				  req->alpha2[0], req->alpha2[1]);
diff --combined drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
index ebe35e6a40e7,70ef9835b647..5532ef39439f
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
@@@ -75,10 -75,6 +75,10 @@@ static int brcmf_roamoff
  module_param_named(roamoff, brcmf_roamoff, int, S_IRUSR);
  MODULE_PARM_DESC(roamoff, "Do not use internal roaming engine");
  
 +static int brcmf_iapp_enable;
 +module_param_named(iapp, brcmf_iapp_enable, int, 0);
 +MODULE_PARM_DESC(iapp, "Enable partial support for the obsoleted Inter-Access Point Protocol");
 +
  #ifdef DEBUG
  /* always succeed brcmf_bus_started() */
  static int brcmf_ignore_probe_fail;
@@@ -369,9 -365,6 +369,6 @@@ int brcmf_c_preinit_dcmds(struct brcmf_
  
  	/* Enable tx beamforming, errors can be ignored (not supported) */
  	(void)brcmf_fil_iovar_int_set(ifp, "txbf", 1);
- 
- 	/* do bus specific preinit here */
- 	err = brcmf_bus_preinit(ifp->drvr->bus_if);
  done:
  	return err;
  }
@@@ -445,7 -438,6 +442,7 @@@ struct brcmf_mp_device *brcmf_get_modul
  	settings->feature_disable = brcmf_feature_disable;
  	settings->fcmode = brcmf_fcmode;
  	settings->roamoff = !!brcmf_roamoff;
 +	settings->iapp = !!brcmf_iapp_enable;
  #ifdef DEBUG
  	settings->ignore_probe_fail = !!brcmf_ignore_probe_fail;
  #endif
diff --combined drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
index 44b7774ebd02,19048526b4af..ca97a8b4c59f
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
@@@ -230,37 -230,6 +230,37 @@@ static void brcmf_netdev_set_multicast_
  	schedule_work(&ifp->multicast_work);
  }
  
 +/**
 + * brcmf_skb_is_iapp - checks if skb is an IAPP packet
 + *
 + * @skb: skb to check
 + */
 +static bool brcmf_skb_is_iapp(struct sk_buff *skb)
 +{
 +	static const u8 iapp_l2_update_packet[6] __aligned(2) = {
 +		0x00, 0x01, 0xaf, 0x81, 0x01, 0x00,
 +	};
 +	unsigned char *eth_data;
 +#if !defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
 +	const u16 *a, *b;
 +#endif
 +
 +	if (skb->len - skb->mac_len != 6 ||
 +	    !is_multicast_ether_addr(eth_hdr(skb)->h_dest))
 +		return false;
 +
 +	eth_data = skb_mac_header(skb) + ETH_HLEN;
 +#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
 +	return !(((*(const u32 *)eth_data) ^ (*(const u32 *)iapp_l2_update_packet)) |
 +		 ((*(const u16 *)(eth_data + 4)) ^ (*(const u16 *)(iapp_l2_update_packet + 4))));
 +#else
 +	a = (const u16 *)eth_data;
 +	b = (const u16 *)iapp_l2_update_packet;
 +
 +	return !((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]));
 +#endif
 +}
 +
  static netdev_tx_t brcmf_netdev_start_xmit(struct sk_buff *skb,
  					   struct net_device *ndev)
  {
@@@ -281,23 -250,6 +281,23 @@@
  		goto done;
  	}
  
 +	/* Some recent Broadcom's firmwares disassociate STA when they receive
 +	 * an 802.11f ADD frame. This behavior can lead to a local DoS security
 +	 * issue. Attacker may trigger disassociation of any STA by sending a
 +	 * proper Ethernet frame to the wireless interface.
 +	 *
 +	 * Moreover this feature may break AP interfaces in some specific
 +	 * setups. This applies e.g. to the bridge with hairpin mode enabled and
 +	 * IFLA_BRPORT_MCAST_TO_UCAST set. IAPP packet generated by a firmware
 +	 * will get passed back to the wireless interface and cause immediate
 +	 * disassociation of a just-connected STA.
 +	 */
 +	if (!drvr->settings->iapp && brcmf_skb_is_iapp(skb)) {
 +		dev_kfree_skb(skb);
 +		ret = -EINVAL;
 +		goto done;
 +	}
 +
  	/* Make sure there's enough writeable headroom */
  	if (skb_headroom(skb) < drvr->hdrlen || skb_header_cloned(skb)) {
  		head_delta = max_t(int, drvr->hdrlen - skb_headroom(skb), 0);
@@@ -373,15 -325,6 +373,15 @@@ void brcmf_txflowblock_if(struct brcmf_
  
  void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_buff *skb)
  {
 +	/* Most of Broadcom's firmwares send 802.11f ADD frame every time a new
 +	 * STA connects to the AP interface. This is an obsoleted standard most
 +	 * users don't use, so don't pass these frames up unless requested.
 +	 */
 +	if (!ifp->drvr->settings->iapp && brcmf_skb_is_iapp(skb)) {
 +		brcmu_pkt_buf_free_skb(skb);
 +		return;
 +	}
 +
  	if (skb->pkt_type == PACKET_MULTICAST)
  		ifp->ndev->stats.multicast++;
  
@@@ -971,55 -914,6 +971,6 @@@ static int brcmf_inet6addr_changed(stru
  }
  #endif
  
- int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings)
- {
- 	struct brcmf_pub *drvr = NULL;
- 	int ret = 0;
- 	int i;
- 
- 	brcmf_dbg(TRACE, "Enter\n");
- 
- 	/* Allocate primary brcmf_info */
- 	drvr = kzalloc(sizeof(struct brcmf_pub), GFP_ATOMIC);
- 	if (!drvr)
- 		return -ENOMEM;
- 
- 	for (i = 0; i < ARRAY_SIZE(drvr->if2bss); i++)
- 		drvr->if2bss[i] = BRCMF_BSSIDX_INVALID;
- 
- 	mutex_init(&drvr->proto_block);
- 
- 	/* Link to bus module */
- 	drvr->hdrlen = 0;
- 	drvr->bus_if = dev_get_drvdata(dev);
- 	drvr->bus_if->drvr = drvr;
- 	drvr->settings = settings;
- 
- 	/* attach debug facilities */
- 	brcmf_debug_attach(drvr);
- 
- 	/* Attach and link in the protocol */
- 	ret = brcmf_proto_attach(drvr);
- 	if (ret != 0) {
- 		brcmf_err("brcmf_prot_attach failed\n");
- 		goto fail;
- 	}
- 
- 	/* Attach to events important for core code */
- 	brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
- 			    brcmf_psm_watchdog_notify);
- 
- 	/* attach firmware event handler */
- 	brcmf_fweh_attach(drvr);
- 
- 	return ret;
- 
- fail:
- 	brcmf_detach(dev);
- 
- 	return ret;
- }
- 
  static int brcmf_revinfo_read(struct seq_file *s, void *data)
  {
  	struct brcmf_bus *bus_if = dev_get_drvdata(s->private);
@@@ -1050,11 -944,10 +1001,10 @@@
  	return 0;
  }
  
- int brcmf_bus_started(struct device *dev)
+ static int brcmf_bus_started(struct brcmf_pub *drvr)
  {
  	int ret = -1;
- 	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
- 	struct brcmf_pub *drvr = bus_if->drvr;
+ 	struct brcmf_bus *bus_if = drvr->bus_if;
  	struct brcmf_if *ifp;
  	struct brcmf_if *p2p_ifp;
  
@@@ -1070,6 -963,11 +1020,11 @@@
  	/* signal bus ready */
  	brcmf_bus_change_state(bus_if, BRCMF_BUS_UP);
  
+ 	/* do bus specific preinit here */
+ 	ret = brcmf_bus_preinit(bus_if);
+ 	if (ret < 0)
+ 		goto fail;
+ 
  	/* Bus is ready, do any initialization */
  	ret = brcmf_c_preinit_dcmds(ifp);
  	if (ret < 0)
@@@ -1145,6 -1043,60 +1100,60 @@@ fail
  	return ret;
  }
  
+ int brcmf_attach(struct device *dev, struct brcmf_mp_device *settings)
+ {
+ 	struct brcmf_pub *drvr = NULL;
+ 	int ret = 0;
+ 	int i;
+ 
+ 	brcmf_dbg(TRACE, "Enter\n");
+ 
+ 	/* Allocate primary brcmf_info */
+ 	drvr = kzalloc(sizeof(*drvr), GFP_ATOMIC);
+ 	if (!drvr)
+ 		return -ENOMEM;
+ 
+ 	for (i = 0; i < ARRAY_SIZE(drvr->if2bss); i++)
+ 		drvr->if2bss[i] = BRCMF_BSSIDX_INVALID;
+ 
+ 	mutex_init(&drvr->proto_block);
+ 
+ 	/* Link to bus module */
+ 	drvr->hdrlen = 0;
+ 	drvr->bus_if = dev_get_drvdata(dev);
+ 	drvr->bus_if->drvr = drvr;
+ 	drvr->settings = settings;
+ 
+ 	/* attach debug facilities */
+ 	brcmf_debug_attach(drvr);
+ 
+ 	/* Attach and link in the protocol */
+ 	ret = brcmf_proto_attach(drvr);
+ 	if (ret != 0) {
+ 		brcmf_err("brcmf_prot_attach failed\n");
+ 		goto fail;
+ 	}
+ 
+ 	/* Attach to events important for core code */
+ 	brcmf_fweh_register(drvr, BRCMF_E_PSM_WATCHDOG,
+ 			    brcmf_psm_watchdog_notify);
+ 
+ 	/* attach firmware event handler */
+ 	brcmf_fweh_attach(drvr);
+ 
+ 	ret = brcmf_bus_started(drvr);
+ 	if (ret != 0) {
+ 		brcmf_err("dongle is not responding: err=%d\n", ret);
+ 		goto fail;
+ 	}
+ 	return 0;
+ 
+ fail:
+ 	brcmf_detach(dev);
+ 
+ 	return ret;
+ }
+ 
  void brcmf_bus_add_txhdrlen(struct device *dev, uint len)
  {
  	struct brcmf_bus *bus_if = dev_get_drvdata(dev);
@@@ -1242,6 -1194,12 +1251,12 @@@ void brcmf_bus_change_state(struct brcm
  	int ifidx;
  
  	brcmf_dbg(TRACE, "%d -> %d\n", bus->state, state);
+ 
+ 	if (!drvr) {
+ 		brcmf_dbg(INFO, "ignoring transition, bus not attached yet\n");
+ 		return;
+ 	}
+ 
  	bus->state = state;
  
  	if (state == BRCMF_BUS_UP) {
diff --combined drivers/net/wireless/cisco/Kconfig
index 8ed0b154bb33,26eb8b0c2104..e210ee8aa63b
--- a/drivers/net/wireless/cisco/Kconfig
+++ b/drivers/net/wireless/cisco/Kconfig
@@@ -5,8 -5,8 +5,8 @@@ config WLAN_VENDOR_CISC
  	  If you have a wireless card belonging to this class, say Y.
  
  	  Note that the answer to this question doesn't directly affect the
- 	  kernel: saying N will just cause the configurator to skip all
- 	  the questions about  cards. If you say Y, you will be asked for
+ 	  kernel: saying N will just cause the configurator to skip all the
+ 	  questions about these cards. If you say Y, you will be asked for
  	  your specific card in the following questions.
  
  if WLAN_VENDOR_CISCO
@@@ -33,7 -33,7 +33,7 @@@ config AIR
  
  config AIRO_CS
  	tristate "Cisco/Aironet 34X/35X/4500/4800 PCMCIA cards"
 -	depends on CFG80211 && PCMCIA && (BROKEN || !M32R)
 +	depends on CFG80211 && PCMCIA
  	select WIRELESS_EXT
  	select WEXT_SPY
  	select WEXT_PRIV
diff --combined drivers/s390/net/qeth_core_main.c
index 6dc0338a5233,19203340f879..04fefa5bb08d
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@@ -718,11 -718,8 +718,8 @@@ static int qeth_check_idx_response(stru
  
  	QETH_DBF_HEX(CTRL, 2, buffer, QETH_DBF_CTRL_LEN);
  	if ((buffer[2] & 0xc0) == 0xc0) {
- 		QETH_DBF_MESSAGE(2, "received an IDX TERMINATE "
- 			   "with cause code 0x%02x%s\n",
- 			   buffer[4],
- 			   ((buffer[4] == 0x22) ?
- 			    " -- try another portname" : ""));
+ 		QETH_DBF_MESSAGE(2, "received an IDX TERMINATE with cause code %#02x\n",
+ 				 buffer[4]);
  		QETH_CARD_TEXT(card, 2, "ckidxres");
  		QETH_CARD_TEXT(card, 2, " idxterm");
  		QETH_CARD_TEXT_(card, 2, "  rc%d", -EIO);
@@@ -1372,7 -1369,7 +1369,7 @@@ static void qeth_set_multiple_write_que
  static void qeth_update_from_chp_desc(struct qeth_card *card)
  {
  	struct ccw_device *ccwdev;
 -	struct channel_path_desc *chp_dsc;
 +	struct channel_path_desc_fmt0 *chp_dsc;
  
  	QETH_DBF_TEXT(SETUP, 2, "chp_desc");
  
@@@ -2849,7 -2846,8 +2846,8 @@@ static int qeth_init_input_buffer(struc
  	int i;
  
  	if ((card->options.cq == QETH_CQ_ENABLED) && (!buf->rx_skb)) {
- 		buf->rx_skb = dev_alloc_skb(QETH_RX_PULL_LEN + ETH_HLEN);
+ 		buf->rx_skb = netdev_alloc_skb(card->dev,
+ 					       QETH_RX_PULL_LEN + ETH_HLEN);
  		if (!buf->rx_skb)
  			return 1;
  	}
@@@ -2886,8 -2884,8 +2884,8 @@@ int qeth_init_qdio_queues(struct qeth_c
  	QETH_DBF_TEXT(SETUP, 2, "initqdqs");
  
  	/* inbound queue */
- 	qdio_reset_buffers(card->qdio.in_q->qdio_bufs,
- 			   QDIO_MAX_BUFFERS_PER_Q);
+ 	qdio_reset_buffers(card->qdio.in_q->qdio_bufs, QDIO_MAX_BUFFERS_PER_Q);
+ 	memset(&card->rx, 0, sizeof(struct qeth_rx));
  	qeth_initialize_working_pool_list(card);
  	/*give only as many buffers to hardware as we have buffer pool entries*/
  	for (i = 0; i < card->qdio.in_buf_pool.buf_count - 1; ++i)
@@@ -2962,12 -2960,10 +2960,10 @@@ struct qeth_cmd_buffer *qeth_get_ipacmd
  		enum qeth_ipa_cmds ipacmd, enum qeth_prot_versions prot)
  {
  	struct qeth_cmd_buffer *iob;
- 	struct qeth_ipa_cmd *cmd;
  
  	iob = qeth_get_buffer(&card->write);
  	if (iob) {
- 		cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
- 		qeth_fill_ipacmd_header(card, cmd, ipacmd, prot);
+ 		qeth_fill_ipacmd_header(card, __ipa_cmd(iob), ipacmd, prot);
  	} else {
  		dev_warn(&card->gdev->dev,
  			 "The qeth driver ran out of channel command buffers\n");
@@@ -3078,7 -3074,7 +3074,7 @@@ static struct qeth_cmd_buffer *qeth_get
  	iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETADAPTERPARMS,
  				     QETH_PROT_IPV4);
  	if (iob) {
- 		cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+ 		cmd = __ipa_cmd(iob);
  		cmd->data.setadapterparms.hdr.cmdlength = cmdlen;
  		cmd->data.setadapterparms.hdr.command_code = command;
  		cmd->data.setadapterparms.hdr.used_total = 1;
@@@ -3220,7 -3216,7 +3216,7 @@@ static int qeth_query_setdiagass(struc
  	iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0);
  	if (!iob)
  		return -ENOMEM;
- 	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+ 	cmd = __ipa_cmd(iob);
  	cmd->data.diagass.subcmd_len = 16;
  	cmd->data.diagass.subcmd = QETH_DIAGS_CMD_QUERY;
  	return qeth_send_ipa_cmd(card, iob, qeth_query_setdiagass_cb, NULL);
@@@ -3273,7 -3269,7 +3269,7 @@@ int qeth_hw_trap(struct qeth_card *card
  	iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SET_DIAG_ASS, 0);
  	if (!iob)
  		return -ENOMEM;
- 	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+ 	cmd = __ipa_cmd(iob);
  	cmd->data.diagass.subcmd_len = 80;
  	cmd->data.diagass.subcmd = QETH_DIAGS_CMD_TRAP;
  	cmd->data.diagass.type = 1;
@@@ -4251,7 -4247,7 +4247,7 @@@ void qeth_setadp_promisc_mode(struct qe
  			sizeof(struct qeth_ipacmd_setadpparms_hdr) + 8);
  	if (!iob)
  		return;
- 	cmd = (struct qeth_ipa_cmd *)(iob->data + IPA_PDU_HEADER_SIZE);
+ 	cmd = __ipa_cmd(iob);
  	cmd->data.setadapterparms.data.mode = mode;
  	qeth_send_ipa_cmd(card, iob, qeth_setadp_promisc_mode_cb, NULL);
  }
@@@ -4318,7 -4314,7 +4314,7 @@@ int qeth_setadpparms_change_macaddr(str
  				   sizeof(struct qeth_change_addr));
  	if (!iob)
  		return -ENOMEM;
- 	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+ 	cmd = __ipa_cmd(iob);
  	cmd->data.setadapterparms.data.change_addr.cmd = CHANGE_ADDR_READ_MAC;
  	cmd->data.setadapterparms.data.change_addr.addr_size = ETH_ALEN;
  	ether_addr_copy(cmd->data.setadapterparms.data.change_addr.addr,
@@@ -4433,7 -4429,7 +4429,7 @@@ static int qeth_setadpparms_set_access_
  				   sizeof(struct qeth_set_access_ctrl));
  	if (!iob)
  		return -ENOMEM;
- 	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+ 	cmd = __ipa_cmd(iob);
  	access_ctrl_req = &cmd->data.setadapterparms.data.set_access_ctrl;
  	access_ctrl_req->subcmd_code = isolation;
  
@@@ -4679,7 -4675,7 +4675,7 @@@ static int qeth_snmp_command(struct qet
  		rc = -ENOMEM;
  		goto out;
  	}
- 	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+ 	cmd = __ipa_cmd(iob);
  	memcpy(&cmd->data.setadapterparms.data.snmp, &ureq->cmd, req_len);
  	rc = qeth_send_ipa_snmp_cmd(card, iob, QETH_SETADP_BASE_LEN + req_len,
  				    qeth_snmp_command_cb, (void *)&qinfo);
@@@ -4764,7 -4760,7 +4760,7 @@@ static int qeth_query_oat_command(struc
  		rc = -ENOMEM;
  		goto out_free;
  	}
- 	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+ 	cmd = __ipa_cmd(iob);
  	oat_req = &cmd->data.setadapterparms.data.query_oat;
  	oat_req->subcmd_code = oat_data.command;
  
@@@ -5339,7 -5335,7 +5335,7 @@@ struct sk_buff *qeth_core_get_next_skb(
  	} else {
  		unsigned int linear = (use_rx_sg) ? QETH_RX_PULL_LEN : skb_len;
  
- 		skb = dev_alloc_skb(linear + headroom);
+ 		skb = napi_alloc_skb(&card->napi, linear + headroom);
  	}
  	if (!skb)
  		goto no_mem;
@@@ -5503,7 -5499,7 +5499,7 @@@ struct qeth_cmd_buffer *qeth_get_setass
  	iob = qeth_get_ipacmd_buffer(card, IPA_CMD_SETASSPARMS, prot);
  
  	if (iob) {
- 		cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+ 		cmd = __ipa_cmd(iob);
  		cmd->data.setassparms.hdr.assist_no = ipa_func;
  		cmd->data.setassparms.hdr.length = 8 + len;
  		cmd->data.setassparms.hdr.command_code = cmd_code;
@@@ -5526,7 -5522,7 +5522,7 @@@ int qeth_send_setassparms(struct qeth_c
  
  	QETH_CARD_TEXT(card, 4, "sendassp");
  
- 	cmd = (struct qeth_ipa_cmd *)(iob->data+IPA_PDU_HEADER_SIZE);
+ 	cmd = __ipa_cmd(iob);
  	if (len <= sizeof(__u32))
  		cmd->data.setassparms.data.flags_32bit = (__u32) data;
  	else   /* (len > sizeof(__u32)) */
diff --combined drivers/vhost/net.c
index 12bcfbac2cc9,a31d9b240af8..edc6fec9ad84
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@@ -630,7 -630,7 +630,7 @@@ static int vhost_net_rx_peek_head_len(s
  
  	if (!len && vq->busyloop_timeout) {
  		/* Both tx vq and rx socket were polled here */
 -		mutex_lock(&vq->mutex);
 +		mutex_lock_nested(&vq->mutex, 1);
  		vhost_disable_notify(&net->dev, vq);
  
  		preempt_disable();
@@@ -763,7 -763,7 +763,7 @@@ static void handle_rx(struct vhost_net 
  	struct iov_iter fixup;
  	__virtio16 num_buffers;
  
 -	mutex_lock(&vq->mutex);
 +	mutex_lock_nested(&vq->mutex, 0);
  	sock = vq->private_data;
  	if (!sock)
  		goto out;
@@@ -1040,7 -1040,7 +1040,7 @@@ static struct socket *get_raw_socket(in
  		struct sockaddr_ll sa;
  		char  buf[MAX_ADDR_LEN];
  	} uaddr;
- 	int uaddr_len = sizeof uaddr, r;
+ 	int r;
  	struct socket *sock = sockfd_lookup(fd, &r);
  
  	if (!sock)
@@@ -1052,9 -1052,8 +1052,8 @@@
  		goto err;
  	}
  
- 	r = sock->ops->getname(sock, (struct sockaddr *)&uaddr.sa,
- 			       &uaddr_len, 0);
- 	if (r)
+ 	r = sock->ops->getname(sock, (struct sockaddr *)&uaddr.sa, 0);
+ 	if (r < 0)
  		goto err;
  
  	if (uaddr.sa.sll_family != AF_PACKET) {
diff --combined include/linux/mlx5/device.h
index 413df3c11a46,4b5939c78cdd..38ace22b52ae
--- a/include/linux/mlx5/device.h
+++ b/include/linux/mlx5/device.h
@@@ -1013,6 -1013,7 +1013,7 @@@ enum mlx5_cap_type 
  	MLX5_CAP_RESERVED,
  	MLX5_CAP_VECTOR_CALC,
  	MLX5_CAP_QOS,
+ 	MLX5_CAP_DEBUG,
  	/* NUM OF CAP Types */
  	MLX5_CAP_NUM
  };
@@@ -1140,6 -1141,9 +1141,9 @@@ enum mlx5_qcam_feature_groups 
  #define MLX5_CAP_QOS(mdev, cap)\
  	MLX5_GET(qos_cap, mdev->caps.hca_cur[MLX5_CAP_QOS], cap)
  
+ #define MLX5_CAP_DEBUG(mdev, cap)\
+ 	MLX5_GET(debug_cap, mdev->caps.hca_cur[MLX5_CAP_DEBUG], cap)
+ 
  #define MLX5_CAP_PCAM_FEATURE(mdev, fld) \
  	MLX5_GET(pcam_reg, (mdev)->caps.pcam, feature_cap_mask.enhanced_features.fld)
  
@@@ -1204,8 -1208,8 +1208,8 @@@ static inline u16 mlx5_to_sw_pkey_sz(in
  	return MLX5_MIN_PKEY_TABLE_SIZE << pkey_sz;
  }
  
 -#define MLX5_BY_PASS_NUM_REGULAR_PRIOS 8
 -#define MLX5_BY_PASS_NUM_DONT_TRAP_PRIOS 8
 +#define MLX5_BY_PASS_NUM_REGULAR_PRIOS 16
 +#define MLX5_BY_PASS_NUM_DONT_TRAP_PRIOS 16
  #define MLX5_BY_PASS_NUM_MULTICAST_PRIOS 1
  #define MLX5_BY_PASS_NUM_PRIOS (MLX5_BY_PASS_NUM_REGULAR_PRIOS +\
  				MLX5_BY_PASS_NUM_DONT_TRAP_PRIOS +\
diff --combined include/linux/mlx5/mlx5_ifc.h
index c63bbdc35503,c19e611d2782..e78527624fcb
--- a/include/linux/mlx5/mlx5_ifc.h
+++ b/include/linux/mlx5/mlx5_ifc.h
@@@ -143,6 -143,7 +143,7 @@@ enum 
  	MLX5_CMD_OP_MODIFY_HCA_VPORT_CONTEXT      = 0x763,
  	MLX5_CMD_OP_QUERY_HCA_VPORT_GID           = 0x764,
  	MLX5_CMD_OP_QUERY_HCA_VPORT_PKEY          = 0x765,
+ 	MLX5_CMD_OP_QUERY_VNIC_ENV                = 0x76f,
  	MLX5_CMD_OP_QUERY_VPORT_COUNTER           = 0x770,
  	MLX5_CMD_OP_ALLOC_Q_COUNTER               = 0x771,
  	MLX5_CMD_OP_DEALLOC_Q_COUNTER             = 0x772,
@@@ -313,7 -314,10 +314,10 @@@ struct mlx5_ifc_flow_table_prop_layout_
  	u8         flow_table_modify[0x1];
  	u8         encap[0x1];
  	u8         decap[0x1];
- 	u8         reserved_at_9[0x17];
+ 	u8         reserved_at_9[0x1];
+ 	u8         pop_vlan[0x1];
+ 	u8         push_vlan[0x1];
+ 	u8         reserved_at_c[0x14];
  
  	u8         reserved_at_20[0x2];
  	u8         log_max_ft_size[0x6];
@@@ -571,10 -575,7 +575,10 @@@ struct mlx5_ifc_qos_cap_bits 
  	u8         esw_scheduling[0x1];
  	u8         esw_bw_share[0x1];
  	u8         esw_rate_limit[0x1];
 -	u8         reserved_at_4[0x1c];
 +	u8         reserved_at_4[0x1];
 +	u8         packet_pacing_burst_bound[0x1];
 +	u8         packet_pacing_typical_size[0x1];
 +	u8         reserved_at_7[0x19];
  
  	u8         reserved_at_20[0x20];
  
@@@ -596,6 -597,16 +600,16 @@@
  	u8         reserved_at_100[0x700];
  };
  
+ struct mlx5_ifc_debug_cap_bits {
+ 	u8         reserved_at_0[0x20];
+ 
+ 	u8         reserved_at_20[0x2];
+ 	u8         stall_detect[0x1];
+ 	u8         reserved_at_23[0x1d];
+ 
+ 	u8         reserved_at_40[0x7c0];
+ };
+ 
  struct mlx5_ifc_per_protocol_networking_offload_caps_bits {
  	u8         csum_cap[0x1];
  	u8         vlan_cap[0x1];
@@@ -858,7 -869,7 +872,7 @@@ struct mlx5_ifc_cmd_hca_cap_bits 
  	u8         out_of_seq_cnt[0x1];
  	u8         vport_counters[0x1];
  	u8         retransmission_q_counters[0x1];
- 	u8         reserved_at_183[0x1];
+ 	u8         debug[0x1];
  	u8         modify_rq_counter_set_id[0x1];
  	u8         rq_delay_drop[0x1];
  	u8         max_qp_cnt[0xa];
@@@ -868,7 -879,7 +882,7 @@@
  	u8         vhca_group_manager[0x1];
  	u8         ib_virt[0x1];
  	u8         eth_virt[0x1];
- 	u8         reserved_at_1a4[0x1];
+ 	u8         vnic_env_queue_counters[0x1];
  	u8         ets[0x1];
  	u8         nic_flow_table[0x1];
  	u8         eswitch_flow_table[0x1];
@@@ -1000,7 -1011,10 +1014,10 @@@
  	u8         reserved_at_330[0xb];
  	u8         log_max_xrcd[0x5];
  
- 	u8         reserved_at_340[0x8];
+ 	u8         nic_receive_steering_discard[0x1];
+ 	u8         receive_discard_vport_down[0x1];
+ 	u8         transmit_discard_vport_down[0x1];
+ 	u8         reserved_at_343[0x5];
  	u8         log_max_flow_counter_bulk[0x8];
  	u8         max_flow_counter_15_0[0x10];
  
@@@ -1575,7 -1589,17 +1592,17 @@@ struct mlx5_ifc_eth_per_prio_grp_data_l
  
  	u8         rx_pause_transition_low[0x20];
  
- 	u8         reserved_at_3c0[0x400];
+ 	u8         reserved_at_3c0[0x40];
+ 
+ 	u8         device_stall_minor_watermark_cnt_high[0x20];
+ 
+ 	u8         device_stall_minor_watermark_cnt_low[0x20];
+ 
+ 	u8         device_stall_critical_watermark_cnt_high[0x20];
+ 
+ 	u8         device_stall_critical_watermark_cnt_low[0x20];
+ 
+ 	u8         reserved_at_480[0x340];
  };
  
  struct mlx5_ifc_eth_extended_cntrs_grp_data_layout_bits {
@@@ -2290,10 -2314,19 +2317,19 @@@ enum 
  	MLX5_FLOW_CONTEXT_ACTION_ENCAP     = 0x10,
  	MLX5_FLOW_CONTEXT_ACTION_DECAP     = 0x20,
  	MLX5_FLOW_CONTEXT_ACTION_MOD_HDR   = 0x40,
+ 	MLX5_FLOW_CONTEXT_ACTION_VLAN_POP  = 0x80,
+ 	MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH = 0x100,
+ };
+ 
+ struct mlx5_ifc_vlan_bits {
+ 	u8         ethtype[0x10];
+ 	u8         prio[0x3];
+ 	u8         cfi[0x1];
+ 	u8         vid[0xc];
  };
  
  struct mlx5_ifc_flow_context_bits {
- 	u8         reserved_at_0[0x20];
+ 	struct mlx5_ifc_vlan_bits push_vlan;
  
  	u8         group_id[0x20];
  
@@@ -2369,6 -2402,24 +2405,24 @@@ struct mlx5_ifc_xrc_srqc_bits 
  	u8         reserved_at_180[0x80];
  };
  
+ struct mlx5_ifc_vnic_diagnostic_statistics_bits {
+ 	u8         counter_error_queues[0x20];
+ 
+ 	u8         total_error_queues[0x20];
+ 
+ 	u8         send_queue_priority_update_flow[0x20];
+ 
+ 	u8         reserved_at_60[0x20];
+ 
+ 	u8         nic_receive_steering_discard[0x40];
+ 
+ 	u8         receive_discard_vport_down[0x40];
+ 
+ 	u8         transmit_discard_vport_down[0x40];
+ 
+ 	u8         reserved_at_140[0xec0];
+ };
+ 
  struct mlx5_ifc_traffic_counter_bits {
  	u8         packets[0x40];
  
@@@ -3644,6 -3695,35 +3698,35 @@@ struct mlx5_ifc_query_vport_state_in_bi
  	u8         reserved_at_60[0x20];
  };
  
+ struct mlx5_ifc_query_vnic_env_out_bits {
+ 	u8         status[0x8];
+ 	u8         reserved_at_8[0x18];
+ 
+ 	u8         syndrome[0x20];
+ 
+ 	u8         reserved_at_40[0x40];
+ 
+ 	struct mlx5_ifc_vnic_diagnostic_statistics_bits vport_env;
+ };
+ 
+ enum {
+ 	MLX5_QUERY_VNIC_ENV_IN_OP_MOD_VPORT_DIAG_STATISTICS  = 0x0,
+ };
+ 
+ struct mlx5_ifc_query_vnic_env_in_bits {
+ 	u8         opcode[0x10];
+ 	u8         reserved_at_10[0x10];
+ 
+ 	u8         reserved_at_20[0x10];
+ 	u8         op_mod[0x10];
+ 
+ 	u8         other_vport[0x1];
+ 	u8         reserved_at_41[0xf];
+ 	u8         vport_number[0x10];
+ 
+ 	u8         reserved_at_60[0x20];
+ };
+ 
  struct mlx5_ifc_query_vport_counter_out_bits {
  	u8         status[0x8];
  	u8         reserved_at_8[0x18];
@@@ -7316,12 -7396,7 +7399,12 @@@ struct mlx5_ifc_set_pp_rate_limit_in_bi
  
  	u8         rate_limit[0x20];
  
 -	u8         reserved_at_a0[0x160];
 +	u8	   burst_upper_bound[0x20];
 +
 +	u8         reserved_at_c0[0x10];
 +	u8	   typical_packet_size[0x10];
 +
 +	u8         reserved_at_e0[0x120];
  };
  
  struct mlx5_ifc_access_register_out_bits {
@@@ -7821,7 -7896,11 +7904,11 @@@ struct mlx5_ifc_pifr_reg_bits 
  struct mlx5_ifc_pfcc_reg_bits {
  	u8         reserved_at_0[0x8];
  	u8         local_port[0x8];
- 	u8         reserved_at_10[0x10];
+ 	u8         reserved_at_10[0xb];
+ 	u8         ppan_mask_n[0x1];
+ 	u8         minor_stall_mask[0x1];
+ 	u8         critical_stall_mask[0x1];
+ 	u8         reserved_at_1e[0x2];
  
  	u8         ppan[0x4];
  	u8         reserved_at_24[0x4];
@@@ -7831,17 -7910,22 +7918,22 @@@
  
  	u8         pptx[0x1];
  	u8         aptx[0x1];
- 	u8         reserved_at_42[0x6];
+ 	u8         pptx_mask_n[0x1];
+ 	u8         reserved_at_43[0x5];
  	u8         pfctx[0x8];
  	u8         reserved_at_50[0x10];
  
  	u8         pprx[0x1];
  	u8         aprx[0x1];
- 	u8         reserved_at_62[0x6];
+ 	u8         pprx_mask_n[0x1];
+ 	u8         reserved_at_63[0x5];
  	u8         pfcrx[0x8];
  	u8         reserved_at_70[0x10];
  
- 	u8         reserved_at_80[0x80];
+ 	u8         device_stall_minor_watermark[0x10];
+ 	u8         device_stall_critical_watermark[0x10];
+ 
+ 	u8         reserved_at_a0[0x60];
  };
  
  struct mlx5_ifc_pelc_reg_bits {
@@@ -7882,8 -7966,10 +7974,10 @@@ struct mlx5_ifc_peir_reg_bits 
  };
  
  struct mlx5_ifc_pcam_enhanced_features_bits {
- 	u8         reserved_at_0[0x7b];
+ 	u8         reserved_at_0[0x76];
  
+ 	u8         pfcc_mask[0x1];
+ 	u8         reserved_at_77[0x4];
  	u8         rx_buffer_fullness_counters[0x1];
  	u8         ptys_connector_type[0x1];
  	u8         reserved_at_7d[0x1];
diff --combined include/linux/socket.h
index e2b6bd4fe977,60e01482a9c4..1acf827850cc
--- a/include/linux/socket.h
+++ b/include/linux/socket.h
@@@ -287,6 -287,7 +287,7 @@@ struct ucred 
  #define MSG_SENDPAGE_NOTLAST 0x20000 /* sendpage() internal : not the last page */
  #define MSG_BATCH	0x40000 /* sendmmsg(): more messages coming */
  #define MSG_EOF         MSG_FIN
+ #define MSG_NO_SHARED_FRAGS 0x80000 /* sendpage() internal : page frags are not shared */
  
  #define MSG_ZEROCOPY	0x4000000	/* Use user data in kernel path */
  #define MSG_FASTOPEN	0x20000000	/* Send data in TCP SYN */
@@@ -346,40 -347,13 +347,41 @@@ extern int put_cmsg(struct msghdr*, in
  
  struct timespec;
  
 -/* The __sys_...msg variants allow MSG_CMSG_COMPAT */
 -extern long __sys_recvmsg(int fd, struct user_msghdr __user *msg, unsigned flags);
 -extern long __sys_sendmsg(int fd, struct user_msghdr __user *msg, unsigned flags);
 +/* The __sys_...msg variants allow MSG_CMSG_COMPAT iff
 + * forbid_cmsg_compat==false
 + */
 +extern long __sys_recvmsg(int fd, struct user_msghdr __user *msg,
 +			  unsigned int flags, bool forbid_cmsg_compat);
 +extern long __sys_sendmsg(int fd, struct user_msghdr __user *msg,
 +			  unsigned int flags, bool forbid_cmsg_compat);
  extern int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
  			  unsigned int flags, struct timespec *timeout);
  extern int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg,
 -			  unsigned int vlen, unsigned int flags);
 +			  unsigned int vlen, unsigned int flags,
 +			  bool forbid_cmsg_compat);
 +
 +/* helpers which do the actual work for syscalls */
 +extern int __sys_recvfrom(int fd, void __user *ubuf, size_t size,
 +			  unsigned int flags, struct sockaddr __user *addr,
 +			  int __user *addr_len);
 +extern int __sys_sendto(int fd, void __user *buff, size_t len,
 +			unsigned int flags, struct sockaddr __user *addr,
 +			int addr_len);
 +extern int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
 +			 int __user *upeer_addrlen, int flags);
 +extern int __sys_socket(int family, int type, int protocol);
 +extern int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen);
 +extern int __sys_connect(int fd, struct sockaddr __user *uservaddr,
 +			 int addrlen);
 +extern int __sys_listen(int fd, int backlog);
 +extern int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
 +			     int __user *usockaddr_len);
 +extern int __sys_getpeername(int fd, struct sockaddr __user *usockaddr,
 +			     int __user *usockaddr_len);
 +extern int __sys_socketpair(int family, int type, int protocol,
 +			    int __user *usockvec);
 +extern int __sys_shutdown(int fd, int how);
 +
  
+ extern struct ns_common *get_net_ns(struct ns_common *ns);
  #endif /* _LINUX_SOCKET_H */
diff --combined include/net/sch_generic.h
index 8da32678ce18,493e311bbe93..5154c8300262
--- a/include/net/sch_generic.h
+++ b/include/net/sch_generic.h
@@@ -30,7 -30,6 +30,7 @@@ struct qdisc_rate_table 
  enum qdisc_state_t {
  	__QDISC_STATE_SCHED,
  	__QDISC_STATE_DEACTIVATED,
 +	__QDISC_STATE_RUNNING,
  };
  
  struct qdisc_size_table {
@@@ -541,7 -540,7 +541,7 @@@ static inline bool skb_skip_tc_classify
  	return false;
  }
  
- /* Reset all TX qdiscs greater then index of a device.  */
+ /* Reset all TX qdiscs greater than index of a device.  */
  static inline void qdisc_reset_all_tx_gt(struct net_device *dev, unsigned int i)
  {
  	struct Qdisc *qdisc;
diff --combined include/rdma/ib_verbs.h
index 384124780ca8,6eb174753acf..5ca890ad4618
--- a/include/rdma/ib_verbs.h
+++ b/include/rdma/ib_verbs.h
@@@ -64,7 -64,6 +64,7 @@@
  #include <linux/cgroup_rdma.h>
  #include <uapi/rdma/ib_user_verbs.h>
  #include <rdma/restrack.h>
 +#include <uapi/rdma/rdma_user_ioctl.h>
  
  #define IB_FW_VERSION_NAME_MAX	ETHTOOL_FWVERS_LEN
  
@@@ -1769,11 -1768,6 +1769,11 @@@ struct ib_mr 
  		struct ib_uobject	*uobject;	/* user */
  		struct list_head	qp_entry;	/* FR */
  	};
 +
 +	/*
 +	 * Implementation details of the RDMA core, don't use in drivers:
 +	 */
 +	struct rdma_restrack_entry res;
  };
  
  struct ib_mw {
@@@ -2128,8 -2122,8 +2128,8 @@@ struct ib_device 
  	 * net device of device @device at port @port_num or NULL if such
  	 * a net device doesn't exist. The vendor driver should call dev_hold
  	 * on this net device. The HW vendor's device driver must guarantee
- 	 * that this function returns NULL before the net device reaches
- 	 * NETDEV_UNREGISTER_FINAL state.
+ 	 * that this function returns NULL before the net device has finished
+ 	 * NETDEV_UNREGISTER state.
  	 */
  	struct net_device	  *(*get_netdev)(struct ib_device *device,
  						 u8 port_num);
@@@ -2382,7 -2376,6 +2382,7 @@@
  						     int comp_vector);
  
  	struct uverbs_root_spec		*specs_root;
 +	enum rdma_driver_id		driver_id;
  };
  
  struct ib_client {
@@@ -2442,9 -2435,11 +2442,9 @@@ static inline int ib_copy_to_udata(stru
  	return copy_to_user(udata->outbuf, src, len) ? -EFAULT : 0;
  }
  
 -static inline bool ib_is_udata_cleared(struct ib_udata *udata,
 -				       size_t offset,
 -				       size_t len)
 +static inline bool ib_is_buffer_cleared(const void __user *p,
 +					size_t len)
  {
 -	const void __user *p = udata->inbuf + offset;
  	bool ret;
  	u8 *buf;
  
@@@ -2460,13 -2455,6 +2460,13 @@@
  	return ret;
  }
  
 +static inline bool ib_is_udata_cleared(struct ib_udata *udata,
 +				       size_t offset,
 +				       size_t len)
 +{
 +	return ib_is_buffer_cleared(udata->inbuf + offset, len);
 +}
 +
  /**
   * ib_modify_qp_is_ok - Check that the supplied attribute mask
   * contains all required attributes and no attributes not allowed for
@@@ -2483,9 -2471,9 +2483,9 @@@
   * transition from cur_state to next_state is allowed by the IB spec,
   * and that the attribute mask supplied is allowed for the transition.
   */
 -int ib_modify_qp_is_ok(enum ib_qp_state cur_state, enum ib_qp_state next_state,
 -		       enum ib_qp_type type, enum ib_qp_attr_mask mask,
 -		       enum rdma_link_layer ll);
 +bool ib_modify_qp_is_ok(enum ib_qp_state cur_state, enum ib_qp_state next_state,
 +			enum ib_qp_type type, enum ib_qp_attr_mask mask,
 +			enum rdma_link_layer ll);
  
  void ib_register_event_handler(struct ib_event_handler *event_handler);
  void ib_unregister_event_handler(struct ib_event_handler *event_handler);
@@@ -2860,7 -2848,7 +2860,7 @@@ int ib_modify_port(struct ib_device *de
  		   struct ib_port_modify *port_modify);
  
  int ib_find_gid(struct ib_device *device, union ib_gid *gid,
 -		struct net_device *ndev, u8 *port_num, u16 *index);
 +		u8 *port_num, u16 *index);
  
  int ib_find_pkey(struct ib_device *device,
  		 u8 port_num, u16 pkey, u16 *index);
@@@ -3229,6 -3217,18 +3229,6 @@@ static inline int ib_poll_cq(struct ib_
  }
  
  /**
 - * ib_peek_cq - Returns the number of unreaped completions currently
 - *   on the specified CQ.
 - * @cq: The CQ to peek.
 - * @wc_cnt: A minimum number of unreaped completions to check for.
 - *
 - * If the number of unreaped completions is greater than or equal to wc_cnt,
 - * this function returns wc_cnt, otherwise, it returns the actual number of
 - * unreaped completions.
 - */
 -int ib_peek_cq(struct ib_cq *cq, int wc_cnt);
 -
 -/**
   * ib_req_notify_cq - Request completion notification on a CQ.
   * @cq: The CQ to generate an event for.
   * @flags:
diff --combined kernel/bpf/syscall.c
index 0295c95eb2f6,dd172ee16716..2f0c569fccb2
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@@ -1315,7 -1315,8 +1315,8 @@@ static int bpf_obj_get(const union bpf_
  
  #define BPF_PROG_ATTACH_LAST_FIELD attach_flags
  
- static int sockmap_get_from_fd(const union bpf_attr *attr, bool attach)
+ static int sockmap_get_from_fd(const union bpf_attr *attr,
+ 			       int type, bool attach)
  {
  	struct bpf_prog *prog = NULL;
  	int ufd = attr->target_fd;
@@@ -1329,8 -1330,7 +1330,7 @@@
  		return PTR_ERR(map);
  
  	if (attach) {
- 		prog = bpf_prog_get_type(attr->attach_bpf_fd,
- 					 BPF_PROG_TYPE_SK_SKB);
+ 		prog = bpf_prog_get_type(attr->attach_bpf_fd, type);
  		if (IS_ERR(prog)) {
  			fdput(f);
  			return PTR_ERR(prog);
@@@ -1382,9 -1382,11 +1382,11 @@@ static int bpf_prog_attach(const union 
  	case BPF_CGROUP_DEVICE:
  		ptype = BPF_PROG_TYPE_CGROUP_DEVICE;
  		break;
+ 	case BPF_SK_MSG_VERDICT:
+ 		return sockmap_get_from_fd(attr, BPF_PROG_TYPE_SK_MSG, true);
  	case BPF_SK_SKB_STREAM_PARSER:
  	case BPF_SK_SKB_STREAM_VERDICT:
- 		return sockmap_get_from_fd(attr, true);
+ 		return sockmap_get_from_fd(attr, BPF_PROG_TYPE_SK_SKB, true);
  	default:
  		return -EINVAL;
  	}
@@@ -1437,9 -1439,11 +1439,11 @@@ static int bpf_prog_detach(const union 
  	case BPF_CGROUP_DEVICE:
  		ptype = BPF_PROG_TYPE_CGROUP_DEVICE;
  		break;
+ 	case BPF_SK_MSG_VERDICT:
+ 		return sockmap_get_from_fd(attr, BPF_PROG_TYPE_SK_MSG, false);
  	case BPF_SK_SKB_STREAM_PARSER:
  	case BPF_SK_SKB_STREAM_VERDICT:
- 		return sockmap_get_from_fd(attr, false);
+ 		return sockmap_get_from_fd(attr, BPF_PROG_TYPE_SK_SKB, false);
  	default:
  		return -EINVAL;
  	}
@@@ -1848,9 -1852,6 +1852,9 @@@ SYSCALL_DEFINE3(bpf, int, cmd, union bp
  	if (sysctl_unprivileged_bpf_disabled && !capable(CAP_SYS_ADMIN))
  		return -EPERM;
  
 +	if (kernel_is_locked_down("BPF"))
 +		return -EPERM;
 +
  	err = check_uarg_tail_zero(uattr, sizeof(attr), size);
  	if (err)
  		return err;
diff --combined net/batman-adv/gateway_client.c
index 808d2dd4a839,c294f6fd43e0..8b198ee798c9
--- a/net/batman-adv/gateway_client.c
+++ b/net/batman-adv/gateway_client.c
@@@ -1,5 -1,5 +1,5 @@@
  // SPDX-License-Identifier: GPL-2.0
- /* Copyright (C) 2009-2017  B.A.T.M.A.N. contributors:
+ /* Copyright (C) 2009-2018  B.A.T.M.A.N. contributors:
   *
   * Marek Lindner
   *
@@@ -746,7 -746,7 +746,7 @@@ bool batadv_gw_out_of_range(struct bata
  {
  	struct batadv_neigh_node *neigh_curr = NULL;
  	struct batadv_neigh_node *neigh_old = NULL;
 -	struct batadv_orig_node *orig_dst_node;
 +	struct batadv_orig_node *orig_dst_node = NULL;
  	struct batadv_gw_node *gw_node = NULL;
  	struct batadv_gw_node *curr_gw = NULL;
  	struct batadv_neigh_ifinfo *curr_ifinfo, *old_ifinfo;
@@@ -757,9 -757,6 +757,9 @@@
  
  	vid = batadv_get_vid(skb, 0);
  
 +	if (is_multicast_ether_addr(ethhdr->h_dest))
 +		goto out;
 +
  	orig_dst_node = batadv_transtable_search(bat_priv, ethhdr->h_source,
  						 ethhdr->h_dest, vid);
  	if (!orig_dst_node)
diff --combined net/batman-adv/multicast.c
index ee56af5c43e0,de3a055f7dd8..a11d3d89f012
--- a/net/batman-adv/multicast.c
+++ b/net/batman-adv/multicast.c
@@@ -1,5 -1,5 +1,5 @@@
  // SPDX-License-Identifier: GPL-2.0
- /* Copyright (C) 2014-2017  B.A.T.M.A.N. contributors:
+ /* Copyright (C) 2014-2018  B.A.T.M.A.N. contributors:
   *
   * Linus L├╝ssing
   *
@@@ -40,6 -40,7 +40,7 @@@
  #include <linux/list.h>
  #include <linux/lockdep.h>
  #include <linux/netdevice.h>
+ #include <linux/netlink.h>
  #include <linux/printk.h>
  #include <linux/rculist.h>
  #include <linux/rcupdate.h>
@@@ -52,14 -53,20 +53,20 @@@
  #include <linux/types.h>
  #include <linux/workqueue.h>
  #include <net/addrconf.h>
+ #include <net/genetlink.h>
  #include <net/if_inet6.h>
  #include <net/ip.h>
  #include <net/ipv6.h>
+ #include <net/netlink.h>
+ #include <net/sock.h>
  #include <uapi/linux/batadv_packet.h>
+ #include <uapi/linux/batman_adv.h>
  
  #include "hard-interface.h"
  #include "hash.h"
  #include "log.h"
+ #include "netlink.h"
+ #include "soft-interface.h"
  #include "translation-table.h"
  #include "tvlv.h"
  
@@@ -102,7 -109,36 +109,36 @@@ static struct net_device *batadv_mcast_
  }
  
  /**
+  * batadv_mcast_addr_is_ipv4() - check if multicast MAC is IPv4
+  * @addr: the MAC address to check
+  *
+  * Return: True, if MAC address is one reserved for IPv4 multicast, false
+  * otherwise.
+  */
+ static bool batadv_mcast_addr_is_ipv4(const u8 *addr)
+ {
+ 	static const u8 prefix[] = {0x01, 0x00, 0x5E};
+ 
+ 	return memcmp(prefix, addr, sizeof(prefix)) == 0;
+ }
+ 
+ /**
+  * batadv_mcast_addr_is_ipv6() - check if multicast MAC is IPv6
+  * @addr: the MAC address to check
+  *
+  * Return: True, if MAC address is one reserved for IPv6 multicast, false
+  * otherwise.
+  */
+ static bool batadv_mcast_addr_is_ipv6(const u8 *addr)
+ {
+ 	static const u8 prefix[] = {0x33, 0x33};
+ 
+ 	return memcmp(prefix, addr, sizeof(prefix)) == 0;
+ }
+ 
+ /**
   * batadv_mcast_mla_softif_get() - get softif multicast listeners
+  * @bat_priv: the bat priv with all the soft interface information
   * @dev: the device to collect multicast addresses from
   * @mcast_list: a list to put found addresses into
   *
@@@ -119,9 -155,12 +155,12 @@@
   * Return: -ENOMEM on memory allocation error or the number of
   * items added to the mcast_list otherwise.
   */
- static int batadv_mcast_mla_softif_get(struct net_device *dev,
+ static int batadv_mcast_mla_softif_get(struct batadv_priv *bat_priv,
+ 				       struct net_device *dev,
  				       struct hlist_head *mcast_list)
  {
+ 	bool all_ipv4 = bat_priv->mcast.flags & BATADV_MCAST_WANT_ALL_IPV4;
+ 	bool all_ipv6 = bat_priv->mcast.flags & BATADV_MCAST_WANT_ALL_IPV6;
  	struct net_device *bridge = batadv_mcast_get_bridge(dev);
  	struct netdev_hw_addr *mc_list_entry;
  	struct batadv_hw_addr *new;
@@@ -129,6 -168,12 +168,12 @@@
  
  	netif_addr_lock_bh(bridge ? bridge : dev);
  	netdev_for_each_mc_addr(mc_list_entry, bridge ? bridge : dev) {
+ 		if (all_ipv4 && batadv_mcast_addr_is_ipv4(mc_list_entry->addr))
+ 			continue;
+ 
+ 		if (all_ipv6 && batadv_mcast_addr_is_ipv6(mc_list_entry->addr))
+ 			continue;
+ 
  		new = kmalloc(sizeof(*new), GFP_ATOMIC);
  		if (!new) {
  			ret = -ENOMEM;
@@@ -193,6 -238,7 +238,7 @@@ static void batadv_mcast_mla_br_addr_cp
  
  /**
   * batadv_mcast_mla_bridge_get() - get bridged-in multicast listeners
+  * @bat_priv: the bat priv with all the soft interface information
   * @dev: a bridge slave whose bridge to collect multicast addresses from
   * @mcast_list: a list to put found addresses into
   *
@@@ -204,10 -250,13 +250,13 @@@
   * Return: -ENOMEM on memory allocation error or the number of
   * items added to the mcast_list otherwise.
   */
- static int batadv_mcast_mla_bridge_get(struct net_device *dev,
+ static int batadv_mcast_mla_bridge_get(struct batadv_priv *bat_priv,
+ 				       struct net_device *dev,
  				       struct hlist_head *mcast_list)
  {
  	struct list_head bridge_mcast_list = LIST_HEAD_INIT(bridge_mcast_list);
+ 	bool all_ipv4 = bat_priv->mcast.flags & BATADV_MCAST_WANT_ALL_IPV4;
+ 	bool all_ipv6 = bat_priv->mcast.flags & BATADV_MCAST_WANT_ALL_IPV6;
  	struct br_ip_list *br_ip_entry, *tmp;
  	struct batadv_hw_addr *new;
  	u8 mcast_addr[ETH_ALEN];
@@@ -221,6 -270,12 +270,12 @@@
  		goto out;
  
  	list_for_each_entry(br_ip_entry, &bridge_mcast_list, list) {
+ 		if (all_ipv4 && br_ip_entry->addr.proto == htons(ETH_P_IP))
+ 			continue;
+ 
+ 		if (all_ipv6 && br_ip_entry->addr.proto == htons(ETH_P_IPV6))
+ 			continue;
+ 
  		batadv_mcast_mla_br_addr_cpy(mcast_addr, &br_ip_entry->addr);
  		if (batadv_mcast_mla_is_duplicate(mcast_addr, mcast_list))
  			continue;
@@@ -568,11 -623,11 +623,11 @@@ static void __batadv_mcast_mla_update(s
  	if (!batadv_mcast_mla_tvlv_update(bat_priv))
  		goto update;
  
- 	ret = batadv_mcast_mla_softif_get(soft_iface, &mcast_list);
+ 	ret = batadv_mcast_mla_softif_get(bat_priv, soft_iface, &mcast_list);
  	if (ret < 0)
  		goto out;
  
- 	ret = batadv_mcast_mla_bridge_get(soft_iface, &mcast_list);
+ 	ret = batadv_mcast_mla_bridge_get(bat_priv, soft_iface, &mcast_list);
  	if (ret < 0)
  		goto out;
  
@@@ -814,8 -869,8 +869,8 @@@ static struct batadv_orig_node 
  batadv_mcast_forw_tt_node_get(struct batadv_priv *bat_priv,
  			      struct ethhdr *ethhdr)
  {
 -	return batadv_transtable_search(bat_priv, ethhdr->h_source,
 -					ethhdr->h_dest, BATADV_NO_FLAGS);
 +	return batadv_transtable_search(bat_priv, NULL, ethhdr->h_dest,
 +					BATADV_NO_FLAGS);
  }
  
  /**
@@@ -1286,6 -1341,236 +1341,236 @@@ int batadv_mcast_flags_seq_print_text(s
  #endif
  
  /**
+  * batadv_mcast_mesh_info_put() - put multicast info into a netlink message
+  * @msg: buffer for the message
+  * @bat_priv: the bat priv with all the soft interface information
+  *
+  * Return: 0 or error code.
+  */
+ int batadv_mcast_mesh_info_put(struct sk_buff *msg,
+ 			       struct batadv_priv *bat_priv)
+ {
+ 	u32 flags = bat_priv->mcast.flags;
+ 	u32 flags_priv = BATADV_NO_FLAGS;
+ 
+ 	if (bat_priv->mcast.bridged) {
+ 		flags_priv |= BATADV_MCAST_FLAGS_BRIDGED;
+ 
+ 		if (bat_priv->mcast.querier_ipv4.exists)
+ 			flags_priv |= BATADV_MCAST_FLAGS_QUERIER_IPV4_EXISTS;
+ 		if (bat_priv->mcast.querier_ipv6.exists)
+ 			flags_priv |= BATADV_MCAST_FLAGS_QUERIER_IPV6_EXISTS;
+ 		if (bat_priv->mcast.querier_ipv4.shadowing)
+ 			flags_priv |= BATADV_MCAST_FLAGS_QUERIER_IPV4_SHADOWING;
+ 		if (bat_priv->mcast.querier_ipv6.shadowing)
+ 			flags_priv |= BATADV_MCAST_FLAGS_QUERIER_IPV6_SHADOWING;
+ 	}
+ 
+ 	if (nla_put_u32(msg, BATADV_ATTR_MCAST_FLAGS, flags) ||
+ 	    nla_put_u32(msg, BATADV_ATTR_MCAST_FLAGS_PRIV, flags_priv))
+ 		return -EMSGSIZE;
+ 
+ 	return 0;
+ }
+ 
+ /**
+  * batadv_mcast_flags_dump_entry() - dump one entry of the multicast flags table
+  *  to a netlink socket
+  * @msg: buffer for the message
+  * @portid: netlink port
+  * @seq: Sequence number of netlink message
+  * @orig_node: originator to dump the multicast flags of
+  *
+  * Return: 0 or error code.
+  */
+ static int
+ batadv_mcast_flags_dump_entry(struct sk_buff *msg, u32 portid, u32 seq,
+ 			      struct batadv_orig_node *orig_node)
+ {
+ 	void *hdr;
+ 
+ 	hdr = genlmsg_put(msg, portid, seq, &batadv_netlink_family,
+ 			  NLM_F_MULTI, BATADV_CMD_GET_MCAST_FLAGS);
+ 	if (!hdr)
+ 		return -ENOBUFS;
+ 
+ 	if (nla_put(msg, BATADV_ATTR_ORIG_ADDRESS, ETH_ALEN,
+ 		    orig_node->orig)) {
+ 		genlmsg_cancel(msg, hdr);
+ 		return -EMSGSIZE;
+ 	}
+ 
+ 	if (test_bit(BATADV_ORIG_CAPA_HAS_MCAST,
+ 		     &orig_node->capabilities)) {
+ 		if (nla_put_u32(msg, BATADV_ATTR_MCAST_FLAGS,
+ 				orig_node->mcast_flags)) {
+ 			genlmsg_cancel(msg, hdr);
+ 			return -EMSGSIZE;
+ 		}
+ 	}
+ 
+ 	genlmsg_end(msg, hdr);
+ 	return 0;
+ }
+ 
+ /**
+  * batadv_mcast_flags_dump_bucket() - dump one bucket of the multicast flags
+  *  table to a netlink socket
+  * @msg: buffer for the message
+  * @portid: netlink port
+  * @seq: Sequence number of netlink message
+  * @head: bucket to dump
+  * @idx_skip: How many entries to skip
+  *
+  * Return: 0 or error code.
+  */
+ static int
+ batadv_mcast_flags_dump_bucket(struct sk_buff *msg, u32 portid, u32 seq,
+ 			       struct hlist_head *head, long *idx_skip)
+ {
+ 	struct batadv_orig_node *orig_node;
+ 	long idx = 0;
+ 
+ 	rcu_read_lock();
+ 	hlist_for_each_entry_rcu(orig_node, head, hash_entry) {
+ 		if (!test_bit(BATADV_ORIG_CAPA_HAS_MCAST,
+ 			      &orig_node->capa_initialized))
+ 			continue;
+ 
+ 		if (idx < *idx_skip)
+ 			goto skip;
+ 
+ 		if (batadv_mcast_flags_dump_entry(msg, portid, seq,
+ 						  orig_node)) {
+ 			rcu_read_unlock();
+ 			*idx_skip = idx;
+ 
+ 			return -EMSGSIZE;
+ 		}
+ 
+ skip:
+ 		idx++;
+ 	}
+ 	rcu_read_unlock();
+ 
+ 	return 0;
+ }
+ 
+ /**
+  * __batadv_mcast_flags_dump() - dump multicast flags table to a netlink socket
+  * @msg: buffer for the message
+  * @portid: netlink port
+  * @seq: Sequence number of netlink message
+  * @bat_priv: the bat priv with all the soft interface information
+  * @bucket: current bucket to dump
+  * @idx: index in current bucket to the next entry to dump
+  *
+  * Return: 0 or error code.
+  */
+ static int
+ __batadv_mcast_flags_dump(struct sk_buff *msg, u32 portid, u32 seq,
+ 			  struct batadv_priv *bat_priv, long *bucket, long *idx)
+ {
+ 	struct batadv_hashtable *hash = bat_priv->orig_hash;
+ 	long bucket_tmp = *bucket;
+ 	struct hlist_head *head;
+ 	long idx_tmp = *idx;
+ 
+ 	while (bucket_tmp < hash->size) {
+ 		head = &hash->table[bucket_tmp];
+ 
+ 		if (batadv_mcast_flags_dump_bucket(msg, portid, seq, head,
+ 						   &idx_tmp))
+ 			break;
+ 
+ 		bucket_tmp++;
+ 		idx_tmp = 0;
+ 	}
+ 
+ 	*bucket = bucket_tmp;
+ 	*idx = idx_tmp;
+ 
+ 	return msg->len;
+ }
+ 
+ /**
+  * batadv_mcast_netlink_get_primary() - get primary interface from netlink
+  *  callback
+  * @cb: netlink callback structure
+  * @primary_if: the primary interface pointer to return the result in
+  *
+  * Return: 0 or error code.
+  */
+ static int
+ batadv_mcast_netlink_get_primary(struct netlink_callback *cb,
+ 				 struct batadv_hard_iface **primary_if)
+ {
+ 	struct batadv_hard_iface *hard_iface = NULL;
+ 	struct net *net = sock_net(cb->skb->sk);
+ 	struct net_device *soft_iface;
+ 	struct batadv_priv *bat_priv;
+ 	int ifindex;
+ 	int ret = 0;
+ 
+ 	ifindex = batadv_netlink_get_ifindex(cb->nlh, BATADV_ATTR_MESH_IFINDEX);
+ 	if (!ifindex)
+ 		return -EINVAL;
+ 
+ 	soft_iface = dev_get_by_index(net, ifindex);
+ 	if (!soft_iface || !batadv_softif_is_valid(soft_iface)) {
+ 		ret = -ENODEV;
+ 		goto out;
+ 	}
+ 
+ 	bat_priv = netdev_priv(soft_iface);
+ 
+ 	hard_iface = batadv_primary_if_get_selected(bat_priv);
+ 	if (!hard_iface || hard_iface->if_status != BATADV_IF_ACTIVE) {
+ 		ret = -ENOENT;
+ 		goto out;
+ 	}
+ 
+ out:
+ 	if (soft_iface)
+ 		dev_put(soft_iface);
+ 
+ 	if (!ret && primary_if)
+ 		*primary_if = hard_iface;
+ 	else
+ 		batadv_hardif_put(hard_iface);
+ 
+ 	return ret;
+ }
+ 
+ /**
+  * batadv_mcast_flags_dump() - dump multicast flags table to a netlink socket
+  * @msg: buffer for the message
+  * @cb: callback structure containing arguments
+  *
+  * Return: message length.
+  */
+ int batadv_mcast_flags_dump(struct sk_buff *msg, struct netlink_callback *cb)
+ {
+ 	struct batadv_hard_iface *primary_if = NULL;
+ 	int portid = NETLINK_CB(cb->skb).portid;
+ 	struct batadv_priv *bat_priv;
+ 	long *bucket = &cb->args[0];
+ 	long *idx = &cb->args[1];
+ 	int ret;
+ 
+ 	ret = batadv_mcast_netlink_get_primary(cb, &primary_if);
+ 	if (ret)
+ 		return ret;
+ 
+ 	bat_priv = netdev_priv(primary_if->soft_iface);
+ 	ret = __batadv_mcast_flags_dump(msg, portid, cb->nlh->nlmsg_seq,
+ 					bat_priv, bucket, idx);
+ 
+ 	batadv_hardif_put(primary_if);
+ 	return ret;
+ }
+ 
+ /**
   * batadv_mcast_free() - free the multicast optimizations structures
   * @bat_priv: the bat priv with all the soft interface information
   */
diff --combined net/core/dev.c
index ef0cc6ea5f8d,e13807b5c84d..d848027a7da7
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@@ -1571,6 -1571,25 +1571,25 @@@ static void dev_disable_gro_hw(struct n
  		netdev_WARN(dev, "failed to disable GRO_HW!\n");
  }
  
+ const char *netdev_cmd_to_name(enum netdev_cmd cmd)
+ {
+ #define N(val) 						\
+ 	case NETDEV_##val:				\
+ 		return "NETDEV_" __stringify(val);
+ 	switch (cmd) {
+ 	N(UP) N(DOWN) N(REBOOT) N(CHANGE) N(REGISTER) N(UNREGISTER)
+ 	N(CHANGEMTU) N(CHANGEADDR) N(GOING_DOWN) N(CHANGENAME) N(FEAT_CHANGE)
+ 	N(BONDING_FAILOVER) N(PRE_UP) N(PRE_TYPE_CHANGE) N(POST_TYPE_CHANGE)
+ 	N(POST_INIT) N(RELEASE) N(NOTIFY_PEERS) N(JOIN) N(CHANGEUPPER)
+ 	N(RESEND_IGMP) N(PRECHANGEMTU) N(CHANGEINFODATA) N(BONDING_INFO)
+ 	N(PRECHANGEUPPER) N(CHANGELOWERSTATE) N(UDP_TUNNEL_PUSH_INFO)
+ 	N(UDP_TUNNEL_DROP_INFO) N(CHANGE_TX_QUEUE_LEN)
+ 	};
+ #undef N
+ 	return "UNKNOWN_NETDEV_EVENT";
+ }
+ EXPORT_SYMBOL_GPL(netdev_cmd_to_name);
+ 
  static int call_netdevice_notifier(struct notifier_block *nb, unsigned long val,
  				   struct net_device *dev)
  {
@@@ -2378,7 -2397,7 +2397,7 @@@ EXPORT_SYMBOL(netdev_set_num_tc)
  
  /*
   * Routine to help set real_num_tx_queues. To avoid skbs mapped to queues
-  * greater then real_num_tx_queues stale skbs on the qdisc must be flushed.
+  * greater than real_num_tx_queues stale skbs on the qdisc must be flushed.
   */
  int netif_set_real_num_tx_queues(struct net_device *dev, unsigned int txq)
  {
@@@ -2735,7 -2754,7 +2754,7 @@@ __be16 skb_network_protocol(struct sk_b
  		if (unlikely(!pskb_may_pull(skb, sizeof(struct ethhdr))))
  			return 0;
  
 -		eth = (struct ethhdr *)skb_mac_header(skb);
 +		eth = (struct ethhdr *)skb->data;
  		type = eth->h_proto;
  	}
  
@@@ -4359,6 -4378,9 +4378,9 @@@ int netdev_rx_handler_register(struct n
  	if (netdev_is_rx_handler_busy(dev))
  		return -EBUSY;
  
+ 	if (dev->priv_flags & IFF_NO_RX_HANDLER)
+ 		return -EINVAL;
+ 
  	/* Note: rx_handler_data must be set before rx_handler */
  	rcu_assign_pointer(dev->rx_handler_data, rx_handler_data);
  	rcu_assign_pointer(dev->rx_handler, rx_handler);
@@@ -7554,6 -7576,19 +7576,19 @@@ static netdev_features_t netdev_fix_fea
  		}
  	}
  
+ 	/* LRO/HW-GRO features cannot be combined with RX-FCS */
+ 	if (features & NETIF_F_RXFCS) {
+ 		if (features & NETIF_F_LRO) {
+ 			netdev_dbg(dev, "Dropping LRO feature since RX-FCS is requested.\n");
+ 			features &= ~NETIF_F_LRO;
+ 		}
+ 
+ 		if (features & NETIF_F_GRO_HW) {
+ 			netdev_dbg(dev, "Dropping HW-GRO feature since RX-FCS is requested.\n");
+ 			features &= ~NETIF_F_GRO_HW;
+ 		}
+ 	}
+ 
  	return features;
  }
  
@@@ -8010,7 -8045,8 +8045,8 @@@ int register_netdev(struct net_device *
  {
  	int err;
  
- 	rtnl_lock();
+ 	if (rtnl_lock_killable())
+ 		return -EINTR;
  	err = register_netdevice(dev);
  	rtnl_unlock();
  	return err;
@@@ -8060,7 -8096,6 +8096,6 @@@ static void netdev_wait_allrefs(struct 
  			rcu_barrier();
  			rtnl_lock();
  
- 			call_netdevice_notifiers(NETDEV_UNREGISTER_FINAL, dev);
  			if (test_bit(__LINK_STATE_LINKWATCH_PENDING,
  				     &dev->state)) {
  				/* We must not have linkwatch events
@@@ -8132,10 -8167,6 +8167,6 @@@ void netdev_run_todo(void
  			= list_first_entry(&list, struct net_device, todo_list);
  		list_del(&dev->todo_list);
  
- 		rtnl_lock();
- 		call_netdevice_notifiers(NETDEV_UNREGISTER_FINAL, dev);
- 		__rtnl_unlock();
- 
  		if (unlikely(dev->reg_state != NETREG_UNREGISTERING)) {
  			pr_err("network todo '%s' but state %d\n",
  			       dev->name, dev->reg_state);
@@@ -8153,8 -8184,9 +8184,9 @@@
  		BUG_ON(!list_empty(&dev->ptype_specific));
  		WARN_ON(rcu_access_pointer(dev->ip_ptr));
  		WARN_ON(rcu_access_pointer(dev->ip6_ptr));
+ #if IS_ENABLED(CONFIG_DECNET)
  		WARN_ON(dev->dn_ptr);
- 
+ #endif
  		if (dev->priv_destructor)
  			dev->priv_destructor(dev);
  		if (dev->needs_free_netdev)
@@@ -8576,7 -8608,6 +8608,6 @@@ int dev_change_net_namespace(struct net
  	 */
  	call_netdevice_notifiers(NETDEV_UNREGISTER, dev);
  	rcu_barrier();
- 	call_netdevice_notifiers(NETDEV_UNREGISTER_FINAL, dev);
  
  	new_nsid = peernet2id_alloc(dev_net(dev), net);
  	/* If there is an ifindex conflict assign a new one */
diff --combined net/ipv4/ip_tunnel.c
index a7fd1c5a2a14,5fcb17cb426b..de6d94482fe7
--- a/net/ipv4/ip_tunnel.c
+++ b/net/ipv4/ip_tunnel.c
@@@ -290,22 -290,6 +290,6 @@@ failed
  	return ERR_PTR(err);
  }
  
- static inline void init_tunnel_flow(struct flowi4 *fl4,
- 				    int proto,
- 				    __be32 daddr, __be32 saddr,
- 				    __be32 key, __u8 tos, int oif,
- 				    __u32 mark)
- {
- 	memset(fl4, 0, sizeof(*fl4));
- 	fl4->flowi4_oif = oif;
- 	fl4->daddr = daddr;
- 	fl4->saddr = saddr;
- 	fl4->flowi4_tos = tos;
- 	fl4->flowi4_proto = proto;
- 	fl4->fl4_gre_key = key;
- 	fl4->flowi4_mark = mark;
- }
- 
  static int ip_tunnel_bind_dev(struct net_device *dev)
  {
  	struct net_device *tdev = NULL;
@@@ -322,10 -306,10 +306,10 @@@
  		struct flowi4 fl4;
  		struct rtable *rt;
  
- 		init_tunnel_flow(&fl4, iph->protocol, iph->daddr,
- 				 iph->saddr, tunnel->parms.o_key,
- 				 RT_TOS(iph->tos), tunnel->parms.link,
- 				 tunnel->fwmark);
+ 		ip_tunnel_init_flow(&fl4, iph->protocol, iph->daddr,
+ 				    iph->saddr, tunnel->parms.o_key,
+ 				    RT_TOS(iph->tos), tunnel->parms.link,
+ 				    tunnel->fwmark);
  		rt = ip_route_output_key(tunnel->net, &fl4);
  
  		if (!IS_ERR(rt)) {
@@@ -362,18 -346,12 +346,17 @@@ static struct ip_tunnel *ip_tunnel_crea
  	struct ip_tunnel *nt;
  	struct net_device *dev;
  	int t_hlen;
 +	int mtu;
 +	int err;
  
- 	BUG_ON(!itn->fb_tunnel_dev);
- 	dev = __ip_tunnel_create(net, itn->fb_tunnel_dev->rtnl_link_ops, parms);
+ 	dev = __ip_tunnel_create(net, itn->rtnl_link_ops, parms);
  	if (IS_ERR(dev))
  		return ERR_CAST(dev);
  
 -	dev->mtu = ip_tunnel_bind_dev(dev);
 +	mtu = ip_tunnel_bind_dev(dev);
 +	err = dev_set_mtu(dev, mtu);
 +	if (err)
 +		goto err_dev_set_mtu;
  
  	nt = netdev_priv(dev);
  	t_hlen = nt->hlen + sizeof(struct iphdr);
@@@ -381,10 -359,6 +364,10 @@@
  	dev->max_mtu = 0xFFF8 - dev->hard_header_len - t_hlen;
  	ip_tunnel_add(itn, nt);
  	return nt;
 +
 +err_dev_set_mtu:
 +	unregister_netdevice(dev);
 +	return ERR_PTR(err);
  }
  
  int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb,
@@@ -590,8 -564,8 +573,8 @@@ void ip_md_tunnel_xmit(struct sk_buff *
  		else if (skb->protocol == htons(ETH_P_IPV6))
  			tos = ipv6_get_dsfield((const struct ipv6hdr *)inner_iph);
  	}
- 	init_tunnel_flow(&fl4, proto, key->u.ipv4.dst, key->u.ipv4.src, 0,
- 			 RT_TOS(tos), tunnel->parms.link, tunnel->fwmark);
+ 	ip_tunnel_init_flow(&fl4, proto, key->u.ipv4.dst, key->u.ipv4.src, 0,
+ 			    RT_TOS(tos), tunnel->parms.link, tunnel->fwmark);
  	if (tunnel->encap.type != TUNNEL_ENCAP_NONE)
  		goto tx_error;
  	rt = ip_route_output_key(tunnel->net, &fl4);
@@@ -719,9 -693,9 +702,9 @@@ void ip_tunnel_xmit(struct sk_buff *skb
  		}
  	}
  
- 	init_tunnel_flow(&fl4, protocol, dst, tnl_params->saddr,
- 			 tunnel->parms.o_key, RT_TOS(tos), tunnel->parms.link,
- 			 tunnel->fwmark);
+ 	ip_tunnel_init_flow(&fl4, protocol, dst, tnl_params->saddr,
+ 			    tunnel->parms.o_key, RT_TOS(tos), tunnel->parms.link,
+ 			    tunnel->fwmark);
  
  	if (ip_tunnel_encap(skb, tunnel, &protocol, &fl4) < 0)
  		goto tx_error;
@@@ -847,7 -821,6 +830,6 @@@ int ip_tunnel_ioctl(struct net_device *
  	struct net *net = t->net;
  	struct ip_tunnel_net *itn = net_generic(net, t->ip_tnl_net_id);
  
- 	BUG_ON(!itn->fb_tunnel_dev);
  	switch (cmd) {
  	case SIOCGETTUNNEL:
  		if (dev == itn->fb_tunnel_dev) {
@@@ -872,7 -845,7 +854,7 @@@
  				p->o_key = 0;
  		}
  
- 		t = ip_tunnel_find(itn, p, itn->fb_tunnel_dev->type);
+ 		t = ip_tunnel_find(itn, p, itn->type);
  
  		if (cmd == SIOCADDTUNNEL) {
  			if (!t) {
@@@ -1016,10 -989,15 +998,15 @@@ int ip_tunnel_init_net(struct net *net
  	struct ip_tunnel_parm parms;
  	unsigned int i;
  
+ 	itn->rtnl_link_ops = ops;
  	for (i = 0; i < IP_TNL_HASH_SIZE; i++)
  		INIT_HLIST_HEAD(&itn->tunnels[i]);
  
- 	if (!ops) {
+ 	if (!ops || !net_has_fallback_tunnels(net)) {
+ 		struct ip_tunnel_net *it_init_net;
+ 
+ 		it_init_net = net_generic(&init_net, ip_tnl_net_id);
+ 		itn->type = it_init_net->type;
  		itn->fb_tunnel_dev = NULL;
  		return 0;
  	}
@@@ -1037,6 -1015,7 +1024,7 @@@
  		itn->fb_tunnel_dev->features |= NETIF_F_NETNS_LOCAL;
  		itn->fb_tunnel_dev->mtu = ip_tunnel_bind_dev(itn->fb_tunnel_dev);
  		ip_tunnel_add(itn, netdev_priv(itn->fb_tunnel_dev));
+ 		itn->type = itn->fb_tunnel_dev->type;
  	}
  	rtnl_unlock();
  
@@@ -1044,10 -1023,10 +1032,10 @@@
  }
  EXPORT_SYMBOL_GPL(ip_tunnel_init_net);
  
- static void ip_tunnel_destroy(struct ip_tunnel_net *itn, struct list_head *head,
+ static void ip_tunnel_destroy(struct net *net, struct ip_tunnel_net *itn,
+ 			      struct list_head *head,
  			      struct rtnl_link_ops *ops)
  {
- 	struct net *net = dev_net(itn->fb_tunnel_dev);
  	struct net_device *dev, *aux;
  	int h;
  
@@@ -1079,7 -1058,7 +1067,7 @@@ void ip_tunnel_delete_nets(struct list_
  	rtnl_lock();
  	list_for_each_entry(net, net_list, exit_list) {
  		itn = net_generic(net, id);
- 		ip_tunnel_destroy(itn, &list, ops);
+ 		ip_tunnel_destroy(net, itn, &list, ops);
  	}
  	unregister_netdevice_many(&list);
  	rtnl_unlock();
@@@ -1111,29 -1090,17 +1099,29 @@@ int ip_tunnel_newlink(struct net_devic
  	nt->fwmark = fwmark;
  	err = register_netdevice(dev);
  	if (err)
 -		goto out;
 +		goto err_register_netdevice;
  
  	if (dev->type == ARPHRD_ETHER && !tb[IFLA_ADDRESS])
  		eth_hw_addr_random(dev);
  
  	mtu = ip_tunnel_bind_dev(dev);
 -	if (!tb[IFLA_MTU])
 -		dev->mtu = mtu;
 +	if (tb[IFLA_MTU]) {
 +		unsigned int max = 0xfff8 - dev->hard_header_len - nt->hlen;
 +
 +		mtu = clamp(dev->mtu, (unsigned int)ETH_MIN_MTU,
 +			    (unsigned int)(max - sizeof(struct iphdr)));
 +	}
 +
 +	err = dev_set_mtu(dev, mtu);
 +	if (err)
 +		goto err_dev_set_mtu;
  
  	ip_tunnel_add(itn, nt);
 -out:
 +	return 0;
 +
 +err_dev_set_mtu:
 +	unregister_netdevice(dev);
 +err_register_netdevice:
  	return err;
  }
  EXPORT_SYMBOL_GPL(ip_tunnel_newlink);
diff --combined net/ipv4/tcp_input.c
index ff6cd98ce8d5,451ef3012636..367def6ddeda
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@@ -1358,9 -1358,6 +1358,6 @@@ static struct sk_buff *tcp_shift_skb_da
  	int len;
  	int in_sack;
  
- 	if (!sk_can_gso(sk))
- 		goto fallback;
- 
  	/* Normally R but no L won't result in plain S */
  	if (!dup_sack &&
  	    (TCP_SKB_CB(skb)->sacked & (TCPCB_LOST|TCPCB_SACKED_RETRANS)) == TCPCB_SACKED_RETRANS)
@@@ -5862,10 -5859,12 +5859,12 @@@ int tcp_rcv_state_process(struct sock *
  	tp->rx_opt.saw_tstamp = 0;
  	req = tp->fastopen_rsk;
  	if (req) {
+ 		bool req_stolen;
+ 
  		WARN_ON_ONCE(sk->sk_state != TCP_SYN_RECV &&
  		    sk->sk_state != TCP_FIN_WAIT1);
  
- 		if (!tcp_check_req(sk, skb, req, true))
+ 		if (!tcp_check_req(sk, skb, req, true, &req_stolen))
  			goto discard;
  	}
  
@@@ -6256,9 -6255,6 +6255,9 @@@ int tcp_conn_request(struct request_soc
  	if (want_cookie && !tmp_opt.saw_tstamp)
  		tcp_clear_options(&tmp_opt);
  
 +	if (IS_ENABLED(CONFIG_SMC) && want_cookie)
 +		tmp_opt.smc_ok = 0;
 +
  	tmp_opt.tstamp_ok = tmp_opt.saw_tstamp;
  	tcp_openreq_init(req, &tmp_opt, skb, sk);
  	inet_rsk(req)->no_srccheck = inet_sk(sk)->transparent;
diff --combined net/ipv6/ip6_output.c
index 5cb18c8ba9b2,2c7f09c3c39e..f6697a19b988
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@@ -71,7 -71,7 +71,7 @@@ static int ip6_finish_output2(struct ne
  		struct inet6_dev *idev = ip6_dst_idev(skb_dst(skb));
  
  		if (!(dev->flags & IFF_LOOPBACK) && sk_mc_loop(sk) &&
- 		    ((mroute6_socket(net, skb) &&
+ 		    ((mroute6_is_socket(net, skb) &&
  		     !(IP6CB(skb)->flags & IP6SKB_FORWARDED)) ||
  		     ipv6_chk_mcast_addr(dev, &ipv6_hdr(skb)->daddr,
  					 &ipv6_hdr(skb)->saddr))) {
@@@ -1246,7 -1246,7 +1246,7 @@@ static int __ip6_append_data(struct soc
  			     const struct sockcm_cookie *sockc)
  {
  	struct sk_buff *skb, *skb_prev = NULL;
 -	unsigned int maxfraglen, fragheaderlen, mtu, orig_mtu;
 +	unsigned int maxfraglen, fragheaderlen, mtu, orig_mtu, pmtu;
  	int exthdrlen = 0;
  	int dst_exthdrlen = 0;
  	int hh_len;
@@@ -1282,12 -1282,6 +1282,12 @@@
  		      sizeof(struct frag_hdr) : 0) +
  		     rt->rt6i_nfheader_len;
  
 +	/* as per RFC 7112 section 5, the entire IPv6 Header Chain must fit
 +	 * the first fragment
 +	 */
 +	if (headersize + transhdrlen > mtu)
 +		goto emsgsize;
 +
  	if (cork->length + length > mtu - headersize && ipc6->dontfrag &&
  	    (sk->sk_protocol == IPPROTO_UDP ||
  	     sk->sk_protocol == IPPROTO_RAW)) {
@@@ -1303,8 -1297,9 +1303,8 @@@
  
  	if (cork->length + length > maxnonfragsize - headersize) {
  emsgsize:
 -		ipv6_local_error(sk, EMSGSIZE, fl6,
 -				 mtu - headersize +
 -				 sizeof(struct ipv6hdr));
 +		pmtu = max_t(int, mtu - headersize + sizeof(struct ipv6hdr), 0);
 +		ipv6_local_error(sk, EMSGSIZE, fl6, pmtu);
  		return -EMSGSIZE;
  	}
  
diff --combined net/ipv6/ip6_vti.c
index ce18cd20389d,60b771f49fb5..6ebb2e8777f4
--- a/net/ipv6/ip6_vti.c
+++ b/net/ipv6/ip6_vti.c
@@@ -622,12 -622,11 +622,12 @@@ static int vti6_err(struct sk_buff *skb
  	return 0;
  }
  
 -static void vti6_link_config(struct ip6_tnl *t)
 +static void vti6_link_config(struct ip6_tnl *t, bool keep_mtu)
  {
  	struct net_device *dev = t->dev;
  	struct __ip6_tnl_parm *p = &t->parms;
  	struct net_device *tdev = NULL;
 +	int mtu;
  
  	memcpy(dev->dev_addr, &p->laddr, sizeof(struct in6_addr));
  	memcpy(dev->broadcast, &p->raddr, sizeof(struct in6_addr));
@@@ -641,17 -640,12 +641,17 @@@
  	else
  		dev->flags &= ~IFF_POINTOPOINT;
  
 +	if (keep_mtu && dev->mtu) {
 +		dev->mtu = clamp(dev->mtu, dev->min_mtu, dev->max_mtu);
 +		return;
 +	}
 +
  	if (p->flags & IP6_TNL_F_CAP_XMIT) {
  		int strict = (ipv6_addr_type(&p->raddr) &
  			      (IPV6_ADDR_MULTICAST | IPV6_ADDR_LINKLOCAL));
  		struct rt6_info *rt = rt6_lookup(t->net,
  						 &p->raddr, &p->laddr,
- 						 p->link, strict);
+ 						 p->link, NULL, strict);
  
  		if (rt)
  			tdev = rt->dst.dev;
@@@ -662,25 -656,20 +662,25 @@@
  		tdev = __dev_get_by_index(t->net, p->link);
  
  	if (tdev)
 -		dev->mtu = max_t(int, tdev->mtu - dev->hard_header_len,
 -				 IPV6_MIN_MTU);
 +		mtu = tdev->mtu - sizeof(struct ipv6hdr);
 +	else
 +		mtu = ETH_DATA_LEN - LL_MAX_HEADER - sizeof(struct ipv6hdr);
 +
 +	dev->mtu = max_t(int, mtu, IPV6_MIN_MTU);
  }
  
  /**
   * vti6_tnl_change - update the tunnel parameters
   *   @t: tunnel to be changed
   *   @p: tunnel configuration parameters
 + *   @keep_mtu: MTU was set from userspace, don't re-compute it
   *
   * Description:
   *   vti6_tnl_change() updates the tunnel parameters
   **/
  static int
 -vti6_tnl_change(struct ip6_tnl *t, const struct __ip6_tnl_parm *p)
 +vti6_tnl_change(struct ip6_tnl *t, const struct __ip6_tnl_parm *p,
 +		bool keep_mtu)
  {
  	t->parms.laddr = p->laddr;
  	t->parms.raddr = p->raddr;
@@@ -690,12 -679,11 +690,12 @@@
  	t->parms.proto = p->proto;
  	t->parms.fwmark = p->fwmark;
  	dst_cache_reset(&t->dst_cache);
 -	vti6_link_config(t);
 +	vti6_link_config(t, keep_mtu);
  	return 0;
  }
  
 -static int vti6_update(struct ip6_tnl *t, struct __ip6_tnl_parm *p)
 +static int vti6_update(struct ip6_tnl *t, struct __ip6_tnl_parm *p,
 +		       bool keep_mtu)
  {
  	struct net *net = dev_net(t->dev);
  	struct vti6_net *ip6n = net_generic(net, vti6_net_id);
@@@ -703,7 -691,7 +703,7 @@@
  
  	vti6_tnl_unlink(ip6n, t);
  	synchronize_net();
 -	err = vti6_tnl_change(t, p);
 +	err = vti6_tnl_change(t, p, keep_mtu);
  	vti6_tnl_link(ip6n, t);
  	netdev_state_change(t->dev);
  	return err;
@@@ -816,7 -804,7 +816,7 @@@ vti6_ioctl(struct net_device *dev, stru
  			} else
  				t = netdev_priv(dev);
  
 -			err = vti6_update(t, &p1);
 +			err = vti6_update(t, &p1, false);
  		}
  		if (t) {
  			err = 0;
@@@ -878,8 -866,10 +878,8 @@@ static void vti6_dev_setup(struct net_d
  	dev->priv_destructor = vti6_dev_free;
  
  	dev->type = ARPHRD_TUNNEL6;
 -	dev->hard_header_len = LL_MAX_HEADER + sizeof(struct ipv6hdr);
 -	dev->mtu = ETH_DATA_LEN;
  	dev->min_mtu = IPV6_MIN_MTU;
 -	dev->max_mtu = IP_MAX_MTU;
 +	dev->max_mtu = IP_MAX_MTU - sizeof(struct ipv6hdr);
  	dev->flags |= IFF_NOARP;
  	dev->addr_len = sizeof(struct in6_addr);
  	netif_keep_dst(dev);
@@@ -915,7 -905,7 +915,7 @@@ static int vti6_dev_init(struct net_dev
  
  	if (err)
  		return err;
 -	vti6_link_config(t);
 +	vti6_link_config(t, true);
  	return 0;
  }
  
@@@ -1020,7 -1010,7 +1020,7 @@@ static int vti6_changelink(struct net_d
  	} else
  		t = netdev_priv(dev);
  
 -	return vti6_update(t, &p);
 +	return vti6_update(t, &p, tb && tb[IFLA_MTU]);
  }
  
  static size_t vti6_get_size(const struct net_device *dev)
diff --combined net/ipv6/route.c
index b33d057ac5eb,ba8d5df50ebe..1875c90d8c5c
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@@ -450,8 -450,10 +450,10 @@@ static bool rt6_check_expired(const str
  	return false;
  }
  
- static struct rt6_info *rt6_multipath_select(struct rt6_info *match,
+ static struct rt6_info *rt6_multipath_select(const struct net *net,
+ 					     struct rt6_info *match,
  					     struct flowi6 *fl6, int oif,
+ 					     const struct sk_buff *skb,
  					     int strict)
  {
  	struct rt6_info *sibling, *next_sibling;
@@@ -460,7 -462,7 +462,7 @@@
  	 * case it will always be non-zero. Otherwise now is the time to do it.
  	 */
  	if (!fl6->mp_hash)
- 		fl6->mp_hash = rt6_multipath_hash(fl6, NULL);
+ 		fl6->mp_hash = rt6_multipath_hash(net, fl6, skb, NULL);
  
  	if (fl6->mp_hash <= atomic_read(&match->rt6i_nh_upper_bound))
  		return match;
@@@ -914,7 -916,9 +916,9 @@@ static bool ip6_hold_safe(struct net *n
  
  static struct rt6_info *ip6_pol_route_lookup(struct net *net,
  					     struct fib6_table *table,
- 					     struct flowi6 *fl6, int flags)
+ 					     struct flowi6 *fl6,
+ 					     const struct sk_buff *skb,
+ 					     int flags)
  {
  	struct rt6_info *rt, *rt_cache;
  	struct fib6_node *fn;
@@@ -929,8 -933,8 +933,8 @@@ restart
  		rt = rt6_device_match(net, rt, &fl6->saddr,
  				      fl6->flowi6_oif, flags);
  		if (rt->rt6i_nsiblings && fl6->flowi6_oif == 0)
- 			rt = rt6_multipath_select(rt, fl6,
- 						  fl6->flowi6_oif, flags);
+ 			rt = rt6_multipath_select(net, rt, fl6, fl6->flowi6_oif,
+ 						  skb, flags);
  	}
  	if (rt == net->ipv6.ip6_null_entry) {
  		fn = fib6_backtrack(fn, &fl6->saddr);
@@@ -954,14 -958,15 +958,15 @@@
  }
  
  struct dst_entry *ip6_route_lookup(struct net *net, struct flowi6 *fl6,
- 				    int flags)
+ 				   const struct sk_buff *skb, int flags)
  {
- 	return fib6_rule_lookup(net, fl6, flags, ip6_pol_route_lookup);
+ 	return fib6_rule_lookup(net, fl6, skb, flags, ip6_pol_route_lookup);
  }
  EXPORT_SYMBOL_GPL(ip6_route_lookup);
  
  struct rt6_info *rt6_lookup(struct net *net, const struct in6_addr *daddr,
- 			    const struct in6_addr *saddr, int oif, int strict)
+ 			    const struct in6_addr *saddr, int oif,
+ 			    const struct sk_buff *skb, int strict)
  {
  	struct flowi6 fl6 = {
  		.flowi6_oif = oif,
@@@ -975,7 -980,7 +980,7 @@@
  		flags |= RT6_LOOKUP_F_HAS_SADDR;
  	}
  
- 	dst = fib6_rule_lookup(net, &fl6, flags, ip6_pol_route_lookup);
+ 	dst = fib6_rule_lookup(net, &fl6, skb, flags, ip6_pol_route_lookup);
  	if (dst->error == 0)
  		return (struct rt6_info *) dst;
  
@@@ -1626,10 -1631,11 +1631,10 @@@ static void rt6_age_examine_exception(s
  		struct neighbour *neigh;
  		__u8 neigh_flags = 0;
  
 -		neigh = dst_neigh_lookup(&rt->dst, &rt->rt6i_gateway);
 -		if (neigh) {
 +		neigh = __ipv6_neigh_lookup_noref(rt->dst.dev, &rt->rt6i_gateway);
 +		if (neigh)
  			neigh_flags = neigh->flags;
 -			neigh_release(neigh);
 -		}
 +
  		if (!(neigh_flags & NTF_ROUTER)) {
  			RT6_TRACE("purging route %p via non-router but gateway\n",
  				  rt);
@@@ -1653,8 -1659,7 +1658,8 @@@ void rt6_age_exceptions(struct rt6_inf
  	if (!rcu_access_pointer(rt->rt6i_exception_bucket))
  		return;
  
 -	spin_lock_bh(&rt6_exception_lock);
 +	rcu_read_lock_bh();
 +	spin_lock(&rt6_exception_lock);
  	bucket = rcu_dereference_protected(rt->rt6i_exception_bucket,
  				    lockdep_is_held(&rt6_exception_lock));
  
@@@ -1668,12 -1673,12 +1673,13 @@@
  			bucket++;
  		}
  	}
 -	spin_unlock_bh(&rt6_exception_lock);
 +	spin_unlock(&rt6_exception_lock);
 +	rcu_read_unlock_bh();
  }
  
  struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table,
- 			       int oif, struct flowi6 *fl6, int flags)
+ 			       int oif, struct flowi6 *fl6,
+ 			       const struct sk_buff *skb, int flags)
  {
  	struct fib6_node *fn, *saved_fn;
  	struct rt6_info *rt, *rt_cache;
@@@ -1695,7 -1700,7 +1701,7 @@@
  redo_rt6_select:
  	rt = rt6_select(net, fn, oif, strict);
  	if (rt->rt6i_nsiblings)
- 		rt = rt6_multipath_select(rt, fl6, oif, strict);
+ 		rt = rt6_multipath_select(net, rt, fl6, oif, skb, strict);
  	if (rt == net->ipv6.ip6_null_entry) {
  		fn = fib6_backtrack(fn, &fl6->saddr);
  		if (fn)
@@@ -1794,28 -1799,35 +1800,35 @@@ uncached_rt_out
  }
  EXPORT_SYMBOL_GPL(ip6_pol_route);
  
- static struct rt6_info *ip6_pol_route_input(struct net *net, struct fib6_table *table,
- 					    struct flowi6 *fl6, int flags)
+ static struct rt6_info *ip6_pol_route_input(struct net *net,
+ 					    struct fib6_table *table,
+ 					    struct flowi6 *fl6,
+ 					    const struct sk_buff *skb,
+ 					    int flags)
  {
- 	return ip6_pol_route(net, table, fl6->flowi6_iif, fl6, flags);
+ 	return ip6_pol_route(net, table, fl6->flowi6_iif, fl6, skb, flags);
  }
  
  struct dst_entry *ip6_route_input_lookup(struct net *net,
  					 struct net_device *dev,
- 					 struct flowi6 *fl6, int flags)
+ 					 struct flowi6 *fl6,
+ 					 const struct sk_buff *skb,
+ 					 int flags)
  {
  	if (rt6_need_strict(&fl6->daddr) && dev->type != ARPHRD_PIMREG)
  		flags |= RT6_LOOKUP_F_IFACE;
  
- 	return fib6_rule_lookup(net, fl6, flags, ip6_pol_route_input);
+ 	return fib6_rule_lookup(net, fl6, skb, flags, ip6_pol_route_input);
  }
  EXPORT_SYMBOL_GPL(ip6_route_input_lookup);
  
  static void ip6_multipath_l3_keys(const struct sk_buff *skb,
- 				  struct flow_keys *keys)
+ 				  struct flow_keys *keys,
+ 				  struct flow_keys *flkeys)
  {
  	const struct ipv6hdr *outer_iph = ipv6_hdr(skb);
  	const struct ipv6hdr *key_iph = outer_iph;
+ 	struct flow_keys *_flkeys = flkeys;
  	const struct ipv6hdr *inner_iph;
  	const struct icmp6hdr *icmph;
  	struct ipv6hdr _inner_iph;
@@@ -1837,26 -1849,76 +1850,76 @@@
  		goto out;
  
  	key_iph = inner_iph;
+ 	_flkeys = NULL;
  out:
- 	memset(keys, 0, sizeof(*keys));
- 	keys->control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
- 	keys->addrs.v6addrs.src = key_iph->saddr;
- 	keys->addrs.v6addrs.dst = key_iph->daddr;
- 	keys->tags.flow_label = ip6_flowinfo(key_iph);
- 	keys->basic.ip_proto = key_iph->nexthdr;
+ 	if (_flkeys) {
+ 		keys->addrs.v6addrs.src = _flkeys->addrs.v6addrs.src;
+ 		keys->addrs.v6addrs.dst = _flkeys->addrs.v6addrs.dst;
+ 		keys->tags.flow_label = _flkeys->tags.flow_label;
+ 		keys->basic.ip_proto = _flkeys->basic.ip_proto;
+ 	} else {
+ 		keys->addrs.v6addrs.src = key_iph->saddr;
+ 		keys->addrs.v6addrs.dst = key_iph->daddr;
+ 		keys->tags.flow_label = ip6_flowinfo(key_iph);
+ 		keys->basic.ip_proto = key_iph->nexthdr;
+ 	}
  }
  
  /* if skb is set it will be used and fl6 can be NULL */
- u32 rt6_multipath_hash(const struct flowi6 *fl6, const struct sk_buff *skb)
+ u32 rt6_multipath_hash(const struct net *net, const struct flowi6 *fl6,
+ 		       const struct sk_buff *skb, struct flow_keys *flkeys)
  {
  	struct flow_keys hash_keys;
+ 	u32 mhash;
  
- 	if (skb) {
- 		ip6_multipath_l3_keys(skb, &hash_keys);
- 		return flow_hash_from_keys(&hash_keys) >> 1;
+ 	switch (ip6_multipath_hash_policy(net)) {
+ 	case 0:
+ 		memset(&hash_keys, 0, sizeof(hash_keys));
+ 		hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
+ 		if (skb) {
+ 			ip6_multipath_l3_keys(skb, &hash_keys, flkeys);
+ 		} else {
+ 			hash_keys.addrs.v6addrs.src = fl6->saddr;
+ 			hash_keys.addrs.v6addrs.dst = fl6->daddr;
+ 			hash_keys.tags.flow_label = (__force u32)fl6->flowlabel;
+ 			hash_keys.basic.ip_proto = fl6->flowi6_proto;
+ 		}
+ 		break;
+ 	case 1:
+ 		if (skb) {
+ 			unsigned int flag = FLOW_DISSECTOR_F_STOP_AT_ENCAP;
+ 			struct flow_keys keys;
+ 
+ 			/* short-circuit if we already have L4 hash present */
+ 			if (skb->l4_hash)
+ 				return skb_get_hash_raw(skb) >> 1;
+ 
+ 			memset(&hash_keys, 0, sizeof(hash_keys));
+ 
+                         if (!flkeys) {
+ 				skb_flow_dissect_flow_keys(skb, &keys, flag);
+ 				flkeys = &keys;
+ 			}
+ 			hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
+ 			hash_keys.addrs.v6addrs.src = flkeys->addrs.v6addrs.src;
+ 			hash_keys.addrs.v6addrs.dst = flkeys->addrs.v6addrs.dst;
+ 			hash_keys.ports.src = flkeys->ports.src;
+ 			hash_keys.ports.dst = flkeys->ports.dst;
+ 			hash_keys.basic.ip_proto = flkeys->basic.ip_proto;
+ 		} else {
+ 			memset(&hash_keys, 0, sizeof(hash_keys));
+ 			hash_keys.control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
+ 			hash_keys.addrs.v6addrs.src = fl6->saddr;
+ 			hash_keys.addrs.v6addrs.dst = fl6->daddr;
+ 			hash_keys.ports.src = fl6->fl6_sport;
+ 			hash_keys.ports.dst = fl6->fl6_dport;
+ 			hash_keys.basic.ip_proto = fl6->flowi6_proto;
+ 		}
+ 		break;
  	}
+ 	mhash = flow_hash_from_keys(&hash_keys);
  
- 	return get_hash_from_flowi6(fl6) >> 1;
+ 	return mhash >> 1;
  }
  
  void ip6_route_input(struct sk_buff *skb)
@@@ -1873,20 -1935,29 +1936,29 @@@
  		.flowi6_mark = skb->mark,
  		.flowi6_proto = iph->nexthdr,
  	};
+ 	struct flow_keys *flkeys = NULL, _flkeys;
  
  	tun_info = skb_tunnel_info(skb);
  	if (tun_info && !(tun_info->mode & IP_TUNNEL_INFO_TX))
  		fl6.flowi6_tun_key.tun_id = tun_info->key.tun_id;
+ 
+ 	if (fib6_rules_early_flow_dissect(net, skb, &fl6, &_flkeys))
+ 		flkeys = &_flkeys;
+ 
  	if (unlikely(fl6.flowi6_proto == IPPROTO_ICMPV6))
- 		fl6.mp_hash = rt6_multipath_hash(&fl6, skb);
+ 		fl6.mp_hash = rt6_multipath_hash(net, &fl6, skb, flkeys);
  	skb_dst_drop(skb);
- 	skb_dst_set(skb, ip6_route_input_lookup(net, skb->dev, &fl6, flags));
+ 	skb_dst_set(skb,
+ 		    ip6_route_input_lookup(net, skb->dev, &fl6, skb, flags));
  }
  
- static struct rt6_info *ip6_pol_route_output(struct net *net, struct fib6_table *table,
- 					     struct flowi6 *fl6, int flags)
+ static struct rt6_info *ip6_pol_route_output(struct net *net,
+ 					     struct fib6_table *table,
+ 					     struct flowi6 *fl6,
+ 					     const struct sk_buff *skb,
+ 					     int flags)
  {
- 	return ip6_pol_route(net, table, fl6->flowi6_oif, fl6, flags);
+ 	return ip6_pol_route(net, table, fl6->flowi6_oif, fl6, skb, flags);
  }
  
  struct dst_entry *ip6_route_output_flags(struct net *net, const struct sock *sk,
@@@ -1914,7 -1985,7 +1986,7 @@@
  	else if (sk)
  		flags |= rt6_srcprefs2flags(inet6_sk(sk)->srcprefs);
  
- 	return fib6_rule_lookup(net, fl6, flags, ip6_pol_route_output);
+ 	return fib6_rule_lookup(net, fl6, NULL, flags, ip6_pol_route_output);
  }
  EXPORT_SYMBOL_GPL(ip6_route_output_flags);
  
@@@ -2163,6 -2234,7 +2235,7 @@@ struct ip6rd_flowi 
  static struct rt6_info *__ip6_route_redirect(struct net *net,
  					     struct fib6_table *table,
  					     struct flowi6 *fl6,
+ 					     const struct sk_buff *skb,
  					     int flags)
  {
  	struct ip6rd_flowi *rdfl = (struct ip6rd_flowi *)fl6;
@@@ -2236,8 -2308,9 +2309,9 @@@ out
  };
  
  static struct dst_entry *ip6_route_redirect(struct net *net,
- 					const struct flowi6 *fl6,
- 					const struct in6_addr *gateway)
+ 					    const struct flowi6 *fl6,
+ 					    const struct sk_buff *skb,
+ 					    const struct in6_addr *gateway)
  {
  	int flags = RT6_LOOKUP_F_HAS_SADDR;
  	struct ip6rd_flowi rdfl;
@@@ -2245,7 -2318,7 +2319,7 @@@
  	rdfl.fl6 = *fl6;
  	rdfl.gateway = *gateway;
  
- 	return fib6_rule_lookup(net, &rdfl.fl6,
+ 	return fib6_rule_lookup(net, &rdfl.fl6, skb,
  				flags, __ip6_route_redirect);
  }
  
@@@ -2265,7 -2338,7 +2339,7 @@@ void ip6_redirect(struct sk_buff *skb, 
  	fl6.flowlabel = ip6_flowinfo(iph);
  	fl6.flowi6_uid = uid;
  
- 	dst = ip6_route_redirect(net, &fl6, &ipv6_hdr(skb)->saddr);
+ 	dst = ip6_route_redirect(net, &fl6, skb, &ipv6_hdr(skb)->saddr);
  	rt6_do_redirect(dst, NULL, skb);
  	dst_release(dst);
  }
@@@ -2287,7 -2360,7 +2361,7 @@@ void ip6_redirect_no_header(struct sk_b
  	fl6.saddr = iph->daddr;
  	fl6.flowi6_uid = sock_net_uid(net, NULL);
  
- 	dst = ip6_route_redirect(net, &fl6, &iph->saddr);
+ 	dst = ip6_route_redirect(net, &fl6, skb, &iph->saddr);
  	rt6_do_redirect(dst, NULL, skb);
  	dst_release(dst);
  }
@@@ -2489,7 -2562,7 +2563,7 @@@ static struct rt6_info *ip6_nh_lookup_t
  		flags |= RT6_LOOKUP_F_HAS_SADDR;
  
  	flags |= RT6_LOOKUP_F_IGNORE_LINKSTATE;
- 	rt = ip6_pol_route(net, table, cfg->fc_ifindex, &fl6, flags);
+ 	rt = ip6_pol_route(net, table, cfg->fc_ifindex, &fl6, NULL, flags);
  
  	/* if table lookup failed, fall back to full lookup */
  	if (rt == net->ipv6.ip6_null_entry) {
@@@ -2502,7 -2575,7 +2576,7 @@@
  
  static int ip6_route_check_nh_onlink(struct net *net,
  				     struct fib6_config *cfg,
- 				     struct net_device *dev,
+ 				     const struct net_device *dev,
  				     struct netlink_ext_ack *extack)
  {
  	u32 tbid = l3mdev_fib_table(dev) ? : RT_TABLE_MAIN;
@@@ -2552,7 -2625,7 +2626,7 @@@ static int ip6_route_check_nh(struct ne
  	}
  
  	if (!grt)
- 		grt = rt6_lookup(net, gw_addr, NULL, cfg->fc_ifindex, 1);
+ 		grt = rt6_lookup(net, gw_addr, NULL, cfg->fc_ifindex, NULL, 1);
  
  	if (!grt)
  		goto out;
@@@ -2578,6 -2651,79 +2652,79 @@@ out
  	return err;
  }
  
+ static int ip6_validate_gw(struct net *net, struct fib6_config *cfg,
+ 			   struct net_device **_dev, struct inet6_dev **idev,
+ 			   struct netlink_ext_ack *extack)
+ {
+ 	const struct in6_addr *gw_addr = &cfg->fc_gateway;
+ 	int gwa_type = ipv6_addr_type(gw_addr);
+ 	bool skip_dev = gwa_type & IPV6_ADDR_LINKLOCAL ? false : true;
+ 	const struct net_device *dev = *_dev;
+ 	bool need_addr_check = !dev;
+ 	int err = -EINVAL;
+ 
+ 	/* if gw_addr is local we will fail to detect this in case
+ 	 * address is still TENTATIVE (DAD in progress). rt6_lookup()
+ 	 * will return already-added prefix route via interface that
+ 	 * prefix route was assigned to, which might be non-loopback.
+ 	 */
+ 	if (dev &&
+ 	    ipv6_chk_addr_and_flags(net, gw_addr, dev, skip_dev, 0, 0)) {
+ 		NL_SET_ERR_MSG(extack, "Gateway can not be a local address");
+ 		goto out;
+ 	}
+ 
+ 	if (gwa_type != (IPV6_ADDR_LINKLOCAL | IPV6_ADDR_UNICAST)) {
+ 		/* IPv6 strictly inhibits using not link-local
+ 		 * addresses as nexthop address.
+ 		 * Otherwise, router will not able to send redirects.
+ 		 * It is very good, but in some (rare!) circumstances
+ 		 * (SIT, PtP, NBMA NOARP links) it is handy to allow
+ 		 * some exceptions. --ANK
+ 		 * We allow IPv4-mapped nexthops to support RFC4798-type
+ 		 * addressing
+ 		 */
+ 		if (!(gwa_type & (IPV6_ADDR_UNICAST | IPV6_ADDR_MAPPED))) {
+ 			NL_SET_ERR_MSG(extack, "Invalid gateway address");
+ 			goto out;
+ 		}
+ 
+ 		if (cfg->fc_flags & RTNH_F_ONLINK)
+ 			err = ip6_route_check_nh_onlink(net, cfg, dev, extack);
+ 		else
+ 			err = ip6_route_check_nh(net, cfg, _dev, idev);
+ 
+ 		if (err)
+ 			goto out;
+ 	}
+ 
+ 	/* reload in case device was changed */
+ 	dev = *_dev;
+ 
+ 	err = -EINVAL;
+ 	if (!dev) {
+ 		NL_SET_ERR_MSG(extack, "Egress device not specified");
+ 		goto out;
+ 	} else if (dev->flags & IFF_LOOPBACK) {
+ 		NL_SET_ERR_MSG(extack,
+ 			       "Egress device can not be loopback device for this route");
+ 		goto out;
+ 	}
+ 
+ 	/* if we did not check gw_addr above, do so now that the
+ 	 * egress device has been resolved.
+ 	 */
+ 	if (need_addr_check &&
+ 	    ipv6_chk_addr_and_flags(net, gw_addr, dev, skip_dev, 0, 0)) {
+ 		NL_SET_ERR_MSG(extack, "Gateway can not be a local address");
+ 		goto out;
+ 	}
+ 
+ 	err = 0;
+ out:
+ 	return err;
+ }
+ 
  static struct rt6_info *ip6_route_info_create(struct fib6_config *cfg,
  					      struct netlink_ext_ack *extack)
  {
@@@ -2697,14 -2843,7 +2844,7 @@@
  		if (err)
  			goto out;
  		rt->dst.lwtstate = lwtstate_get(lwtstate);
- 		if (lwtunnel_output_redirect(rt->dst.lwtstate)) {
- 			rt->dst.lwtstate->orig_output = rt->dst.output;
- 			rt->dst.output = lwtunnel_output;
- 		}
- 		if (lwtunnel_input_redirect(rt->dst.lwtstate)) {
- 			rt->dst.lwtstate->orig_input = rt->dst.input;
- 			rt->dst.input = lwtunnel_input;
- 		}
+ 		lwtunnel_set_redirect(&rt->dst);
  	}
  
  	ipv6_addr_prefix(&rt->rt6i_dst.addr, &cfg->fc_dst, cfg->fc_dst_len);
@@@ -2767,61 -2906,11 +2907,11 @@@
  	}
  
  	if (cfg->fc_flags & RTF_GATEWAY) {
- 		const struct in6_addr *gw_addr;
- 		int gwa_type;
- 
- 		gw_addr = &cfg->fc_gateway;
- 		gwa_type = ipv6_addr_type(gw_addr);
- 
- 		/* if gw_addr is local we will fail to detect this in case
- 		 * address is still TENTATIVE (DAD in progress). rt6_lookup()
- 		 * will return already-added prefix route via interface that
- 		 * prefix route was assigned to, which might be non-loopback.
- 		 */
- 		err = -EINVAL;
- 		if (ipv6_chk_addr_and_flags(net, gw_addr,
- 					    gwa_type & IPV6_ADDR_LINKLOCAL ?
- 					    dev : NULL, 0, 0)) {
- 			NL_SET_ERR_MSG(extack, "Invalid gateway address");
+ 		err = ip6_validate_gw(net, cfg, &dev, &idev, extack);
+ 		if (err)
  			goto out;
- 		}
- 		rt->rt6i_gateway = *gw_addr;
- 
- 		if (gwa_type != (IPV6_ADDR_LINKLOCAL|IPV6_ADDR_UNICAST)) {
- 			/* IPv6 strictly inhibits using not link-local
- 			   addresses as nexthop address.
- 			   Otherwise, router will not able to send redirects.
- 			   It is very good, but in some (rare!) circumstances
- 			   (SIT, PtP, NBMA NOARP links) it is handy to allow
- 			   some exceptions. --ANK
- 			   We allow IPv4-mapped nexthops to support RFC4798-type
- 			   addressing
- 			 */
- 			if (!(gwa_type & (IPV6_ADDR_UNICAST |
- 					  IPV6_ADDR_MAPPED))) {
- 				NL_SET_ERR_MSG(extack,
- 					       "Invalid gateway address");
- 				goto out;
- 			}
  
- 			if (cfg->fc_flags & RTNH_F_ONLINK) {
- 				err = ip6_route_check_nh_onlink(net, cfg, dev,
- 								extack);
- 			} else {
- 				err = ip6_route_check_nh(net, cfg, &dev, &idev);
- 			}
- 			if (err)
- 				goto out;
- 		}
- 		err = -EINVAL;
- 		if (!dev) {
- 			NL_SET_ERR_MSG(extack, "Egress device not specified");
- 			goto out;
- 		} else if (dev->flags & IFF_LOOPBACK) {
- 			NL_SET_ERR_MSG(extack,
- 				       "Egress device can not be loopback device for this route");
- 			goto out;
- 		}
+ 		rt->rt6i_gateway = cfg->fc_gateway;
  	}
  
  	err = -ENODEV;
@@@ -4613,7 -4702,7 +4703,7 @@@ static int inet6_rtm_getroute(struct sk
  		if (!ipv6_addr_any(&fl6.saddr))
  			flags |= RT6_LOOKUP_F_HAS_SADDR;
  
- 		dst = ip6_route_input_lookup(net, dev, &fl6, flags);
+ 		dst = ip6_route_input_lookup(net, dev, &fl6, NULL, flags);
  
  		rcu_read_unlock();
  	} else {
@@@ -4978,7 -5067,7 +5068,7 @@@ static int __net_init ip6_route_net_ini
  {
  #ifdef CONFIG_PROC_FS
  	proc_create("ipv6_route", 0, net->proc_net, &ipv6_route_proc_fops);
- 	proc_create("rt6_stats", S_IRUGO, net->proc_net, &rt6_stats_seq_fops);
+ 	proc_create("rt6_stats", 0444, net->proc_net, &rt6_stats_seq_fops);
  #endif
  	return 0;
  }
diff --combined net/netlink/af_netlink.c
index 70c455341243,f1b02d87e336..fa556fdef57d
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@@ -1085,9 -1085,6 +1085,9 @@@ static int netlink_connect(struct socke
  	if (addr->sa_family != AF_NETLINK)
  		return -EINVAL;
  
 +	if (alen < sizeof(struct sockaddr_nl))
 +		return -EINVAL;
 +
  	if ((nladdr->nl_groups || nladdr->nl_pid) &&
  	    !netlink_allowed(sock, NL_CFG_F_NONROOT_SEND))
  		return -EPERM;
@@@ -1108,7 -1105,7 +1108,7 @@@
  }
  
  static int netlink_getname(struct socket *sock, struct sockaddr *addr,
- 			   int *addr_len, int peer)
+ 			   int peer)
  {
  	struct sock *sk = sock->sk;
  	struct netlink_sock *nlk = nlk_sk(sk);
@@@ -1116,7 -1113,6 +1116,6 @@@
  
  	nladdr->nl_family = AF_NETLINK;
  	nladdr->nl_pad = 0;
- 	*addr_len = sizeof(*nladdr);
  
  	if (peer) {
  		nladdr->nl_pid = nlk->dst_portid;
@@@ -1127,7 -1123,7 +1126,7 @@@
  		nladdr->nl_groups = nlk->groups ? nlk->groups[0] : 0;
  		netlink_unlock_table();
  	}
- 	return 0;
+ 	return sizeof(*nladdr);
  }
  
  static int netlink_ioctl(struct socket *sock, unsigned int cmd,
diff --combined net/sched/act_api.c
index efc6bfb9a4e0,0d78b58e1898..72251241665a
--- a/net/sched/act_api.c
+++ b/net/sched/act_api.c
@@@ -109,6 -109,42 +109,42 @@@ int __tcf_idr_release(struct tc_action 
  }
  EXPORT_SYMBOL(__tcf_idr_release);
  
+ static size_t tcf_action_shared_attrs_size(const struct tc_action *act)
+ {
+ 	u32 cookie_len = 0;
+ 
+ 	if (act->act_cookie)
+ 		cookie_len = nla_total_size(act->act_cookie->len);
+ 
+ 	return  nla_total_size(0) /* action number nested */
+ 		+ nla_total_size(IFNAMSIZ) /* TCA_ACT_KIND */
+ 		+ cookie_len /* TCA_ACT_COOKIE */
+ 		+ nla_total_size(0) /* TCA_ACT_STATS nested */
+ 		/* TCA_STATS_BASIC */
+ 		+ nla_total_size_64bit(sizeof(struct gnet_stats_basic))
+ 		/* TCA_STATS_QUEUE */
+ 		+ nla_total_size_64bit(sizeof(struct gnet_stats_queue))
+ 		+ nla_total_size(0) /* TCA_OPTIONS nested */
+ 		+ nla_total_size(sizeof(struct tcf_t)); /* TCA_GACT_TM */
+ }
+ 
+ static size_t tcf_action_full_attrs_size(size_t sz)
+ {
+ 	return NLMSG_HDRLEN                     /* struct nlmsghdr */
+ 		+ sizeof(struct tcamsg)
+ 		+ nla_total_size(0)             /* TCA_ACT_TAB nested */
+ 		+ sz;
+ }
+ 
+ static size_t tcf_action_fill_size(const struct tc_action *act)
+ {
+ 	size_t sz = tcf_action_shared_attrs_size(act);
+ 
+ 	if (act->ops->get_fill_size)
+ 		return act->ops->get_fill_size(act) + sz;
+ 	return sz;
+ }
+ 
  static int tcf_dump_walker(struct tcf_idrinfo *idrinfo, struct sk_buff *skb,
  			   struct netlink_callback *cb)
  {
@@@ -135,10 -171,8 +171,10 @@@
  			continue;
  
  		nest = nla_nest_start(skb, n_i);
 -		if (!nest)
 +		if (!nest) {
 +			index--;
  			goto nla_put_failure;
 +		}
  		err = tcf_action_dump_1(skb, p, 0, 0);
  		if (err < 0) {
  			index--;
@@@ -204,7 -238,8 +240,8 @@@ nla_put_failure
  
  int tcf_generic_walker(struct tc_action_net *tn, struct sk_buff *skb,
  		       struct netlink_callback *cb, int type,
- 		       const struct tc_action_ops *ops)
+ 		       const struct tc_action_ops *ops,
+ 		       struct netlink_ext_ack *extack)
  {
  	struct tcf_idrinfo *idrinfo = tn->idrinfo;
  
@@@ -213,7 -248,8 +250,8 @@@
  	} else if (type == RTM_GETACTION) {
  		return tcf_dump_walker(idrinfo, skb, cb);
  	} else {
- 		WARN(1, "tcf_generic_walker: unknown action %d\n", type);
+ 		WARN(1, "tcf_generic_walker: unknown command %d\n", type);
+ 		NL_SET_ERR_MSG(extack, "tcf_generic_walker: unknown command");
  		return -EINVAL;
  	}
  }
@@@ -260,14 -296,6 +298,6 @@@ bool tcf_idr_check(struct tc_action_ne
  }
  EXPORT_SYMBOL(tcf_idr_check);
  
- void tcf_idr_cleanup(struct tc_action *a, struct nlattr *est)
- {
- 	if (est)
- 		gen_kill_estimator(&a->tcfa_rate_est);
- 	free_tcf(a);
- }
- EXPORT_SYMBOL(tcf_idr_cleanup);
- 
  int tcf_idr_create(struct tc_action_net *tn, u32 index, struct nlattr *est,
  		   struct tc_action **a, const struct tc_action_ops *ops,
  		   int bind, bool cpustats)
@@@ -607,7 -635,8 +637,8 @@@ static struct tc_cookie *nla_memdup_coo
  
  struct tc_action *tcf_action_init_1(struct net *net, struct tcf_proto *tp,
  				    struct nlattr *nla, struct nlattr *est,
- 				    char *name, int ovr, int bind)
+ 				    char *name, int ovr, int bind,
+ 				    struct netlink_ext_ack *extack)
  {
  	struct tc_action *a;
  	struct tc_action_ops *a_o;
@@@ -618,31 -647,40 +649,40 @@@
  	int err;
  
  	if (name == NULL) {
- 		err = nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL, NULL);
+ 		err = nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL, extack);
  		if (err < 0)
  			goto err_out;
  		err = -EINVAL;
  		kind = tb[TCA_ACT_KIND];
- 		if (kind == NULL)
+ 		if (!kind) {
+ 			NL_SET_ERR_MSG(extack, "TC action kind must be specified");
  			goto err_out;
- 		if (nla_strlcpy(act_name, kind, IFNAMSIZ) >= IFNAMSIZ)
+ 		}
+ 		if (nla_strlcpy(act_name, kind, IFNAMSIZ) >= IFNAMSIZ) {
+ 			NL_SET_ERR_MSG(extack, "TC action name too long");
  			goto err_out;
+ 		}
  		if (tb[TCA_ACT_COOKIE]) {
  			int cklen = nla_len(tb[TCA_ACT_COOKIE]);
  
- 			if (cklen > TC_COOKIE_MAX_SIZE)
+ 			if (cklen > TC_COOKIE_MAX_SIZE) {
+ 				NL_SET_ERR_MSG(extack, "TC cookie size above the maximum");
  				goto err_out;
+ 			}
  
  			cookie = nla_memdup_cookie(tb);
  			if (!cookie) {
+ 				NL_SET_ERR_MSG(extack, "No memory to generate TC cookie");
  				err = -ENOMEM;
  				goto err_out;
  			}
  		}
  	} else {
- 		err = -EINVAL;
- 		if (strlcpy(act_name, name, IFNAMSIZ) >= IFNAMSIZ)
+ 		if (strlcpy(act_name, name, IFNAMSIZ) >= IFNAMSIZ) {
+ 			NL_SET_ERR_MSG(extack, "TC action name too long");
+ 			err = -EINVAL;
  			goto err_out;
+ 		}
  	}
  
  	a_o = tc_lookup_action_n(act_name);
@@@ -665,15 -703,17 +705,17 @@@
  			goto err_mod;
  		}
  #endif
+ 		NL_SET_ERR_MSG(extack, "Failed to load TC action module");
  		err = -ENOENT;
  		goto err_out;
  	}
  
  	/* backward compatibility for policer */
  	if (name == NULL)
- 		err = a_o->init(net, tb[TCA_ACT_OPTIONS], est, &a, ovr, bind);
+ 		err = a_o->init(net, tb[TCA_ACT_OPTIONS], est, &a, ovr, bind,
+ 				extack);
  	else
- 		err = a_o->init(net, nla, est, &a, ovr, bind);
+ 		err = a_o->init(net, nla, est, &a, ovr, bind, extack);
  	if (err < 0)
  		goto err_mod;
  
@@@ -699,6 -739,7 +741,7 @@@
  
  			list_add_tail(&a->list, &actions);
  			tcf_action_destroy(&actions, bind);
+ 			NL_SET_ERR_MSG(extack, "Failed to init TC action chain");
  			return ERR_PTR(err);
  		}
  	}
@@@ -728,29 -769,35 +771,35 @@@ static void cleanup_a(struct list_head 
  
  int tcf_action_init(struct net *net, struct tcf_proto *tp, struct nlattr *nla,
  		    struct nlattr *est, char *name, int ovr, int bind,
- 		    struct list_head *actions)
+ 		    struct list_head *actions, size_t *attr_size,
+ 		    struct netlink_ext_ack *extack)
  {
  	struct nlattr *tb[TCA_ACT_MAX_PRIO + 1];
  	struct tc_action *act;
+ 	size_t sz = 0;
  	int err;
  	int i;
  
- 	err = nla_parse_nested(tb, TCA_ACT_MAX_PRIO, nla, NULL, NULL);
+ 	err = nla_parse_nested(tb, TCA_ACT_MAX_PRIO, nla, NULL, extack);
  	if (err < 0)
  		return err;
  
  	for (i = 1; i <= TCA_ACT_MAX_PRIO && tb[i]; i++) {
- 		act = tcf_action_init_1(net, tp, tb[i], est, name, ovr, bind);
+ 		act = tcf_action_init_1(net, tp, tb[i], est, name, ovr, bind,
+ 					extack);
  		if (IS_ERR(act)) {
  			err = PTR_ERR(act);
  			goto err;
  		}
  		act->order = i;
+ 		sz += tcf_action_fill_size(act);
  		if (ovr)
  			act->tcfa_refcnt++;
  		list_add_tail(&act->list, actions);
  	}
  
+ 	*attr_size = tcf_action_full_attrs_size(sz);
+ 
  	/* Remove the temp refcnt which was necessary to protect against
  	 * destroying an existing action which was being replaced
  	 */
@@@ -824,7 -871,7 +873,7 @@@ static int tca_get_fill(struct sk_buff 
  	t->tca__pad2 = 0;
  
  	nest = nla_nest_start(skb, TCA_ACT_TAB);
- 	if (nest == NULL)
+ 	if (!nest)
  		goto out_nlmsg_trim;
  
  	if (tcf_action_dump(skb, actions, bind, ref) < 0)
@@@ -842,7 -889,8 +891,8 @@@ out_nlmsg_trim
  
  static int
  tcf_get_notify(struct net *net, u32 portid, struct nlmsghdr *n,
- 	       struct list_head *actions, int event)
+ 	       struct list_head *actions, int event,
+ 	       struct netlink_ext_ack *extack)
  {
  	struct sk_buff *skb;
  
@@@ -851,6 -899,7 +901,7 @@@
  		return -ENOBUFS;
  	if (tca_get_fill(skb, actions, portid, n->nlmsg_seq, 0, event,
  			 0, 0) <= 0) {
+ 		NL_SET_ERR_MSG(extack, "Failed to fill netlink attributes while adding TC action");
  		kfree_skb(skb);
  		return -EINVAL;
  	}
@@@ -859,7 -908,8 +910,8 @@@
  }
  
  static struct tc_action *tcf_action_get_1(struct net *net, struct nlattr *nla,
- 					  struct nlmsghdr *n, u32 portid)
+ 					  struct nlmsghdr *n, u32 portid,
+ 					  struct netlink_ext_ack *extack)
  {
  	struct nlattr *tb[TCA_ACT_MAX + 1];
  	const struct tc_action_ops *ops;
@@@ -867,22 -917,26 +919,26 @@@
  	int index;
  	int err;
  
- 	err = nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL, NULL);
+ 	err = nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL, extack);
  	if (err < 0)
  		goto err_out;
  
  	err = -EINVAL;
  	if (tb[TCA_ACT_INDEX] == NULL ||
- 	    nla_len(tb[TCA_ACT_INDEX]) < sizeof(index))
+ 	    nla_len(tb[TCA_ACT_INDEX]) < sizeof(index)) {
+ 		NL_SET_ERR_MSG(extack, "Invalid TC action index value");
  		goto err_out;
+ 	}
  	index = nla_get_u32(tb[TCA_ACT_INDEX]);
  
  	err = -EINVAL;
  	ops = tc_lookup_action(tb[TCA_ACT_KIND]);
- 	if (!ops) /* could happen in batch of actions */
+ 	if (!ops) { /* could happen in batch of actions */
+ 		NL_SET_ERR_MSG(extack, "Specified TC action not found");
  		goto err_out;
+ 	}
  	err = -ENOENT;
- 	if (ops->lookup(net, &a, index) == 0)
+ 	if (ops->lookup(net, &a, index, extack) == 0)
  		goto err_mod;
  
  	module_put(ops->owner);
@@@ -895,7 -949,8 +951,8 @@@ err_out
  }
  
  static int tca_action_flush(struct net *net, struct nlattr *nla,
- 			    struct nlmsghdr *n, u32 portid)
+ 			    struct nlmsghdr *n, u32 portid,
+ 			    struct netlink_ext_ack *extack)
  {
  	struct sk_buff *skb;
  	unsigned char *b;
@@@ -909,39 -964,45 +966,45 @@@
  	int err = -ENOMEM;
  
  	skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
- 	if (!skb) {
- 		pr_debug("tca_action_flush: failed skb alloc\n");
+ 	if (!skb)
  		return err;
- 	}
  
  	b = skb_tail_pointer(skb);
  
- 	err = nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL, NULL);
+ 	err = nla_parse_nested(tb, TCA_ACT_MAX, nla, NULL, extack);
  	if (err < 0)
  		goto err_out;
  
  	err = -EINVAL;
  	kind = tb[TCA_ACT_KIND];
  	ops = tc_lookup_action(kind);
- 	if (!ops) /*some idjot trying to flush unknown action */
+ 	if (!ops) { /*some idjot trying to flush unknown action */
+ 		NL_SET_ERR_MSG(extack, "Cannot flush unknown TC action");
  		goto err_out;
+ 	}
  
  	nlh = nlmsg_put(skb, portid, n->nlmsg_seq, RTM_DELACTION,
  			sizeof(*t), 0);
- 	if (!nlh)
+ 	if (!nlh) {
+ 		NL_SET_ERR_MSG(extack, "Failed to create TC action flush notification");
  		goto out_module_put;
+ 	}
  	t = nlmsg_data(nlh);
  	t->tca_family = AF_UNSPEC;
  	t->tca__pad1 = 0;
  	t->tca__pad2 = 0;
  
  	nest = nla_nest_start(skb, TCA_ACT_TAB);
- 	if (nest == NULL)
+ 	if (!nest) {
+ 		NL_SET_ERR_MSG(extack, "Failed to add new netlink message");
  		goto out_module_put;
+ 	}
  
- 	err = ops->walk(net, skb, &dcb, RTM_DELACTION, ops);
- 	if (err <= 0)
+ 	err = ops->walk(net, skb, &dcb, RTM_DELACTION, ops, extack);
+ 	if (err <= 0) {
+ 		nla_nest_cancel(skb, nest);
  		goto out_module_put;
+ 	}
  
  	nla_nest_end(skb, nest);
  
@@@ -952,6 -1013,8 +1015,8 @@@
  			     n->nlmsg_flags & NLM_F_ECHO);
  	if (err > 0)
  		return 0;
+ 	if (err < 0)
+ 		NL_SET_ERR_MSG(extack, "Failed to send TC action flush notification");
  
  	return err;
  
@@@ -964,17 -1027,19 +1029,19 @@@ err_out
  
  static int
  tcf_del_notify(struct net *net, struct nlmsghdr *n, struct list_head *actions,
- 	       u32 portid)
+ 	       u32 portid, size_t attr_size, struct netlink_ext_ack *extack)
  {
  	int ret;
  	struct sk_buff *skb;
  
- 	skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
+ 	skb = alloc_skb(attr_size <= NLMSG_GOODSIZE ? NLMSG_GOODSIZE : attr_size,
+ 			GFP_KERNEL);
  	if (!skb)
  		return -ENOBUFS;
  
  	if (tca_get_fill(skb, actions, portid, n->nlmsg_seq, 0, RTM_DELACTION,
  			 0, 1) <= 0) {
+ 		NL_SET_ERR_MSG(extack, "Failed to fill netlink TC action attributes");
  		kfree_skb(skb);
  		return -EINVAL;
  	}
@@@ -982,6 -1047,7 +1049,7 @@@
  	/* now do the delete */
  	ret = tcf_action_destroy(actions, 0);
  	if (ret < 0) {
+ 		NL_SET_ERR_MSG(extack, "Failed to delete TC action");
  		kfree_skb(skb);
  		return ret;
  	}
@@@ -995,38 -1061,43 +1063,43 @@@
  
  static int
  tca_action_gd(struct net *net, struct nlattr *nla, struct nlmsghdr *n,
- 	      u32 portid, int event)
+ 	      u32 portid, int event, struct netlink_ext_ack *extack)
  {
  	int i, ret;
  	struct nlattr *tb[TCA_ACT_MAX_PRIO + 1];
  	struct tc_action *act;
+ 	size_t attr_size = 0;
  	LIST_HEAD(actions);
  
- 	ret = nla_parse_nested(tb, TCA_ACT_MAX_PRIO, nla, NULL, NULL);
+ 	ret = nla_parse_nested(tb, TCA_ACT_MAX_PRIO, nla, NULL, extack);
  	if (ret < 0)
  		return ret;
  
  	if (event == RTM_DELACTION && n->nlmsg_flags & NLM_F_ROOT) {
- 		if (tb[1] != NULL)
- 			return tca_action_flush(net, tb[1], n, portid);
- 		else
- 			return -EINVAL;
+ 		if (tb[1])
+ 			return tca_action_flush(net, tb[1], n, portid, extack);
+ 
+ 		NL_SET_ERR_MSG(extack, "Invalid netlink attributes while flushing TC action");
+ 		return -EINVAL;
  	}
  
  	for (i = 1; i <= TCA_ACT_MAX_PRIO && tb[i]; i++) {
- 		act = tcf_action_get_1(net, tb[i], n, portid);
+ 		act = tcf_action_get_1(net, tb[i], n, portid, extack);
  		if (IS_ERR(act)) {
  			ret = PTR_ERR(act);
  			goto err;
  		}
  		act->order = i;
+ 		attr_size += tcf_action_fill_size(act);
  		list_add_tail(&act->list, &actions);
  	}
  
+ 	attr_size = tcf_action_full_attrs_size(attr_size);
+ 
  	if (event == RTM_GETACTION)
- 		ret = tcf_get_notify(net, portid, n, &actions, event);
+ 		ret = tcf_get_notify(net, portid, n, &actions, event, extack);
  	else { /* delete */
- 		ret = tcf_del_notify(net, n, &actions, portid);
+ 		ret = tcf_del_notify(net, n, &actions, portid, attr_size, extack);
  		if (ret)
  			goto err;
  		return ret;
@@@ -1039,17 -1110,19 +1112,19 @@@ err
  
  static int
  tcf_add_notify(struct net *net, struct nlmsghdr *n, struct list_head *actions,
- 	       u32 portid)
+ 	       u32 portid, size_t attr_size, struct netlink_ext_ack *extack)
  {
  	struct sk_buff *skb;
  	int err = 0;
  
- 	skb = alloc_skb(NLMSG_GOODSIZE, GFP_KERNEL);
+ 	skb = alloc_skb(attr_size <= NLMSG_GOODSIZE ? NLMSG_GOODSIZE : attr_size,
+ 			GFP_KERNEL);
  	if (!skb)
  		return -ENOBUFS;
  
  	if (tca_get_fill(skb, actions, portid, n->nlmsg_seq, n->nlmsg_flags,
  			 RTM_NEWACTION, 0, 0) <= 0) {
+ 		NL_SET_ERR_MSG(extack, "Failed to fill netlink attributes while adding TC action");
  		kfree_skb(skb);
  		return -EINVAL;
  	}
@@@ -1062,16 -1135,19 +1137,19 @@@
  }
  
  static int tcf_action_add(struct net *net, struct nlattr *nla,
- 			  struct nlmsghdr *n, u32 portid, int ovr)
+ 			  struct nlmsghdr *n, u32 portid, int ovr,
+ 			  struct netlink_ext_ack *extack)
  {
+ 	size_t attr_size = 0;
  	int ret = 0;
  	LIST_HEAD(actions);
  
- 	ret = tcf_action_init(net, NULL, nla, NULL, NULL, ovr, 0, &actions);
+ 	ret = tcf_action_init(net, NULL, nla, NULL, NULL, ovr, 0, &actions,
+ 			      &attr_size, extack);
  	if (ret)
  		return ret;
  
- 	return tcf_add_notify(net, n, &actions, portid);
+ 	return tcf_add_notify(net, n, &actions, portid, attr_size, extack);
  }
  
  static u32 tcaa_root_flags_allowed = TCA_FLAG_LARGE_DUMP_ON;
@@@ -1099,7 -1175,7 +1177,7 @@@ static int tc_ctl_action(struct sk_buf
  		return ret;
  
  	if (tca[TCA_ACT_TAB] == NULL) {
- 		pr_notice("tc_ctl_action: received NO action attribs\n");
+ 		NL_SET_ERR_MSG(extack, "Netlink action attributes missing");
  		return -EINVAL;
  	}
  
@@@ -1115,17 -1191,18 +1193,18 @@@
  		if (n->nlmsg_flags & NLM_F_REPLACE)
  			ovr = 1;
  replay:
- 		ret = tcf_action_add(net, tca[TCA_ACT_TAB], n, portid, ovr);
+ 		ret = tcf_action_add(net, tca[TCA_ACT_TAB], n, portid, ovr,
+ 				     extack);
  		if (ret == -EAGAIN)
  			goto replay;
  		break;
  	case RTM_DELACTION:
  		ret = tca_action_gd(net, tca[TCA_ACT_TAB], n,
- 				    portid, RTM_DELACTION);
+ 				    portid, RTM_DELACTION, extack);
  		break;
  	case RTM_GETACTION:
  		ret = tca_action_gd(net, tca[TCA_ACT_TAB], n,
- 				    portid, RTM_GETACTION);
+ 				    portid, RTM_GETACTION, extack);
  		break;
  	default:
  		BUG();
@@@ -1220,7 -1297,7 +1299,7 @@@ static int tc_dump_action(struct sk_buf
  	if (nest == NULL)
  		goto out_module_put;
  
- 	ret = a_o->walk(net, skb, cb, RTM_GETACTION, a_o);
+ 	ret = a_o->walk(net, skb, cb, RTM_GETACTION, a_o, NULL);
  	if (ret < 0)
  		goto out_module_put;
  
diff --combined net/smc/smc_clc.c
index 15c213250606,64fbc3230e6c..3a988c22f627
--- a/net/smc/smc_clc.c
+++ b/net/smc/smc_clc.c
@@@ -5,15 -5,17 +5,17 @@@
   *  CLC (connection layer control) handshake over initial TCP socket to
   *  prepare for RDMA traffic
   *
-  *  Copyright IBM Corp. 2016
+  *  Copyright IBM Corp. 2016, 2018
   *
   *  Author(s):  Ursula Braun <ubraun at linux.vnet.ibm.com>
   */
  
  #include <linux/in.h>
+ #include <linux/inetdevice.h>
  #include <linux/if_ether.h>
  #include <linux/sched/signal.h>
  
+ #include <net/addrconf.h>
  #include <net/sock.h>
  #include <net/tcp.h>
  
@@@ -22,6 -24,9 +24,9 @@@
  #include "smc_clc.h"
  #include "smc_ib.h"
  
+ /* eye catcher "SMCR" EBCDIC for CLC messages */
+ static const char SMC_EYECATCHER[4] = {'\xe2', '\xd4', '\xc3', '\xd9'};
+ 
  /* check if received message has a correct header length and contains valid
   * heading and trailing eyecatchers
   */
@@@ -70,6 -75,172 +75,172 @@@ static bool smc_clc_msg_hdr_valid(struc
  	return true;
  }
  
+ /* find ipv4 addr on device and get the prefix len, fill CLC proposal msg */
+ static int smc_clc_prfx_set4_rcu(struct dst_entry *dst, __be32 ipv4,
+ 				 struct smc_clc_msg_proposal_prefix *prop)
+ {
+ 	struct in_device *in_dev = __in_dev_get_rcu(dst->dev);
+ 
+ 	if (!in_dev)
+ 		return -ENODEV;
+ 	for_ifa(in_dev) {
+ 		if (!inet_ifa_match(ipv4, ifa))
+ 			continue;
+ 		prop->prefix_len = inet_mask_len(ifa->ifa_mask);
+ 		prop->outgoing_subnet = ifa->ifa_address & ifa->ifa_mask;
+ 		/* prop->ipv6_prefixes_cnt = 0; already done by memset before */
+ 		return 0;
+ 	} endfor_ifa(in_dev);
+ 	return -ENOENT;
+ }
+ 
+ /* fill CLC proposal msg with ipv6 prefixes from device */
+ static int smc_clc_prfx_set6_rcu(struct dst_entry *dst,
+ 				 struct smc_clc_msg_proposal_prefix *prop,
+ 				 struct smc_clc_ipv6_prefix *ipv6_prfx)
+ {
+ #if IS_ENABLED(CONFIG_IPV6)
+ 	struct inet6_dev *in6_dev = __in6_dev_get(dst->dev);
+ 	struct inet6_ifaddr *ifa;
+ 	int cnt = 0;
+ 
+ 	if (!in6_dev)
+ 		return -ENODEV;
+ 	/* use a maximum of 8 IPv6 prefixes from device */
+ 	list_for_each_entry(ifa, &in6_dev->addr_list, if_list) {
+ 		if (ipv6_addr_type(&ifa->addr) & IPV6_ADDR_LINKLOCAL)
+ 			continue;
+ 		ipv6_addr_prefix(&ipv6_prfx[cnt].prefix,
+ 				 &ifa->addr, ifa->prefix_len);
+ 		ipv6_prfx[cnt].prefix_len = ifa->prefix_len;
+ 		cnt++;
+ 		if (cnt == SMC_CLC_MAX_V6_PREFIX)
+ 			break;
+ 	}
+ 	prop->ipv6_prefixes_cnt = cnt;
+ 	if (cnt)
+ 		return 0;
+ #endif
+ 	return -ENOENT;
+ }
+ 
+ /* retrieve and set prefixes in CLC proposal msg */
+ static int smc_clc_prfx_set(struct socket *clcsock,
+ 			    struct smc_clc_msg_proposal_prefix *prop,
+ 			    struct smc_clc_ipv6_prefix *ipv6_prfx)
+ {
+ 	struct dst_entry *dst = sk_dst_get(clcsock->sk);
+ 	struct sockaddr_storage addrs;
+ 	struct sockaddr_in6 *addr6;
+ 	struct sockaddr_in *addr;
+ 	int rc = -ENOENT;
+ 
+ 	memset(prop, 0, sizeof(*prop));
+ 	if (!dst) {
+ 		rc = -ENOTCONN;
+ 		goto out;
+ 	}
+ 	if (!dst->dev) {
+ 		rc = -ENODEV;
+ 		goto out_rel;
+ 	}
+ 	/* get address to which the internal TCP socket is bound */
+ 	kernel_getsockname(clcsock, (struct sockaddr *)&addrs);
+ 	/* analyze IP specific data of net_device belonging to TCP socket */
+ 	addr6 = (struct sockaddr_in6 *)&addrs;
+ 	rcu_read_lock();
+ 	if (addrs.ss_family == PF_INET) {
+ 		/* IPv4 */
+ 		addr = (struct sockaddr_in *)&addrs;
+ 		rc = smc_clc_prfx_set4_rcu(dst, addr->sin_addr.s_addr, prop);
+ 	} else if (ipv6_addr_v4mapped(&addr6->sin6_addr)) {
+ 		/* mapped IPv4 address - peer is IPv4 only */
+ 		rc = smc_clc_prfx_set4_rcu(dst, addr6->sin6_addr.s6_addr32[3],
+ 					   prop);
+ 	} else {
+ 		/* IPv6 */
+ 		rc = smc_clc_prfx_set6_rcu(dst, prop, ipv6_prfx);
+ 	}
+ 	rcu_read_unlock();
+ out_rel:
+ 	dst_release(dst);
+ out:
+ 	return rc;
+ }
+ 
+ /* match ipv4 addrs of dev against addr in CLC proposal */
+ static int smc_clc_prfx_match4_rcu(struct net_device *dev,
+ 				   struct smc_clc_msg_proposal_prefix *prop)
+ {
+ 	struct in_device *in_dev = __in_dev_get_rcu(dev);
+ 
+ 	if (!in_dev)
+ 		return -ENODEV;
+ 	for_ifa(in_dev) {
+ 		if (prop->prefix_len == inet_mask_len(ifa->ifa_mask) &&
+ 		    inet_ifa_match(prop->outgoing_subnet, ifa))
+ 			return 0;
+ 	} endfor_ifa(in_dev);
+ 
+ 	return -ENOENT;
+ }
+ 
+ /* match ipv6 addrs of dev against addrs in CLC proposal */
+ static int smc_clc_prfx_match6_rcu(struct net_device *dev,
+ 				   struct smc_clc_msg_proposal_prefix *prop)
+ {
+ #if IS_ENABLED(CONFIG_IPV6)
+ 	struct inet6_dev *in6_dev = __in6_dev_get(dev);
+ 	struct smc_clc_ipv6_prefix *ipv6_prfx;
+ 	struct inet6_ifaddr *ifa;
+ 	int i, max;
+ 
+ 	if (!in6_dev)
+ 		return -ENODEV;
+ 	/* ipv6 prefix list starts behind smc_clc_msg_proposal_prefix */
+ 	ipv6_prfx = (struct smc_clc_ipv6_prefix *)((u8 *)prop + sizeof(*prop));
+ 	max = min_t(u8, prop->ipv6_prefixes_cnt, SMC_CLC_MAX_V6_PREFIX);
+ 	list_for_each_entry(ifa, &in6_dev->addr_list, if_list) {
+ 		if (ipv6_addr_type(&ifa->addr) & IPV6_ADDR_LINKLOCAL)
+ 			continue;
+ 		for (i = 0; i < max; i++) {
+ 			if (ifa->prefix_len == ipv6_prfx[i].prefix_len &&
+ 			    ipv6_prefix_equal(&ifa->addr, &ipv6_prfx[i].prefix,
+ 					      ifa->prefix_len))
+ 				return 0;
+ 		}
+ 	}
+ #endif
+ 	return -ENOENT;
+ }
+ 
+ /* check if proposed prefixes match one of our device prefixes */
+ int smc_clc_prfx_match(struct socket *clcsock,
+ 		       struct smc_clc_msg_proposal_prefix *prop)
+ {
+ 	struct dst_entry *dst = sk_dst_get(clcsock->sk);
+ 	int rc;
+ 
+ 	if (!dst) {
+ 		rc = -ENOTCONN;
+ 		goto out;
+ 	}
+ 	if (!dst->dev) {
+ 		rc = -ENODEV;
+ 		goto out_rel;
+ 	}
+ 	rcu_read_lock();
+ 	if (!prop->ipv6_prefixes_cnt)
+ 		rc = smc_clc_prfx_match4_rcu(dst->dev, prop);
+ 	else
+ 		rc = smc_clc_prfx_match6_rcu(dst->dev, prop);
+ 	rcu_read_unlock();
+ out_rel:
+ 	dst_release(dst);
+ out:
+ 	return rc;
+ }
+ 
  /* Wait for data on the tcp-socket, analyze received data
   * Returns:
   * 0 if success and it was not a decline that we received.
@@@ -133,7 -304,7 +304,7 @@@ int smc_clc_wait_msg(struct smc_sock *s
  
  	/* receive the complete CLC message */
  	memset(&msg, 0, sizeof(struct msghdr));
 -	iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &vec, 1, buflen);
 +	iov_iter_kvec(&msg.msg_iter, READ | ITER_KVEC, &vec, 1, datlen);
  	krflags = MSG_WAITALL;
  	smc->clcsock->sk->sk_rcvtimeo = CLC_WAIT_TIME;
  	len = sock_recvmsg(smc->clcsock, &msg, krflags);
@@@ -189,16 -360,24 +360,24 @@@ int smc_clc_send_proposal(struct smc_so
  			  struct smc_ib_device *smcibdev,
  			  u8 ibport)
  {
+ 	struct smc_clc_ipv6_prefix ipv6_prfx[SMC_CLC_MAX_V6_PREFIX];
  	struct smc_clc_msg_proposal_prefix pclc_prfx;
  	struct smc_clc_msg_proposal pclc;
  	struct smc_clc_msg_trail trl;
+ 	int len, i, plen, rc;
  	int reason_code = 0;
- 	struct kvec vec[3];
+ 	struct kvec vec[4];
  	struct msghdr msg;
- 	int len, plen, rc;
+ 
+ 	/* retrieve ip prefixes for CLC proposal msg */
+ 	rc = smc_clc_prfx_set(smc->clcsock, &pclc_prfx, ipv6_prfx);
+ 	if (rc)
+ 		return SMC_CLC_DECL_CNFERR; /* configuration error */
  
  	/* send SMC Proposal CLC message */
- 	plen = sizeof(pclc) + sizeof(pclc_prfx) + sizeof(trl);
+ 	plen = sizeof(pclc) + sizeof(pclc_prfx) +
+ 	       (pclc_prfx.ipv6_prefixes_cnt * sizeof(ipv6_prfx[0])) +
+ 	       sizeof(trl);
  	memset(&pclc, 0, sizeof(pclc));
  	memcpy(pclc.hdr.eyecatcher, SMC_EYECATCHER, sizeof(SMC_EYECATCHER));
  	pclc.hdr.type = SMC_CLC_PROPOSAL;
@@@ -209,23 -388,22 +388,22 @@@
  	memcpy(&pclc.lcl.mac, &smcibdev->mac[ibport - 1], ETH_ALEN);
  	pclc.iparea_offset = htons(0);
  
- 	memset(&pclc_prfx, 0, sizeof(pclc_prfx));
- 	/* determine subnet and mask from internal TCP socket */
- 	rc = smc_netinfo_by_tcpsk(smc->clcsock, &pclc_prfx.outgoing_subnet,
- 				  &pclc_prfx.prefix_len);
- 	if (rc)
- 		return SMC_CLC_DECL_CNFERR; /* configuration error */
- 	pclc_prfx.ipv6_prefixes_cnt = 0;
  	memcpy(trl.eyecatcher, SMC_EYECATCHER, sizeof(SMC_EYECATCHER));
  	memset(&msg, 0, sizeof(msg));
- 	vec[0].iov_base = &pclc;
- 	vec[0].iov_len = sizeof(pclc);
- 	vec[1].iov_base = &pclc_prfx;
- 	vec[1].iov_len = sizeof(pclc_prfx);
- 	vec[2].iov_base = &trl;
- 	vec[2].iov_len = sizeof(trl);
+ 	i = 0;
+ 	vec[i].iov_base = &pclc;
+ 	vec[i++].iov_len = sizeof(pclc);
+ 	vec[i].iov_base = &pclc_prfx;
+ 	vec[i++].iov_len = sizeof(pclc_prfx);
+ 	if (pclc_prfx.ipv6_prefixes_cnt > 0) {
+ 		vec[i].iov_base = &ipv6_prfx[0];
+ 		vec[i++].iov_len = pclc_prfx.ipv6_prefixes_cnt *
+ 				   sizeof(ipv6_prfx[0]);
+ 	}
+ 	vec[i].iov_base = &trl;
+ 	vec[i++].iov_len = sizeof(trl);
  	/* due to the few bytes needed for clc-handshake this cannot block */
- 	len = kernel_sendmsg(smc->clcsock, &msg, vec, 3, plen);
+ 	len = kernel_sendmsg(smc->clcsock, &msg, vec, i, plen);
  	if (len < sizeof(pclc)) {
  		if (len >= 0) {
  			reason_code = -ENETUNREACH;
diff --combined net/socket.c
index 4ba9fc631c43,3d1948d27a25..54dcb43e25a1
--- a/net/socket.c
+++ b/net/socket.c
@@@ -104,7 -104,6 +104,6 @@@
  #include <linux/ipv6_route.h>
  #include <linux/route.h>
  #include <linux/sockios.h>
- #include <linux/atalk.h>
  #include <net/busy_poll.h>
  #include <linux/errqueue.h>
  
@@@ -234,7 -233,7 +233,7 @@@ static int move_addr_to_user(struct soc
  	return __put_user(klen, ulen);
  }
  
- static struct kmem_cache *sock_inode_cachep __read_mostly;
+ static struct kmem_cache *sock_inode_cachep __ro_after_init;
  
  static struct inode *sock_alloc_inode(struct super_block *sb)
  {
@@@ -991,10 -990,11 +990,11 @@@ static long sock_do_ioctl(struct net *n
   *	what to do with it - that's up to the protocol still.
   */
  
- static struct ns_common *get_net_ns(struct ns_common *ns)
+ struct ns_common *get_net_ns(struct ns_common *ns)
  {
  	return &get_net(container_of(ns, struct net, ns))->ns;
  }
+ EXPORT_SYMBOL_GPL(get_net_ns);
  
  static long sock_ioctl(struct file *file, unsigned cmd, unsigned long arg)
  {
@@@ -1332,7 -1332,7 +1332,7 @@@ int sock_create_kern(struct net *net, i
  }
  EXPORT_SYMBOL(sock_create_kern);
  
 -SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
 +int __sys_socket(int family, int type, int protocol)
  {
  	int retval;
  	struct socket *sock;
@@@ -1359,16 -1359,12 +1359,16 @@@
  	return sock_map_fd(sock, flags & (O_CLOEXEC | O_NONBLOCK));
  }
  
 +SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
 +{
 +	return __sys_socket(family, type, protocol);
 +}
 +
  /*
   *	Create a pair of connected sockets.
   */
  
 -SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol,
 -		int __user *, usockvec)
 +int __sys_socketpair(int family, int type, int protocol, int __user *usockvec)
  {
  	struct socket *sock1, *sock2;
  	int fd1, fd2, err;
@@@ -1453,12 -1449,6 +1453,12 @@@ out
  	return err;
  }
  
 +SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol,
 +		int __user *, usockvec)
 +{
 +	return __sys_socketpair(family, type, protocol, usockvec);
 +}
 +
  /*
   *	Bind a name to a socket. Nothing much to do here since it's
   *	the protocol's responsibility to handle the local address.
@@@ -1467,7 -1457,7 +1467,7 @@@
   *	the protocol layer (having also checked the address is ok).
   */
  
 -SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
 +int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen)
  {
  	struct socket *sock;
  	struct sockaddr_storage address;
@@@ -1490,18 -1480,13 +1490,18 @@@
  	return err;
  }
  
 +SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
 +{
 +	return __sys_bind(fd, umyaddr, addrlen);
 +}
 +
  /*
   *	Perform a listen. Basically, we allow the protocol to do anything
   *	necessary for a listen, and if that works, we mark the socket as
   *	ready for listening.
   */
  
 -SYSCALL_DEFINE2(listen, int, fd, int, backlog)
 +int __sys_listen(int fd, int backlog)
  {
  	struct socket *sock;
  	int err, fput_needed;
@@@ -1522,11 -1507,6 +1522,11 @@@
  	return err;
  }
  
 +SYSCALL_DEFINE2(listen, int, fd, int, backlog)
 +{
 +	return __sys_listen(fd, backlog);
 +}
 +
  /*
   *	For accept, we attempt to create a new socket, set up the link
   *	with the client, wake up the client, then return the new
@@@ -1539,8 -1519,8 +1539,8 @@@
   *	clean when we restucture accept also.
   */
  
 -SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
 -		int __user *, upeer_addrlen, int, flags)
 +int __sys_accept4(int fd, struct sockaddr __user *upeer_sockaddr,
 +		  int __user *upeer_addrlen, int flags)
  {
  	struct socket *sock, *newsock;
  	struct file *newfile;
@@@ -1593,8 -1573,9 +1593,9 @@@
  		goto out_fd;
  
  	if (upeer_sockaddr) {
- 		if (newsock->ops->getname(newsock, (struct sockaddr *)&address,
- 					  &len, 2) < 0) {
+ 		len = newsock->ops->getname(newsock,
+ 					(struct sockaddr *)&address, 2);
+ 		if (len < 0) {
  			err = -ECONNABORTED;
  			goto out_fd;
  		}
@@@ -1619,16 -1600,10 +1620,16 @@@ out_fd
  	goto out_put;
  }
  
 +SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
 +		int __user *, upeer_addrlen, int, flags)
 +{
 +	return __sys_accept4(fd, upeer_sockaddr, upeer_addrlen, flags);
 +}
 +
  SYSCALL_DEFINE3(accept, int, fd, struct sockaddr __user *, upeer_sockaddr,
  		int __user *, upeer_addrlen)
  {
 -	return sys_accept4(fd, upeer_sockaddr, upeer_addrlen, 0);
 +	return __sys_accept4(fd, upeer_sockaddr, upeer_addrlen, 0);
  }
  
  /*
@@@ -1643,7 -1618,8 +1644,7 @@@
   *	include the -EINPROGRESS status for such sockets.
   */
  
 -SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr,
 -		int, addrlen)
 +int __sys_connect(int fd, struct sockaddr __user *uservaddr, int addrlen)
  {
  	struct socket *sock;
  	struct sockaddr_storage address;
@@@ -1669,23 -1645,17 +1670,23 @@@ out
  	return err;
  }
  
 +SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr,
 +		int, addrlen)
 +{
 +	return __sys_connect(fd, uservaddr, addrlen);
 +}
 +
  /*
   *	Get the local address ('name') of a socket object. Move the obtained
   *	name to user space.
   */
  
 -SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
 -		int __user *, usockaddr_len)
 +int __sys_getsockname(int fd, struct sockaddr __user *usockaddr,
 +		      int __user *usockaddr_len)
  {
  	struct socket *sock;
  	struct sockaddr_storage address;
- 	int len, err, fput_needed;
+ 	int err, fput_needed;
  
  	sock = sockfd_lookup_light(fd, &err, &fput_needed);
  	if (!sock)
@@@ -1695,10 -1665,11 +1696,11 @@@
  	if (err)
  		goto out_put;
  
- 	err = sock->ops->getname(sock, (struct sockaddr *)&address, &len, 0);
- 	if (err)
+ 	err = sock->ops->getname(sock, (struct sockaddr *)&address, 0);
+ 	if (err < 0)
  		goto out_put;
- 	err = move_addr_to_user(&address, len, usockaddr, usockaddr_len);
+         /* "err" is actually length in this case */
+ 	err = move_addr_to_user(&address, err, usockaddr, usockaddr_len);
  
  out_put:
  	fput_light(sock->file, fput_needed);
@@@ -1706,23 -1677,17 +1708,23 @@@ out
  	return err;
  }
  
 +SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
 +		int __user *, usockaddr_len)
 +{
 +	return __sys_getsockname(fd, usockaddr, usockaddr_len);
 +}
 +
  /*
   *	Get the remote address ('name') of a socket object. Move the obtained
   *	name to user space.
   */
  
 -SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr,
 -		int __user *, usockaddr_len)
 +int __sys_getpeername(int fd, struct sockaddr __user *usockaddr,
 +		      int __user *usockaddr_len)
  {
  	struct socket *sock;
  	struct sockaddr_storage address;
- 	int len, err, fput_needed;
+ 	int err, fput_needed;
  
  	sock = sockfd_lookup_light(fd, &err, &fput_needed);
  	if (sock != NULL) {
@@@ -1732,30 -1697,25 +1734,29 @@@
  			return err;
  		}
  
- 		err =
- 		    sock->ops->getname(sock, (struct sockaddr *)&address, &len,
- 				       1);
- 		if (!err)
- 			err = move_addr_to_user(&address, len, usockaddr,
+ 		err = sock->ops->getname(sock, (struct sockaddr *)&address, 1);
+ 		if (err >= 0)
+ 			/* "err" is actually length in this case */
+ 			err = move_addr_to_user(&address, err, usockaddr,
  						usockaddr_len);
  		fput_light(sock->file, fput_needed);
  	}
  	return err;
  }
  
 +SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr,
 +		int __user *, usockaddr_len)
 +{
 +	return __sys_getpeername(fd, usockaddr, usockaddr_len);
 +}
 +
  /*
   *	Send a datagram to a given address. We move the address into kernel
   *	space and check the user space data area is readable before invoking
   *	the protocol.
   */
 -
 -SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
 -		unsigned int, flags, struct sockaddr __user *, addr,
 -		int, addr_len)
 +int __sys_sendto(int fd, void __user *buff, size_t len, unsigned int flags,
 +		 struct sockaddr __user *addr,  int addr_len)
  {
  	struct socket *sock;
  	struct sockaddr_storage address;
@@@ -1793,13 -1753,6 +1794,13 @@@ out
  	return err;
  }
  
 +SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
 +		unsigned int, flags, struct sockaddr __user *, addr,
 +		int, addr_len)
 +{
 +	return __sys_sendto(fd, buff, len, flags, addr, addr_len);
 +}
 +
  /*
   *	Send a datagram down a socket.
   */
@@@ -1807,7 -1760,7 +1808,7 @@@
  SYSCALL_DEFINE4(send, int, fd, void __user *, buff, size_t, len,
  		unsigned int, flags)
  {
 -	return sys_sendto(fd, buff, len, flags, NULL, 0);
 +	return __sys_sendto(fd, buff, len, flags, NULL, 0);
  }
  
  /*
@@@ -1815,8 -1768,10 +1816,8 @@@
   *	sender. We verify the buffers are writable and if needed move the
   *	sender address from kernel to user space.
   */
 -
 -SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
 -		unsigned int, flags, struct sockaddr __user *, addr,
 -		int __user *, addr_len)
 +int __sys_recvfrom(int fd, void __user *ubuf, size_t size, unsigned int flags,
 +		   struct sockaddr __user *addr, int __user *addr_len)
  {
  	struct socket *sock;
  	struct iovec iov;
@@@ -1856,13 -1811,6 +1857,13 @@@ out
  	return err;
  }
  
 +SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
 +		unsigned int, flags, struct sockaddr __user *, addr,
 +		int __user *, addr_len)
 +{
 +	return __sys_recvfrom(fd, ubuf, size, flags, addr, addr_len);
 +}
 +
  /*
   *	Receive a datagram from a socket.
   */
@@@ -1870,7 -1818,7 +1871,7 @@@
  SYSCALL_DEFINE4(recv, int, fd, void __user *, ubuf, size_t, size,
  		unsigned int, flags)
  {
 -	return sys_recvfrom(fd, ubuf, size, flags, NULL, NULL);
 +	return __sys_recvfrom(fd, ubuf, size, flags, NULL, NULL);
  }
  
  /*
@@@ -1878,8 -1826,8 +1879,8 @@@
   *	to pass the user mode parameter for the protocols to sort out.
   */
  
 -SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,
 -		char __user *, optval, int, optlen)
 +static int __sys_setsockopt(int fd, int level, int optname,
 +			    char __user *optval, int optlen)
  {
  	int err, fput_needed;
  	struct socket *sock;
@@@ -1907,19 -1855,13 +1908,19 @@@ out_put
  	return err;
  }
  
 +SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,
 +		char __user *, optval, int, optlen)
 +{
 +	return __sys_setsockopt(fd, level, optname, optval, optlen);
 +}
 +
  /*
   *	Get a socket option. Because we don't know the option lengths we have
   *	to pass a user mode parameter for the protocols to sort out.
   */
  
 -SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname,
 -		char __user *, optval, int __user *, optlen)
 +static int __sys_getsockopt(int fd, int level, int optname,
 +			    char __user *optval, int __user *optlen)
  {
  	int err, fput_needed;
  	struct socket *sock;
@@@ -1944,17 -1886,11 +1945,17 @@@ out_put
  	return err;
  }
  
 +SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname,
 +		char __user *, optval, int __user *, optlen)
 +{
 +	return __sys_getsockopt(fd, level, optname, optval, optlen);
 +}
 +
  /*
   *	Shutdown a socket.
   */
  
 -SYSCALL_DEFINE2(shutdown, int, fd, int, how)
 +int __sys_shutdown(int fd, int how)
  {
  	int err, fput_needed;
  	struct socket *sock;
@@@ -1969,11 -1905,6 +1970,11 @@@
  	return err;
  }
  
 +SYSCALL_DEFINE2(shutdown, int, fd, int, how)
 +{
 +	return __sys_shutdown(fd, how);
 +}
 +
  /* A couple of helpful macros for getting the address of the 32/64 bit
   * fields which are the same type (int / unsigned) on our platforms.
   */
@@@ -2137,16 -2068,12 +2138,16 @@@ out_freeiov
   *	BSD sendmsg interface
   */
  
 -long __sys_sendmsg(int fd, struct user_msghdr __user *msg, unsigned flags)
 +long __sys_sendmsg(int fd, struct user_msghdr __user *msg, unsigned int flags,
 +		   bool forbid_cmsg_compat)
  {
  	int fput_needed, err;
  	struct msghdr msg_sys;
  	struct socket *sock;
  
 +	if (forbid_cmsg_compat && (flags & MSG_CMSG_COMPAT))
 +		return -EINVAL;
 +
  	sock = sockfd_lookup_light(fd, &err, &fput_needed);
  	if (!sock)
  		goto out;
@@@ -2160,7 -2087,9 +2161,7 @@@ out
  
  SYSCALL_DEFINE3(sendmsg, int, fd, struct user_msghdr __user *, msg, unsigned int, flags)
  {
 -	if (flags & MSG_CMSG_COMPAT)
 -		return -EINVAL;
 -	return __sys_sendmsg(fd, msg, flags);
 +	return __sys_sendmsg(fd, msg, flags, true);
  }
  
  /*
@@@ -2168,7 -2097,7 +2169,7 @@@
   */
  
  int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
 -		   unsigned int flags)
 +		   unsigned int flags, bool forbid_cmsg_compat)
  {
  	int fput_needed, err, datagrams;
  	struct socket *sock;
@@@ -2178,9 -2107,6 +2179,9 @@@
  	struct used_address used_address;
  	unsigned int oflags = flags;
  
 +	if (forbid_cmsg_compat && (flags & MSG_CMSG_COMPAT))
 +		return -EINVAL;
 +
  	if (vlen > UIO_MAXIOV)
  		vlen = UIO_MAXIOV;
  
@@@ -2237,7 -2163,9 +2238,7 @@@
  SYSCALL_DEFINE4(sendmmsg, int, fd, struct mmsghdr __user *, mmsg,
  		unsigned int, vlen, unsigned int, flags)
  {
 -	if (flags & MSG_CMSG_COMPAT)
 -		return -EINVAL;
 -	return __sys_sendmmsg(fd, mmsg, vlen, flags);
 +	return __sys_sendmmsg(fd, mmsg, vlen, flags, true);
  }
  
  static int ___sys_recvmsg(struct socket *sock, struct user_msghdr __user *msg,
@@@ -2310,16 -2238,12 +2311,16 @@@ out_freeiov
   *	BSD recvmsg interface
   */
  
 -long __sys_recvmsg(int fd, struct user_msghdr __user *msg, unsigned flags)
 +long __sys_recvmsg(int fd, struct user_msghdr __user *msg, unsigned int flags,
 +		   bool forbid_cmsg_compat)
  {
  	int fput_needed, err;
  	struct msghdr msg_sys;
  	struct socket *sock;
  
 +	if (forbid_cmsg_compat && (flags & MSG_CMSG_COMPAT))
 +		return -EINVAL;
 +
  	sock = sockfd_lookup_light(fd, &err, &fput_needed);
  	if (!sock)
  		goto out;
@@@ -2334,7 -2258,9 +2335,7 @@@ out
  SYSCALL_DEFINE3(recvmsg, int, fd, struct user_msghdr __user *, msg,
  		unsigned int, flags)
  {
 -	if (flags & MSG_CMSG_COMPAT)
 -		return -EINVAL;
 -	return __sys_recvmsg(fd, msg, flags);
 +	return __sys_recvmsg(fd, msg, flags, true);
  }
  
  /*
@@@ -2363,10 -2289,12 +2364,12 @@@ int __sys_recvmmsg(int fd, struct mmsgh
  	if (!sock)
  		return err;
  
- 	err = sock_error(sock->sk);
- 	if (err) {
- 		datagrams = err;
- 		goto out_put;
+ 	if (likely(!(flags & MSG_ERRQUEUE))) {
+ 		err = sock_error(sock->sk);
+ 		if (err) {
+ 			datagrams = err;
+ 			goto out_put;
+ 		}
  	}
  
  	entry = mmsg;
@@@ -2450,9 -2378,9 +2453,9 @@@ out_put
  	return datagrams;
  }
  
 -SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg,
 -		unsigned int, vlen, unsigned int, flags,
 -		struct timespec __user *, timeout)
 +static int do_sys_recvmmsg(int fd, struct mmsghdr __user *mmsg,
 +			   unsigned int vlen, unsigned int flags,
 +			   struct timespec __user *timeout)
  {
  	int datagrams;
  	struct timespec timeout_sys;
@@@ -2475,13 -2403,6 +2478,13 @@@
  	return datagrams;
  }
  
 +SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg,
 +		unsigned int, vlen, unsigned int, flags,
 +		struct timespec __user *, timeout)
 +{
 +	return do_sys_recvmmsg(fd, mmsg, vlen, flags, timeout);
 +}
 +
  #ifdef __ARCH_WANT_SYS_SOCKETCALL
  /* Argument list sizes for sys_socketcall */
  #define AL(x) ((x) * sizeof(unsigned long))
@@@ -2529,82 -2450,76 +2532,82 @@@ SYSCALL_DEFINE2(socketcall, int, call, 
  
  	switch (call) {
  	case SYS_SOCKET:
 -		err = sys_socket(a0, a1, a[2]);
 +		err = __sys_socket(a0, a1, a[2]);
  		break;
  	case SYS_BIND:
 -		err = sys_bind(a0, (struct sockaddr __user *)a1, a[2]);
 +		err = __sys_bind(a0, (struct sockaddr __user *)a1, a[2]);
  		break;
  	case SYS_CONNECT:
 -		err = sys_connect(a0, (struct sockaddr __user *)a1, a[2]);
 +		err = __sys_connect(a0, (struct sockaddr __user *)a1, a[2]);
  		break;
  	case SYS_LISTEN:
 -		err = sys_listen(a0, a1);
 +		err = __sys_listen(a0, a1);
  		break;
  	case SYS_ACCEPT:
 -		err = sys_accept4(a0, (struct sockaddr __user *)a1,
 -				  (int __user *)a[2], 0);
 +		err = __sys_accept4(a0, (struct sockaddr __user *)a1,
 +				    (int __user *)a[2], 0);
  		break;
  	case SYS_GETSOCKNAME:
  		err =
 -		    sys_getsockname(a0, (struct sockaddr __user *)a1,
 -				    (int __user *)a[2]);
 +		    __sys_getsockname(a0, (struct sockaddr __user *)a1,
 +				      (int __user *)a[2]);
  		break;
  	case SYS_GETPEERNAME:
  		err =
 -		    sys_getpeername(a0, (struct sockaddr __user *)a1,
 -				    (int __user *)a[2]);
 +		    __sys_getpeername(a0, (struct sockaddr __user *)a1,
 +				      (int __user *)a[2]);
  		break;
  	case SYS_SOCKETPAIR:
 -		err = sys_socketpair(a0, a1, a[2], (int __user *)a[3]);
 +		err = __sys_socketpair(a0, a1, a[2], (int __user *)a[3]);
  		break;
  	case SYS_SEND:
 -		err = sys_send(a0, (void __user *)a1, a[2], a[3]);
 +		err = __sys_sendto(a0, (void __user *)a1, a[2], a[3],
 +				   NULL, 0);
  		break;
  	case SYS_SENDTO:
 -		err = sys_sendto(a0, (void __user *)a1, a[2], a[3],
 -				 (struct sockaddr __user *)a[4], a[5]);
 +		err = __sys_sendto(a0, (void __user *)a1, a[2], a[3],
 +				   (struct sockaddr __user *)a[4], a[5]);
  		break;
  	case SYS_RECV:
 -		err = sys_recv(a0, (void __user *)a1, a[2], a[3]);
 +		err = __sys_recvfrom(a0, (void __user *)a1, a[2], a[3],
 +				     NULL, NULL);
  		break;
  	case SYS_RECVFROM:
 -		err = sys_recvfrom(a0, (void __user *)a1, a[2], a[3],
 -				   (struct sockaddr __user *)a[4],
 -				   (int __user *)a[5]);
 +		err = __sys_recvfrom(a0, (void __user *)a1, a[2], a[3],
 +				     (struct sockaddr __user *)a[4],
 +				     (int __user *)a[5]);
  		break;
  	case SYS_SHUTDOWN:
 -		err = sys_shutdown(a0, a1);
 +		err = __sys_shutdown(a0, a1);
  		break;
  	case SYS_SETSOCKOPT:
 -		err = sys_setsockopt(a0, a1, a[2], (char __user *)a[3], a[4]);
 +		err = __sys_setsockopt(a0, a1, a[2], (char __user *)a[3],
 +				       a[4]);
  		break;
  	case SYS_GETSOCKOPT:
  		err =
 -		    sys_getsockopt(a0, a1, a[2], (char __user *)a[3],
 -				   (int __user *)a[4]);
 +		    __sys_getsockopt(a0, a1, a[2], (char __user *)a[3],
 +				     (int __user *)a[4]);
  		break;
  	case SYS_SENDMSG:
 -		err = sys_sendmsg(a0, (struct user_msghdr __user *)a1, a[2]);
 +		err = __sys_sendmsg(a0, (struct user_msghdr __user *)a1,
 +				    a[2], true);
  		break;
  	case SYS_SENDMMSG:
 -		err = sys_sendmmsg(a0, (struct mmsghdr __user *)a1, a[2], a[3]);
 +		err = __sys_sendmmsg(a0, (struct mmsghdr __user *)a1, a[2],
 +				     a[3], true);
  		break;
  	case SYS_RECVMSG:
 -		err = sys_recvmsg(a0, (struct user_msghdr __user *)a1, a[2]);
 +		err = __sys_recvmsg(a0, (struct user_msghdr __user *)a1,
 +				    a[2], true);
  		break;
  	case SYS_RECVMMSG:
 -		err = sys_recvmmsg(a0, (struct mmsghdr __user *)a1, a[2], a[3],
 -				   (struct timespec __user *)a[4]);
 +		err = do_sys_recvmmsg(a0, (struct mmsghdr __user *)a1, a[2],
 +				      a[3], (struct timespec __user *)a[4]);
  		break;
  	case SYS_ACCEPT4:
 -		err = sys_accept4(a0, (struct sockaddr __user *)a1,
 -				  (int __user *)a[2], a[3]);
 +		err = __sys_accept4(a0, (struct sockaddr __user *)a1,
 +				    (int __user *)a[2], a[3]);
  		break;
  	default:
  		err = -EINVAL;
@@@ -3259,17 -3174,15 +3262,15 @@@ int kernel_connect(struct socket *sock
  }
  EXPORT_SYMBOL(kernel_connect);
  
- int kernel_getsockname(struct socket *sock, struct sockaddr *addr,
- 			 int *addrlen)
+ int kernel_getsockname(struct socket *sock, struct sockaddr *addr)
  {
- 	return sock->ops->getname(sock, addr, addrlen, 0);
+ 	return sock->ops->getname(sock, addr, 0);
  }
  EXPORT_SYMBOL(kernel_getsockname);
  
- int kernel_getpeername(struct socket *sock, struct sockaddr *addr,
- 			 int *addrlen)
+ int kernel_getpeername(struct socket *sock, struct sockaddr *addr)
  {
- 	return sock->ops->getname(sock, addr, addrlen, 1);
+ 	return sock->ops->getname(sock, addr, 1);
  }
  EXPORT_SYMBOL(kernel_getpeername);
  
diff --combined net/sunrpc/cache.c
index 26582e27be6a,c536cc24b3d1..cdda4744c9b1
--- a/net/sunrpc/cache.c
+++ b/net/sunrpc/cache.c
@@@ -1450,8 -1450,8 +1450,8 @@@ static ssize_t write_flush(struct file 
  			   struct cache_detail *cd)
  {
  	char tbuf[20];
 -	char *bp, *ep;
 -	time_t then, now;
 +	char *ep;
 +	time_t now;
  
  	if (*ppos || count > sizeof(tbuf)-1)
  		return -EINVAL;
@@@ -1461,24 -1461,24 +1461,24 @@@
  	simple_strtoul(tbuf, &ep, 0);
  	if (*ep && *ep != '\n')
  		return -EINVAL;
 +	/* Note that while we check that 'buf' holds a valid number,
 +	 * we always ignore the value and just flush everything.
 +	 * Making use of the number leads to races.
 +	 */
  
 -	bp = tbuf;
 -	then = get_expiry(&bp);
  	now = seconds_since_boot();
 -	cd->nextcheck = now;
 -	/* Can only set flush_time to 1 second beyond "now", or
 -	 * possibly 1 second beyond flushtime.  This is because
 -	 * flush_time never goes backwards so it mustn't get too far
 -	 * ahead of time.
 +	/* Always flush everything, so behave like cache_purge()
 +	 * Do this by advancing flush_time to the current time,
 +	 * or by one second if it has already reached the current time.
 +	 * Newly added cache entries will always have ->last_refresh greater
 +	 * that ->flush_time, so they don't get flushed prematurely.
  	 */
 -	if (then >= now) {
 -		/* Want to flush everything, so behave like cache_purge() */
 -		if (cd->flush_time >= now)
 -			now = cd->flush_time + 1;
 -		then = now;
 -	}
  
 -	cd->flush_time = then;
 +	if (cd->flush_time >= now)
 +		now = cd->flush_time + 1;
 +
 +	cd->flush_time = now;
 +	cd->nextcheck = now;
  	cache_flush();
  
  	*ppos += count;
@@@ -1621,20 -1621,20 +1621,20 @@@ static int create_cache_proc_entries(st
  	if (cd->procfs == NULL)
  		goto out_nomem;
  
- 	p = proc_create_data("flush", S_IFREG|S_IRUSR|S_IWUSR,
+ 	p = proc_create_data("flush", S_IFREG | 0600,
  			     cd->procfs, &cache_flush_operations_procfs, cd);
  	if (p == NULL)
  		goto out_nomem;
  
  	if (cd->cache_request || cd->cache_parse) {
- 		p = proc_create_data("channel", S_IFREG|S_IRUSR|S_IWUSR,
- 				cd->procfs, &cache_file_operations_procfs, cd);
+ 		p = proc_create_data("channel", S_IFREG | 0600, cd->procfs,
+ 				     &cache_file_operations_procfs, cd);
  		if (p == NULL)
  			goto out_nomem;
  	}
  	if (cd->cache_show) {
- 		p = proc_create_data("content", S_IFREG|S_IRUSR,
- 				cd->procfs, &content_file_operations_procfs, cd);
+ 		p = proc_create_data("content", S_IFREG | 0400, cd->procfs,
+ 				     &content_file_operations_procfs, cd);
  		if (p == NULL)
  			goto out_nomem;
  	}
diff --combined net/sunrpc/clnt.c
index eb1a81895397,806395687bb6..d839c33ae7d9
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@@ -1231,7 -1231,7 +1231,7 @@@ static const struct sockaddr_in6 rpc_in
   * negative errno is returned.
   */
  static int rpc_sockname(struct net *net, struct sockaddr *sap, size_t salen,
- 			struct sockaddr *buf, int buflen)
+ 			struct sockaddr *buf)
  {
  	struct socket *sock;
  	int err;
@@@ -1269,7 -1269,7 +1269,7 @@@
  		goto out_release;
  	}
  
- 	err = kernel_getsockname(sock, buf, &buflen);
+ 	err = kernel_getsockname(sock, buf);
  	if (err < 0) {
  		dprintk("RPC:       getsockname failed (%d)\n", err);
  		goto out_release;
@@@ -1353,7 -1353,7 +1353,7 @@@ int rpc_localaddr(struct rpc_clnt *clnt
  	rcu_read_unlock();
  
  	rpc_set_port(sap, 0);
- 	err = rpc_sockname(net, sap, salen, buf, buflen);
+ 	err = rpc_sockname(net, sap, salen, buf);
  	put_net(net);
  	if (err != 0)
  		/* Couldn't discover local address, return ANYADDR */
@@@ -1546,7 -1546,6 +1546,7 @@@ call_reserveresult(struct rpc_task *tas
  	task->tk_status = 0;
  	if (status >= 0) {
  		if (task->tk_rqstp) {
 +			xprt_request_init(task);
  			task->tk_action = call_refresh;
  			return;
  		}
@@@ -1888,7 -1887,7 +1888,7 @@@ call_connect_status(struct rpc_task *ta
  
  	dprint_status(task);
  
 -	trace_rpc_connect_status(task, status);
 +	trace_rpc_connect_status(task);
  	task->tk_status = 0;
  	switch (status) {
  	case -ECONNREFUSED:
@@@ -2015,9 -2014,6 +2015,9 @@@ call_transmit_status(struct rpc_task *t
  	case -EPERM:
  		if (RPC_IS_SOFTCONN(task)) {
  			xprt_end_transmit(task);
 +			if (!task->tk_msg.rpc_proc->p_proc)
 +				trace_xprt_ping(task->tk_xprt,
 +						task->tk_status);
  			rpc_exit(task, task->tk_status);
  			break;
  		}
@@@ -2116,9 -2112,6 +2116,9 @@@ call_status(struct rpc_task *task
  	struct rpc_rqst	*req = task->tk_rqstp;
  	int		status;
  
 +	if (!task->tk_msg.rpc_proc->p_proc)
 +		trace_xprt_ping(task->tk_xprt, task->tk_status);
 +
  	if (req->rq_reply_bytes_recvd > 0 && !req->rq_bytes_sent)
  		task->tk_status = req->rq_reply_bytes_recvd;
  
diff --combined net/sunrpc/svcsock.c
index 4ca1d92b531a,08cd951aaeea..5445145e639c
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@@ -391,12 -391,9 +391,12 @@@ static void svc_sock_setbufsize(struct 
  	release_sock(sock->sk);
  }
  
 -static int svc_sock_secure_port(struct svc_rqst *rqstp)
 +static void svc_sock_secure_port(struct svc_rqst *rqstp)
  {
 -	return svc_port_is_privileged(svc_addr(rqstp));
 +	if (svc_port_is_privileged(svc_addr(rqstp)))
 +		set_bit(RQ_SECURE, &rqstp->rq_flags);
 +	else
 +		clear_bit(RQ_SECURE, &rqstp->rq_flags);
  }
  
  /*
@@@ -835,12 -832,13 +835,13 @@@ static struct svc_xprt *svc_tcp_accept(
  	}
  	set_bit(XPT_CONN, &svsk->sk_xprt.xpt_flags);
  
- 	err = kernel_getpeername(newsock, sin, &slen);
+ 	err = kernel_getpeername(newsock, sin);
  	if (err < 0) {
  		net_warn_ratelimited("%s: peername failed (err %d)!\n",
  				     serv->sv_name, -err);
  		goto failed;		/* aborted connection or whatever */
  	}
+ 	slen = err;
  
  	/* Ideally, we would want to reject connections from unauthorized
  	 * hosts here, but when we get encryption, the IP of the host won't
@@@ -869,7 -867,8 +870,8 @@@
  	if (IS_ERR(newsvsk))
  		goto failed;
  	svc_xprt_set_remote(&newsvsk->sk_xprt, sin, slen);
- 	err = kernel_getsockname(newsock, sin, &slen);
+ 	err = kernel_getsockname(newsock, sin);
+ 	slen = err;
  	if (unlikely(err < 0)) {
  		dprintk("svc_tcp_accept: kernel_getsockname error %d\n", -err);
  		slen = offsetof(struct sockaddr, sa_data);
@@@ -1310,7 -1309,6 +1312,7 @@@ static void svc_tcp_init(struct svc_soc
  	set_bit(XPT_CONG_CTRL, &svsk->sk_xprt.xpt_flags);
  	if (sk->sk_state == TCP_LISTEN) {
  		dprintk("setting up TCP socket for listening\n");
 +		strcpy(svsk->sk_xprt.xpt_remotebuf, "listener");
  		set_bit(XPT_LISTENER, &svsk->sk_xprt.xpt_flags);
  		sk->sk_data_ready = svc_tcp_listen_data_ready;
  		set_bit(XPT_CONN, &svsk->sk_xprt.xpt_flags);
@@@ -1469,7 -1467,8 +1471,8 @@@ int svc_addsock(struct svc_serv *serv, 
  		err = PTR_ERR(svsk);
  		goto out;
  	}
- 	if (kernel_getsockname(svsk->sk_sock, sin, &salen) == 0)
+ 	salen = kernel_getsockname(svsk->sk_sock, sin);
+ 	if (salen >= 0)
  		svc_xprt_set_local(&svsk->sk_xprt, sin, salen);
  	svc_add_new_perm_xprt(serv, &svsk->sk_xprt);
  	return svc_one_sock_name(svsk, name_return, len);
@@@ -1543,10 -1542,10 +1546,10 @@@ static struct svc_xprt *svc_create_sock
  	if (error < 0)
  		goto bummer;
  
- 	newlen = len;
- 	error = kernel_getsockname(sock, newsin, &newlen);
+ 	error = kernel_getsockname(sock, newsin);
  	if (error < 0)
  		goto bummer;
+ 	newlen = error;
  
  	if (protocol == IPPROTO_TCP) {
  		if ((error = kernel_listen(sock, 64)) < 0)
diff --combined net/sunrpc/xprtsock.c
index 2511c21ef114,956e29c1438d..9e1c5024aba9
--- a/net/sunrpc/xprtsock.c
+++ b/net/sunrpc/xprtsock.c
@@@ -527,7 -527,6 +527,7 @@@ static int xs_local_send_request(struc
  	xs_pktdump("packet data:",
  			req->rq_svec->iov_base, req->rq_svec->iov_len);
  
 +	req->rq_xtime = ktime_get();
  	status = xs_sendpages(transport->sock, NULL, 0, xdr, req->rq_bytes_sent,
  			      true, &sent);
  	dprintk("RPC:       %s(%u) = %d\n",
@@@ -590,7 -589,6 +590,7 @@@ static int xs_udp_send_request(struct r
  
  	if (!xprt_bound(xprt))
  		return -ENOTCONN;
 +	req->rq_xtime = ktime_get();
  	status = xs_sendpages(transport->sock, xs_addr(xprt), xprt->addrlen,
  			      xdr, req->rq_bytes_sent, true, &sent);
  
@@@ -680,7 -678,6 +680,7 @@@ static int xs_tcp_send_request(struct r
  	/* Continue transmitting the packet/record. We must be careful
  	 * to cope with writespace callbacks arriving _after_ we have
  	 * called sendmsg(). */
 +	req->rq_xtime = ktime_get();
  	while (1) {
  		sent = 0;
  		status = xs_sendpages(transport->sock, NULL, 0, xdr,
@@@ -1063,7 -1060,6 +1063,7 @@@ static void xs_udp_data_read_skb(struc
  	if (!rovr)
  		goto out_unlock;
  	xprt_pin_rqst(rovr);
 +	xprt_update_rtt(rovr->rq_task);
  	spin_unlock(&xprt->recv_lock);
  	task = rovr->rq_task;
  
@@@ -1798,10 -1794,9 +1798,9 @@@ static void xs_sock_set_reuseport(struc
  static unsigned short xs_sock_getport(struct socket *sock)
  {
  	struct sockaddr_storage buf;
- 	int buflen;
  	unsigned short port = 0;
  
- 	if (kernel_getsockname(sock, (struct sockaddr *)&buf, &buflen) < 0)
+ 	if (kernel_getsockname(sock, (struct sockaddr *)&buf) < 0)
  		goto out;
  	switch (buf.ss_family) {
  	case AF_INET6:
@@@ -2764,7 -2759,6 +2763,7 @@@ static const struct rpc_xprt_ops xs_loc
  	.reserve_xprt		= xprt_reserve_xprt,
  	.release_xprt		= xs_tcp_release_xprt,
  	.alloc_slot		= xprt_alloc_slot,
 +	.free_slot		= xprt_free_slot,
  	.rpcbind		= xs_local_rpcbind,
  	.set_port		= xs_local_set_port,
  	.connect		= xs_local_connect,
@@@ -2784,7 -2778,6 +2783,7 @@@ static const struct rpc_xprt_ops xs_udp
  	.reserve_xprt		= xprt_reserve_xprt_cong,
  	.release_xprt		= xprt_release_xprt_cong,
  	.alloc_slot		= xprt_alloc_slot,
 +	.free_slot		= xprt_free_slot,
  	.rpcbind		= rpcb_getport_async,
  	.set_port		= xs_set_port,
  	.connect		= xs_connect,
@@@ -2806,7 -2799,6 +2805,7 @@@ static const struct rpc_xprt_ops xs_tcp
  	.reserve_xprt		= xprt_reserve_xprt,
  	.release_xprt		= xs_tcp_release_xprt,
  	.alloc_slot		= xprt_lock_and_alloc_slot,
 +	.free_slot		= xprt_free_slot,
  	.rpcbind		= rpcb_getport_async,
  	.set_port		= xs_set_port,
  	.connect		= xs_connect,
@@@ -2838,7 -2830,6 +2837,7 @@@ static const struct rpc_xprt_ops bc_tcp
  	.reserve_xprt		= xprt_reserve_xprt,
  	.release_xprt		= xprt_release_xprt,
  	.alloc_slot		= xprt_alloc_slot,
 +	.free_slot		= xprt_free_slot,
  	.buf_alloc		= bc_malloc,
  	.buf_free		= bc_free,
  	.send_request		= bc_send_request,

-- 
LinuxNextTracking


More information about the linux-merge mailing list