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>
This commit is contained in:
parent
a30d0108b0
commit
034cd97ebd
2 changed files with 34 additions and 50 deletions
|
@ -879,50 +879,6 @@ int pci_msi_vec_count(struct pci_dev *dev)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(pci_msi_vec_count);
|
EXPORT_SYMBOL(pci_msi_vec_count);
|
||||||
|
|
||||||
/**
|
|
||||||
* pci_enable_msi_block - configure device's MSI capability structure
|
|
||||||
* @dev: device to configure
|
|
||||||
* @nvec: number of interrupts to configure
|
|
||||||
*
|
|
||||||
* Allocate IRQs for a device with the MSI capability.
|
|
||||||
* This function returns a negative errno if an error occurs. If it
|
|
||||||
* is unable to allocate the number of interrupts requested, it returns
|
|
||||||
* the number of interrupts it might be able to allocate. If it successfully
|
|
||||||
* allocates at least the number of interrupts requested, it returns 0 and
|
|
||||||
* updates the @dev's irq member to the lowest new interrupt number; the
|
|
||||||
* other interrupt numbers allocated to this device are consecutive.
|
|
||||||
*/
|
|
||||||
int pci_enable_msi_block(struct pci_dev *dev, int nvec)
|
|
||||||
{
|
|
||||||
int status, maxvec;
|
|
||||||
|
|
||||||
if (dev->current_state != PCI_D0)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
maxvec = pci_msi_vec_count(dev);
|
|
||||||
if (maxvec < 0)
|
|
||||||
return maxvec;
|
|
||||||
if (nvec > maxvec)
|
|
||||||
return maxvec;
|
|
||||||
|
|
||||||
status = pci_msi_check_device(dev, nvec, PCI_CAP_ID_MSI);
|
|
||||||
if (status)
|
|
||||||
return status;
|
|
||||||
|
|
||||||
WARN_ON(!!dev->msi_enabled);
|
|
||||||
|
|
||||||
/* Check whether driver already requested MSI-X irqs */
|
|
||||||
if (dev->msix_enabled) {
|
|
||||||
dev_info(&dev->dev, "can't enable MSI "
|
|
||||||
"(MSI-X already enabled)\n");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
status = msi_capability_init(dev, nvec);
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(pci_enable_msi_block);
|
|
||||||
|
|
||||||
void pci_msi_shutdown(struct pci_dev *dev)
|
void pci_msi_shutdown(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
struct msi_desc *desc;
|
struct msi_desc *desc;
|
||||||
|
@ -1128,14 +1084,45 @@ void pci_msi_init_pci_dev(struct pci_dev *dev)
|
||||||
**/
|
**/
|
||||||
int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec)
|
int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec)
|
||||||
{
|
{
|
||||||
int nvec = maxvec;
|
int nvec;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
if (dev->current_state != PCI_D0)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
WARN_ON(!!dev->msi_enabled);
|
||||||
|
|
||||||
|
/* Check whether driver already requested MSI-X irqs */
|
||||||
|
if (dev->msix_enabled) {
|
||||||
|
dev_info(&dev->dev,
|
||||||
|
"can't enable MSI (MSI-X already enabled)\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (maxvec < minvec)
|
if (maxvec < minvec)
|
||||||
return -ERANGE;
|
return -ERANGE;
|
||||||
|
|
||||||
|
nvec = pci_msi_vec_count(dev);
|
||||||
|
if (nvec < 0)
|
||||||
|
return nvec;
|
||||||
|
else if (nvec < minvec)
|
||||||
|
return -EINVAL;
|
||||||
|
else if (nvec > maxvec)
|
||||||
|
nvec = maxvec;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
rc = pci_enable_msi_block(dev, nvec);
|
rc = pci_msi_check_device(dev, nvec, PCI_CAP_ID_MSI);
|
||||||
|
if (rc < 0) {
|
||||||
|
return rc;
|
||||||
|
} else if (rc > 0) {
|
||||||
|
if (rc < minvec)
|
||||||
|
return -ENOSPC;
|
||||||
|
nvec = rc;
|
||||||
|
}
|
||||||
|
} while (rc);
|
||||||
|
|
||||||
|
do {
|
||||||
|
rc = msi_capability_init(dev, nvec);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
return rc;
|
return rc;
|
||||||
} else if (rc > 0) {
|
} else if (rc > 0) {
|
||||||
|
|
|
@ -1158,7 +1158,6 @@ struct msix_entry {
|
||||||
|
|
||||||
#ifdef CONFIG_PCI_MSI
|
#ifdef CONFIG_PCI_MSI
|
||||||
int pci_msi_vec_count(struct pci_dev *dev);
|
int pci_msi_vec_count(struct pci_dev *dev);
|
||||||
int pci_enable_msi_block(struct pci_dev *dev, int nvec);
|
|
||||||
void pci_msi_shutdown(struct pci_dev *dev);
|
void pci_msi_shutdown(struct pci_dev *dev);
|
||||||
void pci_disable_msi(struct pci_dev *dev);
|
void pci_disable_msi(struct pci_dev *dev);
|
||||||
int pci_msix_vec_count(struct pci_dev *dev);
|
int pci_msix_vec_count(struct pci_dev *dev);
|
||||||
|
@ -1188,8 +1187,6 @@ static inline int pci_enable_msix_exact(struct pci_dev *dev,
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static inline int pci_msi_vec_count(struct pci_dev *dev) { return -ENOSYS; }
|
static inline int pci_msi_vec_count(struct pci_dev *dev) { return -ENOSYS; }
|
||||||
static inline int pci_enable_msi_block(struct pci_dev *dev, int nvec)
|
|
||||||
{ return -ENOSYS; }
|
|
||||||
static inline void pci_msi_shutdown(struct pci_dev *dev) { }
|
static inline void pci_msi_shutdown(struct pci_dev *dev) { }
|
||||||
static inline void pci_disable_msi(struct pci_dev *dev) { }
|
static inline void pci_disable_msi(struct pci_dev *dev) { }
|
||||||
static inline int pci_msix_vec_count(struct pci_dev *dev) { return -ENOSYS; }
|
static inline int pci_msix_vec_count(struct pci_dev *dev) { return -ENOSYS; }
|
||||||
|
@ -1244,7 +1241,7 @@ static inline void pcie_set_ecrc_checking(struct pci_dev *dev) { }
|
||||||
static inline void pcie_ecrc_get_policy(char *str) { }
|
static inline void pcie_ecrc_get_policy(char *str) { }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define pci_enable_msi(pdev) pci_enable_msi_block(pdev, 1)
|
#define pci_enable_msi(pdev) pci_enable_msi_exact(pdev, 1)
|
||||||
|
|
||||||
#ifdef CONFIG_HT_IRQ
|
#ifdef CONFIG_HT_IRQ
|
||||||
/* The functions a driver should call */
|
/* The functions a driver should call */
|
||||||
|
|
Loading…
Add table
Reference in a new issue