summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/wangxun/libwx/wx_vf_common.c
diff options
context:
space:
mode:
authorMengyuan Lou <mengyuanlou@net-swift.com>2025-07-04 17:49:17 +0800
committerJakub Kicinski <kuba@kernel.org>2025-07-09 18:39:13 -0700
commitfd0a2e03bf6083354994c2efe2bd12e369c0c830 (patch)
treea5677e044973412e24a25fc690aa65c847c57059 /drivers/net/ethernet/wangxun/libwx/wx_vf_common.c
parent4ee8afb44aeeeaa9120007d4c420bf63ac63cbc7 (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.c40
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;
}