aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/pci.h
diff options
context:
space:
mode:
authorAlexander Gordeev <agordeev@redhat.com>2013-12-30 02:28:16 -0500
committerBjorn Helgaas <bhelgaas@google.com>2014-01-03 19:17:55 -0500
commit302a2523c277bea0bbe8340312b09507905849ed (patch)
treea2d971a8aa28744c65dd454bfe4509a9be7be623 /include/linux/pci.h
parentff1aa430a2fa43189e89c7ddd559f0bee2298288 (diff)
PCI/MSI: Add pci_enable_msi_range() and pci_enable_msix_range()
This adds pci_enable_msi_range(), which supersedes the pci_enable_msi() and pci_enable_msi_block() MSI interfaces. It also adds pci_enable_msix_range(), which supersedes the pci_enable_msix() MSI-X interface. The old interfaces have three categories of return values: negative: failure; caller should not retry positive: failure; value indicates number of interrupts that *could* have been allocated, and caller may retry with a smaller request zero: success; at least as many interrupts allocated as requested It is error-prone to handle these three cases correctly in drivers. The new functions return either a negative error code or a number of successfully allocated MSI/MSI-X interrupts, which is expected to lead to clearer device driver code. pci_enable_msi(), pci_enable_msi_block() and pci_enable_msix() still exist unchanged, but are deprecated and may be removed after callers are updated. [bhelgaas: tweak changelog] Suggested-by: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: Alexander Gordeev <agordeev@redhat.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Reviewed-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'include/linux/pci.h')
-rw-r--r--include/linux/pci.h14
1 files changed, 14 insertions, 0 deletions
diff --git a/include/linux/pci.h b/include/linux/pci.h
index cf6125ba649d..6e32a2820126 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1193,6 +1193,17 @@ static inline int pci_msi_enabled(void)
1193{ 1193{
1194 return 0; 1194 return 0;
1195} 1195}
1196
1197static inline int pci_enable_msi_range(struct pci_dev *dev, int minvec,
1198 int maxvec)
1199{
1200 return -ENOSYS;
1201}
1202static inline int pci_enable_msix_range(struct pci_dev *dev,
1203 struct msix_entry *entries, int minvec, int maxvec)
1204{
1205 return -ENOSYS;
1206}
1196#else 1207#else
1197int pci_msi_vec_count(struct pci_dev *dev); 1208int pci_msi_vec_count(struct pci_dev *dev);
1198int pci_enable_msi_block(struct pci_dev *dev, int nvec); 1209int pci_enable_msi_block(struct pci_dev *dev, int nvec);
@@ -1205,6 +1216,9 @@ void pci_disable_msix(struct pci_dev *dev);
1205void msi_remove_pci_irq_vectors(struct pci_dev *dev); 1216void msi_remove_pci_irq_vectors(struct pci_dev *dev);
1206void pci_restore_msi_state(struct pci_dev *dev); 1217void pci_restore_msi_state(struct pci_dev *dev);
1207int pci_msi_enabled(void); 1218int pci_msi_enabled(void);
1219int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec);
1220int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
1221 int minvec, int maxvec);
1208#endif 1222#endif
1209 1223
1210#ifdef CONFIG_PCIEPORTBUS 1224#ifdef CONFIG_PCIEPORTBUS