]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
Merge tag 'pci-v4.11-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaa...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 23 Feb 2017 19:53:22 +0000 (11:53 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 23 Feb 2017 19:53:22 +0000 (11:53 -0800)
Pull PCI updates from Bjorn Helgaas:

 - add ASPM L1 substate support

 - enable PCIe Extended Tags when supported

 - configure PCIe MPS settings on iProc, Versatile, X-Gene, and Xilinx

 - increase VPD access timeout

 - add ACS quirks for Intel Union Point, Qualcomm QDF2400 and QDF2432

 - use new pci_irq_alloc_vectors() in more drivers

 - fix MSI affinity memory leak

 - remove unused MSI interfaces and update documentation

 - remove unused AER .link_reset() callback

 - avoid pci_lock / p->pi_lock deadlock seen with perf

 - serialize sysfs enable/disable num_vfs operations

 - move DesignWare IP from drivers/pci/host/ to drivers/pci/dwc/ and
   refactor so we can support both hosts and endpoints

 - add DT ECAM-like support for HiSilicon Hip06/Hip07 controllers

 - add Rockchip system power management support

 - add Thunder-X cn81xx and cn83xx support

 - add Exynos 5440 PCIe PHY support

* tag 'pci-v4.11-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci: (93 commits)
  PCI: dwc: Remove dependency of designware on CONFIG_PCI
  PCI: dwc: Add CONFIG_PCIE_DW_HOST to enable PCI dwc host
  PCI: dwc: Split pcie-designware.c into host and core files
  PCI: dwc: designware: Fix style errors in pcie-designware.c
  PCI: dwc: designware: Parse "num-lanes" property in dw_pcie_setup_rc()
  PCI: dwc: all: Split struct pcie_port into host-only and core structures
  PCI: dwc: designware: Get device pointer at the start of dw_pcie_host_init()
  PCI: dwc: all: Rename cfg_read/cfg_write to read/write
  PCI: dwc: all: Use platform_set_drvdata() to save private data
  PCI: dwc: designware: Move register defines to designware header file
  PCI: dwc: Use PTR_ERR_OR_ZERO to simplify code
  PCI: dra7xx: Group PHY API invocations
  PCI: dra7xx: Enable MSI and legacy interrupts simultaneously
  PCI: dra7xx: Add support to force RC to work in GEN1 mode
  PCI: dra7xx: Simplify probe code with devm_gpiod_get_optional()
  PCI: Move DesignWare IP support to new drivers/pci/dwc/ directory
  PCI: exynos: Support the PHY generic framework
  Documentation: binding: Modify the exynos5440 PCIe binding
  phy: phy-exynos-pcie: Add support for Exynos PCIe PHY
  Documentation: samsung-phy: Add exynos-pcie-phy binding
  ...

12 files changed:
1  2 
MAINTAINERS
drivers/Makefile
drivers/net/ethernet/amd/xgbe/xgbe-pci.c
drivers/net/ethernet/amd/xgbe/xgbe.h
drivers/pci/msi.c
drivers/pci/pci-driver.c
drivers/pci/pcie/aspm.c
drivers/pci/probe.c
drivers/phy/Kconfig
drivers/phy/Makefile
include/linux/msi.h
include/linux/pci.h

diff --combined MAINTAINERS
index 24fef3773d67ddd6170f36b15aa10af440012c8a,8672f18c8ab91bf6f41d35265df1d082d0e6ffd1..76dfb51f7fa5fa6d555c1334384bdf660f5dad30
@@@ -81,6 -81,7 +81,6 @@@ Descriptions of section entries
        Q: Patchwork web based patch tracking system site
        T: SCM tree type and location.
           Type is one of: git, hg, quilt, stgit, topgit
 -      B: Bug tracking system location.
        S: Status, one of the following:
           Supported:   Someone is actually paid to look after this.
           Maintained:  Someone actually looks after it.
@@@ -265,12 -266,6 +265,12 @@@ L:       linux-iio@vger.kernel.or
  S:    Maintained
  F:    drivers/iio/counter/104-quad-8.c
  
 +ACCES PCI-IDIO-16 GPIO DRIVER
 +M:    William Breathitt Gray <vilhelm.gray@gmail.com>
 +L:    linux-gpio@vger.kernel.org
 +S:    Maintained
 +F:    drivers/gpio/gpio-pci-idio-16.c
 +
  ACENIC DRIVER
  M:    Jes Sorensen <jes@trained-monkey.org>
  L:    linux-acenic@sunsite.dk
@@@ -649,7 -644,7 +649,7 @@@ S: Maintaine
  F:    drivers/gpio/gpio-altera.c
  
  ALTERA SYSTEM RESOURCE DRIVER FOR ARRIA10 DEVKIT
 -M:    Thor Thayer <tthayer@opensource.altera.com>
 +M:    Thor Thayer <thor.thayer@linux.intel.com>
  S:    Maintained
  F:    drivers/gpio/gpio-altera-a10sr.c
  F:    drivers/mfd/altera-a10sr.c
@@@ -883,8 -878,8 +883,8 @@@ S: Odd fixe
  F:    drivers/hwmon/applesmc.c
  
  APPLETALK NETWORK LAYER
 -M:    Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
 -S:    Maintained
 +L:    netdev@vger.kernel.org
 +S:    Odd fixes
  F:    drivers/net/appletalk/
  F:    net/appletalk/
  
@@@ -982,7 -977,6 +982,7 @@@ M: Russell King <linux@armlinux.org.uk
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  W:    http://www.armlinux.org.uk/
  S:    Maintained
 +T:    git git://git.armlinux.org.uk/~rmk/linux-arm.git
  F:    arch/arm/
  
  ARM SUB-ARCHITECTURES
@@@ -1097,7 -1091,7 +1097,7 @@@ F:      arch/arm/boot/dts/aspeed-
  F:    drivers/*/*aspeed*
  
  ARM/ATMEL AT91RM9200, AT91SAM9 AND SAMA5 SOC SUPPORT
 -M:    Nicolas Ferre <nicolas.ferre@atmel.com>
 +M:    Nicolas Ferre <nicolas.ferre@microchip.com>
  M:    Alexandre Belloni <alexandre.belloni@free-electrons.com>
  M:    Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@@ -1160,7 -1154,6 +1160,7 @@@ ARM/CLKDEV SUPPOR
  M:    Russell King <linux@armlinux.org.uk>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
 +T:    git git://git.armlinux.org.uk/~rmk/linux-arm.git clkdev
  F:    arch/arm/include/asm/clkdev.h
  F:    drivers/clk/clkdev.c
  
@@@ -1696,7 -1689,6 +1696,7 @@@ M:      Krzysztof Kozlowski <krzk@kernel.org
  R:    Javier Martinez Canillas <javier@osg.samsung.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
 +Q:    https://patchwork.kernel.org/project/linux-samsung-soc/list/
  S:    Maintained
  F:    arch/arm/boot/dts/s3c*
  F:    arch/arm/boot/dts/s5p*
@@@ -1779,7 -1771,7 +1779,7 @@@ F:      drivers/soc/renesas
  F:    include/linux/soc/renesas/
  
  ARM/SOCFPGA ARCHITECTURE
 -M:    Dinh Nguyen <dinguyen@opensource.altera.com>
 +M:    Dinh Nguyen <dinguyen@kernel.org>
  S:    Maintained
  F:    arch/arm/mach-socfpga/
  F:    arch/arm/boot/dts/socfpga*
@@@ -1789,12 -1781,12 +1789,12 @@@ W:   http://www.rocketboards.or
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/dinguyen/linux.git
  
  ARM/SOCFPGA CLOCK FRAMEWORK SUPPORT
 -M:    Dinh Nguyen <dinguyen@opensource.altera.com>
 +M:    Dinh Nguyen <dinguyen@kernel.org>
  S:    Maintained
  F:    drivers/clk/socfpga/
  
  ARM/SOCFPGA EDAC SUPPORT
 -M:    Thor Thayer <tthayer@opensource.altera.com>
 +M:    Thor Thayer <thor.thayer@linux.intel.com>
  S:    Maintained
  F:    drivers/edac/altera_edac.
  
@@@ -2181,56 -2173,64 +2181,56 @@@ F:   include/linux/atm
  F:    include/uapi/linux/atm*
  
  ATMEL AT91 / AT32 MCI DRIVER
 -M:    Ludovic Desroches <ludovic.desroches@atmel.com>
 +M:    Ludovic Desroches <ludovic.desroches@microchip.com>
  S:    Maintained
  F:    drivers/mmc/host/atmel-mci.c
  
  ATMEL AT91 SAMA5D2-Compatible Shutdown Controller
 -M:    Nicolas Ferre <nicolas.ferre@atmel.com>
 +M:    Nicolas Ferre <nicolas.ferre@microchip.com>
  S:    Supported
  F:    drivers/power/reset/at91-sama5d2_shdwc.c
  
  ATMEL SAMA5D2 ADC DRIVER
 -M:    Ludovic Desroches <ludovic.desroches@atmel.com>
 +M:    Ludovic Desroches <ludovic.desroches@microchip.com>
  L:    linux-iio@vger.kernel.org
  S:    Supported
  F:    drivers/iio/adc/at91-sama5d2_adc.c
  
  ATMEL Audio ALSA driver
 -M:    Nicolas Ferre <nicolas.ferre@atmel.com>
 +M:    Nicolas Ferre <nicolas.ferre@microchip.com>
  L:    alsa-devel@alsa-project.org (moderated for non-subscribers)
  S:    Supported
  F:    sound/soc/atmel
  
 -ATMEL DMA DRIVER
 -M:    Nicolas Ferre <nicolas.ferre@atmel.com>
 -L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 -S:    Supported
 -F:    drivers/dma/at_hdmac.c
 -F:    drivers/dma/at_hdmac_regs.h
 -F:    include/linux/platform_data/dma-atmel.h
 -
  ATMEL XDMA DRIVER
 -M:    Ludovic Desroches <ludovic.desroches@atmel.com>
 +M:    Ludovic Desroches <ludovic.desroches@microchip.com>
  L:    linux-arm-kernel@lists.infradead.org
  L:    dmaengine@vger.kernel.org
  S:    Supported
  F:    drivers/dma/at_xdmac.c
  
  ATMEL I2C DRIVER
 -M:    Ludovic Desroches <ludovic.desroches@atmel.com>
 +M:    Ludovic Desroches <ludovic.desroches@microchip.com>
  L:    linux-i2c@vger.kernel.org
  S:    Supported
  F:    drivers/i2c/busses/i2c-at91.c
  
  ATMEL ISI DRIVER
 -M:    Ludovic Desroches <ludovic.desroches@atmel.com>
 +M:    Ludovic Desroches <ludovic.desroches@microchip.com>
  L:    linux-media@vger.kernel.org
  S:    Supported
  F:    drivers/media/platform/soc_camera/atmel-isi.c
  F:    include/media/atmel-isi.h
  
  ATMEL LCDFB DRIVER
 -M:    Nicolas Ferre <nicolas.ferre@atmel.com>
 +M:    Nicolas Ferre <nicolas.ferre@microchip.com>
  L:    linux-fbdev@vger.kernel.org
  S:    Maintained
  F:    drivers/video/fbdev/atmel_lcdfb.c
  F:    include/video/atmel_lcdc.h
  
  ATMEL MACB ETHERNET DRIVER
 -M:    Nicolas Ferre <nicolas.ferre@atmel.com>
 +M:    Nicolas Ferre <nicolas.ferre@microchip.com>
  S:    Supported
  F:    drivers/net/ethernet/cadence/
  
@@@ -2242,32 -2242,32 +2242,32 @@@ S:   Supporte
  F:    drivers/mtd/nand/atmel_nand*
  
  ATMEL SDMMC DRIVER
 -M:    Ludovic Desroches <ludovic.desroches@atmel.com>
 +M:    Ludovic Desroches <ludovic.desroches@microchip.com>
  L:    linux-mmc@vger.kernel.org
  S:    Supported
  F:    drivers/mmc/host/sdhci-of-at91.c
  
  ATMEL SPI DRIVER
 -M:    Nicolas Ferre <nicolas.ferre@atmel.com>
 +M:    Nicolas Ferre <nicolas.ferre@microchip.com>
  S:    Supported
  F:    drivers/spi/spi-atmel.*
  
  ATMEL SSC DRIVER
 -M:    Nicolas Ferre <nicolas.ferre@atmel.com>
 +M:    Nicolas Ferre <nicolas.ferre@microchip.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Supported
  F:    drivers/misc/atmel-ssc.c
  F:    include/linux/atmel-ssc.h
  
  ATMEL Timer Counter (TC) AND CLOCKSOURCE DRIVERS
 -M:    Nicolas Ferre <nicolas.ferre@atmel.com>
 +M:    Nicolas Ferre <nicolas.ferre@microchip.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Supported
  F:    drivers/misc/atmel_tclib.c
  F:    drivers/clocksource/tcb_clksrc.c
  
  ATMEL USBA UDC DRIVER
 -M:    Nicolas Ferre <nicolas.ferre@atmel.com>
 +M:    Nicolas Ferre <nicolas.ferre@microchip.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Supported
  F:    drivers/usb/gadget/udc/atmel_usba_udc.*
@@@ -2386,15 -2386,12 +2386,15 @@@ S:   Maintaine
  F:    drivers/net/wireless/broadcom/b43legacy/
  
  BACKLIGHT CLASS/SUBSYSTEM
 -M:    Jingoo Han <jingoohan1@gmail.com>
  M:    Lee Jones <lee.jones@linaro.org>
 +M:    Daniel Thompson <daniel.thompson@linaro.org>
 +M:    Jingoo Han <jingoohan1@gmail.com>
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight.git
  S:    Maintained
  F:    drivers/video/backlight/
  F:    include/linux/backlight.h
 +F:    include/linux/pwm_backlight.h
 +F:    Documentation/devicetree/bindings/leds/backlight
  
  BATMAN ADVANCED
  M:    Marek Lindner <mareklindner@neomailbox.ch>
@@@ -2432,14 -2429,6 +2432,14 @@@ W:    https://linuxtv.or
  S:    Supported
  F:    drivers/media/platform/sti/bdisp
  
 +DELTA ST MEDIA DRIVER
 +M:    Hugues Fruchet <hugues.fruchet@st.com>
 +L:    linux-media@vger.kernel.org
 +T:    git git://linuxtv.org/media_tree.git
 +W:    https://linuxtv.org
 +S:    Supported
 +F:    drivers/media/platform/sti/delta
 +
  BEFS FILE SYSTEM
  M:    Luis de Bethencourt <luisbg@osg.samsung.com>
  M:    Salah Triki <salah.triki@gmail.com>
@@@ -2616,12 -2605,6 +2616,12 @@@ L:    netdev@vger.kernel.or
  S:    Supported
  F:    drivers/net/ethernet/broadcom/bnx2x/
  
 +BROADCOM BNXT_EN 50 GIGABIT ETHERNET DRIVER
 +M:    Michael Chan <michael.chan@broadcom.com>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +F:    drivers/net/ethernet/broadcom/bnxt/
 +
  BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITECTURE
  M:    Florian Fainelli <f.fainelli@gmail.com>
  M:    Ray Jui <rjui@broadcom.com>
@@@ -2715,13 -2698,6 +2715,13 @@@ F:    drivers/irqchip/irq-brcmstb
  F:    include/linux/bcm963xx_nvram.h
  F:    include/linux/bcm963xx_tag.h
  
 +BROADCOM BMIPS CPUFREQ DRIVER
 +M:    Markus Mayer <mmayer@broadcom.com>
 +M:    bcm-kernel-feedback-list@broadcom.com
 +L:    linux-pm@vger.kernel.org
 +S:    Maintained
 +F:    drivers/cpufreq/bmips-cpufreq.c
 +
  BROADCOM TG3 GIGABIT ETHERNET DRIVER
  M:    Siva Reddy Kallam <siva.kallam@broadcom.com>
  M:    Prashant Sreedharan <prashant@broadcom.com>
@@@ -2832,17 -2808,6 +2832,17 @@@ L:    linux-arm-kernel@lists.infradead.or
  S:    Maintained
  F:    arch/arm64/boot/dts/broadcom/vulcan*
  
 +BROADCOM NETXTREME-E ROCE DRIVER
 +M:    Selvin Xavier <selvin.xavier@broadcom.com>
 +M:    Devesh Sharma <devesh.sharma@broadcom.com>
 +M:    Somnath Kotur <somnath.kotur@broadcom.com>
 +M:    Sriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
 +L:    linux-rdma@vger.kernel.org
 +W:    http://www.broadcom.com
 +S:    Supported
 +F:    drivers/infiniband/hw/bnxt_re/
 +F:    include/uapi/rdma/bnxt_re-abi.h
 +
  BROCADE BFA FC SCSI DRIVER
  M:    Anil Gurumurthy <anil.gurumurthy@qlogic.com>
  M:    Sudarsana Kalluru <sudarsana.kalluru@qlogic.com>
@@@ -3031,13 -2996,6 +3031,13 @@@ W:     http://www.cavium.co
  S:     Supported
  F:     drivers/net/ethernet/cavium/liquidio/
  
 +CAVIUM OCTEON-TX CRYPTO DRIVER
 +M:    George Cherian <george.cherian@cavium.com>
 +L:    linux-crypto@vger.kernel.org
 +W:    http://www.cavium.com
 +S:    Supported
 +F:    drivers/crypto/cavium/cpt/
 +
  CC2520 IEEE-802.15.4 RADIO DRIVER
  M:    Varka Bhadram <varkabhadram@gmail.com>
  L:    linux-wpan@vger.kernel.org
@@@ -3615,7 -3573,7 +3615,7 @@@ F:      drivers/infiniband/hw/cxgb3
  F:    include/uapi/rdma/cxgb3-abi.h
  
  CXGB4 ETHERNET DRIVER (CXGB4)
 -M:    Hariprasad S <hariprasad@chelsio.com>
 +M:    Ganesh Goudar <ganeshgr@chelsio.com>
  L:    netdev@vger.kernel.org
  W:    http://www.chelsio.com
  S:    Supported
@@@ -3842,7 -3800,6 +3842,7 @@@ F:      include/linux/devcoredump.
  DEVICE FREQUENCY (DEVFREQ)
  M:    MyungJoo Ham <myungjoo.ham@samsung.com>
  M:    Kyungmin Park <kyungmin.park@samsung.com>
 +R:    Chanwoo Choi <cw00.choi@samsung.com>
  L:    linux-pm@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/mzx/devfreq.git
  S:    Maintained
@@@ -3953,13 -3910,10 +3953,13 @@@ S:   Maintaine
  F:    drivers/i2c/busses/i2c-diolan-u2c.c
  
  DIRECT ACCESS (DAX)
 -M:    Matthew Wilcox <willy@linux.intel.com>
 +M:    Matthew Wilcox <mawilcox@microsoft.com>
 +M:    Ross Zwisler <ross.zwisler@linux.intel.com>
  L:    linux-fsdevel@vger.kernel.org
  S:    Supported
  F:    fs/dax.c
 +F:    include/linux/dax.h
 +F:    include/trace/events/fs_dax.h
  
  DIRECTORY NOTIFICATION (DNOTIFY)
  M:    Eric Paris <eparis@parisplace.org>
@@@ -4151,24 -4105,18 +4151,24 @@@ F:   drivers/gpu/drm/bridge
  
  DRM DRIVER FOR BOCHS VIRTUAL GPU
  M:    Gerd Hoffmann <kraxel@redhat.com>
 -S:    Odd Fixes
 +L:    virtualization@lists.linux-foundation.org
 +T:    git git://git.kraxel.org/linux drm-qemu
 +S:    Maintained
  F:    drivers/gpu/drm/bochs/
  
  DRM DRIVER FOR QEMU'S CIRRUS DEVICE
  M:    Dave Airlie <airlied@redhat.com>
 -S:    Odd Fixes
 +M:    Gerd Hoffmann <kraxel@redhat.com>
 +L:    virtualization@lists.linux-foundation.org
 +T:    git git://git.kraxel.org/linux drm-qemu
 +S:    Obsolete
 +W:    https://www.kraxel.org/blog/2014/10/qemu-using-cirrus-considered-harmful/
  F:    drivers/gpu/drm/cirrus/
  
  RADEON and AMDGPU DRM DRIVERS
  M:    Alex Deucher <alexander.deucher@amd.com>
  M:    Christian König <christian.koenig@amd.com>
 -L:    dri-devel@lists.freedesktop.org
 +L:    amd-gfx@lists.freedesktop.org
  T:    git git://people.freedesktop.org/~agd5f/linux
  S:    Supported
  F:    drivers/gpu/drm/radeon/
@@@ -4204,7 -4152,7 +4204,7 @@@ F:      Documentation/gpu/i915.rs
  INTEL GVT-g DRIVERS (Intel GPU Virtualization)
  M:      Zhenyu Wang <zhenyuw@linux.intel.com>
  M:      Zhi Wang <zhi.a.wang@intel.com>
 -L:      igvt-g-dev@lists.01.org
 +L:      intel-gvt-dev@lists.freedesktop.org
  L:      intel-gfx@lists.freedesktop.org
  W:      https://01.org/igvt-g
  T:      git https://github.com/01org/gvt-linux.git
@@@ -4355,10 -4303,7 +4355,10 @@@ F:    Documentation/devicetree/bindings/di
  
  DRM DRIVER FOR QXL VIRTUAL GPU
  M:    Dave Airlie <airlied@redhat.com>
 -S:    Odd Fixes
 +M:    Gerd Hoffmann <kraxel@redhat.com>
 +L:    virtualization@lists.linux-foundation.org
 +T:    git git://git.kraxel.org/linux drm-qemu
 +S:    Maintained
  F:    drivers/gpu/drm/qxl/
  F:    include/uapi/drm/qxl_drm.h
  
@@@ -5135,11 -5080,9 +5135,11 @@@ F:    drivers/net/wan/dlci.
  F:    drivers/net/wan/sdla.c
  
  FRAMEBUFFER LAYER
 +M:    Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
  L:    linux-fbdev@vger.kernel.org
 +T:    git git://github.com/bzolnier/linux.git
  Q:    http://patchwork.kernel.org/project/linux-fbdev/list/
 -S:    Orphan
 +S:    Maintained
  F:    Documentation/fb/
  F:    drivers/video/
  F:    include/video/
@@@ -5325,7 -5268,7 +5325,7 @@@ M:      Jaegeuk Kim <jaegeuk@kernel.org
  L:    linux-fsdevel@vger.kernel.org
  S:    Supported
  F:    fs/crypto/
 -F:    include/linux/fscrypto.h
 +F:    include/linux/fscrypt*.h
  
  F2FS FILE SYSTEM
  M:    Jaegeuk Kim <jaegeuk@kernel.org>
@@@ -5561,7 -5504,6 +5561,7 @@@ M:      Alex Elder <elder@kernel.org
  M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  S:    Maintained
  F:    drivers/staging/greybus/
 +L:    greybus-dev@lists.linaro.org
  
  GREYBUS AUDIO PROTOCOLS DRIVERS
  M:    Vaibhav Agarwal <vaibhav.sr@gmail.com>
@@@ -5683,14 -5625,6 +5683,14 @@@ T:    git git://linuxtv.org/media_tree.gi
  S:    Odd Fixes
  F:    drivers/media/usb/gspca/
  
 +GTP (GPRS Tunneling Protocol)
 +M:    Pablo Neira Ayuso <pablo@netfilter.org>
 +M:    Harald Welte <laforge@gnumonks.org>
 +L:    osmocom-net-gprs@lists.osmocom.org
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/pablo/gtp.git
 +S:    Maintained
 +F:    drivers/net/gtp.c
 +
  GUID PARTITION TABLE (GPT)
  M:    Davidlohr Bueso <dave@stgolabs.net>
  L:    linux-efi@vger.kernel.org
@@@ -5790,6 -5724,16 +5790,6 @@@ L:     linux-parisc@vger.kernel.or
  S:    Maintained
  F:    sound/parisc/harmony.*
  
 -HD29L2 MEDIA DRIVER
 -M:    Antti Palosaari <crope@iki.fi>
 -L:    linux-media@vger.kernel.org
 -W:    https://linuxtv.org
 -W:    http://palosaari.fi/linux/
 -Q:    http://patchwork.linuxtv.org/project/linux-media/list/
 -T:    git git://linuxtv.org/anttip/media_tree.git
 -S:    Maintained
 -F:    drivers/media/dvb-frontends/hd29l2*
 -
  HEWLETT PACKARD ENTERPRISE ILO NMI WATCHDOG DRIVER
  M:    Jimmy Vance <jimmy.vance@hpe.com>
  S:    Supported
@@@ -6017,13 -5961,11 +6017,13 @@@ F:   drivers/media/platform/sti/hv
  Hyper-V CORE AND DRIVERS
  M:    "K. Y. Srinivasan" <kys@microsoft.com>
  M:    Haiyang Zhang <haiyangz@microsoft.com>
 +M:    Stephen Hemminger <sthemmin@microsoft.com>
  L:    devel@linuxdriverproject.org
  S:    Maintained
  F:    arch/x86/include/asm/mshyperv.h
  F:    arch/x86/include/uapi/asm/hyperv.h
  F:    arch/x86/kernel/cpu/mshyperv.c
 +F:    arch/x86/hyperv
  F:    drivers/hid/hid-hyperv.c
  F:    drivers/hv/
  F:    drivers/input/serio/hyperv-keyboard.c
@@@ -6294,13 -6236,6 +6294,13 @@@ F:    include/net/cfg802154.
  F:    include/net/ieee802154_netdev.h
  F:    Documentation/networking/ieee802154.txt
  
 +IFE PROTOCOL
 +M:    Yotam Gigi <yotamg@mellanox.com>
 +M:    Jamal Hadi Salim <jhs@mojatatu.com>
 +F:    net/ife
 +F:    include/net/ife.h
 +F:    include/uapi/linux/ife.h
 +
  IGORPLUG-USB IR RECEIVER
  M:    Sean Young <sean@mess.org>
  L:    linux-media@vger.kernel.org
@@@ -6784,8 -6719,9 +6784,8 @@@ S:      Odd Fixe
  F:    drivers/tty/ipwireless/
  
  IPX NETWORK LAYER
 -M:    Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
  L:    netdev@vger.kernel.org
 -S:    Maintained
 +S:    Odd fixes
  F:    include/net/ipx.h
  F:    include/uapi/linux/ipx.h
  F:    net/ipx/
@@@ -7557,8 -7493,8 +7557,8 @@@ S:      Maintaine
  F:    drivers/misc/lkdtm*
  
  LLC (802.2)
 -M:    Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
 -S:    Maintained
 +L:    netdev@vger.kernel.org
 +S:    Odd fixes
  F:    include/linux/llc.h
  F:    include/uapi/linux/llc.h
  F:    include/net/llc*
@@@ -7591,7 -7527,6 +7591,7 @@@ S:      Maintaine
  F:    Documentation/hwmon/lm90
  F:    Documentation/devicetree/bindings/hwmon/lm90.txt
  F:    drivers/hwmon/lm90.c
 +F:    include/dt-bindings/thermal/lm90.h
  
  LM95234 HARDWARE MONITOR DRIVER
  M:    Guenter Roeck <linux@roeck-us.net>
@@@ -7757,12 -7692,6 +7757,12 @@@ W:    http://www.kernel.org/doc/man-page
  L:    linux-man@vger.kernel.org
  S:    Maintained
  
 +MARDUK (CREATOR CI40) DEVICE TREE SUPPORT
 +M:    Rahul Bedarkar <rahul.bedarkar@imgtec.com>
 +L:    linux-mips@linux-mips.org
 +S:    Maintained
 +F:    arch/mips/boot/dts/img/pistachio_marduk.dts
 +
  MARVELL 88E6XXX ETHERNET SWITCH FABRIC DRIVER
  M:    Andrew Lunn <andrew@lunn.ch>
  M:    Vivien Didelot <vivien.didelot@savoirfairelinux.com>
@@@ -7772,10 -7701,8 +7772,10 @@@ F:    drivers/net/dsa/mv88e6xxx
  F:    Documentation/devicetree/bindings/net/dsa/marvell.txt
  
  MARVELL ARMADA DRM SUPPORT
 -M:    Russell King <rmk+kernel@armlinux.org.uk>
 +M:    Russell King <linux@armlinux.org.uk>
  S:    Maintained
 +T:    git git://git.armlinux.org.uk/~rmk/linux-arm.git drm-armada-devel
 +T:    git git://git.armlinux.org.uk/~rmk/linux-arm.git drm-armada-fixes
  F:    drivers/gpu/drm/armada/
  F:    include/uapi/drm/armada_drm.h
  F:    Documentation/devicetree/bindings/display/armada/
@@@ -8247,15 -8174,6 +8247,15 @@@ S:    Maintaine
  F:    drivers/tty/serial/atmel_serial.c
  F:    include/linux/atmel_serial.h
  
 +MICROCHIP / ATMEL DMA DRIVER
 +M:    Ludovic Desroches <ludovic.desroches@microchip.com>
 +L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 +L:    dmaengine@vger.kernel.org
 +S:    Supported
 +F:    drivers/dma/at_hdmac.c
 +F:    drivers/dma/at_hdmac_regs.h
 +F:    include/linux/platform_data/dma-atmel.h
 +
  MICROCHIP / ATMEL ISC DRIVER
  M:    Songjun Wu <songjun.wu@microchip.com>
  L:    linux-media@vger.kernel.org
@@@ -8264,14 -8182,6 +8264,14 @@@ F:    drivers/media/platform/atmel/atmel-i
  F:    drivers/media/platform/atmel/atmel-isc-regs.h
  F:    devicetree/bindings/media/atmel-isc.txt
  
 +MICROCHIP USB251XB DRIVER
 +M:    Richard Leitner <richard.leitner@skidata.com>
 +L:    linux-usb@vger.kernel.org
 +S:    Maintained
 +F:    drivers/usb/misc/usb251xb.c
 +F:    include/linux/platform_data/usb251xb.h
 +F:    Documentation/devicetree/bindings/usb/usb251xb.txt
 +
  MICROSOFT SURFACE PRO 3 BUTTON DRIVER
  M:    Chen Yu <yu.c.chen@intel.com>
  L:    platform-driver-x86@vger.kernel.org
@@@ -8394,7 -8304,6 +8394,7 @@@ F:      drivers/media/dvb-frontends/mn88473
  MODULE SUPPORT
  M:    Jessica Yu <jeyu@redhat.com>
  M:    Rusty Russell <rusty@rustcorp.com.au>
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux.git modules-next
  S:    Maintained
  F:    include/linux/module.h
  F:    kernel/module.c
@@@ -8503,7 -8412,6 +8503,7 @@@ S:      Supporte
  F:    Documentation/devicetree/bindings/mfd/
  F:    drivers/mfd/
  F:    include/linux/mfd/
 +F:    include/dt-bindings/mfd/
  
  MULTIMEDIA CARD (MMC), SECURE DIGITAL (SD) AND SDIO SUBSYSTEM
  M:    Ulf Hansson <ulf.hansson@linaro.org>
@@@ -8639,8 -8547,9 +8639,8 @@@ F:      Documentation/networking/s2io.tx
  F:    Documentation/networking/vxge.txt
  F:    drivers/net/ethernet/neterion/
  
 -NETFILTER ({IP,IP6,ARP,EB,NF}TABLES)
 +NETFILTER
  M:    Pablo Neira Ayuso <pablo@netfilter.org>
 -M:    Patrick McHardy <kaber@trash.net>
  M:    Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
  L:    netfilter-devel@vger.kernel.org
  L:    coreteam@netfilter.org
@@@ -8685,10 -8594,10 +8685,10 @@@ S:   Maintaine
  F:    drivers/net/ethernet/netronome/
  
  NETWORK BLOCK DEVICE (NBD)
 -M:    Markus Pargmann <mpa@pengutronix.de>
 +M:    Josef Bacik <jbacik@fb.com>
  S:    Maintained
 +L:    linux-block@vger.kernel.org
  L:    nbd-general@lists.sourceforge.net
 -T:    git git://git.pengutronix.de/git/mpa/linux-nbd.git
  F:    Documentation/blockdev/nbd.txt
  F:    drivers/block/nbd.c
  F:    include/uapi/linux/nbd.h
@@@ -8884,22 -8793,6 +8884,22 @@@ T:    git git://git.kernel.org/pub/scm/lin
  S:    Maintained
  F:    arch/nios2/
  
 +NOKIA N900 CAMERA SUPPORT (ET8EK8 SENSOR, AD5820 FOCUS)
 +M:    Pavel Machek <pavel@ucw.cz>
 +M:    Sakari Ailus <sakari.ailus@iki.fi>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +F:    drivers/media/i2c/et8ek8
 +F:    drivers/media/i2c/ad5820.c
 +
 +NOKIA N900 CAMERA SUPPORT (ET8EK8 SENSOR, AD5820 FOCUS)
 +M:    Pavel Machek <pavel@ucw.cz>
 +M:    Sakari Ailus <sakari.ailus@iki.fi>
 +L:    linux-media@vger.kernel.org
 +S:    Maintained
 +F:    drivers/media/i2c/et8ek8
 +F:    drivers/media/i2c/ad5820.c
 +
  NOKIA N900 POWER SUPPLY DRIVERS
  R:    Pali Rohár <pali.rohar@gmail.com>
  F:    include/linux/power/bq2415x_charger.h
@@@ -8959,22 -8852,17 +8959,22 @@@ F:   drivers/video/fbdev/nvidia
  NVM EXPRESS DRIVER
  M:    Keith Busch <keith.busch@intel.com>
  M:    Jens Axboe <axboe@fb.com>
 +M:    Christoph Hellwig <hch@lst.de>
 +M:    Sagi Grimberg <sagi@grimberg.me>
  L:    linux-nvme@lists.infradead.org
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
 -W:    https://kernel.googlesource.com/pub/scm/linux/kernel/git/axboe/linux-block/
 +T:    git://git.infradead.org/nvme.git
 +W:    http://git.infradead.org/nvme.git
  S:    Supported
  F:    drivers/nvme/host/
  F:    include/linux/nvme.h
 +F:    include/uapi/linux/nvme_ioctl.h
  
  NVM EXPRESS TARGET DRIVER
  M:    Christoph Hellwig <hch@lst.de>
  M:    Sagi Grimberg <sagi@grimberg.me>
  L:    linux-nvme@lists.infradead.org
 +T:    git://git.infradead.org/nvme.git
 +W:    http://git.infradead.org/nvme.git
  S:    Supported
  F:    drivers/nvme/target/
  
@@@ -9005,10 -8893,8 +9005,10 @@@ S:    Supporte
  F:    drivers/nfc/nxp-nci
  
  NXP TDA998X DRM DRIVER
 -M:    Russell King <rmk+kernel@armlinux.org.uk>
 +M:    Russell King <linux@armlinux.org.uk>
  S:    Supported
 +T:    git git://git.armlinux.org.uk/~rmk/linux-arm.git drm-tda998x-devel
 +T:    git git://git.armlinux.org.uk/~rmk/linux-arm.git drm-tda998x-fixes
  F:    drivers/gpu/drm/i2c/tda998x_drv.c
  F:    include/drm/i2c/tda998x.h
  
@@@ -9457,14 -9343,6 +9457,14 @@@ F:    drivers/video/fbdev/sti
  F:    drivers/video/console/sti*
  F:    drivers/video/logo/logo_parisc*
  
 +PARMAN
 +M:    Jiri Pirko <jiri@mellanox.com>
 +L:    netdev@vger.kernel.org
 +S:    Supported
 +F:    lib/parman.c
 +F:    lib/test_parman.c
 +F:    include/linux/parman.h
 +
  PC87360 HARDWARE MONITORING DRIVER
  M:    Jim Cromie <jim.cromie@gmail.com>
  L:    linux-hwmon@vger.kernel.org
@@@ -9551,7 -9429,7 +9551,7 @@@ L:      linux-pci@vger.kernel.or
  L:    linux-arm-kernel@lists.infradead.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/pci/pci-armada8k.txt
- F:    drivers/pci/host/pcie-armada8k.c
+ F:    drivers/pci/dwc/pcie-armada8k.c
  
  PCI DRIVER FOR APPLIEDMICRO XGENE
  M:    Tanmay Inamdar <tinamdar@apm.com>
@@@ -9569,7 -9447,7 +9569,7 @@@ L:      linuxppc-dev@lists.ozlabs.or
  L:    linux-pci@vger.kernel.org
  L:    linux-arm-kernel@lists.infradead.org
  S:    Maintained
- F:    drivers/pci/host/*layerscape*
+ F:    drivers/pci/dwc/*layerscape*
  
  PCI DRIVER FOR IMX6
  M:    Richard Zhu <hongxing.zhu@nxp.com>
@@@ -9578,14 -9456,14 +9578,14 @@@ L:   linux-pci@vger.kernel.or
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
  F:    Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt
- F:    drivers/pci/host/*imx6*
+ F:    drivers/pci/dwc/*imx6*
  
  PCI DRIVER FOR TI KEYSTONE
  M:    Murali Karicheri <m-karicheri2@ti.com>
  L:    linux-pci@vger.kernel.org
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  S:    Maintained
- F:    drivers/pci/host/*keystone*
+ F:    drivers/pci/dwc/*keystone*
  
  PCI DRIVER FOR MVEBU (Marvell Armada 370 and Armada XP SOC support)
  M:    Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
@@@ -9617,7 -9495,7 +9617,7 @@@ L:      linux-omap@vger.kernel.or
  L:    linux-pci@vger.kernel.org
  S:    Supported
  F:    Documentation/devicetree/bindings/pci/ti-pci.txt
- F:    drivers/pci/host/pci-dra7xx.c
+ F:    drivers/pci/dwc/pci-dra7xx.c
  
  PCI DRIVER FOR RENESAS R-CAR
  M:    Simon Horman <horms@verge.net.au>
@@@ -9632,7 -9510,7 +9632,7 @@@ L:      linux-pci@vger.kernel.or
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
  S:    Maintained
- F:    drivers/pci/host/pci-exynos.c
+ F:    drivers/pci/dwc/pci-exynos.c
  
  PCI DRIVER FOR SYNOPSIS DESIGNWARE
  M:    Jingoo Han <jingoohan1@gmail.com>
@@@ -9640,7 -9518,7 +9640,7 @@@ M:      Joao Pinto <Joao.Pinto@synopsys.com
  L:    linux-pci@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/pci/designware-pcie.txt
- F:    drivers/pci/host/*designware*
+ F:    drivers/pci/dwc/*designware*
  
  PCI DRIVER FOR GENERIC OF HOSTS
  M:    Will Deacon <will.deacon@arm.com>
@@@ -9661,7 -9539,7 +9661,7 @@@ PCIE DRIVER FOR ST SPEAR13X
  M:    Pratyush Anand <pratyush.anand@gmail.com>
  L:    linux-pci@vger.kernel.org
  S:    Maintained
- F:    drivers/pci/host/*spear*
+ F:    drivers/pci/dwc/*spear*
  
  PCI MSI DRIVER FOR ALTERA MSI IP
  M:    Ley Foon Tan <lftan@altera.com>
@@@ -9686,7 -9564,7 +9686,7 @@@ L:      linux-arm-kernel@axis.co
  L:    linux-pci@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/pci/axis,artpec*
- F:    drivers/pci/host/*artpec*
+ F:    drivers/pci/dwc/*artpec*
  
  PCIE DRIVER FOR HISILICON
  M:    Zhou Wang <wangzhou1@hisilicon.com>
@@@ -9694,7 -9572,7 +9694,7 @@@ M:      Gabriele Paoloni <gabriele.paoloni@h
  L:    linux-pci@vger.kernel.org
  S:    Maintained
  F:    Documentation/devicetree/bindings/pci/hisilicon-pcie.txt
- F:    drivers/pci/host/pcie-hisi.c
+ F:    drivers/pci/dwc/pcie-hisi.c
  
  PCIE DRIVER FOR ROCKCHIP
  M:    Shawn Lin <shawn.lin@rock-chips.com>
@@@ -9710,7 -9588,7 +9710,7 @@@ M:     Stanimir Varbanov <svarbanov@mm-
  L:     linux-pci@vger.kernel.org
  L:     linux-arm-msm@vger.kernel.org
  S:     Maintained
- F:     drivers/pci/host/*qcom*
+ F:     drivers/pci/dwc/*qcom*
  
  PCIE DRIVER FOR CAVIUM THUNDERX
  M:    David Daney <david.daney@cavium.com>
@@@ -9832,7 -9710,7 +9832,7 @@@ S:      Maintaine
  F:    drivers/pinctrl/pinctrl-at91.*
  
  PIN CONTROLLER - ATMEL AT91 PIO4
 -M:    Ludovic Desroches <ludovic.desroches@atmel.com>
 +M:    Ludovic Desroches <ludovic.desroches@microchip.com>
  L:    linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
  L:    linux-gpio@vger.kernel.org
  S:    Supported
@@@ -9884,7 -9762,7 +9884,7 @@@ L:      linux-mips@linux-mips.or
  S:      Maintained
  F:      arch/mips/pistachio/
  F:      arch/mips/include/asm/mach-pistachio/
 -F:      arch/mips/boot/dts/pistachio/
 +F:      arch/mips/boot/dts/img/pistachio*
  F:      arch/mips/configs/pistachio*_defconfig
  
  PKTCDVD DRIVER
@@@ -9964,7 -9842,7 +9964,7 @@@ M:      Mark Rutland <mark.rutland@arm.com
  M:    Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
  L:    linux-arm-kernel@lists.infradead.org
  S:    Maintained
 -F:    drivers/firmware/psci.c
 +F:    drivers/firmware/psci*.c
  F:    include/linux/psci.h
  F:    include/uapi/linux/psci.h
  
@@@ -10028,14 -9906,6 +10028,14 @@@ S:  Supporte
  F:    Documentation/preempt-locking.txt
  F:    include/linux/preempt.h
  
 +PRINTK
 +M:    Petr Mladek <pmladek@suse.com>
 +M:    Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
 +R:    Steven Rostedt <rostedt@goodmis.org>
 +S:    Maintained
 +F:    kernel/printk/
 +F:    include/linux/printk.h
 +
  PRISM54 WIRELESS DRIVER
  M:    "Luis R. Rodriguez" <mcgrof@gmail.com>
  L:    linux-wireless@vger.kernel.org
@@@ -10071,27 -9941,17 +10071,27 @@@ L: linuxppc-dev@lists.ozlabs.or
  S:    Maintained
  F:    drivers/block/ps3vram.c
  
 +PSAMPLE PACKET SAMPLING SUPPORT:
 +M:    Yotam Gigi <yotamg@mellanox.com>
 +S:    Maintained
 +F:    net/psample
 +F:    include/net/psample.h
 +F:    include/uapi/linux/psample.h
 +
  PSTORE FILESYSTEM
 +M:    Kees Cook <keescook@chromium.org>
  M:    Anton Vorontsov <anton@enomsg.org>
  M:    Colin Cross <ccross@android.com>
 -M:    Kees Cook <keescook@chromium.org>
  M:    Tony Luck <tony.luck@intel.com>
  S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux.git
 +T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/pstore
  F:    fs/pstore/
  F:    include/linux/pstore*
  F:    drivers/firmware/efi/efi-pstore.c
  F:    drivers/acpi/apei/erst.c
 +F:    Documentation/admin-guide/ramoops.rst
 +F:    Documentation/devicetree/bindings/reserved-memory/ramoops.txt
 +K:    \b(pstore|ramoops)
  
  PTP HARDWARE CLOCK SUPPORT
  M:    Richard Cochran <richardcochran@gmail.com>
@@@ -10291,8 -10151,7 +10291,8 @@@ F:   include/uapi/linux/qnx4_fs.
  F:    include/uapi/linux/qnxtypes.h
  
  QORIQ DPAA2 FSL-MC BUS DRIVER
 -M:    Stuart Yoder <stuart.yoder@nxp.com>
 +M:    Stuart Yoder <stuyoder@gmail.com>
 +M:    Laurentiu Tudor <laurentiu.tudor@nxp.com>
  L:    linux-kernel@vger.kernel.org
  S:    Maintained
  F:    drivers/staging/fsl-mc/
@@@ -10310,6 -10169,7 +10310,6 @@@ F:   drivers/media/tuners/qt1010
  QUALCOMM ATHEROS ATH9K WIRELESS DRIVER
  M:    QCA ath9k Development <ath9k-devel@qca.qualcomm.com>
  L:    linux-wireless@vger.kernel.org
 -L:    ath9k-devel@lists.ath9k.org
  W:    http://wireless.kernel.org/en/users/Drivers/ath9k
  S:    Supported
  F:    drivers/net/wireless/ath/ath9k/
@@@ -10555,7 -10415,6 +10555,7 @@@ S:   Maintaine
  F:    drivers/rpmsg/
  F:    Documentation/rpmsg.txt
  F:    include/linux/rpmsg.h
 +F:    include/linux/rpmsg/
  
  RENESAS CLOCK DRIVERS
  M:    Geert Uytterhoeven <geert+renesas@glider.be>
@@@ -10570,12 -10429,6 +10570,12 @@@ L: linux-renesas-soc@vger.kernel.or
  F:    drivers/net/ethernet/renesas/
  F:    include/linux/sh_eth.h
  
 +RENESAS R-CAR GYROADC DRIVER
 +M:    Marek Vasut <marek.vasut@gmail.com>
 +L:    linux-iio@vger.kernel.org
 +S:    Supported
 +F:    drivers/iio/adc/rcar_gyro_adc.c
 +
  RENESAS USB2 PHY DRIVER
  M:    Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
  L:    linux-renesas-soc@vger.kernel.org
@@@ -10715,7 -10568,7 +10715,7 @@@ F:   drivers/net/wireless/realtek/rtlwifi
  F:    drivers/net/wireless/realtek/rtlwifi/rtl8192ce/
  
  RTL8XXXU WIRELESS DRIVER (rtl8xxxu)
 -M:    Jes Sorensen <Jes.Sorensen@redhat.com>
 +M:    Jes Sorensen <Jes.Sorensen@gmail.com>
  L:    linux-wireless@vger.kernel.org
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/jes/linux.git rtl8xxxu-devel
  S:    Maintained
@@@ -10968,14 -10821,6 +10968,14 @@@ S: Maintaine
  F:    Documentation/devicetree/bindings/serial/
  F:    drivers/tty/serial/
  
 +SERIAL DEVICE BUS
 +M:    Rob Herring <robh@kernel.org>
 +L:    linux-serial@vger.kernel.org
 +S:    Maintained
 +F:    Documentation/devicetree/bindings/serial/slave-device.txt
 +F:    drivers/tty/serdev/
 +F:    include/linux/serdev.h
 +
  SERIAL IR RECEIVER
  M:    Sean Young <sean@mess.org>
  L:    linux-media@vger.kernel.org
@@@ -10989,13 -10834,6 +10989,13 @@@ S: Maintaine
  F:    drivers/staging/media/st-cec/
  F:    Documentation/devicetree/bindings/media/stih-cec.txt
  
 +SHARED MEMORY COMMUNICATIONS (SMC) SOCKETS
 +M:    Ursula Braun <ubraun@linux.vnet.ibm.com>
 +L:    linux-s390@vger.kernel.org
 +W:    http://www.ibm.com/developerworks/linux/linux390/
 +S:    Supported
 +F:    net/smc/
 +
  SYNOPSYS DESIGNWARE DMAC DRIVER
  M:    Viresh Kumar <vireshk@kernel.org>
  M:    Andy Shevchenko <andriy.shevchenko@linux.intel.com>
@@@ -11004,6 -10842,13 +11004,6 @@@ F:  include/linux/dma/dw.
  F:    include/linux/platform_data/dma-dw.h
  F:    drivers/dma/dw/
  
 -SYNOPSYS DESIGNWARE ETHERNET QOS 4.10a driver
 -M: Lars Persson <lars.persson@axis.com>
 -L: netdev@vger.kernel.org
 -S: Supported
 -F: Documentation/devicetree/bindings/net/snps,dwc-qos-ethernet.txt
 -F: drivers/net/ethernet/synopsys/dwc_eth_qos.c
 -
  SYNOPSYS DESIGNWARE I2C DRIVER
  M:    Jarkko Nikula <jarkko.nikula@linux.intel.com>
  R:    Andy Shevchenko <andriy.shevchenko@linux.intel.com>
@@@ -11017,6 -10862,7 +11017,6 @@@ SYNOPSYS DESIGNWARE MMC/SD/SDIO DRIVE
  M:    Jaehoon Chung <jh80.chung@samsung.com>
  L:    linux-mmc@vger.kernel.org
  S:    Maintained
 -F:    include/linux/mmc/dw_mmc.h
  F:    drivers/mmc/host/dw_mmc*
  
  SYSTEM TRACE MODULE CLASS
@@@ -11219,17 -11065,6 +11219,17 @@@ L: linux-mmc@vger.kernel.or
  S:    Maintained
  F:    drivers/mmc/host/sdhci-spear.c
  
 +SECURE ENCRYPTING DEVICE (SED) OPAL DRIVER
 +M:    Scott Bauer <scott.bauer@intel.com>
 +M:    Jonathan Derrick <jonathan.derrick@intel.com>
 +M:    Rafael Antognolli <rafael.antognolli@intel.com>
 +L:    linux-block@vger.kernel.org
 +S:    Supported
 +F:    block/sed*
 +F:    block/opal_proto.h
 +F:    include/linux/sed*
 +F:    include/uapi/linux/sed*
 +
  SECURITY SUBSYSTEM
  M:    James Morris <james.l.morris@oracle.com>
  M:    "Serge E. Hallyn" <serge@hallyn.com>
@@@ -11456,13 -11291,6 +11456,13 @@@ F: arch/arm/mach-s3c24xx/mach-bast.
  F:    arch/arm/mach-s3c24xx/bast-ide.c
  F:    arch/arm/mach-s3c24xx/bast-irq.c
  
 +SIPHASH PRF ROUTINES
 +M:    Jason A. Donenfeld <Jason@zx2c4.com>
 +S:    Maintained
 +F:    lib/siphash.c
 +F:    lib/test_siphash.c
 +F:    include/linux/siphash.h
 +
  TI DAVINCI MACHINE SUPPORT
  M:    Sekhar Nori <nsekhar@ti.com>
  M:    Kevin Hilman <khilman@kernel.org>
@@@ -12034,7 -11862,6 +12034,7 @@@ F:   include/linux/swiotlb.
  
  SWITCHDEV
  M:    Jiri Pirko <jiri@resnulli.us>
 +M:    Ivan Vecera <ivecera@redhat.com>
  L:    netdev@vger.kernel.org
  S:    Supported
  F:    net/switchdev/
@@@ -13128,7 -12955,7 +13128,7 @@@ USERSPACE I/O (UIO
  M:    Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  S:    Maintained
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
 -F:    Documentation/DocBook/uio-howto.tmpl
 +F:    Documentation/driver-api/uio-howto.rst
  F:    drivers/uio/
  F:    include/linux/uio*.h
  
@@@ -13213,7 -13040,7 +13213,7 @@@ F:   drivers/input/serio/userio.
  F:    include/uapi/linux/userio.h
  
  VIRTIO CONSOLE DRIVER
 -M:    Amit Shah <amit.shah@redhat.com>
 +M:    Amit Shah <amit@kernel.org>
  L:    virtualization@lists.linux-foundation.org
  S:    Maintained
  F:    drivers/char/virtio_console.c
@@@ -13248,7 -13075,6 +13248,7 @@@ M:   David Airlie <airlied@linux.ie
  M:    Gerd Hoffmann <kraxel@redhat.com>
  L:    dri-devel@lists.freedesktop.org
  L:    virtualization@lists.linux-foundation.org
 +T:    git git://git.kraxel.org/linux drm-qemu
  S:    Maintained
  F:    drivers/gpu/drm/virtio/
  F:    include/uapi/linux/virtio_gpu.h
@@@ -13521,8 -13347,10 +13521,8 @@@ S:  Maintaine
  F:    drivers/input/misc/wistron_btns.c
  
  WL3501 WIRELESS PCMCIA CARD DRIVER
 -M:    Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
  L:    linux-wireless@vger.kernel.org
 -W:    http://oops.ghostprotocols.net:81/blog
 -S:    Maintained
 +S:    Odd fixes
  F:    drivers/net/wireless/wl3501*
  
  WOLFSON MICROELECTRONICS DRIVERS
@@@ -13598,7 -13426,6 +13598,7 @@@ F:   arch/x86
  
  X86 PLATFORM DRIVERS
  M:    Darren Hart <dvhart@infradead.org>
 +M:    Andy Shevchenko <andy@infradead.org>
  L:    platform-driver-x86@vger.kernel.org
  T:    git git://git.infradead.org/users/dvhart/linux-platform-drivers-x86.git
  S:    Maintained
@@@ -13700,11 -13527,11 +13700,11 @@@ F:        arch/x86/xen/*swiotlb
  F:    drivers/xen/*swiotlb*
  
  XFS FILESYSTEM
 -M:    Dave Chinner <david@fromorbit.com>
 +M:    Darrick J. Wong <darrick.wong@oracle.com>
  M:    linux-xfs@vger.kernel.org
  L:    linux-xfs@vger.kernel.org
  W:    http://xfs.org/
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/dgc/linux-xfs.git
 +T:    git git://git.kernel.org/pub/scm/fs/xfs/xfs-linux.git
  S:    Supported
  F:    Documentation/filesystems/xfs.txt
  F:    fs/xfs/
@@@ -13770,7 -13597,6 +13770,7 @@@ F:   drivers/net/hamradio/z8530.
  
  ZBUD COMPRESSED PAGE ALLOCATOR
  M:    Seth Jennings <sjenning@redhat.com>
 +M:    Dan Streetman <ddstreet@ieee.org>
  L:    linux-mm@kvack.org
  S:    Maintained
  F:    mm/zbud.c
@@@ -13785,24 -13611,6 +13785,24 @@@ L: zd1211-devs@lists.sourceforge.net (s
  S:    Maintained
  F:    drivers/net/wireless/zydas/zd1211rw/
  
 +ZD1301_DEMOD MEDIA DRIVER
 +M:    Antti Palosaari <crope@iki.fi>
 +L:    linux-media@vger.kernel.org
 +W:    https://linuxtv.org/
 +W:    http://palosaari.fi/linux/
 +Q:    https://patchwork.linuxtv.org/project/linux-media/list/
 +S:    Maintained
 +F:    drivers/media/dvb-frontends/zd1301_demod*
 +
 +ZD1301 MEDIA DRIVER
 +M:    Antti Palosaari <crope@iki.fi>
 +L:    linux-media@vger.kernel.org
 +W:    https://linuxtv.org/
 +W:    http://palosaari.fi/linux/
 +Q:    https://patchwork.linuxtv.org/project/linux-media/list/
 +S:    Maintained
 +F:    drivers/media/usb/dvb-usb-v2/zd1301*
 +
  ZPOOL COMPRESSED PAGE STORAGE API
  M:    Dan Streetman <ddstreet@ieee.org>
  L:    linux-mm@kvack.org
@@@ -13844,7 -13652,6 +13844,7 @@@ F:   Documentation/vm/zsmalloc.tx
  
  ZSWAP COMPRESSED SWAP CACHING
  M:    Seth Jennings <sjenning@redhat.com>
 +M:    Dan Streetman <ddstreet@ieee.org>
  L:    linux-mm@kvack.org
  S:    Maintained
  F:    mm/zswap.c
diff --combined drivers/Makefile
index 67ce51d62015835e56a08930f6e5e276e6d7e32e,f521cb0e58d6b9791ecaa901b6ca4d0eb6ffff12..2eced9afba5323ac16fa0f6a9a4459450f9f1fab
@@@ -15,6 -15,9 +15,9 @@@ obj-$(CONFIG_PINCTRL)         += pinctrl
  obj-$(CONFIG_GPIOLIB)         += gpio/
  obj-y                         += pwm/
  obj-$(CONFIG_PCI)             += pci/
+ # PCI dwc controller drivers
+ obj-y                         += pci/dwc/
  obj-$(CONFIG_PARISC)          += parisc/
  obj-$(CONFIG_RAPIDIO)         += rapidio/
  obj-y                         += video/
@@@ -173,4 -176,3 +176,4 @@@ obj-$(CONFIG_STM)          += hwtracing/stm
  obj-$(CONFIG_ANDROID)         += android/
  obj-$(CONFIG_NVMEM)           += nvmem/
  obj-$(CONFIG_FPGA)            += fpga/
 +obj-$(CONFIG_FSI)             += fsi/
index c2730f15bd8b62d2e0487e4eef11f6518a476c39,e43690288c593105611c8b4569dfc868d866d295..38392a5207258e707c7aac9f638fb592ad2bd890
  #include "xgbe.h"
  #include "xgbe-common.h"
  
- static int xgbe_config_msi(struct xgbe_prv_data *pdata)
+ static int xgbe_config_multi_msi(struct xgbe_prv_data *pdata)
  {
-       unsigned int msi_count;
+       unsigned int vector_count;
        unsigned int i, j;
        int ret;
  
-       msi_count = XGBE_MSIX_BASE_COUNT;
-       msi_count += max(pdata->rx_ring_count,
-                        pdata->tx_ring_count);
-       msi_count = roundup_pow_of_two(msi_count);
+       vector_count = XGBE_MSI_BASE_COUNT;
+       vector_count += max(pdata->rx_ring_count,
+                           pdata->tx_ring_count);
  
-       ret = pci_enable_msi_exact(pdata->pcidev, msi_count);
+       ret = pci_alloc_irq_vectors(pdata->pcidev, XGBE_MSI_MIN_COUNT,
+                                   vector_count, PCI_IRQ_MSI | PCI_IRQ_MSIX);
        if (ret < 0) {
-               dev_info(pdata->dev, "MSI request for %u interrupts failed\n",
-                        msi_count);
-               ret = pci_enable_msi(pdata->pcidev);
-               if (ret < 0) {
-                       dev_info(pdata->dev, "MSI enablement failed\n");
-                       return ret;
-               }
-               msi_count = 1;
-       }
-       pdata->irq_count = msi_count;
-       pdata->dev_irq = pdata->pcidev->irq;
-       if (msi_count > 1) {
-               pdata->ecc_irq = pdata->pcidev->irq + 1;
-               pdata->i2c_irq = pdata->pcidev->irq + 2;
-               pdata->an_irq = pdata->pcidev->irq + 3;
-               for (i = XGBE_MSIX_BASE_COUNT, j = 0;
-                    (i < msi_count) && (j < XGBE_MAX_DMA_CHANNELS);
-                    i++, j++)
-                       pdata->channel_irq[j] = pdata->pcidev->irq + i;
-               pdata->channel_irq_count = j;
-               pdata->per_channel_irq = 1;
-               pdata->channel_irq_mode = XGBE_IRQ_MODE_LEVEL;
-       } else {
-               pdata->ecc_irq = pdata->pcidev->irq;
-               pdata->i2c_irq = pdata->pcidev->irq;
-               pdata->an_irq = pdata->pcidev->irq;
-       }
-       if (netif_msg_probe(pdata))
-               dev_dbg(pdata->dev, "MSI interrupts enabled\n");
-       return 0;
- }
- static int xgbe_config_msix(struct xgbe_prv_data *pdata)
- {
-       unsigned int msix_count;
-       unsigned int i, j;
-       int ret;
-       msix_count = XGBE_MSIX_BASE_COUNT;
-       msix_count += max(pdata->rx_ring_count,
-                         pdata->tx_ring_count);
-       pdata->msix_entries = devm_kcalloc(pdata->dev, msix_count,
-                                          sizeof(struct msix_entry),
-                                          GFP_KERNEL);
-       if (!pdata->msix_entries)
-               return -ENOMEM;
-       for (i = 0; i < msix_count; i++)
-               pdata->msix_entries[i].entry = i;
-       ret = pci_enable_msix_range(pdata->pcidev, pdata->msix_entries,
-                                   XGBE_MSIX_MIN_COUNT, msix_count);
-       if (ret < 0) {
-               dev_info(pdata->dev, "MSI-X enablement failed\n");
-               devm_kfree(pdata->dev, pdata->msix_entries);
-               pdata->msix_entries = NULL;
+               dev_info(pdata->dev, "multi MSI/MSI-X enablement failed\n");
                return ret;
        }
  
        pdata->irq_count = ret;
  
-       pdata->dev_irq = pdata->msix_entries[0].vector;
-       pdata->ecc_irq = pdata->msix_entries[1].vector;
-       pdata->i2c_irq = pdata->msix_entries[2].vector;
-       pdata->an_irq = pdata->msix_entries[3].vector;
+       pdata->dev_irq = pci_irq_vector(pdata->pcidev, 0);
+       pdata->ecc_irq = pci_irq_vector(pdata->pcidev, 1);
+       pdata->i2c_irq = pci_irq_vector(pdata->pcidev, 2);
+       pdata->an_irq = pci_irq_vector(pdata->pcidev, 3);
  
-       for (i = XGBE_MSIX_BASE_COUNT, j = 0; i < ret; i++, j++)
-               pdata->channel_irq[j] = pdata->msix_entries[i].vector;
+       for (i = XGBE_MSI_BASE_COUNT, j = 0; i < ret; i++, j++)
+               pdata->channel_irq[j] = pci_irq_vector(pdata->pcidev, i);
        pdata->channel_irq_count = j;
  
        pdata->per_channel_irq = 1;
        pdata->channel_irq_mode = XGBE_IRQ_MODE_LEVEL;
  
        if (netif_msg_probe(pdata))
-               dev_dbg(pdata->dev, "MSI-X interrupts enabled\n");
+               dev_dbg(pdata->dev, "multi %s interrupts enabled\n",
+                       pdata->pcidev->msix_enabled ? "MSI-X" : "MSI");
  
        return 0;
  }
@@@ -228,21 -164,28 +164,28 @@@ static int xgbe_config_irqs(struct xgbe
  {
        int ret;
  
-       ret = xgbe_config_msix(pdata);
+       ret = xgbe_config_multi_msi(pdata);
        if (!ret)
                goto out;
  
-       ret = xgbe_config_msi(pdata);
-       if (!ret)
-               goto out;
+       ret = pci_alloc_irq_vectors(pdata->pcidev, 1, 1,
+                                   PCI_IRQ_LEGACY | PCI_IRQ_MSI);
+       if (ret < 0) {
+               dev_info(pdata->dev, "single IRQ enablement failed\n");
+               return ret;
+       }
  
        pdata->irq_count = 1;
-       pdata->irq_shared = 1;
+       pdata->channel_irq_count = 1;
+       pdata->dev_irq = pci_irq_vector(pdata->pcidev, 0);
+       pdata->ecc_irq = pci_irq_vector(pdata->pcidev, 0);
+       pdata->i2c_irq = pci_irq_vector(pdata->pcidev, 0);
+       pdata->an_irq = pci_irq_vector(pdata->pcidev, 0);
  
-       pdata->dev_irq = pdata->pcidev->irq;
-       pdata->ecc_irq = pdata->pcidev->irq;
-       pdata->i2c_irq = pdata->pcidev->irq;
-       pdata->an_irq = pdata->pcidev->irq;
+       if (netif_msg_probe(pdata))
+               dev_dbg(pdata->dev, "single %s interrupt enabled\n",
+                       pdata->pcidev->msi_enabled ?  "MSI" : "legacy");
  
  out:
        if (netif_msg_probe(pdata)) {
@@@ -265,7 -208,6 +208,7 @@@ static int xgbe_pci_probe(struct pci_de
        struct xgbe_prv_data *pdata;
        struct device *dev = &pdev->dev;
        void __iomem * const *iomap_table;
 +      struct pci_dev *rdev;
        unsigned int ma_lo, ma_hi;
        unsigned int reg;
        int bar_mask;
        if (netif_msg_probe(pdata))
                dev_dbg(dev, "xpcs_regs  = %p\n", pdata->xpcs_regs);
  
 +      /* Set the PCS indirect addressing definition registers */
 +      rdev = pci_get_domain_bus_and_slot(0, 0, PCI_DEVFN(0, 0));
 +      if (rdev &&
 +          (rdev->vendor == PCI_VENDOR_ID_AMD) && (rdev->device == 0x15d0)) {
 +              pdata->xpcs_window_def_reg = PCS_V2_RV_WINDOW_DEF;
 +              pdata->xpcs_window_sel_reg = PCS_V2_RV_WINDOW_SELECT;
 +      } else {
 +              pdata->xpcs_window_def_reg = PCS_V2_WINDOW_DEF;
 +              pdata->xpcs_window_sel_reg = PCS_V2_WINDOW_SELECT;
 +      }
 +      pci_dev_put(rdev);
 +
        /* Configure the PCS indirect addressing support */
 -      reg = XPCS32_IOREAD(pdata, PCS_V2_WINDOW_DEF);
 +      reg = XPCS32_IOREAD(pdata, pdata->xpcs_window_def_reg);
        pdata->xpcs_window = XPCS_GET_BITS(reg, PCS_V2_WINDOW_DEF, OFFSET);
        pdata->xpcs_window <<= 6;
        pdata->xpcs_window_size = XPCS_GET_BITS(reg, PCS_V2_WINDOW_DEF, SIZE);
        /* Configure the netdev resource */
        ret = xgbe_config_netdev(pdata);
        if (ret)
-               goto err_pci_enable;
+               goto err_irq_vectors;
  
        netdev_notice(pdata->netdev, "net device enabled\n");
  
        return 0;
  
+ err_irq_vectors:
+       pci_free_irq_vectors(pdata->pcidev);
  err_pci_enable:
        xgbe_free_pdata(pdata);
  
@@@ -446,6 -379,8 +392,8 @@@ static void xgbe_pci_remove(struct pci_
  
        xgbe_deconfig_netdev(pdata);
  
+       pci_free_irq_vectors(pdata->pcidev);
        xgbe_free_pdata(pdata);
  }
  
index 00108815b55eeb1417bd83bea4c9fbb7aa101fe1,99f1c87df818e6bea1d35125ab40d25910b7f03a..f9a24639f5741bdc0d534cd7b155ad50acdb45c1
  #define XGBE_MAC_PROP_OFFSET  0x1d000
  #define XGBE_I2C_CTRL_OFFSET  0x1e000
  
- /* PCI MSIx support */
- #define XGBE_MSIX_BASE_COUNT  4
- #define XGBE_MSIX_MIN_COUNT   (XGBE_MSIX_BASE_COUNT + 1)
+ /* PCI MSI/MSIx support */
+ #define XGBE_MSI_BASE_COUNT   4
+ #define XGBE_MSI_MIN_COUNT    (XGBE_MSI_BASE_COUNT + 1)
  
  /* PCI clock frequencies */
  #define XGBE_V2_DMA_CLOCK_FREQ        500000000       /* 500 MHz */
@@@ -955,8 -955,6 +955,8 @@@ struct xgbe_prv_data 
  
        /* XPCS indirect addressing lock */
        spinlock_t xpcs_lock;
 +      unsigned int xpcs_window_def_reg;
 +      unsigned int xpcs_window_sel_reg;
        unsigned int xpcs_window;
        unsigned int xpcs_window_size;
        unsigned int xpcs_window_mask;
        unsigned int desc_ded_count;
        unsigned int desc_sec_count;
  
-       struct msix_entry *msix_entries;
        int dev_irq;
        int ecc_irq;
        int i2c_irq;
        int channel_irq[XGBE_MAX_DMA_CHANNELS];
  
        unsigned int per_channel_irq;
-       unsigned int irq_shared;
        unsigned int irq_count;
        unsigned int channel_irq_count;
        unsigned int channel_irq_mode;
diff --combined drivers/pci/msi.c
index 7f73bacf13ed9ef212ef5c51d0ab301310be3a75,78e4a1adb6b011389d4c2a17f4d607877e475131..980eaf588281808a8e8e0431b717ec6120d05cf8
@@@ -32,32 -32,13 +32,13 @@@ int pci_msi_ignore_mask
  #define msix_table_size(flags)        ((flags & PCI_MSIX_FLAGS_QSIZE) + 1)
  
  #ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
- static struct irq_domain *pci_msi_default_domain;
- static DEFINE_MUTEX(pci_msi_domain_lock);
- struct irq_domain * __weak arch_get_pci_msi_domain(struct pci_dev *dev)
- {
-       return pci_msi_default_domain;
- }
- static struct irq_domain *pci_msi_get_domain(struct pci_dev *dev)
- {
-       struct irq_domain *domain;
-       domain = dev_get_msi_domain(&dev->dev);
-       if (domain)
-               return domain;
-       return arch_get_pci_msi_domain(dev);
- }
  static int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
  {
        struct irq_domain *domain;
  
-       domain = pci_msi_get_domain(dev);
+       domain = dev_get_msi_domain(&dev->dev);
        if (domain && irq_domain_is_hierarchy(domain))
-               return pci_msi_domain_alloc_irqs(domain, dev, nvec, type);
+               return msi_domain_alloc_irqs(domain, &dev->dev, nvec);
  
        return arch_setup_msi_irqs(dev, nvec, type);
  }
@@@ -66,9 -47,9 +47,9 @@@ static void pci_msi_teardown_msi_irqs(s
  {
        struct irq_domain *domain;
  
-       domain = pci_msi_get_domain(dev);
+       domain = dev_get_msi_domain(&dev->dev);
        if (domain && irq_domain_is_hierarchy(domain))
-               pci_msi_domain_free_irqs(domain, dev);
+               msi_domain_free_irqs(domain, &dev->dev);
        else
                arch_teardown_msi_irqs(dev);
  }
@@@ -379,7 -360,7 +360,7 @@@ static void free_msi_irqs(struct pci_de
                }
  
                list_del(&entry->list);
-               kfree(entry);
+               free_msi_entry(entry);
        }
  
        if (dev->msi_irq_groups) {
@@@ -610,7 -591,7 +591,7 @@@ static int msi_verify_entries(struct pc
   * msi_capability_init - configure device's MSI capability structure
   * @dev: pointer to the pci_dev data structure of MSI device function
   * @nvec: number of interrupts to allocate
-  * @affinity: flag to indicate cpu irq affinity mask should be set
+  * @affd: description of automatic irq affinity assignments (may be %NULL)
   *
   * Setup the MSI capability structure of the device with the requested
   * number of interrupts.  A return value of zero indicates the successful
@@@ -731,7 -712,7 +712,7 @@@ static int msix_setup_entries(struct pc
        ret = 0;
  out:
        kfree(masks);
-       return 0;
+       return ret;
  }
  
  static void msix_program_entries(struct pci_dev *dev,
@@@ -1084,7 -1065,7 +1065,7 @@@ static int __pci_enable_msi_range(struc
        if (nvec < 0)
                return nvec;
        if (nvec < minvec)
-               return -EINVAL;
+               return -ENOSPC;
  
        if (nvec > maxvec)
                nvec = maxvec;
        }
  }
  
- /**
-  * pci_enable_msi_range - configure device's MSI capability structure
-  * @dev: device to configure
-  * @minvec: minimal number of interrupts to configure
-  * @maxvec: maximum number of interrupts to configure
-  *
-  * This function tries to allocate a maximum possible number of interrupts in a
-  * range between @minvec and @maxvec. It returns a negative errno if an error
-  * occurs. If it succeeds, it returns the actual number of interrupts allocated
-  * and updates the @dev's irq member to the lowest new interrupt number;
-  * the other interrupt numbers allocated to this device are consecutive.
-  **/
- int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec)
+ /* deprecated, don't use */
+ int pci_enable_msi(struct pci_dev *dev)
  {
-       return __pci_enable_msi_range(dev, minvec, maxvec, NULL);
+       int rc = __pci_enable_msi_range(dev, 1, 1, NULL);
+       if (rc < 0)
+               return rc;
+       return 0;
  }
- EXPORT_SYMBOL(pci_enable_msi_range);
+ EXPORT_SYMBOL(pci_enable_msi);
  
  static int __pci_enable_msix_range(struct pci_dev *dev,
                                   struct msix_entry *entries, int minvec,
@@@ -1206,16 -1179,6 +1179,16 @@@ int pci_alloc_irq_vectors_affinity(stru
        if (flags & PCI_IRQ_AFFINITY) {
                if (!affd)
                        affd = &msi_default_affd;
 +
 +              if (affd->pre_vectors + affd->post_vectors > min_vecs)
 +                      return -EINVAL;
 +
 +              /*
 +               * If there aren't any vectors left after applying the pre/post
 +               * vectors don't bother with assigning affinity.
 +               */
 +              if (affd->pre_vectors + affd->post_vectors == min_vecs)
 +                      affd = NULL;
        } else {
                if (WARN_ON(affd))
                        affd = NULL;
        }
  
        /* use legacy irq if allowed */
-       if ((flags & PCI_IRQ_LEGACY) && min_vecs == 1) {
-               pci_intx(dev, 1);
-               return 1;
+       if (flags & PCI_IRQ_LEGACY) {
+               if (min_vecs == 1 && dev->irq) {
+                       pci_intx(dev, 1);
+                       return 1;
+               }
        }
  
        return vecs;
@@@ -1391,7 -1356,7 +1366,7 @@@ int pci_msi_domain_check_cap(struct irq
  {
        struct msi_desc *desc = first_pci_msi_entry(to_pci_dev(dev));
  
-       /* Special handling to support pci_enable_msi_range() */
+       /* Special handling to support __pci_enable_msi_range() */
        if (pci_msi_desc_is_multi_msi(desc) &&
            !(info->flags & MSI_FLAG_MULTI_PCI_MSI))
                return 1;
  static int pci_msi_domain_handle_error(struct irq_domain *domain,
                                       struct msi_desc *desc, int error)
  {
-       /* Special handling to support pci_enable_msi_range() */
+       /* Special handling to support __pci_enable_msi_range() */
        if (pci_msi_desc_is_multi_msi(desc) && error == -ENOSPC)
                return 1;
  
@@@ -1491,59 -1456,6 +1466,6 @@@ struct irq_domain *pci_msi_create_irq_d
  }
  EXPORT_SYMBOL_GPL(pci_msi_create_irq_domain);
  
- /**
-  * pci_msi_domain_alloc_irqs - Allocate interrupts for @dev in @domain
-  * @domain:   The interrupt domain to allocate from
-  * @dev:      The device for which to allocate
-  * @nvec:     The number of interrupts to allocate
-  * @type:     Unused to allow simpler migration from the arch_XXX interfaces
-  *
-  * Returns:
-  * A virtual interrupt number or an error code in case of failure
-  */
- int pci_msi_domain_alloc_irqs(struct irq_domain *domain, struct pci_dev *dev,
-                             int nvec, int type)
- {
-       return msi_domain_alloc_irqs(domain, &dev->dev, nvec);
- }
- /**
-  * pci_msi_domain_free_irqs - Free interrupts for @dev in @domain
-  * @domain:   The interrupt domain
-  * @dev:      The device for which to free interrupts
-  */
- void pci_msi_domain_free_irqs(struct irq_domain *domain, struct pci_dev *dev)
- {
-       msi_domain_free_irqs(domain, &dev->dev);
- }
- /**
-  * pci_msi_create_default_irq_domain - Create a default MSI interrupt domain
-  * @fwnode:   Optional fwnode of the interrupt controller
-  * @info:     MSI domain info
-  * @parent:   Parent irq domain
-  *
-  * Returns: A domain pointer or NULL in case of failure. If successful
-  * the default PCI/MSI irqdomain pointer is updated.
-  */
- struct irq_domain *pci_msi_create_default_irq_domain(struct fwnode_handle *fwnode,
-               struct msi_domain_info *info, struct irq_domain *parent)
- {
-       struct irq_domain *domain;
-       mutex_lock(&pci_msi_domain_lock);
-       if (pci_msi_default_domain) {
-               pr_err("PCI: default irq domain for PCI MSI has already been created.\n");
-               domain = NULL;
-       } else {
-               domain = pci_msi_create_irq_domain(fwnode, info, parent);
-               pci_msi_default_domain = domain;
-       }
-       mutex_unlock(&pci_msi_domain_lock);
-       return domain;
- }
  static int get_msi_id_cb(struct pci_dev *pdev, u16 alias, void *data)
  {
        u32 *pa = data;
diff --combined drivers/pci/pci-driver.c
index 63d8e18fb6b143c512f92c4c0a1817bb884bcb04,3e0516ee9eabf9cdaae4264dccd7d5569ef96f40..afa72717a97937cdb5d222dbb292a993fdf5d436
@@@ -381,8 -381,6 +381,6 @@@ static int __pci_device_probe(struct pc
                id = pci_match_device(drv, pci_dev);
                if (id)
                        error = pci_call_probe(drv, pci_dev, id);
-               if (error >= 0)
-                       error = 0;
        }
        return error;
  }
@@@ -1432,11 -1430,6 +1430,11 @@@ static int pci_uevent(struct device *de
        return 0;
  }
  
 +static int pci_bus_num_vf(struct device *dev)
 +{
 +      return pci_num_vf(to_pci_dev(dev));
 +}
 +
  struct bus_type pci_bus_type = {
        .name           = "pci",
        .match          = pci_bus_match,
        .bus_groups     = pci_bus_groups,
        .drv_groups     = pci_drv_groups,
        .pm             = PCI_PM_OPS_PTR,
 +      .num_vf         = pci_bus_num_vf,
  };
  EXPORT_SYMBOL(pci_bus_type);
  
diff --combined drivers/pci/pcie/aspm.c
index 3dd8bcbb3011babd4ad4271d6f6f64733bd9b3f1,a9bcd56e41edbd607897b48fac74f054bfebb7f0..973472c23d89045000cf1119a09867c921f2fdf8
  #define ASPM_STATE_L0S_UP     (1)     /* Upstream direction L0s state */
  #define ASPM_STATE_L0S_DW     (2)     /* Downstream direction L0s state */
  #define ASPM_STATE_L1         (4)     /* L1 state */
+ #define ASPM_STATE_L1_1               (8)     /* ASPM L1.1 state */
+ #define ASPM_STATE_L1_2               (0x10)  /* ASPM L1.2 state */
+ #define ASPM_STATE_L1_1_PCIPM (0x20)  /* PCI PM L1.1 state */
+ #define ASPM_STATE_L1_2_PCIPM (0x40)  /* PCI PM L1.2 state */
+ #define ASPM_STATE_L1_SS_PCIPM        (ASPM_STATE_L1_1_PCIPM | ASPM_STATE_L1_2_PCIPM)
+ #define ASPM_STATE_L1_2_MASK  (ASPM_STATE_L1_2 | ASPM_STATE_L1_2_PCIPM)
+ #define ASPM_STATE_L1SS               (ASPM_STATE_L1_1 | ASPM_STATE_L1_1_PCIPM |\
+                                ASPM_STATE_L1_2_MASK)
  #define ASPM_STATE_L0S                (ASPM_STATE_L0S_UP | ASPM_STATE_L0S_DW)
- #define ASPM_STATE_ALL                (ASPM_STATE_L0S | ASPM_STATE_L1)
+ #define ASPM_STATE_ALL                (ASPM_STATE_L0S | ASPM_STATE_L1 |       \
+                                ASPM_STATE_L1SS)
+ /*
+  * When L1 substates are enabled, the LTR L1.2 threshold is a timing parameter
+  * that decides whether L1.1 or L1.2 is entered (Refer PCIe spec for details).
+  * Not sure is there is a way to "calculate" this on the fly, but maybe we
+  * could turn it into a parameter in future.  This value has been taken from
+  * the following files from Intel's coreboot (which is the only code I found
+  * to have used this):
+  * https://www.coreboot.org/pipermail/coreboot-gerrit/2015-March/021134.html
+  * https://review.coreboot.org/#/c/8832/
+  */
+ #define LTR_L1_2_THRESHOLD_BITS       ((1 << 21) | (1 << 23) | (1 << 30))
  
  struct aspm_latency {
        u32 l0s;                        /* L0s latency (nsec) */
@@@ -40,6 -61,7 +61,7 @@@
  
  struct pcie_link_state {
        struct pci_dev *pdev;           /* Upstream component of the Link */
+       struct pci_dev *downstream;     /* Downstream component, function 0 */
        struct pcie_link_state *root;   /* pointer to the root port link */
        struct pcie_link_state *parent; /* pointer to the parent Link state */
        struct list_head sibling;       /* node in link_list */
        struct list_head link;          /* node in parent's children list */
  
        /* ASPM state */
-       u32 aspm_support:3;             /* Supported ASPM state */
-       u32 aspm_enabled:3;             /* Enabled ASPM state */
-       u32 aspm_capable:3;             /* Capable ASPM state with latency */
-       u32 aspm_default:3;             /* Default ASPM state by BIOS */
-       u32 aspm_disable:3;             /* Disabled ASPM state */
+       u32 aspm_support:7;             /* Supported ASPM state */
+       u32 aspm_enabled:7;             /* Enabled ASPM state */
+       u32 aspm_capable:7;             /* Capable ASPM state with latency */
+       u32 aspm_default:7;             /* Default ASPM state by BIOS */
+       u32 aspm_disable:7;             /* Disabled ASPM state */
  
        /* Clock PM state */
        u32 clkpm_capable:1;            /* Clock PM capable? */
         * has one slot under it, so at most there are 8 functions.
         */
        struct aspm_latency acceptable[8];
+       /* L1 PM Substate info */
+       struct {
+               u32 up_cap_ptr;         /* L1SS cap ptr in upstream dev */
+               u32 dw_cap_ptr;         /* L1SS cap ptr in downstream dev */
+               u32 ctl1;               /* value to be programmed in ctl1 */
+               u32 ctl2;               /* value to be programmed in ctl2 */
+       } l1ss;
  };
  
  static int aspm_disabled, aspm_force;
@@@ -76,11 -106,14 +106,14 @@@ static LIST_HEAD(link_list)
  #define POLICY_DEFAULT 0      /* BIOS default setting */
  #define POLICY_PERFORMANCE 1  /* high performance */
  #define POLICY_POWERSAVE 2    /* high power saving */
+ #define POLICY_POWER_SUPERSAVE 3 /* possibly even more power saving */
  
  #ifdef CONFIG_PCIEASPM_PERFORMANCE
  static int aspm_policy = POLICY_PERFORMANCE;
  #elif defined CONFIG_PCIEASPM_POWERSAVE
  static int aspm_policy = POLICY_POWERSAVE;
+ #elif defined CONFIG_PCIEASPM_POWER_SUPERSAVE
+ static int aspm_policy = POLICY_POWER_SUPERSAVE;
  #else
  static int aspm_policy;
  #endif
  static const char *policy_str[] = {
        [POLICY_DEFAULT] = "default",
        [POLICY_PERFORMANCE] = "performance",
-       [POLICY_POWERSAVE] = "powersave"
+       [POLICY_POWERSAVE] = "powersave",
+       [POLICY_POWER_SUPERSAVE] = "powersupersave"
  };
  
  #define LINK_RETRAIN_TIMEOUT HZ
@@@ -101,6 -135,9 +135,9 @@@ static int policy_to_aspm_state(struct 
                return 0;
        case POLICY_POWERSAVE:
                /* Enable ASPM L0s/L1 */
+               return (ASPM_STATE_L0S | ASPM_STATE_L1);
+       case POLICY_POWER_SUPERSAVE:
+               /* Enable Everything */
                return ASPM_STATE_ALL;
        case POLICY_DEFAULT:
                return link->aspm_default;
@@@ -115,7 -152,8 +152,8 @@@ static int policy_to_clkpm_state(struc
                /* Disable ASPM and Clock PM */
                return 0;
        case POLICY_POWERSAVE:
-               /* Disable Clock PM */
+       case POLICY_POWER_SUPERSAVE:
+               /* Enable Clock PM */
                return 1;
        case POLICY_DEFAULT:
                return link->clkpm_default;
@@@ -278,11 -316,33 +316,33 @@@ static u32 calc_l1_acceptable(u32 encod
        return (1000 << encoding);
  }
  
+ /* Convert L1SS T_pwr encoding to usec */
+ static u32 calc_l1ss_pwron(struct pci_dev *pdev, u32 scale, u32 val)
+ {
+       switch (scale) {
+       case 0:
+               return val * 2;
+       case 1:
+               return val * 10;
+       case 2:
+               return val * 100;
+       }
+       dev_err(&pdev->dev, "%s: Invalid T_PwrOn scale: %u\n",
+               __func__, scale);
+       return 0;
+ }
  struct aspm_register_info {
        u32 support:2;
        u32 enabled:2;
        u32 latency_encoding_l0s;
        u32 latency_encoding_l1;
+       /* L1 substates */
+       u32 l1ss_cap_ptr;
+       u32 l1ss_cap;
+       u32 l1ss_ctl1;
+       u32 l1ss_ctl2;
  };
  
  static void pcie_get_aspm_reg(struct pci_dev *pdev,
        info->latency_encoding_l1  = (reg32 & PCI_EXP_LNKCAP_L1EL) >> 15;
        pcie_capability_read_word(pdev, PCI_EXP_LNKCTL, &reg16);
        info->enabled = reg16 & PCI_EXP_LNKCTL_ASPMC;
+       /* Read L1 PM substate capabilities */
+       info->l1ss_cap = info->l1ss_ctl1 = info->l1ss_ctl2 = 0;
+       info->l1ss_cap_ptr = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_L1SS);
+       if (!info->l1ss_cap_ptr)
+               return;
+       pci_read_config_dword(pdev, info->l1ss_cap_ptr + PCI_L1SS_CAP,
+                             &info->l1ss_cap);
+       if (!(info->l1ss_cap & PCI_L1SS_CAP_L1_PM_SS)) {
+               info->l1ss_cap = 0;
+               return;
+       }
+       pci_read_config_dword(pdev, info->l1ss_cap_ptr + PCI_L1SS_CTL1,
+                             &info->l1ss_ctl1);
+       pci_read_config_dword(pdev, info->l1ss_cap_ptr + PCI_L1SS_CTL2,
+                             &info->l1ss_ctl2);
  }
  
  static void pcie_aspm_check_latency(struct pci_dev *endpoint)
                 * Check L1 latency.
                 * Every switch on the path to root complex need 1
                 * more microsecond for L1. Spec doesn't mention L0s.
+                *
+                * The exit latencies for L1 substates are not advertised
+                * by a device.  Since the spec also doesn't mention a way
+                * to determine max latencies introduced by enabling L1
+                * substates on the components, it is not clear how to do
+                * a L1 substate exit latency check.  We assume that the
+                * L1 exit latencies advertised by a device include L1
+                * substate latencies (and hence do not do any check).
                 */
                latency = max_t(u32, link->latency_up.l1, link->latency_dw.l1);
                if ((link->aspm_capable & ASPM_STATE_L1) &&
        }
  }
  
+ /*
+  * The L1 PM substate capability is only implemented in function 0 in a
+  * multi function device.
+  */
+ static struct pci_dev *pci_function_0(struct pci_bus *linkbus)
+ {
+       struct pci_dev *child;
+       list_for_each_entry(child, &linkbus->devices, bus_list)
+               if (PCI_FUNC(child->devfn) == 0)
+                       return child;
+       return NULL;
+ }
+ /* Calculate L1.2 PM substate timing parameters */
+ static void aspm_calc_l1ss_info(struct pcie_link_state *link,
+                               struct aspm_register_info *upreg,
+                               struct aspm_register_info *dwreg)
+ {
+       u32 val1, val2, scale1, scale2;
+       link->l1ss.up_cap_ptr = upreg->l1ss_cap_ptr;
+       link->l1ss.dw_cap_ptr = dwreg->l1ss_cap_ptr;
+       link->l1ss.ctl1 = link->l1ss.ctl2 = 0;
+       if (!(link->aspm_support & ASPM_STATE_L1_2_MASK))
+               return;
+       /* Choose the greater of the two T_cmn_mode_rstr_time */
+       val1 = (upreg->l1ss_cap >> 8) & 0xFF;
+       val2 = (upreg->l1ss_cap >> 8) & 0xFF;
+       if (val1 > val2)
+               link->l1ss.ctl1 |= val1 << 8;
+       else
+               link->l1ss.ctl1 |= val2 << 8;
+       /*
+        * We currently use LTR L1.2 threshold to be fixed constant picked from
+        * Intel's coreboot.
+        */
+       link->l1ss.ctl1 |= LTR_L1_2_THRESHOLD_BITS;
+       /* Choose the greater of the two T_pwr_on */
+       val1 = (upreg->l1ss_cap >> 19) & 0x1F;
+       scale1 = (upreg->l1ss_cap >> 16) & 0x03;
+       val2 = (dwreg->l1ss_cap >> 19) & 0x1F;
+       scale2 = (dwreg->l1ss_cap >> 16) & 0x03;
+       if (calc_l1ss_pwron(link->pdev, scale1, val1) >
+           calc_l1ss_pwron(link->downstream, scale2, val2))
+               link->l1ss.ctl2 |= scale1 | (val1 << 3);
+       else
+               link->l1ss.ctl2 |= scale2 | (val2 << 3);
+ }
  static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist)
  {
        struct pci_dev *child, *parent = link->pdev;
  
        /* Get upstream/downstream components' register state */
        pcie_get_aspm_reg(parent, &upreg);
-       child = list_entry(linkbus->devices.next, struct pci_dev, bus_list);
+       child = pci_function_0(linkbus);
        pcie_get_aspm_reg(child, &dwreg);
+       link->downstream = child;
  
        /*
         * If ASPM not supported, don't mess with the clocks and link,
        link->latency_up.l1 = calc_l1_latency(upreg.latency_encoding_l1);
        link->latency_dw.l1 = calc_l1_latency(dwreg.latency_encoding_l1);
  
+       /* Setup L1 substate */
+       if (upreg.l1ss_cap & dwreg.l1ss_cap & PCI_L1SS_CAP_ASPM_L1_1)
+               link->aspm_support |= ASPM_STATE_L1_1;
+       if (upreg.l1ss_cap & dwreg.l1ss_cap & PCI_L1SS_CAP_ASPM_L1_2)
+               link->aspm_support |= ASPM_STATE_L1_2;
+       if (upreg.l1ss_cap & dwreg.l1ss_cap & PCI_L1SS_CAP_PCIPM_L1_1)
+               link->aspm_support |= ASPM_STATE_L1_1_PCIPM;
+       if (upreg.l1ss_cap & dwreg.l1ss_cap & PCI_L1SS_CAP_PCIPM_L1_2)
+               link->aspm_support |= ASPM_STATE_L1_2_PCIPM;
+       if (upreg.l1ss_ctl1 & dwreg.l1ss_ctl1 & PCI_L1SS_CTL1_ASPM_L1_1)
+               link->aspm_enabled |= ASPM_STATE_L1_1;
+       if (upreg.l1ss_ctl1 & dwreg.l1ss_ctl1 & PCI_L1SS_CTL1_ASPM_L1_2)
+               link->aspm_enabled |= ASPM_STATE_L1_2;
+       if (upreg.l1ss_ctl1 & dwreg.l1ss_ctl1 & PCI_L1SS_CTL1_PCIPM_L1_1)
+               link->aspm_enabled |= ASPM_STATE_L1_1_PCIPM;
+       if (upreg.l1ss_ctl1 & dwreg.l1ss_ctl1 & PCI_L1SS_CTL1_PCIPM_L1_2)
+               link->aspm_enabled |= ASPM_STATE_L1_2_PCIPM;
+       if (link->aspm_support & ASPM_STATE_L1SS)
+               aspm_calc_l1ss_info(link, &upreg, &dwreg);
        /* Save default state */
        link->aspm_default = link->aspm_enabled;
  
        }
  }
  
+ static void pci_clear_and_set_dword(struct pci_dev *pdev, int pos,
+                                   u32 clear, u32 set)
+ {
+       u32 val;
+       pci_read_config_dword(pdev, pos, &val);
+       val &= ~clear;
+       val |= set;
+       pci_write_config_dword(pdev, pos, val);
+ }
+ /* Configure the ASPM L1 substates */
+ static void pcie_config_aspm_l1ss(struct pcie_link_state *link, u32 state)
+ {
+       u32 val, enable_req;
+       struct pci_dev *child = link->downstream, *parent = link->pdev;
+       u32 up_cap_ptr = link->l1ss.up_cap_ptr;
+       u32 dw_cap_ptr = link->l1ss.dw_cap_ptr;
+       enable_req = (link->aspm_enabled ^ state) & state;
+       /*
+        * Here are the rules specified in the PCIe spec for enabling L1SS:
+        * - When enabling L1.x, enable bit at parent first, then at child
+        * - When disabling L1.x, disable bit at child first, then at parent
+        * - When enabling ASPM L1.x, need to disable L1
+        *   (at child followed by parent).
+        * - The ASPM/PCIPM L1.2 must be disabled while programming timing
+        *   parameters
+        *
+        * To keep it simple, disable all L1SS bits first, and later enable
+        * what is needed.
+        */
+       /* Disable all L1 substates */
+       pci_clear_and_set_dword(child, dw_cap_ptr + PCI_L1SS_CTL1,
+                               PCI_L1SS_CTL1_L1SS_MASK, 0);
+       pci_clear_and_set_dword(parent, up_cap_ptr + PCI_L1SS_CTL1,
+                               PCI_L1SS_CTL1_L1SS_MASK, 0);
+       /*
+        * If needed, disable L1, and it gets enabled later
+        * in pcie_config_aspm_link().
+        */
+       if (enable_req & (ASPM_STATE_L1_1 | ASPM_STATE_L1_2)) {
+               pcie_capability_clear_and_set_word(child, PCI_EXP_LNKCTL,
+                                                  PCI_EXP_LNKCTL_ASPM_L1, 0);
+               pcie_capability_clear_and_set_word(parent, PCI_EXP_LNKCTL,
+                                                  PCI_EXP_LNKCTL_ASPM_L1, 0);
+       }
+       if (enable_req & ASPM_STATE_L1_2_MASK) {
+               /* Program T_pwr_on in both ports */
+               pci_write_config_dword(parent, up_cap_ptr + PCI_L1SS_CTL2,
+                                      link->l1ss.ctl2);
+               pci_write_config_dword(child, dw_cap_ptr + PCI_L1SS_CTL2,
+                                      link->l1ss.ctl2);
+               /* Program T_cmn_mode in parent */
+               pci_clear_and_set_dword(parent, up_cap_ptr + PCI_L1SS_CTL1,
+                                       0xFF00, link->l1ss.ctl1);
+               /* Program LTR L1.2 threshold in both ports */
+               pci_clear_and_set_dword(parent, dw_cap_ptr + PCI_L1SS_CTL1,
+                                       0xE3FF0000, link->l1ss.ctl1);
+               pci_clear_and_set_dword(child, dw_cap_ptr + PCI_L1SS_CTL1,
+                                       0xE3FF0000, link->l1ss.ctl1);
+       }
+       val = 0;
+       if (state & ASPM_STATE_L1_1)
+               val |= PCI_L1SS_CTL1_ASPM_L1_1;
+       if (state & ASPM_STATE_L1_2)
+               val |= PCI_L1SS_CTL1_ASPM_L1_2;
+       if (state & ASPM_STATE_L1_1_PCIPM)
+               val |= PCI_L1SS_CTL1_PCIPM_L1_1;
+       if (state & ASPM_STATE_L1_2_PCIPM)
+               val |= PCI_L1SS_CTL1_PCIPM_L1_2;
+       /* Enable what we need to enable */
+       pci_clear_and_set_dword(parent, up_cap_ptr + PCI_L1SS_CTL1,
+                               PCI_L1SS_CAP_L1_PM_SS, val);
+       pci_clear_and_set_dword(child, dw_cap_ptr + PCI_L1SS_CTL1,
+                               PCI_L1SS_CAP_L1_PM_SS, val);
+ }
  static void pcie_config_aspm_dev(struct pci_dev *pdev, u32 val)
  {
        pcie_capability_clear_and_set_word(pdev, PCI_EXP_LNKCTL,
  static void pcie_config_aspm_link(struct pcie_link_state *link, u32 state)
  {
        u32 upstream = 0, dwstream = 0;
-       struct pci_dev *child, *parent = link->pdev;
+       struct pci_dev *child = link->downstream, *parent = link->pdev;
        struct pci_bus *linkbus = parent->subordinate;
  
-       /* Nothing to do if the link is already in the requested state */
+       /* Enable only the states that were not explicitly disabled */
        state &= (link->aspm_capable & ~link->aspm_disable);
+       /* Can't enable any substates if L1 is not enabled */
+       if (!(state & ASPM_STATE_L1))
+               state &= ~ASPM_STATE_L1SS;
+       /* Spec says both ports must be in D0 before enabling PCI PM substates*/
+       if (parent->current_state != PCI_D0 || child->current_state != PCI_D0) {
+               state &= ~ASPM_STATE_L1_SS_PCIPM;
+               state |= (link->aspm_enabled & ASPM_STATE_L1_SS_PCIPM);
+       }
+       /* Nothing to do if the link is already in the requested state */
        if (link->aspm_enabled == state)
                return;
        /* Convert ASPM state to upstream/downstream ASPM register state */
                upstream |= PCI_EXP_LNKCTL_ASPM_L1;
                dwstream |= PCI_EXP_LNKCTL_ASPM_L1;
        }
+       if (link->aspm_capable & ASPM_STATE_L1SS)
+               pcie_config_aspm_l1ss(link, state);
        /*
         * Spec 2.0 suggests all functions should be configured the
         * same setting for ASPM. Enabling ASPM L1 should be done in
@@@ -532,32 -795,25 +795,32 @@@ static struct pcie_link_state *alloc_pc
        link = kzalloc(sizeof(*link), GFP_KERNEL);
        if (!link)
                return NULL;
 +
        INIT_LIST_HEAD(&link->sibling);
        INIT_LIST_HEAD(&link->children);
        INIT_LIST_HEAD(&link->link);
        link->pdev = pdev;
 -      if (pci_pcie_type(pdev) != PCI_EXP_TYPE_ROOT_PORT) {
 +
 +      /*
 +       * Root Ports and PCI/PCI-X to PCIe Bridges are roots of PCIe
 +       * hierarchies.
 +       */
 +      if (pci_pcie_type(pdev) == PCI_EXP_TYPE_ROOT_PORT ||
 +          pci_pcie_type(pdev) == PCI_EXP_TYPE_PCIE_BRIDGE) {
 +              link->root = link;
 +      } else {
                struct pcie_link_state *parent;
 +
                parent = pdev->bus->parent->self->link_state;
                if (!parent) {
                        kfree(link);
                        return NULL;
                }
 +
                link->parent = parent;
 +              link->root = link->parent->root;
                list_add(&link->link, &parent->children);
        }
 -      /* Setup a pointer to the root port link */
 -      if (!link->parent)
 -              link->root = link;
 -      else
 -              link->root = link->parent->root;
  
        list_add(&link->sibling, &link_list);
        pdev->link_state = link;
@@@ -619,7 -875,8 +882,8 @@@ void pcie_aspm_init_link_state(struct p
         * the BIOS's expectation, we'll do so once pci_enable_device() is
         * called.
         */
-       if (aspm_policy != POLICY_POWERSAVE) {
+       if (aspm_policy != POLICY_POWERSAVE &&
+           aspm_policy != POLICY_POWER_SUPERSAVE) {
                pcie_config_aspm_path(link);
                pcie_set_clkpm(link, policy_to_clkpm_state(link));
        }
@@@ -719,7 -976,8 +983,8 @@@ void pcie_aspm_powersave_config_link(st
        if (aspm_disabled || !link)
                return;
  
-       if (aspm_policy != POLICY_POWERSAVE)
+       if (aspm_policy != POLICY_POWERSAVE &&
+           aspm_policy != POLICY_POWER_SUPERSAVE)
                return;
  
        down_read(&pci_bus_sem);
diff --combined drivers/pci/probe.c
index 204960e70333f1dbe49d03ffffac7393f06a37c4,3abc94212197f65c136e2fd240f03dd1dce8bba7..dfc9a27941418976c0fadee7e6628531fbb47613
@@@ -1169,7 -1169,6 +1169,7 @@@ void set_pcie_port_type(struct pci_dev 
        pos = pci_find_capability(pdev, PCI_CAP_ID_EXP);
        if (!pos)
                return;
 +
        pdev->pcie_cap = pos;
        pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, &reg16);
        pdev->pcie_flags_reg = reg16;
        pdev->pcie_mpss = reg16 & PCI_EXP_DEVCAP_PAYLOAD;
  
        /*
 -       * A Root Port is always the upstream end of a Link.  No PCIe
 -       * component has two Links.  Two Links are connected by a Switch
 -       * that has a Port on each Link and internal logic to connect the
 -       * two Ports.
 +       * A Root Port or a PCI-to-PCIe bridge is always the upstream end
 +       * of a Link.  No PCIe component has two Links.  Two Links are
 +       * connected by a Switch that has a Port on each Link and internal
 +       * logic to connect the two Ports.
         */
        type = pci_pcie_type(pdev);
 -      if (type == PCI_EXP_TYPE_ROOT_PORT)
 +      if (type == PCI_EXP_TYPE_ROOT_PORT ||
 +          type == PCI_EXP_TYPE_PCIE_BRIDGE)
                pdev->has_secondary_link = 1;
        else if (type == PCI_EXP_TYPE_UPSTREAM ||
                 type == PCI_EXP_TYPE_DOWNSTREAM) {
@@@ -1556,8 -1554,16 +1556,16 @@@ static void program_hpp_type0(struct pc
  
  static void program_hpp_type1(struct pci_dev *dev, struct hpp_type1 *hpp)
  {
-       if (hpp)
-               dev_warn(&dev->dev, "PCI-X settings not supported\n");
+       int pos;
+       if (!hpp)
+               return;
+       pos = pci_find_capability(dev, PCI_CAP_ID_PCIX);
+       if (!pos)
+               return;
+       dev_warn(&dev->dev, "PCI-X settings not supported\n");
  }
  
  static bool pcie_root_rcb_set(struct pci_dev *dev)
@@@ -1583,6 -1589,9 +1591,9 @@@ static void program_hpp_type2(struct pc
        if (!hpp)
                return;
  
+       if (!pci_is_pcie(dev))
+               return;
        if (hpp->revision > 1) {
                dev_warn(&dev->dev, "PCIe settings rev %d not supported\n",
                         hpp->revision);
         */
  }
  
+ static void pci_configure_extended_tags(struct pci_dev *dev)
+ {
+       u32 dev_cap;
+       int ret;
+       if (!pci_is_pcie(dev))
+               return;
+       ret = pcie_capability_read_dword(dev, PCI_EXP_DEVCAP, &dev_cap);
+       if (ret)
+               return;
+       if (dev_cap & PCI_EXP_DEVCAP_EXT_TAG)
+               pcie_capability_set_word(dev, PCI_EXP_DEVCTL,
+                                        PCI_EXP_DEVCTL_EXT_TAG);
+ }
  static void pci_configure_device(struct pci_dev *dev)
  {
        struct hotplug_params hpp;
        int ret;
  
        pci_configure_mps(dev);
+       pci_configure_extended_tags(dev);
  
        memset(&hpp, 0, sizeof(hpp));
        ret = pci_get_hp_params(dev, &hpp);
diff --combined drivers/phy/Kconfig
index bb5cf6f49b068761db557067cdeeea5013773d36,bbad035c60cc3dcf573a069c6338075c31afc803..dc5277ad1b5a7a5a7b27a7329f0f6382587e6050
@@@ -331,6 -331,14 +331,14 @@@ config PHY_EXYNOS5_USBDR
          This driver provides PHY interface for USB 3.0 DRD controller
          present on Exynos5 SoC series.
  
+ config PHY_EXYNOS_PCIE
+       bool "Exynos PCIe PHY driver"
+       depends on OF && (ARCH_EXYNOS || COMPILE_TEST)
+       select GENERIC_PHY
+       help
+         Enable PCIe PHY support for Exynos SoC series.
+         This driver provides PHY interface for Exynos PCIe controller.
  config PHY_PISTACHIO_USB
        tristate "IMG Pistachio USB2.0 PHY driver"
        depends on MACH_PISTACHIO
@@@ -363,7 -371,6 +371,7 @@@ config PHY_ROCKCHIP_INNO_USB
        tristate "Rockchip INNO USB2PHY Driver"
        depends on (ARCH_ROCKCHIP || COMPILE_TEST) && OF
        depends on COMMON_CLK
 +      depends on EXTCON
        depends on USB_SUPPORT
        select GENERIC_PHY
        select USB_COMMON
@@@ -438,21 -445,6 +446,21 @@@ config PHY_QCOM_UF
        help
          Support for UFS PHY on QCOM chipsets.
  
 +config PHY_QCOM_USB_HS
 +      tristate "Qualcomm USB HS PHY module"
 +      depends on USB_ULPI_BUS
 +      select GENERIC_PHY
 +      help
 +        Support for the USB high-speed ULPI compliant phy on Qualcomm
 +        chipsets.
 +
 +config PHY_QCOM_USB_HSIC
 +      tristate "Qualcomm USB HSIC ULPI PHY module"
 +      depends on USB_ULPI_BUS
 +      select GENERIC_PHY
 +      help
 +        Support for the USB HSIC ULPI compliant PHY on QCOM chipsets.
 +
  config PHY_TUSB1210
        tristate "TI TUSB1210 ULPI PHY module"
        depends on USB_ULPI_BUS
@@@ -502,12 -494,4 +510,12 @@@ config PHY_MESON8B_USB
          and GXBB SoCs.
          If unsure, say N.
  
 +config PHY_NSP_USB3
 +      tristate "Broadcom NorthStar plus USB3 PHY driver"
 +      depends on OF && (ARCH_BCM_NSP || COMPILE_TEST)
 +      select GENERIC_PHY
 +      default ARCH_BCM_NSP
 +      help
 +        Enable this to support the Broadcom Northstar plus USB3 PHY.
 +        If unsure, say N.
  endmenu
diff --combined drivers/phy/Makefile
index 9f008004f75d002c87aa7b8a6cf43d3a8ac5ed81,081aeb4efd1308316cd95a56c031a3d5fb29565d..e7b0feb1e125a58c25fb96e784deae62bfb891e7
@@@ -37,6 -37,7 +37,7 @@@ phy-exynos-usb2-$(CONFIG_PHY_EXYNOS4X12
  phy-exynos-usb2-$(CONFIG_PHY_EXYNOS5250_USB2) += phy-exynos5250-usb2.o
  phy-exynos-usb2-$(CONFIG_PHY_S5PV210_USB2)    += phy-s5pv210-usb2.o
  obj-$(CONFIG_PHY_EXYNOS5_USBDRD)      += phy-exynos5-usbdrd.o
+ obj-$(CONFIG_PHY_EXYNOS_PCIE) += phy-exynos-pcie.o
  obj-$(CONFIG_PHY_QCOM_APQ8064_SATA)   += phy-qcom-apq8064-sata.o
  obj-$(CONFIG_PHY_ROCKCHIP_USB) += phy-rockchip-usb.o
  obj-$(CONFIG_PHY_ROCKCHIP_INNO_USB2)  += phy-rockchip-inno-usb2.o
@@@ -52,8 -53,6 +53,8 @@@ obj-$(CONFIG_PHY_STIH407_USB)         += phy-s
  obj-$(CONFIG_PHY_QCOM_UFS)    += phy-qcom-ufs.o
  obj-$(CONFIG_PHY_QCOM_UFS)    += phy-qcom-ufs-qmp-20nm.o
  obj-$(CONFIG_PHY_QCOM_UFS)    += phy-qcom-ufs-qmp-14nm.o
 +obj-$(CONFIG_PHY_QCOM_USB_HS)                 += phy-qcom-usb-hs.o
 +obj-$(CONFIG_PHY_QCOM_USB_HSIC)       += phy-qcom-usb-hsic.o
  obj-$(CONFIG_PHY_TUSB1210)            += phy-tusb1210.o
  obj-$(CONFIG_PHY_BRCM_SATA)           += phy-brcm-sata.o
  obj-$(CONFIG_PHY_PISTACHIO_USB)               += phy-pistachio-usb.o
@@@ -61,4 -60,3 +62,4 @@@ obj-$(CONFIG_PHY_CYGNUS_PCIE)         += phy-b
  obj-$(CONFIG_ARCH_TEGRA) += tegra/
  obj-$(CONFIG_PHY_NS2_PCIE)            += phy-bcm-ns2-pcie.o
  obj-$(CONFIG_PHY_MESON8B_USB2)                += phy-meson8b-usb2.o
 +obj-$(CONFIG_PHY_NSP_USB3)            += phy-bcm-nsp-usb3.o
diff --combined include/linux/msi.h
index a83b84ff70e52c88d131593e2ff90451da63cfdd,1b6f3ebbe876fea9599b22e9a5d7a776f5e178ad..df6d59201d31d9c7dd8e6e00a5fb113973d893f1
@@@ -17,13 -17,7 +17,13 @@@ struct msi_desc
  struct pci_dev;
  struct platform_msi_priv_data;
  void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
 +#ifdef CONFIG_GENERIC_MSI_IRQ
  void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg);
 +#else
 +static inline void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg)
 +{
 +}
 +#endif
  
  typedef void (*irq_write_msi_msg_t)(struct msi_desc *desc,
                                    struct msi_msg *msg);
@@@ -122,15 -116,11 +122,15 @@@ struct msi_desc 
  
  struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc);
  void *msi_desc_to_pci_sysdata(struct msi_desc *desc);
 +void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg);
  #else /* CONFIG_PCI_MSI */
  static inline void *msi_desc_to_pci_sysdata(struct msi_desc *desc)
  {
        return NULL;
  }
 +static inline void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg)
 +{
 +}
  #endif /* CONFIG_PCI_MSI */
  
  struct msi_desc *alloc_msi_entry(struct device *dev, int nvec,
  void free_msi_entry(struct msi_desc *entry);
  void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
  void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
 -void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg);
  
  u32 __pci_msix_desc_mask_irq(struct msi_desc *desc, u32 flag);
  u32 __pci_msi_desc_mask_irq(struct msi_desc *desc, u32 mask, u32 flag);
@@@ -325,12 -316,6 +325,6 @@@ void pci_msi_domain_write_msg(struct ir
  struct irq_domain *pci_msi_create_irq_domain(struct fwnode_handle *fwnode,
                                             struct msi_domain_info *info,
                                             struct irq_domain *parent);
- int pci_msi_domain_alloc_irqs(struct irq_domain *domain, struct pci_dev *dev,
-                             int nvec, int type);
- void pci_msi_domain_free_irqs(struct irq_domain *domain, struct pci_dev *dev);
- struct irq_domain *pci_msi_create_default_irq_domain(struct fwnode_handle *fwnode,
-                struct msi_domain_info *info, struct irq_domain *parent);
  irq_hw_number_t pci_msi_domain_calc_hwirq(struct pci_dev *dev,
                                          struct msi_desc *desc);
  int pci_msi_domain_check_cap(struct irq_domain *domain,
diff --combined include/linux/pci.h
index adbc859fe7c4c0abd2cea97a312d515e83695af9,6732d327c2d66acf7c1c6d73d36d70ded6b6a6ab..282ed32244ce793ae3f97a13dd7bc0e521d4a926
@@@ -678,9 -678,6 +678,6 @@@ struct pci_error_handlers 
        /* MMIO has been re-enabled, but not DMA */
        pci_ers_result_t (*mmio_enabled)(struct pci_dev *dev);
  
-       /* PCI Express link has been reset */
-       pci_ers_result_t (*link_reset)(struct pci_dev *dev);
        /* PCI slot has been reset */
        pci_ers_result_t (*slot_reset)(struct pci_dev *dev);
  
@@@ -885,6 -882,7 +882,6 @@@ void pcibios_setup_bridge(struct pci_bu
  void pci_sort_breadthfirst(void);
  #define dev_is_pci(d) ((d)->bus == &pci_bus_type)
  #define dev_is_pf(d) ((dev_is_pci(d) ? to_pci_dev(d)->is_physfn : false))
 -#define dev_num_vf(d) ((dev_is_pci(d) ? pci_num_vf(to_pci_dev(d)) : 0))
  
  /* Generic PCI functions exported to card drivers */
  
@@@ -1308,14 -1306,7 +1305,7 @@@ void pci_msix_shutdown(struct pci_dev *
  void pci_disable_msix(struct pci_dev *dev);
  void pci_restore_msi_state(struct pci_dev *dev);
  int pci_msi_enabled(void);
- int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec);
- static inline int pci_enable_msi_exact(struct pci_dev *dev, int nvec)
- {
-       int rc = pci_enable_msi_range(dev, nvec, nvec);
-       if (rc < 0)
-               return rc;
-       return 0;
- }
+ int pci_enable_msi(struct pci_dev *dev);
  int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
                          int minvec, int maxvec);
  static inline int pci_enable_msix_exact(struct pci_dev *dev,
@@@ -1346,10 -1337,7 +1336,7 @@@ static inline void pci_msix_shutdown(st
  static inline void pci_disable_msix(struct pci_dev *dev) { }
  static inline void pci_restore_msi_state(struct pci_dev *dev) { }
  static inline int pci_msi_enabled(void) { return 0; }
- static inline int pci_enable_msi_range(struct pci_dev *dev, int minvec,
-                                      int maxvec)
- { return -ENOSYS; }
- static inline int pci_enable_msi_exact(struct pci_dev *dev, int nvec)
+ static inline int pci_enable_msi(struct pci_dev *dev)
  { return -ENOSYS; }
  static inline int pci_enable_msix_range(struct pci_dev *dev,
                      struct msix_entry *entries, int minvec, int maxvec)
@@@ -1425,8 -1413,6 +1412,6 @@@ static inline void pcie_set_ecrc_checki
  static inline void pcie_ecrc_get_policy(char *str) { }
  #endif
  
- #define pci_enable_msi(pdev)  pci_enable_msi_exact(pdev, 1)
  #ifdef CONFIG_HT_IRQ
  /* The functions a driver should call */
  int  ht_create_irq(struct pci_dev *dev, int idx);
@@@ -1629,6 -1615,7 +1614,6 @@@ static inline int pci_get_new_domain_nr
  
  #define dev_is_pci(d) (false)
  #define dev_is_pf(d) (false)
 -#define dev_num_vf(d) (0)
  #endif /* CONFIG_PCI */
  
  /* Include architecture-dependent settings and functions */