Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 034cd97e authored by Alexander Gordeev's avatar Alexander Gordeev Committed by Bjorn Helgaas
Browse files

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: default avatarAlexander Gordeev <agordeev@redhat.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent a30d0108
Loading
Loading
Loading
Loading
+33 −46
Original line number Original line Diff line number Diff line
@@ -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 {
		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 {
	do {
		rc = pci_enable_msi_block(dev, nvec);
		rc = msi_capability_init(dev, nvec);
		if (rc < 0) {
		if (rc < 0) {
			return rc;
			return rc;
		} else if (rc > 0) {
		} else if (rc > 0) {
+1 −4
Original line number Original line Diff line number Diff line
@@ -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 */