Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 084236d8 authored by Ben Hutchings's avatar Ben Hutchings Committed by David S. Miller
Browse files

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: default avatarBen Hutchings <ben.hutchings@codethink.co.uk>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent bd888916
Loading
Loading
Loading
Loading
+18 −16
Original line number Diff line number Diff line
@@ -1976,29 +1976,31 @@ static int sh_eth_set_ringparam(struct net_device *ndev,
		sh_eth_write(ndev, 0, EDTRR);
		sh_eth_write(ndev, 0, EDRRR);
		synchronize_irq(ndev->irq);
	}

		/* Free all the skbuffs in the Rx queue. */
		sh_eth_ring_free(ndev);
		/* Free DMA buffer */
		sh_eth_free_dma_buffer(mdp);
	}

	/* Set new parameters */
	mdp->num_rx_ring = ring->rx_pending;
	mdp->num_tx_ring = ring->tx_pending;

	if (netif_running(ndev)) {
		ret = sh_eth_ring_init(ndev);
		if (ret < 0) {
		netdev_err(ndev, "%s: sh_eth_ring_init failed.\n", __func__);
			netdev_err(ndev, "%s: sh_eth_ring_init failed.\n",
				   __func__);
			return ret;
		}
		ret = sh_eth_dev_init(ndev, false);
		if (ret < 0) {
		netdev_err(ndev, "%s: sh_eth_dev_init failed.\n", __func__);
			netdev_err(ndev, "%s: sh_eth_dev_init failed.\n",
				   __func__);
			return ret;
		}

	if (netif_running(ndev)) {
		sh_eth_write(ndev, mdp->cd->eesipr_value, EESIPR);
		/* Setting the Rx mode will start the Rx process. */
		sh_eth_write(ndev, EDRRR_R, EDRRR);