[PATCH RFC 75/77] vmxnet3: Update MSI/MSI-X interrupts enablement code

Alexander Gordeev
2013-10-02T10:49:31Z

As result of recent re-design of the MSI/MSI-X interrupts enabling
pattern this driver has to be updated to use the new technique to
obtain a optimal number of MSI/MSI-X interrupts required.

Signed-off-by: Alexander Gordeev <agordeev@redhat.com>
---
drivers/net/vmxnet3/vmxnet3_drv.c | 68 ++++++++++++++++++-------------------
1 files changed, 33 insertions(+), 35 deletions(-)

diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c
index 00dc0d0..8d3321b 100644
--- a/drivers/net/vmxnet3/vmxnet3_drv.c
+++ b/drivers/net/vmxnet3/vmxnet3_drv.c
@@ -2724,49 +2724,47 @@ vmxnet3_read_mac_addr(struct vmxnet3_adapter *adapter, u8 *mac)

#ifdef CONFIG_PCI_MSI

-/*
- * Enable MSIx vectors.
- * Returns :
- * 0 on successful enabling of required vectors,
- * VMXNET3_LINUX_MIN_MSIX_VECT when only minimum number of vectors required
- * could be enabled.
- * number of vectors which can be enabled otherwise (this number is smaller
- * than VMXNET3_LINUX_MIN_MSIX_VECT)
- */
-
static int
vmxnet3_acquire_msix_vectors(struct vmxnet3_adapter *adapter,
int vectors)
{
- int err = -EINVAL, vector_threshold;
+ int err, vector_threshold;
+
vector_threshold = VMXNET3_LINUX_MIN_MSIX_VECT;
+ if (vectors < vector_threshold)
+ return -EINVAL;

- while (vectors >= vector_threshold) {
- err = pci_enable_msix(adapter->pdev, adapter->intr.msix_entries,
- vectors);
- if (!err) {
- adapter->intr.num_intrs = vectors;
- return 0;
- } else if (err < 0) {
- dev_err(&adapter->netdev->dev,
- "Failed to enable MSI-X, error: %d\n", err);
- return err;
- } else if (err < vector_threshold) {
- dev_info(&adapter->pdev->dev,
- "Number of MSI-Xs which can be allocated "
- "is lower than min threshold required.\n");
- return -ENOSPC;
- } else {
- /* If fails to enable required number of MSI-x vectors
- * try enabling minimum number of vectors required.
- */
- dev_err(&adapter->netdev->dev,
- "Failed to enable %d MSI-X, trying %d instead\n",
- vectors, vector_threshold);
- vectors = vector_threshold;
- }
+ err = pci_msix_table_size(adapter->pdev);
+ if (err < 0)
+ goto err_msix;
+ if (err < vector_threshold) {
+ dev_info(&adapter->pdev->dev,
+ "Number of MSI-X interrupts which can be allocated "
+ "is lower than min threshold required.\n");
+ return -ENOSPC;
+ }
+ if (err < vectors) {
+ /*
+ * If fails to enable required number of MSI-x vectors
+ * try enabling minimum number of vectors required.
+ */
+ dev_err(&adapter->netdev->dev,
+ "Failed to enable %d MSI-X, trying %d instead\n",
+ vectors, vector_threshold);
+ vectors = vector_threshold;
}

+ err = pci_enable_msix(adapter->pdev, adapter->intr.msix_entries,
+ vectors);
+ if (err)
+ goto err_msix;
+
+ adapter->intr.num_intrs = vectors;
+ return 0;
+
+err_msix:
+ dev_err(&adapter->netdev->dev,
+ "Failed to enable MSI-X, error: %d\n", err);
return err;
}

--
1.7.7.6