|
@@ -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)
|