diff options
author | Kulikov Vasiliy <segooon@gmail.com> | 2010-07-09 02:25:40 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-07-10 19:42:06 -0700 |
commit | a607072b8685c18fde9c34aee8402eb6190b8518 (patch) | |
tree | 2b728194657ab5f8e5e44636d6b8676b01a34c0b /drivers/net/82596.c | |
parent | f163530407280485034c836d908b49787a8189bc (diff) | |
download | linux-a607072b8685c18fde9c34aee8402eb6190b8518.tar.bz2 |
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 <segooon@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/82596.c')
-rw-r--r-- | drivers/net/82596.c | 30 |
1 files 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); |