aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci
diff options
context:
space:
mode:
authorYijing Wang <wangyijing@huawei.com>2013-10-10 08:58:11 -0400
committerBjorn Helgaas <bhelgaas@google.com>2013-10-29 15:30:52 -0400
commit869a16157d1ac92a61770be0bc1cf83fbe99d724 (patch)
tree6595952359cfac3ef0ae83c6f5caa97700b2b22a /drivers/pci
parent3ad674d6c6c5724c83f10f422d826420c83536cd (diff)
PCI: Fail MSI/MSI-X initialization if device is not in PCI_D0
Currently, pci_enable_msi() and pci_enable_msix() return success even if the device power state is not D0. However, we don't write the MSI message to the device registers, and the registers will never be updated later. This patch makes pci_enable_msi() and pci_enable_msix() return an error instead. [bhelgaas: changelog] Signed-off-by: Yijing Wang <wangyijing@huawei.com> Acked-by: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat (limited to 'drivers/pci')
-rw-r--r--drivers/pci/msi.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index d5f90d6383bc..604265c40853 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -831,7 +831,7 @@ int pci_enable_msi_block(struct pci_dev *dev, unsigned int nvec)
831 int status, maxvec; 831 int status, maxvec;
832 u16 msgctl; 832 u16 msgctl;
833 833
834 if (!dev->msi_cap) 834 if (!dev->msi_cap || dev->current_state != PCI_D0)
835 return -EINVAL; 835 return -EINVAL;
836 836
837 pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &msgctl); 837 pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &msgctl);
@@ -862,7 +862,7 @@ int pci_enable_msi_block_auto(struct pci_dev *dev, unsigned int *maxvec)
862 int ret, nvec; 862 int ret, nvec;
863 u16 msgctl; 863 u16 msgctl;
864 864
865 if (!dev->msi_cap) 865 if (!dev->msi_cap || dev->current_state != PCI_D0)
866 return -EINVAL; 866 return -EINVAL;
867 867
868 pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &msgctl); 868 pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &msgctl);
@@ -955,7 +955,7 @@ int pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, int nvec)
955 int status, nr_entries; 955 int status, nr_entries;
956 int i, j; 956 int i, j;
957 957
958 if (!entries || !dev->msix_cap) 958 if (!entries || !dev->msix_cap || dev->current_state != PCI_D0)
959 return -EINVAL; 959 return -EINVAL;
960 960
961 status = pci_msi_check_device(dev, nvec, PCI_CAP_ID_MSIX); 961 status = pci_msi_check_device(dev, nvec, PCI_CAP_ID_MSIX);