Message ID | 1278759661-7731-1-git-send-email-segooon@gmail.com |
---|---|
State | Superseded, archived |
Delegated to: | David Miller |
Headers | show |
On Sat, Jul 10, 2010 at 03:01:00PM +0400, Kulikov Vasiliy wrote: > + 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: This should be: + if (dev->irq == IRQ_AUTO_3) + free_irq(IRQ_NUBUS_9, dev); > +err_irq: > + free_irq(dev->irq, dev); > +err: > + return retval; > } regards, dan carpenter -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Sat, Jul 10, 2010 at 13:22 +0200, Dan Carpenter wrote: > On Sat, Jul 10, 2010 at 03:01:00PM +0400, Kulikov Vasiliy wrote: > > > + 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: > > This should be: > > + if (dev->irq == IRQ_AUTO_3) > + free_irq(IRQ_NUBUS_9, dev); Of course, thank you. > > > +err_irq: > > + free_irq(dev->irq, dev); > > +err: > > + return retval; > > } > > regards, > dan carpenter > -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/macsonic.c b/drivers/net/macsonic.c index adb54fe..3730762 100644 --- a/drivers/net/macsonic.c +++ b/drivers/net/macsonic.c @@ -140,21 +140,39 @@ 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: + free_irq(IRQ_NUBUS_9, dev); +err_irq: + free_irq(dev->irq, dev); +err: + return retval; } static int macsonic_close(struct net_device* dev)
macsonic_open() doesn't check sonic_open() return code. If it is error we must free requested IRQ. Signed-off-by: Kulikov Vasiliy <segooon@gmail.com> --- drivers/net/macsonic.c | 36 +++++++++++++++++++++++++++--------- 1 files changed, 27 insertions(+), 9 deletions(-)