Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/pci-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/pci-2.6: (42 commits) PCI: Change PCI subsystem MAINTAINER PCI: pci-iommu-iotlb-flushing-speedup PCI: pci_setup_bridge() mustn't be __devinit PCI: pci_bus_size_cardbus() mustn't be __devinit PCI: pci_scan_device() mustn't be __devinit PCI: pci_alloc_child_bus() mustn't be __devinit PCI: replace remaining __FUNCTION__ occurrences PCI: Hotplug: fakephp: Return success, not ENODEV, when bus rescan is triggered PCI: Hotplug: Fix leaks in IBM Hot Plug Controller Driver - ibmphp_init_devno() PCI: clean up resource alignment management PCI: aerdrv_acpi.c: remove unneeded NULL check PCI: Update VIA CX700 quirk PCI: Expose PCI VPD through sysfs PCI: iommu: iotlb flushing PCI: simplify quirk debug output PCI: iova RB tree setup tweak PCI: parisc: use generic pci_enable_resources() PCI: ppc: use generic pci_enable_resources() PCI: powerpc: use generic pci_enable_resources() PCI: ia64: use generic pci_enable_resources() ...
This commit is contained in:
@ -9,6 +9,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/pci-aspm.h>
|
||||
#include "pci.h"
|
||||
|
||||
#define CARDBUS_LATENCY_TIMER 176 /* secondary latency timer */
|
||||
@ -20,18 +21,27 @@
|
||||
LIST_HEAD(pci_root_buses);
|
||||
EXPORT_SYMBOL(pci_root_buses);
|
||||
|
||||
LIST_HEAD(pci_devices);
|
||||
|
||||
static int find_anything(struct device *dev, void *data)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some device drivers need know if pci is initiated.
|
||||
* Basically, we think pci is not initiated when there
|
||||
* is no device in list of pci_devices.
|
||||
* is no device to be found on the pci_bus_type.
|
||||
*/
|
||||
int no_pci_devices(void)
|
||||
{
|
||||
return list_empty(&pci_devices);
|
||||
}
|
||||
struct device *dev;
|
||||
int no_devices;
|
||||
|
||||
dev = bus_find_device(&pci_bus_type, NULL, NULL, find_anything);
|
||||
no_devices = (dev == NULL);
|
||||
put_device(dev);
|
||||
return no_devices;
|
||||
}
|
||||
EXPORT_SYMBOL(no_pci_devices);
|
||||
|
||||
#ifdef HAVE_PCI_LEGACY
|
||||
@ -244,7 +254,7 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
|
||||
res->flags |= l & ~PCI_BASE_ADDRESS_IO_MASK;
|
||||
}
|
||||
res->end = res->start + (unsigned long) sz;
|
||||
res->flags |= pci_calc_resource_flags(l);
|
||||
res->flags |= pci_calc_resource_flags(l) | IORESOURCE_SIZEALIGN;
|
||||
if (is_64bit_memory(l)) {
|
||||
u32 szhi, lhi;
|
||||
|
||||
@ -297,7 +307,8 @@ static void pci_read_bases(struct pci_dev *dev, unsigned int howmany, int rom)
|
||||
if (sz) {
|
||||
res->flags = (l & IORESOURCE_ROM_ENABLE) |
|
||||
IORESOURCE_MEM | IORESOURCE_PREFETCH |
|
||||
IORESOURCE_READONLY | IORESOURCE_CACHEABLE;
|
||||
IORESOURCE_READONLY | IORESOURCE_CACHEABLE |
|
||||
IORESOURCE_SIZEALIGN;
|
||||
res->start = l & PCI_ROM_ADDRESS_MASK;
|
||||
res->end = res->start + (unsigned long) sz;
|
||||
}
|
||||
@ -407,8 +418,8 @@ static struct pci_bus * pci_alloc_bus(void)
|
||||
return b;
|
||||
}
|
||||
|
||||
static struct pci_bus * __devinit
|
||||
pci_alloc_child_bus(struct pci_bus *parent, struct pci_dev *bridge, int busnr)
|
||||
static struct pci_bus *pci_alloc_child_bus(struct pci_bus *parent,
|
||||
struct pci_dev *bridge, int busnr)
|
||||
{
|
||||
struct pci_bus *child;
|
||||
int i;
|
||||
@ -641,7 +652,9 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev *dev, int max,
|
||||
pci_write_config_byte(dev, PCI_SUBORDINATE_BUS, max);
|
||||
}
|
||||
|
||||
sprintf(child->name, (is_cardbus ? "PCI CardBus #%02x" : "PCI Bus #%02x"), child->number);
|
||||
sprintf(child->name,
|
||||
(is_cardbus ? "PCI CardBus %04x:%02x" : "PCI Bus %04x:%02x"),
|
||||
pci_domain_nr(bus), child->number);
|
||||
|
||||
/* Has only triggered on CardBus, fixup is in yenta_socket */
|
||||
while (bus->parent) {
|
||||
@ -801,6 +814,7 @@ static void pci_release_dev(struct device *dev)
|
||||
struct pci_dev *pci_dev;
|
||||
|
||||
pci_dev = to_pci_dev(dev);
|
||||
pci_vpd_release(pci_dev);
|
||||
kfree(pci_dev);
|
||||
}
|
||||
|
||||
@ -868,7 +882,6 @@ struct pci_dev *alloc_pci_dev(void)
|
||||
if (!dev)
|
||||
return NULL;
|
||||
|
||||
INIT_LIST_HEAD(&dev->global_list);
|
||||
INIT_LIST_HEAD(&dev->bus_list);
|
||||
|
||||
pci_msi_init_pci_dev(dev);
|
||||
@ -881,8 +894,7 @@ EXPORT_SYMBOL(alloc_pci_dev);
|
||||
* Read the config data for a PCI device, sanity-check it
|
||||
* and fill in the dev structure...
|
||||
*/
|
||||
static struct pci_dev * __devinit
|
||||
pci_scan_device(struct pci_bus *bus, int devfn)
|
||||
static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn)
|
||||
{
|
||||
struct pci_dev *dev;
|
||||
u32 l;
|
||||
@ -941,6 +953,8 @@ pci_scan_device(struct pci_bus *bus, int devfn)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pci_vpd_pci22_init(dev);
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
@ -965,7 +979,6 @@ void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)
|
||||
* Add the device to our list of discovered devices
|
||||
* and the bus list for fixup functions, etc.
|
||||
*/
|
||||
INIT_LIST_HEAD(&dev->global_list);
|
||||
down_write(&pci_bus_sem);
|
||||
list_add_tail(&dev->bus_list, &bus->devices);
|
||||
up_write(&pci_bus_sem);
|
||||
@ -992,7 +1005,7 @@ EXPORT_SYMBOL(pci_scan_single_device);
|
||||
*
|
||||
* Scan a PCI slot on the specified PCI bus for devices, adding
|
||||
* discovered devices to the @bus->devices list. New devices
|
||||
* will have an empty dev->global_list head.
|
||||
* will not have is_added set.
|
||||
*/
|
||||
int pci_scan_slot(struct pci_bus *bus, int devfn)
|
||||
{
|
||||
@ -1024,6 +1037,10 @@ int pci_scan_slot(struct pci_bus *bus, int devfn)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (bus->self)
|
||||
pcie_aspm_init_link_state(bus->self);
|
||||
|
||||
return nr;
|
||||
}
|
||||
|
||||
@ -1194,7 +1211,7 @@ static void __init pci_insertion_sort_klist(struct pci_dev *a, struct list_head
|
||||
list_move_tail(&a->dev.knode_bus.n_node, list);
|
||||
}
|
||||
|
||||
static void __init pci_sort_breadthfirst_klist(void)
|
||||
void __init pci_sort_breadthfirst(void)
|
||||
{
|
||||
LIST_HEAD(sorted_devices);
|
||||
struct list_head *pos, *tmp;
|
||||
@ -1215,36 +1232,3 @@ static void __init pci_sort_breadthfirst_klist(void)
|
||||
list_splice(&sorted_devices, &device_klist->k_list);
|
||||
spin_unlock(&device_klist->k_lock);
|
||||
}
|
||||
|
||||
static void __init pci_insertion_sort_devices(struct pci_dev *a, struct list_head *list)
|
||||
{
|
||||
struct pci_dev *b;
|
||||
|
||||
list_for_each_entry(b, list, global_list) {
|
||||
if (pci_sort_bf_cmp(a, b) <= 0) {
|
||||
list_move_tail(&a->global_list, &b->global_list);
|
||||
return;
|
||||
}
|
||||
}
|
||||
list_move_tail(&a->global_list, list);
|
||||
}
|
||||
|
||||
static void __init pci_sort_breadthfirst_devices(void)
|
||||
{
|
||||
LIST_HEAD(sorted_devices);
|
||||
struct pci_dev *dev, *tmp;
|
||||
|
||||
down_write(&pci_bus_sem);
|
||||
list_for_each_entry_safe(dev, tmp, &pci_devices, global_list) {
|
||||
pci_insertion_sort_devices(dev, &sorted_devices);
|
||||
}
|
||||
list_splice(&sorted_devices, &pci_devices);
|
||||
up_write(&pci_bus_sem);
|
||||
}
|
||||
|
||||
void __init pci_sort_breadthfirst(void)
|
||||
{
|
||||
pci_sort_breadthfirst_devices();
|
||||
pci_sort_breadthfirst_klist();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user