diff options
author | Rafael J. Wysocki <rjw@sisk.pl> | 2009-01-23 18:21:14 -0500 |
---|---|---|
committer | Jesse Barnes <jbarnes@hobbes.lan> | 2009-03-19 22:29:25 -0400 |
commit | a52e2e3513d4beafe8fe8699f1519b021c2d05ba (patch) | |
tree | 4a2aea26275e0ffe58e53629e50696b559b8c6e0 /drivers/pci/msi.c | |
parent | a447b772826fde2a3abfd9bb943dee8750994c55 (diff) |
PCI/MSI: Introduce pci_msix_table_size()
Introduce new function pci_msix_table_size() returning the size of
the MSI-X table of given PCI device or 0 if the device doesn't
support MSI-X.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Reviewed-by: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'drivers/pci/msi.c')
-rw-r--r-- | drivers/pci/msi.c | 24 |
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 | */ | ||
681 | int 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 | **/ |
692 | int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec) | 709 | int 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 | ||