diff options
author | Kulikov Vasiliy <segooon@gmail.com> | 2010-07-10 01:39:06 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-07-12 20:21:44 -0700 |
commit | 546e3abde391ef01ef4690e941611654343ea0bf (patch) | |
tree | f76dd44d1fe7d5d2f06fa178ca82033c09bf3ef5 /drivers/net/macsonic.c | |
parent | 62cd69a10683bd17a2454213b8c36a4399c533ab (diff) | |
download | linux-546e3abde391ef01ef4690e941611654343ea0bf.tar.bz2 |
macsonic: free irqs if sonic_open() fails
macsonic_open() doesn't check sonic_open() return code. If it is error
we must free requested IRQs.
Signed-off-by: Kulikov Vasiliy <segooon@gmail.com>
Signed-off-by: Dan Carpenter <error27@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/macsonic.c')
-rw-r--r-- | drivers/net/macsonic.c | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/drivers/net/macsonic.c b/drivers/net/macsonic.c index adb54fe2d82a..c93679ee6994 100644 --- a/drivers/net/macsonic.c +++ b/drivers/net/macsonic.c @@ -140,21 +140,40 @@ static irqreturn_t macsonic_interrupt(int irq, void *dev_id) static int macsonic_open(struct net_device* dev) { - if (request_irq(dev->irq, sonic_interrupt, IRQ_FLG_FAST, "sonic", dev)) { - printk(KERN_ERR "%s: unable to get IRQ %d.\n", dev->name, dev->irq); - return -EAGAIN; + int retval; + + retval = request_irq(dev->irq, sonic_interrupt, IRQ_FLG_FAST, + "sonic", dev); + if (retval) { + printk(KERN_ERR "%s: unable to get IRQ %d.\n", + dev->name, dev->irq); + goto err; } /* Under the A/UX interrupt scheme, the onboard SONIC interrupt comes * in at priority level 3. However, we sometimes get the level 2 inter- * rupt as well, which must prevent re-entrance of the sonic handler. */ - if (dev->irq == IRQ_AUTO_3) - if (request_irq(IRQ_NUBUS_9, macsonic_interrupt, IRQ_FLG_FAST, "sonic", dev)) { - printk(KERN_ERR "%s: unable to get IRQ %d.\n", dev->name, IRQ_NUBUS_9); - free_irq(dev->irq, dev); - return -EAGAIN; + if (dev->irq == IRQ_AUTO_3) { + retval = request_irq(IRQ_NUBUS_9, macsonic_interrupt, + IRQ_FLG_FAST, "sonic", dev); + if (retval) { + printk(KERN_ERR "%s: unable to get IRQ %d.\n", + dev->name, IRQ_NUBUS_9); + goto err_irq; } - return sonic_open(dev); + } + retval = sonic_open(dev); + if (retval) + goto err_irq_nubus; + return 0; + +err_irq_nubus: + if (dev->irq == IRQ_AUTO_3) + free_irq(IRQ_NUBUS_9, dev); +err_irq: + free_irq(dev->irq, dev); +err: + return retval; } static int macsonic_close(struct net_device* dev) |