net: txgbe: free isb resources at the right time
authorJiawen Wu <jiawenwu@trustnetic.com>
Mon, 1 Jul 2024 07:14:16 +0000 (15:14 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 2 Jul 2024 14:07:04 +0000 (16:07 +0200)
When using MSI/INTx interrupt, the shared interrupts are still being
handled in the device remove routine, before free IRQs. So isb memory
is still read after it is freed. Thus move wx_free_isb_resources()
from txgbe_close() to txgbe_remove(). And fix the improper isb free
action in txgbe_open() error handling path.

Fixes: aefd013624a1 ("net: txgbe: use irq_domain for interrupt controller")
Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/wangxun/libwx/wx_lib.c
drivers/net/ethernet/wangxun/ngbe/ngbe_main.c
drivers/net/ethernet/wangxun/txgbe/txgbe_main.c

index e1f514b210901e5eb37506b271c65f6f8c4520a1..81bedc8ee8d42f80315b60f0b2c2f564bbcbfae0 100644 (file)
@@ -2028,6 +2028,9 @@ int wx_setup_isb_resources(struct wx *wx)
 {
        struct pci_dev *pdev = wx->pdev;
 
+       if (wx->isb_mem)
+               return 0;
+
        wx->isb_mem = dma_alloc_coherent(&pdev->dev,
                                         sizeof(u32) * 4,
                                         &wx->isb_dma,
@@ -2387,7 +2390,6 @@ static void wx_free_all_tx_resources(struct wx *wx)
 
 void wx_free_resources(struct wx *wx)
 {
-       wx_free_isb_resources(wx);
        wx_free_all_rx_resources(wx);
        wx_free_all_tx_resources(wx);
 }
index e894e01d030d15bf28ae197ac698a8d44795168c..af30ca0312b81879c0b3388759480c9a9a156eaa 100644 (file)
@@ -387,6 +387,7 @@ err_dis_phy:
 err_free_irq:
        wx_free_irq(wx);
 err_free_resources:
+       wx_free_isb_resources(wx);
        wx_free_resources(wx);
        return err;
 }
@@ -408,6 +409,7 @@ static int ngbe_close(struct net_device *netdev)
 
        ngbe_down(wx);
        wx_free_irq(wx);
+       wx_free_isb_resources(wx);
        wx_free_resources(wx);
        phylink_disconnect_phy(wx->phylink);
        wx_control_hw(wx, false);
index 76b5672c0a1774b89399bc4ef67896dcf000f783..ca74d9422065aca89eca725a72631576442ae24b 100644 (file)
@@ -296,7 +296,7 @@ static int txgbe_open(struct net_device *netdev)
 
        err = txgbe_request_queue_irqs(wx);
        if (err)
-               goto err_free_isb;
+               goto err_free_resources;
 
        /* Notify the stack of the actual queue counts. */
        err = netif_set_real_num_tx_queues(netdev, wx->num_tx_queues);
@@ -313,8 +313,8 @@ static int txgbe_open(struct net_device *netdev)
 
 err_free_irq:
        wx_free_irq(wx);
-err_free_isb:
-       wx_free_isb_resources(wx);
+err_free_resources:
+       wx_free_resources(wx);
 err_reset:
        txgbe_reset(wx);
 
@@ -729,6 +729,7 @@ static void txgbe_remove(struct pci_dev *pdev)
 
        txgbe_remove_phy(txgbe);
        txgbe_free_misc_irq(txgbe);
+       wx_free_isb_resources(wx);
 
        pci_release_selected_regions(pdev,
                                     pci_select_bars(pdev, IORESOURCE_MEM));