aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/msi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci/msi.c')
-rw-r--r--drivers/pci/msi.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index baba2eb5367d..08aedd5875b0 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -675,6 +675,23 @@ static int msi_free_irqs(struct pci_dev* dev)
675} 675}
676 676
677/** 677/**
678 * pci_msix_table_size - return the number of device's MSI-X table entries
679 * @dev: pointer to the pci_dev data structure of MSI-X device function
680 */
681int pci_msix_table_size(struct pci_dev *dev)
682{
683 int pos;
684 u16 control;
685
686 pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
687 if (!pos)
688 return 0;
689
690 pci_read_config_word(dev, msi_control_reg(pos), &control);
691 return multi_msix_capable(control);
692}
693
694/**
678 * pci_enable_msix - configure device's MSI-X capability structure 695 * pci_enable_msix - configure device's MSI-X capability structure
679 * @dev: pointer to the pci_dev data structure of MSI-X device function 696 * @dev: pointer to the pci_dev data structure of MSI-X device function
680 * @entries: pointer to an array of MSI-X entries 697 * @entries: pointer to an array of MSI-X entries
@@ -691,9 +708,8 @@ static int msi_free_irqs(struct pci_dev* dev)
691 **/ 708 **/
692int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec) 709int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec)
693{ 710{
694 int status, pos, nr_entries; 711 int status, nr_entries;
695 int i, j; 712 int i, j;
696 u16 control;
697 713
698 if (!entries) 714 if (!entries)
699 return -EINVAL; 715 return -EINVAL;
@@ -702,9 +718,7 @@ int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec)
702 if (status) 718 if (status)
703 return status; 719 return status;
704 720
705 pos = pci_find_capability(dev, PCI_CAP_ID_MSIX); 721 nr_entries = pci_msix_table_size(dev);
706 pci_read_config_word(dev, msi_control_reg(pos), &control);
707 nr_entries = multi_msix_capable(control);
708 if (nvec > nr_entries) 722 if (nvec > nr_entries)
709 return -EINVAL; 723 return -EINVAL;
710 724