Merge tag 'pci-v5.13-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaa...
[linux-2.6-microblaze.git] / drivers / pci / pci.c
index 3123a4f..b717680 100644 (file)
@@ -692,6 +692,36 @@ u8 pci_find_ht_capability(struct pci_dev *dev, int ht_cap)
 }
 EXPORT_SYMBOL_GPL(pci_find_ht_capability);
 
+/**
+ * pci_find_vsec_capability - Find a vendor-specific extended capability
+ * @dev: PCI device to query
+ * @vendor: Vendor ID for which capability is defined
+ * @cap: Vendor-specific capability ID
+ *
+ * If @dev has Vendor ID @vendor, search for a VSEC capability with
+ * VSEC ID @cap. If found, return the capability offset in
+ * config space; otherwise return 0.
+ */
+u16 pci_find_vsec_capability(struct pci_dev *dev, u16 vendor, int cap)
+{
+       u16 vsec = 0;
+       u32 header;
+
+       if (vendor != dev->vendor)
+               return 0;
+
+       while ((vsec = pci_find_next_ext_capability(dev, vsec,
+                                                    PCI_EXT_CAP_ID_VNDR))) {
+               if (pci_read_config_dword(dev, vsec + PCI_VNDR_HEADER,
+                                         &header) == PCIBIOS_SUCCESSFUL &&
+                   PCI_VNDR_HEADER_ID(header) == cap)
+                       return vsec;
+       }
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(pci_find_vsec_capability);
+
 /**
  * pci_find_parent_resource - return resource region of parent bus of given
  *                           region
@@ -1870,20 +1900,10 @@ static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)
        int err;
        int i, bars = 0;
 
-       /*
-        * Power state could be unknown at this point, either due to a fresh
-        * boot or a device removal call.  So get the current power state
-        * so that things like MSI message writing will behave as expected
-        * (e.g. if the device really is in D0 at enable time).
-        */
-       if (dev->pm_cap) {
-               u16 pmcsr;
-               pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr);
-               dev->current_state = (pmcsr & PCI_PM_CTRL_STATE_MASK);
-       }
-
-       if (atomic_inc_return(&dev->enable_cnt) > 1)
+       if (atomic_inc_return(&dev->enable_cnt) > 1) {
+               pci_update_current_state(dev, dev->current_state);
                return 0;               /* already enabled */
+       }
 
        bridge = pci_upstream_bridge(dev);
        if (bridge)
@@ -4113,7 +4133,7 @@ void pci_unmap_iospace(struct resource *res)
 #if defined(PCI_IOBASE) && defined(CONFIG_MMU)
        unsigned long vaddr = (unsigned long)PCI_IOBASE + res->start;
 
-       unmap_kernel_range(vaddr, resource_size(res));
+       vunmap_range(vaddr, vaddr + resource_size(res));
 #endif
 }
 EXPORT_SYMBOL(pci_unmap_iospace);