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

Commit 7731a4ea authored by Stephen Hemminger's avatar Stephen Hemminger Committed by Jeff Garzik
Browse files

[PATCH] skge: handle out of memory on MTU size changes



Changing the MTU size causes the receiver to have to reallocate buffers.
If this allocation fails, then we need to return an error, and take
the device offline. It can then be brought back up or reconfigured
for a smaller MTU.

Signed-off-by: default avatarStephen Hemminger <shemminger@osdl.org>
Signed-off-by: default avatarJeff Garzik <jgarzik@pobox.com>
parent e8df8554
Loading
Loading
Loading
Loading
+16 −6
Original line number Diff line number Diff line
@@ -2192,6 +2192,7 @@ static int skge_up(struct net_device *dev)
	kfree(skge->rx_ring.start);
 free_pci_mem:
	pci_free_consistent(hw->pdev, skge->mem_size, skge->mem, skge->dma);
	skge->mem = NULL;

	return err;
}
@@ -2202,6 +2203,9 @@ static int skge_down(struct net_device *dev)
	struct skge_hw *hw = skge->hw;
	int port = skge->port;

	if (skge->mem == NULL)
		return 0;

	if (netif_msg_ifdown(skge))
		printk(KERN_INFO PFX "%s: disabling interface\n", dev->name);

@@ -2258,6 +2262,7 @@ static int skge_down(struct net_device *dev)
	kfree(skge->rx_ring.start);
	kfree(skge->tx_ring.start);
	pci_free_consistent(hw->pdev, skge->mem_size, skge->mem, skge->dma);
	skge->mem = NULL;
	return 0;
}

@@ -2418,18 +2423,23 @@ static void skge_tx_timeout(struct net_device *dev)

static int skge_change_mtu(struct net_device *dev, int new_mtu)
{
	int err = 0;
	int running = netif_running(dev);
	int err;

	if (new_mtu < ETH_ZLEN || new_mtu > ETH_JUMBO_MTU)
		return -EINVAL;

	if (!netif_running(dev)) {
		dev->mtu = new_mtu;
		return 0;
	}

	if (running)
	skge_down(dev);

	dev->mtu = new_mtu;
	if (running)
		skge_up(dev);

	err = skge_up(dev);
	if (err)
		dev_close(dev);

	return err;
}