diff options
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 adb54fe2d82..c93679ee699 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)  |