mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-18 03:44:27 +08:00
net/temac: FIX segfault when process old irqs
Do not enable the irq until the scatter gather registers are ready to handle the data. Otherwise an irq from a packet send/received before last close can lead to an access to an invalid memory region on the irq handler. Also, stop the dma engine on close. Signed-off-by: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
2bc8ca40f9
commit
50ec1538fa
@ -203,6 +203,9 @@ static void temac_dma_bd_release(struct net_device *ndev)
|
||||
struct temac_local *lp = netdev_priv(ndev);
|
||||
int i;
|
||||
|
||||
/* Reset Local Link (DMA) */
|
||||
lp->dma_out(lp, DMA_CONTROL_REG, DMA_CONTROL_RST);
|
||||
|
||||
for (i = 0; i < RX_BD_NUM; i++) {
|
||||
if (!lp->rx_skb[i])
|
||||
break;
|
||||
@ -860,6 +863,8 @@ static int temac_open(struct net_device *ndev)
|
||||
phy_start(lp->phy_dev);
|
||||
}
|
||||
|
||||
temac_device_reset(ndev);
|
||||
|
||||
rc = request_irq(lp->tx_irq, ll_temac_tx_irq, 0, ndev->name, ndev);
|
||||
if (rc)
|
||||
goto err_tx_irq;
|
||||
@ -867,7 +872,6 @@ static int temac_open(struct net_device *ndev)
|
||||
if (rc)
|
||||
goto err_rx_irq;
|
||||
|
||||
temac_device_reset(ndev);
|
||||
return 0;
|
||||
|
||||
err_rx_irq:
|
||||
|
Loading…
Reference in New Issue
Block a user