Commit a607072b authored by Kulikov Vasiliy's avatar Kulikov Vasiliy Committed by David S. Miller
Browse files

82596: free resources on error



IRQ 56 was not freed anywhere (neither in i596_open() on error nor in
i596_close()), rx_bufs were not freed if init_i596_mem() fails,
netif_stop_queue() was not called.

Signed-off-by: default avatarKulikov Vasiliy <segooon@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent f1635304
Loading
Loading
Loading
Loading
+22 −8
Original line number Diff line number Diff line
@@ -1015,24 +1015,35 @@ static int i596_open(struct net_device *dev)
	}
#ifdef ENABLE_MVME16x_NET
	if (MACH_IS_MVME16x) {
		if (request_irq(0x56, i596_error, 0, "i82596_error", dev))
			return -EAGAIN;
		if (request_irq(0x56, i596_error, 0, "i82596_error", dev)) {
			res = -EAGAIN;
			goto err_irq_dev;
		}
	}
#endif
	res = init_rx_bufs(dev);
	if (res) {
		free_irq(dev->irq, dev);
		return res;
	}
	if (res)
		goto err_irq_56;

	netif_start_queue(dev);

	/* Initialize the 82596 memory */
	if (init_i596_mem(dev)) {
		res = -EAGAIN;
		free_irq(dev->irq, dev);
		goto err_queue;
	}

	return 0;

err_queue:
	netif_stop_queue(dev);
	remove_rx_bufs(dev);
err_irq_56:
#ifdef ENABLE_MVME16x_NET
	free_irq(0x56, dev);
#endif
err_irq_dev:
	free_irq(dev->irq, dev);

	return res;
}

@@ -1498,6 +1509,9 @@ static int i596_close(struct net_device *dev)
	}
#endif

#ifdef ENABLE_MVME16x_NET
	free_irq(0x56, dev);
#endif
	free_irq(dev->irq, dev);
	remove_rx_bufs(dev);