Skip to content

Commit 63aabc3

Browse files
Jiawen Wudavem330
authored andcommitted
net: txgbe: move interrupt codes to a separate file
In order to change the interrupt response structure, there will be a lot of code added next. Move these interrupt codes to a new file, to make the codes cleaner. Signed-off-by: Jiawen Wu <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 6f83b62 commit 63aabc3

File tree

4 files changed

+144
-127
lines changed

4 files changed

+144
-127
lines changed

drivers/net/ethernet/wangxun/txgbe/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ obj-$(CONFIG_TXGBE) += txgbe.o
99
txgbe-objs := txgbe_main.o \
1010
txgbe_hw.o \
1111
txgbe_phy.o \
12+
txgbe_irq.o \
1213
txgbe_ethtool.o
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
/* Copyright (c) 2015 - 2024 Beijing WangXun Technology Co., Ltd. */
3+
4+
#include <linux/pci.h>
5+
6+
#include "../libwx/wx_type.h"
7+
#include "../libwx/wx_lib.h"
8+
#include "../libwx/wx_hw.h"
9+
#include "txgbe_type.h"
10+
#include "txgbe_irq.h"
11+
12+
/**
13+
* txgbe_irq_enable - Enable default interrupt generation settings
14+
* @wx: pointer to private structure
15+
* @queues: enable irqs for queues
16+
**/
17+
void txgbe_irq_enable(struct wx *wx, bool queues)
18+
{
19+
wr32(wx, WX_PX_MISC_IEN, TXGBE_PX_MISC_IEN_MASK);
20+
21+
/* unmask interrupt */
22+
wx_intr_enable(wx, TXGBE_INTR_MISC);
23+
if (queues)
24+
wx_intr_enable(wx, TXGBE_INTR_QALL(wx));
25+
}
26+
27+
/**
28+
* txgbe_intr - msi/legacy mode Interrupt Handler
29+
* @irq: interrupt number
30+
* @data: pointer to a network interface device structure
31+
**/
32+
static irqreturn_t txgbe_intr(int __always_unused irq, void *data)
33+
{
34+
struct wx_q_vector *q_vector;
35+
struct wx *wx = data;
36+
struct pci_dev *pdev;
37+
u32 eicr;
38+
39+
q_vector = wx->q_vector[0];
40+
pdev = wx->pdev;
41+
42+
eicr = wx_misc_isb(wx, WX_ISB_VEC0);
43+
if (!eicr) {
44+
/* shared interrupt alert!
45+
* the interrupt that we masked before the ICR read.
46+
*/
47+
if (netif_running(wx->netdev))
48+
txgbe_irq_enable(wx, true);
49+
return IRQ_NONE; /* Not our interrupt */
50+
}
51+
wx->isb_mem[WX_ISB_VEC0] = 0;
52+
if (!(pdev->msi_enabled))
53+
wr32(wx, WX_PX_INTA, 1);
54+
55+
wx->isb_mem[WX_ISB_MISC] = 0;
56+
/* would disable interrupts here but it is auto disabled */
57+
napi_schedule_irqoff(&q_vector->napi);
58+
59+
/* re-enable link(maybe) and non-queue interrupts, no flush.
60+
* txgbe_poll will re-enable the queue interrupts
61+
*/
62+
if (netif_running(wx->netdev))
63+
txgbe_irq_enable(wx, false);
64+
65+
return IRQ_HANDLED;
66+
}
67+
68+
/**
69+
* txgbe_request_msix_irqs - Initialize MSI-X interrupts
70+
* @wx: board private structure
71+
*
72+
* Allocate MSI-X vectors and request interrupts from the kernel.
73+
**/
74+
static int txgbe_request_msix_irqs(struct wx *wx)
75+
{
76+
struct net_device *netdev = wx->netdev;
77+
int vector, err;
78+
79+
for (vector = 0; vector < wx->num_q_vectors; vector++) {
80+
struct wx_q_vector *q_vector = wx->q_vector[vector];
81+
struct msix_entry *entry = &wx->msix_q_entries[vector];
82+
83+
if (q_vector->tx.ring && q_vector->rx.ring)
84+
snprintf(q_vector->name, sizeof(q_vector->name) - 1,
85+
"%s-TxRx-%d", netdev->name, entry->entry);
86+
else
87+
/* skip this unused q_vector */
88+
continue;
89+
90+
err = request_irq(entry->vector, wx_msix_clean_rings, 0,
91+
q_vector->name, q_vector);
92+
if (err) {
93+
wx_err(wx, "request_irq failed for MSIX interrupt %s Error: %d\n",
94+
q_vector->name, err);
95+
goto free_queue_irqs;
96+
}
97+
}
98+
99+
return 0;
100+
101+
free_queue_irqs:
102+
while (vector) {
103+
vector--;
104+
free_irq(wx->msix_q_entries[vector].vector,
105+
wx->q_vector[vector]);
106+
}
107+
wx_reset_interrupt_capability(wx);
108+
return err;
109+
}
110+
111+
/**
112+
* txgbe_request_irq - initialize interrupts
113+
* @wx: board private structure
114+
*
115+
* Attempt to configure interrupts using the best available
116+
* capabilities of the hardware and kernel.
117+
**/
118+
int txgbe_request_irq(struct wx *wx)
119+
{
120+
struct net_device *netdev = wx->netdev;
121+
struct pci_dev *pdev = wx->pdev;
122+
int err;
123+
124+
if (pdev->msix_enabled)
125+
err = txgbe_request_msix_irqs(wx);
126+
else if (pdev->msi_enabled)
127+
err = request_irq(wx->pdev->irq, &txgbe_intr, 0,
128+
netdev->name, wx);
129+
else
130+
err = request_irq(wx->pdev->irq, &txgbe_intr, IRQF_SHARED,
131+
netdev->name, wx);
132+
133+
if (err)
134+
wx_err(wx, "request_irq failed, Error %d\n", err);
135+
136+
return err;
137+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/* SPDX-License-Identifier: GPL-2.0 */
2+
/* Copyright (c) 2015 - 2024 Beijing WangXun Technology Co., Ltd. */
3+
4+
void txgbe_irq_enable(struct wx *wx, bool queues);
5+
int txgbe_request_irq(struct wx *wx);

drivers/net/ethernet/wangxun/txgbe/txgbe_main.c

Lines changed: 1 addition & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "txgbe_type.h"
1818
#include "txgbe_hw.h"
1919
#include "txgbe_phy.h"
20+
#include "txgbe_irq.h"
2021
#include "txgbe_ethtool.h"
2122

2223
char txgbe_driver_name[] = "txgbe";
@@ -76,133 +77,6 @@ static int txgbe_enumerate_functions(struct wx *wx)
7677
return physfns;
7778
}
7879

79-
/**
80-
* txgbe_irq_enable - Enable default interrupt generation settings
81-
* @wx: pointer to private structure
82-
* @queues: enable irqs for queues
83-
**/
84-
static void txgbe_irq_enable(struct wx *wx, bool queues)
85-
{
86-
wr32(wx, WX_PX_MISC_IEN, TXGBE_PX_MISC_IEN_MASK);
87-
88-
/* unmask interrupt */
89-
wx_intr_enable(wx, TXGBE_INTR_MISC);
90-
if (queues)
91-
wx_intr_enable(wx, TXGBE_INTR_QALL(wx));
92-
}
93-
94-
/**
95-
* txgbe_intr - msi/legacy mode Interrupt Handler
96-
* @irq: interrupt number
97-
* @data: pointer to a network interface device structure
98-
**/
99-
static irqreturn_t txgbe_intr(int __always_unused irq, void *data)
100-
{
101-
struct wx_q_vector *q_vector;
102-
struct wx *wx = data;
103-
struct pci_dev *pdev;
104-
u32 eicr;
105-
106-
q_vector = wx->q_vector[0];
107-
pdev = wx->pdev;
108-
109-
eicr = wx_misc_isb(wx, WX_ISB_VEC0);
110-
if (!eicr) {
111-
/* shared interrupt alert!
112-
* the interrupt that we masked before the ICR read.
113-
*/
114-
if (netif_running(wx->netdev))
115-
txgbe_irq_enable(wx, true);
116-
return IRQ_NONE; /* Not our interrupt */
117-
}
118-
wx->isb_mem[WX_ISB_VEC0] = 0;
119-
if (!(pdev->msi_enabled))
120-
wr32(wx, WX_PX_INTA, 1);
121-
122-
wx->isb_mem[WX_ISB_MISC] = 0;
123-
/* would disable interrupts here but it is auto disabled */
124-
napi_schedule_irqoff(&q_vector->napi);
125-
126-
/* re-enable link(maybe) and non-queue interrupts, no flush.
127-
* txgbe_poll will re-enable the queue interrupts
128-
*/
129-
if (netif_running(wx->netdev))
130-
txgbe_irq_enable(wx, false);
131-
132-
return IRQ_HANDLED;
133-
}
134-
135-
/**
136-
* txgbe_request_msix_irqs - Initialize MSI-X interrupts
137-
* @wx: board private structure
138-
*
139-
* Allocate MSI-X vectors and request interrupts from the kernel.
140-
**/
141-
static int txgbe_request_msix_irqs(struct wx *wx)
142-
{
143-
struct net_device *netdev = wx->netdev;
144-
int vector, err;
145-
146-
for (vector = 0; vector < wx->num_q_vectors; vector++) {
147-
struct wx_q_vector *q_vector = wx->q_vector[vector];
148-
struct msix_entry *entry = &wx->msix_q_entries[vector];
149-
150-
if (q_vector->tx.ring && q_vector->rx.ring)
151-
snprintf(q_vector->name, sizeof(q_vector->name) - 1,
152-
"%s-TxRx-%d", netdev->name, entry->entry);
153-
else
154-
/* skip this unused q_vector */
155-
continue;
156-
157-
err = request_irq(entry->vector, wx_msix_clean_rings, 0,
158-
q_vector->name, q_vector);
159-
if (err) {
160-
wx_err(wx, "request_irq failed for MSIX interrupt %s Error: %d\n",
161-
q_vector->name, err);
162-
goto free_queue_irqs;
163-
}
164-
}
165-
166-
return 0;
167-
168-
free_queue_irqs:
169-
while (vector) {
170-
vector--;
171-
free_irq(wx->msix_q_entries[vector].vector,
172-
wx->q_vector[vector]);
173-
}
174-
wx_reset_interrupt_capability(wx);
175-
return err;
176-
}
177-
178-
/**
179-
* txgbe_request_irq - initialize interrupts
180-
* @wx: board private structure
181-
*
182-
* Attempt to configure interrupts using the best available
183-
* capabilities of the hardware and kernel.
184-
**/
185-
static int txgbe_request_irq(struct wx *wx)
186-
{
187-
struct net_device *netdev = wx->netdev;
188-
struct pci_dev *pdev = wx->pdev;
189-
int err;
190-
191-
if (pdev->msix_enabled)
192-
err = txgbe_request_msix_irqs(wx);
193-
else if (pdev->msi_enabled)
194-
err = request_irq(wx->pdev->irq, &txgbe_intr, 0,
195-
netdev->name, wx);
196-
else
197-
err = request_irq(wx->pdev->irq, &txgbe_intr, IRQF_SHARED,
198-
netdev->name, wx);
199-
200-
if (err)
201-
wx_err(wx, "request_irq failed, Error %d\n", err);
202-
203-
return err;
204-
}
205-
20680
static void txgbe_up_complete(struct wx *wx)
20781
{
20882
struct net_device *netdev = wx->netdev;

0 commit comments

Comments
 (0)