static int el2_open(struct device *dev) { if (dev->irq < 2) { int irqlist[] = {5, 9, 3, 4, 0}; int *irqp = irqlist; outb(EGACFR_NORM, E33G_GACFR); /* Enable RAM and interrupts. */ do { if (request_irq (*irqp, NULL, 0, "bogus", NULL) != -EBUSY) { /* Twinkle the interrupt, and check if it's seen. */ autoirq_setup(0); outb_p(0x04 << ((*irqp == 9) ? 2 : *irqp), E33G_IDCFR); outb_p(0x00, E33G_IDCFR); if (*irqp == autoirq_report(0) /* It's a good IRQ line! */ && request_irq (dev->irq = *irqp, &ei_interrupt, 0, ei_status.name, NULL) == 0) break; } } while (*++irqp); if (*irqp == 0) { outb(EGACFR_IRQOFF, E33G_GACFR); /* disable interrupts. */ return -EAGAIN; } } else { if (request_irq(dev->irq, &ei_interrupt, 0, ei_status.name, NULL)) { return -EAGAIN; } } el2_init_card(dev); ei_open(dev); MOD_INC_USE_COUNT; return 0; }
static int el2_open(struct net_device *dev) { int retval; if (dev->irq < 2) { static const int irqlist[] = {5, 9, 3, 4, 0}; const int *irqp = irqlist; outb(EGACFR_NORM, E33G_GACFR); /* Enable RAM and interrupts. */ do { bool seen; retval = request_irq(*irqp, el2_probe_interrupt, 0, dev->name, &seen); if (retval == -EBUSY) continue; if (retval < 0) goto err_disable; /* Twinkle the interrupt, and check if it's seen. */ seen = false; smp_wmb(); outb_p(0x04 << ((*irqp == 9) ? 2 : *irqp), E33G_IDCFR); outb_p(0x00, E33G_IDCFR); msleep(1); free_irq(*irqp, &seen); if (!seen) continue; retval = request_irq(dev->irq = *irqp, eip_interrupt, 0, dev->name, dev); if (retval == -EBUSY) continue; if (retval < 0) goto err_disable; break; } while (*++irqp); if (*irqp == 0) { err_disable: outb(EGACFR_IRQOFF, E33G_GACFR); /* disable interrupts. */ return -EAGAIN; } } else { if ((retval = request_irq(dev->irq, eip_interrupt, 0, dev->name, dev))) { return retval; } } el2_init_card(dev); eip_open(dev); return 0; }
/* This is called whenever we have a unrecoverable failure: transmit timeout Bad ring buffer packet header */ static void el2_reset_8390(struct net_device *dev) { if (ei_debug > 1) { printk("%s: Resetting the 3c503 board...", dev->name); printk("%#lx=%#02x %#lx=%#02x %#lx=%#02x...", E33G_IDCFR, inb(E33G_IDCFR), E33G_CNTRL, inb(E33G_CNTRL), E33G_GACFR, inb(E33G_GACFR)); } outb_p(ECNTRL_RESET|ECNTRL_THIN, E33G_CNTRL); ei_status.txing = 0; outb_p(ei_status.interface_num==0 ? ECNTRL_THIN : ECNTRL_AUI, E33G_CNTRL); el2_init_card(dev); if (ei_debug > 1) printk("done\n"); }
static int el2_open(struct net_device *dev) { int retval = -EAGAIN; if (dev->irq < 2) { int irqlist[] = {5, 9, 3, 4, 0}; int *irqp = irqlist; outb(EGACFR_NORM, E33G_GACFR); /* Enable RAM and interrupts. */ do { if (request_irq (*irqp, NULL, 0, "bogus", dev) != -EBUSY) { /* Twinkle the interrupt, and check if it's seen. */ unsigned long cookie = probe_irq_on(); outb_p(0x04 << ((*irqp == 9) ? 2 : *irqp), E33G_IDCFR); outb_p(0x00, E33G_IDCFR); if (*irqp == probe_irq_off(cookie) /* It's a good IRQ line! */ && ((retval = request_irq(dev->irq = *irqp, eip_interrupt, 0, dev->name, dev)) == 0)) break; } } while (*++irqp); if (*irqp == 0) { outb(EGACFR_IRQOFF, E33G_GACFR); /* disable interrupts. */ return retval; } } else { if ((retval = request_irq(dev->irq, eip_interrupt, 0, dev->name, dev))) { return retval; } } el2_init_card(dev); eip_open(dev); return 0; }