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:
Коммит
bda0c0afa7
|
@ -25,8 +25,6 @@ DMA-API.txt
|
|||
- DMA API, pci_ API & extensions for non-consistent memory machines.
|
||||
DMA-ISA-LPC.txt
|
||||
- How to do DMA with ISA (and LPC) devices.
|
||||
DMA-mapping.txt
|
||||
- info for PCI drivers using DMA portably across all platforms.
|
||||
DocBook/
|
||||
- directory with DocBook templates etc. for kernel documentation.
|
||||
HOWTO
|
||||
|
@ -43,8 +41,6 @@ ManagementStyle
|
|||
- how to (attempt to) manage kernel hackers.
|
||||
MSI-HOWTO.txt
|
||||
- the Message Signaled Interrupts (MSI) Driver Guide HOWTO and FAQ.
|
||||
PCIEBUS-HOWTO.txt
|
||||
- a guide describing the PCI Express Port Bus driver.
|
||||
RCU/
|
||||
- directory with info on RCU (read-copy update).
|
||||
README.DAC960
|
||||
|
@ -285,12 +281,6 @@ parport.txt
|
|||
- how to use the parallel-port driver.
|
||||
parport-lowlevel.txt
|
||||
- description and usage of the low level parallel port functions.
|
||||
pci-error-recovery.txt
|
||||
- info on PCI error recovery.
|
||||
pci.txt
|
||||
- info on the PCI subsystem for device driver authors.
|
||||
pcieaer-howto.txt
|
||||
- the PCI Express Advanced Error Reporting Driver Guide HOWTO.
|
||||
pcmcia/
|
||||
- info on the Linux PCMCIA driver.
|
||||
pi-futex.txt
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
What: /sys/bus/pci/devices/.../vpd
|
||||
Date: February 2008
|
||||
Contact: Ben Hutchings <bhutchings@solarflare.com>
|
||||
Description:
|
||||
A file named vpd in a device directory will be a
|
||||
binary file containing the Vital Product Data for the
|
||||
device. It should follow the VPD format defined in
|
||||
PCI Specification 2.1 or 2.2, but users should consider
|
||||
that some devices may have malformatted data. If the
|
||||
underlying VPD has a writable section then the
|
||||
corresponding section of this file will be writable.
|
|
@ -0,0 +1,12 @@
|
|||
00-INDEX
|
||||
- this file
|
||||
PCI-DMA-mapping.txt
|
||||
- info for PCI drivers using DMA portably across all platforms
|
||||
PCIEBUS-HOWTO.txt
|
||||
- a guide describing the PCI Express Port Bus driver
|
||||
pci-error-recovery.txt
|
||||
- info on PCI error recovery
|
||||
pci.txt
|
||||
- info on the PCI subsystem for device driver authors
|
||||
pcieaer-howto.txt
|
||||
- the PCI Express Advanced Error Reporting Driver Guide HOWTO
|
|
@ -56,9 +56,9 @@ advantages of using the PCI Express Port Bus driver are listed below:
|
|||
|
||||
- Allow service drivers implemented in an independent
|
||||
staged approach.
|
||||
|
||||
|
||||
- Allow one service driver to run on multiple PCI-PCI Bridge
|
||||
Port devices.
|
||||
Port devices.
|
||||
|
||||
- Manage and distribute resources of a PCI-PCI Bridge Port
|
||||
device to requested service drivers.
|
||||
|
@ -82,7 +82,7 @@ Model requires some minimal changes on existing service drivers that
|
|||
imposes no impact on the functionality of existing service drivers.
|
||||
|
||||
A service driver is required to use the two APIs shown below to
|
||||
register its service with the PCI Express Port Bus driver (see
|
||||
register its service with the PCI Express Port Bus driver (see
|
||||
section 5.2.1 & 5.2.2). It is important that a service driver
|
||||
initializes the pcie_port_service_driver data structure, included in
|
||||
header file /include/linux/pcieport_if.h, before calling these APIs.
|
||||
|
@ -137,7 +137,7 @@ driver.
|
|||
static int __init aerdrv_service_init(void)
|
||||
{
|
||||
int retval = 0;
|
||||
|
||||
|
||||
retval = pcie_port_service_register(&root_aerdrv);
|
||||
if (!retval) {
|
||||
/*
|
||||
|
@ -147,7 +147,7 @@ static int __init aerdrv_service_init(void)
|
|||
return retval;
|
||||
}
|
||||
|
||||
static void __exit aerdrv_service_exit(void)
|
||||
static void __exit aerdrv_service_exit(void)
|
||||
{
|
||||
pcie_port_service_unregister(&root_aerdrv);
|
||||
}
|
||||
|
@ -175,7 +175,7 @@ same physical Root Port. Both service drivers call pci_enable_msi to
|
|||
request MSI based interrupts. A service driver may not know whether
|
||||
any other service drivers have run on this Root Port. If either one
|
||||
of them calls pci_disable_msi, it puts the other service driver
|
||||
in a wrong interrupt mode.
|
||||
in a wrong interrupt mode.
|
||||
|
||||
To avoid this situation all service drivers are not permitted to
|
||||
switch interrupt mode on its device. The PCI Express Port Bus driver
|
|
@ -119,7 +119,7 @@ initialization with a pointer to a structure describing the driver
|
|||
the power state of a device before reboot.
|
||||
e.g. drivers/net/e100.c.
|
||||
|
||||
err_handler See Documentation/pci-error-recovery.txt
|
||||
err_handler See Documentation/PCI/pci-error-recovery.txt
|
||||
|
||||
|
||||
The ID table is an array of struct pci_device_id entries ending with an
|
|
@ -13,7 +13,7 @@ Reporting (AER) driver and provides information on how to use it, as
|
|||
well as how to enable the drivers of endpoint devices to conform with
|
||||
PCI Express AER driver.
|
||||
|
||||
1.2 Copyright © Intel Corporation 2006.
|
||||
1.2 Copyright © Intel Corporation 2006.
|
||||
|
||||
1.3 What is the PCI Express AER Driver?
|
||||
|
|
@ -847,6 +847,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
than 32 bit addressing. The default is to look
|
||||
for translation below 32 bit and if not available
|
||||
then look in the higher range.
|
||||
strict [Default Off]
|
||||
With this option on every unmap_single operation will
|
||||
result in a hardware IOTLB flush operation as opposed
|
||||
to batching them for performance.
|
||||
|
||||
io_delay= [X86-32,X86-64] I/O delay method
|
||||
0x80
|
||||
|
@ -1471,10 +1475,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
nomsi [MSI] If the PCI_MSI kernel config parameter is
|
||||
enabled, this kernel boot option can be used to
|
||||
disable the use of MSI interrupts system-wide.
|
||||
nosort [X86-32] Don't sort PCI devices according to
|
||||
order given by the PCI BIOS. This sorting is
|
||||
done to get a device order compatible with
|
||||
older kernels.
|
||||
biosirq [X86-32] Use PCI BIOS calls to get the interrupt
|
||||
routing table. These calls are known to be buggy
|
||||
on several machines and they hang the machine
|
||||
|
|
|
@ -430,8 +430,8 @@ There are certain things that the Linux kernel memory barriers do not guarantee:
|
|||
|
||||
[*] For information on bus mastering DMA and coherency please read:
|
||||
|
||||
Documentation/pci.txt
|
||||
Documentation/DMA-mapping.txt
|
||||
Documentation/PCI/pci.txt
|
||||
Documentation/PCI/PCI-DMA-mapping.txt
|
||||
Documentation/DMA-API.txt
|
||||
|
||||
|
||||
|
|
|
@ -3065,11 +3065,10 @@ L: linux-pci@atrey.karlin.mff.cuni.cz
|
|||
S: Supported
|
||||
|
||||
PCI SUBSYSTEM
|
||||
P: Greg Kroah-Hartman
|
||||
M: gregkh@suse.de
|
||||
P: Jesse Barnes
|
||||
M: jbarnes@virtuousgeek.org
|
||||
L: linux-kernel@vger.kernel.org
|
||||
L: linux-pci@atrey.karlin.mff.cuni.cz
|
||||
T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
||||
S: Supported
|
||||
|
||||
PCI HOTPLUG CORE
|
||||
|
|
|
@ -372,28 +372,7 @@ EXPORT_SYMBOL(pcibios_bus_to_resource);
|
|||
int
|
||||
pcibios_enable_device(struct pci_dev *dev, int mask)
|
||||
{
|
||||
u16 cmd, oldcmd;
|
||||
int i;
|
||||
|
||||
pci_read_config_word(dev, PCI_COMMAND, &cmd);
|
||||
oldcmd = cmd;
|
||||
|
||||
for (i = 0; i < PCI_NUM_RESOURCES; i++) {
|
||||
struct resource *res = &dev->resource[i];
|
||||
|
||||
if (res->flags & IORESOURCE_IO)
|
||||
cmd |= PCI_COMMAND_IO;
|
||||
else if (res->flags & IORESOURCE_MEM)
|
||||
cmd |= PCI_COMMAND_MEMORY;
|
||||
}
|
||||
|
||||
if (cmd != oldcmd) {
|
||||
printk(KERN_DEBUG "PCI: Enabling device: (%s), cmd %x\n",
|
||||
pci_name(dev), cmd);
|
||||
/* Enable the appropriate bits in the PCI command register. */
|
||||
pci_write_config_word(dev, PCI_COMMAND, cmd);
|
||||
}
|
||||
return 0;
|
||||
return pci_enable_resources(dev, mask);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -17,8 +17,6 @@
|
|||
#define PCI_PROBE_BIOS 0x0001
|
||||
#define PCI_PROBE_CONF1 0x0002
|
||||
#define PCI_PROBE_CONF2 0x0004
|
||||
#define PCI_NO_SORT 0x0100
|
||||
#define PCI_BIOS_SORT 0x0200
|
||||
#define PCI_NO_CHECKS 0x0400
|
||||
#define PCI_ASSIGN_ROMS 0x1000
|
||||
#define PCI_BIOS_IRQ_SCAN 0x2000
|
||||
|
|
|
@ -198,58 +198,6 @@ static struct pci_ops * __init pci_check_direct(void)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Several buggy motherboards address only 16 devices and mirror
|
||||
* them to next 16 IDs. We try to detect this `feature' on all
|
||||
* primary buses (those containing host bridges as they are
|
||||
* expected to be unique) and remove the ghost devices.
|
||||
*/
|
||||
|
||||
static void __init pcibios_fixup_ghosts(struct pci_bus *b)
|
||||
{
|
||||
struct list_head *ln, *mn;
|
||||
struct pci_dev *d, *e;
|
||||
int mirror = PCI_DEVFN(16,0);
|
||||
int seen_host_bridge = 0;
|
||||
int i;
|
||||
|
||||
for (ln=b->devices.next; ln != &b->devices; ln=ln->next) {
|
||||
d = pci_dev_b(ln);
|
||||
if ((d->class >> 8) == PCI_CLASS_BRIDGE_HOST)
|
||||
seen_host_bridge++;
|
||||
for (mn=ln->next; mn != &b->devices; mn=mn->next) {
|
||||
e = pci_dev_b(mn);
|
||||
if (e->devfn != d->devfn + mirror ||
|
||||
e->vendor != d->vendor ||
|
||||
e->device != d->device ||
|
||||
e->class != d->class)
|
||||
continue;
|
||||
for(i=0; i<PCI_NUM_RESOURCES; i++)
|
||||
if (e->resource[i].start != d->resource[i].start ||
|
||||
e->resource[i].end != d->resource[i].end ||
|
||||
e->resource[i].flags != d->resource[i].flags)
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
if (mn == &b->devices)
|
||||
return;
|
||||
}
|
||||
if (!seen_host_bridge)
|
||||
return;
|
||||
printk("PCI: Ignoring ghost devices on bus %02x\n", b->number);
|
||||
|
||||
ln = &b->devices;
|
||||
while (ln->next != &b->devices) {
|
||||
d = pci_dev_b(ln->next);
|
||||
if (d->devfn >= mirror) {
|
||||
list_del(&d->global_list);
|
||||
list_del(&d->bus_list);
|
||||
kfree(d);
|
||||
} else
|
||||
ln = ln->next;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Discover remaining PCI buses in case there are peer host bridges.
|
||||
* We use the number of last PCI bus provided by the PCI BIOS.
|
||||
|
@ -356,7 +304,6 @@ void __init pcibios_fixup_bus(struct pci_bus *bus)
|
|||
#if 0
|
||||
printk("### PCIBIOS_FIXUP_BUS(%d)\n",bus->number);
|
||||
#endif
|
||||
pcibios_fixup_ghosts(bus);
|
||||
pci_read_bridge_bases(bus);
|
||||
|
||||
if (bus->number == 0) {
|
||||
|
|
|
@ -504,54 +504,12 @@ pcibios_update_irq (struct pci_dev *dev, int irq)
|
|||
/* ??? FIXME -- record old value for shutdown. */
|
||||
}
|
||||
|
||||
static inline int
|
||||
pcibios_enable_resources (struct pci_dev *dev, int mask)
|
||||
{
|
||||
u16 cmd, old_cmd;
|
||||
int idx;
|
||||
struct resource *r;
|
||||
unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM;
|
||||
|
||||
if (!dev)
|
||||
return -EINVAL;
|
||||
|
||||
pci_read_config_word(dev, PCI_COMMAND, &cmd);
|
||||
old_cmd = cmd;
|
||||
for (idx=0; idx<PCI_NUM_RESOURCES; idx++) {
|
||||
/* Only set up the desired resources. */
|
||||
if (!(mask & (1 << idx)))
|
||||
continue;
|
||||
|
||||
r = &dev->resource[idx];
|
||||
if (!(r->flags & type_mask))
|
||||
continue;
|
||||
if ((idx == PCI_ROM_RESOURCE) &&
|
||||
(!(r->flags & IORESOURCE_ROM_ENABLE)))
|
||||
continue;
|
||||
if (!r->start && r->end) {
|
||||
printk(KERN_ERR
|
||||
"PCI: Device %s not available because of resource collisions\n",
|
||||
pci_name(dev));
|
||||
return -EINVAL;
|
||||
}
|
||||
if (r->flags & IORESOURCE_IO)
|
||||
cmd |= PCI_COMMAND_IO;
|
||||
if (r->flags & IORESOURCE_MEM)
|
||||
cmd |= PCI_COMMAND_MEMORY;
|
||||
}
|
||||
if (cmd != old_cmd) {
|
||||
printk("PCI: Enabling device %s (%04x -> %04x)\n", pci_name(dev), old_cmd, cmd);
|
||||
pci_write_config_word(dev, PCI_COMMAND, cmd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
pcibios_enable_device (struct pci_dev *dev, int mask)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = pcibios_enable_resources(dev, mask);
|
||||
ret = pci_enable_resources(dev, mask);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
|
|
@ -23,8 +23,6 @@
|
|||
#define PCI_PROBE_BIOS 1
|
||||
#define PCI_PROBE_CONF1 2
|
||||
#define PCI_PROBE_CONF2 4
|
||||
#define PCI_NO_SORT 0x100
|
||||
#define PCI_BIOS_SORT 0x200
|
||||
#define PCI_NO_CHECKS 0x400
|
||||
#define PCI_ASSIGN_ROMS 0x1000
|
||||
#define PCI_BIOS_IRQ_SCAN 0x2000
|
||||
|
|
|
@ -287,23 +287,15 @@ void pcibios_align_resource(void *data, struct resource *res,
|
|||
*/
|
||||
int pcibios_enable_device(struct pci_dev *dev, int mask)
|
||||
{
|
||||
u16 cmd;
|
||||
int idx;
|
||||
int err;
|
||||
u16 cmd, old_cmd;
|
||||
|
||||
err = pci_enable_resources(dev, mask);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
pci_read_config_word(dev, PCI_COMMAND, &cmd);
|
||||
|
||||
for (idx = 0; idx < DEVICE_COUNT_RESOURCE; idx++) {
|
||||
struct resource *r = &dev->resource[idx];
|
||||
|
||||
/* only setup requested resources */
|
||||
if (!(mask & (1<<idx)))
|
||||
continue;
|
||||
|
||||
if (r->flags & IORESOURCE_IO)
|
||||
cmd |= PCI_COMMAND_IO;
|
||||
if (r->flags & IORESOURCE_MEM)
|
||||
cmd |= PCI_COMMAND_MEMORY;
|
||||
}
|
||||
old_cmd = cmd;
|
||||
|
||||
cmd |= (PCI_COMMAND_SERR | PCI_COMMAND_PARITY);
|
||||
|
||||
|
@ -312,8 +304,12 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
|
|||
if (dev->bus->bridge_ctl & PCI_BRIDGE_CTL_FAST_BACK)
|
||||
cmd |= PCI_COMMAND_FAST_BACK;
|
||||
#endif
|
||||
DBGC("PCIBIOS: Enabling device %s cmd 0x%04x\n", pci_name(dev), cmd);
|
||||
pci_write_config_word(dev, PCI_COMMAND, cmd);
|
||||
|
||||
if (cmd != old_cmd) {
|
||||
dev_info(&dev->dev, "enabling SERR and PARITY (%04x -> %04x)\n",
|
||||
old_cmd, cmd);
|
||||
pci_write_config_word(dev, PCI_COMMAND, cmd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1161,41 +1161,9 @@ EXPORT_SYMBOL_GPL(pcibios_claim_one_bus);
|
|||
|
||||
int pcibios_enable_device(struct pci_dev *dev, int mask)
|
||||
{
|
||||
u16 cmd, old_cmd;
|
||||
int idx;
|
||||
struct resource *r;
|
||||
|
||||
if (ppc_md.pcibios_enable_device_hook)
|
||||
if (ppc_md.pcibios_enable_device_hook(dev))
|
||||
return -EINVAL;
|
||||
|
||||
pci_read_config_word(dev, PCI_COMMAND, &cmd);
|
||||
old_cmd = cmd;
|
||||
for (idx = 0; idx < PCI_NUM_RESOURCES; idx++) {
|
||||
/* Only set up the requested stuff */
|
||||
if (!(mask & (1 << idx)))
|
||||
continue;
|
||||
r = &dev->resource[idx];
|
||||
if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM)))
|
||||
continue;
|
||||
if ((idx == PCI_ROM_RESOURCE) &&
|
||||
(!(r->flags & IORESOURCE_ROM_ENABLE)))
|
||||
continue;
|
||||
if (r->parent == NULL) {
|
||||
printk(KERN_ERR "PCI: Device %s not available because"
|
||||
" of resource collisions\n", pci_name(dev));
|
||||
return -EINVAL;
|
||||
}
|
||||
if (r->flags & IORESOURCE_IO)
|
||||
cmd |= PCI_COMMAND_IO;
|
||||
if (r->flags & IORESOURCE_MEM)
|
||||
cmd |= PCI_COMMAND_MEMORY;
|
||||
}
|
||||
if (cmd != old_cmd) {
|
||||
printk("PCI: Enabling device %s (%04x -> %04x)\n",
|
||||
pci_name(dev), old_cmd, cmd);
|
||||
pci_write_config_word(dev, PCI_COMMAND, cmd);
|
||||
}
|
||||
return 0;
|
||||
return pci_enable_resources(dev, mask);
|
||||
}
|
||||
|
||||
|
|
|
@ -88,11 +88,8 @@ pcibios_fixup_new_pci_devices(struct pci_bus *bus)
|
|||
struct pci_dev *dev;
|
||||
|
||||
list_for_each_entry(dev, &bus->devices, bus_list) {
|
||||
/*
|
||||
* Skip already-present devices (which are on the
|
||||
* global device list.)
|
||||
*/
|
||||
if (list_empty(&dev->global_list)) {
|
||||
/* Skip already-added devices */
|
||||
if (!dev->is_added) {
|
||||
int i;
|
||||
|
||||
/* Fill device archdata and setup iommu table */
|
||||
|
|
|
@ -578,39 +578,6 @@ pcibios_assign_resources(void)
|
|||
}
|
||||
|
||||
|
||||
int
|
||||
pcibios_enable_resources(struct pci_dev *dev, int mask)
|
||||
{
|
||||
u16 cmd, old_cmd;
|
||||
int idx;
|
||||
struct resource *r;
|
||||
|
||||
pci_read_config_word(dev, PCI_COMMAND, &cmd);
|
||||
old_cmd = cmd;
|
||||
for (idx=0; idx<6; idx++) {
|
||||
/* Only set up the requested stuff */
|
||||
if (!(mask & (1<<idx)))
|
||||
continue;
|
||||
|
||||
r = &dev->resource[idx];
|
||||
if (r->flags & IORESOURCE_UNSET) {
|
||||
printk(KERN_ERR "PCI: Device %s not available because of resource collisions\n", pci_name(dev));
|
||||
return -EINVAL;
|
||||
}
|
||||
if (r->flags & IORESOURCE_IO)
|
||||
cmd |= PCI_COMMAND_IO;
|
||||
if (r->flags & IORESOURCE_MEM)
|
||||
cmd |= PCI_COMMAND_MEMORY;
|
||||
}
|
||||
if (dev->resource[PCI_ROM_RESOURCE].start)
|
||||
cmd |= PCI_COMMAND_MEMORY;
|
||||
if (cmd != old_cmd) {
|
||||
printk("PCI: Enabling device %s (%04x -> %04x)\n", pci_name(dev), old_cmd, cmd);
|
||||
pci_write_config_word(dev, PCI_COMMAND, cmd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int next_controller_index;
|
||||
|
||||
struct pci_controller * __init
|
||||
|
@ -785,33 +752,11 @@ pcibios_update_irq(struct pci_dev *dev, int irq)
|
|||
|
||||
int pcibios_enable_device(struct pci_dev *dev, int mask)
|
||||
{
|
||||
u16 cmd, old_cmd;
|
||||
int idx;
|
||||
struct resource *r;
|
||||
|
||||
if (ppc_md.pcibios_enable_device_hook)
|
||||
if (ppc_md.pcibios_enable_device_hook(dev, 0))
|
||||
return -EINVAL;
|
||||
|
||||
pci_read_config_word(dev, PCI_COMMAND, &cmd);
|
||||
old_cmd = cmd;
|
||||
for (idx=0; idx<6; idx++) {
|
||||
r = &dev->resource[idx];
|
||||
if (r->flags & IORESOURCE_UNSET) {
|
||||
printk(KERN_ERR "PCI: Device %s not available because of resource collisions\n", pci_name(dev));
|
||||
return -EINVAL;
|
||||
}
|
||||
if (r->flags & IORESOURCE_IO)
|
||||
cmd |= PCI_COMMAND_IO;
|
||||
if (r->flags & IORESOURCE_MEM)
|
||||
cmd |= PCI_COMMAND_MEMORY;
|
||||
}
|
||||
if (cmd != old_cmd) {
|
||||
printk("PCI: Enabling device %s (%04x -> %04x)\n",
|
||||
pci_name(dev), old_cmd, cmd);
|
||||
pci_write_config_word(dev, PCI_COMMAND, cmd);
|
||||
}
|
||||
return 0;
|
||||
|
||||
return pci_enable_resources(dev, mask);
|
||||
}
|
||||
|
||||
struct pci_controller*
|
||||
|
|
|
@ -15,8 +15,6 @@
|
|||
#define PCI_PROBE_BIOS 1
|
||||
#define PCI_PROBE_CONF1 2
|
||||
#define PCI_PROBE_CONF2 4
|
||||
#define PCI_NO_SORT 0x100
|
||||
#define PCI_BIOS_SORT 0x200
|
||||
#define PCI_NO_CHECKS 0x400
|
||||
#define PCI_ASSIGN_ROMS 0x1000
|
||||
#define PCI_BIOS_IRQ_SCAN 0x2000
|
||||
|
|
|
@ -1233,8 +1233,7 @@ static int __init calgary_init(void)
|
|||
|
||||
error:
|
||||
do {
|
||||
dev = pci_get_device_reverse(PCI_VENDOR_ID_IBM,
|
||||
PCI_ANY_ID, dev);
|
||||
dev = pci_get_device(PCI_VENDOR_ID_IBM, PCI_ANY_ID, dev);
|
||||
if (!dev)
|
||||
break;
|
||||
if (!is_cal_pci_dev(dev->device))
|
||||
|
|
|
@ -151,7 +151,7 @@ adjust_transparent_bridge_resources(struct pci_bus *bus)
|
|||
|
||||
static void
|
||||
get_current_resources(struct acpi_device *device, int busnum,
|
||||
struct pci_bus *bus)
|
||||
int domain, struct pci_bus *bus)
|
||||
{
|
||||
struct pci_root_info info;
|
||||
size_t size;
|
||||
|
@ -168,10 +168,10 @@ get_current_resources(struct acpi_device *device, int busnum,
|
|||
if (!info.res)
|
||||
goto res_alloc_fail;
|
||||
|
||||
info.name = kmalloc(12, GFP_KERNEL);
|
||||
info.name = kmalloc(16, GFP_KERNEL);
|
||||
if (!info.name)
|
||||
goto name_alloc_fail;
|
||||
sprintf(info.name, "PCI Bus #%02x", busnum);
|
||||
sprintf(info.name, "PCI Bus %04x:%02x", domain, busnum);
|
||||
|
||||
info.res_num = 0;
|
||||
acpi_walk_resources(device->handle, METHOD_NAME__CRS, setup_resource,
|
||||
|
@ -247,7 +247,7 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_device *device, int do
|
|||
#endif
|
||||
|
||||
if (bus && (pci_probe & PCI_USE__CRS))
|
||||
get_current_resources(device, busnum, bus);
|
||||
get_current_resources(device, busnum, domain, bus);
|
||||
|
||||
return bus;
|
||||
}
|
||||
|
@ -278,8 +278,7 @@ static int __init pci_acpi_init(void)
|
|||
printk(KERN_INFO "PCI: Routing PCI interrupts for all devices because \"pci=routeirq\" specified\n");
|
||||
for_each_pci_dev(dev)
|
||||
acpi_pci_irq_enable(dev);
|
||||
} else
|
||||
printk(KERN_INFO "PCI: If a device doesn't work, try \"pci=routeirq\". If it helps, post a report\n");
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_IO_APIC
|
||||
if (acpi_ioapic)
|
||||
|
|
|
@ -77,59 +77,6 @@ int pcibios_scanned;
|
|||
*/
|
||||
DEFINE_SPINLOCK(pci_config_lock);
|
||||
|
||||
/*
|
||||
* Several buggy motherboards address only 16 devices and mirror
|
||||
* them to next 16 IDs. We try to detect this `feature' on all
|
||||
* primary buses (those containing host bridges as they are
|
||||
* expected to be unique) and remove the ghost devices.
|
||||
*/
|
||||
|
||||
static void __devinit pcibios_fixup_ghosts(struct pci_bus *b)
|
||||
{
|
||||
struct list_head *ln, *mn;
|
||||
struct pci_dev *d, *e;
|
||||
int mirror = PCI_DEVFN(16,0);
|
||||
int seen_host_bridge = 0;
|
||||
int i;
|
||||
|
||||
DBG("PCI: Scanning for ghost devices on bus %d\n", b->number);
|
||||
list_for_each(ln, &b->devices) {
|
||||
d = pci_dev_b(ln);
|
||||
if ((d->class >> 8) == PCI_CLASS_BRIDGE_HOST)
|
||||
seen_host_bridge++;
|
||||
for (mn=ln->next; mn != &b->devices; mn=mn->next) {
|
||||
e = pci_dev_b(mn);
|
||||
if (e->devfn != d->devfn + mirror ||
|
||||
e->vendor != d->vendor ||
|
||||
e->device != d->device ||
|
||||
e->class != d->class)
|
||||
continue;
|
||||
for(i=0; i<PCI_NUM_RESOURCES; i++)
|
||||
if (e->resource[i].start != d->resource[i].start ||
|
||||
e->resource[i].end != d->resource[i].end ||
|
||||
e->resource[i].flags != d->resource[i].flags)
|
||||
continue;
|
||||
break;
|
||||
}
|
||||
if (mn == &b->devices)
|
||||
return;
|
||||
}
|
||||
if (!seen_host_bridge)
|
||||
return;
|
||||
printk(KERN_WARNING "PCI: Ignoring ghost devices on bus %02x\n", b->number);
|
||||
|
||||
ln = &b->devices;
|
||||
while (ln->next != &b->devices) {
|
||||
d = pci_dev_b(ln->next);
|
||||
if (d->devfn >= mirror) {
|
||||
list_del(&d->global_list);
|
||||
list_del(&d->bus_list);
|
||||
kfree(d);
|
||||
} else
|
||||
ln = ln->next;
|
||||
}
|
||||
}
|
||||
|
||||
static void __devinit pcibios_fixup_device_resources(struct pci_dev *dev)
|
||||
{
|
||||
struct resource *rom_r = &dev->resource[PCI_ROM_RESOURCE];
|
||||
|
@ -152,7 +99,6 @@ void __devinit pcibios_fixup_bus(struct pci_bus *b)
|
|||
{
|
||||
struct pci_dev *dev;
|
||||
|
||||
pcibios_fixup_ghosts(b);
|
||||
pci_read_bridge_bases(b);
|
||||
list_for_each_entry(dev, &b->devices, bus_list)
|
||||
pcibios_fixup_device_resources(dev);
|
||||
|
@ -427,10 +373,6 @@ static int __init pcibios_init(void)
|
|||
|
||||
if (pci_bf_sort >= pci_force_bf)
|
||||
pci_sort_breadthfirst();
|
||||
#ifdef CONFIG_PCI_BIOS
|
||||
if ((pci_probe & PCI_BIOS_SORT) && !(pci_probe & PCI_NO_SORT))
|
||||
pcibios_sort();
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -455,9 +397,6 @@ char * __devinit pcibios_setup(char *str)
|
|||
} else if (!strcmp(str, "nobios")) {
|
||||
pci_probe &= ~PCI_PROBE_BIOS;
|
||||
return NULL;
|
||||
} else if (!strcmp(str, "nosort")) {
|
||||
pci_probe |= PCI_NO_SORT;
|
||||
return NULL;
|
||||
} else if (!strcmp(str, "biosirq")) {
|
||||
pci_probe |= PCI_BIOS_IRQ_SCAN;
|
||||
return NULL;
|
||||
|
@ -527,7 +466,7 @@ int pcibios_enable_device(struct pci_dev *dev, int mask)
|
|||
{
|
||||
int err;
|
||||
|
||||
if ((err = pcibios_enable_resources(dev, mask)) < 0)
|
||||
if ((err = pci_enable_resources(dev, mask)) < 0)
|
||||
return err;
|
||||
|
||||
if (!dev->msi_enabled)
|
||||
|
|
|
@ -241,44 +241,6 @@ void __init pcibios_resource_survey(void)
|
|||
*/
|
||||
fs_initcall(pcibios_assign_resources);
|
||||
|
||||
int pcibios_enable_resources(struct pci_dev *dev, int mask)
|
||||
{
|
||||
u16 cmd, old_cmd;
|
||||
int idx;
|
||||
struct resource *r;
|
||||
|
||||
pci_read_config_word(dev, PCI_COMMAND, &cmd);
|
||||
old_cmd = cmd;
|
||||
for (idx = 0; idx < PCI_NUM_RESOURCES; idx++) {
|
||||
/* Only set up the requested stuff */
|
||||
if (!(mask & (1 << idx)))
|
||||
continue;
|
||||
|
||||
r = &dev->resource[idx];
|
||||
if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM)))
|
||||
continue;
|
||||
if ((idx == PCI_ROM_RESOURCE) &&
|
||||
(!(r->flags & IORESOURCE_ROM_ENABLE)))
|
||||
continue;
|
||||
if (!r->start && r->end) {
|
||||
printk(KERN_ERR "PCI: Device %s not available "
|
||||
"because of resource %d collisions\n",
|
||||
pci_name(dev), idx);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (r->flags & IORESOURCE_IO)
|
||||
cmd |= PCI_COMMAND_IO;
|
||||
if (r->flags & IORESOURCE_MEM)
|
||||
cmd |= PCI_COMMAND_MEMORY;
|
||||
}
|
||||
if (cmd != old_cmd) {
|
||||
printk("PCI: Enabling device %s (%04x -> %04x)\n",
|
||||
pci_name(dev), old_cmd, cmd);
|
||||
pci_write_config_word(dev, PCI_COMMAND, cmd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we set up a device for bus mastering, we need to check the latency
|
||||
* timer as certain crappy BIOSes forget to set it properly.
|
||||
|
|
|
@ -152,28 +152,6 @@ static int __devinit check_pcibios(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit pci_bios_find_device (unsigned short vendor, unsigned short device_id,
|
||||
unsigned short index, unsigned char *bus, unsigned char *device_fn)
|
||||
{
|
||||
unsigned short bx;
|
||||
unsigned short ret;
|
||||
|
||||
__asm__("lcall *(%%edi); cld\n\t"
|
||||
"jc 1f\n\t"
|
||||
"xor %%ah, %%ah\n"
|
||||
"1:"
|
||||
: "=b" (bx),
|
||||
"=a" (ret)
|
||||
: "1" (PCIBIOS_FIND_PCI_DEVICE),
|
||||
"c" (device_id),
|
||||
"d" (vendor),
|
||||
"S" ((int) index),
|
||||
"D" (&pci_indirect));
|
||||
*bus = (bx >> 8) & 0xff;
|
||||
*device_fn = bx & 0xff;
|
||||
return (int) (ret & 0xff00) >> 8;
|
||||
}
|
||||
|
||||
static int pci_bios_read(unsigned int seg, unsigned int bus,
|
||||
unsigned int devfn, int reg, int len, u32 *value)
|
||||
{
|
||||
|
@ -363,55 +341,6 @@ static struct pci_raw_ops * __devinit pci_find_bios(void)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Sort the device list according to PCI BIOS. Nasty hack, but since some
|
||||
* fool forgot to define the `correct' device order in the PCI BIOS specs
|
||||
* and we want to be (possibly bug-to-bug ;-]) compatible with older kernels
|
||||
* which used BIOS ordering, we are bound to do this...
|
||||
*/
|
||||
|
||||
void __devinit pcibios_sort(void)
|
||||
{
|
||||
LIST_HEAD(sorted_devices);
|
||||
struct list_head *ln;
|
||||
struct pci_dev *dev, *d;
|
||||
int idx, found;
|
||||
unsigned char bus, devfn;
|
||||
|
||||
DBG("PCI: Sorting device list...\n");
|
||||
while (!list_empty(&pci_devices)) {
|
||||
ln = pci_devices.next;
|
||||
dev = pci_dev_g(ln);
|
||||
idx = found = 0;
|
||||
while (pci_bios_find_device(dev->vendor, dev->device, idx, &bus, &devfn) == PCIBIOS_SUCCESSFUL) {
|
||||
idx++;
|
||||
list_for_each(ln, &pci_devices) {
|
||||
d = pci_dev_g(ln);
|
||||
if (d->bus->number == bus && d->devfn == devfn) {
|
||||
list_move_tail(&d->global_list, &sorted_devices);
|
||||
if (d == dev)
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (ln == &pci_devices) {
|
||||
printk(KERN_WARNING "PCI: BIOS reporting unknown device %02x:%02x\n", bus, devfn);
|
||||
/*
|
||||
* We must not continue scanning as several buggy BIOSes
|
||||
* return garbage after the last device. Grr.
|
||||
*/
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
printk(KERN_WARNING "PCI: Device %s not found by BIOS\n",
|
||||
pci_name(dev));
|
||||
list_move_tail(&dev->global_list, &sorted_devices);
|
||||
}
|
||||
}
|
||||
list_splice(&sorted_devices, &pci_devices);
|
||||
}
|
||||
|
||||
/*
|
||||
* BIOS Functions for IRQ Routing
|
||||
*/
|
||||
|
@ -495,7 +424,6 @@ void __init pci_pcbios_init(void)
|
|||
{
|
||||
if ((pci_probe & PCI_PROBE_BIOS)
|
||||
&& ((raw_pci_ops = pci_find_bios()))) {
|
||||
pci_probe |= PCI_BIOS_SORT;
|
||||
pci_bios_present = 1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,8 +19,6 @@
|
|||
#define PCI_PROBE_MASK 0x000f
|
||||
#define PCI_PROBE_NOEARLY 0x0010
|
||||
|
||||
#define PCI_NO_SORT 0x0100
|
||||
#define PCI_BIOS_SORT 0x0200
|
||||
#define PCI_NO_CHECKS 0x0400
|
||||
#define PCI_USE_PIRQ_MASK 0x0800
|
||||
#define PCI_ASSIGN_ROMS 0x1000
|
||||
|
@ -44,7 +42,6 @@ enum pci_bf_sort_state {
|
|||
extern unsigned int pcibios_max_latency;
|
||||
|
||||
void pcibios_resource_survey(void);
|
||||
int pcibios_enable_resources(struct pci_dev *, int);
|
||||
|
||||
/* pci-pc.c */
|
||||
|
||||
|
@ -101,7 +98,6 @@ extern int pci_direct_probe(void);
|
|||
extern void pci_direct_init(int type);
|
||||
extern void pci_pcbios_init(void);
|
||||
extern void pci_mmcfg_init(int type);
|
||||
extern void pcibios_sort(void);
|
||||
|
||||
/* pci-mmconfig.c */
|
||||
|
||||
|
|
|
@ -496,7 +496,6 @@ dino_card_setup(struct pci_bus *bus, void __iomem *base_addr)
|
|||
list_for_each_safe(ln, tmp_ln, &bus->devices) {
|
||||
struct pci_dev *dev = pci_dev_b(ln);
|
||||
|
||||
list_del(&dev->global_list);
|
||||
list_del(&dev->bus_list);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched.h>
|
||||
|
@ -126,6 +127,171 @@ PCI_USER_WRITE_CONFIG(byte, u8)
|
|||
PCI_USER_WRITE_CONFIG(word, u16)
|
||||
PCI_USER_WRITE_CONFIG(dword, u32)
|
||||
|
||||
/* VPD access through PCI 2.2+ VPD capability */
|
||||
|
||||
#define PCI_VPD_PCI22_SIZE (PCI_VPD_ADDR_MASK + 1)
|
||||
|
||||
struct pci_vpd_pci22 {
|
||||
struct pci_vpd base;
|
||||
spinlock_t lock; /* controls access to hardware and the flags */
|
||||
u8 cap;
|
||||
bool busy;
|
||||
bool flag; /* value of F bit to wait for */
|
||||
};
|
||||
|
||||
/* Wait for last operation to complete */
|
||||
static int pci_vpd_pci22_wait(struct pci_dev *dev)
|
||||
{
|
||||
struct pci_vpd_pci22 *vpd =
|
||||
container_of(dev->vpd, struct pci_vpd_pci22, base);
|
||||
u16 flag, status;
|
||||
int wait;
|
||||
int ret;
|
||||
|
||||
if (!vpd->busy)
|
||||
return 0;
|
||||
|
||||
flag = vpd->flag ? PCI_VPD_ADDR_F : 0;
|
||||
wait = vpd->flag ? 10 : 1000; /* read: 100 us; write: 10 ms */
|
||||
for (;;) {
|
||||
ret = pci_user_read_config_word(dev,
|
||||
vpd->cap + PCI_VPD_ADDR,
|
||||
&status);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if ((status & PCI_VPD_ADDR_F) == flag) {
|
||||
vpd->busy = false;
|
||||
return 0;
|
||||
}
|
||||
if (wait-- == 0)
|
||||
return -ETIMEDOUT;
|
||||
udelay(10);
|
||||
}
|
||||
}
|
||||
|
||||
static int pci_vpd_pci22_read(struct pci_dev *dev, int pos, int size,
|
||||
char *buf)
|
||||
{
|
||||
struct pci_vpd_pci22 *vpd =
|
||||
container_of(dev->vpd, struct pci_vpd_pci22, base);
|
||||
u32 val;
|
||||
int ret;
|
||||
int begin, end, i;
|
||||
|
||||
if (pos < 0 || pos > PCI_VPD_PCI22_SIZE ||
|
||||
size > PCI_VPD_PCI22_SIZE - pos)
|
||||
return -EINVAL;
|
||||
if (size == 0)
|
||||
return 0;
|
||||
|
||||
spin_lock_irq(&vpd->lock);
|
||||
ret = pci_vpd_pci22_wait(dev);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
ret = pci_user_write_config_word(dev, vpd->cap + PCI_VPD_ADDR,
|
||||
pos & ~3);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
vpd->busy = true;
|
||||
vpd->flag = 1;
|
||||
ret = pci_vpd_pci22_wait(dev);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
ret = pci_user_read_config_dword(dev, vpd->cap + PCI_VPD_DATA,
|
||||
&val);
|
||||
out:
|
||||
spin_unlock_irq(&vpd->lock);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Convert to bytes */
|
||||
begin = pos & 3;
|
||||
end = min(4, begin + size);
|
||||
for (i = 0; i < end; ++i) {
|
||||
if (i >= begin)
|
||||
*buf++ = val;
|
||||
val >>= 8;
|
||||
}
|
||||
return end - begin;
|
||||
}
|
||||
|
||||
static int pci_vpd_pci22_write(struct pci_dev *dev, int pos, int size,
|
||||
const char *buf)
|
||||
{
|
||||
struct pci_vpd_pci22 *vpd =
|
||||
container_of(dev->vpd, struct pci_vpd_pci22, base);
|
||||
u32 val;
|
||||
int ret;
|
||||
|
||||
if (pos < 0 || pos > PCI_VPD_PCI22_SIZE || pos & 3 ||
|
||||
size > PCI_VPD_PCI22_SIZE - pos || size < 4)
|
||||
return -EINVAL;
|
||||
|
||||
val = (u8) *buf++;
|
||||
val |= ((u8) *buf++) << 8;
|
||||
val |= ((u8) *buf++) << 16;
|
||||
val |= ((u32)(u8) *buf++) << 24;
|
||||
|
||||
spin_lock_irq(&vpd->lock);
|
||||
ret = pci_vpd_pci22_wait(dev);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
ret = pci_user_write_config_dword(dev, vpd->cap + PCI_VPD_DATA,
|
||||
val);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
ret = pci_user_write_config_word(dev, vpd->cap + PCI_VPD_ADDR,
|
||||
pos | PCI_VPD_ADDR_F);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
vpd->busy = true;
|
||||
vpd->flag = 0;
|
||||
ret = pci_vpd_pci22_wait(dev);
|
||||
out:
|
||||
spin_unlock_irq(&vpd->lock);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 4;
|
||||
}
|
||||
|
||||
static int pci_vpd_pci22_get_size(struct pci_dev *dev)
|
||||
{
|
||||
return PCI_VPD_PCI22_SIZE;
|
||||
}
|
||||
|
||||
static void pci_vpd_pci22_release(struct pci_dev *dev)
|
||||
{
|
||||
kfree(container_of(dev->vpd, struct pci_vpd_pci22, base));
|
||||
}
|
||||
|
||||
static struct pci_vpd_ops pci_vpd_pci22_ops = {
|
||||
.read = pci_vpd_pci22_read,
|
||||
.write = pci_vpd_pci22_write,
|
||||
.get_size = pci_vpd_pci22_get_size,
|
||||
.release = pci_vpd_pci22_release,
|
||||
};
|
||||
|
||||
int pci_vpd_pci22_init(struct pci_dev *dev)
|
||||
{
|
||||
struct pci_vpd_pci22 *vpd;
|
||||
u8 cap;
|
||||
|
||||
cap = pci_find_capability(dev, PCI_CAP_ID_VPD);
|
||||
if (!cap)
|
||||
return -ENODEV;
|
||||
vpd = kzalloc(sizeof(*vpd), GFP_ATOMIC);
|
||||
if (!vpd)
|
||||
return -ENOMEM;
|
||||
|
||||
vpd->base.ops = &pci_vpd_pci22_ops;
|
||||
spin_lock_init(&vpd->lock);
|
||||
vpd->cap = cap;
|
||||
vpd->busy = false;
|
||||
dev->vpd = &vpd->base;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_block_user_cfg_access - Block userspace PCI config reads/writes
|
||||
* @dev: pci device struct
|
||||
|
|
|
@ -84,10 +84,7 @@ int pci_bus_add_device(struct pci_dev *dev)
|
|||
if (retval)
|
||||
return retval;
|
||||
|
||||
down_write(&pci_bus_sem);
|
||||
list_add_tail(&dev->global_list, &pci_devices);
|
||||
up_write(&pci_bus_sem);
|
||||
|
||||
dev->is_added = 1;
|
||||
pci_proc_attach_device(dev);
|
||||
pci_create_sysfs_dev_files(dev);
|
||||
return 0;
|
||||
|
@ -112,11 +109,8 @@ void pci_bus_add_devices(struct pci_bus *bus)
|
|||
int retval;
|
||||
|
||||
list_for_each_entry(dev, &bus->devices, bus_list) {
|
||||
/*
|
||||
* Skip already-present devices (which are on the
|
||||
* global device list.)
|
||||
*/
|
||||
if (!list_empty(&dev->global_list))
|
||||
/* Skip already-added devices */
|
||||
if (dev->is_added)
|
||||
continue;
|
||||
retval = pci_bus_add_device(dev);
|
||||
if (retval)
|
||||
|
@ -124,8 +118,7 @@ void pci_bus_add_devices(struct pci_bus *bus)
|
|||
}
|
||||
|
||||
list_for_each_entry(dev, &bus->devices, bus_list) {
|
||||
|
||||
BUG_ON(list_empty(&dev->global_list));
|
||||
BUG_ON(!dev->is_added);
|
||||
|
||||
/*
|
||||
* If there is an unattached subordinate bus, attach
|
||||
|
|
|
@ -63,7 +63,7 @@ config HOTPLUG_PCI_COMPAQ_NVRAM
|
|||
|
||||
config HOTPLUG_PCI_IBM
|
||||
tristate "IBM PCI Hotplug driver"
|
||||
depends on X86_IO_APIC && X86 && PCI_BIOS && PCI_LEGACY
|
||||
depends on X86_IO_APIC && X86 && PCI_BIOS
|
||||
help
|
||||
Say Y here if you have a motherboard with a IBM PCI Hotplug
|
||||
controller.
|
||||
|
@ -119,7 +119,7 @@ config HOTPLUG_PCI_CPCI_ZT5550
|
|||
|
||||
config HOTPLUG_PCI_CPCI_GENERIC
|
||||
tristate "Generic port I/O CompactPCI Hotplug driver"
|
||||
depends on HOTPLUG_PCI_CPCI && X86 && PCI_LEGACY
|
||||
depends on HOTPLUG_PCI_CPCI && X86
|
||||
help
|
||||
Say Y here if you have a CompactPCI system card that exposes the #ENUM
|
||||
hotswap signal as a bit in a system register that can be read through
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
|
||||
#define MY_NAME "acpi_pcihp"
|
||||
|
||||
#define dbg(fmt, arg...) do { if (debug_acpi) printk(KERN_DEBUG "%s: %s: " fmt , MY_NAME , __FUNCTION__ , ## arg); } while (0)
|
||||
#define dbg(fmt, arg...) do { if (debug_acpi) printk(KERN_DEBUG "%s: %s: " fmt , MY_NAME , __func__ , ## arg); } while (0)
|
||||
#define err(format, arg...) printk(KERN_ERR "%s: " format , MY_NAME , ## arg)
|
||||
#define info(format, arg...) printk(KERN_INFO "%s: " format , MY_NAME , ## arg)
|
||||
#define warn(format, arg...) printk(KERN_WARNING "%s: " format , MY_NAME , ## arg)
|
||||
|
@ -71,7 +71,7 @@ decode_type0_hpx_record(union acpi_object *record, struct hotplug_params *hpx)
|
|||
default:
|
||||
printk(KERN_WARNING
|
||||
"%s: Type 0 Revision %d record not supported\n",
|
||||
__FUNCTION__, revision);
|
||||
__func__, revision);
|
||||
return AE_ERROR;
|
||||
}
|
||||
return AE_OK;
|
||||
|
@ -100,7 +100,7 @@ decode_type1_hpx_record(union acpi_object *record, struct hotplug_params *hpx)
|
|||
default:
|
||||
printk(KERN_WARNING
|
||||
"%s: Type 1 Revision %d record not supported\n",
|
||||
__FUNCTION__, revision);
|
||||
__func__, revision);
|
||||
return AE_ERROR;
|
||||
}
|
||||
return AE_OK;
|
||||
|
@ -142,7 +142,7 @@ decode_type2_hpx_record(union acpi_object *record, struct hotplug_params *hpx)
|
|||
default:
|
||||
printk(KERN_WARNING
|
||||
"%s: Type 2 Revision %d record not supported\n",
|
||||
__FUNCTION__, revision);
|
||||
__func__, revision);
|
||||
return AE_ERROR;
|
||||
}
|
||||
return AE_OK;
|
||||
|
@ -203,7 +203,7 @@ acpi_run_hpx(acpi_handle handle, struct hotplug_params *hpx)
|
|||
break;
|
||||
default:
|
||||
printk(KERN_ERR "%s: Type %d record not supported\n",
|
||||
__FUNCTION__, type);
|
||||
__func__, type);
|
||||
status = AE_ERROR;
|
||||
goto exit;
|
||||
}
|
||||
|
@ -235,7 +235,7 @@ acpi_run_hpp(acpi_handle handle, struct hotplug_params *hpp)
|
|||
ret_buf.pointer = kmalloc (ret_buf.length, GFP_KERNEL);
|
||||
if (!ret_buf.pointer) {
|
||||
printk(KERN_ERR "%s:%s alloc for _HPP fail\n",
|
||||
__FUNCTION__, (char *)string.pointer);
|
||||
__func__, (char *)string.pointer);
|
||||
kfree(string.pointer);
|
||||
return AE_NO_MEMORY;
|
||||
}
|
||||
|
@ -245,7 +245,7 @@ acpi_run_hpp(acpi_handle handle, struct hotplug_params *hpp)
|
|||
break;
|
||||
default:
|
||||
if (ACPI_FAILURE(status)) {
|
||||
pr_debug("%s:%s _HPP fail=0x%x\n", __FUNCTION__,
|
||||
pr_debug("%s:%s _HPP fail=0x%x\n", __func__,
|
||||
(char *)string.pointer, status);
|
||||
kfree(string.pointer);
|
||||
return status;
|
||||
|
@ -254,7 +254,7 @@ acpi_run_hpp(acpi_handle handle, struct hotplug_params *hpp)
|
|||
|
||||
ext_obj = (union acpi_object *) ret_buf.pointer;
|
||||
if (ext_obj->type != ACPI_TYPE_PACKAGE) {
|
||||
printk(KERN_ERR "%s:%s _HPP obj not a package\n", __FUNCTION__,
|
||||
printk(KERN_ERR "%s:%s _HPP obj not a package\n", __func__,
|
||||
(char *)string.pointer);
|
||||
status = AE_ERROR;
|
||||
goto free_and_return;
|
||||
|
@ -270,7 +270,7 @@ acpi_run_hpp(acpi_handle handle, struct hotplug_params *hpp)
|
|||
break;
|
||||
default:
|
||||
printk(KERN_ERR "%s:%s _HPP obj type incorrect\n",
|
||||
__FUNCTION__, (char *)string.pointer);
|
||||
__func__, (char *)string.pointer);
|
||||
status = AE_ERROR;
|
||||
goto free_and_return;
|
||||
}
|
||||
|
@ -311,12 +311,12 @@ acpi_status acpi_run_oshp(acpi_handle handle)
|
|||
if (ACPI_FAILURE(status))
|
||||
if (status != AE_NOT_FOUND)
|
||||
printk(KERN_ERR "%s:%s OSHP fails=0x%x\n",
|
||||
__FUNCTION__, (char *)string.pointer, status);
|
||||
__func__, (char *)string.pointer, status);
|
||||
else
|
||||
dbg("%s:%s OSHP not found\n",
|
||||
__FUNCTION__, (char *)string.pointer);
|
||||
__func__, (char *)string.pointer);
|
||||
else
|
||||
pr_debug("%s:%s OSHP passes\n", __FUNCTION__,
|
||||
pr_debug("%s:%s OSHP passes\n", __func__,
|
||||
(char *)string.pointer);
|
||||
|
||||
kfree(string.pointer);
|
||||
|
|
|
@ -138,7 +138,7 @@ static int enable_slot(struct hotplug_slot *hotplug_slot)
|
|||
{
|
||||
struct slot *slot = hotplug_slot->private;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
/* enable the specified slot */
|
||||
return acpiphp_enable_slot(slot->acpi_slot);
|
||||
|
@ -156,7 +156,7 @@ static int disable_slot(struct hotplug_slot *hotplug_slot)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
int retval;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
/* disable the specified slot */
|
||||
retval = acpiphp_disable_slot(slot->acpi_slot);
|
||||
|
@ -179,7 +179,7 @@ static int disable_slot(struct hotplug_slot *hotplug_slot)
|
|||
{
|
||||
int retval = -ENODEV;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
if (attention_info && try_module_get(attention_info->owner)) {
|
||||
retval = attention_info->set_attn(hotplug_slot, status);
|
||||
|
@ -202,7 +202,7 @@ static int get_power_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
{
|
||||
struct slot *slot = hotplug_slot->private;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
*value = acpiphp_get_power_status(slot->acpi_slot);
|
||||
|
||||
|
@ -224,7 +224,7 @@ static int get_attention_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
{
|
||||
int retval = -EINVAL;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
if (attention_info && try_module_get(attention_info->owner)) {
|
||||
retval = attention_info->get_attn(hotplug_slot, value);
|
||||
|
@ -247,7 +247,7 @@ static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
{
|
||||
struct slot *slot = hotplug_slot->private;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
*value = acpiphp_get_latch_status(slot->acpi_slot);
|
||||
|
||||
|
@ -267,7 +267,7 @@ static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
{
|
||||
struct slot *slot = hotplug_slot->private;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
*value = acpiphp_get_adapter_status(slot->acpi_slot);
|
||||
|
||||
|
@ -284,7 +284,7 @@ static int get_address(struct hotplug_slot *hotplug_slot, u32 *value)
|
|||
{
|
||||
struct slot *slot = hotplug_slot->private;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
*value = acpiphp_get_address(slot->acpi_slot);
|
||||
|
||||
|
@ -318,7 +318,7 @@ static void release_slot(struct hotplug_slot *hotplug_slot)
|
|||
{
|
||||
struct slot *slot = hotplug_slot->private;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
kfree(slot->hotplug_slot);
|
||||
kfree(slot);
|
||||
|
|
|
@ -352,7 +352,7 @@ static void decode_hpp(struct acpiphp_bridge *bridge)
|
|||
/* use default numbers */
|
||||
printk(KERN_WARNING
|
||||
"%s: Could not get hotplug parameters. Use defaults\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
bridge->hpp.t0 = &bridge->hpp.type0_data;
|
||||
bridge->hpp.t0->revision = 0;
|
||||
bridge->hpp.t0->cache_line_size = 0x10;
|
||||
|
@ -534,7 +534,7 @@ find_p2p_bridge(acpi_handle handle, u32 lvl, void *context, void **rv)
|
|||
|
||||
status = acpi_evaluate_integer(handle, "_ADR", NULL, &tmp);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
dbg("%s: _ADR evaluation failure\n", __FUNCTION__);
|
||||
dbg("%s: _ADR evaluation failure\n", __func__);
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
|
@ -578,7 +578,7 @@ static int add_bridge(acpi_handle handle)
|
|||
if (ACPI_SUCCESS(status)) {
|
||||
status = acpi_evaluate_integer(handle, "_STA", NULL, &tmp);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
dbg("%s: _STA evaluation failure\n", __FUNCTION__);
|
||||
dbg("%s: _STA evaluation failure\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
if ((tmp & ACPI_STA_FUNCTIONING) == 0)
|
||||
|
@ -928,10 +928,10 @@ static int power_on_slot(struct acpiphp_slot *slot)
|
|||
func = list_entry(l, struct acpiphp_func, sibling);
|
||||
|
||||
if (func->flags & FUNC_HAS_PS0) {
|
||||
dbg("%s: executing _PS0\n", __FUNCTION__);
|
||||
dbg("%s: executing _PS0\n", __func__);
|
||||
status = acpi_evaluate_object(func->handle, "_PS0", NULL, NULL);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
warn("%s: _PS0 failed\n", __FUNCTION__);
|
||||
warn("%s: _PS0 failed\n", __func__);
|
||||
retval = -1;
|
||||
goto err_exit;
|
||||
} else
|
||||
|
@ -966,7 +966,7 @@ static int power_off_slot(struct acpiphp_slot *slot)
|
|||
if (func->flags & FUNC_HAS_PS3) {
|
||||
status = acpi_evaluate_object(func->handle, "_PS3", NULL, NULL);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
warn("%s: _PS3 failed\n", __FUNCTION__);
|
||||
warn("%s: _PS3 failed\n", __func__);
|
||||
retval = -1;
|
||||
goto err_exit;
|
||||
} else
|
||||
|
@ -1300,7 +1300,7 @@ int acpiphp_eject_slot(struct acpiphp_slot *slot)
|
|||
|
||||
status = acpi_evaluate_object(func->handle, "_EJ0", &arg_list, NULL);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
warn("%s: _EJ0 failed\n", __FUNCTION__);
|
||||
warn("%s: _EJ0 failed\n", __func__);
|
||||
return -1;
|
||||
} else
|
||||
break;
|
||||
|
@ -1349,7 +1349,7 @@ static int acpiphp_check_bridge(struct acpiphp_bridge *bridge)
|
|||
}
|
||||
}
|
||||
|
||||
dbg("%s: %d enabled, %d disabled\n", __FUNCTION__, enabled, disabled);
|
||||
dbg("%s: %d enabled, %d disabled\n", __func__, enabled, disabled);
|
||||
|
||||
err_exit:
|
||||
return retval;
|
||||
|
@ -1527,7 +1527,7 @@ check_sub_bridges(acpi_handle handle, u32 lvl, void *context, void **rv)
|
|||
if (bridge) {
|
||||
acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer);
|
||||
dbg("%s: re-enumerating slots under %s\n",
|
||||
__FUNCTION__, objname);
|
||||
__func__, objname);
|
||||
acpiphp_check_bridge(bridge);
|
||||
}
|
||||
return AE_OK ;
|
||||
|
@ -1572,10 +1572,10 @@ static void handle_hotplug_event_bridge(acpi_handle handle, u32 type, void *cont
|
|||
switch (type) {
|
||||
case ACPI_NOTIFY_BUS_CHECK:
|
||||
/* bus re-enumerate */
|
||||
dbg("%s: Bus check notify on %s\n", __FUNCTION__, objname);
|
||||
dbg("%s: Bus check notify on %s\n", __func__, objname);
|
||||
if (bridge) {
|
||||
dbg("%s: re-enumerating slots under %s\n",
|
||||
__FUNCTION__, objname);
|
||||
__func__, objname);
|
||||
acpiphp_check_bridge(bridge);
|
||||
}
|
||||
if (num_sub_bridges)
|
||||
|
@ -1585,18 +1585,18 @@ static void handle_hotplug_event_bridge(acpi_handle handle, u32 type, void *cont
|
|||
|
||||
case ACPI_NOTIFY_DEVICE_CHECK:
|
||||
/* device check */
|
||||
dbg("%s: Device check notify on %s\n", __FUNCTION__, objname);
|
||||
dbg("%s: Device check notify on %s\n", __func__, objname);
|
||||
acpiphp_check_bridge(bridge);
|
||||
break;
|
||||
|
||||
case ACPI_NOTIFY_DEVICE_WAKE:
|
||||
/* wake event */
|
||||
dbg("%s: Device wake notify on %s\n", __FUNCTION__, objname);
|
||||
dbg("%s: Device wake notify on %s\n", __func__, objname);
|
||||
break;
|
||||
|
||||
case ACPI_NOTIFY_EJECT_REQUEST:
|
||||
/* request device eject */
|
||||
dbg("%s: Device eject notify on %s\n", __FUNCTION__, objname);
|
||||
dbg("%s: Device eject notify on %s\n", __func__, objname);
|
||||
if ((bridge->type != BRIDGE_TYPE_HOST) &&
|
||||
(bridge->flags & BRIDGE_HAS_EJ0)) {
|
||||
struct acpiphp_slot *slot;
|
||||
|
@ -1649,24 +1649,24 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type, void *contex
|
|||
switch (type) {
|
||||
case ACPI_NOTIFY_BUS_CHECK:
|
||||
/* bus re-enumerate */
|
||||
dbg("%s: Bus check notify on %s\n", __FUNCTION__, objname);
|
||||
dbg("%s: Bus check notify on %s\n", __func__, objname);
|
||||
acpiphp_enable_slot(func->slot);
|
||||
break;
|
||||
|
||||
case ACPI_NOTIFY_DEVICE_CHECK:
|
||||
/* device check : re-enumerate from parent bus */
|
||||
dbg("%s: Device check notify on %s\n", __FUNCTION__, objname);
|
||||
dbg("%s: Device check notify on %s\n", __func__, objname);
|
||||
acpiphp_check_bridge(func->slot->bridge);
|
||||
break;
|
||||
|
||||
case ACPI_NOTIFY_DEVICE_WAKE:
|
||||
/* wake event */
|
||||
dbg("%s: Device wake notify on %s\n", __FUNCTION__, objname);
|
||||
dbg("%s: Device wake notify on %s\n", __func__, objname);
|
||||
break;
|
||||
|
||||
case ACPI_NOTIFY_EJECT_REQUEST:
|
||||
/* request device eject */
|
||||
dbg("%s: Device eject notify on %s\n", __FUNCTION__, objname);
|
||||
dbg("%s: Device eject notify on %s\n", __func__, objname);
|
||||
if (!(acpiphp_disable_slot(func->slot)))
|
||||
acpiphp_eject_slot(func->slot);
|
||||
break;
|
||||
|
@ -1796,7 +1796,7 @@ int acpiphp_enable_slot(struct acpiphp_slot *slot)
|
|||
if (retval)
|
||||
power_off_slot(slot);
|
||||
} else {
|
||||
dbg("%s: Slot status is not ACPI_STA_ALL\n", __FUNCTION__);
|
||||
dbg("%s: Slot status is not ACPI_STA_ALL\n", __func__);
|
||||
power_off_slot(slot);
|
||||
}
|
||||
|
||||
|
|
|
@ -186,7 +186,7 @@ static int ibm_set_attention_status(struct hotplug_slot *slot, u8 status)
|
|||
|
||||
ibm_slot = ibm_slot_from_id(hpslot_to_sun(slot));
|
||||
|
||||
dbg("%s: set slot %d (%d) attention status to %d\n", __FUNCTION__,
|
||||
dbg("%s: set slot %d (%d) attention status to %d\n", __func__,
|
||||
ibm_slot->slot.slot_num, ibm_slot->slot.slot_id,
|
||||
(status ? 1 : 0));
|
||||
|
||||
|
@ -231,7 +231,7 @@ static int ibm_get_attention_status(struct hotplug_slot *slot, u8 *status)
|
|||
else
|
||||
*status = 0;
|
||||
|
||||
dbg("%s: get slot %d (%d) attention status is %d\n", __FUNCTION__,
|
||||
dbg("%s: get slot %d (%d) attention status is %d\n", __func__,
|
||||
ibm_slot->slot.slot_num, ibm_slot->slot.slot_id,
|
||||
*status);
|
||||
|
||||
|
@ -263,10 +263,10 @@ static void ibm_handle_events(acpi_handle handle, u32 event, void *context)
|
|||
u8 subevent = event & 0xf0;
|
||||
struct notification *note = context;
|
||||
|
||||
dbg("%s: Received notification %02x\n", __FUNCTION__, event);
|
||||
dbg("%s: Received notification %02x\n", __func__, event);
|
||||
|
||||
if (subevent == 0x80) {
|
||||
dbg("%s: generationg bus event\n", __FUNCTION__);
|
||||
dbg("%s: generationg bus event\n", __func__);
|
||||
acpi_bus_generate_proc_event(note->device, note->event, detail);
|
||||
acpi_bus_generate_netlink_event(note->device->pnp.device_class,
|
||||
note->device->dev.bus_id,
|
||||
|
@ -299,7 +299,7 @@ static int ibm_get_table_from_acpi(char **bufp)
|
|||
|
||||
status = acpi_evaluate_object(ibm_acpi_handle, "APCI", NULL, &buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
err("%s: APCI evaluation failed\n", __FUNCTION__);
|
||||
err("%s: APCI evaluation failed\n", __func__);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
@ -307,13 +307,13 @@ static int ibm_get_table_from_acpi(char **bufp)
|
|||
if (!(package) ||
|
||||
(package->type != ACPI_TYPE_PACKAGE) ||
|
||||
!(package->package.elements)) {
|
||||
err("%s: Invalid APCI object\n", __FUNCTION__);
|
||||
err("%s: Invalid APCI object\n", __func__);
|
||||
goto read_table_done;
|
||||
}
|
||||
|
||||
for(size = 0, i = 0; i < package->package.count; i++) {
|
||||
if (package->package.elements[i].type != ACPI_TYPE_BUFFER) {
|
||||
err("%s: Invalid APCI element %d\n", __FUNCTION__, i);
|
||||
err("%s: Invalid APCI element %d\n", __func__, i);
|
||||
goto read_table_done;
|
||||
}
|
||||
size += package->package.elements[i].buffer.length;
|
||||
|
@ -324,7 +324,7 @@ static int ibm_get_table_from_acpi(char **bufp)
|
|||
|
||||
lbuf = kzalloc(size, GFP_KERNEL);
|
||||
dbg("%s: element count: %i, ASL table size: %i, &table = 0x%p\n",
|
||||
__FUNCTION__, package->package.count, size, lbuf);
|
||||
__func__, package->package.count, size, lbuf);
|
||||
|
||||
if (lbuf) {
|
||||
*bufp = lbuf;
|
||||
|
@ -368,7 +368,7 @@ static ssize_t ibm_read_apci_table(struct kobject *kobj,
|
|||
int bytes_read = -EINVAL;
|
||||
char *table = NULL;
|
||||
|
||||
dbg("%s: pos = %d, size = %zd\n", __FUNCTION__, (int)pos, size);
|
||||
dbg("%s: pos = %d, size = %zd\n", __func__, (int)pos, size);
|
||||
|
||||
if (pos == 0) {
|
||||
bytes_read = ibm_get_table_from_acpi(&table);
|
||||
|
@ -402,7 +402,7 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle,
|
|||
status = acpi_get_object_info(handle, &info_buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
err("%s: Failed to get device information status=0x%x\n",
|
||||
__FUNCTION__, status);
|
||||
__func__, status);
|
||||
return retval;
|
||||
}
|
||||
info = info_buffer.pointer;
|
||||
|
@ -432,18 +432,18 @@ static int __init ibm_acpiphp_init(void)
|
|||
struct acpi_device *device;
|
||||
struct kobject *sysdir = &pci_hotplug_slots_kset->kobj;
|
||||
|
||||
dbg("%s\n", __FUNCTION__);
|
||||
dbg("%s\n", __func__);
|
||||
|
||||
if (acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
|
||||
ACPI_UINT32_MAX, ibm_find_acpi_device,
|
||||
&ibm_acpi_handle, NULL) != FOUND_APCI) {
|
||||
err("%s: acpi_walk_namespace failed\n", __FUNCTION__);
|
||||
err("%s: acpi_walk_namespace failed\n", __func__);
|
||||
retval = -ENODEV;
|
||||
goto init_return;
|
||||
}
|
||||
dbg("%s: found IBM aPCI device\n", __FUNCTION__);
|
||||
dbg("%s: found IBM aPCI device\n", __func__);
|
||||
if (acpi_bus_get_device(ibm_acpi_handle, &device)) {
|
||||
err("%s: acpi_bus_get_device failed\n", __FUNCTION__);
|
||||
err("%s: acpi_bus_get_device failed\n", __func__);
|
||||
retval = -ENODEV;
|
||||
goto init_return;
|
||||
}
|
||||
|
@ -458,7 +458,7 @@ static int __init ibm_acpiphp_init(void)
|
|||
&ibm_note);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
err("%s: Failed to register notification handler\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
retval = -EBUSY;
|
||||
goto init_cleanup;
|
||||
}
|
||||
|
@ -479,17 +479,17 @@ static void __exit ibm_acpiphp_exit(void)
|
|||
acpi_status status;
|
||||
struct kobject *sysdir = &pci_hotplug_slots_kset->kobj;
|
||||
|
||||
dbg("%s\n", __FUNCTION__);
|
||||
dbg("%s\n", __func__);
|
||||
|
||||
if (acpiphp_unregister_attention(&ibm_attention_info))
|
||||
err("%s: attention info deregistration failed", __FUNCTION__);
|
||||
err("%s: attention info deregistration failed", __func__);
|
||||
|
||||
status = acpi_remove_notify_handler(
|
||||
ibm_acpi_handle,
|
||||
ACPI_DEVICE_NOTIFY,
|
||||
ibm_handle_events);
|
||||
if (ACPI_FAILURE(status))
|
||||
err("%s: Notification handler removal failed\n", __FUNCTION__);
|
||||
err("%s: Notification handler removal failed\n", __func__);
|
||||
/* remove the /sys entries */
|
||||
sysfs_remove_bin_file(sysdir, &ibm_apci_table_attr);
|
||||
}
|
||||
|
|
|
@ -108,7 +108,7 @@ enable_slot(struct hotplug_slot *hotplug_slot)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
int retval = 0;
|
||||
|
||||
dbg("%s - physical_slot = %s", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s", __func__, hotplug_slot->name);
|
||||
|
||||
if (controller->ops->set_power)
|
||||
retval = controller->ops->set_power(slot, 1);
|
||||
|
@ -121,25 +121,25 @@ disable_slot(struct hotplug_slot *hotplug_slot)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
int retval = 0;
|
||||
|
||||
dbg("%s - physical_slot = %s", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s", __func__, hotplug_slot->name);
|
||||
|
||||
down_write(&list_rwsem);
|
||||
|
||||
/* Unconfigure device */
|
||||
dbg("%s - unconfiguring slot %s",
|
||||
__FUNCTION__, slot->hotplug_slot->name);
|
||||
__func__, slot->hotplug_slot->name);
|
||||
if ((retval = cpci_unconfigure_slot(slot))) {
|
||||
err("%s - could not unconfigure slot %s",
|
||||
__FUNCTION__, slot->hotplug_slot->name);
|
||||
__func__, slot->hotplug_slot->name);
|
||||
goto disable_error;
|
||||
}
|
||||
dbg("%s - finished unconfiguring slot %s",
|
||||
__FUNCTION__, slot->hotplug_slot->name);
|
||||
__func__, slot->hotplug_slot->name);
|
||||
|
||||
/* Clear EXT (by setting it) */
|
||||
if (cpci_clear_ext(slot)) {
|
||||
err("%s - could not clear EXT for slot %s",
|
||||
__FUNCTION__, slot->hotplug_slot->name);
|
||||
__func__, slot->hotplug_slot->name);
|
||||
retval = -ENODEV;
|
||||
goto disable_error;
|
||||
}
|
||||
|
@ -372,7 +372,7 @@ init_slots(int clear_ins)
|
|||
struct slot *slot;
|
||||
struct pci_dev* dev;
|
||||
|
||||
dbg("%s - enter", __FUNCTION__);
|
||||
dbg("%s - enter", __func__);
|
||||
down_read(&list_rwsem);
|
||||
if (!slots) {
|
||||
up_read(&list_rwsem);
|
||||
|
@ -380,10 +380,10 @@ init_slots(int clear_ins)
|
|||
}
|
||||
list_for_each_entry(slot, &slot_list, slot_list) {
|
||||
dbg("%s - looking at slot %s",
|
||||
__FUNCTION__, slot->hotplug_slot->name);
|
||||
__func__, slot->hotplug_slot->name);
|
||||
if (clear_ins && cpci_check_and_clear_ins(slot))
|
||||
dbg("%s - cleared INS for slot %s",
|
||||
__FUNCTION__, slot->hotplug_slot->name);
|
||||
__func__, slot->hotplug_slot->name);
|
||||
dev = pci_get_slot(slot->bus, PCI_DEVFN(slot->number, 0));
|
||||
if (dev) {
|
||||
if (update_adapter_status(slot->hotplug_slot, 1))
|
||||
|
@ -394,7 +394,7 @@ init_slots(int clear_ins)
|
|||
}
|
||||
}
|
||||
up_read(&list_rwsem);
|
||||
dbg("%s - exit", __FUNCTION__);
|
||||
dbg("%s - exit", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -415,7 +415,7 @@ check_slots(void)
|
|||
extracted = inserted = 0;
|
||||
list_for_each_entry(slot, &slot_list, slot_list) {
|
||||
dbg("%s - looking at slot %s",
|
||||
__FUNCTION__, slot->hotplug_slot->name);
|
||||
__func__, slot->hotplug_slot->name);
|
||||
if (cpci_check_and_clear_ins(slot)) {
|
||||
/*
|
||||
* Some broken hardware (e.g. PLX 9054AB) asserts
|
||||
|
@ -430,28 +430,28 @@ check_slots(void)
|
|||
|
||||
/* Process insertion */
|
||||
dbg("%s - slot %s inserted",
|
||||
__FUNCTION__, slot->hotplug_slot->name);
|
||||
__func__, slot->hotplug_slot->name);
|
||||
|
||||
/* GSM, debug */
|
||||
hs_csr = cpci_get_hs_csr(slot);
|
||||
dbg("%s - slot %s HS_CSR (1) = %04x",
|
||||
__FUNCTION__, slot->hotplug_slot->name, hs_csr);
|
||||
__func__, slot->hotplug_slot->name, hs_csr);
|
||||
|
||||
/* Configure device */
|
||||
dbg("%s - configuring slot %s",
|
||||
__FUNCTION__, slot->hotplug_slot->name);
|
||||
__func__, slot->hotplug_slot->name);
|
||||
if (cpci_configure_slot(slot)) {
|
||||
err("%s - could not configure slot %s",
|
||||
__FUNCTION__, slot->hotplug_slot->name);
|
||||
__func__, slot->hotplug_slot->name);
|
||||
continue;
|
||||
}
|
||||
dbg("%s - finished configuring slot %s",
|
||||
__FUNCTION__, slot->hotplug_slot->name);
|
||||
__func__, slot->hotplug_slot->name);
|
||||
|
||||
/* GSM, debug */
|
||||
hs_csr = cpci_get_hs_csr(slot);
|
||||
dbg("%s - slot %s HS_CSR (2) = %04x",
|
||||
__FUNCTION__, slot->hotplug_slot->name, hs_csr);
|
||||
__func__, slot->hotplug_slot->name, hs_csr);
|
||||
|
||||
if (update_latch_status(slot->hotplug_slot, 1))
|
||||
warn("failure to update latch file");
|
||||
|
@ -464,18 +464,18 @@ check_slots(void)
|
|||
/* GSM, debug */
|
||||
hs_csr = cpci_get_hs_csr(slot);
|
||||
dbg("%s - slot %s HS_CSR (3) = %04x",
|
||||
__FUNCTION__, slot->hotplug_slot->name, hs_csr);
|
||||
__func__, slot->hotplug_slot->name, hs_csr);
|
||||
|
||||
inserted++;
|
||||
} else if (cpci_check_ext(slot)) {
|
||||
/* Process extraction request */
|
||||
dbg("%s - slot %s extracted",
|
||||
__FUNCTION__, slot->hotplug_slot->name);
|
||||
__func__, slot->hotplug_slot->name);
|
||||
|
||||
/* GSM, debug */
|
||||
hs_csr = cpci_get_hs_csr(slot);
|
||||
dbg("%s - slot %s HS_CSR = %04x",
|
||||
__FUNCTION__, slot->hotplug_slot->name, hs_csr);
|
||||
__func__, slot->hotplug_slot->name, hs_csr);
|
||||
|
||||
if (!slot->extracting) {
|
||||
if (update_latch_status(slot->hotplug_slot, 0)) {
|
||||
|
@ -519,7 +519,7 @@ event_thread(void *data)
|
|||
{
|
||||
int rc;
|
||||
|
||||
dbg("%s - event thread started", __FUNCTION__);
|
||||
dbg("%s - event thread started", __func__);
|
||||
while (1) {
|
||||
dbg("event thread sleeping");
|
||||
set_current_state(TASK_INTERRUPTIBLE);
|
||||
|
@ -532,7 +532,7 @@ event_thread(void *data)
|
|||
/* Give userspace a chance to handle extraction */
|
||||
msleep(500);
|
||||
} else if (rc < 0) {
|
||||
dbg("%s - error checking slots", __FUNCTION__);
|
||||
dbg("%s - error checking slots", __func__);
|
||||
thread_finished = 1;
|
||||
goto out;
|
||||
}
|
||||
|
@ -541,7 +541,7 @@ event_thread(void *data)
|
|||
break;
|
||||
|
||||
/* Re-enable ENUM# interrupt */
|
||||
dbg("%s - re-enabling irq", __FUNCTION__);
|
||||
dbg("%s - re-enabling irq", __func__);
|
||||
controller->ops->enable_irq();
|
||||
}
|
||||
out:
|
||||
|
@ -564,7 +564,7 @@ poll_thread(void *data)
|
|||
/* Give userspace a chance to handle extraction */
|
||||
msleep(500);
|
||||
} else if (rc < 0) {
|
||||
dbg("%s - error checking slots", __FUNCTION__);
|
||||
dbg("%s - error checking slots", __func__);
|
||||
thread_finished = 1;
|
||||
goto out;
|
||||
}
|
||||
|
@ -621,7 +621,7 @@ cpci_hp_register_controller(struct cpci_hp_controller *new_controller)
|
|||
status = -ENODEV;
|
||||
}
|
||||
dbg("%s - acquired controller irq %d",
|
||||
__FUNCTION__, new_controller->irq);
|
||||
__func__, new_controller->irq);
|
||||
}
|
||||
if (!status)
|
||||
controller = new_controller;
|
||||
|
@ -673,7 +673,7 @@ cpci_hp_start(void)
|
|||
static int first = 1;
|
||||
int status;
|
||||
|
||||
dbg("%s - enter", __FUNCTION__);
|
||||
dbg("%s - enter", __func__);
|
||||
if (!controller)
|
||||
return -ENODEV;
|
||||
|
||||
|
@ -693,14 +693,14 @@ cpci_hp_start(void)
|
|||
status = cpci_start_thread();
|
||||
if (status)
|
||||
return status;
|
||||
dbg("%s - thread started", __FUNCTION__);
|
||||
dbg("%s - thread started", __func__);
|
||||
|
||||
if (controller->irq) {
|
||||
/* Start enum interrupt processing */
|
||||
dbg("%s - enabling irq", __FUNCTION__);
|
||||
dbg("%s - enabling irq", __func__);
|
||||
controller->ops->enable_irq();
|
||||
}
|
||||
dbg("%s - exit", __FUNCTION__);
|
||||
dbg("%s - exit", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -711,7 +711,7 @@ cpci_hp_stop(void)
|
|||
return -ENODEV;
|
||||
if (controller->irq) {
|
||||
/* Stop enum interrupt processing */
|
||||
dbg("%s - disabling irq", __FUNCTION__);
|
||||
dbg("%s - disabling irq", __func__);
|
||||
controller->ops->disable_irq();
|
||||
}
|
||||
cpci_stop_thread();
|
||||
|
|
|
@ -255,7 +255,7 @@ int __ref cpci_configure_slot(struct slot *slot)
|
|||
struct pci_bus *parent;
|
||||
int fn;
|
||||
|
||||
dbg("%s - enter", __FUNCTION__);
|
||||
dbg("%s - enter", __func__);
|
||||
|
||||
if (slot->dev == NULL) {
|
||||
dbg("pci_dev null, finding %02x:%02x:%x",
|
||||
|
@ -273,7 +273,7 @@ int __ref cpci_configure_slot(struct slot *slot)
|
|||
* we will only call this case when lookup fails.
|
||||
*/
|
||||
n = pci_scan_slot(slot->bus, slot->devfn);
|
||||
dbg("%s: pci_scan_slot returned %d", __FUNCTION__, n);
|
||||
dbg("%s: pci_scan_slot returned %d", __func__, n);
|
||||
slot->dev = pci_get_slot(slot->bus, slot->devfn);
|
||||
if (slot->dev == NULL) {
|
||||
err("Could not find PCI device for slot %02x", slot->number);
|
||||
|
@ -322,7 +322,7 @@ int __ref cpci_configure_slot(struct slot *slot)
|
|||
pci_bus_add_devices(parent);
|
||||
pci_enable_bridges(parent);
|
||||
|
||||
dbg("%s - exit", __FUNCTION__);
|
||||
dbg("%s - exit", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -331,7 +331,7 @@ int cpci_unconfigure_slot(struct slot* slot)
|
|||
int i;
|
||||
struct pci_dev *dev;
|
||||
|
||||
dbg("%s - enter", __FUNCTION__);
|
||||
dbg("%s - enter", __func__);
|
||||
if (!slot->dev) {
|
||||
err("No device for slot %02x\n", slot->number);
|
||||
return -ENODEV;
|
||||
|
@ -348,6 +348,6 @@ int cpci_unconfigure_slot(struct slot* slot)
|
|||
pci_dev_put(slot->dev);
|
||||
slot->dev = NULL;
|
||||
|
||||
dbg("%s - exit", __FUNCTION__);
|
||||
dbg("%s - exit", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -154,12 +154,18 @@ static int __init cpcihp_generic_init(void)
|
|||
if(!r)
|
||||
return -EBUSY;
|
||||
|
||||
dev = pci_find_slot(bridge_busnr, PCI_DEVFN(bridge_slot, 0));
|
||||
bus = pci_find_bus(0, bridge_busnr);
|
||||
if (!bus) {
|
||||
err("Invalid bus number %d", bridge_busnr);
|
||||
return -EINVAL;
|
||||
}
|
||||
dev = pci_get_slot(bus, PCI_DEVFN(bridge_slot, 0));
|
||||
if(!dev || dev->hdr_type != PCI_HEADER_TYPE_BRIDGE) {
|
||||
err("Invalid bridge device %s", bridge);
|
||||
return -EINVAL;
|
||||
}
|
||||
bus = dev->subordinate;
|
||||
pci_dev_put(dev);
|
||||
|
||||
memset(&generic_hpc, 0, sizeof (struct cpci_hp_controller));
|
||||
generic_hpc_ops.query_enum = query_enum;
|
||||
|
|
|
@ -674,7 +674,7 @@ static inline int cpq_get_latch_status(struct controller *ctrl, struct slot *slo
|
|||
|
||||
hp_slot = slot->device - ctrl->slot_device_offset;
|
||||
dbg("%s: slot->device = %d, ctrl->slot_device_offset = %d \n",
|
||||
__FUNCTION__, slot->device, ctrl->slot_device_offset);
|
||||
__func__, slot->device, ctrl->slot_device_offset);
|
||||
|
||||
status = (readl(ctrl->hpc_reg + INT_INPUT_CLEAR) & (0x01L << hp_slot));
|
||||
|
||||
|
@ -709,7 +709,7 @@ static inline int wait_for_ctrl_irq(struct controller *ctrl)
|
|||
DECLARE_WAITQUEUE(wait, current);
|
||||
int retval = 0;
|
||||
|
||||
dbg("%s - start\n", __FUNCTION__);
|
||||
dbg("%s - start\n", __func__);
|
||||
add_wait_queue(&ctrl->queue, &wait);
|
||||
/* Sleep for up to 1 second to wait for the LED to change. */
|
||||
msleep_interruptible(1000);
|
||||
|
@ -717,7 +717,7 @@ static inline int wait_for_ctrl_irq(struct controller *ctrl)
|
|||
if (signal_pending(current))
|
||||
retval = -EINTR;
|
||||
|
||||
dbg("%s - end\n", __FUNCTION__);
|
||||
dbg("%s - end\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
|
@ -315,7 +315,7 @@ static void release_slot(struct hotplug_slot *hotplug_slot)
|
|||
{
|
||||
struct slot *slot = hotplug_slot->private;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
kfree(slot->hotplug_slot->info);
|
||||
kfree(slot->hotplug_slot->name);
|
||||
|
@ -338,7 +338,7 @@ static int ctrl_slot_setup(struct controller *ctrl,
|
|||
void __iomem *slot_entry= NULL;
|
||||
int result = -ENOMEM;
|
||||
|
||||
dbg("%s\n", __FUNCTION__);
|
||||
dbg("%s\n", __func__);
|
||||
|
||||
tempdword = readl(ctrl->hpc_reg + INT_INPUT_CLEAR);
|
||||
|
||||
|
@ -513,7 +513,7 @@ get_slot_mapping(struct pci_bus *bus, u8 bus_num, u8 dev_num, u8 *slot)
|
|||
|
||||
u8 tbus, tdevice, tslot, bridgeSlot;
|
||||
|
||||
dbg("%s: %p, %d, %d, %p\n", __FUNCTION__, bus, bus_num, dev_num, slot);
|
||||
dbg("%s: %p, %d, %d, %p\n", __func__, bus, bus_num, dev_num, slot);
|
||||
|
||||
bridgeSlot = 0xFF;
|
||||
|
||||
|
@ -636,7 +636,7 @@ static int set_attention_status (struct hotplug_slot *hotplug_slot, u8 status)
|
|||
u8 device;
|
||||
u8 function;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
if (cpqhp_get_bus_dev(ctrl, &bus, &devfn, slot->number) == -1)
|
||||
return -ENODEV;
|
||||
|
@ -663,7 +663,7 @@ static int process_SI(struct hotplug_slot *hotplug_slot)
|
|||
u8 device;
|
||||
u8 function;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
if (cpqhp_get_bus_dev(ctrl, &bus, &devfn, slot->number) == -1)
|
||||
return -ENODEV;
|
||||
|
@ -695,7 +695,7 @@ static int process_SS(struct hotplug_slot *hotplug_slot)
|
|||
u8 device;
|
||||
u8 function;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
if (cpqhp_get_bus_dev(ctrl, &bus, &devfn, slot->number) == -1)
|
||||
return -ENODEV;
|
||||
|
@ -708,7 +708,7 @@ static int process_SS(struct hotplug_slot *hotplug_slot)
|
|||
if (!slot_func)
|
||||
return -ENODEV;
|
||||
|
||||
dbg("In %s, slot_func = %p, ctrl = %p\n", __FUNCTION__, slot_func, ctrl);
|
||||
dbg("In %s, slot_func = %p, ctrl = %p\n", __func__, slot_func, ctrl);
|
||||
return cpqhp_process_SS(ctrl, slot_func);
|
||||
}
|
||||
|
||||
|
@ -718,7 +718,7 @@ static int hardware_test(struct hotplug_slot *hotplug_slot, u32 value)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
struct controller *ctrl = slot->ctrl;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
return cpqhp_hardware_test(ctrl, value);
|
||||
}
|
||||
|
@ -729,7 +729,7 @@ static int get_power_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
struct controller *ctrl = slot->ctrl;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
*value = get_slot_enabled(ctrl, slot);
|
||||
return 0;
|
||||
|
@ -740,7 +740,7 @@ static int get_attention_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
struct controller *ctrl = slot->ctrl;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
*value = cpq_get_attention_status(ctrl, slot);
|
||||
return 0;
|
||||
|
@ -751,7 +751,7 @@ static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
struct controller *ctrl = slot->ctrl;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
*value = cpq_get_latch_status(ctrl, slot);
|
||||
|
||||
|
@ -763,7 +763,7 @@ static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
struct controller *ctrl = slot->ctrl;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
*value = get_presence_status(ctrl, slot);
|
||||
|
||||
|
@ -775,7 +775,7 @@ static int get_max_bus_speed (struct hotplug_slot *hotplug_slot, enum pci_bus_sp
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
struct controller *ctrl = slot->ctrl;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
*value = ctrl->speed_capability;
|
||||
|
||||
|
@ -787,7 +787,7 @@ static int get_cur_bus_speed (struct hotplug_slot *hotplug_slot, enum pci_bus_sp
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
struct controller *ctrl = slot->ctrl;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
*value = ctrl->speed;
|
||||
|
||||
|
@ -841,7 +841,7 @@ static int cpqhpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
// TODO: This code can be made to support non-Compaq or Intel subsystem IDs
|
||||
rc = pci_read_config_word(pdev, PCI_SUBSYSTEM_VENDOR_ID, &subsystem_vid);
|
||||
if (rc) {
|
||||
err("%s : pci_read_config_word failed\n", __FUNCTION__);
|
||||
err("%s : pci_read_config_word failed\n", __func__);
|
||||
goto err_disable_device;
|
||||
}
|
||||
dbg("Subsystem Vendor ID: %x\n", subsystem_vid);
|
||||
|
@ -853,14 +853,14 @@ static int cpqhpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
|
||||
ctrl = kzalloc(sizeof(struct controller), GFP_KERNEL);
|
||||
if (!ctrl) {
|
||||
err("%s : out of memory\n", __FUNCTION__);
|
||||
err("%s : out of memory\n", __func__);
|
||||
rc = -ENOMEM;
|
||||
goto err_disable_device;
|
||||
}
|
||||
|
||||
rc = pci_read_config_word(pdev, PCI_SUBSYSTEM_ID, &subsystem_deviceid);
|
||||
if (rc) {
|
||||
err("%s : pci_read_config_word failed\n", __FUNCTION__);
|
||||
err("%s : pci_read_config_word failed\n", __func__);
|
||||
goto err_free_ctrl;
|
||||
}
|
||||
|
||||
|
@ -1142,7 +1142,7 @@ static int cpqhpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
rc = cpqhp_save_config(ctrl, ctrl->bus, readb(ctrl->hpc_reg + SLOT_MASK));
|
||||
if (rc) {
|
||||
err("%s: unable to save PCI configuration data, error %d\n",
|
||||
__FUNCTION__, rc);
|
||||
__func__, rc);
|
||||
goto err_iounmap;
|
||||
}
|
||||
|
||||
|
@ -1180,7 +1180,7 @@ static int cpqhpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
if (rc) {
|
||||
err(msg_initialization_err, 6);
|
||||
err("%s: unable to save PCI configuration data, error %d\n",
|
||||
__FUNCTION__, rc);
|
||||
__func__, rc);
|
||||
goto err_iounmap;
|
||||
}
|
||||
|
||||
|
|
|
@ -737,12 +737,12 @@ static struct pci_resource *get_resource(struct pci_resource **head, u32 size)
|
|||
|
||||
for (node = *head; node; node = node->next) {
|
||||
dbg("%s: req_size =%x node=%p, base=%x, length=%x\n",
|
||||
__FUNCTION__, size, node, node->base, node->length);
|
||||
__func__, size, node, node->base, node->length);
|
||||
if (node->length < size)
|
||||
continue;
|
||||
|
||||
if (node->base & (size - 1)) {
|
||||
dbg("%s: not aligned\n", __FUNCTION__);
|
||||
dbg("%s: not aligned\n", __func__);
|
||||
/* this one isn't base aligned properly
|
||||
* so we'll make a new entry and split it up */
|
||||
temp_dword = (node->base | (size-1)) + 1;
|
||||
|
@ -767,7 +767,7 @@ static struct pci_resource *get_resource(struct pci_resource **head, u32 size)
|
|||
|
||||
/* Don't need to check if too small since we already did */
|
||||
if (node->length > size) {
|
||||
dbg("%s: too big\n", __FUNCTION__);
|
||||
dbg("%s: too big\n", __func__);
|
||||
/* this one is longer than we need
|
||||
* so we'll make a new entry and split it up */
|
||||
split_node = kmalloc(sizeof(*split_node), GFP_KERNEL);
|
||||
|
@ -784,7 +784,7 @@ static struct pci_resource *get_resource(struct pci_resource **head, u32 size)
|
|||
node->next = split_node;
|
||||
} /* End of too big on top end */
|
||||
|
||||
dbg("%s: got one!!!\n", __FUNCTION__);
|
||||
dbg("%s: got one!!!\n", __func__);
|
||||
/* If we got here, then it is the right size
|
||||
* Now take it out of the list */
|
||||
if (*head == node) {
|
||||
|
@ -819,7 +819,7 @@ int cpqhp_resource_sort_and_combine(struct pci_resource **head)
|
|||
struct pci_resource *node2;
|
||||
int out_of_order = 1;
|
||||
|
||||
dbg("%s: head = %p, *head = %p\n", __FUNCTION__, head, *head);
|
||||
dbg("%s: head = %p, *head = %p\n", __func__, head, *head);
|
||||
|
||||
if (!(*head))
|
||||
return 1;
|
||||
|
@ -907,7 +907,7 @@ irqreturn_t cpqhp_ctrl_intr(int IRQ, void *data)
|
|||
/* Read to clear posted writes */
|
||||
misc = readw(ctrl->hpc_reg + MISC);
|
||||
|
||||
dbg ("%s - waking up\n", __FUNCTION__);
|
||||
dbg ("%s - waking up\n", __func__);
|
||||
wake_up_interruptible(&ctrl->queue);
|
||||
}
|
||||
|
||||
|
@ -1421,7 +1421,7 @@ static u32 board_added(struct pci_func *func, struct controller *ctrl)
|
|||
|
||||
hp_slot = func->device - ctrl->slot_device_offset;
|
||||
dbg("%s: func->device, slot_offset, hp_slot = %d, %d ,%d\n",
|
||||
__FUNCTION__, func->device, ctrl->slot_device_offset, hp_slot);
|
||||
__func__, func->device, ctrl->slot_device_offset, hp_slot);
|
||||
|
||||
mutex_lock(&ctrl->crit_sect);
|
||||
|
||||
|
@ -1466,55 +1466,55 @@ static u32 board_added(struct pci_func *func, struct controller *ctrl)
|
|||
|
||||
/* turn on board and blink green LED */
|
||||
|
||||
dbg("%s: before down\n", __FUNCTION__);
|
||||
dbg("%s: before down\n", __func__);
|
||||
mutex_lock(&ctrl->crit_sect);
|
||||
dbg("%s: after down\n", __FUNCTION__);
|
||||
dbg("%s: after down\n", __func__);
|
||||
|
||||
dbg("%s: before slot_enable\n", __FUNCTION__);
|
||||
dbg("%s: before slot_enable\n", __func__);
|
||||
slot_enable (ctrl, hp_slot);
|
||||
|
||||
dbg("%s: before green_LED_blink\n", __FUNCTION__);
|
||||
dbg("%s: before green_LED_blink\n", __func__);
|
||||
green_LED_blink (ctrl, hp_slot);
|
||||
|
||||
dbg("%s: before amber_LED_blink\n", __FUNCTION__);
|
||||
dbg("%s: before amber_LED_blink\n", __func__);
|
||||
amber_LED_off (ctrl, hp_slot);
|
||||
|
||||
dbg("%s: before set_SOGO\n", __FUNCTION__);
|
||||
dbg("%s: before set_SOGO\n", __func__);
|
||||
set_SOGO(ctrl);
|
||||
|
||||
/* Wait for SOBS to be unset */
|
||||
dbg("%s: before wait_for_ctrl_irq\n", __FUNCTION__);
|
||||
dbg("%s: before wait_for_ctrl_irq\n", __func__);
|
||||
wait_for_ctrl_irq (ctrl);
|
||||
dbg("%s: after wait_for_ctrl_irq\n", __FUNCTION__);
|
||||
dbg("%s: after wait_for_ctrl_irq\n", __func__);
|
||||
|
||||
dbg("%s: before up\n", __FUNCTION__);
|
||||
dbg("%s: before up\n", __func__);
|
||||
mutex_unlock(&ctrl->crit_sect);
|
||||
dbg("%s: after up\n", __FUNCTION__);
|
||||
dbg("%s: after up\n", __func__);
|
||||
|
||||
/* Wait for ~1 second because of hot plug spec */
|
||||
dbg("%s: before long_delay\n", __FUNCTION__);
|
||||
dbg("%s: before long_delay\n", __func__);
|
||||
long_delay(1*HZ);
|
||||
dbg("%s: after long_delay\n", __FUNCTION__);
|
||||
dbg("%s: after long_delay\n", __func__);
|
||||
|
||||
dbg("%s: func status = %x\n", __FUNCTION__, func->status);
|
||||
dbg("%s: func status = %x\n", __func__, func->status);
|
||||
/* Check for a power fault */
|
||||
if (func->status == 0xFF) {
|
||||
/* power fault occurred, but it was benign */
|
||||
temp_register = 0xFFFFFFFF;
|
||||
dbg("%s: temp register set to %x by power fault\n", __FUNCTION__, temp_register);
|
||||
dbg("%s: temp register set to %x by power fault\n", __func__, temp_register);
|
||||
rc = POWER_FAILURE;
|
||||
func->status = 0;
|
||||
} else {
|
||||
/* Get vendor/device ID u32 */
|
||||
ctrl->pci_bus->number = func->bus;
|
||||
rc = pci_bus_read_config_dword (ctrl->pci_bus, PCI_DEVFN(func->device, func->function), PCI_VENDOR_ID, &temp_register);
|
||||
dbg("%s: pci_read_config_dword returns %d\n", __FUNCTION__, rc);
|
||||
dbg("%s: temp_register is %x\n", __FUNCTION__, temp_register);
|
||||
dbg("%s: pci_read_config_dword returns %d\n", __func__, rc);
|
||||
dbg("%s: temp_register is %x\n", __func__, temp_register);
|
||||
|
||||
if (rc != 0) {
|
||||
/* Something's wrong here */
|
||||
temp_register = 0xFFFFFFFF;
|
||||
dbg("%s: temp register set to %x by error\n", __FUNCTION__, temp_register);
|
||||
dbg("%s: temp register set to %x by error\n", __func__, temp_register);
|
||||
}
|
||||
/* Preset return code. It will be changed later if things go okay. */
|
||||
rc = NO_ADAPTER_PRESENT;
|
||||
|
@ -1530,7 +1530,7 @@ static u32 board_added(struct pci_func *func, struct controller *ctrl)
|
|||
|
||||
rc = configure_new_device(ctrl, func, 0, &res_lists);
|
||||
|
||||
dbg("%s: back from configure_new_device\n", __FUNCTION__);
|
||||
dbg("%s: back from configure_new_device\n", __func__);
|
||||
ctrl->io_head = res_lists.io_head;
|
||||
ctrl->mem_head = res_lists.mem_head;
|
||||
ctrl->p_mem_head = res_lists.p_mem_head;
|
||||
|
@ -1566,7 +1566,7 @@ static u32 board_added(struct pci_func *func, struct controller *ctrl)
|
|||
|
||||
/* next, we will instantiate the linux pci_dev structures (with
|
||||
* appropriate driver notification, if already present) */
|
||||
dbg("%s: configure linux pci_dev structure\n", __FUNCTION__);
|
||||
dbg("%s: configure linux pci_dev structure\n", __func__);
|
||||
index = 0;
|
||||
do {
|
||||
new_slot = cpqhp_slot_find(ctrl->bus, func->device, index++);
|
||||
|
@ -1628,7 +1628,7 @@ static u32 remove_board(struct pci_func * func, u32 replace_flag, struct control
|
|||
device = func->device;
|
||||
|
||||
hp_slot = func->device - ctrl->slot_device_offset;
|
||||
dbg("In %s, hp_slot = %d\n", __FUNCTION__, hp_slot);
|
||||
dbg("In %s, hp_slot = %d\n", __func__, hp_slot);
|
||||
|
||||
/* When we get here, it is safe to change base address registers.
|
||||
* We will attempt to save the base address register lengths */
|
||||
|
@ -1928,7 +1928,7 @@ void cpqhp_pushbutton_thread(unsigned long slot)
|
|||
func = cpqhp_slot_find(p_slot->bus, p_slot->device, 0);
|
||||
dbg("In power_down_board, func = %p, ctrl = %p\n", func, ctrl);
|
||||
if (!func) {
|
||||
dbg("Error! func NULL in %s\n", __FUNCTION__);
|
||||
dbg("Error! func NULL in %s\n", __func__);
|
||||
return ;
|
||||
}
|
||||
|
||||
|
@ -1950,7 +1950,7 @@ void cpqhp_pushbutton_thread(unsigned long slot)
|
|||
func = cpqhp_slot_find(p_slot->bus, p_slot->device, 0);
|
||||
dbg("In add_board, func = %p, ctrl = %p\n", func, ctrl);
|
||||
if (!func) {
|
||||
dbg("Error! func NULL in %s\n", __FUNCTION__);
|
||||
dbg("Error! func NULL in %s\n", __func__);
|
||||
return ;
|
||||
}
|
||||
|
||||
|
@ -2058,7 +2058,7 @@ int cpqhp_process_SI(struct controller *ctrl, struct pci_func *func)
|
|||
}
|
||||
|
||||
if (rc) {
|
||||
dbg("%s: rc = %d\n", __FUNCTION__, rc);
|
||||
dbg("%s: rc = %d\n", __func__, rc);
|
||||
}
|
||||
|
||||
if (p_slot)
|
||||
|
@ -2269,12 +2269,12 @@ static u32 configure_new_device(struct controller * ctrl, struct pci_func * func
|
|||
|
||||
new_slot = func;
|
||||
|
||||
dbg("%s\n", __FUNCTION__);
|
||||
dbg("%s\n", __func__);
|
||||
/* Check for Multi-function device */
|
||||
ctrl->pci_bus->number = func->bus;
|
||||
rc = pci_bus_read_config_byte (ctrl->pci_bus, PCI_DEVFN(func->device, func->function), 0x0E, &temp_byte);
|
||||
if (rc) {
|
||||
dbg("%s: rc = %d\n", __FUNCTION__, rc);
|
||||
dbg("%s: rc = %d\n", __func__, rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
|
@ -160,7 +160,7 @@ static int check_for_compaq_ROM (void __iomem *rom_start)
|
|||
(temp6 == 'Q')) {
|
||||
result = 1;
|
||||
}
|
||||
dbg ("%s - returned %d\n", __FUNCTION__, result);
|
||||
dbg ("%s - returned %d\n", __func__, result);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
@ -120,7 +120,7 @@ int cpqhp_unconfigure_device(struct pci_func* func)
|
|||
{
|
||||
int j;
|
||||
|
||||
dbg("%s: bus/dev/func = %x/%x/%x\n", __FUNCTION__, func->bus, func->device, func->function);
|
||||
dbg("%s: bus/dev/func = %x/%x/%x\n", __func__, func->bus, func->device, func->function);
|
||||
|
||||
for (j=0; j<8 ; j++) {
|
||||
struct pci_dev* temp = pci_find_slot(func->bus, PCI_DEVFN(func->device, j));
|
||||
|
@ -170,11 +170,11 @@ int cpqhp_set_irq (u8 bus_num, u8 dev_num, u8 int_pin, u8 irq_num)
|
|||
fakedev->bus = fakebus;
|
||||
fakebus->number = bus_num;
|
||||
dbg("%s: dev %d, bus %d, pin %d, num %d\n",
|
||||
__FUNCTION__, dev_num, bus_num, int_pin, irq_num);
|
||||
__func__, dev_num, bus_num, int_pin, irq_num);
|
||||
rc = pcibios_set_irq_routing(fakedev, int_pin - 0x0a, irq_num);
|
||||
kfree(fakedev);
|
||||
kfree(fakebus);
|
||||
dbg("%s: rc %d\n", __FUNCTION__, rc);
|
||||
dbg("%s: rc %d\n", __func__, rc);
|
||||
if (!rc)
|
||||
return !rc;
|
||||
|
||||
|
@ -1423,7 +1423,7 @@ int cpqhp_return_board_resources(struct pci_func * func, struct resource_lists *
|
|||
int rc = 0;
|
||||
struct pci_resource *node;
|
||||
struct pci_resource *t_node;
|
||||
dbg("%s\n", __FUNCTION__);
|
||||
dbg("%s\n", __func__);
|
||||
|
||||
if (!func)
|
||||
return 1;
|
||||
|
|
|
@ -293,7 +293,7 @@ static int enable_slot(struct hotplug_slot *hotplug_slot)
|
|||
/* mis-use enable_slot for rescanning of the pci bus */
|
||||
cancel_work_sync(&pci_rescan_work);
|
||||
queue_work(dummyphp_wq, &pci_rescan_work);
|
||||
return -ENODEV;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* find the hotplug_slot for the pci_dev */
|
||||
|
@ -320,7 +320,7 @@ static int disable_slot(struct hotplug_slot *slot)
|
|||
return -ENODEV;
|
||||
dslot = slot->private;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, slot->name);
|
||||
|
||||
/* don't disable bridged devices just yet, we can't handle them easily... */
|
||||
if (dslot->dev->subordinate) {
|
||||
|
|
|
@ -148,8 +148,10 @@ int ibmphp_init_devno(struct slot **cur_slot)
|
|||
len = (rtable->size - sizeof(struct irq_routing_table)) /
|
||||
sizeof(struct irq_info);
|
||||
|
||||
if (!len)
|
||||
if (!len) {
|
||||
kfree(rtable);
|
||||
return -1;
|
||||
}
|
||||
for (loop = 0; loop < len; loop++) {
|
||||
if ((*cur_slot)->number == rtable->slots[loop].slot) {
|
||||
if ((*cur_slot)->bus == rtable->slots[loop].bus) {
|
||||
|
@ -187,11 +189,13 @@ int ibmphp_init_devno(struct slot **cur_slot)
|
|||
debug("rtable->slots[loop].irq[3].link = %x\n",
|
||||
rtable->slots[loop].irq[3].link);
|
||||
debug("end of init_devno\n");
|
||||
kfree(rtable);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
kfree(rtable);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -395,7 +399,7 @@ static int get_max_bus_speed(struct hotplug_slot *hotplug_slot, enum pci_bus_spe
|
|||
struct slot *pslot;
|
||||
u8 mode = 0;
|
||||
|
||||
debug("%s - Entry hotplug_slot[%p] pvalue[%p]\n", __FUNCTION__,
|
||||
debug("%s - Entry hotplug_slot[%p] pvalue[%p]\n", __func__,
|
||||
hotplug_slot, value);
|
||||
|
||||
ibmphp_lock_operations();
|
||||
|
@ -425,7 +429,7 @@ static int get_max_bus_speed(struct hotplug_slot *hotplug_slot, enum pci_bus_spe
|
|||
}
|
||||
|
||||
ibmphp_unlock_operations();
|
||||
debug("%s - Exit rc[%d] value[%x]\n", __FUNCTION__, rc, *value);
|
||||
debug("%s - Exit rc[%d] value[%x]\n", __func__, rc, *value);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -435,7 +439,7 @@ static int get_cur_bus_speed(struct hotplug_slot *hotplug_slot, enum pci_bus_spe
|
|||
struct slot *pslot;
|
||||
u8 mode = 0;
|
||||
|
||||
debug("%s - Entry hotplug_slot[%p] pvalue[%p]\n", __FUNCTION__,
|
||||
debug("%s - Entry hotplug_slot[%p] pvalue[%p]\n", __func__,
|
||||
hotplug_slot, value);
|
||||
|
||||
ibmphp_lock_operations();
|
||||
|
@ -471,7 +475,7 @@ static int get_cur_bus_speed(struct hotplug_slot *hotplug_slot, enum pci_bus_spe
|
|||
}
|
||||
|
||||
ibmphp_unlock_operations();
|
||||
debug("%s - Exit rc[%d] value[%x]\n", __FUNCTION__, rc, *value);
|
||||
debug("%s - Exit rc[%d] value[%x]\n", __func__, rc, *value);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -741,13 +745,13 @@ static void free_slots(void)
|
|||
struct list_head * tmp;
|
||||
struct list_head * next;
|
||||
|
||||
debug("%s -- enter\n", __FUNCTION__);
|
||||
debug("%s -- enter\n", __func__);
|
||||
|
||||
list_for_each_safe(tmp, next, &ibmphp_slot_head) {
|
||||
slot_cur = list_entry(tmp, struct slot, ibm_slot_list);
|
||||
pci_hp_deregister(slot_cur->hotplug_slot);
|
||||
}
|
||||
debug("%s -- exit\n", __FUNCTION__);
|
||||
debug("%s -- exit\n", __func__);
|
||||
}
|
||||
|
||||
static void ibm_unconfigure_device(struct pci_func *func)
|
||||
|
@ -755,7 +759,7 @@ static void ibm_unconfigure_device(struct pci_func *func)
|
|||
struct pci_dev *temp;
|
||||
u8 j;
|
||||
|
||||
debug("inside %s\n", __FUNCTION__);
|
||||
debug("inside %s\n", __func__);
|
||||
debug("func->device = %x, func->function = %x\n",
|
||||
func->device, func->function);
|
||||
debug("func->device << 3 | 0x0 = %x\n", func->device << 3 | 0x0);
|
||||
|
@ -786,13 +790,13 @@ static u8 bus_structure_fixup(u8 busno)
|
|||
|
||||
bus = kmalloc(sizeof(*bus), GFP_KERNEL);
|
||||
if (!bus) {
|
||||
err("%s - out of memory\n", __FUNCTION__);
|
||||
err("%s - out of memory\n", __func__);
|
||||
return 1;
|
||||
}
|
||||
dev = kmalloc(sizeof(*dev), GFP_KERNEL);
|
||||
if (!dev) {
|
||||
kfree(bus);
|
||||
err("%s - out of memory\n", __FUNCTION__);
|
||||
err("%s - out of memory\n", __func__);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -803,7 +807,7 @@ static u8 bus_structure_fixup(u8 busno)
|
|||
if (!pci_read_config_word(dev, PCI_VENDOR_ID, &l) &&
|
||||
(l != 0x0000) && (l != 0xffff)) {
|
||||
debug("%s - Inside bus_struture_fixup()\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
pci_scan_bus(busno, ibmphp_pci_bus->ops, NULL);
|
||||
break;
|
||||
}
|
||||
|
@ -900,7 +904,7 @@ static int set_bus(struct slot * slot_cur)
|
|||
{ },
|
||||
};
|
||||
|
||||
debug("%s - entry slot # %d\n", __FUNCTION__, slot_cur->number);
|
||||
debug("%s - entry slot # %d\n", __func__, slot_cur->number);
|
||||
if (SET_BUS_STATUS(slot_cur->ctrl) && is_bus_empty(slot_cur)) {
|
||||
rc = slot_update(&slot_cur);
|
||||
if (rc)
|
||||
|
@ -975,7 +979,7 @@ static int set_bus(struct slot * slot_cur)
|
|||
/* This is for x440, once Brandon fixes the firmware,
|
||||
will not need this delay */
|
||||
msleep(1000);
|
||||
debug("%s -Exit\n", __FUNCTION__);
|
||||
debug("%s -Exit\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -127,18 +127,18 @@ static void __init print_bus_info (void)
|
|||
|
||||
list_for_each (ptr1, &bus_info_head) {
|
||||
ptr = list_entry (ptr1, struct bus_info, bus_info_list);
|
||||
debug ("%s - slot_min = %x\n", __FUNCTION__, ptr->slot_min);
|
||||
debug ("%s - slot_max = %x\n", __FUNCTION__, ptr->slot_max);
|
||||
debug ("%s - slot_count = %x\n", __FUNCTION__, ptr->slot_count);
|
||||
debug ("%s - bus# = %x\n", __FUNCTION__, ptr->busno);
|
||||
debug ("%s - current_speed = %x\n", __FUNCTION__, ptr->current_speed);
|
||||
debug ("%s - controller_id = %x\n", __FUNCTION__, ptr->controller_id);
|
||||
debug ("%s - slot_min = %x\n", __func__, ptr->slot_min);
|
||||
debug ("%s - slot_max = %x\n", __func__, ptr->slot_max);
|
||||
debug ("%s - slot_count = %x\n", __func__, ptr->slot_count);
|
||||
debug ("%s - bus# = %x\n", __func__, ptr->busno);
|
||||
debug ("%s - current_speed = %x\n", __func__, ptr->current_speed);
|
||||
debug ("%s - controller_id = %x\n", __func__, ptr->controller_id);
|
||||
|
||||
debug ("%s - slots_at_33_conv = %x\n", __FUNCTION__, ptr->slots_at_33_conv);
|
||||
debug ("%s - slots_at_66_conv = %x\n", __FUNCTION__, ptr->slots_at_66_conv);
|
||||
debug ("%s - slots_at_66_pcix = %x\n", __FUNCTION__, ptr->slots_at_66_pcix);
|
||||
debug ("%s - slots_at_100_pcix = %x\n", __FUNCTION__, ptr->slots_at_100_pcix);
|
||||
debug ("%s - slots_at_133_pcix = %x\n", __FUNCTION__, ptr->slots_at_133_pcix);
|
||||
debug ("%s - slots_at_33_conv = %x\n", __func__, ptr->slots_at_33_conv);
|
||||
debug ("%s - slots_at_66_conv = %x\n", __func__, ptr->slots_at_66_conv);
|
||||
debug ("%s - slots_at_66_pcix = %x\n", __func__, ptr->slots_at_66_pcix);
|
||||
debug ("%s - slots_at_100_pcix = %x\n", __func__, ptr->slots_at_100_pcix);
|
||||
debug ("%s - slots_at_133_pcix = %x\n", __func__, ptr->slots_at_133_pcix);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -150,12 +150,12 @@ static void print_lo_info (void)
|
|||
debug ("print_lo_info ----\n");
|
||||
list_for_each (ptr1, &rio_lo_head) {
|
||||
ptr = list_entry (ptr1, struct rio_detail, rio_detail_list);
|
||||
debug ("%s - rio_node_id = %x\n", __FUNCTION__, ptr->rio_node_id);
|
||||
debug ("%s - rio_type = %x\n", __FUNCTION__, ptr->rio_type);
|
||||
debug ("%s - owner_id = %x\n", __FUNCTION__, ptr->owner_id);
|
||||
debug ("%s - first_slot_num = %x\n", __FUNCTION__, ptr->first_slot_num);
|
||||
debug ("%s - wpindex = %x\n", __FUNCTION__, ptr->wpindex);
|
||||
debug ("%s - chassis_num = %x\n", __FUNCTION__, ptr->chassis_num);
|
||||
debug ("%s - rio_node_id = %x\n", __func__, ptr->rio_node_id);
|
||||
debug ("%s - rio_type = %x\n", __func__, ptr->rio_type);
|
||||
debug ("%s - owner_id = %x\n", __func__, ptr->owner_id);
|
||||
debug ("%s - first_slot_num = %x\n", __func__, ptr->first_slot_num);
|
||||
debug ("%s - wpindex = %x\n", __func__, ptr->wpindex);
|
||||
debug ("%s - chassis_num = %x\n", __func__, ptr->chassis_num);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -164,15 +164,15 @@ static void print_vg_info (void)
|
|||
{
|
||||
struct rio_detail *ptr;
|
||||
struct list_head *ptr1;
|
||||
debug ("%s ---\n", __FUNCTION__);
|
||||
debug ("%s ---\n", __func__);
|
||||
list_for_each (ptr1, &rio_vg_head) {
|
||||
ptr = list_entry (ptr1, struct rio_detail, rio_detail_list);
|
||||
debug ("%s - rio_node_id = %x\n", __FUNCTION__, ptr->rio_node_id);
|
||||
debug ("%s - rio_type = %x\n", __FUNCTION__, ptr->rio_type);
|
||||
debug ("%s - owner_id = %x\n", __FUNCTION__, ptr->owner_id);
|
||||
debug ("%s - first_slot_num = %x\n", __FUNCTION__, ptr->first_slot_num);
|
||||
debug ("%s - wpindex = %x\n", __FUNCTION__, ptr->wpindex);
|
||||
debug ("%s - chassis_num = %x\n", __FUNCTION__, ptr->chassis_num);
|
||||
debug ("%s - rio_node_id = %x\n", __func__, ptr->rio_node_id);
|
||||
debug ("%s - rio_type = %x\n", __func__, ptr->rio_type);
|
||||
debug ("%s - owner_id = %x\n", __func__, ptr->owner_id);
|
||||
debug ("%s - first_slot_num = %x\n", __func__, ptr->first_slot_num);
|
||||
debug ("%s - wpindex = %x\n", __func__, ptr->wpindex);
|
||||
debug ("%s - chassis_num = %x\n", __func__, ptr->chassis_num);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -185,7 +185,7 @@ static void __init print_ebda_pci_rsrc (void)
|
|||
list_for_each (ptr1, &ibmphp_ebda_pci_rsrc_head) {
|
||||
ptr = list_entry (ptr1, struct ebda_pci_rsrc, ebda_pci_rsrc_list);
|
||||
debug ("%s - rsrc type: %x bus#: %x dev_func: %x start addr: %x end addr: %x\n",
|
||||
__FUNCTION__, ptr->rsrc_type ,ptr->bus_num, ptr->dev_fun,ptr->start_addr, ptr->end_addr);
|
||||
__func__, ptr->rsrc_type ,ptr->bus_num, ptr->dev_fun,ptr->start_addr, ptr->end_addr);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -196,7 +196,7 @@ static void __init print_ibm_slot (void)
|
|||
|
||||
list_for_each (ptr1, &ibmphp_slot_head) {
|
||||
ptr = list_entry (ptr1, struct slot, ibm_slot_list);
|
||||
debug ("%s - slot_number: %x\n", __FUNCTION__, ptr->number);
|
||||
debug ("%s - slot_number: %x\n", __func__, ptr->number);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -204,13 +204,13 @@ static void __init print_opt_vg (void)
|
|||
{
|
||||
struct opt_rio *ptr;
|
||||
struct list_head *ptr1;
|
||||
debug ("%s ---\n", __FUNCTION__);
|
||||
debug ("%s ---\n", __func__);
|
||||
list_for_each (ptr1, &opt_vg_head) {
|
||||
ptr = list_entry (ptr1, struct opt_rio, opt_rio_list);
|
||||
debug ("%s - rio_type %x\n", __FUNCTION__, ptr->rio_type);
|
||||
debug ("%s - chassis_num: %x\n", __FUNCTION__, ptr->chassis_num);
|
||||
debug ("%s - first_slot_num: %x\n", __FUNCTION__, ptr->first_slot_num);
|
||||
debug ("%s - middle_num: %x\n", __FUNCTION__, ptr->middle_num);
|
||||
debug ("%s - rio_type %x\n", __func__, ptr->rio_type);
|
||||
debug ("%s - chassis_num: %x\n", __func__, ptr->chassis_num);
|
||||
debug ("%s - first_slot_num: %x\n", __func__, ptr->first_slot_num);
|
||||
debug ("%s - middle_num: %x\n", __func__, ptr->middle_num);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -225,35 +225,35 @@ static void __init print_ebda_hpc (void)
|
|||
hpc_ptr = list_entry (ptr1, struct controller, ebda_hpc_list);
|
||||
|
||||
for (index = 0; index < hpc_ptr->slot_count; index++) {
|
||||
debug ("%s - physical slot#: %x\n", __FUNCTION__, hpc_ptr->slots[index].slot_num);
|
||||
debug ("%s - pci bus# of the slot: %x\n", __FUNCTION__, hpc_ptr->slots[index].slot_bus_num);
|
||||
debug ("%s - index into ctlr addr: %x\n", __FUNCTION__, hpc_ptr->slots[index].ctl_index);
|
||||
debug ("%s - cap of the slot: %x\n", __FUNCTION__, hpc_ptr->slots[index].slot_cap);
|
||||
debug ("%s - physical slot#: %x\n", __func__, hpc_ptr->slots[index].slot_num);
|
||||
debug ("%s - pci bus# of the slot: %x\n", __func__, hpc_ptr->slots[index].slot_bus_num);
|
||||
debug ("%s - index into ctlr addr: %x\n", __func__, hpc_ptr->slots[index].ctl_index);
|
||||
debug ("%s - cap of the slot: %x\n", __func__, hpc_ptr->slots[index].slot_cap);
|
||||
}
|
||||
|
||||
for (index = 0; index < hpc_ptr->bus_count; index++) {
|
||||
debug ("%s - bus# of each bus controlled by this ctlr: %x\n", __FUNCTION__, hpc_ptr->buses[index].bus_num);
|
||||
debug ("%s - bus# of each bus controlled by this ctlr: %x\n", __func__, hpc_ptr->buses[index].bus_num);
|
||||
}
|
||||
|
||||
debug ("%s - type of hpc: %x\n", __FUNCTION__, hpc_ptr->ctlr_type);
|
||||
debug ("%s - type of hpc: %x\n", __func__, hpc_ptr->ctlr_type);
|
||||
switch (hpc_ptr->ctlr_type) {
|
||||
case 1:
|
||||
debug ("%s - bus: %x\n", __FUNCTION__, hpc_ptr->u.pci_ctlr.bus);
|
||||
debug ("%s - dev_fun: %x\n", __FUNCTION__, hpc_ptr->u.pci_ctlr.dev_fun);
|
||||
debug ("%s - irq: %x\n", __FUNCTION__, hpc_ptr->irq);
|
||||
debug ("%s - bus: %x\n", __func__, hpc_ptr->u.pci_ctlr.bus);
|
||||
debug ("%s - dev_fun: %x\n", __func__, hpc_ptr->u.pci_ctlr.dev_fun);
|
||||
debug ("%s - irq: %x\n", __func__, hpc_ptr->irq);
|
||||
break;
|
||||
|
||||
case 0:
|
||||
debug ("%s - io_start: %x\n", __FUNCTION__, hpc_ptr->u.isa_ctlr.io_start);
|
||||
debug ("%s - io_end: %x\n", __FUNCTION__, hpc_ptr->u.isa_ctlr.io_end);
|
||||
debug ("%s - irq: %x\n", __FUNCTION__, hpc_ptr->irq);
|
||||
debug ("%s - io_start: %x\n", __func__, hpc_ptr->u.isa_ctlr.io_start);
|
||||
debug ("%s - io_end: %x\n", __func__, hpc_ptr->u.isa_ctlr.io_end);
|
||||
debug ("%s - irq: %x\n", __func__, hpc_ptr->irq);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
case 4:
|
||||
debug ("%s - wpegbbar: %lx\n", __FUNCTION__, hpc_ptr->u.wpeg_ctlr.wpegbbar);
|
||||
debug ("%s - i2c_addr: %x\n", __FUNCTION__, hpc_ptr->u.wpeg_ctlr.i2c_addr);
|
||||
debug ("%s - irq: %x\n", __FUNCTION__, hpc_ptr->irq);
|
||||
debug ("%s - wpegbbar: %lx\n", __func__, hpc_ptr->u.wpeg_ctlr.wpegbbar);
|
||||
debug ("%s - i2c_addr: %x\n", __func__, hpc_ptr->u.wpeg_ctlr.i2c_addr);
|
||||
debug ("%s - irq: %x\n", __func__, hpc_ptr->irq);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -129,14 +129,14 @@ static int hpc_wait_ctlr_notworking (int, struct controller *, void __iomem *, u
|
|||
*---------------------------------------------------------------------*/
|
||||
void __init ibmphp_hpc_initvars (void)
|
||||
{
|
||||
debug ("%s - Entry\n", __FUNCTION__);
|
||||
debug ("%s - Entry\n", __func__);
|
||||
|
||||
mutex_init(&sem_hpcaccess);
|
||||
init_MUTEX (&semOperations);
|
||||
init_MUTEX_LOCKED (&sem_exit);
|
||||
to_debug = 0;
|
||||
|
||||
debug ("%s - Exit\n", __FUNCTION__);
|
||||
debug ("%s - Exit\n", __func__);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
|
@ -154,7 +154,7 @@ static u8 i2c_ctrl_read (struct controller *ctlr_ptr, void __iomem *WPGBbar, u8
|
|||
unsigned long ultemp;
|
||||
unsigned long data; // actual data HILO format
|
||||
|
||||
debug_polling ("%s - Entry WPGBbar[%p] index[%x] \n", __FUNCTION__, WPGBbar, index);
|
||||
debug_polling ("%s - Entry WPGBbar[%p] index[%x] \n", __func__, WPGBbar, index);
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// READ - step 1
|
||||
|
@ -213,7 +213,7 @@ static u8 i2c_ctrl_read (struct controller *ctlr_ptr, void __iomem *WPGBbar, u8
|
|||
i--;
|
||||
}
|
||||
if (i == 0) {
|
||||
debug ("%s - Error : WPG timeout\n", __FUNCTION__);
|
||||
debug ("%s - Error : WPG timeout\n", __func__);
|
||||
return HPC_ERROR;
|
||||
}
|
||||
//--------------------------------------------------------------------
|
||||
|
@ -241,7 +241,7 @@ static u8 i2c_ctrl_read (struct controller *ctlr_ptr, void __iomem *WPGBbar, u8
|
|||
|
||||
status = (u8) data;
|
||||
|
||||
debug_polling ("%s - Exit index[%x] status[%x]\n", __FUNCTION__, index, status);
|
||||
debug_polling ("%s - Exit index[%x] status[%x]\n", __func__, index, status);
|
||||
|
||||
return (status);
|
||||
}
|
||||
|
@ -262,7 +262,7 @@ static u8 i2c_ctrl_write (struct controller *ctlr_ptr, void __iomem *WPGBbar, u8
|
|||
unsigned long data; // actual data HILO format
|
||||
int i;
|
||||
|
||||
debug_polling ("%s - Entry WPGBbar[%p] index[%x] cmd[%x]\n", __FUNCTION__, WPGBbar, index, cmd);
|
||||
debug_polling ("%s - Entry WPGBbar[%p] index[%x] cmd[%x]\n", __func__, WPGBbar, index, cmd);
|
||||
|
||||
rc = 0;
|
||||
//--------------------------------------------------------------------
|
||||
|
@ -324,7 +324,7 @@ static u8 i2c_ctrl_write (struct controller *ctlr_ptr, void __iomem *WPGBbar, u8
|
|||
i--;
|
||||
}
|
||||
if (i == 0) {
|
||||
debug ("%s - Exit Error:WPG timeout\n", __FUNCTION__);
|
||||
debug ("%s - Exit Error:WPG timeout\n", __func__);
|
||||
rc = HPC_ERROR;
|
||||
}
|
||||
|
||||
|
@ -345,7 +345,7 @@ static u8 i2c_ctrl_write (struct controller *ctlr_ptr, void __iomem *WPGBbar, u8
|
|||
rc = HPC_ERROR;
|
||||
}
|
||||
|
||||
debug_polling ("%s Exit rc[%x]\n", __FUNCTION__, rc);
|
||||
debug_polling ("%s Exit rc[%x]\n", __func__, rc);
|
||||
return (rc);
|
||||
}
|
||||
|
||||
|
@ -541,12 +541,12 @@ int ibmphp_hpc_readslot (struct slot * pslot, u8 cmd, u8 * pstatus)
|
|||
int rc = 0;
|
||||
int busindex;
|
||||
|
||||
debug_polling ("%s - Entry pslot[%p] cmd[%x] pstatus[%p]\n", __FUNCTION__, pslot, cmd, pstatus);
|
||||
debug_polling ("%s - Entry pslot[%p] cmd[%x] pstatus[%p]\n", __func__, pslot, cmd, pstatus);
|
||||
|
||||
if ((pslot == NULL)
|
||||
|| ((pstatus == NULL) && (cmd != READ_ALLSTAT) && (cmd != READ_BUSSTATUS))) {
|
||||
rc = -EINVAL;
|
||||
err ("%s - Error invalid pointer, rc[%d]\n", __FUNCTION__, rc);
|
||||
err ("%s - Error invalid pointer, rc[%d]\n", __func__, rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -554,7 +554,7 @@ int ibmphp_hpc_readslot (struct slot * pslot, u8 cmd, u8 * pstatus)
|
|||
busindex = ibmphp_get_bus_index (pslot->bus);
|
||||
if (busindex < 0) {
|
||||
rc = -EINVAL;
|
||||
err ("%s - Exit Error:invalid bus, rc[%d]\n", __FUNCTION__, rc);
|
||||
err ("%s - Exit Error:invalid bus, rc[%d]\n", __func__, rc);
|
||||
return rc;
|
||||
} else
|
||||
index = (u8) busindex;
|
||||
|
@ -565,7 +565,7 @@ int ibmphp_hpc_readslot (struct slot * pslot, u8 cmd, u8 * pstatus)
|
|||
|
||||
if (index == HPC_ERROR) {
|
||||
rc = -EINVAL;
|
||||
err ("%s - Exit Error:invalid index, rc[%d]\n", __FUNCTION__, rc);
|
||||
err ("%s - Exit Error:invalid index, rc[%d]\n", __func__, rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -641,7 +641,7 @@ int ibmphp_hpc_readslot (struct slot * pslot, u8 cmd, u8 * pstatus)
|
|||
ctrl_read (ctlr_ptr, wpg_bbar,
|
||||
index + WPG_1ST_EXTSLOT_INDEX);
|
||||
} else {
|
||||
err ("%s - Error ctrl_read failed\n", __FUNCTION__);
|
||||
err ("%s - Error ctrl_read failed\n", __func__);
|
||||
rc = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
@ -662,7 +662,7 @@ int ibmphp_hpc_readslot (struct slot * pslot, u8 cmd, u8 * pstatus)
|
|||
|
||||
free_hpc_access ();
|
||||
|
||||
debug_polling ("%s - Exit rc[%d]\n", __FUNCTION__, rc);
|
||||
debug_polling ("%s - Exit rc[%d]\n", __func__, rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -681,10 +681,10 @@ int ibmphp_hpc_writeslot (struct slot * pslot, u8 cmd)
|
|||
int rc = 0;
|
||||
int timeout;
|
||||
|
||||
debug_polling ("%s - Entry pslot[%p] cmd[%x]\n", __FUNCTION__, pslot, cmd);
|
||||
debug_polling ("%s - Entry pslot[%p] cmd[%x]\n", __func__, pslot, cmd);
|
||||
if (pslot == NULL) {
|
||||
rc = -EINVAL;
|
||||
err ("%s - Error Exit rc[%d]\n", __FUNCTION__, rc);
|
||||
err ("%s - Error Exit rc[%d]\n", __func__, rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -694,7 +694,7 @@ int ibmphp_hpc_writeslot (struct slot * pslot, u8 cmd)
|
|||
busindex = ibmphp_get_bus_index (pslot->bus);
|
||||
if (busindex < 0) {
|
||||
rc = -EINVAL;
|
||||
err ("%s - Exit Error:invalid bus, rc[%d]\n", __FUNCTION__, rc);
|
||||
err ("%s - Exit Error:invalid bus, rc[%d]\n", __func__, rc);
|
||||
return rc;
|
||||
} else
|
||||
index = (u8) busindex;
|
||||
|
@ -705,7 +705,7 @@ int ibmphp_hpc_writeslot (struct slot * pslot, u8 cmd)
|
|||
|
||||
if (index == HPC_ERROR) {
|
||||
rc = -EINVAL;
|
||||
err ("%s - Error Exit rc[%d]\n", __FUNCTION__, rc);
|
||||
err ("%s - Error Exit rc[%d]\n", __func__, rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -719,7 +719,7 @@ int ibmphp_hpc_writeslot (struct slot * pslot, u8 cmd)
|
|||
if ((ctlr_ptr->ctlr_type == 2) || (ctlr_ptr->ctlr_type == 4)) {
|
||||
wpg_bbar = ioremap (ctlr_ptr->u.wpeg_ctlr.wpegbbar, WPG_I2C_IOREMAP_SIZE);
|
||||
|
||||
debug ("%s - ctlr id[%x] physical[%lx] logical[%lx] i2c[%x]\n", __FUNCTION__,
|
||||
debug ("%s - ctlr id[%x] physical[%lx] logical[%lx] i2c[%x]\n", __func__,
|
||||
ctlr_ptr->ctlr_id, (ulong) (ctlr_ptr->u.wpeg_ctlr.wpegbbar), (ulong) wpg_bbar,
|
||||
ctlr_ptr->u.wpeg_ctlr.i2c_addr);
|
||||
}
|
||||
|
@ -750,7 +750,7 @@ int ibmphp_hpc_writeslot (struct slot * pslot, u8 cmd)
|
|||
msleep(1000);
|
||||
if (timeout < 1) {
|
||||
done = 1;
|
||||
err ("%s - Error command complete timeout\n", __FUNCTION__);
|
||||
err ("%s - Error command complete timeout\n", __func__);
|
||||
rc = -EFAULT;
|
||||
} else
|
||||
timeout--;
|
||||
|
@ -765,7 +765,7 @@ int ibmphp_hpc_writeslot (struct slot * pslot, u8 cmd)
|
|||
iounmap (wpg_bbar);
|
||||
free_hpc_access ();
|
||||
|
||||
debug_polling ("%s - Exit rc[%d]\n", __FUNCTION__, rc);
|
||||
debug_polling ("%s - Exit rc[%d]\n", __func__, rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -803,10 +803,10 @@ void ibmphp_lock_operations (void)
|
|||
*---------------------------------------------------------------------*/
|
||||
void ibmphp_unlock_operations (void)
|
||||
{
|
||||
debug ("%s - Entry\n", __FUNCTION__);
|
||||
debug ("%s - Entry\n", __func__);
|
||||
up (&semOperations);
|
||||
to_debug = 0;
|
||||
debug ("%s - Exit\n", __FUNCTION__);
|
||||
debug ("%s - Exit\n", __func__);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
|
@ -827,7 +827,7 @@ static int poll_hpc(void *data)
|
|||
int poll_count = 0;
|
||||
u8 ctrl_count = 0x00;
|
||||
|
||||
debug ("%s - Entry\n", __FUNCTION__);
|
||||
debug ("%s - Entry\n", __func__);
|
||||
|
||||
while (!kthread_should_stop()) {
|
||||
/* try to get the lock to do some kind of hardware access */
|
||||
|
@ -907,7 +907,7 @@ static int poll_hpc(void *data)
|
|||
msleep(100);
|
||||
}
|
||||
up (&sem_exit);
|
||||
debug ("%s - Exit\n", __FUNCTION__);
|
||||
debug ("%s - Exit\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -999,7 +999,7 @@ static int process_changeinstatus (struct slot *pslot, struct slot *poldslot)
|
|||
ibmphp_update_slot_info (pslot);
|
||||
}
|
||||
|
||||
debug ("%s - Exit rc[%d] disable[%x] update[%x]\n", __FUNCTION__, rc, disable, update);
|
||||
debug ("%s - Exit rc[%d] disable[%x] update[%x]\n", __func__, rc, disable, update);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -1021,7 +1021,7 @@ static int process_changeinlatch (u8 old, u8 new, struct controller *ctrl)
|
|||
u8 mask;
|
||||
int rc = 0;
|
||||
|
||||
debug ("%s - Entry old[%x], new[%x]\n", __FUNCTION__, old, new);
|
||||
debug ("%s - Entry old[%x], new[%x]\n", __func__, old, new);
|
||||
// bit 0 reserved, 0 is LSB, check bit 1-6 for 6 slots
|
||||
|
||||
for (i = ctrl->starting_slot_num; i <= ctrl->ending_slot_num; i++) {
|
||||
|
@ -1031,15 +1031,15 @@ static int process_changeinlatch (u8 old, u8 new, struct controller *ctrl)
|
|||
if (pslot) {
|
||||
memcpy ((void *) &myslot, (void *) pslot, sizeof (struct slot));
|
||||
rc = ibmphp_hpc_readslot (pslot, READ_ALLSTAT, NULL);
|
||||
debug ("%s - call process_changeinstatus for slot[%d]\n", __FUNCTION__, i);
|
||||
debug ("%s - call process_changeinstatus for slot[%d]\n", __func__, i);
|
||||
process_changeinstatus (pslot, &myslot);
|
||||
} else {
|
||||
rc = -EINVAL;
|
||||
err ("%s - Error bad pointer for slot[%d]\n", __FUNCTION__, i);
|
||||
err ("%s - Error bad pointer for slot[%d]\n", __func__, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
debug ("%s - Exit rc[%d]\n", __FUNCTION__, rc);
|
||||
debug ("%s - Exit rc[%d]\n", __func__, rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -1050,11 +1050,11 @@ static int process_changeinlatch (u8 old, u8 new, struct controller *ctrl)
|
|||
*---------------------------------------------------------------------*/
|
||||
int __init ibmphp_hpc_start_poll_thread (void)
|
||||
{
|
||||
debug ("%s - Entry\n", __FUNCTION__);
|
||||
debug ("%s - Entry\n", __func__);
|
||||
|
||||
ibmphp_poll_thread = kthread_run(poll_hpc, NULL, "hpc_poll");
|
||||
if (IS_ERR(ibmphp_poll_thread)) {
|
||||
err ("%s - Error, thread not started\n", __FUNCTION__);
|
||||
err ("%s - Error, thread not started\n", __func__);
|
||||
return PTR_ERR(ibmphp_poll_thread);
|
||||
}
|
||||
return 0;
|
||||
|
@ -1067,7 +1067,7 @@ int __init ibmphp_hpc_start_poll_thread (void)
|
|||
*---------------------------------------------------------------------*/
|
||||
void __exit ibmphp_hpc_stop_poll_thread (void)
|
||||
{
|
||||
debug ("%s - Entry\n", __FUNCTION__);
|
||||
debug ("%s - Entry\n", __func__);
|
||||
|
||||
kthread_stop(ibmphp_poll_thread);
|
||||
debug ("before locking operations \n");
|
||||
|
@ -1088,7 +1088,7 @@ void __exit ibmphp_hpc_stop_poll_thread (void)
|
|||
up (&sem_exit);
|
||||
debug ("after sem exit up\n");
|
||||
|
||||
debug ("%s - Exit\n", __FUNCTION__);
|
||||
debug ("%s - Exit\n", __func__);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------
|
||||
|
|
|
@ -364,7 +364,7 @@ static int configure_device (struct pci_func *func)
|
|||
struct resource_node *pfmem[6];
|
||||
unsigned int devfn;
|
||||
|
||||
debug ("%s - inside\n", __FUNCTION__);
|
||||
debug ("%s - inside\n", __func__);
|
||||
|
||||
devfn = PCI_DEVFN(func->device, func->function);
|
||||
ibmphp_pci_bus->number = func->busno;
|
||||
|
@ -595,7 +595,7 @@ static int configure_bridge (struct pci_func **func_passed, u8 slotno)
|
|||
u8 irq;
|
||||
int retval;
|
||||
|
||||
debug ("%s - enter\n", __FUNCTION__);
|
||||
debug ("%s - enter\n", __func__);
|
||||
|
||||
devfn = PCI_DEVFN(func->function, func->device);
|
||||
ibmphp_pci_bus->number = func->busno;
|
||||
|
@ -1234,7 +1234,7 @@ static int unconfigure_boot_device (u8 busno, u8 device, u8 function)
|
|||
u32 tmp_address;
|
||||
unsigned int devfn;
|
||||
|
||||
debug ("%s - enter\n", __FUNCTION__);
|
||||
debug ("%s - enter\n", __func__);
|
||||
|
||||
bus = ibmphp_find_res_bus (busno);
|
||||
if (!bus) {
|
||||
|
@ -1351,7 +1351,7 @@ static int unconfigure_boot_bridge (u8 busno, u8 device, u8 function)
|
|||
bus_no = (int) busno;
|
||||
debug ("busno is %x\n", busno);
|
||||
pci_bus_read_config_byte (ibmphp_pci_bus, devfn, PCI_PRIMARY_BUS, &pri_number);
|
||||
debug ("%s - busno = %x, primary_number = %x\n", __FUNCTION__, busno, pri_number);
|
||||
debug ("%s - busno = %x, primary_number = %x\n", __func__, busno, pri_number);
|
||||
|
||||
pci_bus_read_config_byte (ibmphp_pci_bus, devfn, PCI_SECONDARY_BUS, &sec_number);
|
||||
debug ("sec_number is %x\n", sec_number);
|
||||
|
@ -1437,7 +1437,7 @@ static int unconfigure_boot_bridge (u8 busno, u8 device, u8 function)
|
|||
}
|
||||
} /* end of mem */
|
||||
} /* end of for */
|
||||
debug ("%s - exiting, returning success\n", __FUNCTION__);
|
||||
debug ("%s - exiting, returning success\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1453,7 +1453,7 @@ static int unconfigure_boot_card (struct slot *slot_cur)
|
|||
unsigned int devfn;
|
||||
u8 valid_device = 0x00; /* To see if we are ever able to find valid device and read it */
|
||||
|
||||
debug ("%s - enter\n", __FUNCTION__);
|
||||
debug ("%s - enter\n", __func__);
|
||||
|
||||
device = slot_cur->device;
|
||||
busno = slot_cur->bus;
|
||||
|
@ -1470,7 +1470,7 @@ static int unconfigure_boot_card (struct slot *slot_cur)
|
|||
/* found correct device!!! */
|
||||
++valid_device;
|
||||
|
||||
debug ("%s - found correct device\n", __FUNCTION__);
|
||||
debug ("%s - found correct device\n", __func__);
|
||||
|
||||
/* header: x x x x x x x x
|
||||
* | |___________|=> 1=PPB bridge, 0=normal device, 2=CardBus Bridge
|
||||
|
@ -1573,7 +1573,7 @@ int ibmphp_unconfigure_card (struct slot **slot_cur, int the_end)
|
|||
struct pci_func *cur_func = NULL;
|
||||
struct pci_func *temp_func;
|
||||
|
||||
debug ("%s - enter\n", __FUNCTION__);
|
||||
debug ("%s - enter\n", __func__);
|
||||
|
||||
if (!the_end) {
|
||||
/* Need to unconfigure the card */
|
||||
|
@ -1624,7 +1624,7 @@ int ibmphp_unconfigure_card (struct slot **slot_cur, int the_end)
|
|||
|
||||
sl->func = NULL;
|
||||
*slot_cur = sl;
|
||||
debug ("%s - exit\n", __FUNCTION__);
|
||||
debug ("%s - exit\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -563,7 +563,7 @@ static void fix_resources (struct bus_node *bus_cur)
|
|||
struct range_node *range;
|
||||
struct resource_node *res;
|
||||
|
||||
debug ("%s - bus_cur->busno = %d\n", __FUNCTION__, bus_cur->busno);
|
||||
debug ("%s - bus_cur->busno = %d\n", __func__, bus_cur->busno);
|
||||
|
||||
if (bus_cur->needIOUpdate) {
|
||||
res = bus_cur->firstIO;
|
||||
|
@ -599,7 +599,7 @@ int ibmphp_add_resource (struct resource_node *res)
|
|||
struct range_node *range_cur = NULL;
|
||||
struct resource_node *res_start = NULL;
|
||||
|
||||
debug ("%s - enter\n", __FUNCTION__);
|
||||
debug ("%s - enter\n", __func__);
|
||||
|
||||
if (!res) {
|
||||
err ("NULL passed to add\n");
|
||||
|
@ -762,7 +762,7 @@ int ibmphp_add_resource (struct resource_node *res)
|
|||
}
|
||||
}
|
||||
|
||||
debug ("%s - exit\n", __FUNCTION__);
|
||||
debug ("%s - exit\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1001,7 +1001,7 @@ int ibmphp_check_resource (struct resource_node *res, u8 bridge)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
debug ("%s - enter\n", __FUNCTION__);
|
||||
debug ("%s - enter\n", __func__);
|
||||
debug ("bus_cur->busno is %d\n", bus_cur->busno);
|
||||
|
||||
/* This is a quick fix to not mess up with the code very much. i.e.,
|
||||
|
@ -1029,7 +1029,7 @@ int ibmphp_check_resource (struct resource_node *res, u8 bridge)
|
|||
|
||||
while (res_cur) {
|
||||
range = find_range (bus_cur, res_cur);
|
||||
debug ("%s - rangeno = %d\n", __FUNCTION__, res_cur->rangeno);
|
||||
debug ("%s - rangeno = %d\n", __func__, res_cur->rangeno);
|
||||
|
||||
if (!range) {
|
||||
err ("no range for the device exists... bailing out...\n");
|
||||
|
@ -1942,7 +1942,7 @@ static int __init update_bridge_ranges (struct bus_node **bus)
|
|||
return -ENODEV;
|
||||
ibmphp_pci_bus->number = bus_cur->busno;
|
||||
|
||||
debug ("inside %s\n", __FUNCTION__);
|
||||
debug ("inside %s\n", __func__);
|
||||
debug ("bus_cur->busno = %x\n", bus_cur->busno);
|
||||
|
||||
for (device = 0; device < 32; device++) {
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
|
||||
#define MY_NAME "pci_hotplug"
|
||||
|
||||
#define dbg(fmt, arg...) do { if (debug) printk(KERN_DEBUG "%s: %s: " fmt , MY_NAME , __FUNCTION__ , ## arg); } while (0)
|
||||
#define dbg(fmt, arg...) do { if (debug) printk(KERN_DEBUG "%s: %s: " fmt , MY_NAME , __func__ , ## arg); } while (0)
|
||||
#define err(format, arg...) printk(KERN_ERR "%s: " format , MY_NAME , ## arg)
|
||||
#define info(format, arg...) printk(KERN_INFO "%s: " format , MY_NAME , ## arg)
|
||||
#define warn(format, arg...) printk(KERN_WARNING "%s: " format , MY_NAME , ## arg)
|
||||
|
|
|
@ -168,7 +168,7 @@ static inline struct slot *pciehp_find_slot(struct controller *ctrl, u8 device)
|
|||
return slot;
|
||||
}
|
||||
|
||||
err("%s: slot (device=0x%x) not found\n", __FUNCTION__, device);
|
||||
err("%s: slot (device=0x%x) not found\n", __func__, device);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -184,7 +184,7 @@ static void release_slot(struct hotplug_slot *hotplug_slot)
|
|||
{
|
||||
struct slot *slot = hotplug_slot->private;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
kfree(slot->hotplug_slot->info);
|
||||
kfree(slot->hotplug_slot);
|
||||
|
@ -301,7 +301,7 @@ static int set_attention_status(struct hotplug_slot *hotplug_slot, u8 status)
|
|||
{
|
||||
struct slot *slot = hotplug_slot->private;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
hotplug_slot->info->attention_status = status;
|
||||
|
||||
|
@ -316,7 +316,7 @@ static int enable_slot(struct hotplug_slot *hotplug_slot)
|
|||
{
|
||||
struct slot *slot = hotplug_slot->private;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
return pciehp_sysfs_enable_slot(slot);
|
||||
}
|
||||
|
@ -326,7 +326,7 @@ static int disable_slot(struct hotplug_slot *hotplug_slot)
|
|||
{
|
||||
struct slot *slot = hotplug_slot->private;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
return pciehp_sysfs_disable_slot(slot);
|
||||
}
|
||||
|
@ -336,7 +336,7 @@ static int get_power_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
int retval;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
retval = slot->hpc_ops->get_power_status(slot, value);
|
||||
if (retval < 0)
|
||||
|
@ -350,7 +350,7 @@ static int get_attention_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
int retval;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
retval = slot->hpc_ops->get_attention_status(slot, value);
|
||||
if (retval < 0)
|
||||
|
@ -364,7 +364,7 @@ static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
int retval;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
retval = slot->hpc_ops->get_latch_status(slot, value);
|
||||
if (retval < 0)
|
||||
|
@ -378,7 +378,7 @@ static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
int retval;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
retval = slot->hpc_ops->get_adapter_status(slot, value);
|
||||
if (retval < 0)
|
||||
|
@ -392,7 +392,7 @@ static int get_address(struct hotplug_slot *hotplug_slot, u32 *value)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
struct pci_bus *bus = slot->ctrl->pci_dev->subordinate;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
*value = (pci_domain_nr(bus) << 16) | (slot->bus << 8) | slot->device;
|
||||
|
||||
|
@ -404,7 +404,7 @@ static int get_max_bus_speed(struct hotplug_slot *hotplug_slot, enum pci_bus_spe
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
int retval;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
retval = slot->hpc_ops->get_max_bus_speed(slot, value);
|
||||
if (retval < 0)
|
||||
|
@ -418,7 +418,7 @@ static int get_cur_bus_speed(struct hotplug_slot *hotplug_slot, enum pci_bus_spe
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
int retval;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
retval = slot->hpc_ops->get_cur_bus_speed(slot, value);
|
||||
if (retval < 0)
|
||||
|
@ -437,7 +437,7 @@ static int pciehp_probe(struct pcie_device *dev, const struct pcie_port_service_
|
|||
|
||||
ctrl = kzalloc(sizeof(*ctrl), GFP_KERNEL);
|
||||
if (!ctrl) {
|
||||
err("%s : out of memory\n", __FUNCTION__);
|
||||
err("%s : out of memory\n", __func__);
|
||||
goto err_out_none;
|
||||
}
|
||||
INIT_LIST_HEAD(&ctrl->slot_list);
|
||||
|
@ -454,7 +454,7 @@ static int pciehp_probe(struct pcie_device *dev, const struct pcie_port_service_
|
|||
pci_set_drvdata(pdev, ctrl);
|
||||
|
||||
dbg("%s: ctrl bus=0x%x, device=%x, function=%x, irq=%x\n",
|
||||
__FUNCTION__, pdev->bus->number, PCI_SLOT(pdev->devfn),
|
||||
__func__, pdev->bus->number, PCI_SLOT(pdev->devfn),
|
||||
PCI_FUNC(pdev->devfn), pdev->irq);
|
||||
|
||||
/* Setup the slot information structures */
|
||||
|
@ -503,13 +503,13 @@ static void pciehp_remove (struct pcie_device *dev)
|
|||
#ifdef CONFIG_PM
|
||||
static int pciehp_suspend (struct pcie_device *dev, pm_message_t state)
|
||||
{
|
||||
printk("%s ENTRY\n", __FUNCTION__);
|
||||
printk("%s ENTRY\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pciehp_resume (struct pcie_device *dev)
|
||||
{
|
||||
printk("%s ENTRY\n", __FUNCTION__);
|
||||
printk("%s ENTRY\n", __func__);
|
||||
if (pciehp_force) {
|
||||
struct pci_dev *pdev = dev->port;
|
||||
struct controller *ctrl = pci_get_drvdata(pdev);
|
||||
|
@ -563,7 +563,7 @@ static int __init pcied_init(void)
|
|||
dbg("pcie_port_service_register = %d\n", retval);
|
||||
info(DRIVER_DESC " version: " DRIVER_VERSION "\n");
|
||||
if (retval)
|
||||
dbg("%s: Failure to register service\n", __FUNCTION__);
|
||||
dbg("%s: Failure to register service\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
|
@ -181,7 +181,7 @@ static void set_slot_off(struct controller *ctrl, struct slot * pslot)
|
|||
if (POWER_CTRL(ctrl->ctrlcap)) {
|
||||
if (pslot->hpc_ops->power_off_slot(pslot)) {
|
||||
err("%s: Issue of Slot Power Off command failed\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -192,7 +192,7 @@ static void set_slot_off(struct controller *ctrl, struct slot * pslot)
|
|||
if (ATTN_LED(ctrl->ctrlcap)) {
|
||||
if (pslot->hpc_ops->set_attention_status(pslot, 1)) {
|
||||
err("%s: Issue of Set Attention Led command failed\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -211,7 +211,7 @@ static int board_added(struct slot *p_slot)
|
|||
struct controller *ctrl = p_slot->ctrl;
|
||||
|
||||
dbg("%s: slot device, slot offset, hp slot = %d, %d ,%d\n",
|
||||
__FUNCTION__, p_slot->device,
|
||||
__func__, p_slot->device,
|
||||
ctrl->slot_device_offset, p_slot->hp_slot);
|
||||
|
||||
if (POWER_CTRL(ctrl->ctrlcap)) {
|
||||
|
@ -230,14 +230,14 @@ static int board_added(struct slot *p_slot)
|
|||
/* Check link training status */
|
||||
retval = p_slot->hpc_ops->check_lnk_status(ctrl);
|
||||
if (retval) {
|
||||
err("%s: Failed to check link status\n", __FUNCTION__);
|
||||
err("%s: Failed to check link status\n", __func__);
|
||||
set_slot_off(ctrl, p_slot);
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* Check for a power fault */
|
||||
if (p_slot->hpc_ops->query_power_fault(p_slot)) {
|
||||
dbg("%s: power fault detected\n", __FUNCTION__);
|
||||
dbg("%s: power fault detected\n", __func__);
|
||||
retval = POWER_FAILURE;
|
||||
goto err_exit;
|
||||
}
|
||||
|
@ -277,14 +277,14 @@ static int remove_board(struct slot *p_slot)
|
|||
if (retval)
|
||||
return retval;
|
||||
|
||||
dbg("In %s, hp_slot = %d\n", __FUNCTION__, p_slot->hp_slot);
|
||||
dbg("In %s, hp_slot = %d\n", __func__, p_slot->hp_slot);
|
||||
|
||||
if (POWER_CTRL(ctrl->ctrlcap)) {
|
||||
/* power off slot */
|
||||
retval = p_slot->hpc_ops->power_off_slot(p_slot);
|
||||
if (retval) {
|
||||
err("%s: Issue of Slot Disable command failed\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
|
@ -319,7 +319,7 @@ static void pciehp_power_thread(struct work_struct *work)
|
|||
case POWEROFF_STATE:
|
||||
mutex_unlock(&p_slot->lock);
|
||||
dbg("%s: disabling bus:device(%x:%x)\n",
|
||||
__FUNCTION__, p_slot->bus, p_slot->device);
|
||||
__func__, p_slot->bus, p_slot->device);
|
||||
pciehp_disable_slot(p_slot);
|
||||
mutex_lock(&p_slot->lock);
|
||||
p_slot->state = STATIC_STATE;
|
||||
|
@ -347,7 +347,7 @@ void pciehp_queue_pushbutton_work(struct work_struct *work)
|
|||
|
||||
info = kmalloc(sizeof(*info), GFP_KERNEL);
|
||||
if (!info) {
|
||||
err("%s: Cannot allocate memory\n", __FUNCTION__);
|
||||
err("%s: Cannot allocate memory\n", __func__);
|
||||
return;
|
||||
}
|
||||
info->p_slot = p_slot;
|
||||
|
@ -424,7 +424,7 @@ static void handle_button_press_event(struct slot *p_slot)
|
|||
* expires to cancel hot-add or hot-remove
|
||||
*/
|
||||
info("Button cancel on Slot(%s)\n", p_slot->name);
|
||||
dbg("%s: button cancel\n", __FUNCTION__);
|
||||
dbg("%s: button cancel\n", __func__);
|
||||
cancel_delayed_work(&p_slot->work);
|
||||
if (p_slot->state == BLINKINGOFF_STATE) {
|
||||
if (PWR_LED(ctrl->ctrlcap))
|
||||
|
@ -465,7 +465,7 @@ static void handle_surprise_event(struct slot *p_slot)
|
|||
|
||||
info = kmalloc(sizeof(*info), GFP_KERNEL);
|
||||
if (!info) {
|
||||
err("%s: Cannot allocate memory\n", __FUNCTION__);
|
||||
err("%s: Cannot allocate memory\n", __func__);
|
||||
return;
|
||||
}
|
||||
info->p_slot = p_slot;
|
||||
|
@ -526,7 +526,7 @@ int pciehp_enable_slot(struct slot *p_slot)
|
|||
|
||||
rc = p_slot->hpc_ops->get_adapter_status(p_slot, &getstatus);
|
||||
if (rc || !getstatus) {
|
||||
info("%s: no adapter on slot(%s)\n", __FUNCTION__,
|
||||
info("%s: no adapter on slot(%s)\n", __func__,
|
||||
p_slot->name);
|
||||
mutex_unlock(&p_slot->ctrl->crit_sect);
|
||||
return -ENODEV;
|
||||
|
@ -534,7 +534,7 @@ int pciehp_enable_slot(struct slot *p_slot)
|
|||
if (MRL_SENS(p_slot->ctrl->ctrlcap)) {
|
||||
rc = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
|
||||
if (rc || getstatus) {
|
||||
info("%s: latch open on slot(%s)\n", __FUNCTION__,
|
||||
info("%s: latch open on slot(%s)\n", __func__,
|
||||
p_slot->name);
|
||||
mutex_unlock(&p_slot->ctrl->crit_sect);
|
||||
return -ENODEV;
|
||||
|
@ -544,7 +544,7 @@ int pciehp_enable_slot(struct slot *p_slot)
|
|||
if (POWER_CTRL(p_slot->ctrl->ctrlcap)) {
|
||||
rc = p_slot->hpc_ops->get_power_status(p_slot, &getstatus);
|
||||
if (rc || getstatus) {
|
||||
info("%s: already enabled on slot(%s)\n", __FUNCTION__,
|
||||
info("%s: already enabled on slot(%s)\n", __func__,
|
||||
p_slot->name);
|
||||
mutex_unlock(&p_slot->ctrl->crit_sect);
|
||||
return -EINVAL;
|
||||
|
@ -579,7 +579,7 @@ int pciehp_disable_slot(struct slot *p_slot)
|
|||
if (!HP_SUPR_RM(p_slot->ctrl->ctrlcap)) {
|
||||
ret = p_slot->hpc_ops->get_adapter_status(p_slot, &getstatus);
|
||||
if (ret || !getstatus) {
|
||||
info("%s: no adapter on slot(%s)\n", __FUNCTION__,
|
||||
info("%s: no adapter on slot(%s)\n", __func__,
|
||||
p_slot->name);
|
||||
mutex_unlock(&p_slot->ctrl->crit_sect);
|
||||
return -ENODEV;
|
||||
|
@ -589,7 +589,7 @@ int pciehp_disable_slot(struct slot *p_slot)
|
|||
if (MRL_SENS(p_slot->ctrl->ctrlcap)) {
|
||||
ret = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
|
||||
if (ret || getstatus) {
|
||||
info("%s: latch open on slot(%s)\n", __FUNCTION__,
|
||||
info("%s: latch open on slot(%s)\n", __func__,
|
||||
p_slot->name);
|
||||
mutex_unlock(&p_slot->ctrl->crit_sect);
|
||||
return -ENODEV;
|
||||
|
@ -599,7 +599,7 @@ int pciehp_disable_slot(struct slot *p_slot)
|
|||
if (POWER_CTRL(p_slot->ctrl->ctrlcap)) {
|
||||
ret = p_slot->hpc_ops->get_power_status(p_slot, &getstatus);
|
||||
if (ret || !getstatus) {
|
||||
info("%s: already disabled slot(%s)\n", __FUNCTION__,
|
||||
info("%s: already disabled slot(%s)\n", __func__,
|
||||
p_slot->name);
|
||||
mutex_unlock(&p_slot->ctrl->crit_sect);
|
||||
return -EINVAL;
|
||||
|
|
|
@ -258,7 +258,7 @@ static int pcie_write_cmd(struct slot *slot, u16 cmd, u16 mask)
|
|||
|
||||
retval = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
|
||||
if (retval) {
|
||||
err("%s: Cannot read SLOTSTATUS register\n", __FUNCTION__);
|
||||
err("%s: Cannot read SLOTSTATUS register\n", __func__);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
@ -267,13 +267,13 @@ static int pcie_write_cmd(struct slot *slot, u16 cmd, u16 mask)
|
|||
proceed forward to issue the next command according
|
||||
to spec. Just print out the error message */
|
||||
dbg("%s: CMD_COMPLETED not clear after 1 sec.\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&ctrl->lock, flags);
|
||||
retval = pciehp_readw(ctrl, SLOTCTRL, &slot_ctrl);
|
||||
if (retval) {
|
||||
err("%s: Cannot read SLOTCTRL register\n", __FUNCTION__);
|
||||
err("%s: Cannot read SLOTCTRL register\n", __func__);
|
||||
goto out_spin_unlock;
|
||||
}
|
||||
|
||||
|
@ -283,7 +283,7 @@ static int pcie_write_cmd(struct slot *slot, u16 cmd, u16 mask)
|
|||
ctrl->cmd_busy = 1;
|
||||
retval = pciehp_writew(ctrl, SLOTCTRL, slot_ctrl);
|
||||
if (retval)
|
||||
err("%s: Cannot write to SLOTCTRL register\n", __FUNCTION__);
|
||||
err("%s: Cannot write to SLOTCTRL register\n", __func__);
|
||||
|
||||
out_spin_unlock:
|
||||
spin_unlock_irqrestore(&ctrl->lock, flags);
|
||||
|
@ -305,14 +305,14 @@ static int hpc_check_lnk_status(struct controller *ctrl)
|
|||
|
||||
retval = pciehp_readw(ctrl, LNKSTATUS, &lnk_status);
|
||||
if (retval) {
|
||||
err("%s: Cannot read LNKSTATUS register\n", __FUNCTION__);
|
||||
err("%s: Cannot read LNKSTATUS register\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
dbg("%s: lnk_status = %x\n", __FUNCTION__, lnk_status);
|
||||
dbg("%s: lnk_status = %x\n", __func__, lnk_status);
|
||||
if ( (lnk_status & LNK_TRN) || (lnk_status & LNK_TRN_ERR) ||
|
||||
!(lnk_status & NEG_LINK_WD)) {
|
||||
err("%s : Link Training Error occurs \n", __FUNCTION__);
|
||||
err("%s : Link Training Error occurs \n", __func__);
|
||||
retval = -1;
|
||||
return retval;
|
||||
}
|
||||
|
@ -329,12 +329,12 @@ static int hpc_get_attention_status(struct slot *slot, u8 *status)
|
|||
|
||||
retval = pciehp_readw(ctrl, SLOTCTRL, &slot_ctrl);
|
||||
if (retval) {
|
||||
err("%s: Cannot read SLOTCTRL register\n", __FUNCTION__);
|
||||
err("%s: Cannot read SLOTCTRL register\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
dbg("%s: SLOTCTRL %x, value read %x\n",
|
||||
__FUNCTION__, ctrl->cap_base + SLOTCTRL, slot_ctrl);
|
||||
__func__, ctrl->cap_base + SLOTCTRL, slot_ctrl);
|
||||
|
||||
atten_led_state = (slot_ctrl & ATTN_LED_CTRL) >> 6;
|
||||
|
||||
|
@ -368,11 +368,11 @@ static int hpc_get_power_status(struct slot *slot, u8 *status)
|
|||
|
||||
retval = pciehp_readw(ctrl, SLOTCTRL, &slot_ctrl);
|
||||
if (retval) {
|
||||
err("%s: Cannot read SLOTCTRL register\n", __FUNCTION__);
|
||||
err("%s: Cannot read SLOTCTRL register\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
dbg("%s: SLOTCTRL %x value read %x\n",
|
||||
__FUNCTION__, ctrl->cap_base + SLOTCTRL, slot_ctrl);
|
||||
__func__, ctrl->cap_base + SLOTCTRL, slot_ctrl);
|
||||
|
||||
pwr_state = (slot_ctrl & PWR_CTRL) >> 10;
|
||||
|
||||
|
@ -399,7 +399,7 @@ static int hpc_get_latch_status(struct slot *slot, u8 *status)
|
|||
|
||||
retval = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
|
||||
if (retval) {
|
||||
err("%s: Cannot read SLOTSTATUS register\n", __FUNCTION__);
|
||||
err("%s: Cannot read SLOTSTATUS register\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
@ -417,7 +417,7 @@ static int hpc_get_adapter_status(struct slot *slot, u8 *status)
|
|||
|
||||
retval = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
|
||||
if (retval) {
|
||||
err("%s: Cannot read SLOTSTATUS register\n", __FUNCTION__);
|
||||
err("%s: Cannot read SLOTSTATUS register\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
card_state = (u8)((slot_status & PRSN_STATE) >> 6);
|
||||
|
@ -435,7 +435,7 @@ static int hpc_query_power_fault(struct slot *slot)
|
|||
|
||||
retval = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
|
||||
if (retval) {
|
||||
err("%s: Cannot check for power fault\n", __FUNCTION__);
|
||||
err("%s: Cannot check for power fault\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
pwr_fault = (u8)((slot_status & PWR_FAULT_DETECTED) >> 1);
|
||||
|
@ -451,7 +451,7 @@ static int hpc_get_emi_status(struct slot *slot, u8 *status)
|
|||
|
||||
retval = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
|
||||
if (retval) {
|
||||
err("%s : Cannot check EMI status\n", __FUNCTION__);
|
||||
err("%s : Cannot check EMI status\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
*status = (slot_status & EMI_STATE) >> EMI_STATUS_BIT;
|
||||
|
@ -506,7 +506,7 @@ static int hpc_set_attention_status(struct slot *slot, u8 value)
|
|||
|
||||
rc = pcie_write_cmd(slot, slot_cmd, cmd_mask);
|
||||
dbg("%s: SLOTCTRL %x write cmd %x\n",
|
||||
__FUNCTION__, ctrl->cap_base + SLOTCTRL, slot_cmd);
|
||||
__func__, ctrl->cap_base + SLOTCTRL, slot_cmd);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -527,7 +527,7 @@ static void hpc_set_green_led_on(struct slot *slot)
|
|||
pcie_write_cmd(slot, slot_cmd, cmd_mask);
|
||||
|
||||
dbg("%s: SLOTCTRL %x write cmd %x\n",
|
||||
__FUNCTION__, ctrl->cap_base + SLOTCTRL, slot_cmd);
|
||||
__func__, ctrl->cap_base + SLOTCTRL, slot_cmd);
|
||||
}
|
||||
|
||||
static void hpc_set_green_led_off(struct slot *slot)
|
||||
|
@ -545,7 +545,7 @@ static void hpc_set_green_led_off(struct slot *slot)
|
|||
|
||||
pcie_write_cmd(slot, slot_cmd, cmd_mask);
|
||||
dbg("%s: SLOTCTRL %x write cmd %x\n",
|
||||
__FUNCTION__, ctrl->cap_base + SLOTCTRL, slot_cmd);
|
||||
__func__, ctrl->cap_base + SLOTCTRL, slot_cmd);
|
||||
}
|
||||
|
||||
static void hpc_set_green_led_blink(struct slot *slot)
|
||||
|
@ -564,7 +564,7 @@ static void hpc_set_green_led_blink(struct slot *slot)
|
|||
pcie_write_cmd(slot, slot_cmd, cmd_mask);
|
||||
|
||||
dbg("%s: SLOTCTRL %x write cmd %x\n",
|
||||
__FUNCTION__, ctrl->cap_base + SLOTCTRL, slot_cmd);
|
||||
__func__, ctrl->cap_base + SLOTCTRL, slot_cmd);
|
||||
}
|
||||
|
||||
static void hpc_release_ctlr(struct controller *ctrl)
|
||||
|
@ -590,12 +590,12 @@ static int hpc_power_on_slot(struct slot * slot)
|
|||
u16 slot_status;
|
||||
int retval = 0;
|
||||
|
||||
dbg("%s: slot->hp_slot %x\n", __FUNCTION__, slot->hp_slot);
|
||||
dbg("%s: slot->hp_slot %x\n", __func__, slot->hp_slot);
|
||||
|
||||
/* Clear sticky power-fault bit from previous power failures */
|
||||
retval = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
|
||||
if (retval) {
|
||||
err("%s: Cannot read SLOTSTATUS register\n", __FUNCTION__);
|
||||
err("%s: Cannot read SLOTSTATUS register\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
slot_status &= PWR_FAULT_DETECTED;
|
||||
|
@ -603,7 +603,7 @@ static int hpc_power_on_slot(struct slot * slot)
|
|||
retval = pciehp_writew(ctrl, SLOTSTATUS, slot_status);
|
||||
if (retval) {
|
||||
err("%s: Cannot write to SLOTSTATUS register\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
|
@ -627,11 +627,11 @@ static int hpc_power_on_slot(struct slot * slot)
|
|||
retval = pcie_write_cmd(slot, slot_cmd, cmd_mask);
|
||||
|
||||
if (retval) {
|
||||
err("%s: Write %x command failed!\n", __FUNCTION__, slot_cmd);
|
||||
err("%s: Write %x command failed!\n", __func__, slot_cmd);
|
||||
return -1;
|
||||
}
|
||||
dbg("%s: SLOTCTRL %x write cmd %x\n",
|
||||
__FUNCTION__, ctrl->cap_base + SLOTCTRL, slot_cmd);
|
||||
__func__, ctrl->cap_base + SLOTCTRL, slot_cmd);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
@ -677,7 +677,7 @@ static int hpc_power_off_slot(struct slot * slot)
|
|||
int retval = 0;
|
||||
int changed;
|
||||
|
||||
dbg("%s: slot->hp_slot %x\n", __FUNCTION__, slot->hp_slot);
|
||||
dbg("%s: slot->hp_slot %x\n", __func__, slot->hp_slot);
|
||||
|
||||
/*
|
||||
* Set Bad DLLP Mask bit in Correctable Error Mask
|
||||
|
@ -710,12 +710,12 @@ static int hpc_power_off_slot(struct slot * slot)
|
|||
|
||||
retval = pcie_write_cmd(slot, slot_cmd, cmd_mask);
|
||||
if (retval) {
|
||||
err("%s: Write command failed!\n", __FUNCTION__);
|
||||
err("%s: Write command failed!\n", __func__);
|
||||
retval = -1;
|
||||
goto out;
|
||||
}
|
||||
dbg("%s: SLOTCTRL %x write cmd %x\n",
|
||||
__FUNCTION__, ctrl->cap_base + SLOTCTRL, slot_cmd);
|
||||
__func__, ctrl->cap_base + SLOTCTRL, slot_cmd);
|
||||
|
||||
/*
|
||||
* After turning power off, we must wait for at least 1 second
|
||||
|
@ -741,7 +741,7 @@ static irqreturn_t pcie_isr(int irq, void *dev_id)
|
|||
|
||||
rc = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
|
||||
if (rc) {
|
||||
err("%s: Cannot read SLOTSTATUS register\n", __FUNCTION__);
|
||||
err("%s: Cannot read SLOTSTATUS register\n", __func__);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
|
@ -754,26 +754,26 @@ static irqreturn_t pcie_isr(int irq, void *dev_id)
|
|||
if ( !intr_loc )
|
||||
return IRQ_NONE;
|
||||
|
||||
dbg("%s: intr_loc %x\n", __FUNCTION__, intr_loc);
|
||||
dbg("%s: intr_loc %x\n", __func__, intr_loc);
|
||||
/* Mask Hot-plug Interrupt Enable */
|
||||
if (!pciehp_poll_mode) {
|
||||
spin_lock_irqsave(&ctrl->lock, flags);
|
||||
rc = pciehp_readw(ctrl, SLOTCTRL, &temp_word);
|
||||
if (rc) {
|
||||
err("%s: Cannot read SLOT_CTRL register\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
spin_unlock_irqrestore(&ctrl->lock, flags);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
dbg("%s: pciehp_readw(SLOTCTRL) with value %x\n",
|
||||
__FUNCTION__, temp_word);
|
||||
__func__, temp_word);
|
||||
temp_word = (temp_word & ~HP_INTR_ENABLE &
|
||||
~CMD_CMPL_INTR_ENABLE) | 0x00;
|
||||
rc = pciehp_writew(ctrl, SLOTCTRL, temp_word);
|
||||
if (rc) {
|
||||
err("%s: Cannot write to SLOTCTRL register\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
spin_unlock_irqrestore(&ctrl->lock, flags);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
@ -782,18 +782,18 @@ static irqreturn_t pcie_isr(int irq, void *dev_id)
|
|||
rc = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
|
||||
if (rc) {
|
||||
err("%s: Cannot read SLOT_STATUS register\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
dbg("%s: pciehp_readw(SLOTSTATUS) with value %x\n",
|
||||
__FUNCTION__, slot_status);
|
||||
__func__, slot_status);
|
||||
|
||||
/* Clear command complete interrupt caused by this write */
|
||||
temp_word = 0x1f;
|
||||
rc = pciehp_writew(ctrl, SLOTSTATUS, temp_word);
|
||||
if (rc) {
|
||||
err("%s: Cannot write to SLOTSTATUS register\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
}
|
||||
|
@ -822,7 +822,7 @@ static irqreturn_t pcie_isr(int irq, void *dev_id)
|
|||
temp_word = 0x1F;
|
||||
rc = pciehp_writew(ctrl, SLOTSTATUS, temp_word);
|
||||
if (rc) {
|
||||
err("%s: Cannot write to SLOTSTATUS register\n", __FUNCTION__);
|
||||
err("%s: Cannot write to SLOTSTATUS register\n", __func__);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
/* Unmask Hot-plug Interrupt Enable */
|
||||
|
@ -831,18 +831,18 @@ static irqreturn_t pcie_isr(int irq, void *dev_id)
|
|||
rc = pciehp_readw(ctrl, SLOTCTRL, &temp_word);
|
||||
if (rc) {
|
||||
err("%s: Cannot read SLOTCTRL register\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
spin_unlock_irqrestore(&ctrl->lock, flags);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
dbg("%s: Unmask Hot-plug Interrupt Enable\n", __FUNCTION__);
|
||||
dbg("%s: Unmask Hot-plug Interrupt Enable\n", __func__);
|
||||
temp_word = (temp_word & ~HP_INTR_ENABLE) | HP_INTR_ENABLE;
|
||||
|
||||
rc = pciehp_writew(ctrl, SLOTCTRL, temp_word);
|
||||
if (rc) {
|
||||
err("%s: Cannot write to SLOTCTRL register\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
spin_unlock_irqrestore(&ctrl->lock, flags);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
@ -851,7 +851,7 @@ static irqreturn_t pcie_isr(int irq, void *dev_id)
|
|||
rc = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
|
||||
if (rc) {
|
||||
err("%s: Cannot read SLOT_STATUS register\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
|
@ -860,11 +860,11 @@ static irqreturn_t pcie_isr(int irq, void *dev_id)
|
|||
rc = pciehp_writew(ctrl, SLOTSTATUS, temp_word);
|
||||
if (rc) {
|
||||
err("%s: Cannot write to SLOTSTATUS failed\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
dbg("%s: pciehp_writew(SLOTSTATUS) with value %x\n",
|
||||
__FUNCTION__, temp_word);
|
||||
__func__, temp_word);
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
|
@ -879,7 +879,7 @@ static int hpc_get_max_lnk_speed(struct slot *slot, enum pci_bus_speed *value)
|
|||
|
||||
retval = pciehp_readl(ctrl, LNKCAP, &lnk_cap);
|
||||
if (retval) {
|
||||
err("%s: Cannot read LNKCAP register\n", __FUNCTION__);
|
||||
err("%s: Cannot read LNKCAP register\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
@ -908,7 +908,7 @@ static int hpc_get_max_lnk_width(struct slot *slot,
|
|||
|
||||
retval = pciehp_readl(ctrl, LNKCAP, &lnk_cap);
|
||||
if (retval) {
|
||||
err("%s: Cannot read LNKCAP register\n", __FUNCTION__);
|
||||
err("%s: Cannot read LNKCAP register\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
@ -957,7 +957,7 @@ static int hpc_get_cur_lnk_speed(struct slot *slot, enum pci_bus_speed *value)
|
|||
|
||||
retval = pciehp_readw(ctrl, LNKSTATUS, &lnk_status);
|
||||
if (retval) {
|
||||
err("%s: Cannot read LNKSTATUS register\n", __FUNCTION__);
|
||||
err("%s: Cannot read LNKSTATUS register\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
@ -986,7 +986,7 @@ static int hpc_get_cur_lnk_width(struct slot *slot,
|
|||
|
||||
retval = pciehp_readw(ctrl, LNKSTATUS, &lnk_status);
|
||||
if (retval) {
|
||||
err("%s: Cannot read LNKSTATUS register\n", __FUNCTION__);
|
||||
err("%s: Cannot read LNKSTATUS register\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
@ -1130,38 +1130,38 @@ static int pcie_init_hardware_part1(struct controller *ctrl,
|
|||
|
||||
rc = pciehp_readl(ctrl, SLOTCAP, &slot_cap);
|
||||
if (rc) {
|
||||
err("%s: Cannot read SLOTCAP register\n", __FUNCTION__);
|
||||
err("%s: Cannot read SLOTCAP register\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Mask Hot-plug Interrupt Enable */
|
||||
rc = pciehp_readw(ctrl, SLOTCTRL, &temp_word);
|
||||
if (rc) {
|
||||
err("%s: Cannot read SLOTCTRL register\n", __FUNCTION__);
|
||||
err("%s: Cannot read SLOTCTRL register\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
dbg("%s: SLOTCTRL %x value read %x\n",
|
||||
__FUNCTION__, ctrl->cap_base + SLOTCTRL, temp_word);
|
||||
__func__, ctrl->cap_base + SLOTCTRL, temp_word);
|
||||
temp_word = (temp_word & ~HP_INTR_ENABLE & ~CMD_CMPL_INTR_ENABLE) |
|
||||
0x00;
|
||||
|
||||
rc = pciehp_writew(ctrl, SLOTCTRL, temp_word);
|
||||
if (rc) {
|
||||
err("%s: Cannot write to SLOTCTRL register\n", __FUNCTION__);
|
||||
err("%s: Cannot write to SLOTCTRL register\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
rc = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
|
||||
if (rc) {
|
||||
err("%s: Cannot read SLOTSTATUS register\n", __FUNCTION__);
|
||||
err("%s: Cannot read SLOTSTATUS register\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
temp_word = 0x1F; /* Clear all events */
|
||||
rc = pciehp_writew(ctrl, SLOTSTATUS, temp_word);
|
||||
if (rc) {
|
||||
err("%s: Cannot write to SLOTSTATUS register\n", __FUNCTION__);
|
||||
err("%s: Cannot write to SLOTSTATUS register\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
|
@ -1177,7 +1177,7 @@ int pcie_init_hardware_part2(struct controller *ctrl, struct pcie_device *dev)
|
|||
|
||||
rc = pciehp_readw(ctrl, SLOTCTRL, &temp_word);
|
||||
if (rc) {
|
||||
err("%s: Cannot read SLOTCTRL register\n", __FUNCTION__);
|
||||
err("%s: Cannot read SLOTCTRL register\n", __func__);
|
||||
goto abort;
|
||||
}
|
||||
|
||||
|
@ -1185,7 +1185,7 @@ int pcie_init_hardware_part2(struct controller *ctrl, struct pcie_device *dev)
|
|||
|
||||
rc = pciehp_readl(ctrl, SLOTCAP, &slot_cap);
|
||||
if (rc) {
|
||||
err("%s: Cannot read SLOTCAP register\n", __FUNCTION__);
|
||||
err("%s: Cannot read SLOTCAP register\n", __func__);
|
||||
goto abort;
|
||||
}
|
||||
|
||||
|
@ -1212,19 +1212,19 @@ int pcie_init_hardware_part2(struct controller *ctrl, struct pcie_device *dev)
|
|||
*/
|
||||
rc = pciehp_writew(ctrl, SLOTCTRL, temp_word);
|
||||
if (rc) {
|
||||
err("%s: Cannot write to SLOTCTRL register\n", __FUNCTION__);
|
||||
err("%s: Cannot write to SLOTCTRL register\n", __func__);
|
||||
goto abort;
|
||||
}
|
||||
rc = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
|
||||
if (rc) {
|
||||
err("%s: Cannot read SLOTSTATUS register\n", __FUNCTION__);
|
||||
err("%s: Cannot read SLOTSTATUS register\n", __func__);
|
||||
goto abort_disable_intr;
|
||||
}
|
||||
|
||||
temp_word = 0x1F; /* Clear all events */
|
||||
rc = pciehp_writew(ctrl, SLOTSTATUS, temp_word);
|
||||
if (rc) {
|
||||
err("%s: Cannot write to SLOTSTATUS register\n", __FUNCTION__);
|
||||
err("%s: Cannot write to SLOTSTATUS register\n", __func__);
|
||||
goto abort_disable_intr;
|
||||
}
|
||||
|
||||
|
@ -1247,7 +1247,7 @@ abort_disable_intr:
|
|||
rc = pciehp_writew(ctrl, SLOTCTRL, temp_word);
|
||||
}
|
||||
if (rc)
|
||||
err("%s : disabling interrupts failed\n", __FUNCTION__);
|
||||
err("%s : disabling interrupts failed\n", __func__);
|
||||
abort:
|
||||
return -1;
|
||||
}
|
||||
|
@ -1265,62 +1265,62 @@ int pcie_init(struct controller *ctrl, struct pcie_device *dev)
|
|||
ctrl->pci_dev = pdev; /* save pci_dev in context */
|
||||
|
||||
dbg("%s: hotplug controller vendor id 0x%x device id 0x%x\n",
|
||||
__FUNCTION__, pdev->vendor, pdev->device);
|
||||
__func__, pdev->vendor, pdev->device);
|
||||
|
||||
cap_base = pci_find_capability(pdev, PCI_CAP_ID_EXP);
|
||||
if (cap_base == 0) {
|
||||
dbg("%s: Can't find PCI_CAP_ID_EXP (0x10)\n", __FUNCTION__);
|
||||
dbg("%s: Can't find PCI_CAP_ID_EXP (0x10)\n", __func__);
|
||||
goto abort;
|
||||
}
|
||||
|
||||
ctrl->cap_base = cap_base;
|
||||
|
||||
dbg("%s: pcie_cap_base %x\n", __FUNCTION__, cap_base);
|
||||
dbg("%s: pcie_cap_base %x\n", __func__, cap_base);
|
||||
|
||||
rc = pciehp_readw(ctrl, CAPREG, &cap_reg);
|
||||
if (rc) {
|
||||
err("%s: Cannot read CAPREG register\n", __FUNCTION__);
|
||||
err("%s: Cannot read CAPREG register\n", __func__);
|
||||
goto abort;
|
||||
}
|
||||
dbg("%s: CAPREG offset %x cap_reg %x\n",
|
||||
__FUNCTION__, ctrl->cap_base + CAPREG, cap_reg);
|
||||
__func__, ctrl->cap_base + CAPREG, cap_reg);
|
||||
|
||||
if (((cap_reg & SLOT_IMPL) == 0) ||
|
||||
(((cap_reg & DEV_PORT_TYPE) != 0x0040)
|
||||
&& ((cap_reg & DEV_PORT_TYPE) != 0x0060))) {
|
||||
dbg("%s : This is not a root port or the port is not "
|
||||
"connected to a slot\n", __FUNCTION__);
|
||||
"connected to a slot\n", __func__);
|
||||
goto abort;
|
||||
}
|
||||
|
||||
rc = pciehp_readl(ctrl, SLOTCAP, &slot_cap);
|
||||
if (rc) {
|
||||
err("%s: Cannot read SLOTCAP register\n", __FUNCTION__);
|
||||
err("%s: Cannot read SLOTCAP register\n", __func__);
|
||||
goto abort;
|
||||
}
|
||||
dbg("%s: SLOTCAP offset %x slot_cap %x\n",
|
||||
__FUNCTION__, ctrl->cap_base + SLOTCAP, slot_cap);
|
||||
__func__, ctrl->cap_base + SLOTCAP, slot_cap);
|
||||
|
||||
if (!(slot_cap & HP_CAP)) {
|
||||
dbg("%s : This slot is not hot-plug capable\n", __FUNCTION__);
|
||||
dbg("%s : This slot is not hot-plug capable\n", __func__);
|
||||
goto abort;
|
||||
}
|
||||
/* For debugging purpose */
|
||||
rc = pciehp_readw(ctrl, SLOTSTATUS, &slot_status);
|
||||
if (rc) {
|
||||
err("%s: Cannot read SLOTSTATUS register\n", __FUNCTION__);
|
||||
err("%s: Cannot read SLOTSTATUS register\n", __func__);
|
||||
goto abort;
|
||||
}
|
||||
dbg("%s: SLOTSTATUS offset %x slot_status %x\n",
|
||||
__FUNCTION__, ctrl->cap_base + SLOTSTATUS, slot_status);
|
||||
__func__, ctrl->cap_base + SLOTSTATUS, slot_status);
|
||||
|
||||
rc = pciehp_readw(ctrl, SLOTCTRL, &slot_ctrl);
|
||||
if (rc) {
|
||||
err("%s: Cannot read SLOTCTRL register\n", __FUNCTION__);
|
||||
err("%s: Cannot read SLOTCTRL register\n", __func__);
|
||||
goto abort;
|
||||
}
|
||||
dbg("%s: SLOTCTRL offset %x slot_ctrl %x\n",
|
||||
__FUNCTION__, ctrl->cap_base + SLOTCTRL, slot_ctrl);
|
||||
__func__, ctrl->cap_base + SLOTCTRL, slot_ctrl);
|
||||
|
||||
for (rc = 0; rc < DEVICE_COUNT_RESOURCE; rc++)
|
||||
if (pci_resource_len(pdev, rc) > 0)
|
||||
|
@ -1358,7 +1358,7 @@ int pcie_init(struct controller *ctrl, struct pcie_device *dev)
|
|||
rc = request_irq(ctrl->pci_dev->irq, pcie_isr, IRQF_SHARED,
|
||||
MY_NAME, (void *)ctrl);
|
||||
dbg("%s: request_irq %d for hpc%d (returns %d)\n",
|
||||
__FUNCTION__, ctrl->pci_dev->irq,
|
||||
__func__, ctrl->pci_dev->irq,
|
||||
atomic_read(&pciehp_num_controllers), rc);
|
||||
if (rc) {
|
||||
err("Can't get irq %d for the hotplug controller\n",
|
||||
|
|
|
@ -40,7 +40,7 @@ static void program_hpp_type0(struct pci_dev *dev, struct hpp_type0 *hpp)
|
|||
|
||||
if (hpp->revision > 1) {
|
||||
printk(KERN_WARNING "%s: Rev.%d type0 record not supported\n",
|
||||
__FUNCTION__, hpp->revision);
|
||||
__func__, hpp->revision);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -82,7 +82,7 @@ static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp)
|
|||
|
||||
if (hpp->revision > 1) {
|
||||
printk(KERN_WARNING "%s: Rev.%d type2 record not supported\n",
|
||||
__FUNCTION__, hpp->revision);
|
||||
__func__, hpp->revision);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -150,7 +150,7 @@ static void program_fw_provided_values(struct pci_dev *dev)
|
|||
|
||||
if (pciehp_get_hp_params_from_firmware(dev, &hpp)) {
|
||||
printk(KERN_WARNING "%s: Could not get hotplug parameters\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -245,7 +245,7 @@ int pciehp_unconfigure_device(struct slot *p_slot)
|
|||
struct pci_bus *parent = p_slot->ctrl->pci_dev->subordinate;
|
||||
u16 command;
|
||||
|
||||
dbg("%s: bus/dev = %x/%x\n", __FUNCTION__, p_slot->bus,
|
||||
dbg("%s: bus/dev = %x/%x\n", __func__, p_slot->bus,
|
||||
p_slot->device);
|
||||
ret = p_slot->hpc_ops->get_adapter_status(p_slot, &presence);
|
||||
if (ret)
|
||||
|
|
|
@ -98,7 +98,7 @@ static int enable_slot(struct hotplug_slot *hotplug_slot)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
int retval = 0;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
/*
|
||||
* Fill in code here to enable the specified slot
|
||||
|
@ -112,7 +112,7 @@ static int disable_slot(struct hotplug_slot *hotplug_slot)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
int retval = 0;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
/*
|
||||
* Fill in code here to disable the specified slot
|
||||
|
@ -126,7 +126,7 @@ static int set_attention_status(struct hotplug_slot *hotplug_slot, u8 status)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
int retval = 0;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
switch (status) {
|
||||
case 0:
|
||||
|
@ -151,7 +151,7 @@ static int hardware_test(struct hotplug_slot *hotplug_slot, u32 value)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
int retval = 0;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
switch (value) {
|
||||
case 0:
|
||||
|
@ -170,7 +170,7 @@ static int get_power_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
int retval = 0;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
/*
|
||||
* Fill in logic to get the current power status of the specific
|
||||
|
@ -185,7 +185,7 @@ static int get_attention_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
int retval = 0;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
/*
|
||||
* Fill in logic to get the current attention status of the specific
|
||||
|
@ -200,7 +200,7 @@ static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
int retval = 0;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
/*
|
||||
* Fill in logic to get the current latch status of the specific
|
||||
|
@ -215,7 +215,7 @@ static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
struct slot *slot = hotplug_slot->private;
|
||||
int retval = 0;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
/*
|
||||
* Fill in logic to get the current adapter status of the specific
|
||||
|
@ -229,7 +229,7 @@ static void release_slot(struct hotplug_slot *hotplug_slot)
|
|||
{
|
||||
struct slot *slot = hotplug_slot->private;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
kfree(slot->hotplug_slot->info);
|
||||
kfree(slot->hotplug_slot);
|
||||
kfree(slot);
|
||||
|
|
|
@ -147,7 +147,7 @@ static void dlpar_pci_add_bus(struct device_node *dn)
|
|||
dev = of_create_pci_dev(dn, phb->bus, pdn->devfn);
|
||||
if (!dev) {
|
||||
printk(KERN_ERR "%s: failed to create pci dev for %s\n",
|
||||
__FUNCTION__, dn->full_name);
|
||||
__func__, dn->full_name);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -183,21 +183,21 @@ static int dlpar_add_pci_slot(char *drc_name, struct device_node *dn)
|
|||
dev = dlpar_find_new_dev(phb->bus, dn);
|
||||
|
||||
if (!dev) {
|
||||
printk(KERN_ERR "%s: unable to add bus %s\n", __FUNCTION__,
|
||||
printk(KERN_ERR "%s: unable to add bus %s\n", __func__,
|
||||
drc_name);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (dev->hdr_type != PCI_HEADER_TYPE_BRIDGE) {
|
||||
printk(KERN_ERR "%s: unexpected header type %d, unable to add bus %s\n",
|
||||
__FUNCTION__, dev->hdr_type, drc_name);
|
||||
__func__, dev->hdr_type, drc_name);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* Add hotplug slot */
|
||||
if (rpaphp_add_slot(dn)) {
|
||||
printk(KERN_ERR "%s: unable to add hotplug slot %s\n",
|
||||
__FUNCTION__, drc_name);
|
||||
__func__, drc_name);
|
||||
return -EIO;
|
||||
}
|
||||
return 0;
|
||||
|
@ -239,7 +239,7 @@ static int dlpar_remove_phb(char *drc_name, struct device_node *dn)
|
|||
if (rpaphp_deregister_slot(slot)) {
|
||||
printk(KERN_ERR
|
||||
"%s: unable to remove hotplug slot %s\n",
|
||||
__FUNCTION__, drc_name);
|
||||
__func__, drc_name);
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
|
@ -270,7 +270,7 @@ static int dlpar_add_phb(char *drc_name, struct device_node *dn)
|
|||
|
||||
if (rpaphp_add_slot(dn)) {
|
||||
printk(KERN_ERR "%s: unable to add hotplug slot %s\n",
|
||||
__FUNCTION__, drc_name);
|
||||
__func__, drc_name);
|
||||
return -EIO;
|
||||
}
|
||||
return 0;
|
||||
|
@ -284,7 +284,7 @@ static int dlpar_add_vio_slot(char *drc_name, struct device_node *dn)
|
|||
if (!vio_register_device_node(dn)) {
|
||||
printk(KERN_ERR
|
||||
"%s: failed to register vio node %s\n",
|
||||
__FUNCTION__, drc_name);
|
||||
__func__, drc_name);
|
||||
return -EIO;
|
||||
}
|
||||
return 0;
|
||||
|
@ -384,7 +384,7 @@ int dlpar_remove_pci_slot(char *drc_name, struct device_node *dn)
|
|||
if (rpaphp_deregister_slot(slot)) {
|
||||
printk(KERN_ERR
|
||||
"%s: unable to remove hotplug slot %s\n",
|
||||
__FUNCTION__, drc_name);
|
||||
__func__, drc_name);
|
||||
return -EIO;
|
||||
}
|
||||
} else
|
||||
|
@ -392,7 +392,7 @@ int dlpar_remove_pci_slot(char *drc_name, struct device_node *dn)
|
|||
|
||||
if (pcibios_unmap_io_space(bus)) {
|
||||
printk(KERN_ERR "%s: failed to unmap bus range\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
|
@ -458,7 +458,7 @@ int __init rpadlpar_io_init(void)
|
|||
|
||||
if (!is_dlpar_capable()) {
|
||||
printk(KERN_WARNING "%s: partition not DLPAR capable\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
|
|
|
@ -317,7 +317,7 @@ int rpaphp_add_slot(struct device_node *dn)
|
|||
if (!is_php_dn(dn, &indexes, &names, &types, &power_domains))
|
||||
return 0;
|
||||
|
||||
dbg("Entry %s: dn->full_name=%s\n", __FUNCTION__, dn->full_name);
|
||||
dbg("Entry %s: dn->full_name=%s\n", __func__, dn->full_name);
|
||||
|
||||
/* register PCI devices */
|
||||
name = (char *) &names[1];
|
||||
|
@ -343,7 +343,7 @@ int rpaphp_add_slot(struct device_node *dn)
|
|||
name += strlen(name) + 1;
|
||||
type += strlen(type) + 1;
|
||||
}
|
||||
dbg("%s - Exit: rc[%d]\n", __FUNCTION__, retval);
|
||||
dbg("%s - Exit: rc[%d]\n", __func__, retval);
|
||||
|
||||
/* XXX FIXME: reports a failure only if last entry in loop failed */
|
||||
return retval;
|
||||
|
@ -404,7 +404,7 @@ static int enable_slot(struct hotplug_slot *hotplug_slot)
|
|||
} else if (state == EMPTY) {
|
||||
slot->state = EMPTY;
|
||||
} else {
|
||||
err("%s: slot[%s] is in invalid state\n", __FUNCTION__, slot->name);
|
||||
err("%s: slot[%s] is in invalid state\n", __func__, slot->name);
|
||||
slot->state = NOT_VALID;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
@ -42,7 +42,7 @@ int rpaphp_get_sensor_state(struct slot *slot, int *state)
|
|||
if (rc < 0) {
|
||||
if (rc == -EFAULT || rc == -EEXIST) {
|
||||
dbg("%s: slot must be power up to get sensor-state\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
|
||||
/* some slots have to be powered up
|
||||
* before get-sensor will succeed.
|
||||
|
@ -51,15 +51,15 @@ int rpaphp_get_sensor_state(struct slot *slot, int *state)
|
|||
&setlevel);
|
||||
if (rc < 0) {
|
||||
dbg("%s: power on slot[%s] failed rc=%d.\n",
|
||||
__FUNCTION__, slot->name, rc);
|
||||
__func__, slot->name, rc);
|
||||
} else {
|
||||
rc = rtas_get_sensor(DR_ENTITY_SENSE,
|
||||
slot->index, state);
|
||||
}
|
||||
} else if (rc == -ENODEV)
|
||||
info("%s: slot is unusable\n", __FUNCTION__);
|
||||
info("%s: slot is unusable\n", __func__);
|
||||
else
|
||||
err("%s failed to get sensor state\n", __FUNCTION__);
|
||||
err("%s failed to get sensor state\n", __func__);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
@ -95,7 +95,7 @@ int rpaphp_enable_slot(struct slot *slot)
|
|||
|
||||
bus = pcibios_find_pci_bus(slot->dn);
|
||||
if (!bus) {
|
||||
err("%s: no pci_bus for dn %s\n", __FUNCTION__, slot->dn->full_name);
|
||||
err("%s: no pci_bus for dn %s\n", __func__, slot->dn->full_name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -111,7 +111,7 @@ int rpaphp_enable_slot(struct slot *slot)
|
|||
/* non-empty slot has to have child */
|
||||
if (!slot->dn->child) {
|
||||
err("%s: slot[%s]'s device_node doesn't have child for adapter\n",
|
||||
__FUNCTION__, slot->name);
|
||||
__func__, slot->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -125,7 +125,7 @@ int rpaphp_enable_slot(struct slot *slot)
|
|||
|
||||
if (debug) {
|
||||
struct pci_dev *dev;
|
||||
dbg("%s: pci_devs of slot[%s]\n", __FUNCTION__, slot->dn->full_name);
|
||||
dbg("%s: pci_devs of slot[%s]\n", __func__, slot->dn->full_name);
|
||||
list_for_each_entry (dev, &bus->devices, bus_list)
|
||||
dbg("\t%s\n", pci_name(dev));
|
||||
}
|
||||
|
|
|
@ -131,7 +131,7 @@ int rpaphp_deregister_slot(struct slot *slot)
|
|||
struct hotplug_slot *php_slot = slot->hotplug_slot;
|
||||
|
||||
dbg("%s - Entry: deregistering slot=%s\n",
|
||||
__FUNCTION__, slot->name);
|
||||
__func__, slot->name);
|
||||
|
||||
list_del(&slot->rpaphp_slot_list);
|
||||
|
||||
|
@ -142,7 +142,7 @@ int rpaphp_deregister_slot(struct slot *slot)
|
|||
if (retval)
|
||||
err("Problem unregistering a slot %s\n", slot->name);
|
||||
|
||||
dbg("%s - Exit: rc[%d]\n", __FUNCTION__, retval);
|
||||
dbg("%s - Exit: rc[%d]\n", __func__, retval);
|
||||
return retval;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rpaphp_deregister_slot);
|
||||
|
@ -153,7 +153,7 @@ int rpaphp_register_slot(struct slot *slot)
|
|||
int retval;
|
||||
|
||||
dbg("%s registering slot:path[%s] index[%x], name[%s] pdomain[%x] type[%d]\n",
|
||||
__FUNCTION__, slot->dn->full_name, slot->index, slot->name,
|
||||
__func__, slot->dn->full_name, slot->index, slot->name,
|
||||
slot->power_domain, slot->type);
|
||||
|
||||
/* should not try to register the same slot twice */
|
||||
|
|
|
@ -367,7 +367,7 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot)
|
|||
ret = acpi_load_table((struct acpi_table_header *)ssdt);
|
||||
if (ACPI_FAILURE(ret)) {
|
||||
printk(KERN_ERR "%s: acpi_load_table failed (0x%x)\n",
|
||||
__FUNCTION__, ret);
|
||||
__func__, ret);
|
||||
/* try to continue on */
|
||||
}
|
||||
}
|
||||
|
@ -459,7 +459,7 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot)
|
|||
if (ACPI_FAILURE(ret)) {
|
||||
printk(KERN_ERR "%s: acpi_bus_add "
|
||||
"failed (0x%x) for slot %d "
|
||||
"func %d\n", __FUNCTION__,
|
||||
"func %d\n", __func__,
|
||||
ret, (int)(adr>>16),
|
||||
(int)(adr&0xffff));
|
||||
/* try to continue on */
|
||||
|
@ -570,7 +570,7 @@ static int disable_slot(struct hotplug_slot *bss_hotplug_slot)
|
|||
if (ACPI_FAILURE(ret)) {
|
||||
printk(KERN_ERR "%s: acpi_unload_table_id "
|
||||
"failed (0x%x) for id %d\n",
|
||||
__FUNCTION__, ret, ssdt_id);
|
||||
__func__, ret, ssdt_id);
|
||||
/* try to continue on */
|
||||
}
|
||||
}
|
||||
|
@ -689,7 +689,7 @@ static int sn_pci_hotplug_init(void)
|
|||
|
||||
if (!sn_prom_feature_available(PRF_HOTPLUG_SUPPORT)) {
|
||||
printk(KERN_ERR "%s: PROM version does not support hotplug.\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
|
|
|
@ -234,7 +234,7 @@ static inline struct slot *shpchp_find_slot(struct controller *ctrl, u8 device)
|
|||
return slot;
|
||||
}
|
||||
|
||||
err("%s: slot (device=0x%x) not found\n", __FUNCTION__, device);
|
||||
err("%s: slot (device=0x%x) not found\n", __func__, device);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -268,7 +268,7 @@ static inline void amd_pogo_errata_restore_misc_reg(struct slot *p_slot)
|
|||
pci_read_config_dword(p_slot->ctrl->pci_dev, PCIX_MISC_BRIDGE_ERRORS_OFFSET, &pcix_bridge_errors_reg);
|
||||
perr_set = pcix_bridge_errors_reg & PERR_OBSERVED_MASK;
|
||||
if (perr_set) {
|
||||
dbg ("%s W1C: Bridge_Errors[ PERR_OBSERVED = %08X]\n",__FUNCTION__ , perr_set);
|
||||
dbg ("%s W1C: Bridge_Errors[ PERR_OBSERVED = %08X]\n",__func__ , perr_set);
|
||||
|
||||
pci_write_config_dword(p_slot->ctrl->pci_dev, PCIX_MISC_BRIDGE_ERRORS_OFFSET, perr_set);
|
||||
}
|
||||
|
@ -277,7 +277,7 @@ static inline void amd_pogo_errata_restore_misc_reg(struct slot *p_slot)
|
|||
pci_read_config_dword(p_slot->ctrl->pci_dev, PCIX_MEM_BASE_LIMIT_OFFSET, &pcix_mem_base_reg);
|
||||
rse_set = pcix_mem_base_reg & RSE_MASK;
|
||||
if (rse_set) {
|
||||
dbg ("%s W1C: Memory_Base_Limit[ RSE ]\n",__FUNCTION__ );
|
||||
dbg ("%s W1C: Memory_Base_Limit[ RSE ]\n",__func__ );
|
||||
|
||||
pci_write_config_dword(p_slot->ctrl->pci_dev, PCIX_MEM_BASE_LIMIT_OFFSET, rse_set);
|
||||
}
|
||||
|
|
|
@ -91,7 +91,7 @@ static void release_slot(struct hotplug_slot *hotplug_slot)
|
|||
{
|
||||
struct slot *slot = hotplug_slot->private;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
kfree(slot->hotplug_slot->info);
|
||||
kfree(slot->hotplug_slot);
|
||||
|
@ -195,7 +195,7 @@ static int set_attention_status (struct hotplug_slot *hotplug_slot, u8 status)
|
|||
{
|
||||
struct slot *slot = get_slot(hotplug_slot);
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
hotplug_slot->info->attention_status = status;
|
||||
slot->hpc_ops->set_attention_status(slot, status);
|
||||
|
@ -207,7 +207,7 @@ static int enable_slot (struct hotplug_slot *hotplug_slot)
|
|||
{
|
||||
struct slot *slot = get_slot(hotplug_slot);
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
return shpchp_sysfs_enable_slot(slot);
|
||||
}
|
||||
|
@ -216,7 +216,7 @@ static int disable_slot (struct hotplug_slot *hotplug_slot)
|
|||
{
|
||||
struct slot *slot = get_slot(hotplug_slot);
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
return shpchp_sysfs_disable_slot(slot);
|
||||
}
|
||||
|
@ -226,7 +226,7 @@ static int get_power_status (struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
struct slot *slot = get_slot(hotplug_slot);
|
||||
int retval;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
retval = slot->hpc_ops->get_power_status(slot, value);
|
||||
if (retval < 0)
|
||||
|
@ -240,7 +240,7 @@ static int get_attention_status (struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
struct slot *slot = get_slot(hotplug_slot);
|
||||
int retval;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
retval = slot->hpc_ops->get_attention_status(slot, value);
|
||||
if (retval < 0)
|
||||
|
@ -254,7 +254,7 @@ static int get_latch_status (struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
struct slot *slot = get_slot(hotplug_slot);
|
||||
int retval;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
retval = slot->hpc_ops->get_latch_status(slot, value);
|
||||
if (retval < 0)
|
||||
|
@ -268,7 +268,7 @@ static int get_adapter_status (struct hotplug_slot *hotplug_slot, u8 *value)
|
|||
struct slot *slot = get_slot(hotplug_slot);
|
||||
int retval;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
retval = slot->hpc_ops->get_adapter_status(slot, value);
|
||||
if (retval < 0)
|
||||
|
@ -282,7 +282,7 @@ static int get_address (struct hotplug_slot *hotplug_slot, u32 *value)
|
|||
struct slot *slot = get_slot(hotplug_slot);
|
||||
struct pci_bus *bus = slot->ctrl->pci_dev->subordinate;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
*value = (pci_domain_nr(bus) << 16) | (slot->bus << 8) | slot->device;
|
||||
|
||||
|
@ -294,7 +294,7 @@ static int get_max_bus_speed (struct hotplug_slot *hotplug_slot, enum pci_bus_sp
|
|||
struct slot *slot = get_slot(hotplug_slot);
|
||||
int retval;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
retval = slot->hpc_ops->get_max_bus_speed(slot, value);
|
||||
if (retval < 0)
|
||||
|
@ -308,7 +308,7 @@ static int get_cur_bus_speed (struct hotplug_slot *hotplug_slot, enum pci_bus_sp
|
|||
struct slot *slot = get_slot(hotplug_slot);
|
||||
int retval;
|
||||
|
||||
dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
|
||||
dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
|
||||
|
||||
retval = slot->hpc_ops->get_cur_bus_speed(slot, value);
|
||||
if (retval < 0)
|
||||
|
@ -338,7 +338,7 @@ static int shpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
|
||||
ctrl = kzalloc(sizeof(*ctrl), GFP_KERNEL);
|
||||
if (!ctrl) {
|
||||
err("%s : out of memory\n", __FUNCTION__);
|
||||
err("%s : out of memory\n", __func__);
|
||||
goto err_out_none;
|
||||
}
|
||||
INIT_LIST_HEAD(&ctrl->slot_list);
|
||||
|
@ -402,7 +402,7 @@ static int __init shpcd_init(void)
|
|||
int retval = 0;
|
||||
|
||||
retval = pci_register_driver(&shpc_driver);
|
||||
dbg("%s: pci_register_driver = %d\n", __FUNCTION__, retval);
|
||||
dbg("%s: pci_register_driver = %d\n", __func__, retval);
|
||||
info(DRIVER_DESC " version: " DRIVER_VERSION "\n");
|
||||
return retval;
|
||||
}
|
||||
|
|
|
@ -91,7 +91,7 @@ u8 shpchp_handle_switch_change(u8 hp_slot, struct controller *ctrl)
|
|||
p_slot = shpchp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset);
|
||||
p_slot->hpc_ops->get_adapter_status(p_slot, &(p_slot->presence_save));
|
||||
p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
|
||||
dbg("%s: Card present %x Power status %x\n", __FUNCTION__,
|
||||
dbg("%s: Card present %x Power status %x\n", __func__,
|
||||
p_slot->presence_save, p_slot->pwr_save);
|
||||
|
||||
if (getstatus) {
|
||||
|
@ -191,10 +191,10 @@ static int change_bus_speed(struct controller *ctrl, struct slot *p_slot,
|
|||
{
|
||||
int rc = 0;
|
||||
|
||||
dbg("%s: change to speed %d\n", __FUNCTION__, speed);
|
||||
dbg("%s: change to speed %d\n", __func__, speed);
|
||||
if ((rc = p_slot->hpc_ops->set_bus_speed_mode(p_slot, speed))) {
|
||||
err("%s: Issue of set bus speed mode command failed\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
return WRONG_BUS_FREQUENCY;
|
||||
}
|
||||
return rc;
|
||||
|
@ -213,7 +213,7 @@ static int fix_bus_speed(struct controller *ctrl, struct slot *pslot,
|
|||
if (flag) {
|
||||
if (asp < bsp) {
|
||||
err("%s: speed of bus %x and adapter %x mismatch\n",
|
||||
__FUNCTION__, bsp, asp);
|
||||
__func__, bsp, asp);
|
||||
rc = WRONG_BUS_FREQUENCY;
|
||||
}
|
||||
return rc;
|
||||
|
@ -247,13 +247,13 @@ static int board_added(struct slot *p_slot)
|
|||
hp_slot = p_slot->device - ctrl->slot_device_offset;
|
||||
|
||||
dbg("%s: p_slot->device, slot_offset, hp_slot = %d, %d ,%d\n",
|
||||
__FUNCTION__, p_slot->device,
|
||||
__func__, p_slot->device,
|
||||
ctrl->slot_device_offset, hp_slot);
|
||||
|
||||
/* Power on slot without connecting to bus */
|
||||
rc = p_slot->hpc_ops->power_on_slot(p_slot);
|
||||
if (rc) {
|
||||
err("%s: Failed to power on slot\n", __FUNCTION__);
|
||||
err("%s: Failed to power on slot\n", __func__);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -262,13 +262,13 @@ static int board_added(struct slot *p_slot)
|
|||
return WRONG_BUS_FREQUENCY;
|
||||
|
||||
if ((rc = p_slot->hpc_ops->set_bus_speed_mode(p_slot, PCI_SPEED_33MHz))) {
|
||||
err("%s: Issue of set bus speed mode command failed\n", __FUNCTION__);
|
||||
err("%s: Issue of set bus speed mode command failed\n", __func__);
|
||||
return WRONG_BUS_FREQUENCY;
|
||||
}
|
||||
|
||||
/* turn on board, blink green LED, turn off Amber LED */
|
||||
if ((rc = p_slot->hpc_ops->slot_enable(p_slot))) {
|
||||
err("%s: Issue of Slot Enable command failed\n", __FUNCTION__);
|
||||
err("%s: Issue of Slot Enable command failed\n", __func__);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
@ -276,19 +276,19 @@ static int board_added(struct slot *p_slot)
|
|||
rc = p_slot->hpc_ops->get_adapter_speed(p_slot, &asp);
|
||||
if (rc) {
|
||||
err("%s: Can't get adapter speed or bus mode mismatch\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
return WRONG_BUS_FREQUENCY;
|
||||
}
|
||||
|
||||
rc = p_slot->hpc_ops->get_cur_bus_speed(p_slot, &bsp);
|
||||
if (rc) {
|
||||
err("%s: Can't get bus operation speed\n", __FUNCTION__);
|
||||
err("%s: Can't get bus operation speed\n", __func__);
|
||||
return WRONG_BUS_FREQUENCY;
|
||||
}
|
||||
|
||||
rc = p_slot->hpc_ops->get_max_bus_speed(p_slot, &msp);
|
||||
if (rc) {
|
||||
err("%s: Can't get max bus operation speed\n", __FUNCTION__);
|
||||
err("%s: Can't get max bus operation speed\n", __func__);
|
||||
msp = bsp;
|
||||
}
|
||||
|
||||
|
@ -297,7 +297,7 @@ static int board_added(struct slot *p_slot)
|
|||
slots_not_empty = 1;
|
||||
|
||||
dbg("%s: slots_not_empty %d, adapter_speed %d, bus_speed %d, "
|
||||
"max_bus_speed %d\n", __FUNCTION__, slots_not_empty, asp,
|
||||
"max_bus_speed %d\n", __func__, slots_not_empty, asp,
|
||||
bsp, msp);
|
||||
|
||||
rc = fix_bus_speed(ctrl, p_slot, slots_not_empty, asp, bsp, msp);
|
||||
|
@ -306,18 +306,18 @@ static int board_added(struct slot *p_slot)
|
|||
|
||||
/* turn on board, blink green LED, turn off Amber LED */
|
||||
if ((rc = p_slot->hpc_ops->slot_enable(p_slot))) {
|
||||
err("%s: Issue of Slot Enable command failed\n", __FUNCTION__);
|
||||
err("%s: Issue of Slot Enable command failed\n", __func__);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Wait for ~1 second */
|
||||
msleep(1000);
|
||||
|
||||
dbg("%s: slot status = %x\n", __FUNCTION__, p_slot->status);
|
||||
dbg("%s: slot status = %x\n", __func__, p_slot->status);
|
||||
/* Check for a power fault */
|
||||
if (p_slot->status == 0xFF) {
|
||||
/* power fault occurred, but it was benign */
|
||||
dbg("%s: power fault\n", __FUNCTION__);
|
||||
dbg("%s: power fault\n", __func__);
|
||||
rc = POWER_FAILURE;
|
||||
p_slot->status = 0;
|
||||
goto err_exit;
|
||||
|
@ -341,7 +341,7 @@ err_exit:
|
|||
/* turn off slot, turn on Amber LED, turn off Green LED */
|
||||
rc = p_slot->hpc_ops->slot_disable(p_slot);
|
||||
if (rc) {
|
||||
err("%s: Issue of Slot Disable command failed\n", __FUNCTION__);
|
||||
err("%s: Issue of Slot Disable command failed\n", __func__);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -365,7 +365,7 @@ static int remove_board(struct slot *p_slot)
|
|||
hp_slot = p_slot->device - ctrl->slot_device_offset;
|
||||
p_slot = shpchp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset);
|
||||
|
||||
dbg("In %s, hp_slot = %d\n", __FUNCTION__, hp_slot);
|
||||
dbg("In %s, hp_slot = %d\n", __func__, hp_slot);
|
||||
|
||||
/* Change status to shutdown */
|
||||
if (p_slot->is_a_board)
|
||||
|
@ -374,13 +374,13 @@ static int remove_board(struct slot *p_slot)
|
|||
/* turn off slot, turn on Amber LED, turn off Green LED */
|
||||
rc = p_slot->hpc_ops->slot_disable(p_slot);
|
||||
if (rc) {
|
||||
err("%s: Issue of Slot Disable command failed\n", __FUNCTION__);
|
||||
err("%s: Issue of Slot Disable command failed\n", __func__);
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = p_slot->hpc_ops->set_attention_status(p_slot, 0);
|
||||
if (rc) {
|
||||
err("%s: Issue of Set Attention command failed\n", __FUNCTION__);
|
||||
err("%s: Issue of Set Attention command failed\n", __func__);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -439,7 +439,7 @@ void shpchp_queue_pushbutton_work(struct work_struct *work)
|
|||
|
||||
info = kmalloc(sizeof(*info), GFP_KERNEL);
|
||||
if (!info) {
|
||||
err("%s: Cannot allocate memory\n", __FUNCTION__);
|
||||
err("%s: Cannot allocate memory\n", __func__);
|
||||
return;
|
||||
}
|
||||
info->p_slot = p_slot;
|
||||
|
@ -513,7 +513,7 @@ static void handle_button_press_event(struct slot *p_slot)
|
|||
* expires to cancel hot-add or hot-remove
|
||||
*/
|
||||
info("Button cancel on Slot(%s)\n", p_slot->name);
|
||||
dbg("%s: button cancel\n", __FUNCTION__);
|
||||
dbg("%s: button cancel\n", __func__);
|
||||
cancel_delayed_work(&p_slot->work);
|
||||
if (p_slot->state == BLINKINGOFF_STATE)
|
||||
p_slot->hpc_ops->green_led_on(p_slot);
|
||||
|
@ -551,7 +551,7 @@ static void interrupt_event_handler(struct work_struct *work)
|
|||
handle_button_press_event(p_slot);
|
||||
break;
|
||||
case INT_POWER_FAULT:
|
||||
dbg("%s: power fault\n", __FUNCTION__);
|
||||
dbg("%s: power fault\n", __func__);
|
||||
p_slot->hpc_ops->set_attention_status(p_slot, 1);
|
||||
p_slot->hpc_ops->green_led_off(p_slot);
|
||||
break;
|
||||
|
@ -593,7 +593,7 @@ static int shpchp_enable_slot (struct slot *p_slot)
|
|||
/* We have to save the presence info for these slots */
|
||||
p_slot->hpc_ops->get_adapter_status(p_slot, &(p_slot->presence_save));
|
||||
p_slot->hpc_ops->get_power_status(p_slot, &(p_slot->pwr_save));
|
||||
dbg("%s: p_slot->pwr_save %x\n", __FUNCTION__, p_slot->pwr_save);
|
||||
dbg("%s: p_slot->pwr_save %x\n", __func__, p_slot->pwr_save);
|
||||
p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
|
||||
|
||||
if(((p_slot->ctrl->pci_dev->vendor == PCI_VENDOR_ID_AMD) ||
|
||||
|
|
|
@ -321,14 +321,14 @@ static int shpc_write_cmd(struct slot *slot, u8 t_slot, u8 cmd)
|
|||
if (!shpc_poll_ctrl_busy(ctrl)) {
|
||||
/* After 1 sec and and the controller is still busy */
|
||||
err("%s : Controller is still busy after 1 sec.\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
retval = -EBUSY;
|
||||
goto out;
|
||||
}
|
||||
|
||||
++t_slot;
|
||||
temp_word = (t_slot << 8) | (cmd & 0xFF);
|
||||
dbg("%s: t_slot %x cmd %x\n", __FUNCTION__, t_slot, cmd);
|
||||
dbg("%s: t_slot %x cmd %x\n", __func__, t_slot, cmd);
|
||||
|
||||
/* To make sure the Controller Busy bit is 0 before we send out the
|
||||
* command.
|
||||
|
@ -345,7 +345,7 @@ static int shpc_write_cmd(struct slot *slot, u8 t_slot, u8 cmd)
|
|||
cmd_status = hpc_check_cmd_status(slot->ctrl);
|
||||
if (cmd_status) {
|
||||
err("%s: Failed to issued command 0x%x (error code = %d)\n",
|
||||
__FUNCTION__, cmd, cmd_status);
|
||||
__func__, cmd, cmd_status);
|
||||
retval = -EIO;
|
||||
}
|
||||
out:
|
||||
|
@ -364,15 +364,15 @@ static int hpc_check_cmd_status(struct controller *ctrl)
|
|||
break;
|
||||
case 1:
|
||||
retval = SWITCH_OPEN;
|
||||
err("%s: Switch opened!\n", __FUNCTION__);
|
||||
err("%s: Switch opened!\n", __func__);
|
||||
break;
|
||||
case 2:
|
||||
retval = INVALID_CMD;
|
||||
err("%s: Invalid HPC command!\n", __FUNCTION__);
|
||||
err("%s: Invalid HPC command!\n", __func__);
|
||||
break;
|
||||
case 4:
|
||||
retval = INVALID_SPEED_MODE;
|
||||
err("%s: Invalid bus speed/mode!\n", __FUNCTION__);
|
||||
err("%s: Invalid bus speed/mode!\n", __func__);
|
||||
break;
|
||||
default:
|
||||
retval = cmd_status;
|
||||
|
@ -484,7 +484,7 @@ static int hpc_get_adapter_speed(struct slot *slot, enum pci_bus_speed *value)
|
|||
}
|
||||
|
||||
dbg("%s: slot_reg = %x, pcix_cap = %x, m66_cap = %x\n",
|
||||
__FUNCTION__, slot_reg, pcix_cap, m66_cap);
|
||||
__func__, slot_reg, pcix_cap, m66_cap);
|
||||
|
||||
switch (pcix_cap) {
|
||||
case 0x0:
|
||||
|
@ -629,7 +629,7 @@ static int hpc_power_on_slot(struct slot * slot)
|
|||
|
||||
retval = shpc_write_cmd(slot, slot->hp_slot, SET_SLOT_PWR);
|
||||
if (retval)
|
||||
err("%s: Write command failed!\n", __FUNCTION__);
|
||||
err("%s: Write command failed!\n", __func__);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
@ -642,7 +642,7 @@ static int hpc_slot_enable(struct slot * slot)
|
|||
retval = shpc_write_cmd(slot, slot->hp_slot,
|
||||
SET_SLOT_ENABLE | SET_PWR_BLINK | SET_ATTN_OFF);
|
||||
if (retval)
|
||||
err("%s: Write command failed!\n", __FUNCTION__);
|
||||
err("%s: Write command failed!\n", __func__);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
@ -655,7 +655,7 @@ static int hpc_slot_disable(struct slot * slot)
|
|||
retval = shpc_write_cmd(slot, slot->hp_slot,
|
||||
SET_SLOT_DISABLE | SET_PWR_OFF | SET_ATTN_ON);
|
||||
if (retval)
|
||||
err("%s: Write command failed!\n", __FUNCTION__);
|
||||
err("%s: Write command failed!\n", __func__);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
@ -719,7 +719,7 @@ static int hpc_set_bus_speed_mode(struct slot * slot, enum pci_bus_speed value)
|
|||
|
||||
retval = shpc_write_cmd(slot, 0, cmd);
|
||||
if (retval)
|
||||
err("%s: Write command failed!\n", __FUNCTION__);
|
||||
err("%s: Write command failed!\n", __func__);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
@ -735,7 +735,7 @@ static irqreturn_t shpc_isr(int irq, void *dev_id)
|
|||
if (!intr_loc)
|
||||
return IRQ_NONE;
|
||||
|
||||
dbg("%s: intr_loc = %x\n",__FUNCTION__, intr_loc);
|
||||
dbg("%s: intr_loc = %x\n",__func__, intr_loc);
|
||||
|
||||
if(!shpchp_poll_mode) {
|
||||
/*
|
||||
|
@ -748,7 +748,7 @@ static irqreturn_t shpc_isr(int irq, void *dev_id)
|
|||
shpc_writel(ctrl, SERR_INTR_ENABLE, serr_int);
|
||||
|
||||
intr_loc2 = shpc_readl(ctrl, INTR_LOC);
|
||||
dbg("%s: intr_loc2 = %x\n",__FUNCTION__, intr_loc2);
|
||||
dbg("%s: intr_loc2 = %x\n",__func__, intr_loc2);
|
||||
}
|
||||
|
||||
if (intr_loc & CMD_INTR_PENDING) {
|
||||
|
@ -774,7 +774,7 @@ static irqreturn_t shpc_isr(int irq, void *dev_id)
|
|||
|
||||
slot_reg = shpc_readl(ctrl, SLOT_REG(hp_slot));
|
||||
dbg("%s: Slot %x with intr, slot register = %x\n",
|
||||
__FUNCTION__, hp_slot, slot_reg);
|
||||
__func__, hp_slot, slot_reg);
|
||||
|
||||
if (slot_reg & MRL_CHANGE_DETECTED)
|
||||
shpchp_handle_switch_change(hp_slot, ctrl);
|
||||
|
@ -958,33 +958,33 @@ int shpc_init(struct controller *ctrl, struct pci_dev *pdev)
|
|||
} else {
|
||||
ctrl->cap_offset = pci_find_capability(pdev, PCI_CAP_ID_SHPC);
|
||||
if (!ctrl->cap_offset) {
|
||||
err("%s : cap_offset == 0\n", __FUNCTION__);
|
||||
err("%s : cap_offset == 0\n", __func__);
|
||||
goto abort;
|
||||
}
|
||||
dbg("%s: cap_offset = %x\n", __FUNCTION__, ctrl->cap_offset);
|
||||
dbg("%s: cap_offset = %x\n", __func__, ctrl->cap_offset);
|
||||
|
||||
rc = shpc_indirect_read(ctrl, 0, &shpc_base_offset);
|
||||
if (rc) {
|
||||
err("%s: cannot read base_offset\n", __FUNCTION__);
|
||||
err("%s: cannot read base_offset\n", __func__);
|
||||
goto abort;
|
||||
}
|
||||
|
||||
rc = shpc_indirect_read(ctrl, 3, &tempdword);
|
||||
if (rc) {
|
||||
err("%s: cannot read slot config\n", __FUNCTION__);
|
||||
err("%s: cannot read slot config\n", __func__);
|
||||
goto abort;
|
||||
}
|
||||
num_slots = tempdword & SLOT_NUM;
|
||||
dbg("%s: num_slots (indirect) %x\n", __FUNCTION__, num_slots);
|
||||
dbg("%s: num_slots (indirect) %x\n", __func__, num_slots);
|
||||
|
||||
for (i = 0; i < 9 + num_slots; i++) {
|
||||
rc = shpc_indirect_read(ctrl, i, &tempdword);
|
||||
if (rc) {
|
||||
err("%s: cannot read creg (index = %d)\n",
|
||||
__FUNCTION__, i);
|
||||
__func__, i);
|
||||
goto abort;
|
||||
}
|
||||
dbg("%s: offset %d: value %x\n", __FUNCTION__,i,
|
||||
dbg("%s: offset %d: value %x\n", __func__,i,
|
||||
tempdword);
|
||||
}
|
||||
|
||||
|
@ -998,25 +998,25 @@ int shpc_init(struct controller *ctrl, struct pci_dev *pdev)
|
|||
|
||||
rc = pci_enable_device(pdev);
|
||||
if (rc) {
|
||||
err("%s: pci_enable_device failed\n", __FUNCTION__);
|
||||
err("%s: pci_enable_device failed\n", __func__);
|
||||
goto abort;
|
||||
}
|
||||
|
||||
if (!request_mem_region(ctrl->mmio_base, ctrl->mmio_size, MY_NAME)) {
|
||||
err("%s: cannot reserve MMIO region\n", __FUNCTION__);
|
||||
err("%s: cannot reserve MMIO region\n", __func__);
|
||||
rc = -1;
|
||||
goto abort;
|
||||
}
|
||||
|
||||
ctrl->creg = ioremap(ctrl->mmio_base, ctrl->mmio_size);
|
||||
if (!ctrl->creg) {
|
||||
err("%s: cannot remap MMIO region %lx @ %lx\n", __FUNCTION__,
|
||||
err("%s: cannot remap MMIO region %lx @ %lx\n", __func__,
|
||||
ctrl->mmio_size, ctrl->mmio_base);
|
||||
release_mem_region(ctrl->mmio_base, ctrl->mmio_size);
|
||||
rc = -1;
|
||||
goto abort;
|
||||
}
|
||||
dbg("%s: ctrl->creg %p\n", __FUNCTION__, ctrl->creg);
|
||||
dbg("%s: ctrl->creg %p\n", __func__, ctrl->creg);
|
||||
|
||||
mutex_init(&ctrl->crit_sect);
|
||||
mutex_init(&ctrl->cmd_lock);
|
||||
|
@ -1035,20 +1035,20 @@ int shpc_init(struct controller *ctrl, struct pci_dev *pdev)
|
|||
|
||||
/* Mask Global Interrupt Mask & Command Complete Interrupt Mask */
|
||||
tempdword = shpc_readl(ctrl, SERR_INTR_ENABLE);
|
||||
dbg("%s: SERR_INTR_ENABLE = %x\n", __FUNCTION__, tempdword);
|
||||
dbg("%s: SERR_INTR_ENABLE = %x\n", __func__, tempdword);
|
||||
tempdword |= (GLOBAL_INTR_MASK | GLOBAL_SERR_MASK |
|
||||
COMMAND_INTR_MASK | ARBITER_SERR_MASK);
|
||||
tempdword &= ~SERR_INTR_RSVDZ_MASK;
|
||||
shpc_writel(ctrl, SERR_INTR_ENABLE, tempdword);
|
||||
tempdword = shpc_readl(ctrl, SERR_INTR_ENABLE);
|
||||
dbg("%s: SERR_INTR_ENABLE = %x\n", __FUNCTION__, tempdword);
|
||||
dbg("%s: SERR_INTR_ENABLE = %x\n", __func__, tempdword);
|
||||
|
||||
/* Mask the MRL sensor SERR Mask of individual slot in
|
||||
* Slot SERR-INT Mask & clear all the existing event if any
|
||||
*/
|
||||
for (hp_slot = 0; hp_slot < ctrl->num_slots; hp_slot++) {
|
||||
slot_reg = shpc_readl(ctrl, SLOT_REG(hp_slot));
|
||||
dbg("%s: Default Logical Slot Register %d value %x\n", __FUNCTION__,
|
||||
dbg("%s: Default Logical Slot Register %d value %x\n", __func__,
|
||||
hp_slot, slot_reg);
|
||||
slot_reg |= (PRSNT_CHANGE_INTR_MASK | ISO_PFAULT_INTR_MASK |
|
||||
BUTTON_PRESS_INTR_MASK | MRL_CHANGE_INTR_MASK |
|
||||
|
@ -1073,7 +1073,7 @@ int shpc_init(struct controller *ctrl, struct pci_dev *pdev)
|
|||
rc = request_irq(ctrl->pci_dev->irq, shpc_isr, IRQF_SHARED,
|
||||
MY_NAME, (void *)ctrl);
|
||||
dbg("%s: request_irq %d for hpc%d (returns %d)\n",
|
||||
__FUNCTION__, ctrl->pci_dev->irq,
|
||||
__func__, ctrl->pci_dev->irq,
|
||||
atomic_read(&shpchp_num_controllers), rc);
|
||||
if (rc) {
|
||||
err("Can't get irq %d for the hotplug controller\n",
|
||||
|
@ -1081,7 +1081,7 @@ int shpc_init(struct controller *ctrl, struct pci_dev *pdev)
|
|||
goto abort_iounmap;
|
||||
}
|
||||
}
|
||||
dbg("%s: HPC at b:d:f:irq=0x%x:%x:%x:%x\n", __FUNCTION__,
|
||||
dbg("%s: HPC at b:d:f:irq=0x%x:%x:%x:%x\n", __func__,
|
||||
pdev->bus->number, PCI_SLOT(pdev->devfn),
|
||||
PCI_FUNC(pdev->devfn), pdev->irq);
|
||||
get_hp_hw_control_from_firmware(pdev);
|
||||
|
@ -1103,7 +1103,7 @@ int shpc_init(struct controller *ctrl, struct pci_dev *pdev)
|
|||
*/
|
||||
for (hp_slot = 0; hp_slot < ctrl->num_slots; hp_slot++) {
|
||||
slot_reg = shpc_readl(ctrl, SLOT_REG(hp_slot));
|
||||
dbg("%s: Default Logical Slot Register %d value %x\n", __FUNCTION__,
|
||||
dbg("%s: Default Logical Slot Register %d value %x\n", __func__,
|
||||
hp_slot, slot_reg);
|
||||
slot_reg &= ~(PRSNT_CHANGE_INTR_MASK | ISO_PFAULT_INTR_MASK |
|
||||
BUTTON_PRESS_INTR_MASK | MRL_CHANGE_INTR_MASK |
|
||||
|
@ -1117,7 +1117,7 @@ int shpc_init(struct controller *ctrl, struct pci_dev *pdev)
|
|||
SERR_INTR_RSVDZ_MASK);
|
||||
shpc_writel(ctrl, SERR_INTR_ENABLE, tempdword);
|
||||
tempdword = shpc_readl(ctrl, SERR_INTR_ENABLE);
|
||||
dbg("%s: SERR_INTR_ENABLE = %x\n", __FUNCTION__, tempdword);
|
||||
dbg("%s: SERR_INTR_ENABLE = %x\n", __func__, tempdword);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -51,7 +51,7 @@ static void program_fw_provided_values(struct pci_dev *dev)
|
|||
!hpp.t0 || (hpp.t0->revision > 1)) {
|
||||
printk(KERN_WARNING
|
||||
"%s: Could not get hotplug parameters. Use defaults\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
hpp.t0 = &hpp.type0_data;
|
||||
hpp.t0->revision = 0;
|
||||
hpp.t0->cache_line_size = 8;
|
||||
|
@ -169,7 +169,7 @@ int shpchp_unconfigure_device(struct slot *p_slot)
|
|||
u8 bctl = 0;
|
||||
struct pci_bus *parent = p_slot->ctrl->pci_dev->subordinate;
|
||||
|
||||
dbg("%s: bus/dev = %x/%x\n", __FUNCTION__, p_slot->bus, p_slot->device);
|
||||
dbg("%s: bus/dev = %x/%x\n", __func__, p_slot->bus, p_slot->device);
|
||||
|
||||
for (j=0; j<8 ; j++) {
|
||||
struct pci_dev* temp = pci_get_slot(parent,
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
|
||||
#include <linux/init.h>
|
||||
#include <linux/bitmap.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
@ -31,6 +32,7 @@
|
|||
#include <linux/dmar.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/mempool.h>
|
||||
#include <linux/timer.h>
|
||||
#include "iova.h"
|
||||
#include "intel-iommu.h"
|
||||
#include <asm/proto.h> /* force_iommu in this header in x86-64*/
|
||||
|
@ -51,11 +53,37 @@
|
|||
|
||||
#define DOMAIN_MAX_ADDR(gaw) ((((u64)1) << gaw) - 1)
|
||||
|
||||
|
||||
static void flush_unmaps_timeout(unsigned long data);
|
||||
|
||||
DEFINE_TIMER(unmap_timer, flush_unmaps_timeout, 0, 0);
|
||||
|
||||
static struct intel_iommu *g_iommus;
|
||||
|
||||
#define HIGH_WATER_MARK 250
|
||||
struct deferred_flush_tables {
|
||||
int next;
|
||||
struct iova *iova[HIGH_WATER_MARK];
|
||||
struct dmar_domain *domain[HIGH_WATER_MARK];
|
||||
};
|
||||
|
||||
static struct deferred_flush_tables *deferred_flush;
|
||||
|
||||
/* bitmap for indexing intel_iommus */
|
||||
static int g_num_of_iommus;
|
||||
|
||||
static DEFINE_SPINLOCK(async_umap_flush_lock);
|
||||
static LIST_HEAD(unmaps_to_do);
|
||||
|
||||
static int timer_on;
|
||||
static long list_size;
|
||||
|
||||
static void domain_remove_dev_info(struct dmar_domain *domain);
|
||||
|
||||
static int dmar_disabled;
|
||||
static int __initdata dmar_map_gfx = 1;
|
||||
static int dmar_forcedac;
|
||||
static int intel_iommu_strict;
|
||||
|
||||
#define DUMMY_DEVICE_DOMAIN_INFO ((struct device_domain_info *)(-1))
|
||||
static DEFINE_SPINLOCK(device_domain_lock);
|
||||
|
@ -74,9 +102,13 @@ static int __init intel_iommu_setup(char *str)
|
|||
printk(KERN_INFO
|
||||
"Intel-IOMMU: disable GFX device mapping\n");
|
||||
} else if (!strncmp(str, "forcedac", 8)) {
|
||||
printk (KERN_INFO
|
||||
printk(KERN_INFO
|
||||
"Intel-IOMMU: Forcing DAC for PCI devices\n");
|
||||
dmar_forcedac = 1;
|
||||
} else if (!strncmp(str, "strict", 6)) {
|
||||
printk(KERN_INFO
|
||||
"Intel-IOMMU: disable batched IOTLB flush\n");
|
||||
intel_iommu_strict = 1;
|
||||
}
|
||||
|
||||
str += strcspn(str, ",");
|
||||
|
@ -966,17 +998,13 @@ static int iommu_init_domains(struct intel_iommu *iommu)
|
|||
set_bit(0, iommu->domain_ids);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct intel_iommu *alloc_iommu(struct dmar_drhd_unit *drhd)
|
||||
static struct intel_iommu *alloc_iommu(struct intel_iommu *iommu,
|
||||
struct dmar_drhd_unit *drhd)
|
||||
{
|
||||
struct intel_iommu *iommu;
|
||||
int ret;
|
||||
int map_size;
|
||||
u32 ver;
|
||||
|
||||
iommu = kzalloc(sizeof(*iommu), GFP_KERNEL);
|
||||
if (!iommu)
|
||||
return NULL;
|
||||
iommu->reg = ioremap(drhd->reg_base_addr, PAGE_SIZE_4K);
|
||||
if (!iommu->reg) {
|
||||
printk(KERN_ERR "IOMMU: can't map the region\n");
|
||||
|
@ -1404,7 +1432,7 @@ static int dmar_pci_device_match(struct pci_dev *devices[], int cnt,
|
|||
int index;
|
||||
|
||||
while (dev) {
|
||||
for (index = 0; index < cnt; index ++)
|
||||
for (index = 0; index < cnt; index++)
|
||||
if (dev == devices[index])
|
||||
return 1;
|
||||
|
||||
|
@ -1669,7 +1697,7 @@ int __init init_dmars(void)
|
|||
struct dmar_rmrr_unit *rmrr;
|
||||
struct pci_dev *pdev;
|
||||
struct intel_iommu *iommu;
|
||||
int ret, unit = 0;
|
||||
int i, ret, unit = 0;
|
||||
|
||||
/*
|
||||
* for each drhd
|
||||
|
@ -1680,7 +1708,34 @@ int __init init_dmars(void)
|
|||
for_each_drhd_unit(drhd) {
|
||||
if (drhd->ignored)
|
||||
continue;
|
||||
iommu = alloc_iommu(drhd);
|
||||
g_num_of_iommus++;
|
||||
/*
|
||||
* lock not needed as this is only incremented in the single
|
||||
* threaded kernel __init code path all other access are read
|
||||
* only
|
||||
*/
|
||||
}
|
||||
|
||||
g_iommus = kzalloc(g_num_of_iommus * sizeof(*iommu), GFP_KERNEL);
|
||||
if (!g_iommus) {
|
||||
ret = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
|
||||
deferred_flush = kzalloc(g_num_of_iommus *
|
||||
sizeof(struct deferred_flush_tables), GFP_KERNEL);
|
||||
if (!deferred_flush) {
|
||||
kfree(g_iommus);
|
||||
ret = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
|
||||
i = 0;
|
||||
for_each_drhd_unit(drhd) {
|
||||
if (drhd->ignored)
|
||||
continue;
|
||||
iommu = alloc_iommu(&g_iommus[i], drhd);
|
||||
i++;
|
||||
if (!iommu) {
|
||||
ret = -ENOMEM;
|
||||
goto error;
|
||||
|
@ -1713,7 +1768,6 @@ int __init init_dmars(void)
|
|||
* endfor
|
||||
*/
|
||||
for_each_rmrr_units(rmrr) {
|
||||
int i;
|
||||
for (i = 0; i < rmrr->devices_cnt; i++) {
|
||||
pdev = rmrr->devices[i];
|
||||
/* some BIOS lists non-exist devices in DMAR table */
|
||||
|
@ -1769,6 +1823,7 @@ error:
|
|||
iommu = drhd->iommu;
|
||||
free_iommu(iommu);
|
||||
}
|
||||
kfree(g_iommus);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1917,6 +1972,59 @@ error:
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void flush_unmaps(void)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
timer_on = 0;
|
||||
|
||||
/* just flush them all */
|
||||
for (i = 0; i < g_num_of_iommus; i++) {
|
||||
if (deferred_flush[i].next) {
|
||||
iommu_flush_iotlb_global(&g_iommus[i], 0);
|
||||
for (j = 0; j < deferred_flush[i].next; j++) {
|
||||
__free_iova(&deferred_flush[i].domain[j]->iovad,
|
||||
deferred_flush[i].iova[j]);
|
||||
}
|
||||
deferred_flush[i].next = 0;
|
||||
}
|
||||
}
|
||||
|
||||
list_size = 0;
|
||||
}
|
||||
|
||||
static void flush_unmaps_timeout(unsigned long data)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&async_umap_flush_lock, flags);
|
||||
flush_unmaps();
|
||||
spin_unlock_irqrestore(&async_umap_flush_lock, flags);
|
||||
}
|
||||
|
||||
static void add_unmap(struct dmar_domain *dom, struct iova *iova)
|
||||
{
|
||||
unsigned long flags;
|
||||
int next, iommu_id;
|
||||
|
||||
spin_lock_irqsave(&async_umap_flush_lock, flags);
|
||||
if (list_size == HIGH_WATER_MARK)
|
||||
flush_unmaps();
|
||||
|
||||
iommu_id = dom->iommu - g_iommus;
|
||||
next = deferred_flush[iommu_id].next;
|
||||
deferred_flush[iommu_id].domain[next] = dom;
|
||||
deferred_flush[iommu_id].iova[next] = iova;
|
||||
deferred_flush[iommu_id].next++;
|
||||
|
||||
if (!timer_on) {
|
||||
mod_timer(&unmap_timer, jiffies + msecs_to_jiffies(10));
|
||||
timer_on = 1;
|
||||
}
|
||||
list_size++;
|
||||
spin_unlock_irqrestore(&async_umap_flush_lock, flags);
|
||||
}
|
||||
|
||||
static void intel_unmap_single(struct device *dev, dma_addr_t dev_addr,
|
||||
size_t size, int dir)
|
||||
{
|
||||
|
@ -1944,13 +2052,19 @@ static void intel_unmap_single(struct device *dev, dma_addr_t dev_addr,
|
|||
dma_pte_clear_range(domain, start_addr, start_addr + size);
|
||||
/* free page tables */
|
||||
dma_pte_free_pagetable(domain, start_addr, start_addr + size);
|
||||
|
||||
if (iommu_flush_iotlb_psi(domain->iommu, domain->id, start_addr,
|
||||
size >> PAGE_SHIFT_4K, 0))
|
||||
iommu_flush_write_buffer(domain->iommu);
|
||||
|
||||
/* free iova */
|
||||
__free_iova(&domain->iovad, iova);
|
||||
if (intel_iommu_strict) {
|
||||
if (iommu_flush_iotlb_psi(domain->iommu,
|
||||
domain->id, start_addr, size >> PAGE_SHIFT_4K, 0))
|
||||
iommu_flush_write_buffer(domain->iommu);
|
||||
/* free iova */
|
||||
__free_iova(&domain->iovad, iova);
|
||||
} else {
|
||||
add_unmap(domain, iova);
|
||||
/*
|
||||
* queue up the release of the unmap to save the 1/6th of the
|
||||
* cpu used up by the iotlb flush operation...
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
static void * intel_alloc_coherent(struct device *hwdev, size_t size,
|
||||
|
@ -2289,6 +2403,7 @@ int __init intel_iommu_init(void)
|
|||
printk(KERN_INFO
|
||||
"PCI-DMA: Intel(R) Virtualization Technology for Directed I/O\n");
|
||||
|
||||
init_timer(&unmap_timer);
|
||||
force_iommu = 1;
|
||||
dma_ops = &intel_dma_ops;
|
||||
return 0;
|
||||
|
|
|
@ -73,10 +73,11 @@ iova_get_pad_size(int size, unsigned int limit_pfn)
|
|||
return pad_size;
|
||||
}
|
||||
|
||||
static int __alloc_iova_range(struct iova_domain *iovad, unsigned long size,
|
||||
unsigned long limit_pfn, struct iova *new, bool size_aligned)
|
||||
static int __alloc_and_insert_iova_range(struct iova_domain *iovad,
|
||||
unsigned long size, unsigned long limit_pfn,
|
||||
struct iova *new, bool size_aligned)
|
||||
{
|
||||
struct rb_node *curr = NULL;
|
||||
struct rb_node *prev, *curr = NULL;
|
||||
unsigned long flags;
|
||||
unsigned long saved_pfn;
|
||||
unsigned int pad_size = 0;
|
||||
|
@ -85,8 +86,10 @@ static int __alloc_iova_range(struct iova_domain *iovad, unsigned long size,
|
|||
spin_lock_irqsave(&iovad->iova_rbtree_lock, flags);
|
||||
saved_pfn = limit_pfn;
|
||||
curr = __get_cached_rbnode(iovad, &limit_pfn);
|
||||
prev = curr;
|
||||
while (curr) {
|
||||
struct iova *curr_iova = container_of(curr, struct iova, node);
|
||||
|
||||
if (limit_pfn < curr_iova->pfn_lo)
|
||||
goto move_left;
|
||||
else if (limit_pfn < curr_iova->pfn_hi)
|
||||
|
@ -100,6 +103,7 @@ static int __alloc_iova_range(struct iova_domain *iovad, unsigned long size,
|
|||
adjust_limit_pfn:
|
||||
limit_pfn = curr_iova->pfn_lo - 1;
|
||||
move_left:
|
||||
prev = curr;
|
||||
curr = rb_prev(curr);
|
||||
}
|
||||
|
||||
|
@ -116,7 +120,33 @@ move_left:
|
|||
new->pfn_lo = limit_pfn - (size + pad_size) + 1;
|
||||
new->pfn_hi = new->pfn_lo + size - 1;
|
||||
|
||||
/* Insert the new_iova into domain rbtree by holding writer lock */
|
||||
/* Add new node and rebalance tree. */
|
||||
{
|
||||
struct rb_node **entry = &((prev)), *parent = NULL;
|
||||
/* Figure out where to put new node */
|
||||
while (*entry) {
|
||||
struct iova *this = container_of(*entry,
|
||||
struct iova, node);
|
||||
parent = *entry;
|
||||
|
||||
if (new->pfn_lo < this->pfn_lo)
|
||||
entry = &((*entry)->rb_left);
|
||||
else if (new->pfn_lo > this->pfn_lo)
|
||||
entry = &((*entry)->rb_right);
|
||||
else
|
||||
BUG(); /* this should not happen */
|
||||
}
|
||||
|
||||
/* Add new node and rebalance tree. */
|
||||
rb_link_node(&new->node, parent, entry);
|
||||
rb_insert_color(&new->node, &iovad->rbroot);
|
||||
}
|
||||
__cached_rbnode_insert_update(iovad, saved_pfn, new);
|
||||
|
||||
spin_unlock_irqrestore(&iovad->iova_rbtree_lock, flags);
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -172,23 +202,15 @@ alloc_iova(struct iova_domain *iovad, unsigned long size,
|
|||
size = __roundup_pow_of_two(size);
|
||||
|
||||
spin_lock_irqsave(&iovad->iova_alloc_lock, flags);
|
||||
ret = __alloc_iova_range(iovad, size, limit_pfn, new_iova,
|
||||
size_aligned);
|
||||
ret = __alloc_and_insert_iova_range(iovad, size, limit_pfn,
|
||||
new_iova, size_aligned);
|
||||
|
||||
spin_unlock_irqrestore(&iovad->iova_alloc_lock, flags);
|
||||
if (ret) {
|
||||
spin_unlock_irqrestore(&iovad->iova_alloc_lock, flags);
|
||||
free_iova_mem(new_iova);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Insert the new_iova into domain rbtree by holding writer lock */
|
||||
spin_lock(&iovad->iova_rbtree_lock);
|
||||
iova_insert_rbtree(&iovad->rbroot, new_iova);
|
||||
__cached_rbnode_insert_update(iovad, limit_pfn, new_iova);
|
||||
spin_unlock(&iovad->iova_rbtree_lock);
|
||||
|
||||
spin_unlock_irqrestore(&iovad->iova_alloc_lock, flags);
|
||||
|
||||
return new_iova;
|
||||
}
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <linux/topology.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/capability.h>
|
||||
#include <linux/pci-aspm.h>
|
||||
#include "pci.h"
|
||||
|
||||
static int sysfs_initialized; /* = 0 */
|
||||
|
@ -358,6 +359,58 @@ pci_write_config(struct kobject *kobj, struct bin_attribute *bin_attr,
|
|||
return count;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
pci_read_vpd(struct kobject *kobj, struct bin_attribute *bin_attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
struct pci_dev *dev =
|
||||
to_pci_dev(container_of(kobj, struct device, kobj));
|
||||
int end;
|
||||
int ret;
|
||||
|
||||
if (off > bin_attr->size)
|
||||
count = 0;
|
||||
else if (count > bin_attr->size - off)
|
||||
count = bin_attr->size - off;
|
||||
end = off + count;
|
||||
|
||||
while (off < end) {
|
||||
ret = dev->vpd->ops->read(dev, off, end - off, buf);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
buf += ret;
|
||||
off += ret;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
pci_write_vpd(struct kobject *kobj, struct bin_attribute *bin_attr,
|
||||
char *buf, loff_t off, size_t count)
|
||||
{
|
||||
struct pci_dev *dev =
|
||||
to_pci_dev(container_of(kobj, struct device, kobj));
|
||||
int end;
|
||||
int ret;
|
||||
|
||||
if (off > bin_attr->size)
|
||||
count = 0;
|
||||
else if (count > bin_attr->size - off)
|
||||
count = bin_attr->size - off;
|
||||
end = off + count;
|
||||
|
||||
while (off < end) {
|
||||
ret = dev->vpd->ops->write(dev, off, end - off, buf);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
buf += ret;
|
||||
off += ret;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
#ifdef HAVE_PCI_LEGACY
|
||||
/**
|
||||
* pci_read_legacy_io - read byte(s) from legacy I/O port space
|
||||
|
@ -626,7 +679,7 @@ int __attribute__ ((weak)) pcibios_add_platform_entries(struct pci_dev *dev)
|
|||
|
||||
int __must_check pci_create_sysfs_dev_files (struct pci_dev *pdev)
|
||||
{
|
||||
struct bin_attribute *rom_attr = NULL;
|
||||
struct bin_attribute *attr = NULL;
|
||||
int retval;
|
||||
|
||||
if (!sysfs_initialized)
|
||||
|
@ -639,22 +692,41 @@ int __must_check pci_create_sysfs_dev_files (struct pci_dev *pdev)
|
|||
if (retval)
|
||||
goto err;
|
||||
|
||||
/* If the device has VPD, try to expose it in sysfs. */
|
||||
if (pdev->vpd) {
|
||||
attr = kzalloc(sizeof(*attr), GFP_ATOMIC);
|
||||
if (attr) {
|
||||
pdev->vpd->attr = attr;
|
||||
attr->size = pdev->vpd->ops->get_size(pdev);
|
||||
attr->attr.name = "vpd";
|
||||
attr->attr.mode = S_IRUGO | S_IWUSR;
|
||||
attr->read = pci_read_vpd;
|
||||
attr->write = pci_write_vpd;
|
||||
retval = sysfs_create_bin_file(&pdev->dev.kobj, attr);
|
||||
if (retval)
|
||||
goto err_vpd;
|
||||
} else {
|
||||
retval = -ENOMEM;
|
||||
goto err_config_file;
|
||||
}
|
||||
}
|
||||
|
||||
retval = pci_create_resource_files(pdev);
|
||||
if (retval)
|
||||
goto err_bin_file;
|
||||
goto err_vpd_file;
|
||||
|
||||
/* If the device has a ROM, try to expose it in sysfs. */
|
||||
if (pci_resource_len(pdev, PCI_ROM_RESOURCE) ||
|
||||
(pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW)) {
|
||||
rom_attr = kzalloc(sizeof(*rom_attr), GFP_ATOMIC);
|
||||
if (rom_attr) {
|
||||
pdev->rom_attr = rom_attr;
|
||||
rom_attr->size = pci_resource_len(pdev, PCI_ROM_RESOURCE);
|
||||
rom_attr->attr.name = "rom";
|
||||
rom_attr->attr.mode = S_IRUSR;
|
||||
rom_attr->read = pci_read_rom;
|
||||
rom_attr->write = pci_write_rom;
|
||||
retval = sysfs_create_bin_file(&pdev->dev.kobj, rom_attr);
|
||||
attr = kzalloc(sizeof(*attr), GFP_ATOMIC);
|
||||
if (attr) {
|
||||
pdev->rom_attr = attr;
|
||||
attr->size = pci_resource_len(pdev, PCI_ROM_RESOURCE);
|
||||
attr->attr.name = "rom";
|
||||
attr->attr.mode = S_IRUSR;
|
||||
attr->read = pci_read_rom;
|
||||
attr->write = pci_write_rom;
|
||||
retval = sysfs_create_bin_file(&pdev->dev.kobj, attr);
|
||||
if (retval)
|
||||
goto err_rom;
|
||||
} else {
|
||||
|
@ -666,16 +738,24 @@ int __must_check pci_create_sysfs_dev_files (struct pci_dev *pdev)
|
|||
if (pcibios_add_platform_entries(pdev))
|
||||
goto err_rom_file;
|
||||
|
||||
pcie_aspm_create_sysfs_dev_files(pdev);
|
||||
|
||||
return 0;
|
||||
|
||||
err_rom_file:
|
||||
if (pci_resource_len(pdev, PCI_ROM_RESOURCE))
|
||||
sysfs_remove_bin_file(&pdev->dev.kobj, rom_attr);
|
||||
sysfs_remove_bin_file(&pdev->dev.kobj, pdev->rom_attr);
|
||||
err_rom:
|
||||
kfree(rom_attr);
|
||||
kfree(pdev->rom_attr);
|
||||
err_resource_files:
|
||||
pci_remove_resource_files(pdev);
|
||||
err_bin_file:
|
||||
err_vpd_file:
|
||||
if (pdev->vpd) {
|
||||
sysfs_remove_bin_file(&pdev->dev.kobj, pdev->vpd->attr);
|
||||
err_vpd:
|
||||
kfree(pdev->vpd->attr);
|
||||
}
|
||||
err_config_file:
|
||||
if (pdev->cfg_size < 4096)
|
||||
sysfs_remove_bin_file(&pdev->dev.kobj, &pci_config_attr);
|
||||
else
|
||||
|
@ -695,6 +775,12 @@ void pci_remove_sysfs_dev_files(struct pci_dev *pdev)
|
|||
if (!sysfs_initialized)
|
||||
return;
|
||||
|
||||
pcie_aspm_remove_sysfs_dev_files(pdev);
|
||||
|
||||
if (pdev->vpd) {
|
||||
sysfs_remove_bin_file(&pdev->dev.kobj, pdev->vpd->attr);
|
||||
kfree(pdev->vpd->attr);
|
||||
}
|
||||
if (pdev->cfg_size < 4096)
|
||||
sysfs_remove_bin_file(&pdev->dev.kobj, &pci_config_attr);
|
||||
else
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/spinlock.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/log2.h>
|
||||
#include <linux/pci-aspm.h>
|
||||
#include <asm/dma.h> /* isa_dma_bridge_buggy */
|
||||
#include "pci.h"
|
||||
|
||||
|
@ -424,7 +425,7 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state)
|
|||
*/
|
||||
if (state != PCI_D0 && dev->current_state > state) {
|
||||
printk(KERN_ERR "%s(): %s: state=%d, current state=%d\n",
|
||||
__FUNCTION__, pci_name(dev), state, dev->current_state);
|
||||
__func__, pci_name(dev), state, dev->current_state);
|
||||
return -EINVAL;
|
||||
} else if (dev->current_state == state)
|
||||
return 0; /* we're already there */
|
||||
|
@ -501,6 +502,9 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state)
|
|||
if (need_restore)
|
||||
pci_restore_bars(dev);
|
||||
|
||||
if (dev->bus->self)
|
||||
pcie_aspm_pm_state_change(dev->bus->self);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -18,6 +18,25 @@ extern int pci_user_write_config_byte(struct pci_dev *dev, int where, u8 val);
|
|||
extern int pci_user_write_config_word(struct pci_dev *dev, int where, u16 val);
|
||||
extern int pci_user_write_config_dword(struct pci_dev *dev, int where, u32 val);
|
||||
|
||||
struct pci_vpd_ops {
|
||||
int (*read)(struct pci_dev *dev, int pos, int size, char *buf);
|
||||
int (*write)(struct pci_dev *dev, int pos, int size, const char *buf);
|
||||
int (*get_size)(struct pci_dev *dev);
|
||||
void (*release)(struct pci_dev *dev);
|
||||
};
|
||||
|
||||
struct pci_vpd {
|
||||
struct pci_vpd_ops *ops;
|
||||
struct bin_attribute *attr; /* descriptor for sysfs VPD entry */
|
||||
};
|
||||
|
||||
extern int pci_vpd_pci22_init(struct pci_dev *dev);
|
||||
static inline void pci_vpd_release(struct pci_dev *dev)
|
||||
{
|
||||
if (dev->vpd)
|
||||
dev->vpd->ops->release(dev);
|
||||
}
|
||||
|
||||
/* PCI /proc functions */
|
||||
#ifdef CONFIG_PROC_FS
|
||||
extern int pci_proc_attach_device(struct pci_dev *dev);
|
||||
|
|
|
@ -26,3 +26,23 @@ config HOTPLUG_PCI_PCIE
|
|||
When in doubt, say N.
|
||||
|
||||
source "drivers/pci/pcie/aer/Kconfig"
|
||||
|
||||
#
|
||||
# PCI Express ASPM
|
||||
#
|
||||
config PCIEASPM
|
||||
bool "PCI Express ASPM support(Experimental)"
|
||||
depends on PCI && EXPERIMENTAL && PCIEPORTBUS
|
||||
default y
|
||||
help
|
||||
This enables PCI Express ASPM (Active State Power Management) and
|
||||
Clock Power Management. ASPM supports state L0/L0s/L1.
|
||||
|
||||
When in doubt, say N.
|
||||
config PCIEASPM_DEBUG
|
||||
bool "Debug PCI Express ASPM"
|
||||
depends on PCIEASPM
|
||||
default n
|
||||
help
|
||||
This enables PCI Express ASPM debug support. It will add per-device
|
||||
interface to control ASPM.
|
||||
|
|
|
@ -2,6 +2,9 @@
|
|||
# Makefile for PCI-Express PORT Driver
|
||||
#
|
||||
|
||||
# Build PCI Express ASPM if needed
|
||||
obj-$(CONFIG_PCIEASPM) += aspm.o
|
||||
|
||||
pcieportdrv-y := portdrv_core.o portdrv_pci.o portdrv_bus.o
|
||||
|
||||
obj-$(CONFIG_PCIEPORTBUS) += pcieportdrv.o
|
||||
|
|
|
@ -220,7 +220,7 @@ static int __devinit aer_probe (struct pcie_device *dev,
|
|||
/* Alloc rpc data structure */
|
||||
if (!(rpc = aer_alloc_rpc(dev))) {
|
||||
printk(KERN_DEBUG "%s: Alloc rpc fails on PCIE device[%s]\n",
|
||||
__FUNCTION__, device->bus_id);
|
||||
__func__, device->bus_id);
|
||||
aer_remove(dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
@ -229,7 +229,7 @@ static int __devinit aer_probe (struct pcie_device *dev,
|
|||
if ((status = request_irq(dev->irq, aer_irq, IRQF_SHARED, "aerdrv",
|
||||
dev))) {
|
||||
printk(KERN_DEBUG "%s: Request ISR fails on PCIE device[%s]\n",
|
||||
__FUNCTION__, device->bus_id);
|
||||
__func__, device->bus_id);
|
||||
aer_remove(dev);
|
||||
return status;
|
||||
}
|
||||
|
|
|
@ -33,8 +33,11 @@ int aer_osc_setup(struct pcie_device *pciedev)
|
|||
struct pci_dev *pdev = pciedev->port;
|
||||
acpi_handle handle = 0;
|
||||
|
||||
if (acpi_pci_disabled)
|
||||
return -1;
|
||||
|
||||
/* Find root host bridge */
|
||||
while (pdev->bus && pdev->bus->self)
|
||||
while (pdev->bus->self)
|
||||
pdev = pdev->bus->self;
|
||||
handle = acpi_get_pci_rootbridge_handle(
|
||||
pci_domain_nr(pdev->bus), pdev->bus->number);
|
||||
|
|
|
@ -117,6 +117,7 @@ int pci_cleanup_aer_uncorrect_error_status(struct pci_dev *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#if 0
|
||||
int pci_cleanup_aer_correct_error_status(struct pci_dev *dev)
|
||||
{
|
||||
int pos;
|
||||
|
@ -131,6 +132,7 @@ int pci_cleanup_aer_correct_error_status(struct pci_dev *dev)
|
|||
|
||||
return 0;
|
||||
}
|
||||
#endif /* 0 */
|
||||
|
||||
static int find_device_iter(struct device *device, void *data)
|
||||
{
|
||||
|
@ -689,7 +691,7 @@ static void aer_isr_one_error(struct pcie_device *p_device,
|
|||
e_info.flags |= AER_MULTI_ERROR_VALID_FLAG;
|
||||
if (!(s_device = find_source_device(p_device->port, id))) {
|
||||
printk(KERN_DEBUG "%s->can't find device of ID%04x\n",
|
||||
__FUNCTION__, id);
|
||||
__func__, id);
|
||||
continue;
|
||||
}
|
||||
if (get_device_error_info(to_pci_dev(s_device), &e_info) ==
|
||||
|
@ -757,5 +759,4 @@ EXPORT_SYMBOL_GPL(pci_find_aer_capability);
|
|||
EXPORT_SYMBOL_GPL(pci_enable_pcie_error_reporting);
|
||||
EXPORT_SYMBOL_GPL(pci_disable_pcie_error_reporting);
|
||||
EXPORT_SYMBOL_GPL(pci_cleanup_aer_uncorrect_error_status);
|
||||
EXPORT_SYMBOL_GPL(pci_cleanup_aer_correct_error_status);
|
||||
|
||||
|
|
|
@ -0,0 +1,811 @@
|
|||
/*
|
||||
* File: drivers/pci/pcie/aspm.c
|
||||
* Enabling PCIE link L0s/L1 state and Clock Power Management
|
||||
*
|
||||
* Copyright (C) 2007 Intel
|
||||
* Copyright (C) Zhang Yanmin (yanmin.zhang@intel.com)
|
||||
* Copyright (C) Shaohua Li (shaohua.li@intel.com)
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pci_regs.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/pci-aspm.h>
|
||||
#include "../pci.h"
|
||||
|
||||
#ifdef MODULE_PARAM_PREFIX
|
||||
#undef MODULE_PARAM_PREFIX
|
||||
#endif
|
||||
#define MODULE_PARAM_PREFIX "pcie_aspm."
|
||||
|
||||
struct endpoint_state {
|
||||
unsigned int l0s_acceptable_latency;
|
||||
unsigned int l1_acceptable_latency;
|
||||
};
|
||||
|
||||
struct pcie_link_state {
|
||||
struct list_head sibiling;
|
||||
struct pci_dev *pdev;
|
||||
|
||||
/* ASPM state */
|
||||
unsigned int support_state;
|
||||
unsigned int enabled_state;
|
||||
unsigned int bios_aspm_state;
|
||||
/* upstream component */
|
||||
unsigned int l0s_upper_latency;
|
||||
unsigned int l1_upper_latency;
|
||||
/* downstream component */
|
||||
unsigned int l0s_down_latency;
|
||||
unsigned int l1_down_latency;
|
||||
/* Clock PM state*/
|
||||
unsigned int clk_pm_capable;
|
||||
unsigned int clk_pm_enabled;
|
||||
unsigned int bios_clk_state;
|
||||
|
||||
/*
|
||||
* A pcie downstream port only has one slot under it, so at most there
|
||||
* are 8 functions
|
||||
*/
|
||||
struct endpoint_state endpoints[8];
|
||||
};
|
||||
|
||||
static int aspm_disabled;
|
||||
static DEFINE_MUTEX(aspm_lock);
|
||||
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 */
|
||||
static int aspm_policy;
|
||||
static const char *policy_str[] = {
|
||||
[POLICY_DEFAULT] = "default",
|
||||
[POLICY_PERFORMANCE] = "performance",
|
||||
[POLICY_POWERSAVE] = "powersave"
|
||||
};
|
||||
|
||||
static int policy_to_aspm_state(struct pci_dev *pdev)
|
||||
{
|
||||
struct pcie_link_state *link_state = pdev->link_state;
|
||||
|
||||
switch (aspm_policy) {
|
||||
case POLICY_PERFORMANCE:
|
||||
/* Disable ASPM and Clock PM */
|
||||
return 0;
|
||||
case POLICY_POWERSAVE:
|
||||
/* Enable ASPM L0s/L1 */
|
||||
return PCIE_LINK_STATE_L0S|PCIE_LINK_STATE_L1;
|
||||
case POLICY_DEFAULT:
|
||||
return link_state->bios_aspm_state;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int policy_to_clkpm_state(struct pci_dev *pdev)
|
||||
{
|
||||
struct pcie_link_state *link_state = pdev->link_state;
|
||||
|
||||
switch (aspm_policy) {
|
||||
case POLICY_PERFORMANCE:
|
||||
/* Disable ASPM and Clock PM */
|
||||
return 0;
|
||||
case POLICY_POWERSAVE:
|
||||
/* Disable Clock PM */
|
||||
return 1;
|
||||
case POLICY_DEFAULT:
|
||||
return link_state->bios_clk_state;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pcie_set_clock_pm(struct pci_dev *pdev, int enable)
|
||||
{
|
||||
struct pci_dev *child_dev;
|
||||
int pos;
|
||||
u16 reg16;
|
||||
struct pcie_link_state *link_state = pdev->link_state;
|
||||
|
||||
list_for_each_entry(child_dev, &pdev->subordinate->devices, bus_list) {
|
||||
pos = pci_find_capability(child_dev, PCI_CAP_ID_EXP);
|
||||
if (!pos)
|
||||
return;
|
||||
pci_read_config_word(child_dev, pos + PCI_EXP_LNKCTL, ®16);
|
||||
if (enable)
|
||||
reg16 |= PCI_EXP_LNKCTL_CLKREQ_EN;
|
||||
else
|
||||
reg16 &= ~PCI_EXP_LNKCTL_CLKREQ_EN;
|
||||
pci_write_config_word(child_dev, pos + PCI_EXP_LNKCTL, reg16);
|
||||
}
|
||||
link_state->clk_pm_enabled = !!enable;
|
||||
}
|
||||
|
||||
static void pcie_check_clock_pm(struct pci_dev *pdev)
|
||||
{
|
||||
int pos;
|
||||
u32 reg32;
|
||||
u16 reg16;
|
||||
int capable = 1, enabled = 1;
|
||||
struct pci_dev *child_dev;
|
||||
struct pcie_link_state *link_state = pdev->link_state;
|
||||
|
||||
/* All functions should have the same cap and state, take the worst */
|
||||
list_for_each_entry(child_dev, &pdev->subordinate->devices, bus_list) {
|
||||
pos = pci_find_capability(child_dev, PCI_CAP_ID_EXP);
|
||||
if (!pos)
|
||||
return;
|
||||
pci_read_config_dword(child_dev, pos + PCI_EXP_LNKCAP, ®32);
|
||||
if (!(reg32 & PCI_EXP_LNKCAP_CLKPM)) {
|
||||
capable = 0;
|
||||
enabled = 0;
|
||||
break;
|
||||
}
|
||||
pci_read_config_word(child_dev, pos + PCI_EXP_LNKCTL, ®16);
|
||||
if (!(reg16 & PCI_EXP_LNKCTL_CLKREQ_EN))
|
||||
enabled = 0;
|
||||
}
|
||||
link_state->clk_pm_capable = capable;
|
||||
link_state->clk_pm_enabled = enabled;
|
||||
link_state->bios_clk_state = enabled;
|
||||
pcie_set_clock_pm(pdev, policy_to_clkpm_state(pdev));
|
||||
}
|
||||
|
||||
/*
|
||||
* pcie_aspm_configure_common_clock: check if the 2 ends of a link
|
||||
* could use common clock. If they are, configure them to use the
|
||||
* common clock. That will reduce the ASPM state exit latency.
|
||||
*/
|
||||
static void pcie_aspm_configure_common_clock(struct pci_dev *pdev)
|
||||
{
|
||||
int pos, child_pos;
|
||||
u16 reg16 = 0;
|
||||
struct pci_dev *child_dev;
|
||||
int same_clock = 1;
|
||||
|
||||
/*
|
||||
* all functions of a slot should have the same Slot Clock
|
||||
* Configuration, so just check one function
|
||||
* */
|
||||
child_dev = list_entry(pdev->subordinate->devices.next, struct pci_dev,
|
||||
bus_list);
|
||||
BUG_ON(!child_dev->is_pcie);
|
||||
|
||||
/* Check downstream component if bit Slot Clock Configuration is 1 */
|
||||
child_pos = pci_find_capability(child_dev, PCI_CAP_ID_EXP);
|
||||
pci_read_config_word(child_dev, child_pos + PCI_EXP_LNKSTA, ®16);
|
||||
if (!(reg16 & PCI_EXP_LNKSTA_SLC))
|
||||
same_clock = 0;
|
||||
|
||||
/* Check upstream component if bit Slot Clock Configuration is 1 */
|
||||
pos = pci_find_capability(pdev, PCI_CAP_ID_EXP);
|
||||
pci_read_config_word(pdev, pos + PCI_EXP_LNKSTA, ®16);
|
||||
if (!(reg16 & PCI_EXP_LNKSTA_SLC))
|
||||
same_clock = 0;
|
||||
|
||||
/* Configure downstream component, all functions */
|
||||
list_for_each_entry(child_dev, &pdev->subordinate->devices, bus_list) {
|
||||
child_pos = pci_find_capability(child_dev, PCI_CAP_ID_EXP);
|
||||
pci_read_config_word(child_dev, child_pos + PCI_EXP_LNKCTL,
|
||||
®16);
|
||||
if (same_clock)
|
||||
reg16 |= PCI_EXP_LNKCTL_CCC;
|
||||
else
|
||||
reg16 &= ~PCI_EXP_LNKCTL_CCC;
|
||||
pci_write_config_word(child_dev, child_pos + PCI_EXP_LNKCTL,
|
||||
reg16);
|
||||
}
|
||||
|
||||
/* Configure upstream component */
|
||||
pci_read_config_word(pdev, pos + PCI_EXP_LNKCTL, ®16);
|
||||
if (same_clock)
|
||||
reg16 |= PCI_EXP_LNKCTL_CCC;
|
||||
else
|
||||
reg16 &= ~PCI_EXP_LNKCTL_CCC;
|
||||
pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, reg16);
|
||||
|
||||
/* retrain link */
|
||||
reg16 |= PCI_EXP_LNKCTL_RL;
|
||||
pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, reg16);
|
||||
|
||||
/* Wait for link training end */
|
||||
while (1) {
|
||||
pci_read_config_word(pdev, pos + PCI_EXP_LNKSTA, ®16);
|
||||
if (!(reg16 & PCI_EXP_LNKSTA_LT))
|
||||
break;
|
||||
cpu_relax();
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* calc_L0S_latency: Convert L0s latency encoding to ns
|
||||
*/
|
||||
static unsigned int calc_L0S_latency(unsigned int latency_encoding, int ac)
|
||||
{
|
||||
unsigned int ns = 64;
|
||||
|
||||
if (latency_encoding == 0x7) {
|
||||
if (ac)
|
||||
ns = -1U;
|
||||
else
|
||||
ns = 5*1000; /* > 4us */
|
||||
} else
|
||||
ns *= (1 << latency_encoding);
|
||||
return ns;
|
||||
}
|
||||
|
||||
/*
|
||||
* calc_L1_latency: Convert L1 latency encoding to ns
|
||||
*/
|
||||
static unsigned int calc_L1_latency(unsigned int latency_encoding, int ac)
|
||||
{
|
||||
unsigned int ns = 1000;
|
||||
|
||||
if (latency_encoding == 0x7) {
|
||||
if (ac)
|
||||
ns = -1U;
|
||||
else
|
||||
ns = 65*1000; /* > 64us */
|
||||
} else
|
||||
ns *= (1 << latency_encoding);
|
||||
return ns;
|
||||
}
|
||||
|
||||
static void pcie_aspm_get_cap_device(struct pci_dev *pdev, u32 *state,
|
||||
unsigned int *l0s, unsigned int *l1, unsigned int *enabled)
|
||||
{
|
||||
int pos;
|
||||
u16 reg16;
|
||||
u32 reg32;
|
||||
unsigned int latency;
|
||||
|
||||
pos = pci_find_capability(pdev, PCI_CAP_ID_EXP);
|
||||
pci_read_config_dword(pdev, pos + PCI_EXP_LNKCAP, ®32);
|
||||
*state = (reg32 & PCI_EXP_LNKCAP_ASPMS) >> 10;
|
||||
if (*state != PCIE_LINK_STATE_L0S &&
|
||||
*state != (PCIE_LINK_STATE_L1|PCIE_LINK_STATE_L0S))
|
||||
*state = 0;
|
||||
if (*state == 0)
|
||||
return;
|
||||
|
||||
latency = (reg32 & PCI_EXP_LNKCAP_L0SEL) >> 12;
|
||||
*l0s = calc_L0S_latency(latency, 0);
|
||||
if (*state & PCIE_LINK_STATE_L1) {
|
||||
latency = (reg32 & PCI_EXP_LNKCAP_L1EL) >> 15;
|
||||
*l1 = calc_L1_latency(latency, 0);
|
||||
}
|
||||
pci_read_config_word(pdev, pos + PCI_EXP_LNKCTL, ®16);
|
||||
*enabled = reg16 & (PCIE_LINK_STATE_L0S|PCIE_LINK_STATE_L1);
|
||||
}
|
||||
|
||||
static void pcie_aspm_cap_init(struct pci_dev *pdev)
|
||||
{
|
||||
struct pci_dev *child_dev;
|
||||
u32 state, tmp;
|
||||
struct pcie_link_state *link_state = pdev->link_state;
|
||||
|
||||
/* upstream component states */
|
||||
pcie_aspm_get_cap_device(pdev, &link_state->support_state,
|
||||
&link_state->l0s_upper_latency,
|
||||
&link_state->l1_upper_latency,
|
||||
&link_state->enabled_state);
|
||||
/* downstream component states, all functions have the same setting */
|
||||
child_dev = list_entry(pdev->subordinate->devices.next, struct pci_dev,
|
||||
bus_list);
|
||||
pcie_aspm_get_cap_device(child_dev, &state,
|
||||
&link_state->l0s_down_latency,
|
||||
&link_state->l1_down_latency,
|
||||
&tmp);
|
||||
link_state->support_state &= state;
|
||||
if (!link_state->support_state)
|
||||
return;
|
||||
link_state->enabled_state &= link_state->support_state;
|
||||
link_state->bios_aspm_state = link_state->enabled_state;
|
||||
|
||||
/* ENDPOINT states*/
|
||||
list_for_each_entry(child_dev, &pdev->subordinate->devices, bus_list) {
|
||||
int pos;
|
||||
u32 reg32;
|
||||
unsigned int latency;
|
||||
struct endpoint_state *ep_state =
|
||||
&link_state->endpoints[PCI_FUNC(child_dev->devfn)];
|
||||
|
||||
if (child_dev->pcie_type != PCI_EXP_TYPE_ENDPOINT &&
|
||||
child_dev->pcie_type != PCI_EXP_TYPE_LEG_END)
|
||||
continue;
|
||||
|
||||
pos = pci_find_capability(child_dev, PCI_CAP_ID_EXP);
|
||||
pci_read_config_dword(child_dev, pos + PCI_EXP_DEVCAP, ®32);
|
||||
latency = (reg32 & PCI_EXP_DEVCAP_L0S) >> 6;
|
||||
latency = calc_L0S_latency(latency, 1);
|
||||
ep_state->l0s_acceptable_latency = latency;
|
||||
if (link_state->support_state & PCIE_LINK_STATE_L1) {
|
||||
latency = (reg32 & PCI_EXP_DEVCAP_L1) >> 9;
|
||||
latency = calc_L1_latency(latency, 1);
|
||||
ep_state->l1_acceptable_latency = latency;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static unsigned int __pcie_aspm_check_state_one(struct pci_dev *pdev,
|
||||
unsigned int state)
|
||||
{
|
||||
struct pci_dev *parent_dev, *tmp_dev;
|
||||
unsigned int latency, l1_latency = 0;
|
||||
struct pcie_link_state *link_state;
|
||||
struct endpoint_state *ep_state;
|
||||
|
||||
parent_dev = pdev->bus->self;
|
||||
link_state = parent_dev->link_state;
|
||||
state &= link_state->support_state;
|
||||
if (state == 0)
|
||||
return 0;
|
||||
ep_state = &link_state->endpoints[PCI_FUNC(pdev->devfn)];
|
||||
|
||||
/*
|
||||
* Check latency for endpoint device.
|
||||
* TBD: The latency from the endpoint to root complex vary per
|
||||
* switch's upstream link state above the device. Here we just do a
|
||||
* simple check which assumes all links above the device can be in L1
|
||||
* state, that is we just consider the worst case. If switch's upstream
|
||||
* link can't be put into L0S/L1, then our check is too strictly.
|
||||
*/
|
||||
tmp_dev = pdev;
|
||||
while (state & (PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1)) {
|
||||
parent_dev = tmp_dev->bus->self;
|
||||
link_state = parent_dev->link_state;
|
||||
if (state & PCIE_LINK_STATE_L0S) {
|
||||
latency = max_t(unsigned int,
|
||||
link_state->l0s_upper_latency,
|
||||
link_state->l0s_down_latency);
|
||||
if (latency > ep_state->l0s_acceptable_latency)
|
||||
state &= ~PCIE_LINK_STATE_L0S;
|
||||
}
|
||||
if (state & PCIE_LINK_STATE_L1) {
|
||||
latency = max_t(unsigned int,
|
||||
link_state->l1_upper_latency,
|
||||
link_state->l1_down_latency);
|
||||
if (latency + l1_latency >
|
||||
ep_state->l1_acceptable_latency)
|
||||
state &= ~PCIE_LINK_STATE_L1;
|
||||
}
|
||||
if (!parent_dev->bus->self) /* parent_dev is a root port */
|
||||
break;
|
||||
else {
|
||||
/*
|
||||
* parent_dev is the downstream port of a switch, make
|
||||
* tmp_dev the upstream port of the switch
|
||||
*/
|
||||
tmp_dev = parent_dev->bus->self;
|
||||
/*
|
||||
* every switch on the path to root complex need 1 more
|
||||
* microsecond for L1. Spec doesn't mention L0S.
|
||||
*/
|
||||
if (state & PCIE_LINK_STATE_L1)
|
||||
l1_latency += 1000;
|
||||
}
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
static unsigned int pcie_aspm_check_state(struct pci_dev *pdev,
|
||||
unsigned int state)
|
||||
{
|
||||
struct pci_dev *child_dev;
|
||||
|
||||
/* If no child, disable the link */
|
||||
if (list_empty(&pdev->subordinate->devices))
|
||||
return 0;
|
||||
list_for_each_entry(child_dev, &pdev->subordinate->devices, bus_list) {
|
||||
if (child_dev->pcie_type == PCI_EXP_TYPE_PCI_BRIDGE) {
|
||||
/*
|
||||
* If downstream component of a link is pci bridge, we
|
||||
* disable ASPM for now for the link
|
||||
* */
|
||||
state = 0;
|
||||
break;
|
||||
}
|
||||
if ((child_dev->pcie_type != PCI_EXP_TYPE_ENDPOINT &&
|
||||
child_dev->pcie_type != PCI_EXP_TYPE_LEG_END))
|
||||
continue;
|
||||
/* Device not in D0 doesn't need check latency */
|
||||
if (child_dev->current_state == PCI_D1 ||
|
||||
child_dev->current_state == PCI_D2 ||
|
||||
child_dev->current_state == PCI_D3hot ||
|
||||
child_dev->current_state == PCI_D3cold)
|
||||
continue;
|
||||
state = __pcie_aspm_check_state_one(child_dev, state);
|
||||
}
|
||||
return state;
|
||||
}
|
||||
|
||||
static void __pcie_aspm_config_one_dev(struct pci_dev *pdev, unsigned int state)
|
||||
{
|
||||
u16 reg16;
|
||||
int pos = pci_find_capability(pdev, PCI_CAP_ID_EXP);
|
||||
|
||||
pci_read_config_word(pdev, pos + PCI_EXP_LNKCTL, ®16);
|
||||
reg16 &= ~0x3;
|
||||
reg16 |= state;
|
||||
pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, reg16);
|
||||
}
|
||||
|
||||
static void __pcie_aspm_config_link(struct pci_dev *pdev, unsigned int state)
|
||||
{
|
||||
struct pci_dev *child_dev;
|
||||
int valid = 1;
|
||||
struct pcie_link_state *link_state = pdev->link_state;
|
||||
|
||||
/*
|
||||
* if the downstream component has pci bridge function, don't do ASPM
|
||||
* now
|
||||
*/
|
||||
list_for_each_entry(child_dev, &pdev->subordinate->devices, bus_list) {
|
||||
if (child_dev->pcie_type == PCI_EXP_TYPE_PCI_BRIDGE) {
|
||||
valid = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!valid)
|
||||
return;
|
||||
|
||||
/*
|
||||
* spec 2.0 suggests all functions should be configured the same
|
||||
* setting for ASPM. Enabling ASPM L1 should be done in upstream
|
||||
* component first and then downstream, and vice versa for disabling
|
||||
* ASPM L1. Spec doesn't mention L0S.
|
||||
*/
|
||||
if (state & PCIE_LINK_STATE_L1)
|
||||
__pcie_aspm_config_one_dev(pdev, state);
|
||||
|
||||
list_for_each_entry(child_dev, &pdev->subordinate->devices, bus_list)
|
||||
__pcie_aspm_config_one_dev(child_dev, state);
|
||||
|
||||
if (!(state & PCIE_LINK_STATE_L1))
|
||||
__pcie_aspm_config_one_dev(pdev, state);
|
||||
|
||||
link_state->enabled_state = state;
|
||||
}
|
||||
|
||||
static void __pcie_aspm_configure_link_state(struct pci_dev *pdev,
|
||||
unsigned int state)
|
||||
{
|
||||
struct pcie_link_state *link_state = pdev->link_state;
|
||||
|
||||
if (link_state->support_state == 0)
|
||||
return;
|
||||
state &= PCIE_LINK_STATE_L0S|PCIE_LINK_STATE_L1;
|
||||
|
||||
/* state 0 means disabling aspm */
|
||||
state = pcie_aspm_check_state(pdev, state);
|
||||
if (link_state->enabled_state == state)
|
||||
return;
|
||||
__pcie_aspm_config_link(pdev, state);
|
||||
}
|
||||
|
||||
/*
|
||||
* pcie_aspm_configure_link_state: enable/disable PCI express link state
|
||||
* @pdev: the root port or switch downstream port
|
||||
*/
|
||||
static void pcie_aspm_configure_link_state(struct pci_dev *pdev,
|
||||
unsigned int state)
|
||||
{
|
||||
down_read(&pci_bus_sem);
|
||||
mutex_lock(&aspm_lock);
|
||||
__pcie_aspm_configure_link_state(pdev, state);
|
||||
mutex_unlock(&aspm_lock);
|
||||
up_read(&pci_bus_sem);
|
||||
}
|
||||
|
||||
static void free_link_state(struct pci_dev *pdev)
|
||||
{
|
||||
kfree(pdev->link_state);
|
||||
pdev->link_state = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* pcie_aspm_init_link_state: Initiate PCI express link state.
|
||||
* It is called after the pcie and its children devices are scaned.
|
||||
* @pdev: the root port or switch downstream port
|
||||
*/
|
||||
void pcie_aspm_init_link_state(struct pci_dev *pdev)
|
||||
{
|
||||
unsigned int state;
|
||||
struct pcie_link_state *link_state;
|
||||
int error = 0;
|
||||
|
||||
if (aspm_disabled || !pdev->is_pcie || pdev->link_state)
|
||||
return;
|
||||
if (pdev->pcie_type != PCI_EXP_TYPE_ROOT_PORT &&
|
||||
pdev->pcie_type != PCI_EXP_TYPE_DOWNSTREAM)
|
||||
return;
|
||||
down_read(&pci_bus_sem);
|
||||
if (list_empty(&pdev->subordinate->devices))
|
||||
goto out;
|
||||
|
||||
mutex_lock(&aspm_lock);
|
||||
|
||||
link_state = kzalloc(sizeof(*link_state), GFP_KERNEL);
|
||||
if (!link_state)
|
||||
goto unlock_out;
|
||||
pdev->link_state = link_state;
|
||||
|
||||
pcie_aspm_configure_common_clock(pdev);
|
||||
|
||||
pcie_aspm_cap_init(pdev);
|
||||
|
||||
/* config link state to avoid BIOS error */
|
||||
state = pcie_aspm_check_state(pdev, policy_to_aspm_state(pdev));
|
||||
__pcie_aspm_config_link(pdev, state);
|
||||
|
||||
pcie_check_clock_pm(pdev);
|
||||
|
||||
link_state->pdev = pdev;
|
||||
list_add(&link_state->sibiling, &link_list);
|
||||
|
||||
unlock_out:
|
||||
if (error)
|
||||
free_link_state(pdev);
|
||||
mutex_unlock(&aspm_lock);
|
||||
out:
|
||||
up_read(&pci_bus_sem);
|
||||
}
|
||||
|
||||
/* @pdev: the endpoint device */
|
||||
void pcie_aspm_exit_link_state(struct pci_dev *pdev)
|
||||
{
|
||||
struct pci_dev *parent = pdev->bus->self;
|
||||
struct pcie_link_state *link_state = parent->link_state;
|
||||
|
||||
if (aspm_disabled || !pdev->is_pcie || !parent || !link_state)
|
||||
return;
|
||||
if (parent->pcie_type != PCI_EXP_TYPE_ROOT_PORT &&
|
||||
parent->pcie_type != PCI_EXP_TYPE_DOWNSTREAM)
|
||||
return;
|
||||
down_read(&pci_bus_sem);
|
||||
mutex_lock(&aspm_lock);
|
||||
|
||||
/*
|
||||
* All PCIe functions are in one slot, remove one function will remove
|
||||
* the the whole slot, so just wait
|
||||
*/
|
||||
if (!list_empty(&parent->subordinate->devices))
|
||||
goto out;
|
||||
|
||||
/* All functions are removed, so just disable ASPM for the link */
|
||||
__pcie_aspm_config_one_dev(parent, 0);
|
||||
list_del(&link_state->sibiling);
|
||||
/* Clock PM is for endpoint device */
|
||||
|
||||
free_link_state(parent);
|
||||
out:
|
||||
mutex_unlock(&aspm_lock);
|
||||
up_read(&pci_bus_sem);
|
||||
}
|
||||
|
||||
/* @pdev: the root port or switch downstream port */
|
||||
void pcie_aspm_pm_state_change(struct pci_dev *pdev)
|
||||
{
|
||||
struct pcie_link_state *link_state = pdev->link_state;
|
||||
|
||||
if (aspm_disabled || !pdev->is_pcie || !pdev->link_state)
|
||||
return;
|
||||
if (pdev->pcie_type != PCI_EXP_TYPE_ROOT_PORT &&
|
||||
pdev->pcie_type != PCI_EXP_TYPE_DOWNSTREAM)
|
||||
return;
|
||||
/*
|
||||
* devices changed PM state, we should recheck if latency meets all
|
||||
* functions' requirement
|
||||
*/
|
||||
pcie_aspm_configure_link_state(pdev, link_state->enabled_state);
|
||||
}
|
||||
|
||||
/*
|
||||
* pci_disable_link_state - disable pci device's link state, so the link will
|
||||
* never enter specific states
|
||||
*/
|
||||
void pci_disable_link_state(struct pci_dev *pdev, int state)
|
||||
{
|
||||
struct pci_dev *parent = pdev->bus->self;
|
||||
struct pcie_link_state *link_state;
|
||||
|
||||
if (aspm_disabled || !pdev->is_pcie)
|
||||
return;
|
||||
if (pdev->pcie_type == PCI_EXP_TYPE_ROOT_PORT ||
|
||||
pdev->pcie_type == PCI_EXP_TYPE_DOWNSTREAM)
|
||||
parent = pdev;
|
||||
if (!parent || !parent->link_state)
|
||||
return;
|
||||
|
||||
down_read(&pci_bus_sem);
|
||||
mutex_lock(&aspm_lock);
|
||||
link_state = parent->link_state;
|
||||
link_state->support_state &=
|
||||
~(state & (PCIE_LINK_STATE_L0S|PCIE_LINK_STATE_L1));
|
||||
if (state & PCIE_LINK_STATE_CLKPM)
|
||||
link_state->clk_pm_capable = 0;
|
||||
|
||||
__pcie_aspm_configure_link_state(parent, link_state->enabled_state);
|
||||
if (!link_state->clk_pm_capable && link_state->clk_pm_enabled)
|
||||
pcie_set_clock_pm(parent, 0);
|
||||
mutex_unlock(&aspm_lock);
|
||||
up_read(&pci_bus_sem);
|
||||
}
|
||||
EXPORT_SYMBOL(pci_disable_link_state);
|
||||
|
||||
static int pcie_aspm_set_policy(const char *val, struct kernel_param *kp)
|
||||
{
|
||||
int i;
|
||||
struct pci_dev *pdev;
|
||||
struct pcie_link_state *link_state;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(policy_str); i++)
|
||||
if (!strncmp(val, policy_str[i], strlen(policy_str[i])))
|
||||
break;
|
||||
if (i >= ARRAY_SIZE(policy_str))
|
||||
return -EINVAL;
|
||||
if (i == aspm_policy)
|
||||
return 0;
|
||||
|
||||
down_read(&pci_bus_sem);
|
||||
mutex_lock(&aspm_lock);
|
||||
aspm_policy = i;
|
||||
list_for_each_entry(link_state, &link_list, sibiling) {
|
||||
pdev = link_state->pdev;
|
||||
__pcie_aspm_configure_link_state(pdev,
|
||||
policy_to_aspm_state(pdev));
|
||||
if (link_state->clk_pm_capable &&
|
||||
link_state->clk_pm_enabled != policy_to_clkpm_state(pdev))
|
||||
pcie_set_clock_pm(pdev, policy_to_clkpm_state(pdev));
|
||||
|
||||
}
|
||||
mutex_unlock(&aspm_lock);
|
||||
up_read(&pci_bus_sem);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pcie_aspm_get_policy(char *buffer, struct kernel_param *kp)
|
||||
{
|
||||
int i, cnt = 0;
|
||||
for (i = 0; i < ARRAY_SIZE(policy_str); i++)
|
||||
if (i == aspm_policy)
|
||||
cnt += sprintf(buffer + cnt, "[%s] ", policy_str[i]);
|
||||
else
|
||||
cnt += sprintf(buffer + cnt, "%s ", policy_str[i]);
|
||||
return cnt;
|
||||
}
|
||||
|
||||
module_param_call(policy, pcie_aspm_set_policy, pcie_aspm_get_policy,
|
||||
NULL, 0644);
|
||||
|
||||
#ifdef CONFIG_PCIEASPM_DEBUG
|
||||
static ssize_t link_state_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct pci_dev *pci_device = to_pci_dev(dev);
|
||||
struct pcie_link_state *link_state = pci_device->link_state;
|
||||
|
||||
return sprintf(buf, "%d\n", link_state->enabled_state);
|
||||
}
|
||||
|
||||
static ssize_t link_state_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf,
|
||||
size_t n)
|
||||
{
|
||||
struct pci_dev *pci_device = to_pci_dev(dev);
|
||||
int state;
|
||||
|
||||
if (n < 1)
|
||||
return -EINVAL;
|
||||
state = buf[0]-'0';
|
||||
if (state >= 0 && state <= 3) {
|
||||
/* setup link aspm state */
|
||||
pcie_aspm_configure_link_state(pci_device, state);
|
||||
return n;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static ssize_t clk_ctl_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct pci_dev *pci_device = to_pci_dev(dev);
|
||||
struct pcie_link_state *link_state = pci_device->link_state;
|
||||
|
||||
return sprintf(buf, "%d\n", link_state->clk_pm_enabled);
|
||||
}
|
||||
|
||||
static ssize_t clk_ctl_store(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf,
|
||||
size_t n)
|
||||
{
|
||||
struct pci_dev *pci_device = to_pci_dev(dev);
|
||||
int state;
|
||||
|
||||
if (n < 1)
|
||||
return -EINVAL;
|
||||
state = buf[0]-'0';
|
||||
|
||||
down_read(&pci_bus_sem);
|
||||
mutex_lock(&aspm_lock);
|
||||
pcie_set_clock_pm(pci_device, !!state);
|
||||
mutex_unlock(&aspm_lock);
|
||||
up_read(&pci_bus_sem);
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(link_state, 0644, link_state_show, link_state_store);
|
||||
static DEVICE_ATTR(clk_ctl, 0644, clk_ctl_show, clk_ctl_store);
|
||||
|
||||
static char power_group[] = "power";
|
||||
void pcie_aspm_create_sysfs_dev_files(struct pci_dev *pdev)
|
||||
{
|
||||
struct pcie_link_state *link_state = pdev->link_state;
|
||||
|
||||
if (!pdev->is_pcie || (pdev->pcie_type != PCI_EXP_TYPE_ROOT_PORT &&
|
||||
pdev->pcie_type != PCI_EXP_TYPE_DOWNSTREAM) || !link_state)
|
||||
return;
|
||||
|
||||
if (link_state->support_state)
|
||||
sysfs_add_file_to_group(&pdev->dev.kobj,
|
||||
&dev_attr_link_state.attr, power_group);
|
||||
if (link_state->clk_pm_capable)
|
||||
sysfs_add_file_to_group(&pdev->dev.kobj,
|
||||
&dev_attr_clk_ctl.attr, power_group);
|
||||
}
|
||||
|
||||
void pcie_aspm_remove_sysfs_dev_files(struct pci_dev *pdev)
|
||||
{
|
||||
struct pcie_link_state *link_state = pdev->link_state;
|
||||
|
||||
if (!pdev->is_pcie || (pdev->pcie_type != PCI_EXP_TYPE_ROOT_PORT &&
|
||||
pdev->pcie_type != PCI_EXP_TYPE_DOWNSTREAM) || !link_state)
|
||||
return;
|
||||
|
||||
if (link_state->support_state)
|
||||
sysfs_remove_file_from_group(&pdev->dev.kobj,
|
||||
&dev_attr_link_state.attr, power_group);
|
||||
if (link_state->clk_pm_capable)
|
||||
sysfs_remove_file_from_group(&pdev->dev.kobj,
|
||||
&dev_attr_clk_ctl.attr, power_group);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int __init pcie_aspm_disable(char *str)
|
||||
{
|
||||
aspm_disabled = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("pcie_noaspm", pcie_aspm_disable);
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <linux/pci-acpi.h>
|
||||
static void pcie_aspm_platform_init(void)
|
||||
{
|
||||
pcie_osc_support_set(OSC_ACTIVE_STATE_PWR_SUPPORT|
|
||||
OSC_CLOCK_PWR_CAPABILITY_SUPPORT);
|
||||
}
|
||||
#else
|
||||
static inline void pcie_aspm_platform_init(void) { }
|
||||
#endif
|
||||
|
||||
static int __init pcie_aspm_init(void)
|
||||
{
|
||||
if (aspm_disabled)
|
||||
return 0;
|
||||
pcie_aspm_platform_init();
|
||||
return 0;
|
||||
}
|
||||
|
||||
fs_initcall(pcie_aspm_init);
|
|
@ -150,7 +150,7 @@ static int assign_interrupt_mode(struct pci_dev *dev, int *vectors, int mask)
|
|||
if (pos) {
|
||||
struct msix_entry msix_entries[PCIE_PORT_DEVICE_MAXSERVICES] =
|
||||
{{0, 0}, {0, 1}, {0, 2}, {0, 3}};
|
||||
printk("%s Found MSIX capability\n", __FUNCTION__);
|
||||
printk("%s Found MSIX capability\n", __func__);
|
||||
status = pci_enable_msix(dev, msix_entries, nvec);
|
||||
if (!status) {
|
||||
int j = 0;
|
||||
|
@ -165,7 +165,7 @@ static int assign_interrupt_mode(struct pci_dev *dev, int *vectors, int mask)
|
|||
if (status) {
|
||||
pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
|
||||
if (pos) {
|
||||
printk("%s Found MSI capability\n", __FUNCTION__);
|
||||
printk("%s Found MSI capability\n", __func__);
|
||||
status = pci_enable_msi(dev);
|
||||
if (!status) {
|
||||
interrupt_mode = PCIE_PORT_MSI_MODE;
|
||||
|
|
|
@ -93,7 +93,7 @@ static int __devinit pcie_portdrv_probe (struct pci_dev *dev,
|
|||
if (!dev->irq && dev->pin) {
|
||||
printk(KERN_WARNING
|
||||
"%s->Dev[%04x:%04x] has invalid IRQ. Check vendor BIOS\n",
|
||||
__FUNCTION__, dev->vendor, dev->device);
|
||||
__func__, dev->vendor, dev->device);
|
||||
}
|
||||
if (pcie_port_device_register(dev)) {
|
||||
pci_disable_device(dev);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -1502,8 +1502,8 @@ static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f, struct pci_f
|
|||
if ((f->vendor == dev->vendor || f->vendor == (u16) PCI_ANY_ID) &&
|
||||
(f->device == dev->device || f->device == (u16) PCI_ANY_ID)) {
|
||||
#ifdef DEBUG
|
||||
dev_dbg(&dev->dev, "calling quirk 0x%p", f->hook);
|
||||
print_fn_descriptor_symbol(": %s()\n",
|
||||
dev_dbg(&dev->dev, "calling ");
|
||||
print_fn_descriptor_symbol("%s()\n",
|
||||
(unsigned long) f->hook);
|
||||
#endif
|
||||
f->hook(dev);
|
||||
|
@ -1648,13 +1648,24 @@ static void __devinit quirk_via_cx700_pci_parking_caching(struct pci_dev *dev)
|
|||
/* Turn off PCI Bus Parking */
|
||||
pci_write_config_byte(dev, 0x76, b ^ 0x40);
|
||||
|
||||
dev_info(&dev->dev,
|
||||
"Disabling VIA CX700 PCI parking\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (pci_read_config_byte(dev, 0x72, &b) == 0) {
|
||||
if (b != 0) {
|
||||
/* Turn off PCI Master read caching */
|
||||
pci_write_config_byte(dev, 0x72, 0x0);
|
||||
|
||||
/* Set PCI Master Bus time-out to "1x16 PCLK" */
|
||||
pci_write_config_byte(dev, 0x75, 0x1);
|
||||
|
||||
/* Disable "Read FIFO Timer" */
|
||||
pci_write_config_byte(dev, 0x77, 0x0);
|
||||
|
||||
dev_info(&dev->dev,
|
||||
"Disabling VIA CX700 PCI parking/caching\n");
|
||||
"Disabling VIA CX700 PCI caching\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#include <linux/pci.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci-aspm.h>
|
||||
#include "pci.h"
|
||||
|
||||
static void pci_free_resources(struct pci_dev *dev)
|
||||
|
@ -18,18 +19,15 @@ static void pci_free_resources(struct pci_dev *dev)
|
|||
|
||||
static void pci_stop_dev(struct pci_dev *dev)
|
||||
{
|
||||
if (!dev->global_list.next)
|
||||
return;
|
||||
|
||||
if (!list_empty(&dev->global_list)) {
|
||||
if (dev->is_added) {
|
||||
pci_proc_detach_device(dev);
|
||||
pci_remove_sysfs_dev_files(dev);
|
||||
device_unregister(&dev->dev);
|
||||
down_write(&pci_bus_sem);
|
||||
list_del(&dev->global_list);
|
||||
dev->global_list.next = dev->global_list.prev = NULL;
|
||||
up_write(&pci_bus_sem);
|
||||
dev->is_added = 0;
|
||||
}
|
||||
|
||||
if (dev->bus->self)
|
||||
pcie_aspm_exit_link_state(dev);
|
||||
}
|
||||
|
||||
static void pci_destroy_dev(struct pci_dev *dev)
|
||||
|
|
|
@ -114,31 +114,63 @@ pci_find_next_bus(const struct pci_bus *from)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_PCI_LEGACY
|
||||
|
||||
/**
|
||||
* pci_find_slot - locate PCI device from a given PCI slot
|
||||
* @bus: number of PCI bus on which desired PCI device resides
|
||||
* @devfn: encodes number of PCI slot in which the desired PCI
|
||||
* device resides and the logical device number within that slot
|
||||
* @devfn: encodes number of PCI slot in which the desired PCI
|
||||
* device resides and the logical device number within that slot
|
||||
* in case of multi-function devices.
|
||||
*
|
||||
* Given a PCI bus and slot/function number, the desired PCI device
|
||||
* Given a PCI bus and slot/function number, the desired PCI device
|
||||
* is located in system global list of PCI devices. If the device
|
||||
* is found, a pointer to its data structure is returned. If no
|
||||
* is found, a pointer to its data structure is returned. If no
|
||||
* device is found, %NULL is returned.
|
||||
*
|
||||
* NOTE: Do not use this function any more; use pci_get_slot() instead, as
|
||||
* the PCI device returned by this function can disappear at any moment in
|
||||
* time.
|
||||
*/
|
||||
struct pci_dev *
|
||||
pci_find_slot(unsigned int bus, unsigned int devfn)
|
||||
struct pci_dev *pci_find_slot(unsigned int bus, unsigned int devfn)
|
||||
{
|
||||
struct pci_dev *dev = NULL;
|
||||
|
||||
while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
|
||||
if (dev->bus->number == bus && dev->devfn == devfn)
|
||||
while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
|
||||
if (dev->bus->number == bus && dev->devfn == devfn) {
|
||||
pci_dev_put(dev);
|
||||
return dev;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL(pci_find_slot);
|
||||
|
||||
/**
|
||||
* pci_find_device - begin or continue searching for a PCI device by vendor/device id
|
||||
* @vendor: PCI vendor id to match, or %PCI_ANY_ID to match all vendor ids
|
||||
* @device: PCI device id to match, or %PCI_ANY_ID to match all device ids
|
||||
* @from: Previous PCI device found in search, or %NULL for new search.
|
||||
*
|
||||
* Iterates through the list of known PCI devices. If a PCI device is found
|
||||
* with a matching @vendor and @device, a pointer to its device structure is
|
||||
* returned. Otherwise, %NULL is returned.
|
||||
* A new search is initiated by passing %NULL as the @from argument.
|
||||
* Otherwise if @from is not %NULL, searches continue from next device
|
||||
* on the global list.
|
||||
*
|
||||
* NOTE: Do not use this function any more; use pci_get_device() instead, as
|
||||
* the PCI device returned by this function can disappear at any moment in
|
||||
* time.
|
||||
*/
|
||||
struct pci_dev *pci_find_device(unsigned int vendor, unsigned int device,
|
||||
const struct pci_dev *from)
|
||||
{
|
||||
struct pci_dev *pdev;
|
||||
|
||||
pdev = pci_get_subsys(vendor, device, PCI_ANY_ID, PCI_ANY_ID, from);
|
||||
pci_dev_put(pdev);
|
||||
return pdev;
|
||||
}
|
||||
EXPORT_SYMBOL(pci_find_device);
|
||||
#endif /* CONFIG_PCI_LEGACY */
|
||||
|
||||
/**
|
||||
|
@ -204,86 +236,52 @@ struct pci_dev * pci_get_bus_and_slot(unsigned int bus, unsigned int devfn)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PCI_LEGACY
|
||||
/**
|
||||
* pci_find_subsys - begin or continue searching for a PCI device by vendor/subvendor/device/subdevice id
|
||||
* @vendor: PCI vendor id to match, or %PCI_ANY_ID to match all vendor ids
|
||||
* @device: PCI device id to match, or %PCI_ANY_ID to match all device ids
|
||||
* @ss_vendor: PCI subsystem vendor id to match, or %PCI_ANY_ID to match all vendor ids
|
||||
* @ss_device: PCI subsystem device id to match, or %PCI_ANY_ID to match all device ids
|
||||
* @from: Previous PCI device found in search, or %NULL for new search.
|
||||
*
|
||||
* Iterates through the list of known PCI devices. If a PCI device is
|
||||
* found with a matching @vendor, @device, @ss_vendor and @ss_device, a
|
||||
* pointer to its device structure is returned. Otherwise, %NULL is returned.
|
||||
* A new search is initiated by passing %NULL as the @from argument.
|
||||
* Otherwise if @from is not %NULL, searches continue from next device
|
||||
* on the global list.
|
||||
*
|
||||
* NOTE: Do not use this function any more; use pci_get_subsys() instead, as
|
||||
* the PCI device returned by this function can disappear at any moment in
|
||||
* time.
|
||||
*/
|
||||
static struct pci_dev * pci_find_subsys(unsigned int vendor,
|
||||
unsigned int device,
|
||||
unsigned int ss_vendor,
|
||||
unsigned int ss_device,
|
||||
const struct pci_dev *from)
|
||||
static int match_pci_dev_by_id(struct device *dev, void *data)
|
||||
{
|
||||
struct list_head *n;
|
||||
struct pci_dev *dev;
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
struct pci_device_id *id = data;
|
||||
|
||||
WARN_ON(in_interrupt());
|
||||
|
||||
/*
|
||||
* pci_find_subsys() can be called on the ide_setup() path, super-early
|
||||
* in boot. But the down_read() will enable local interrupts, which
|
||||
* can cause some machines to crash. So here we detect and flag that
|
||||
* situation and bail out early.
|
||||
*/
|
||||
if (unlikely(no_pci_devices()))
|
||||
return NULL;
|
||||
down_read(&pci_bus_sem);
|
||||
n = from ? from->global_list.next : pci_devices.next;
|
||||
|
||||
while (n && (n != &pci_devices)) {
|
||||
dev = pci_dev_g(n);
|
||||
if ((vendor == PCI_ANY_ID || dev->vendor == vendor) &&
|
||||
(device == PCI_ANY_ID || dev->device == device) &&
|
||||
(ss_vendor == PCI_ANY_ID || dev->subsystem_vendor == ss_vendor) &&
|
||||
(ss_device == PCI_ANY_ID || dev->subsystem_device == ss_device))
|
||||
goto exit;
|
||||
n = n->next;
|
||||
}
|
||||
dev = NULL;
|
||||
exit:
|
||||
up_read(&pci_bus_sem);
|
||||
return dev;
|
||||
if (pci_match_one_device(id, pdev))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_find_device - begin or continue searching for a PCI device by vendor/device id
|
||||
* @vendor: PCI vendor id to match, or %PCI_ANY_ID to match all vendor ids
|
||||
* @device: PCI device id to match, or %PCI_ANY_ID to match all device ids
|
||||
/*
|
||||
* pci_get_dev_by_id - begin or continue searching for a PCI device by id
|
||||
* @id: pointer to struct pci_device_id to match for the device
|
||||
* @from: Previous PCI device found in search, or %NULL for new search.
|
||||
*
|
||||
* Iterates through the list of known PCI devices. If a PCI device is found
|
||||
* with a matching @vendor and @device, a pointer to its device structure is
|
||||
* returned. Otherwise, %NULL is returned.
|
||||
* A new search is initiated by passing %NULL as the @from argument.
|
||||
* Otherwise if @from is not %NULL, searches continue from next device
|
||||
* on the global list.
|
||||
*
|
||||
* NOTE: Do not use this function any more; use pci_get_device() instead, as
|
||||
* the PCI device returned by this function can disappear at any moment in
|
||||
* time.
|
||||
* with a matching id a pointer to its device structure is returned, and the
|
||||
* reference count to the device is incremented. Otherwise, %NULL is returned.
|
||||
* A new search is initiated by passing %NULL as the @from argument. Otherwise
|
||||
* if @from is not %NULL, searches continue from next device on the global
|
||||
* list. The reference count for @from is always decremented if it is not
|
||||
* %NULL.
|
||||
*
|
||||
* This is an internal function for use by the other search functions in
|
||||
* this file.
|
||||
*/
|
||||
struct pci_dev *
|
||||
pci_find_device(unsigned int vendor, unsigned int device, const struct pci_dev *from)
|
||||
static struct pci_dev *pci_get_dev_by_id(const struct pci_device_id *id,
|
||||
const struct pci_dev *from)
|
||||
{
|
||||
return pci_find_subsys(vendor, device, PCI_ANY_ID, PCI_ANY_ID, from);
|
||||
struct device *dev;
|
||||
struct device *dev_start = NULL;
|
||||
struct pci_dev *pdev = NULL;
|
||||
|
||||
WARN_ON(in_interrupt());
|
||||
if (from) {
|
||||
/* FIXME
|
||||
* take the cast off, when bus_find_device is made const.
|
||||
*/
|
||||
dev_start = (struct device *)&from->dev;
|
||||
}
|
||||
dev = bus_find_device(&pci_bus_type, dev_start, (void *)id,
|
||||
match_pci_dev_by_id);
|
||||
if (dev)
|
||||
pdev = to_pci_dev(dev);
|
||||
return pdev;
|
||||
}
|
||||
#endif /* CONFIG_PCI_LEGACY */
|
||||
|
||||
/**
|
||||
* pci_get_subsys - begin or continue searching for a PCI device by vendor/subvendor/device/subdevice id
|
||||
|
@ -301,42 +299,34 @@ pci_find_device(unsigned int vendor, unsigned int device, const struct pci_dev *
|
|||
* searches continue from next device on the global list.
|
||||
* The reference count for @from is always decremented if it is not %NULL.
|
||||
*/
|
||||
struct pci_dev *
|
||||
pci_get_subsys(unsigned int vendor, unsigned int device,
|
||||
unsigned int ss_vendor, unsigned int ss_device,
|
||||
struct pci_dev *from)
|
||||
struct pci_dev *pci_get_subsys(unsigned int vendor, unsigned int device,
|
||||
unsigned int ss_vendor, unsigned int ss_device,
|
||||
const struct pci_dev *from)
|
||||
{
|
||||
struct list_head *n;
|
||||
struct pci_dev *dev;
|
||||
|
||||
WARN_ON(in_interrupt());
|
||||
struct pci_dev *pdev;
|
||||
struct pci_device_id *id;
|
||||
|
||||
/*
|
||||
* pci_get_subsys() can potentially be called by drivers super-early
|
||||
* in boot. But the down_read() will enable local interrupts, which
|
||||
* can cause some machines to crash. So here we detect and flag that
|
||||
* situation and bail out early.
|
||||
* pci_find_subsys() can be called on the ide_setup() path,
|
||||
* super-early in boot. But the down_read() will enable local
|
||||
* interrupts, which can cause some machines to crash. So here we
|
||||
* detect and flag that situation and bail out early.
|
||||
*/
|
||||
if (unlikely(no_pci_devices()))
|
||||
return NULL;
|
||||
down_read(&pci_bus_sem);
|
||||
n = from ? from->global_list.next : pci_devices.next;
|
||||
|
||||
while (n && (n != &pci_devices)) {
|
||||
dev = pci_dev_g(n);
|
||||
if ((vendor == PCI_ANY_ID || dev->vendor == vendor) &&
|
||||
(device == PCI_ANY_ID || dev->device == device) &&
|
||||
(ss_vendor == PCI_ANY_ID || dev->subsystem_vendor == ss_vendor) &&
|
||||
(ss_device == PCI_ANY_ID || dev->subsystem_device == ss_device))
|
||||
goto exit;
|
||||
n = n->next;
|
||||
}
|
||||
dev = NULL;
|
||||
exit:
|
||||
dev = pci_dev_get(dev);
|
||||
up_read(&pci_bus_sem);
|
||||
pci_dev_put(from);
|
||||
return dev;
|
||||
id = kzalloc(sizeof(*id), GFP_KERNEL);
|
||||
if (!id)
|
||||
return NULL;
|
||||
id->vendor = vendor;
|
||||
id->device = device;
|
||||
id->subvendor = ss_vendor;
|
||||
id->subdevice = ss_device;
|
||||
|
||||
pdev = pci_get_dev_by_id(id, from);
|
||||
kfree(id);
|
||||
|
||||
return pdev;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -359,46 +349,6 @@ pci_get_device(unsigned int vendor, unsigned int device, struct pci_dev *from)
|
|||
return pci_get_subsys(vendor, device, PCI_ANY_ID, PCI_ANY_ID, from);
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_get_device_reverse - begin or continue searching for a PCI device by vendor/device id
|
||||
* @vendor: PCI vendor id to match, or %PCI_ANY_ID to match all vendor ids
|
||||
* @device: PCI device id to match, or %PCI_ANY_ID to match all device ids
|
||||
* @from: Previous PCI device found in search, or %NULL for new search.
|
||||
*
|
||||
* Iterates through the list of known PCI devices in the reverse order of
|
||||
* pci_get_device.
|
||||
* If a PCI device is found with a matching @vendor and @device, the reference
|
||||
* count to the device is incremented and a pointer to its device structure
|
||||
* is returned Otherwise, %NULL is returned. A new search is initiated by
|
||||
* passing %NULL as the @from argument. Otherwise if @from is not %NULL,
|
||||
* searches continue from next device on the global list. The reference
|
||||
* count for @from is always decremented if it is not %NULL.
|
||||
*/
|
||||
struct pci_dev *
|
||||
pci_get_device_reverse(unsigned int vendor, unsigned int device, struct pci_dev *from)
|
||||
{
|
||||
struct list_head *n;
|
||||
struct pci_dev *dev;
|
||||
|
||||
WARN_ON(in_interrupt());
|
||||
down_read(&pci_bus_sem);
|
||||
n = from ? from->global_list.prev : pci_devices.prev;
|
||||
|
||||
while (n && (n != &pci_devices)) {
|
||||
dev = pci_dev_g(n);
|
||||
if ((vendor == PCI_ANY_ID || dev->vendor == vendor) &&
|
||||
(device == PCI_ANY_ID || dev->device == device))
|
||||
goto exit;
|
||||
n = n->prev;
|
||||
}
|
||||
dev = NULL;
|
||||
exit:
|
||||
dev = pci_dev_get(dev);
|
||||
up_read(&pci_bus_sem);
|
||||
pci_dev_put(from);
|
||||
return dev;
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_get_class - begin or continue searching for a PCI device by class
|
||||
* @class: search for a PCI device with this class designation
|
||||
|
@ -415,46 +365,21 @@ exit:
|
|||
*/
|
||||
struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from)
|
||||
{
|
||||
struct list_head *n;
|
||||
struct pci_dev *dev;
|
||||
struct pci_device_id *id;
|
||||
|
||||
WARN_ON(in_interrupt());
|
||||
down_read(&pci_bus_sem);
|
||||
n = from ? from->global_list.next : pci_devices.next;
|
||||
id = kzalloc(sizeof(*id), GFP_KERNEL);
|
||||
if (!id)
|
||||
return NULL;
|
||||
id->vendor = id->device = id->subvendor = id->subdevice = PCI_ANY_ID;
|
||||
id->class_mask = PCI_ANY_ID;
|
||||
id->class = class;
|
||||
|
||||
while (n && (n != &pci_devices)) {
|
||||
dev = pci_dev_g(n);
|
||||
if (dev->class == class)
|
||||
goto exit;
|
||||
n = n->next;
|
||||
}
|
||||
dev = NULL;
|
||||
exit:
|
||||
dev = pci_dev_get(dev);
|
||||
up_read(&pci_bus_sem);
|
||||
pci_dev_put(from);
|
||||
dev = pci_get_dev_by_id(id, from);
|
||||
kfree(id);
|
||||
return dev;
|
||||
}
|
||||
|
||||
const struct pci_device_id *pci_find_present(const struct pci_device_id *ids)
|
||||
{
|
||||
struct pci_dev *dev;
|
||||
const struct pci_device_id *found = NULL;
|
||||
|
||||
WARN_ON(in_interrupt());
|
||||
down_read(&pci_bus_sem);
|
||||
while (ids->vendor || ids->subvendor || ids->class_mask) {
|
||||
list_for_each_entry(dev, &pci_devices, global_list) {
|
||||
if ((found = pci_match_one_device(ids, dev)) != NULL)
|
||||
goto exit;
|
||||
}
|
||||
ids++;
|
||||
}
|
||||
exit:
|
||||
up_read(&pci_bus_sem);
|
||||
return found;
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_dev_present - Returns 1 if device matching the device list is present, 0 if not.
|
||||
* @ids: A pointer to a null terminated list of struct pci_device_id structures
|
||||
|
@ -468,23 +393,27 @@ exit:
|
|||
*/
|
||||
int pci_dev_present(const struct pci_device_id *ids)
|
||||
{
|
||||
return pci_find_present(ids) == NULL ? 0 : 1;
|
||||
struct pci_dev *found = NULL;
|
||||
|
||||
WARN_ON(in_interrupt());
|
||||
while (ids->vendor || ids->subvendor || ids->class_mask) {
|
||||
found = pci_get_dev_by_id(ids, NULL);
|
||||
if (found)
|
||||
goto exit;
|
||||
ids++;
|
||||
}
|
||||
exit:
|
||||
if (found)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(pci_dev_present);
|
||||
EXPORT_SYMBOL(pci_find_present);
|
||||
|
||||
#ifdef CONFIG_PCI_LEGACY
|
||||
EXPORT_SYMBOL(pci_find_device);
|
||||
EXPORT_SYMBOL(pci_find_slot);
|
||||
#endif /* CONFIG_PCI_LEGACY */
|
||||
|
||||
/* For boot time work */
|
||||
EXPORT_SYMBOL(pci_find_bus);
|
||||
EXPORT_SYMBOL(pci_find_next_bus);
|
||||
/* For everyone */
|
||||
EXPORT_SYMBOL(pci_get_device);
|
||||
EXPORT_SYMBOL(pci_get_device_reverse);
|
||||
EXPORT_SYMBOL(pci_get_subsys);
|
||||
EXPORT_SYMBOL(pci_get_slot);
|
||||
EXPORT_SYMBOL(pci_get_bus_and_slot);
|
||||
|
|
|
@ -65,6 +65,7 @@ static void pbus_assign_resources_sorted(struct pci_bus *bus)
|
|||
res = list->res;
|
||||
idx = res - &list->dev->resource[0];
|
||||
if (pci_assign_resource(list->dev, idx)) {
|
||||
/* FIXME: get rid of this */
|
||||
res->start = 0;
|
||||
res->end = 0;
|
||||
res->flags = 0;
|
||||
|
@ -144,8 +145,7 @@ EXPORT_SYMBOL(pci_setup_cardbus);
|
|||
config space writes, so it's quite possible that an I/O window of
|
||||
the bridge will have some undesirable address (e.g. 0) after the
|
||||
first write. Ditto 64-bit prefetchable MMIO. */
|
||||
static void __devinit
|
||||
pci_setup_bridge(struct pci_bus *bus)
|
||||
static void pci_setup_bridge(struct pci_bus *bus)
|
||||
{
|
||||
struct pci_dev *bridge = bus->self;
|
||||
struct pci_bus_region region;
|
||||
|
@ -327,6 +327,7 @@ static void pbus_size_io(struct pci_bus *bus)
|
|||
/* Alignment of the IO window is always 4K */
|
||||
b_res->start = 4096;
|
||||
b_res->end = b_res->start + size - 1;
|
||||
b_res->flags |= IORESOURCE_STARTALIGN;
|
||||
}
|
||||
|
||||
/* Calculate the size of the bus and minimal alignment which
|
||||
|
@ -401,11 +402,11 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask, unsigned long
|
|||
}
|
||||
b_res->start = min_align;
|
||||
b_res->end = size + min_align - 1;
|
||||
b_res->flags |= IORESOURCE_STARTALIGN;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void __devinit
|
||||
pci_bus_size_cardbus(struct pci_bus *bus)
|
||||
static void pci_bus_size_cardbus(struct pci_bus *bus)
|
||||
{
|
||||
struct pci_dev *bridge = bus->self;
|
||||
struct resource *b_res = &bridge->resource[PCI_BRIDGE_RESOURCES];
|
||||
|
|
|
@ -137,10 +137,16 @@ int pci_assign_resource(struct pci_dev *dev, int resno)
|
|||
|
||||
size = res->end - res->start + 1;
|
||||
min = (res->flags & IORESOURCE_IO) ? PCIBIOS_MIN_IO : PCIBIOS_MIN_MEM;
|
||||
/* The bridge resources are special, as their
|
||||
size != alignment. Sizing routines return
|
||||
required alignment in the "start" field. */
|
||||
align = (resno < PCI_BRIDGE_RESOURCES) ? size : res->start;
|
||||
|
||||
align = resource_alignment(res);
|
||||
if (!align) {
|
||||
printk(KERN_ERR "PCI: Cannot allocate resource (bogus "
|
||||
"alignment) %d [%llx:%llx] (flags %lx) of %s\n",
|
||||
resno, (unsigned long long)res->start,
|
||||
(unsigned long long)res->end, res->flags,
|
||||
pci_name(dev));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* First, try exact prefetching match.. */
|
||||
ret = pci_bus_alloc_resource(bus, res, size, align, min,
|
||||
|
@ -164,14 +170,16 @@ int pci_assign_resource(struct pci_dev *dev, int resno)
|
|||
res->flags & IORESOURCE_IO ? "I/O" : "mem",
|
||||
resno, (unsigned long long)size,
|
||||
(unsigned long long)res->start, pci_name(dev));
|
||||
} else if (resno < PCI_BRIDGE_RESOURCES) {
|
||||
pci_update_resource(dev, res, resno);
|
||||
} else {
|
||||
res->flags &= ~IORESOURCE_STARTALIGN;
|
||||
if (resno < PCI_BRIDGE_RESOURCES)
|
||||
pci_update_resource(dev, res, resno);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_EMBEDDED
|
||||
#if 0
|
||||
int pci_assign_resource_fixed(struct pci_dev *dev, int resno)
|
||||
{
|
||||
struct pci_bus *bus = dev->bus;
|
||||
|
@ -226,29 +234,25 @@ void pdev_sort_resources(struct pci_dev *dev, struct resource_list *head)
|
|||
if (r->flags & IORESOURCE_PCI_FIXED)
|
||||
continue;
|
||||
|
||||
r_align = r->end - r->start;
|
||||
|
||||
if (!(r->flags) || r->parent)
|
||||
continue;
|
||||
|
||||
r_align = resource_alignment(r);
|
||||
if (!r_align) {
|
||||
printk(KERN_WARNING "PCI: Ignore bogus resource %d "
|
||||
"[%llx:%llx] of %s\n",
|
||||
printk(KERN_WARNING "PCI: bogus alignment of resource "
|
||||
"%d [%llx:%llx] (flags %lx) of %s\n",
|
||||
i, (unsigned long long)r->start,
|
||||
(unsigned long long)r->end, pci_name(dev));
|
||||
(unsigned long long)r->end, r->flags,
|
||||
pci_name(dev));
|
||||
continue;
|
||||
}
|
||||
r_align = (i < PCI_BRIDGE_RESOURCES) ? r_align + 1 : r->start;
|
||||
for (list = head; ; list = list->next) {
|
||||
resource_size_t align = 0;
|
||||
struct resource_list *ln = list->next;
|
||||
int idx;
|
||||
|
||||
if (ln) {
|
||||
idx = ln->res - &ln->dev->resource[0];
|
||||
align = (idx < PCI_BRIDGE_RESOURCES) ?
|
||||
ln->res->end - ln->res->start + 1 :
|
||||
ln->res->start;
|
||||
}
|
||||
if (ln)
|
||||
align = resource_alignment(ln->res);
|
||||
|
||||
if (r_align > align) {
|
||||
tmp = kmalloc(sizeof(*tmp), GFP_KERNEL);
|
||||
if (!tmp)
|
||||
|
@ -263,3 +267,46 @@ void pdev_sort_resources(struct pci_dev *dev, struct resource_list *head)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
int pci_enable_resources(struct pci_dev *dev, int mask)
|
||||
{
|
||||
u16 cmd, old_cmd;
|
||||
int i;
|
||||
struct resource *r;
|
||||
|
||||
pci_read_config_word(dev, PCI_COMMAND, &cmd);
|
||||
old_cmd = cmd;
|
||||
|
||||
for (i = 0; i < PCI_NUM_RESOURCES; i++) {
|
||||
if (!(mask & (1 << i)))
|
||||
continue;
|
||||
|
||||
r = &dev->resource[i];
|
||||
|
||||
if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM)))
|
||||
continue;
|
||||
if ((i == PCI_ROM_RESOURCE) &&
|
||||
(!(r->flags & IORESOURCE_ROM_ENABLE)))
|
||||
continue;
|
||||
|
||||
if (!r->parent) {
|
||||
dev_err(&dev->dev, "device not available because of "
|
||||
"BAR %d [%llx:%llx] collisions\n", i,
|
||||
(unsigned long long) r->start,
|
||||
(unsigned long long) r->end);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (r->flags & IORESOURCE_IO)
|
||||
cmd |= PCI_COMMAND_IO;
|
||||
if (r->flags & IORESOURCE_MEM)
|
||||
cmd |= PCI_COMMAND_MEMORY;
|
||||
}
|
||||
|
||||
if (cmd != old_cmd) {
|
||||
dev_info(&dev->dev, "enabling device (%04x -> %04x)\n",
|
||||
old_cmd, cmd);
|
||||
pci_write_config_word(dev, PCI_COMMAND, cmd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -24,8 +24,6 @@
|
|||
#define PCI_PROBE_BIOS 1
|
||||
#define PCI_PROBE_CONF1 2
|
||||
#define PCI_PROBE_CONF2 4
|
||||
#define PCI_NO_SORT 0x100
|
||||
#define PCI_BIOS_SORT 0x200
|
||||
#define PCI_NO_CHECKS 0x400
|
||||
#define PCI_ASSIGN_ROMS 0x1000
|
||||
#define PCI_BIOS_IRQ_SCAN 0x2000
|
||||
|
|
|
@ -13,7 +13,6 @@ extern int pci_enable_pcie_error_reporting(struct pci_dev *dev);
|
|||
extern int pci_find_aer_capability(struct pci_dev *dev);
|
||||
extern int pci_disable_pcie_error_reporting(struct pci_dev *dev);
|
||||
extern int pci_cleanup_aer_uncorrect_error_status(struct pci_dev *dev);
|
||||
extern int pci_cleanup_aer_correct_error_status(struct pci_dev *dev);
|
||||
#else
|
||||
static inline int pci_enable_pcie_error_reporting(struct pci_dev *dev)
|
||||
{
|
||||
|
@ -31,10 +30,6 @@ static inline int pci_cleanup_aer_uncorrect_error_status(struct pci_dev *dev)
|
|||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
static inline int pci_cleanup_aer_correct_error_status(struct pci_dev *dev)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif //_AER_H_
|
||||
|
|
|
@ -44,7 +44,9 @@ struct resource_list {
|
|||
#define IORESOURCE_CACHEABLE 0x00004000
|
||||
#define IORESOURCE_RANGELENGTH 0x00008000
|
||||
#define IORESOURCE_SHADOWABLE 0x00010000
|
||||
#define IORESOURCE_BUS_HAS_VGA 0x00080000
|
||||
|
||||
#define IORESOURCE_SIZEALIGN 0x00020000 /* size indicates alignment */
|
||||
#define IORESOURCE_STARTALIGN 0x00040000 /* start field is alignment */
|
||||
|
||||
#define IORESOURCE_DISABLED 0x10000000
|
||||
#define IORESOURCE_UNSET 0x20000000
|
||||
|
@ -110,6 +112,7 @@ extern int allocate_resource(struct resource *root, struct resource *new,
|
|||
void *alignf_data);
|
||||
int adjust_resource(struct resource *res, resource_size_t start,
|
||||
resource_size_t size);
|
||||
resource_size_t resource_alignment(struct resource *res);
|
||||
|
||||
/* Convenience shorthand with allocation */
|
||||
#define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name))
|
||||
|
|
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
* aspm.h
|
||||
*
|
||||
* PCI Express ASPM defines and function prototypes
|
||||
*
|
||||
* Copyright (C) 2007 Intel Corp.
|
||||
* Zhang Yanmin (yanmin.zhang@intel.com)
|
||||
* Shaohua Li (shaohua.li@intel.com)
|
||||
*
|
||||
* For more information, please consult the following manuals (look at
|
||||
* http://www.pcisig.com/ for how to get them):
|
||||
*
|
||||
* PCI Express Specification
|
||||
*/
|
||||
|
||||
#ifndef LINUX_ASPM_H
|
||||
#define LINUX_ASPM_H
|
||||
|
||||
#include <linux/pci.h>
|
||||
|
||||
#define PCIE_LINK_STATE_L0S 1
|
||||
#define PCIE_LINK_STATE_L1 2
|
||||
#define PCIE_LINK_STATE_CLKPM 4
|
||||
|
||||
#ifdef CONFIG_PCIEASPM
|
||||
extern void pcie_aspm_init_link_state(struct pci_dev *pdev);
|
||||
extern void pcie_aspm_exit_link_state(struct pci_dev *pdev);
|
||||
extern void pcie_aspm_pm_state_change(struct pci_dev *pdev);
|
||||
extern void pci_disable_link_state(struct pci_dev *pdev, int state);
|
||||
#else
|
||||
static inline void pcie_aspm_init_link_state(struct pci_dev *pdev)
|
||||
{
|
||||
}
|
||||
static inline void pcie_aspm_exit_link_state(struct pci_dev *pdev)
|
||||
{
|
||||
}
|
||||
static inline void pcie_aspm_pm_state_change(struct pci_dev *pdev)
|
||||
{
|
||||
}
|
||||
static inline void pci_disable_link_state(struct pci_dev *pdev, int state)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PCIEASPM_DEBUG /* this depends on CONFIG_PCIEASPM */
|
||||
extern void pcie_aspm_create_sysfs_dev_files(struct pci_dev *pdev);
|
||||
extern void pcie_aspm_remove_sysfs_dev_files(struct pci_dev *pdev);
|
||||
#else
|
||||
static inline void pcie_aspm_create_sysfs_dev_files(struct pci_dev *pdev)
|
||||
{
|
||||
}
|
||||
static inline void pcie_aspm_remove_sysfs_dev_files(struct pci_dev *pdev)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
#endif /* LINUX_ASPM_H */
|
|
@ -20,6 +20,8 @@
|
|||
/* Include the pci register defines */
|
||||
#include <linux/pci_regs.h>
|
||||
|
||||
struct pci_vpd;
|
||||
|
||||
/*
|
||||
* The PCI interface treats multi-function devices as independent
|
||||
* devices. The slot/function address of each device is encoded
|
||||
|
@ -128,11 +130,11 @@ struct pci_cap_saved_state {
|
|||
u32 data[0];
|
||||
};
|
||||
|
||||
struct pcie_link_state;
|
||||
/*
|
||||
* The pci_dev structure is used to describe PCI devices.
|
||||
*/
|
||||
struct pci_dev {
|
||||
struct list_head global_list; /* node in list of all PCI devices */
|
||||
struct list_head bus_list; /* node in per-bus list */
|
||||
struct pci_bus *bus; /* bus this device is on */
|
||||
struct pci_bus *subordinate; /* bus this device bridges to */
|
||||
|
@ -165,6 +167,10 @@ struct pci_dev {
|
|||
this is D0-D3, D0 being fully functional,
|
||||
and D3 being off. */
|
||||
|
||||
#ifdef CONFIG_PCIEASPM
|
||||
struct pcie_link_state *link_state; /* ASPM link state. */
|
||||
#endif
|
||||
|
||||
pci_channel_state_t error_state; /* current connectivity state */
|
||||
struct device dev; /* Generic device interface */
|
||||
|
||||
|
@ -181,6 +187,7 @@ struct pci_dev {
|
|||
unsigned int transparent:1; /* Transparent PCI bridge */
|
||||
unsigned int multifunction:1;/* Part of multi-function device */
|
||||
/* keep track of device state */
|
||||
unsigned int is_added:1;
|
||||
unsigned int is_busmaster:1; /* device is busmaster */
|
||||
unsigned int no_msi:1; /* device may not use msi */
|
||||
unsigned int no_d1d2:1; /* only allow d0 or d3 */
|
||||
|
@ -201,11 +208,11 @@ struct pci_dev {
|
|||
#ifdef CONFIG_PCI_MSI
|
||||
struct list_head msi_list;
|
||||
#endif
|
||||
struct pci_vpd *vpd;
|
||||
};
|
||||
|
||||
extern struct pci_dev *alloc_pci_dev(void);
|
||||
|
||||
#define pci_dev_g(n) list_entry(n, struct pci_dev, global_list)
|
||||
#define pci_dev_b(n) list_entry(n, struct pci_dev, bus_list)
|
||||
#define to_pci_dev(n) container_of(n, struct pci_dev, dev)
|
||||
#define for_each_pci_dev(d) while ((d = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, d)) != NULL)
|
||||
|
@ -449,7 +456,6 @@ extern struct bus_type pci_bus_type;
|
|||
/* Do NOT directly access these two variables, unless you are arch specific pci
|
||||
* code, or pci core code. */
|
||||
extern struct list_head pci_root_buses; /* list of all known PCI buses */
|
||||
extern struct list_head pci_devices; /* list of all devices */
|
||||
/* Some device drivers need know if pci is initiated */
|
||||
extern int no_pci_devices(void);
|
||||
|
||||
|
@ -517,17 +523,13 @@ struct pci_bus *pci_find_next_bus(const struct pci_bus *from);
|
|||
|
||||
struct pci_dev *pci_get_device(unsigned int vendor, unsigned int device,
|
||||
struct pci_dev *from);
|
||||
struct pci_dev *pci_get_device_reverse(unsigned int vendor, unsigned int device,
|
||||
struct pci_dev *from);
|
||||
|
||||
struct pci_dev *pci_get_subsys(unsigned int vendor, unsigned int device,
|
||||
unsigned int ss_vendor, unsigned int ss_device,
|
||||
struct pci_dev *from);
|
||||
const struct pci_dev *from);
|
||||
struct pci_dev *pci_get_slot(struct pci_bus *bus, unsigned int devfn);
|
||||
struct pci_dev *pci_get_bus_and_slot(unsigned int bus, unsigned int devfn);
|
||||
struct pci_dev *pci_get_class(unsigned int class, struct pci_dev *from);
|
||||
int pci_dev_present(const struct pci_device_id *ids);
|
||||
const struct pci_device_id *pci_find_present(const struct pci_device_id *ids);
|
||||
|
||||
int pci_bus_read_config_byte(struct pci_bus *bus, unsigned int devfn,
|
||||
int where, u8 *val);
|
||||
|
@ -601,7 +603,6 @@ int pcie_get_readrq(struct pci_dev *dev);
|
|||
int pcie_set_readrq(struct pci_dev *dev, int rq);
|
||||
void pci_update_resource(struct pci_dev *dev, struct resource *res, int resno);
|
||||
int __must_check pci_assign_resource(struct pci_dev *dev, int i);
|
||||
int __must_check pci_assign_resource_fixed(struct pci_dev *dev, int i);
|
||||
int pci_select_bars(struct pci_dev *dev, unsigned long flags);
|
||||
|
||||
/* ROM control related routines */
|
||||
|
@ -626,6 +627,7 @@ int pci_claim_resource(struct pci_dev *, int);
|
|||
void pci_assign_unassigned_resources(void);
|
||||
void pdev_enable_device(struct pci_dev *);
|
||||
void pdev_sort_resources(struct pci_dev *, struct resource_list *);
|
||||
int pci_enable_resources(struct pci_dev *, int mask);
|
||||
void pci_fixup_irqs(u8 (*)(struct pci_dev *, u8 *),
|
||||
int (*)(struct pci_dev *, u8, u8));
|
||||
#define HAVE_PCI_REQ_REGIONS 2
|
||||
|
@ -793,18 +795,11 @@ static inline struct pci_dev *pci_get_device(unsigned int vendor,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct pci_dev *pci_get_device_reverse(unsigned int vendor,
|
||||
unsigned int device,
|
||||
struct pci_dev *from)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct pci_dev *pci_get_subsys(unsigned int vendor,
|
||||
unsigned int device,
|
||||
unsigned int ss_vendor,
|
||||
unsigned int ss_device,
|
||||
struct pci_dev *from)
|
||||
const struct pci_dev *from)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
@ -817,7 +812,6 @@ static inline struct pci_dev *pci_get_class(unsigned int class,
|
|||
|
||||
#define pci_dev_present(ids) (0)
|
||||
#define no_pci_devices() (1)
|
||||
#define pci_find_present(ids) (NULL)
|
||||
#define pci_dev_put(dev) do { } while (0)
|
||||
|
||||
static inline void pci_set_master(struct pci_dev *dev)
|
||||
|
|
|
@ -395,9 +395,17 @@
|
|||
#define PCI_EXP_DEVSTA_AUXPD 0x10 /* AUX Power Detected */
|
||||
#define PCI_EXP_DEVSTA_TRPND 0x20 /* Transactions Pending */
|
||||
#define PCI_EXP_LNKCAP 12 /* Link Capabilities */
|
||||
#define PCI_EXP_LNKCAP_ASPMS 0xc00 /* ASPM Support */
|
||||
#define PCI_EXP_LNKCAP_L0SEL 0x7000 /* L0s Exit Latency */
|
||||
#define PCI_EXP_LNKCAP_L1EL 0x38000 /* L1 Exit Latency */
|
||||
#define PCI_EXP_LNKCAP_CLKPM 0x40000 /* L1 Clock Power Management */
|
||||
#define PCI_EXP_LNKCTL 16 /* Link Control */
|
||||
#define PCI_EXP_LNKCTL_RL 0x20 /* Retrain Link */
|
||||
#define PCI_EXP_LNKCTL_CCC 0x40 /* Common Clock COnfiguration */
|
||||
#define PCI_EXP_LNKCTL_CLKREQ_EN 0x100 /* Enable clkreq */
|
||||
#define PCI_EXP_LNKSTA 18 /* Link Status */
|
||||
#define PCI_EXP_LNKSTA_LT 0x800 /* Link Training */
|
||||
#define PCI_EXP_LNKSTA_SLC 0x1000 /* Slot Clock Configuration */
|
||||
#define PCI_EXP_SLTCAP 20 /* Slot Capabilities */
|
||||
#define PCI_EXP_SLTCTL 24 /* Slot Control */
|
||||
#define PCI_EXP_SLTSTA 26 /* Slot Status */
|
||||
|
|
|
@ -486,6 +486,24 @@ int adjust_resource(struct resource *res, resource_size_t start, resource_size_t
|
|||
|
||||
EXPORT_SYMBOL(adjust_resource);
|
||||
|
||||
/**
|
||||
* resource_alignment - calculate resource's alignment
|
||||
* @res: resource pointer
|
||||
*
|
||||
* Returns alignment on success, 0 (invalid alignment) on failure.
|
||||
*/
|
||||
resource_size_t resource_alignment(struct resource *res)
|
||||
{
|
||||
switch (res->flags & (IORESOURCE_SIZEALIGN | IORESOURCE_STARTALIGN)) {
|
||||
case IORESOURCE_SIZEALIGN:
|
||||
return res->end - res->start + 1;
|
||||
case IORESOURCE_STARTALIGN:
|
||||
return res->start;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This is compatibility stuff for IO resources.
|
||||
*
|
||||
|
|
Загрузка…
Ссылка в новой задаче