Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6: PCI: Prevent AER driver from being loaded on non-root port PCIE devices PCI: get larger bridge ranges when space is available PCI: pci.c: fix kernel-doc notation PCI quirk: TI XIO200a erroneously reports support for fast b2b transfers PCI PM: Read device power state from register after updating it PCI: remove pci_assign_resource_fixed() PCI: PCIe portdrv: remove "-driver" from driver name
This commit is contained in:
Коммит
2caa731819
|
@ -513,7 +513,11 @@ static int pci_raw_set_power_state(struct pci_dev *dev, pci_power_t state)
|
||||||
else if (state == PCI_D2 || dev->current_state == PCI_D2)
|
else if (state == PCI_D2 || dev->current_state == PCI_D2)
|
||||||
udelay(PCI_PM_D2_DELAY);
|
udelay(PCI_PM_D2_DELAY);
|
||||||
|
|
||||||
dev->current_state = state;
|
pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr);
|
||||||
|
dev->current_state = (pmcsr & PCI_PM_CTRL_STATE_MASK);
|
||||||
|
if (dev->current_state != state && printk_ratelimit())
|
||||||
|
dev_info(&dev->dev, "Refused to change power state, "
|
||||||
|
"currently in D%d\n", dev->current_state);
|
||||||
|
|
||||||
/* According to section 5.4.1 of the "PCI BUS POWER MANAGEMENT
|
/* According to section 5.4.1 of the "PCI BUS POWER MANAGEMENT
|
||||||
* INTERFACE SPECIFICATION, REV. 1.2", a device transitioning
|
* INTERFACE SPECIFICATION, REV. 1.2", a device transitioning
|
||||||
|
@ -2542,10 +2546,10 @@ int pci_resource_bar(struct pci_dev *dev, int resno, enum pci_bar_type *type)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pci_set_vga_state - set VGA decode state on device and parents if requested
|
* pci_set_vga_state - set VGA decode state on device and parents if requested
|
||||||
* @dev the PCI device
|
* @dev: the PCI device
|
||||||
* @decode - true = enable decoding, false = disable decoding
|
* @decode: true = enable decoding, false = disable decoding
|
||||||
* @command_bits PCI_COMMAND_IO and/or PCI_COMMAND_MEMORY
|
* @command_bits: PCI_COMMAND_IO and/or PCI_COMMAND_MEMORY
|
||||||
* @change_bridge - traverse ancestors and change bridges
|
* @change_bridge: traverse ancestors and change bridges
|
||||||
*/
|
*/
|
||||||
int pci_set_vga_state(struct pci_dev *dev, bool decode,
|
int pci_set_vga_state(struct pci_dev *dev, bool decode,
|
||||||
unsigned int command_bits, bool change_bridge)
|
unsigned int command_bits, bool change_bridge)
|
||||||
|
|
|
@ -53,7 +53,7 @@ static struct pci_error_handlers aer_error_handlers = {
|
||||||
|
|
||||||
static struct pcie_port_service_driver aerdriver = {
|
static struct pcie_port_service_driver aerdriver = {
|
||||||
.name = "aer",
|
.name = "aer",
|
||||||
.port_type = PCIE_ANY_PORT,
|
.port_type = PCIE_RC_PORT,
|
||||||
.service = PCIE_PORT_SERVICE_AER,
|
.service = PCIE_PORT_SERVICE_AER,
|
||||||
|
|
||||||
.probe = aer_probe,
|
.probe = aer_probe,
|
||||||
|
|
|
@ -30,7 +30,6 @@ MODULE_DESCRIPTION(DRIVER_DESC);
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
|
||||||
/* global data */
|
/* global data */
|
||||||
static const char device_name[] = "pcieport-driver";
|
|
||||||
|
|
||||||
static int pcie_portdrv_restore_config(struct pci_dev *dev)
|
static int pcie_portdrv_restore_config(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
|
@ -262,7 +261,7 @@ static struct pci_error_handlers pcie_portdrv_err_handler = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct pci_driver pcie_portdriver = {
|
static struct pci_driver pcie_portdriver = {
|
||||||
.name = (char *)device_name,
|
.name = "pcieport",
|
||||||
.id_table = &port_pci_ids[0],
|
.id_table = &port_pci_ids[0],
|
||||||
|
|
||||||
.probe = pcie_portdrv_probe,
|
.probe = pcie_portdrv_probe,
|
||||||
|
|
|
@ -670,6 +670,25 @@ static void __devinit quirk_vt8235_acpi(struct pci_dev *dev)
|
||||||
}
|
}
|
||||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, quirk_vt8235_acpi);
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, quirk_vt8235_acpi);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TI XIO2000a PCIe-PCI Bridge erroneously reports it supports fast back-to-back:
|
||||||
|
* Disable fast back-to-back on the secondary bus segment
|
||||||
|
*/
|
||||||
|
static void __devinit quirk_xio2000a(struct pci_dev *dev)
|
||||||
|
{
|
||||||
|
struct pci_dev *pdev;
|
||||||
|
u16 command;
|
||||||
|
|
||||||
|
dev_warn(&dev->dev, "TI XIO2000a quirk detected; "
|
||||||
|
"secondary bus fast back-to-back transfers disabled\n");
|
||||||
|
list_for_each_entry(pdev, &dev->subordinate->devices, bus_list) {
|
||||||
|
pci_read_config_word(pdev, PCI_COMMAND, &command);
|
||||||
|
if (command & PCI_COMMAND_FAST_BACK)
|
||||||
|
pci_write_config_word(pdev, PCI_COMMAND, command & ~PCI_COMMAND_FAST_BACK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_XIO2000A,
|
||||||
|
quirk_xio2000a);
|
||||||
|
|
||||||
#ifdef CONFIG_X86_IO_APIC
|
#ifdef CONFIG_X86_IO_APIC
|
||||||
|
|
||||||
|
|
|
@ -299,8 +299,17 @@ static struct resource *find_free_bus_resource(struct pci_bus *bus, unsigned lon
|
||||||
r = bus->resource[i];
|
r = bus->resource[i];
|
||||||
if (r == &ioport_resource || r == &iomem_resource)
|
if (r == &ioport_resource || r == &iomem_resource)
|
||||||
continue;
|
continue;
|
||||||
if (r && (r->flags & type_mask) == type && !r->parent)
|
if (r && (r->flags & type_mask) == type) {
|
||||||
return r;
|
if (!r->parent)
|
||||||
|
return r;
|
||||||
|
/*
|
||||||
|
* if there is no child under that, we should release
|
||||||
|
* and use it. don't need to reset it, pbus_size_* will
|
||||||
|
* set it again
|
||||||
|
*/
|
||||||
|
if (!r->child && !release_resource(r))
|
||||||
|
return r;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -205,43 +205,6 @@ int pci_assign_resource(struct pci_dev *dev, int resno)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
int pci_assign_resource_fixed(struct pci_dev *dev, int resno)
|
|
||||||
{
|
|
||||||
struct pci_bus *bus = dev->bus;
|
|
||||||
struct resource *res = dev->resource + resno;
|
|
||||||
unsigned int type_mask;
|
|
||||||
int i, ret = -EBUSY;
|
|
||||||
|
|
||||||
type_mask = IORESOURCE_IO | IORESOURCE_MEM | IORESOURCE_PREFETCH;
|
|
||||||
|
|
||||||
for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
|
|
||||||
struct resource *r = bus->resource[i];
|
|
||||||
if (!r)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* type_mask must match */
|
|
||||||
if ((res->flags ^ r->flags) & type_mask)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
ret = request_resource(r, res);
|
|
||||||
|
|
||||||
if (ret == 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret) {
|
|
||||||
dev_err(&dev->dev, "BAR %d: can't allocate %s resource %pR\n",
|
|
||||||
resno, res->flags & IORESOURCE_IO ? "I/O" : "mem", res);
|
|
||||||
} else if (resno < PCI_BRIDGE_RESOURCES) {
|
|
||||||
pci_update_resource(dev, resno);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(pci_assign_resource_fixed);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Sort resources by alignment */
|
/* Sort resources by alignment */
|
||||||
void pdev_sort_resources(struct pci_dev *dev, struct resource_list *head)
|
void pdev_sort_resources(struct pci_dev *dev, struct resource_list *head)
|
||||||
{
|
{
|
||||||
|
|
|
@ -776,6 +776,7 @@
|
||||||
#define PCI_DEVICE_ID_TI_X515 0x8036
|
#define PCI_DEVICE_ID_TI_X515 0x8036
|
||||||
#define PCI_DEVICE_ID_TI_XX12 0x8039
|
#define PCI_DEVICE_ID_TI_XX12 0x8039
|
||||||
#define PCI_DEVICE_ID_TI_XX12_FM 0x803b
|
#define PCI_DEVICE_ID_TI_XX12_FM 0x803b
|
||||||
|
#define PCI_DEVICE_ID_TI_XIO2000A 0x8231
|
||||||
#define PCI_DEVICE_ID_TI_1130 0xac12
|
#define PCI_DEVICE_ID_TI_1130 0xac12
|
||||||
#define PCI_DEVICE_ID_TI_1031 0xac13
|
#define PCI_DEVICE_ID_TI_1031 0xac13
|
||||||
#define PCI_DEVICE_ID_TI_1131 0xac15
|
#define PCI_DEVICE_ID_TI_1131 0xac15
|
||||||
|
|
Загрузка…
Ссылка в новой задаче