X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=drivers%2Fpci%2Fpci.c;h=259d247b75513e5da263edeaea9ee7769596516e;hb=8b20f6da20d874a58becc7a08b130c4382ea7325;hp=ccff633a3948626d7c797f1b2e586e68d56d04e8;hpb=529980c8b0b04e8a3f6606cdc156f1f81a5d68cd;p=linux-2.6 diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index ccff633a39..259d247b75 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -309,17 +309,25 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state) pci_read_config_word(dev, pm + PCI_PM_CTRL, &pmcsr); - /* If we're in D3, force entire word to 0. + /* If we're (effectively) in D3, force entire word to 0. * This doesn't affect PME_Status, disables PME_En, and * sets PowerState to 0. */ - if (dev->current_state >= PCI_D3hot) { - if (!(pmcsr & PCI_PM_CTRL_NO_SOFT_RESET)) + switch (dev->current_state) { + case PCI_UNKNOWN: /* Boot-up */ + if ((pmcsr & PCI_PM_CTRL_STATE_MASK) == PCI_D3hot + && !(pmcsr & PCI_PM_CTRL_NO_SOFT_RESET)) need_restore = 1; + /* Fall-through: force to D0 */ + case PCI_D3hot: + case PCI_D3cold: + case PCI_POWER_ERROR: pmcsr = 0; - } else { + break; + default: pmcsr &= ~PCI_PM_CTRL_STATE_MASK; pmcsr |= state; + break; } /* enter specified state */ @@ -819,7 +827,7 @@ pci_intx(struct pci_dev *pdev, int enable) } if (new != pci_command) { - pci_write_config_word(pdev, PCI_COMMAND, pci_command); + pci_write_config_word(pdev, PCI_COMMAND, new); } }