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: 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>
This commit is contained in:
parent
1e1fa1723e
commit
935124dd58
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
|
Loading…
x
Reference in New Issue
Block a user