Skip to content

Commit 5860808

Browse files
Nikita Danilovdavem330
authored andcommitted
net: aquantia: create global service workqueue
We need this to schedule link interrupt handling and various service tasks. Signed-off-by: Nikita Danilov <[email protected]> Signed-off-by: Igor Russkikh <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 1d2a8a1 commit 5860808

File tree

4 files changed

+56
-1
lines changed

4 files changed

+56
-1
lines changed

drivers/net/ethernet/aquantia/atlantic/aq_main.c

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,17 @@ MODULE_VERSION(AQ_CFG_DRV_VERSION);
2323
MODULE_AUTHOR(AQ_CFG_DRV_AUTHOR);
2424
MODULE_DESCRIPTION(AQ_CFG_DRV_DESC);
2525

26+
const char aq_ndev_driver_name[] = AQ_CFG_DRV_NAME;
27+
2628
static const struct net_device_ops aq_ndev_ops;
2729

30+
static struct workqueue_struct *aq_ndev_wq;
31+
32+
void aq_ndev_schedule_work(struct work_struct *work)
33+
{
34+
queue_work(aq_ndev_wq, work);
35+
}
36+
2837
struct net_device *aq_ndev_alloc(void)
2938
{
3039
struct net_device *ndev = NULL;
@@ -209,3 +218,35 @@ static const struct net_device_ops aq_ndev_ops = {
209218
.ndo_vlan_rx_add_vid = aq_ndo_vlan_rx_add_vid,
210219
.ndo_vlan_rx_kill_vid = aq_ndo_vlan_rx_kill_vid,
211220
};
221+
222+
static int __init aq_ndev_init_module(void)
223+
{
224+
int ret;
225+
226+
aq_ndev_wq = create_singlethread_workqueue(aq_ndev_driver_name);
227+
if (!aq_ndev_wq) {
228+
pr_err("Failed to create workqueue\n");
229+
return -ENOMEM;
230+
}
231+
232+
ret = aq_pci_func_register_driver();
233+
if (ret) {
234+
destroy_workqueue(aq_ndev_wq);
235+
return ret;
236+
}
237+
238+
return 0;
239+
}
240+
241+
static void __exit aq_ndev_exit_module(void)
242+
{
243+
aq_pci_func_unregister_driver();
244+
245+
if (aq_ndev_wq) {
246+
destroy_workqueue(aq_ndev_wq);
247+
aq_ndev_wq = NULL;
248+
}
249+
}
250+
251+
module_init(aq_ndev_init_module);
252+
module_exit(aq_ndev_exit_module);

drivers/net/ethernet/aquantia/atlantic/aq_main.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
#define AQ_MAIN_H
1414

1515
#include "aq_common.h"
16+
#include "aq_nic.h"
1617

18+
void aq_ndev_schedule_work(struct work_struct *work);
1719
struct net_device *aq_ndev_alloc(void);
1820

1921
#endif /* AQ_MAIN_H */

drivers/net/ethernet/aquantia/atlantic/aq_pci_func.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,4 +368,13 @@ static struct pci_driver aq_pci_ops = {
368368
.shutdown = aq_pci_shutdown,
369369
};
370370

371-
module_pci_driver(aq_pci_ops);
371+
int aq_pci_func_register_driver(void)
372+
{
373+
return pci_register_driver(&aq_pci_ops);
374+
}
375+
376+
void aq_pci_func_unregister_driver(void)
377+
{
378+
pci_unregister_driver(&aq_pci_ops);
379+
}
380+

drivers/net/ethernet/aquantia/atlantic/aq_pci_func.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,7 @@ int aq_pci_func_alloc_irq(struct aq_nic_s *self, unsigned int i,
2929
void aq_pci_func_free_irqs(struct aq_nic_s *self);
3030
unsigned int aq_pci_func_get_irq_type(struct aq_nic_s *self);
3131

32+
int aq_pci_func_register_driver(void);
33+
void aq_pci_func_unregister_driver(void);
34+
3235
#endif /* AQ_PCI_FUNC_H */

0 commit comments

Comments
 (0)