diff options
author | Mengyuan Lou <mengyuanlou@net-swift.com> | 2025-07-04 17:49:17 +0800 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2025-07-09 18:39:13 -0700 |
commit | fd0a2e03bf6083354994c2efe2bd12e369c0c830 (patch) | |
tree | a5677e044973412e24a25fc690aa65c847c57059 /drivers/net/ethernet/wangxun/libwx/wx_vf_common.c | |
parent | 4ee8afb44aeeeaa9120007d4c420bf63ac63cbc7 (diff) |
net: txgbevf: init interrupts and request irqs
Add irq alloc flow functions for vf.
Alloc pcie msix irqs for drivers and request_irq for tx/rx rings
and misc other events.
If the application is successful, config vertors for interrupts.
Enable interrupts mask in wxvf_irq_enable.
Signed-off-by: Mengyuan Lou <mengyuanlou@net-swift.com>
Link: https://patch.msgid.link/20250704094923.652-7-mengyuanlou@net-swift.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'drivers/net/ethernet/wangxun/libwx/wx_vf_common.c')
-rw-r--r-- | drivers/net/ethernet/wangxun/libwx/wx_vf_common.c | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/drivers/net/ethernet/wangxun/libwx/wx_vf_common.c b/drivers/net/ethernet/wangxun/libwx/wx_vf_common.c index ed5daeec598a..7442b195425f 100644 --- a/drivers/net/ethernet/wangxun/libwx/wx_vf_common.c +++ b/drivers/net/ethernet/wangxun/libwx/wx_vf_common.c @@ -17,6 +17,7 @@ int wxvf_suspend(struct device *dev_d) struct wx *wx = pci_get_drvdata(pdev); netif_device_detach(wx->netdev); + wx_clear_interrupt_scheme(wx); pci_disable_device(pdev); return 0; @@ -35,6 +36,7 @@ int wxvf_resume(struct device *dev_d) struct wx *wx = pci_get_drvdata(pdev); pci_set_master(pdev); + wx_init_interrupt_scheme(wx); netif_device_attach(wx->netdev); return 0; @@ -51,6 +53,7 @@ void wxvf_remove(struct pci_dev *pdev) kfree(wx->vfinfo); kfree(wx->rss_key); kfree(wx->mac_table); + wx_clear_interrupt_scheme(wx); pci_release_selected_regions(pdev, pci_select_bars(pdev, IORESOURCE_MEM)); pci_disable_device(pdev); @@ -93,9 +96,8 @@ int wx_request_msix_irqs_vf(struct wx *wx) } } - err = request_threaded_irq(wx->msix_entry->vector, NULL, - wx_msix_misc_vf, IRQF_ONESHOT, - netdev->name, wx); + err = request_threaded_irq(wx->msix_entry->vector, wx_msix_misc_vf, + NULL, IRQF_ONESHOT, netdev->name, wx); if (err) { wx_err(wx, "request_irq for msix_other failed: %d\n", err); goto free_queue_irqs; @@ -241,9 +243,35 @@ int wx_set_mac_vf(struct net_device *netdev, void *p) } EXPORT_SYMBOL(wx_set_mac_vf); +static void wxvf_irq_enable(struct wx *wx) +{ + wr32(wx, WX_VXIMC, wx->eims_enable_mask); +} + +static void wxvf_up_complete(struct wx *wx) +{ + wx_configure_msix_vf(wx); + + /* clear any pending interrupts, may auto mask */ + wr32(wx, WX_VXICR, U32_MAX); + wxvf_irq_enable(wx); +} + int wxvf_open(struct net_device *netdev) { + struct wx *wx = netdev_priv(netdev); + int err; + + err = wx_request_msix_irqs_vf(wx); + if (err) + goto err_reset; + + wxvf_up_complete(wx); + return 0; +err_reset: + wx_reset_vf(wx); + return err; } EXPORT_SYMBOL(wxvf_open); @@ -251,8 +279,13 @@ static void wxvf_down(struct wx *wx) { struct net_device *netdev = wx->netdev; + netif_tx_stop_all_queues(netdev); netif_tx_disable(netdev); + wx_napi_disable_all(wx); wx_reset_vf(wx); + + wx_clean_all_tx_rings(wx); + wx_clean_all_rx_rings(wx); } int wxvf_close(struct net_device *netdev) @@ -260,6 +293,7 @@ int wxvf_close(struct net_device *netdev) struct wx *wx = netdev_priv(netdev); wxvf_down(wx); + wx_free_irq(wx); return 0; } |