summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKulikov Vasiliy <segooon@gmail.com>2010-07-09 06:25:40 +0400
committerDavid S. Miller <davem@davemloft.net>2010-07-11 06:42:06 +0400
commita607072b8685c18fde9c34aee8402eb6190b8518 (patch)
tree2b728194657ab5f8e5e44636d6b8676b01a34c0b
parentf163530407280485034c836d908b49787a8189bc (diff)
downloadlinux-a607072b8685c18fde9c34aee8402eb6190b8518.tar.xz
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>
-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);