net: ethernet: aquantia: switch to pci_alloc_irq_vectors
authorChristoph Hellwig <hch@lst.de>
Wed, 15 Feb 2017 07:38:47 +0000 (08:38 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 15 Feb 2017 18:05:29 +0000 (13:05 -0500)
pci_enable_msix has been long deprecated, but this driver adds a new
instance.  Convert it to pci_alloc_irq_vectors so that no new instance
of the deprecated function reaches mainline.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Tested-by: Pavel Belous <pavel.belous@aquantia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c

index da4bc09..581de71 100644 (file)
@@ -22,13 +22,11 @@ struct aq_pci_func_s {
        void *aq_vec[AQ_CFG_PCI_FUNC_MSIX_IRQS];
        resource_size_t mmio_pa;
        unsigned int msix_entry_mask;
-       unsigned int irq_type;
        unsigned int ports;
        bool is_pci_enabled;
        bool is_regions;
        bool is_pci_using_dac;
        struct aq_hw_caps_s aq_hw_caps;
-       struct msix_entry msix_entry[AQ_CFG_PCI_FUNC_MSIX_IRQS];
 };
 
 struct aq_pci_func_s *aq_pci_func_alloc(struct aq_hw_ops *aq_hw_ops,
@@ -87,7 +85,6 @@ int aq_pci_func_init(struct aq_pci_func_s *self)
        int err = 0;
        unsigned int bar = 0U;
        unsigned int port = 0U;
-       unsigned int i = 0U;
 
        err = pci_enable_device(self->pdev);
        if (err < 0)
@@ -145,27 +142,16 @@ int aq_pci_func_init(struct aq_pci_func_s *self)
                }
        }
 
-       for (i = 0; i < self->aq_hw_caps.msix_irqs; i++)
-               self->msix_entry[i].entry = i;
-
        /*enable interrupts */
-#if AQ_CFG_FORCE_LEGACY_INT
-       self->irq_type = AQ_HW_IRQ_LEGACY;
-#else
-       err = pci_enable_msix(self->pdev, self->msix_entry,
-                             self->aq_hw_caps.msix_irqs);
+#if !AQ_CFG_FORCE_LEGACY_INT
+       err = pci_alloc_irq_vectors(self->pdev, self->aq_hw_caps.msix_irqs,
+                             self->aq_hw_caps.msix_irqs, PCI_IRQ_MSIX);
 
-       if (err >= 0) {
-               self->irq_type = AQ_HW_IRQ_MSIX;
-       } else {
-               err = pci_enable_msi(self->pdev);
-
-               if (err >= 0) {
-                       self->irq_type = AQ_HW_IRQ_MSI;
-               } else {
-                       self->irq_type = AQ_HW_IRQ_LEGACY;
-                       err = 0;
-               }
+       if (err < 0) {
+               err = pci_alloc_irq_vectors(self->pdev, 1, 1,
+                               PCI_IRQ_MSI | PCI_IRQ_LEGACY);
+               if (err < 0)
+                       goto err_exit;
        }
 #endif
 
@@ -196,34 +182,22 @@ err_exit:
 int aq_pci_func_alloc_irq(struct aq_pci_func_s *self, unsigned int i,
                          char *name, void *aq_vec, cpumask_t *affinity_mask)
 {
+       struct pci_dev *pdev = self->pdev;
        int err = 0;
 
-       switch (self->irq_type) {
-       case AQ_HW_IRQ_MSIX:
-               err = request_irq(self->msix_entry[i].vector, aq_vec_isr, 0,
+       if (pdev->msix_enabled || pdev->msi_enabled)
+               err = request_irq(pci_irq_vector(pdev, i), aq_vec_isr, 0,
                                  name, aq_vec);
-               break;
-
-       case AQ_HW_IRQ_MSI:
-               err = request_irq(self->pdev->irq, aq_vec_isr, 0, name, aq_vec);
-               break;
-
-       case AQ_HW_IRQ_LEGACY:
-               err = request_irq(self->pdev->irq, aq_vec_isr_legacy,
+       else
+               err = request_irq(pci_irq_vector(pdev, i), aq_vec_isr_legacy,
                                  IRQF_SHARED, name, aq_vec);
-               break;
-
-       default:
-               err = -EFAULT;
-               break;
-       }
 
        if (err >= 0) {
                self->msix_entry_mask |= (1 << i);
                self->aq_vec[i] = aq_vec;
 
-               if (self->irq_type == AQ_HW_IRQ_MSIX)
-                       irq_set_affinity_hint(self->msix_entry[i].vector,
+               if (pdev->msix_enabled)
+                       irq_set_affinity_hint(pci_irq_vector(pdev, i),
                                              affinity_mask);
        }
 
@@ -232,30 +206,16 @@ int aq_pci_func_alloc_irq(struct aq_pci_func_s *self, unsigned int i,
 
 void aq_pci_func_free_irqs(struct aq_pci_func_s *self)
 {
+       struct pci_dev *pdev = self->pdev;
        unsigned int i = 0U;
 
        for (i = 32U; i--;) {
                if (!((1U << i) & self->msix_entry_mask))
                        continue;
 
-               switch (self->irq_type) {
-               case AQ_HW_IRQ_MSIX:
-                       irq_set_affinity_hint(self->msix_entry[i].vector, NULL);
-                       free_irq(self->msix_entry[i].vector, self->aq_vec[i]);
-                       break;
-
-               case AQ_HW_IRQ_MSI:
-                       free_irq(self->pdev->irq, self->aq_vec[i]);
-                       break;
-
-               case AQ_HW_IRQ_LEGACY:
-                       free_irq(self->pdev->irq, self->aq_vec[i]);
-                       break;
-
-               default:
-                       break;
-               }
-
+               free_irq(pci_irq_vector(pdev, i), self->aq_vec[i]);
+               if (pdev->msix_enabled)
+                       irq_set_affinity_hint(pci_irq_vector(pdev, i), NULL);
                self->msix_entry_mask &= ~(1U << i);
        }
 }
@@ -267,7 +227,11 @@ void __iomem *aq_pci_func_get_mmio(struct aq_pci_func_s *self)
 
 unsigned int aq_pci_func_get_irq_type(struct aq_pci_func_s *self)
 {
-       return self->irq_type;
+       if (self->pdev->msix_enabled)
+               return AQ_HW_IRQ_MSIX;
+       if (self->pdev->msi_enabled)
+               return AQ_HW_IRQ_MSIX;
+       return AQ_HW_IRQ_LEGACY;
 }
 
 void aq_pci_func_deinit(struct aq_pci_func_s *self)
@@ -276,22 +240,7 @@ void aq_pci_func_deinit(struct aq_pci_func_s *self)
                goto err_exit;
 
        aq_pci_func_free_irqs(self);
-
-       switch (self->irq_type) {
-       case AQ_HW_IRQ_MSI:
-               pci_disable_msi(self->pdev);
-               break;
-
-       case AQ_HW_IRQ_MSIX:
-               pci_disable_msix(self->pdev);
-               break;
-
-       case AQ_HW_IRQ_LEGACY:
-               break;
-
-       default:
-               break;
-       }
+       pci_free_irq_vectors(self->pdev);
 
        if (self->is_regions)
                pci_release_regions(self->pdev);