Skip to content

Commit 935124d

Browse files
Jiawen WuPaolo Abeni
authored andcommitted
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: aefd013 ("net: txgbe: use irq_domain for interrupt controller") Signed-off-by: Jiawen Wu <[email protected]> Signed-off-by: Paolo Abeni <[email protected]>
1 parent 1e1fa17 commit 935124d

File tree

3 files changed

+9
-4
lines changed

3 files changed

+9
-4
lines changed

drivers/net/ethernet/wangxun/libwx/wx_lib.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2028,6 +2028,9 @@ int wx_setup_isb_resources(struct wx *wx)
20282028
{
20292029
struct pci_dev *pdev = wx->pdev;
20302030

2031+
if (wx->isb_mem)
2032+
return 0;
2033+
20312034
wx->isb_mem = dma_alloc_coherent(&pdev->dev,
20322035
sizeof(u32) * 4,
20332036
&wx->isb_dma,
@@ -2387,7 +2390,6 @@ static void wx_free_all_tx_resources(struct wx *wx)
23872390

23882391
void wx_free_resources(struct wx *wx)
23892392
{
2390-
wx_free_isb_resources(wx);
23912393
wx_free_all_rx_resources(wx);
23922394
wx_free_all_tx_resources(wx);
23932395
}

drivers/net/ethernet/wangxun/ngbe/ngbe_main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,7 @@ static int ngbe_open(struct net_device *netdev)
387387
err_free_irq:
388388
wx_free_irq(wx);
389389
err_free_resources:
390+
wx_free_isb_resources(wx);
390391
wx_free_resources(wx);
391392
return err;
392393
}
@@ -408,6 +409,7 @@ static int ngbe_close(struct net_device *netdev)
408409

409410
ngbe_down(wx);
410411
wx_free_irq(wx);
412+
wx_free_isb_resources(wx);
411413
wx_free_resources(wx);
412414
phylink_disconnect_phy(wx->phylink);
413415
wx_control_hw(wx, false);

drivers/net/ethernet/wangxun/txgbe/txgbe_main.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ static int txgbe_open(struct net_device *netdev)
296296

297297
err = txgbe_request_queue_irqs(wx);
298298
if (err)
299-
goto err_free_isb;
299+
goto err_free_resources;
300300

301301
/* Notify the stack of the actual queue counts. */
302302
err = netif_set_real_num_tx_queues(netdev, wx->num_tx_queues);
@@ -313,8 +313,8 @@ static int txgbe_open(struct net_device *netdev)
313313

314314
err_free_irq:
315315
wx_free_irq(wx);
316-
err_free_isb:
317-
wx_free_isb_resources(wx);
316+
err_free_resources:
317+
wx_free_resources(wx);
318318
err_reset:
319319
txgbe_reset(wx);
320320

@@ -729,6 +729,7 @@ static void txgbe_remove(struct pci_dev *pdev)
729729

730730
txgbe_remove_phy(txgbe);
731731
txgbe_free_misc_irq(txgbe);
732+
wx_free_isb_resources(wx);
732733

733734
pci_release_selected_regions(pdev,
734735
pci_select_bars(pdev, IORESOURCE_MEM));

0 commit comments

Comments
 (0)