kernel-ark/drivers
Inaky Perez-Gonzalez bae94d0237 PCI: switch pci_{enable,disable}_device() to be nestable
Changes the pci_{enable,disable}_device() functions to work in a
nested basis, so that eg, three calls to enable_device() require three
calls to disable_device().

The reason for this is to simplify PCI drivers for
multi-interface/capability devices. These are devices that cram more
than one interface in a single function. A relevant example of that is
the Wireless [USB] Host Controller Interface (similar to EHCI) [see
http://www.intel.com/technology/comms/wusb/whci.htm]. 

In these kind of devices, multiple interfaces are accessed through a
single bar and IRQ line. For that, the drivers map only the smallest
area of the bar to access their register banks and use shared IRQ
handlers. 

However, because the order at which those drivers load cannot be known
ahead of time, the sequence in which the calls to pci_enable_device()
and pci_disable_device() cannot be predicted. Thus:

1. driverA     starts     pci_enable_device()
2. driverB     starts     pci_enable_device()
3. driverA     shutdown   pci_disable_device()
4. driverB     shutdown   pci_disable_device()

between steps 3 and 4, driver B would loose access to it's device,
even if it didn't intend to.

By using this modification, the device won't be disabled until all the
callers to enable() have called disable().

This is implemented by replacing 'struct pci_dev->is_enabled' from a
bitfield to an atomic use count. Each caller to enable increments it,
each caller to disable decrements it. When the count increments from 0
to 1, __pci_enable_device() is called to actually enable the
device. When it drops to zero, pci_disable_device() actually does the
disabling.

We keep the backend __pci_enable_device() for pci_default_resume() to
use and also change the sysfs method implementation, so that userspace
enabling/disabling the device doesn't disable it one time too much.

Signed-off-by: Inaky Perez-Gonzalez <inaky@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2006-12-01 14:36:59 -08:00
..
acorn
acpi [PATCH] Correct bound checking from the value returned from _PPC method. 2006-11-23 09:18:55 -08:00
amba
ata [PATCH] libata: Fixup ata_sas_queuecmd to handle __ata_scsi_queuecmd failure 2006-11-28 03:51:55 -05:00
atm
base [PATCH] Fix device_attribute memory leak in device_del 2006-11-25 13:28:33 -08:00
block
bluetooth
cdrom
char [PATCH] tlclk: fix platform_device_register_simple() error check 2006-11-25 13:28:34 -08:00
clocksource
connector
cpufreq [PATCH] Fix CPU_FREQ_GOV_ONDEMAND=y compile error 2006-11-21 14:07:15 -08:00
crypto
dio
dma
edac
eisa
fc4
firmware
hwmon
i2c [PATCH] Fix i2c-ixp4xx compile (missing brace) 2006-11-23 09:27:49 -08:00
ide [PATCH] sgiioc4: Disable module unload 2006-11-25 13:28:34 -08:00
ieee1394
infiniband IB/ipath: Depend on CONFIG_NET 2006-11-20 13:06:19 -08:00
input
isdn
leds
macintosh
mca
md
media V4L/DVB (4874): Fix oops on symbol rate==0 2006-11-26 11:02:43 -02:00
message
mfd
misc
mmc
mtd [PATCH] Fix Intel/Sharp command set erase suspend bug 2006-11-28 17:26:50 -08:00
net [PATCH] r8169: Fix iteration variable sign 2006-11-29 13:45:07 -08:00
nubus
oprofile
parisc
parport
pci PCI: switch pci_{enable,disable}_device() to be nestable 2006-12-01 14:36:59 -08:00
pcmcia [PATCH] fix "pcmcia: fix 'rmmod pcmcia' with unbound devices" 2006-11-25 13:28:33 -08:00
pnp
rapidio
rtc [PATCH] drivers/rtc/rtc-rs5c372.c: fix a NULL dereference 2006-11-25 13:28:33 -08:00
s390
sbus
scsi
serial
sh
sn
spi
tc
telephony
usb [PATCH] usb: ati remote memleak fix 2006-11-25 13:28:34 -08:00
video
w1
zorro
Kconfig
Makefile