Merge tag 'pci-v4.13-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaa...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 8 Jul 2017 22:51:57 +0000 (15:51 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 8 Jul 2017 22:51:57 +0000 (15:51 -0700)
Pull PCI updates from Bjorn Helgaas:

  - add sysfs max_link_speed/width, current_link_speed/width (Wong Vee
    Khee)

  - make host bridge IRQ mapping much more generic (Matthew Minter,
    Lorenzo Pieralisi)

  - convert most drivers to pci_scan_root_bus_bridge() (Lorenzo
    Pieralisi)

  - mutex sriov_configure() (Jakub Kicinski)

  - mutex pci_error_handlers callbacks (Christoph Hellwig)

  - split ->reset_notify() into ->reset_prepare()/reset_done()
    (Christoph Hellwig)

  - support multiple PCIe portdrv interrupts for MSI as well as MSI-X
    (Gabriele Paoloni)

  - allocate MSI/MSI-X vector for Downstream Port Containment (Gabriele
    Paoloni)

  - fix MSI IRQ affinity pre/post/min_vecs issue (Michael Hernandez)

  - test INTx masking during enumeration, not at run-time (Piotr Gregor)

  - avoid using device_may_wakeup() for runtime PM (Rafael J. Wysocki)

  - restore the status of PCI devices across hibernation (Chen Yu)

  - keep parent resources that start at 0x0 (Ard Biesheuvel)

  - enable ECRC only if device supports it (Bjorn Helgaas)

  - restore PRI and PASID state after Function-Level Reset (CQ Tang)

  - skip DPC event if device is not present (Keith Busch)

  - check domain when matching SMBIOS info (Sujith Pandel)

  - mark Intel XXV710 NIC INTx masking as broken (Alex Williamson)

  - avoid AMD SB7xx EHCI USB wakeup defect (Kai-Heng Feng)

  - work around long-standing Macbook Pro poweroff issue (Bjorn Helgaas)

  - add Switchtec "running" status flag (Logan Gunthorpe)

  - fix dra7xx incorrect RW1C IRQ register usage (Arvind Yadav)

  - modify xilinx-nwl IRQ chip for legacy interrupts (Bharat Kumar
    Gogada)

  - move VMD SRCU cleanup after bus, child device removal (Jon Derrick)

  - add Faraday clock handling (Linus Walleij)

  - configure Rockchip MPS and reorganize (Shawn Lin)

  - limit Qualcomm TLP size to 2K (hardware issue) (Srinivas Kandagatla)

  - support Tegra MSI 64-bit addressing (Thierry Reding)

  - use Rockchip normal (not privileged) register bank (Shawn Lin)

  - add HiSilicon Kirin SoC PCIe controller driver (Xiaowei Song)

  - add Sigma Designs Tango SMP8759 PCIe controller driver (Marc
    Gonzalez)

  - add MediaTek PCIe host controller support (Ryder Lee)

  - add Qualcomm IPQ4019 support (John Crispin)

  - add HyperV vPCI protocol v1.2 support (Jork Loeser)

  - add i.MX6 regulator support (Quentin Schulz)

* tag 'pci-v4.13-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci: (113 commits)
  PCI: tango: Add Sigma Designs Tango SMP8759 PCIe host bridge support
  PCI: Add DT binding for Sigma Designs Tango PCIe controller
  PCI: rockchip: Use normal register bank for config accessors
  dt-bindings: PCI: Add documentation for MediaTek PCIe
  PCI: Remove __pci_dev_reset() and pci_dev_reset()
  PCI: Split ->reset_notify() method into ->reset_prepare() and ->reset_done()
  PCI: xilinx: Make of_device_ids const
  PCI: xilinx-nwl: Modify IRQ chip for legacy interrupts
  PCI: vmd: Move SRCU cleanup after bus, child device removal
  PCI: vmd: Correct comment: VMD domains start at 0x10000, not 0x1000
  PCI: versatile: Add local struct device pointers
  PCI: tegra: Do not allocate MSI target memory
  PCI: tegra: Support MSI 64-bit addressing
  PCI: rockchip: Use local struct device pointer consistently
  PCI: rockchip: Check for clk_prepare_enable() errors during resume
  MAINTAINERS: Remove Wenrui Li as Rockchip PCIe driver maintainer
  PCI: rockchip: Configure RC's MPS setting
  PCI: rockchip: Reconfigure configuration space header type
  PCI: rockchip: Split out rockchip_pcie_cfg_configuration_accesses()
  PCI: rockchip: Move configuration accesses into rockchip_pcie_cfg_atu()
  ...

17 files changed:
1  2 
Documentation/driver-model/devres.txt
MAINTAINERS
arch/arm64/kernel/pci.c
arch/x86/include/uapi/asm/hyperv.h
arch/x86/pci/common.c
drivers/gpu/drm/radeon/radeon_device.c
drivers/net/wireless/marvell/mwifiex/pcie.c
drivers/nvme/host/pci.c
drivers/pci/host/vmd.c
drivers/pci/msi.c
drivers/pci/pci-driver.c
drivers/pci/pci-label.c
drivers/pci/pci.c
drivers/pci/pci.h
include/linux/interrupt.h
include/linux/pci.h
kernel/irq/affinity.c

Simple merge
diff --cc MAINTAINERS
Simple merge
Simple merge
Simple merge
Simple merge
index 0a6444d72000c434a6b494229a75c1a7d3e41631,aecaafbc84177abaa8128543a0626237ca2b0a94..997131d58c7f639f8dbb765e51433a35a7da27ba
@@@ -136,12 -135,6 +135,10 @@@ static struct radeon_px_quirk radeon_px
         * https://bugzilla.kernel.org/show_bug.cgi?id=51381
         */
        { PCI_VENDOR_ID_ATI, 0x6840, 0x1043, 0x2122, RADEON_PX_QUIRK_DISABLE_PX },
-       /* macbook pro 8.2 */
-       { PCI_VENDOR_ID_ATI, 0x6741, PCI_VENDOR_ID_APPLE, 0x00e2, RADEON_PX_QUIRK_LONG_WAKEUP },
 +      /* Asus K53TK laptop with AMD A6-3420M APU and Radeon 7670m GPU
 +       * https://bugs.freedesktop.org/show_bug.cgi?id=101491
 +       */
 +      { PCI_VENDOR_ID_ATI, 0x6741, 0x1043, 0x2122, RADEON_PX_QUIRK_DISABLE_PX },
        { 0, 0, 0, 0, 0 },
  };
  
index b53ecf1edddae1f1c7966f23cd2d2d2aa5ba9335,279adf124fc9613f96346ebfde55d0e9ea8d56ff..21f2201405d1aa604e4fe6c0f518482997a0f4a9
@@@ -359,35 -361,48 +361,46 @@@ static void mwifiex_pcie_reset_prepare(
        }
  
        mwifiex_dbg(adapter, INFO,
-                   "%s: vendor=0x%4.04x device=0x%4.04x rev=%d %s\n",
-                   __func__, pdev->vendor, pdev->device,
-                   pdev->revision,
-                   prepare ? "Pre-FLR" : "Post-FLR");
-       if (prepare) {
-               /* Kernel would be performing FLR after this notification.
-                * Cleanup all software without cleaning anything related to
-                * PCIe and HW.
-                */
-               mwifiex_shutdown_sw(adapter);
-               clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &card->work_flags);
-               clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags);
-       } else {
-               /* Kernel stores and restores PCIe function context before and
-                * after performing FLR respectively. Reconfigure the software
-                * and firmware including firmware redownload
-                */
-               ret = mwifiex_reinit_sw(adapter);
-               if (ret) {
-                       dev_err(&pdev->dev, "reinit failed: %d\n", ret);
-                       return;
-               }
-       }
+                   "%s: vendor=0x%4.04x device=0x%4.04x rev=%d Pre-FLR\n",
+                   __func__, pdev->vendor, pdev->device, pdev->revision);
+       mwifiex_shutdown_sw(adapter);
 -      adapter->surprise_removed = true;
+       clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &card->work_flags);
+       clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags);
        mwifiex_dbg(adapter, INFO, "%s, successful\n", __func__);
  }
  
- static const struct pci_error_handlers mwifiex_pcie_err_handler[] = {
-               { .reset_notify = mwifiex_pcie_reset_notify, },
+ /*
+  * Kernel stores and restores PCIe function context before and after performing
+  * FLR respectively. Reconfigure the software and firmware including firmware
+  * redownload.
+  */
+ static void mwifiex_pcie_reset_done(struct pci_dev *pdev)
+ {
+       struct pcie_service_card *card = pci_get_drvdata(pdev);
+       struct mwifiex_adapter *adapter = card->adapter;
+       int ret;
+       if (!adapter) {
+               dev_err(&pdev->dev, "%s: adapter structure is not valid\n",
+                       __func__);
+               return;
+       }
+       mwifiex_dbg(adapter, INFO,
+                   "%s: vendor=0x%4.04x device=0x%4.04x rev=%d Post-FLR\n",
+                   __func__, pdev->vendor, pdev->device, pdev->revision);
 -      adapter->surprise_removed = false;
+       ret = mwifiex_reinit_sw(adapter);
+       if (ret)
+               dev_err(&pdev->dev, "reinit failed: %d\n", ret);
+       else
+               mwifiex_dbg(adapter, INFO, "%s, successful\n", __func__);
+ }
+ static const struct pci_error_handlers mwifiex_pcie_err_handler = {
+       .reset_prepare          = mwifiex_pcie_reset_prepare,
+       .reset_done             = mwifiex_pcie_reset_done,
  };
  
  #ifdef CONFIG_PM_SLEEP
index 5b1ac79fb607b48181bb50ab3001abac4cde32bc,9a3d69b8df9894850d247cee477fff3bb138e56e..b7a84c523475739ece377c884bb8da3c22b91e4d
@@@ -2303,14 -2145,14 +2303,16 @@@ static int nvme_probe(struct pci_dev *p
        return result;
  }
  
- static void nvme_reset_notify(struct pci_dev *pdev, bool prepare)
+ static void nvme_reset_prepare(struct pci_dev *pdev)
  {
 -      nvme_dev_disable(pci_get_drvdata(pdev), false);
 +      struct nvme_dev *dev = pci_get_drvdata(pdev);
++      nvme_dev_disable(dev, false);
+ }
  
-       if (prepare)
-               nvme_dev_disable(dev, false);
-       else
-               nvme_reset_ctrl(&dev->ctrl);
+ static void nvme_reset_done(struct pci_dev *pdev)
+ {
 -      nvme_reset(pci_get_drvdata(pdev));
++      struct nvme_dev *dev = pci_get_drvdata(pdev);
++      nvme_reset_ctrl(&dev->ctrl);
  }
  
  static void nvme_shutdown(struct pci_dev *pdev)
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index d2747f9c5707a0686af739b088868de9018d7a18,9b71406d2eec551c48a02a7291c0975f6141e39a..d69bd77252a76403b11dad5d30a98e35327fda58
@@@ -108,8 -64,15 +108,15 @@@ irq_create_affinity_masks(int nvecs, co
        int last_affv = affv + affd->pre_vectors;
        nodemask_t nodemsk = NODE_MASK_NONE;
        struct cpumask *masks;
 -      cpumask_var_t nmsk;
 +      cpumask_var_t nmsk, *node_to_present_cpumask;
  
+       /*
+        * If there aren't any vectors left after applying the pre/post
+        * vectors don't bother with assigning affinity.
+        */
+       if (!affv)
+               return NULL;
        if (!zalloc_cpumask_var(&nmsk, GFP_KERNEL))
                return NULL;
  
@@@ -199,10 -155,15 +207,13 @@@ int irq_calc_affinity_vectors(int minve
  {
        int resv = affd->pre_vectors + affd->post_vectors;
        int vecs = maxvec - resv;
 -      int cpus;
 +      int ret;
  
 -      /* Stabilize the cpumasks */
+       if (resv > minvec)
+               return 0;
        get_online_cpus();
 -      cpus = cpumask_weight(cpu_online_mask);
 +      ret = min_t(int, cpumask_weight(cpu_present_mask), vecs) + resv;
        put_online_cpus();
 -
 -      return min(cpus, vecs) + resv;
 +      return ret;
  }