From a607072b8685c18fde9c34aee8402eb6190b8518 Mon Sep 17 00:00:00 2001 From: Kulikov Vasiliy Date: Fri, 9 Jul 2010 02:25:40 +0000 Subject: [PATCH] 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: Kulikov Vasiliy Signed-off-by: David S. Miller --- drivers/net/82596.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/drivers/net/82596.c b/drivers/net/82596.c index 73073d0b6894..89e43d7cb9f5 100644 --- a/drivers/net/82596.c +++ b/drivers/net/82596.c @@ -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);