Commit 935124dd authored by Jiawen Wu's avatar Jiawen Wu Committed by Paolo Abeni

net: txgbe: free isb resources at the right time

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: aefd0136 ("net: txgbe: use irq_domain for interrupt controller")
Signed-off-by: default avatarJiawen Wu <jiawenwu@trustnetic.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 1e1fa172
...@@ -2028,6 +2028,9 @@ int wx_setup_isb_resources(struct wx *wx) ...@@ -2028,6 +2028,9 @@ int wx_setup_isb_resources(struct wx *wx)
{ {
struct pci_dev *pdev = wx->pdev; struct pci_dev *pdev = wx->pdev;
if (wx->isb_mem)
return 0;
wx->isb_mem = dma_alloc_coherent(&pdev->dev, wx->isb_mem = dma_alloc_coherent(&pdev->dev,
sizeof(u32) * 4, sizeof(u32) * 4,
&wx->isb_dma, &wx->isb_dma,
...@@ -2387,7 +2390,6 @@ static void wx_free_all_tx_resources(struct wx *wx) ...@@ -2387,7 +2390,6 @@ static void wx_free_all_tx_resources(struct wx *wx)
void wx_free_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_rx_resources(wx);
wx_free_all_tx_resources(wx); wx_free_all_tx_resources(wx);
} }
......
...@@ -387,6 +387,7 @@ static int ngbe_open(struct net_device *netdev) ...@@ -387,6 +387,7 @@ static int ngbe_open(struct net_device *netdev)
err_free_irq: err_free_irq:
wx_free_irq(wx); wx_free_irq(wx);
err_free_resources: err_free_resources:
wx_free_isb_resources(wx);
wx_free_resources(wx); wx_free_resources(wx);
return err; return err;
} }
...@@ -408,6 +409,7 @@ static int ngbe_close(struct net_device *netdev) ...@@ -408,6 +409,7 @@ static int ngbe_close(struct net_device *netdev)
ngbe_down(wx); ngbe_down(wx);
wx_free_irq(wx); wx_free_irq(wx);
wx_free_isb_resources(wx);
wx_free_resources(wx); wx_free_resources(wx);
phylink_disconnect_phy(wx->phylink); phylink_disconnect_phy(wx->phylink);
wx_control_hw(wx, false); wx_control_hw(wx, false);
......
...@@ -296,7 +296,7 @@ static int txgbe_open(struct net_device *netdev) ...@@ -296,7 +296,7 @@ static int txgbe_open(struct net_device *netdev)
err = txgbe_request_queue_irqs(wx); err = txgbe_request_queue_irqs(wx);
if (err) if (err)
goto err_free_isb; goto err_free_resources;
/* Notify the stack of the actual queue counts. */ /* Notify the stack of the actual queue counts. */
err = netif_set_real_num_tx_queues(netdev, wx->num_tx_queues); err = netif_set_real_num_tx_queues(netdev, wx->num_tx_queues);
...@@ -313,8 +313,8 @@ static int txgbe_open(struct net_device *netdev) ...@@ -313,8 +313,8 @@ static int txgbe_open(struct net_device *netdev)
err_free_irq: err_free_irq:
wx_free_irq(wx); wx_free_irq(wx);
err_free_isb: err_free_resources:
wx_free_isb_resources(wx); wx_free_resources(wx);
err_reset: err_reset:
txgbe_reset(wx); txgbe_reset(wx);
...@@ -729,6 +729,7 @@ static void txgbe_remove(struct pci_dev *pdev) ...@@ -729,6 +729,7 @@ static void txgbe_remove(struct pci_dev *pdev)
txgbe_remove_phy(txgbe); txgbe_remove_phy(txgbe);
txgbe_free_misc_irq(txgbe); txgbe_free_misc_irq(txgbe);
wx_free_isb_resources(wx);
pci_release_selected_regions(pdev, pci_release_selected_regions(pdev,
pci_select_bars(pdev, IORESOURCE_MEM)); pci_select_bars(pdev, IORESOURCE_MEM));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment