diff options
| -rw-r--r-- | drivers/pci/msi.c | 24 | ||||
| -rw-r--r-- | include/linux/pci.h | 5 | 
2 files changed, 24 insertions, 5 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index baba2eb5367..08aedd5875b 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c @@ -675,6 +675,23 @@ static int msi_free_irqs(struct pci_dev* dev)  }  /** + * pci_msix_table_size - return the number of device's MSI-X table entries + * @dev: pointer to the pci_dev data structure of MSI-X device function + */ +int pci_msix_table_size(struct pci_dev *dev) +{ +	int pos; +	u16 control; + +	pos = pci_find_capability(dev, PCI_CAP_ID_MSIX); +	if (!pos) +		return 0; + +	pci_read_config_word(dev, msi_control_reg(pos), &control); +	return multi_msix_capable(control); +} + +/**   * pci_enable_msix - configure device's MSI-X capability structure   * @dev: pointer to the pci_dev data structure of MSI-X device function   * @entries: pointer to an array of MSI-X entries @@ -691,9 +708,8 @@ static int msi_free_irqs(struct pci_dev* dev)   **/  int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec)  { -	int status, pos, nr_entries; +	int status, nr_entries;  	int i, j; -	u16 control;  	if (!entries)   		return -EINVAL; @@ -702,9 +718,7 @@ int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec)  	if (status)  		return status; -	pos = pci_find_capability(dev, PCI_CAP_ID_MSIX); -	pci_read_config_word(dev, msi_control_reg(pos), &control); -	nr_entries = multi_msix_capable(control); +	nr_entries = pci_msix_table_size(dev);  	if (nvec > nr_entries)  		return -EINVAL; diff --git a/include/linux/pci.h b/include/linux/pci.h index 7bd624bfdcf..b5d6d0e0f1c 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -799,6 +799,10 @@ static inline void pci_msi_shutdown(struct pci_dev *dev)  static inline void pci_disable_msi(struct pci_dev *dev)  { } +static inline int pci_msix_table_size(struct pci_dev *dev) +{ +	return 0; +}  static inline int pci_enable_msix(struct pci_dev *dev,  				  struct msix_entry *entries, int nvec)  { @@ -823,6 +827,7 @@ static inline int pci_msi_enabled(void)  extern int pci_enable_msi(struct pci_dev *dev);  extern void pci_msi_shutdown(struct pci_dev *dev);  extern void pci_disable_msi(struct pci_dev *dev); +extern int pci_msix_table_size(struct pci_dev *dev);  extern int pci_enable_msix(struct pci_dev *dev,  	struct msix_entry *entries, int nvec);  extern void pci_msix_shutdown(struct pci_dev *dev);  |