diff options
author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2011-03-19 02:38:50 -0400 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2011-03-19 02:38:50 -0400 |
commit | 97eb3f24352ec6632c2127b35d8087d2a809a9b9 (patch) | |
tree | 722948059bbd325bbca232269490124231df80d4 /drivers/pci/pci.c | |
parent | 439581ec07fa9cf3f519dd461a2cf41cfd3adcb4 (diff) | |
parent | def179c271ac9b5020deca798470521f14d11edd (diff) |
Merge branch 'next' into for-linus
Diffstat (limited to 'drivers/pci/pci.c')
-rw-r--r-- | drivers/pci/pci.c | 37 |
1 files changed, 15 insertions, 22 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index e98c8104297b..b714d787bddd 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -937,14 +937,13 @@ pci_save_state(struct pci_dev *dev) | |||
937 | * pci_restore_state - Restore the saved state of a PCI device | 937 | * pci_restore_state - Restore the saved state of a PCI device |
938 | * @dev: - PCI device that we're dealing with | 938 | * @dev: - PCI device that we're dealing with |
939 | */ | 939 | */ |
940 | int | 940 | void pci_restore_state(struct pci_dev *dev) |
941 | pci_restore_state(struct pci_dev *dev) | ||
942 | { | 941 | { |
943 | int i; | 942 | int i; |
944 | u32 val; | 943 | u32 val; |
945 | 944 | ||
946 | if (!dev->state_saved) | 945 | if (!dev->state_saved) |
947 | return 0; | 946 | return; |
948 | 947 | ||
949 | /* PCI Express register must be restored first */ | 948 | /* PCI Express register must be restored first */ |
950 | pci_restore_pcie_state(dev); | 949 | pci_restore_pcie_state(dev); |
@@ -968,8 +967,6 @@ pci_restore_state(struct pci_dev *dev) | |||
968 | pci_restore_iov_state(dev); | 967 | pci_restore_iov_state(dev); |
969 | 968 | ||
970 | dev->state_saved = false; | 969 | dev->state_saved = false; |
971 | |||
972 | return 0; | ||
973 | } | 970 | } |
974 | 971 | ||
975 | static int do_pci_enable_device(struct pci_dev *dev, int bars) | 972 | static int do_pci_enable_device(struct pci_dev *dev, int bars) |
@@ -1007,6 +1004,18 @@ static int __pci_enable_device_flags(struct pci_dev *dev, | |||
1007 | int err; | 1004 | int err; |
1008 | int i, bars = 0; | 1005 | int i, bars = 0; |
1009 | 1006 | ||
1007 | /* | ||
1008 | * Power state could be unknown at this point, either due to a fresh | ||
1009 | * boot or a device removal call. So get the current power state | ||
1010 | * so that things like MSI message writing will behave as expected | ||
1011 | * (e.g. if the device really is in D0 at enable time). | ||
1012 | */ | ||
1013 | if (dev->pm_cap) { | ||
1014 | u16 pmcsr; | ||
1015 | pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr); | ||
1016 | dev->current_state = (pmcsr & PCI_PM_CTRL_STATE_MASK); | ||
1017 | } | ||
1018 | |||
1010 | if (atomic_add_return(1, &dev->enable_cnt) > 1) | 1019 | if (atomic_add_return(1, &dev->enable_cnt) > 1) |
1011 | return 0; /* already enabled */ | 1020 | return 0; /* already enabled */ |
1012 | 1021 | ||
@@ -1288,22 +1297,6 @@ bool pci_check_pme_status(struct pci_dev *dev) | |||
1288 | return ret; | 1297 | return ret; |
1289 | } | 1298 | } |
1290 | 1299 | ||
1291 | /* | ||
1292 | * Time to wait before the system can be put into a sleep state after reporting | ||
1293 | * a wakeup event signaled by a PCI device. | ||
1294 | */ | ||
1295 | #define PCI_WAKEUP_COOLDOWN 100 | ||
1296 | |||
1297 | /** | ||
1298 | * pci_wakeup_event - Report a wakeup event related to a given PCI device. | ||
1299 | * @dev: Device to report the wakeup event for. | ||
1300 | */ | ||
1301 | void pci_wakeup_event(struct pci_dev *dev) | ||
1302 | { | ||
1303 | if (device_may_wakeup(&dev->dev)) | ||
1304 | pm_wakeup_event(&dev->dev, PCI_WAKEUP_COOLDOWN); | ||
1305 | } | ||
1306 | |||
1307 | /** | 1300 | /** |
1308 | * pci_pme_wakeup - Wake up a PCI device if its PME Status bit is set. | 1301 | * pci_pme_wakeup - Wake up a PCI device if its PME Status bit is set. |
1309 | * @dev: Device to handle. | 1302 | * @dev: Device to handle. |
@@ -1315,8 +1308,8 @@ void pci_wakeup_event(struct pci_dev *dev) | |||
1315 | static int pci_pme_wakeup(struct pci_dev *dev, void *ign) | 1308 | static int pci_pme_wakeup(struct pci_dev *dev, void *ign) |
1316 | { | 1309 | { |
1317 | if (pci_check_pme_status(dev)) { | 1310 | if (pci_check_pme_status(dev)) { |
1318 | pm_request_resume(&dev->dev); | ||
1319 | pci_wakeup_event(dev); | 1311 | pci_wakeup_event(dev); |
1312 | pm_request_resume(&dev->dev); | ||
1320 | } | 1313 | } |
1321 | return 0; | 1314 | return 0; |
1322 | } | 1315 | } |