diff options
author | Alexander Gordeev <agordeev@redhat.com> | 2014-04-14 09:28:35 -0400 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2014-04-30 18:56:47 -0400 |
commit | 034cd97ebda4062eb4402a6cf963ccd262caa86a (patch) | |
tree | f9d9d74d58c21b68bd875d192d18d915196531d0 /drivers/pci/msi.c | |
parent | a30d0108b09ae46d24594a2e699c4dad21bb4af4 (diff) |
PCI/MSI: Remove pci_enable_msi_block()
There are no users of pci_enable_msi_block() function left. Obsolete it in
favor of pci_enable_msi_range() and pci_enable_msi_exact() functions.
Previously, we called arch_setup_msi_irqs() once, requesting the same
vector count we passed to arch_msi_check_device(). Now we may call it
several times: if it returns failure, we may retry and request fewer
vectors.
We don't keep track of the vector count we initially passed to
arch_msi_check_device(). We only keep track of the number of vectors
successfully set up by arch_setup_msi_irqs(), and this is what we use to
clean things up when disabling MSI. Therefore, we assume that
arch_msi_check_device() does nothing that will have to be cleaned up later.
[bhelgaas: changelog]
Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat (limited to 'drivers/pci/msi.c')
-rw-r--r-- | drivers/pci/msi.c | 79 |
1 files changed, 33 insertions, 46 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index 04130c3f9cf6..36dd0caa1759 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
@@ -879,50 +879,6 @@ int pci_msi_vec_count(struct pci_dev *dev) | |||
879 | } | 879 | } |
880 | EXPORT_SYMBOL(pci_msi_vec_count); | 880 | EXPORT_SYMBOL(pci_msi_vec_count); |
881 | 881 | ||
882 | /** | ||
883 | * pci_enable_msi_block - configure device's MSI capability structure | ||
884 | * @dev: device to configure | ||
885 | * @nvec: number of interrupts to configure | ||
886 | * | ||
887 | * Allocate IRQs for a device with the MSI capability. | ||
888 | * This function returns a negative errno if an error occurs. If it | ||
889 | * is unable to allocate the number of interrupts requested, it returns | ||
890 | * the number of interrupts it might be able to allocate. If it successfully | ||
891 | * allocates at least the number of interrupts requested, it returns 0 and | ||
892 | * updates the @dev's irq member to the lowest new interrupt number; the | ||
893 | * other interrupt numbers allocated to this device are consecutive. | ||
894 | */ | ||
895 | int pci_enable_msi_block(struct pci_dev *dev, int nvec) | ||
896 | { | ||
897 | int status, maxvec; | ||
898 | |||
899 | if (dev->current_state != PCI_D0) | ||
900 | return -EINVAL; | ||
901 | |||
902 | maxvec = pci_msi_vec_count(dev); | ||
903 | if (maxvec < 0) | ||
904 | return maxvec; | ||
905 | if (nvec > maxvec) | ||
906 | return maxvec; | ||
907 | |||
908 | status = pci_msi_check_device(dev, nvec, PCI_CAP_ID_MSI); | ||
909 | if (status) | ||
910 | return status; | ||
911 | |||
912 | WARN_ON(!!dev->msi_enabled); | ||
913 | |||
914 | /* Check whether driver already requested MSI-X irqs */ | ||
915 | if (dev->msix_enabled) { | ||
916 | dev_info(&dev->dev, "can't enable MSI " | ||
917 | "(MSI-X already enabled)\n"); | ||
918 | return -EINVAL; | ||
919 | } | ||
920 | |||
921 | status = msi_capability_init(dev, nvec); | ||
922 | return status; | ||
923 | } | ||
924 | EXPORT_SYMBOL(pci_enable_msi_block); | ||
925 | |||
926 | void pci_msi_shutdown(struct pci_dev *dev) | 882 | void pci_msi_shutdown(struct pci_dev *dev) |
927 | { | 883 | { |
928 | struct msi_desc *desc; | 884 | struct msi_desc *desc; |
@@ -1128,14 +1084,45 @@ void pci_msi_init_pci_dev(struct pci_dev *dev) | |||
1128 | **/ | 1084 | **/ |
1129 | int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec) | 1085 | int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec) |
1130 | { | 1086 | { |
1131 | int nvec = maxvec; | 1087 | int nvec; |
1132 | int rc; | 1088 | int rc; |
1133 | 1089 | ||
1090 | if (dev->current_state != PCI_D0) | ||
1091 | return -EINVAL; | ||
1092 | |||
1093 | WARN_ON(!!dev->msi_enabled); | ||
1094 | |||
1095 | /* Check whether driver already requested MSI-X irqs */ | ||
1096 | if (dev->msix_enabled) { | ||
1097 | dev_info(&dev->dev, | ||
1098 | "can't enable MSI (MSI-X already enabled)\n"); | ||
1099 | return -EINVAL; | ||
1100 | } | ||
1101 | |||
1134 | if (maxvec < minvec) | 1102 | if (maxvec < minvec) |
1135 | return -ERANGE; | 1103 | return -ERANGE; |
1136 | 1104 | ||
1105 | nvec = pci_msi_vec_count(dev); | ||
1106 | if (nvec < 0) | ||
1107 | return nvec; | ||
1108 | else if (nvec < minvec) | ||
1109 | return -EINVAL; | ||
1110 | else if (nvec > maxvec) | ||
1111 | nvec = maxvec; | ||
1112 | |||
1113 | do { | ||
1114 | rc = pci_msi_check_device(dev, nvec, PCI_CAP_ID_MSI); | ||
1115 | if (rc < 0) { | ||
1116 | return rc; | ||
1117 | } else if (rc > 0) { | ||
1118 | if (rc < minvec) | ||
1119 | return -ENOSPC; | ||
1120 | nvec = rc; | ||
1121 | } | ||
1122 | } while (rc); | ||
1123 | |||
1137 | do { | 1124 | do { |
1138 | rc = pci_enable_msi_block(dev, nvec); | 1125 | rc = msi_capability_init(dev, nvec); |
1139 | if (rc < 0) { | 1126 | if (rc < 0) { |
1140 | return rc; | 1127 | return rc; |
1141 | } else if (rc > 0) { | 1128 | } else if (rc > 0) { |