Skip to content

Commit 084236d

Browse files
bwh-ctdavem330
authored andcommitted
sh_eth: Fix crash or memory leak when resizing rings on device that is down
If the device is down then no packet buffers should be allocated. We also must not touch its registers as it may be powered off. Signed-off-by: Ben Hutchings <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent bd88891 commit 084236d

File tree

1 file changed

+18
-16
lines changed

1 file changed

+18
-16
lines changed

drivers/net/ethernet/renesas/sh_eth.c

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1976,29 +1976,31 @@ static int sh_eth_set_ringparam(struct net_device *ndev,
19761976
sh_eth_write(ndev, 0, EDTRR);
19771977
sh_eth_write(ndev, 0, EDRRR);
19781978
synchronize_irq(ndev->irq);
1979-
}
19801979

1981-
/* Free all the skbuffs in the Rx queue. */
1982-
sh_eth_ring_free(ndev);
1983-
/* Free DMA buffer */
1984-
sh_eth_free_dma_buffer(mdp);
1980+
/* Free all the skbuffs in the Rx queue. */
1981+
sh_eth_ring_free(ndev);
1982+
/* Free DMA buffer */
1983+
sh_eth_free_dma_buffer(mdp);
1984+
}
19851985

19861986
/* Set new parameters */
19871987
mdp->num_rx_ring = ring->rx_pending;
19881988
mdp->num_tx_ring = ring->tx_pending;
19891989

1990-
ret = sh_eth_ring_init(ndev);
1991-
if (ret < 0) {
1992-
netdev_err(ndev, "%s: sh_eth_ring_init failed.\n", __func__);
1993-
return ret;
1994-
}
1995-
ret = sh_eth_dev_init(ndev, false);
1996-
if (ret < 0) {
1997-
netdev_err(ndev, "%s: sh_eth_dev_init failed.\n", __func__);
1998-
return ret;
1999-
}
2000-
20011990
if (netif_running(ndev)) {
1991+
ret = sh_eth_ring_init(ndev);
1992+
if (ret < 0) {
1993+
netdev_err(ndev, "%s: sh_eth_ring_init failed.\n",
1994+
__func__);
1995+
return ret;
1996+
}
1997+
ret = sh_eth_dev_init(ndev, false);
1998+
if (ret < 0) {
1999+
netdev_err(ndev, "%s: sh_eth_dev_init failed.\n",
2000+
__func__);
2001+
return ret;
2002+
}
2003+
20022004
sh_eth_write(ndev, mdp->cd->eesipr_value, EESIPR);
20032005
/* Setting the Rx mode will start the Rx process. */
20042006
sh_eth_write(ndev, EDRRR_R, EDRRR);

0 commit comments

Comments
 (0)