Merge of rsync://rsync.kernel.org/pub/scm/linux/kernel/git/gregkh/pci-2.6.git/
This commit is contained in:
commit
742b0c905d
|
@ -279,6 +279,7 @@ pci_for_each_dev_reverse() Superseded by pci_find_device_reverse()
|
||||||
pci_for_each_bus() Superseded by pci_find_next_bus()
|
pci_for_each_bus() Superseded by pci_find_next_bus()
|
||||||
pci_find_device() Superseded by pci_get_device()
|
pci_find_device() Superseded by pci_get_device()
|
||||||
pci_find_subsys() Superseded by pci_get_subsys()
|
pci_find_subsys() Superseded by pci_get_subsys()
|
||||||
|
pci_find_slot() Superseded by pci_get_slot()
|
||||||
pcibios_find_class() Superseded by pci_get_class()
|
pcibios_find_class() Superseded by pci_get_class()
|
||||||
pci_find_class() Superseded by pci_get_class()
|
pci_find_class() Superseded by pci_get_class()
|
||||||
pci_(read|write)_*_nodev() Superseded by pci_bus_(read|write)_*()
|
pci_(read|write)_*_nodev() Superseded by pci_bus_(read|write)_*()
|
||||||
|
|
|
@ -165,40 +165,9 @@ Description:
|
||||||
These functions are intended for use by individual drivers, and are defined in
|
These functions are intended for use by individual drivers, and are defined in
|
||||||
struct pci_driver:
|
struct pci_driver:
|
||||||
|
|
||||||
int (*save_state) (struct pci_dev *dev, u32 state);
|
int (*suspend) (struct pci_dev *dev, pm_message_t state);
|
||||||
int (*suspend) (struct pci_dev *dev, u32 state);
|
|
||||||
int (*resume) (struct pci_dev *dev);
|
int (*resume) (struct pci_dev *dev);
|
||||||
int (*enable_wake) (struct pci_dev *dev, u32 state, int enable);
|
int (*enable_wake) (struct pci_dev *dev, pci_power_t state, int enable);
|
||||||
|
|
||||||
|
|
||||||
save_state
|
|
||||||
----------
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
|
|
||||||
if (dev->driver && dev->driver->save_state)
|
|
||||||
dev->driver->save_state(dev,state);
|
|
||||||
|
|
||||||
The driver should use this callback to save device state. It should take into
|
|
||||||
account the current state of the device and the requested state in order to
|
|
||||||
avoid any unnecessary operations.
|
|
||||||
|
|
||||||
For example, a video card that supports all 4 states (D0-D3), all controller
|
|
||||||
context is preserved when entering D1, but the screen is placed into a low power
|
|
||||||
state (blanked).
|
|
||||||
|
|
||||||
The driver can also interpret this function as a notification that it may be
|
|
||||||
entering a sleep state in the near future. If it knows that the device cannot
|
|
||||||
enter the requested state, either because of lack of support for it, or because
|
|
||||||
the device is middle of some critical operation, then it should fail.
|
|
||||||
|
|
||||||
This function should not be used to set any state in the device or the driver
|
|
||||||
because the device may not actually enter the sleep state (e.g. another driver
|
|
||||||
later causes causes a global state transition to fail).
|
|
||||||
|
|
||||||
Note that in intermediate low power states, a device's I/O and memory spaces may
|
|
||||||
be disabled and may not be available in subsequent transitions to lower power
|
|
||||||
states.
|
|
||||||
|
|
||||||
|
|
||||||
suspend
|
suspend
|
||||||
|
|
|
@ -501,15 +501,6 @@ pci_set_dma_mask(struct pci_dev *dev, u64 mask)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
pci_dac_set_dma_mask(struct pci_dev *dev, u64 mask)
|
|
||||||
{
|
|
||||||
if (mask >= SZ_64M - 1 )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
|
pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
|
||||||
{
|
{
|
||||||
|
@ -520,7 +511,6 @@ pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(pci_set_dma_mask);
|
EXPORT_SYMBOL(pci_set_dma_mask);
|
||||||
EXPORT_SYMBOL(pci_dac_set_dma_mask);
|
|
||||||
EXPORT_SYMBOL(pci_set_consistent_dma_mask);
|
EXPORT_SYMBOL(pci_set_consistent_dma_mask);
|
||||||
EXPORT_SYMBOL(ixp4xx_pci_read);
|
EXPORT_SYMBOL(ixp4xx_pci_read);
|
||||||
EXPORT_SYMBOL(ixp4xx_pci_write);
|
EXPORT_SYMBOL(ixp4xx_pci_write);
|
||||||
|
|
|
@ -196,7 +196,7 @@ struct ebda_hpc_bus {
|
||||||
|
|
||||||
|
|
||||||
/********************************************************************
|
/********************************************************************
|
||||||
* THREE TYPE OF HOT PLUG CONTROLER *
|
* THREE TYPE OF HOT PLUG CONTROLLER *
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
struct isa_ctlr_access {
|
struct isa_ctlr_access {
|
||||||
|
|
|
@ -64,7 +64,7 @@ static int to_debug = FALSE;
|
||||||
#define WPG_I2C_OR 0x2000 // I2C OR operation
|
#define WPG_I2C_OR 0x2000 // I2C OR operation
|
||||||
|
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
// Command set for I2C Master Operation Setup Regisetr
|
// Command set for I2C Master Operation Setup Register
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
#define WPG_READATADDR_MASK 0x00010000 // read,bytes,I2C shifted,index
|
#define WPG_READATADDR_MASK 0x00010000 // read,bytes,I2C shifted,index
|
||||||
#define WPG_WRITEATADDR_MASK 0x40010000 // write,bytes,I2C shifted,index
|
#define WPG_WRITEATADDR_MASK 0x40010000 // write,bytes,I2C shifted,index
|
||||||
|
@ -835,7 +835,7 @@ static void poll_hpc (void)
|
||||||
if (ibmphp_shutdown)
|
if (ibmphp_shutdown)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* try to get the lock to do some kind of harware access */
|
/* try to get the lock to do some kind of hardware access */
|
||||||
down (&semOperations);
|
down (&semOperations);
|
||||||
|
|
||||||
switch (poll_state) {
|
switch (poll_state) {
|
||||||
|
@ -906,7 +906,7 @@ static void poll_hpc (void)
|
||||||
poll_state = POLL_LATCH_REGISTER;
|
poll_state = POLL_LATCH_REGISTER;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* give up the harware semaphore */
|
/* give up the hardware semaphore */
|
||||||
up (&semOperations);
|
up (&semOperations);
|
||||||
/* sleep for a short time just for good measure */
|
/* sleep for a short time just for good measure */
|
||||||
msleep(100);
|
msleep(100);
|
||||||
|
|
|
@ -1308,10 +1308,10 @@ static int unconfigure_boot_device (u8 busno, u8 device, u8 function)
|
||||||
/* ????????? DO WE NEED TO WRITE ANYTHING INTO THE PCI CONFIG SPACE BACK ?????????? */
|
/* ????????? DO WE NEED TO WRITE ANYTHING INTO THE PCI CONFIG SPACE BACK ?????????? */
|
||||||
} else {
|
} else {
|
||||||
/* This is Memory */
|
/* This is Memory */
|
||||||
start_address &= PCI_BASE_ADDRESS_MEM_MASK;
|
|
||||||
if (start_address & PCI_BASE_ADDRESS_MEM_PREFETCH) {
|
if (start_address & PCI_BASE_ADDRESS_MEM_PREFETCH) {
|
||||||
/* pfmem */
|
/* pfmem */
|
||||||
debug ("start address of pfmem is %x\n", start_address);
|
debug ("start address of pfmem is %x\n", start_address);
|
||||||
|
start_address &= PCI_BASE_ADDRESS_MEM_MASK;
|
||||||
|
|
||||||
if (ibmphp_find_resource (bus, start_address, &pfmem, PFMEM) < 0) {
|
if (ibmphp_find_resource (bus, start_address, &pfmem, PFMEM) < 0) {
|
||||||
err ("cannot find corresponding PFMEM resource to remove\n");
|
err ("cannot find corresponding PFMEM resource to remove\n");
|
||||||
|
@ -1325,6 +1325,8 @@ static int unconfigure_boot_device (u8 busno, u8 device, u8 function)
|
||||||
} else {
|
} else {
|
||||||
/* regular memory */
|
/* regular memory */
|
||||||
debug ("start address of mem is %x\n", start_address);
|
debug ("start address of mem is %x\n", start_address);
|
||||||
|
start_address &= PCI_BASE_ADDRESS_MEM_MASK;
|
||||||
|
|
||||||
if (ibmphp_find_resource (bus, start_address, &mem, MEM) < 0) {
|
if (ibmphp_find_resource (bus, start_address, &mem, MEM) < 0) {
|
||||||
err ("cannot find corresponding MEM resource to remove\n");
|
err ("cannot find corresponding MEM resource to remove\n");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
@ -1422,9 +1424,9 @@ static int unconfigure_boot_bridge (u8 busno, u8 device, u8 function)
|
||||||
/* ????????? DO WE NEED TO WRITE ANYTHING INTO THE PCI CONFIG SPACE BACK ?????????? */
|
/* ????????? DO WE NEED TO WRITE ANYTHING INTO THE PCI CONFIG SPACE BACK ?????????? */
|
||||||
} else {
|
} else {
|
||||||
/* This is Memory */
|
/* This is Memory */
|
||||||
start_address &= PCI_BASE_ADDRESS_MEM_MASK;
|
|
||||||
if (start_address & PCI_BASE_ADDRESS_MEM_PREFETCH) {
|
if (start_address & PCI_BASE_ADDRESS_MEM_PREFETCH) {
|
||||||
/* pfmem */
|
/* pfmem */
|
||||||
|
start_address &= PCI_BASE_ADDRESS_MEM_MASK;
|
||||||
if (ibmphp_find_resource (bus, start_address, &pfmem, PFMEM) < 0) {
|
if (ibmphp_find_resource (bus, start_address, &pfmem, PFMEM) < 0) {
|
||||||
err ("cannot find corresponding PFMEM resource to remove\n");
|
err ("cannot find corresponding PFMEM resource to remove\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -1436,6 +1438,7 @@ static int unconfigure_boot_bridge (u8 busno, u8 device, u8 function)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* regular memory */
|
/* regular memory */
|
||||||
|
start_address &= PCI_BASE_ADDRESS_MEM_MASK;
|
||||||
if (ibmphp_find_resource (bus, start_address, &mem, MEM) < 0) {
|
if (ibmphp_find_resource (bus, start_address, &mem, MEM) < 0) {
|
||||||
err ("cannot find corresponding MEM resource to remove\n");
|
err ("cannot find corresponding MEM resource to remove\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
@ -150,7 +150,7 @@ struct hotplug_slot_info {
|
||||||
* @name: the name of the slot being registered. This string must
|
* @name: the name of the slot being registered. This string must
|
||||||
* be unique amoung slots registered on this system.
|
* be unique amoung slots registered on this system.
|
||||||
* @ops: pointer to the &struct hotplug_slot_ops to be used for this slot
|
* @ops: pointer to the &struct hotplug_slot_ops to be used for this slot
|
||||||
* @info: pointer to the &struct hotplug_slot_info for the inital values for
|
* @info: pointer to the &struct hotplug_slot_info for the initial values for
|
||||||
* this slot.
|
* this slot.
|
||||||
* @release: called during pci_hp_deregister to free memory allocated in a
|
* @release: called during pci_hp_deregister to free memory allocated in a
|
||||||
* hotplug_slot structure.
|
* hotplug_slot structure.
|
||||||
|
|
|
@ -90,6 +90,22 @@ static struct hotplug_slot_ops pciehp_hotplug_slot_ops = {
|
||||||
.get_cur_bus_speed = get_cur_bus_speed,
|
.get_cur_bus_speed = get_cur_bus_speed,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* release_slot - free up the memory used by a slot
|
||||||
|
* @hotplug_slot: slot to free
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
|
||||||
|
kfree(slot->hotplug_slot->info);
|
||||||
|
kfree(slot->hotplug_slot->name);
|
||||||
|
kfree(slot->hotplug_slot);
|
||||||
|
kfree(slot);
|
||||||
|
}
|
||||||
|
|
||||||
static int init_slots(struct controller *ctrl)
|
static int init_slots(struct controller *ctrl)
|
||||||
{
|
{
|
||||||
struct slot *new_slot;
|
struct slot *new_slot;
|
||||||
|
@ -139,7 +155,8 @@ static int init_slots(struct controller *ctrl)
|
||||||
|
|
||||||
/* register this slot with the hotplug pci core */
|
/* register this slot with the hotplug pci core */
|
||||||
new_slot->hotplug_slot->private = new_slot;
|
new_slot->hotplug_slot->private = new_slot;
|
||||||
make_slot_name (new_slot->hotplug_slot->name, SLOT_NAME_SIZE, new_slot);
|
new_slot->hotplug_slot->release = &release_slot;
|
||||||
|
make_slot_name(new_slot->hotplug_slot->name, SLOT_NAME_SIZE, new_slot);
|
||||||
new_slot->hotplug_slot->ops = &pciehp_hotplug_slot_ops;
|
new_slot->hotplug_slot->ops = &pciehp_hotplug_slot_ops;
|
||||||
|
|
||||||
new_slot->hpc_ops->get_power_status(new_slot, &(new_slot->hotplug_slot->info->power_status));
|
new_slot->hpc_ops->get_power_status(new_slot, &(new_slot->hotplug_slot->info->power_status));
|
||||||
|
@ -188,10 +205,6 @@ static int cleanup_slots (struct controller * ctrl)
|
||||||
while (old_slot) {
|
while (old_slot) {
|
||||||
next_slot = old_slot->next;
|
next_slot = old_slot->next;
|
||||||
pci_hp_deregister (old_slot->hotplug_slot);
|
pci_hp_deregister (old_slot->hotplug_slot);
|
||||||
kfree(old_slot->hotplug_slot->info);
|
|
||||||
kfree(old_slot->hotplug_slot->name);
|
|
||||||
kfree(old_slot->hotplug_slot);
|
|
||||||
kfree(old_slot);
|
|
||||||
old_slot = next_slot;
|
old_slot = next_slot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -297,7 +297,7 @@ static int __init init_slots(void)
|
||||||
hotplug_slot->ops = &skel_hotplug_slot_ops;
|
hotplug_slot->ops = &skel_hotplug_slot_ops;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initilize the slot info structure with some known
|
* Initialize the slot info structure with some known
|
||||||
* good values.
|
* good values.
|
||||||
*/
|
*/
|
||||||
info->power_status = get_power_status(slot);
|
info->power_status = get_power_status(slot);
|
||||||
|
|
|
@ -522,7 +522,7 @@ void pci_scan_msi_device(struct pci_dev *dev)
|
||||||
* msi_capability_init - configure device's MSI capability structure
|
* msi_capability_init - configure device's MSI capability structure
|
||||||
* @dev: pointer to the pci_dev data structure of MSI device function
|
* @dev: pointer to the pci_dev data structure of MSI device function
|
||||||
*
|
*
|
||||||
* Setup the MSI capability structure of device funtion with a single
|
* Setup the MSI capability structure of device function with a single
|
||||||
* MSI vector, regardless of device function is capable of handling
|
* MSI vector, regardless of device function is capable of handling
|
||||||
* multiple messages. A return of zero indicates the successful setup
|
* multiple messages. A return of zero indicates the successful setup
|
||||||
* of an entry zero with the new MSI vector or non-zero for otherwise.
|
* of an entry zero with the new MSI vector or non-zero for otherwise.
|
||||||
|
@ -599,7 +599,7 @@ static int msi_capability_init(struct pci_dev *dev)
|
||||||
* msix_capability_init - configure device's MSI-X capability
|
* msix_capability_init - configure device's MSI-X capability
|
||||||
* @dev: pointer to the pci_dev data structure of MSI-X device function
|
* @dev: pointer to the pci_dev data structure of MSI-X device function
|
||||||
*
|
*
|
||||||
* Setup the MSI-X capability structure of device funtion with a
|
* Setup the MSI-X capability structure of device function with a
|
||||||
* single MSI-X vector. A return of zero indicates the successful setup of
|
* single MSI-X vector. A return of zero indicates the successful setup of
|
||||||
* requested MSI-X entries with allocated vectors or non-zero for otherwise.
|
* requested MSI-X entries with allocated vectors or non-zero for otherwise.
|
||||||
**/
|
**/
|
||||||
|
@ -1074,7 +1074,7 @@ void pci_disable_msix(struct pci_dev* dev)
|
||||||
* msi_remove_pci_irq_vectors - reclaim MSI(X) vectors to unused state
|
* msi_remove_pci_irq_vectors - reclaim MSI(X) vectors to unused state
|
||||||
* @dev: pointer to the pci_dev data structure of MSI(X) device function
|
* @dev: pointer to the pci_dev data structure of MSI(X) device function
|
||||||
*
|
*
|
||||||
* Being called during hotplug remove, from which the device funciton
|
* Being called during hotplug remove, from which the device function
|
||||||
* is hot-removed. All previous assigned MSI/MSI-X vectors, if
|
* is hot-removed. All previous assigned MSI/MSI-X vectors, if
|
||||||
* allocated for this device function, are reclaimed to unused state,
|
* allocated for this device function, are reclaimed to unused state,
|
||||||
* which may be used later on.
|
* which may be used later on.
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
static u32 ctrlset_buf[3] = {0, 0, 0};
|
static u32 ctrlset_buf[3] = {0, 0, 0};
|
||||||
static u32 global_ctrlsets = 0;
|
static u32 global_ctrlsets = 0;
|
||||||
u8 OSC_UUID[16] = {0x5B, 0x4D, 0xDB, 0x33, 0xF7, 0x1F, 0x1C, 0x40, 0x96, 0x57, 0x74, 0x41, 0xC0, 0x3D, 0xD7, 0x66};
|
static u8 OSC_UUID[16] = {0x5B, 0x4D, 0xDB, 0x33, 0xF7, 0x1F, 0x1C, 0x40, 0x96, 0x57, 0x74, 0x41, 0xC0, 0x3D, 0xD7, 0x66};
|
||||||
|
|
||||||
static acpi_status
|
static acpi_status
|
||||||
acpi_query_osc (
|
acpi_query_osc (
|
||||||
|
|
|
@ -318,6 +318,14 @@ static int pci_device_resume(struct device * dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void pci_device_shutdown(struct device *dev)
|
||||||
|
{
|
||||||
|
struct pci_dev *pci_dev = to_pci_dev(dev);
|
||||||
|
struct pci_driver *drv = pci_dev->driver;
|
||||||
|
|
||||||
|
if (drv && drv->shutdown)
|
||||||
|
drv->shutdown(pci_dev);
|
||||||
|
}
|
||||||
|
|
||||||
#define kobj_to_pci_driver(obj) container_of(obj, struct device_driver, kobj)
|
#define kobj_to_pci_driver(obj) container_of(obj, struct device_driver, kobj)
|
||||||
#define attr_to_driver_attribute(obj) container_of(obj, struct driver_attribute, attr)
|
#define attr_to_driver_attribute(obj) container_of(obj, struct driver_attribute, attr)
|
||||||
|
@ -373,7 +381,7 @@ pci_populate_driver_dir(struct pci_driver *drv)
|
||||||
*
|
*
|
||||||
* Adds the driver structure to the list of registered drivers.
|
* Adds the driver structure to the list of registered drivers.
|
||||||
* Returns a negative value on error, otherwise 0.
|
* Returns a negative value on error, otherwise 0.
|
||||||
* If no error occured, the driver remains registered even if
|
* If no error occurred, the driver remains registered even if
|
||||||
* no device was claimed during registration.
|
* no device was claimed during registration.
|
||||||
*/
|
*/
|
||||||
int pci_register_driver(struct pci_driver *drv)
|
int pci_register_driver(struct pci_driver *drv)
|
||||||
|
@ -385,6 +393,7 @@ int pci_register_driver(struct pci_driver *drv)
|
||||||
drv->driver.bus = &pci_bus_type;
|
drv->driver.bus = &pci_bus_type;
|
||||||
drv->driver.probe = pci_device_probe;
|
drv->driver.probe = pci_device_probe;
|
||||||
drv->driver.remove = pci_device_remove;
|
drv->driver.remove = pci_device_remove;
|
||||||
|
drv->driver.shutdown = pci_device_shutdown,
|
||||||
drv->driver.owner = drv->owner;
|
drv->driver.owner = drv->owner;
|
||||||
drv->driver.kobj.ktype = &pci_driver_kobj_type;
|
drv->driver.kobj.ktype = &pci_driver_kobj_type;
|
||||||
pci_init_dynids(&drv->dynids);
|
pci_init_dynids(&drv->dynids);
|
||||||
|
|
|
@ -91,6 +91,7 @@ pci_read_config(struct kobject *kobj, char *buf, loff_t off, size_t count)
|
||||||
struct pci_dev *dev = to_pci_dev(container_of(kobj,struct device,kobj));
|
struct pci_dev *dev = to_pci_dev(container_of(kobj,struct device,kobj));
|
||||||
unsigned int size = 64;
|
unsigned int size = 64;
|
||||||
loff_t init_off = off;
|
loff_t init_off = off;
|
||||||
|
u8 *data = (u8*) buf;
|
||||||
|
|
||||||
/* Several chips lock up trying to read undefined config space */
|
/* Several chips lock up trying to read undefined config space */
|
||||||
if (capable(CAP_SYS_ADMIN)) {
|
if (capable(CAP_SYS_ADMIN)) {
|
||||||
|
@ -108,30 +109,47 @@ pci_read_config(struct kobject *kobj, char *buf, loff_t off, size_t count)
|
||||||
size = count;
|
size = count;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (off & 3) {
|
if ((off & 1) && size) {
|
||||||
unsigned char val;
|
u8 val;
|
||||||
pci_read_config_byte(dev, off, &val);
|
pci_read_config_byte(dev, off, &val);
|
||||||
buf[off - init_off] = val;
|
data[off - init_off] = val;
|
||||||
off++;
|
off++;
|
||||||
if (--size == 0)
|
size--;
|
||||||
break;
|
}
|
||||||
|
|
||||||
|
if ((off & 3) && size > 2) {
|
||||||
|
u16 val;
|
||||||
|
pci_read_config_word(dev, off, &val);
|
||||||
|
data[off - init_off] = val & 0xff;
|
||||||
|
data[off - init_off + 1] = (val >> 8) & 0xff;
|
||||||
|
off += 2;
|
||||||
|
size -= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (size > 3) {
|
while (size > 3) {
|
||||||
unsigned int val;
|
u32 val;
|
||||||
pci_read_config_dword(dev, off, &val);
|
pci_read_config_dword(dev, off, &val);
|
||||||
buf[off - init_off] = val & 0xff;
|
data[off - init_off] = val & 0xff;
|
||||||
buf[off - init_off + 1] = (val >> 8) & 0xff;
|
data[off - init_off + 1] = (val >> 8) & 0xff;
|
||||||
buf[off - init_off + 2] = (val >> 16) & 0xff;
|
data[off - init_off + 2] = (val >> 16) & 0xff;
|
||||||
buf[off - init_off + 3] = (val >> 24) & 0xff;
|
data[off - init_off + 3] = (val >> 24) & 0xff;
|
||||||
off += 4;
|
off += 4;
|
||||||
size -= 4;
|
size -= 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (size > 0) {
|
if (size >= 2) {
|
||||||
unsigned char val;
|
u16 val;
|
||||||
|
pci_read_config_word(dev, off, &val);
|
||||||
|
data[off - init_off] = val & 0xff;
|
||||||
|
data[off - init_off + 1] = (val >> 8) & 0xff;
|
||||||
|
off += 2;
|
||||||
|
size -= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size > 0) {
|
||||||
|
u8 val;
|
||||||
pci_read_config_byte(dev, off, &val);
|
pci_read_config_byte(dev, off, &val);
|
||||||
buf[off - init_off] = val;
|
data[off - init_off] = val;
|
||||||
off++;
|
off++;
|
||||||
--size;
|
--size;
|
||||||
}
|
}
|
||||||
|
@ -145,6 +163,7 @@ pci_write_config(struct kobject *kobj, char *buf, loff_t off, size_t count)
|
||||||
struct pci_dev *dev = to_pci_dev(container_of(kobj,struct device,kobj));
|
struct pci_dev *dev = to_pci_dev(container_of(kobj,struct device,kobj));
|
||||||
unsigned int size = count;
|
unsigned int size = count;
|
||||||
loff_t init_off = off;
|
loff_t init_off = off;
|
||||||
|
u8 *data = (u8*) buf;
|
||||||
|
|
||||||
if (off > dev->cfg_size)
|
if (off > dev->cfg_size)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -152,26 +171,41 @@ pci_write_config(struct kobject *kobj, char *buf, loff_t off, size_t count)
|
||||||
size = dev->cfg_size - off;
|
size = dev->cfg_size - off;
|
||||||
count = size;
|
count = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (off & 3) {
|
if ((off & 1) && size) {
|
||||||
pci_write_config_byte(dev, off, buf[off - init_off]);
|
pci_write_config_byte(dev, off, data[off - init_off]);
|
||||||
off++;
|
off++;
|
||||||
if (--size == 0)
|
size--;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((off & 3) && size > 2) {
|
||||||
|
u16 val = data[off - init_off];
|
||||||
|
val |= (u16) data[off - init_off + 1] << 8;
|
||||||
|
pci_write_config_word(dev, off, val);
|
||||||
|
off += 2;
|
||||||
|
size -= 2;
|
||||||
|
}
|
||||||
|
|
||||||
while (size > 3) {
|
while (size > 3) {
|
||||||
unsigned int val = buf[off - init_off];
|
u32 val = data[off - init_off];
|
||||||
val |= (unsigned int) buf[off - init_off + 1] << 8;
|
val |= (u32) data[off - init_off + 1] << 8;
|
||||||
val |= (unsigned int) buf[off - init_off + 2] << 16;
|
val |= (u32) data[off - init_off + 2] << 16;
|
||||||
val |= (unsigned int) buf[off - init_off + 3] << 24;
|
val |= (u32) data[off - init_off + 3] << 24;
|
||||||
pci_write_config_dword(dev, off, val);
|
pci_write_config_dword(dev, off, val);
|
||||||
off += 4;
|
off += 4;
|
||||||
size -= 4;
|
size -= 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (size >= 2) {
|
||||||
|
u16 val = data[off - init_off];
|
||||||
|
val |= (u16) data[off - init_off + 1] << 8;
|
||||||
|
pci_write_config_word(dev, off, val);
|
||||||
|
off += 2;
|
||||||
|
size -= 2;
|
||||||
|
}
|
||||||
|
|
||||||
while (size > 0) {
|
if (size) {
|
||||||
pci_write_config_byte(dev, off, buf[off - init_off]);
|
pci_write_config_byte(dev, off, data[off - init_off]);
|
||||||
off++;
|
off++;
|
||||||
--size;
|
--size;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <asm/dma.h> /* isa_dma_bridge_buggy */
|
#include <asm/dma.h> /* isa_dma_bridge_buggy */
|
||||||
|
#include "pci.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -398,10 +399,10 @@ pci_enable_device(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
dev->is_enabled = 1;
|
|
||||||
if ((err = pci_enable_device_bars(dev, (1 << PCI_NUM_RESOURCES) - 1)))
|
if ((err = pci_enable_device_bars(dev, (1 << PCI_NUM_RESOURCES) - 1)))
|
||||||
return err;
|
return err;
|
||||||
pci_fixup_device(pci_fixup_enable, dev);
|
pci_fixup_device(pci_fixup_enable, dev);
|
||||||
|
dev->is_enabled = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -427,16 +428,15 @@ pci_disable_device(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
u16 pci_command;
|
u16 pci_command;
|
||||||
|
|
||||||
dev->is_enabled = 0;
|
|
||||||
dev->is_busmaster = 0;
|
|
||||||
|
|
||||||
pci_read_config_word(dev, PCI_COMMAND, &pci_command);
|
pci_read_config_word(dev, PCI_COMMAND, &pci_command);
|
||||||
if (pci_command & PCI_COMMAND_MASTER) {
|
if (pci_command & PCI_COMMAND_MASTER) {
|
||||||
pci_command &= ~PCI_COMMAND_MASTER;
|
pci_command &= ~PCI_COMMAND_MASTER;
|
||||||
pci_write_config_word(dev, PCI_COMMAND, pci_command);
|
pci_write_config_word(dev, PCI_COMMAND, pci_command);
|
||||||
}
|
}
|
||||||
|
dev->is_busmaster = 0;
|
||||||
|
|
||||||
pcibios_disable_device(dev);
|
pcibios_disable_device(dev);
|
||||||
|
dev->is_enabled = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -748,17 +748,6 @@ pci_set_dma_mask(struct pci_dev *dev, u64 mask)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
pci_dac_set_dma_mask(struct pci_dev *dev, u64 mask)
|
|
||||||
{
|
|
||||||
if (!pci_dac_dma_supported(dev, mask))
|
|
||||||
return -EIO;
|
|
||||||
|
|
||||||
dev->dma_mask = mask;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
|
pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
|
||||||
{
|
{
|
||||||
|
@ -821,7 +810,6 @@ EXPORT_SYMBOL(pci_set_master);
|
||||||
EXPORT_SYMBOL(pci_set_mwi);
|
EXPORT_SYMBOL(pci_set_mwi);
|
||||||
EXPORT_SYMBOL(pci_clear_mwi);
|
EXPORT_SYMBOL(pci_clear_mwi);
|
||||||
EXPORT_SYMBOL(pci_set_dma_mask);
|
EXPORT_SYMBOL(pci_set_dma_mask);
|
||||||
EXPORT_SYMBOL(pci_dac_set_dma_mask);
|
|
||||||
EXPORT_SYMBOL(pci_set_consistent_dma_mask);
|
EXPORT_SYMBOL(pci_set_consistent_dma_mask);
|
||||||
EXPORT_SYMBOL(pci_assign_resource);
|
EXPORT_SYMBOL(pci_assign_resource);
|
||||||
EXPORT_SYMBOL(pci_find_parent_resource);
|
EXPORT_SYMBOL(pci_find_parent_resource);
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/cpumask.h>
|
#include <linux/cpumask.h>
|
||||||
|
#include "pci.h"
|
||||||
|
|
||||||
#define CARDBUS_LATENCY_TIMER 176 /* secondary latency timer */
|
#define CARDBUS_LATENCY_TIMER 176 /* secondary latency timer */
|
||||||
#define CARDBUS_RESERVE_BUSNR 3
|
#define CARDBUS_RESERVE_BUSNR 3
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/byteorder.h>
|
#include <asm/byteorder.h>
|
||||||
|
#include "pci.h"
|
||||||
|
|
||||||
static int proc_initialized; /* = 0 */
|
static int proc_initialized; /* = 0 */
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
#include "pci.h"
|
||||||
|
|
||||||
/* Deal with broken BIOS'es that neglect to enable passive release,
|
/* Deal with broken BIOS'es that neglect to enable passive release,
|
||||||
which can cause problems in combination with the 82441FX/PPro MTRRs */
|
which can cause problems in combination with the 82441FX/PPro MTRRs */
|
||||||
|
@ -328,6 +329,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12,
|
||||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, quirk_ich4_lpc_acpi );
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, quirk_ich4_lpc_acpi );
|
||||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, quirk_ich4_lpc_acpi );
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, quirk_ich4_lpc_acpi );
|
||||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, quirk_ich4_lpc_acpi );
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, quirk_ich4_lpc_acpi );
|
||||||
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ESB_1, quirk_ich4_lpc_acpi );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* VIA ACPI: One IO region pointed to by longword at
|
* VIA ACPI: One IO region pointed to by longword at
|
||||||
|
|
|
@ -671,6 +671,7 @@ struct pci_driver {
|
||||||
int (*suspend) (struct pci_dev *dev, pm_message_t state); /* Device suspended */
|
int (*suspend) (struct pci_dev *dev, pm_message_t state); /* Device suspended */
|
||||||
int (*resume) (struct pci_dev *dev); /* Device woken up */
|
int (*resume) (struct pci_dev *dev); /* Device woken up */
|
||||||
int (*enable_wake) (struct pci_dev *dev, pci_power_t state, int enable); /* Enable wake event */
|
int (*enable_wake) (struct pci_dev *dev, pci_power_t state, int enable); /* Enable wake event */
|
||||||
|
void (*shutdown) (struct pci_dev *dev);
|
||||||
|
|
||||||
struct device_driver driver;
|
struct device_driver driver;
|
||||||
struct pci_dynids dynids;
|
struct pci_dynids dynids;
|
||||||
|
@ -810,7 +811,6 @@ void pci_set_master(struct pci_dev *dev);
|
||||||
int pci_set_mwi(struct pci_dev *dev);
|
int pci_set_mwi(struct pci_dev *dev);
|
||||||
void pci_clear_mwi(struct pci_dev *dev);
|
void pci_clear_mwi(struct pci_dev *dev);
|
||||||
int pci_set_dma_mask(struct pci_dev *dev, u64 mask);
|
int pci_set_dma_mask(struct pci_dev *dev, u64 mask);
|
||||||
int pci_dac_set_dma_mask(struct pci_dev *dev, u64 mask);
|
|
||||||
int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask);
|
int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask);
|
||||||
int pci_assign_resource(struct pci_dev *dev, int i);
|
int pci_assign_resource(struct pci_dev *dev, int i);
|
||||||
|
|
||||||
|
@ -941,7 +941,6 @@ static inline void pci_set_master(struct pci_dev *dev) { }
|
||||||
static inline int pci_enable_device(struct pci_dev *dev) { return -EIO; }
|
static inline int pci_enable_device(struct pci_dev *dev) { return -EIO; }
|
||||||
static inline void pci_disable_device(struct pci_dev *dev) { }
|
static inline void pci_disable_device(struct pci_dev *dev) { }
|
||||||
static inline int pci_set_dma_mask(struct pci_dev *dev, u64 mask) { return -EIO; }
|
static inline int pci_set_dma_mask(struct pci_dev *dev, u64 mask) { return -EIO; }
|
||||||
static inline int pci_dac_set_dma_mask(struct pci_dev *dev, u64 mask) { return -EIO; }
|
|
||||||
static inline int pci_assign_resource(struct pci_dev *dev, int i) { return -EBUSY;}
|
static inline int pci_assign_resource(struct pci_dev *dev, int i) { return -EBUSY;}
|
||||||
static inline int pci_register_driver(struct pci_driver *drv) { return 0;}
|
static inline int pci_register_driver(struct pci_driver *drv) { return 0;}
|
||||||
static inline void pci_unregister_driver(struct pci_driver *drv) { }
|
static inline void pci_unregister_driver(struct pci_driver *drv) { }
|
||||||
|
|
Loading…
Reference in a new issue