aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorKulikov Vasiliy <segooon@gmail.com>2010-07-09 02:25:40 +0000
committerDavid S. Miller <davem@davemloft.net>2010-07-10 19:42:06 -0700
commita607072b8685c18fde9c34aee8402eb6190b8518 (patch)
tree2b728194657ab5f8e5e44636d6b8676b01a34c0b /drivers/net
parent82596: do not panic on out of memory (diff)
downloadlinux-dev-a607072b8685c18fde9c34aee8402eb6190b8518.tar.xz
linux-dev-a607072b8685c18fde9c34aee8402eb6190b8518.zip
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')
-rw-r--r--drivers/net/82596.c30
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);