* [PATCH] net: ethernet: aquantia: switch to pci_alloc_irq_vectors
@ 2017-02-15 7:38 Christoph Hellwig
2017-02-15 18:03 ` Pavel Belous
2017-02-15 18:05 ` David Miller
0 siblings, 2 replies; 3+ messages in thread
From: Christoph Hellwig @ 2017-02-15 7:38 UTC (permalink / raw)
To: vomlehn, davem; +Cc: netdev
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>
---
.../net/ethernet/aquantia/atlantic/aq_pci_func.c | 101 +++++----------------
1 file changed, 25 insertions(+), 76 deletions(-)
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c b/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c
index da4bc09dac51..581de71a958a 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c
@@ -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 @@ int aq_pci_func_init(struct aq_pci_func_s *self)
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);
--
2.11.0
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] net: ethernet: aquantia: switch to pci_alloc_irq_vectors
2017-02-15 7:38 [PATCH] net: ethernet: aquantia: switch to pci_alloc_irq_vectors Christoph Hellwig
@ 2017-02-15 18:03 ` Pavel Belous
2017-02-15 18:05 ` David Miller
1 sibling, 0 replies; 3+ messages in thread
From: Pavel Belous @ 2017-02-15 18:03 UTC (permalink / raw)
To: davem, Christoph Hellwig; +Cc: vomlehn, Simon Edelhaus, netdev
On 15.02.2017 10:38, Christoph Hellwig wrote:
> 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>
> ---
> .../net/ethernet/aquantia/atlantic/aq_pci_func.c | 101 +++++----------------
> 1 file changed, 25 insertions(+), 76 deletions(-)
>
> diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c b/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c
> index da4bc09dac51..581de71a958a 100644
> --- a/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c
> +++ b/drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c
> @@ -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 @@ int aq_pci_func_init(struct aq_pci_func_s *self)
> 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);
>
Thank you.
Tested-by: Pavel Belous <pavel.belous@aquantia.com>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] net: ethernet: aquantia: switch to pci_alloc_irq_vectors
2017-02-15 7:38 [PATCH] net: ethernet: aquantia: switch to pci_alloc_irq_vectors Christoph Hellwig
2017-02-15 18:03 ` Pavel Belous
@ 2017-02-15 18:05 ` David Miller
1 sibling, 0 replies; 3+ messages in thread
From: David Miller @ 2017-02-15 18:05 UTC (permalink / raw)
To: hch; +Cc: vomlehn, netdev
From: Christoph Hellwig <hch@lst.de>
Date: Wed, 15 Feb 2017 08:38:47 +0100
> 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>
Applied to net-next, thanks.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2017-02-15 18:05 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-15 7:38 [PATCH] net: ethernet: aquantia: switch to pci_alloc_irq_vectors Christoph Hellwig
2017-02-15 18:03 ` Pavel Belous
2017-02-15 18:05 ` David Miller
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.