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

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
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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);
}
+2 −0
Original line number Diff line number Diff line
@@ -387,6 +387,7 @@ static int ngbe_open(struct net_device *netdev)
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);
+4 −3
Original line number Diff line number Diff line
@@ -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));