Commit 6e058568 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman

Merge kroah.com:/home/greg/linux/BK/bleed-2.6

into kroah.com:/home/greg/linux/BK/pci-2.6
parents e743bea2 db09cd90
...@@ -299,10 +299,30 @@ static int pci_device_suspend(struct device * dev, u32 state) ...@@ -299,10 +299,30 @@ static int pci_device_suspend(struct device * dev, u32 state)
{ {
struct pci_dev * pci_dev = to_pci_dev(dev); struct pci_dev * pci_dev = to_pci_dev(dev);
struct pci_driver * drv = pci_dev->driver; struct pci_driver * drv = pci_dev->driver;
int i = 0;
if (drv && drv->suspend) if (drv && drv->suspend)
return drv->suspend(pci_dev,state); i = drv->suspend(pci_dev,state);
return 0;
pci_save_state(pci_dev, pci_dev->saved_config_space);
return i;
}
/*
* Default resume method for devices that have no driver provided resume,
* or not even a driver at all.
*/
static void pci_default_resume(struct pci_dev *pci_dev)
{
/* restore the PCI config space */
pci_restore_state(pci_dev, pci_dev->saved_config_space);
/* if the device was enabled before suspend, reenable */
if (pci_dev->is_enabled)
pci_enable_device(pci_dev);
/* if the device was busmaster before the suspend, make it busmaster again */
if (pci_dev->is_busmaster)
pci_set_master(pci_dev);
} }
static int pci_device_resume(struct device * dev) static int pci_device_resume(struct device * dev)
...@@ -312,6 +332,8 @@ static int pci_device_resume(struct device * dev) ...@@ -312,6 +332,8 @@ static int pci_device_resume(struct device * dev)
if (drv && drv->resume) if (drv && drv->resume)
drv->resume(pci_dev); drv->resume(pci_dev);
else
pci_default_resume(pci_dev);
return 0; return 0;
} }
......
...@@ -385,6 +385,7 @@ pci_enable_device_bars(struct pci_dev *dev, int bars) ...@@ -385,6 +385,7 @@ pci_enable_device_bars(struct pci_dev *dev, int bars)
int int
pci_enable_device(struct pci_dev *dev) pci_enable_device(struct pci_dev *dev)
{ {
dev->is_enabled = 1;
return pci_enable_device_bars(dev, (1 << PCI_NUM_RESOURCES) - 1); return pci_enable_device_bars(dev, (1 << PCI_NUM_RESOURCES) - 1);
} }
...@@ -400,6 +401,9 @@ pci_disable_device(struct pci_dev *dev) ...@@ -400,6 +401,9 @@ 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;
...@@ -601,6 +605,7 @@ pci_set_master(struct pci_dev *dev) ...@@ -601,6 +605,7 @@ pci_set_master(struct pci_dev *dev)
cmd |= PCI_COMMAND_MASTER; cmd |= PCI_COMMAND_MASTER;
pci_write_config_word(dev, PCI_COMMAND, cmd); pci_write_config_word(dev, PCI_COMMAND, cmd);
} }
dev->is_busmaster = 1;
pcibios_set_master(dev); pcibios_set_master(dev);
} }
......
...@@ -488,6 +488,11 @@ struct pci_dev { ...@@ -488,6 +488,11 @@ struct pci_dev {
/* These fields are used by common fixups */ /* These fields are used by common fixups */
unsigned int transparent:1; /* Transparent PCI bridge */ unsigned int transparent:1; /* Transparent PCI bridge */
unsigned int multifunction:1;/* Part of multi-function device */ unsigned int multifunction:1;/* Part of multi-function device */
/* keep track of device state */
unsigned int is_enabled:1; /* pci_enable_device has been called */
unsigned int is_busmaster:1; /* device is busmaster */
unsigned int saved_config_space[16]; /* config space saved at suspend time */
#ifdef CONFIG_PCI_NAMES #ifdef CONFIG_PCI_NAMES
#define PCI_NAME_SIZE 96 #define PCI_NAME_SIZE 96
#define PCI_NAME_HALF __stringify(43) /* less than half to handle slop */ #define PCI_NAME_HALF __stringify(43) /* less than half to handle slop */
......
...@@ -1875,6 +1875,11 @@ ...@@ -1875,6 +1875,11 @@
#define PCI_VENDOR_ID_ZOLTRIX 0x15b0 #define PCI_VENDOR_ID_ZOLTRIX 0x15b0
#define PCI_DEVICE_ID_ZOLTRIX_2BD0 0x2bd0 #define PCI_DEVICE_ID_ZOLTRIX_2BD0 0x2bd0
#define PCI_VENDOR_ID_MELLANOX 0x15b3
#define PCI_DEVICE_ID_MELLANOX_TAVOR 0x5a44
#define PCI_DEVICE_ID_MELLANOX_ARBEL_COMPAT 0x6278
#define PCI_DEVICE_ID_MELLANOX_ARBEL 0x6282
#define PCI_VENDOR_ID_PDC 0x15e9 #define PCI_VENDOR_ID_PDC 0x15e9
#define PCI_DEVICE_ID_PDC_1841 0x1841 #define PCI_DEVICE_ID_PDC_1841 0x1841
...@@ -1905,6 +1910,8 @@ ...@@ -1905,6 +1910,8 @@
#define PCI_DEVICE_ID_S2IO_WIN 0x5731 #define PCI_DEVICE_ID_S2IO_WIN 0x5731
#define PCI_DEVICE_ID_S2IO_UNI 0x5831 #define PCI_DEVICE_ID_S2IO_UNI 0x5831
#define PCI_VENDOR_ID_TOPSPIN 0x1867
#define PCI_VENDOR_ID_ARC 0x192E #define PCI_VENDOR_ID_ARC 0x192E
#define PCI_DEVICE_ID_ARC_EHCI 0x0101 #define PCI_DEVICE_ID_ARC_EHCI 0x0101
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment