|
@@ -674,6 +674,23 @@ static int msi_free_irqs(struct pci_dev* dev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * 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
|
|
@@ -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;
|
|
|
|