/* Probe for TDK LAK-AX031, which is an SSi 78Q8377A based board. */ static int fe_probe_ssi(device_t dev) { struct fe_softc *sc = device_get_softc(dev); u_long iobase, irq; u_char eeprom [SSI_EEPROM_SIZE]; static struct fe_simple_probe_struct probe_table [] = { { FE_DLCR2, 0x08, 0x00 }, { FE_DLCR4, 0x08, 0x00 }, { 0 } }; /* See if the specified I/O address is possible for 78Q8377A. */ if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) return ENXIO; if ((iobase & ~0x3F0) != 0x000) return ENXIO; /* We have 16 registers. */ if (fe_alloc_port(dev, 16)) return ENXIO; /* Fill the softc struct with default values. */ fe_softc_defaults(sc); /* See if the card is on its address. */ if (!fe_simple_probe(sc, probe_table)) return ENXIO; /* We now have to read the config EEPROM. We should be very careful, since doing so destroys a register. (Remember, we are not yet sure we have a LAK-AX031 board here.) Don't remember to select BMPRs bofore reading EEPROM, since other register bank may be selected before the probe() is called. */ fe_read_eeprom_ssi(sc, eeprom); /* Make sure the Ethernet (MAC) station address is of TDK's. */ if (!fe_valid_Ether_p(eeprom+FE_SSI_EEP_ADDR, 0x008098)) return ENXIO; bcopy(eeprom + FE_SSI_EEP_ADDR, sc->enaddr, ETHER_ADDR_LEN); /* This looks like a TDK-AX031 board. It requires an explicit IRQ setting in config, since we currently don't know how we can find the IRQ value assigned by ISA PnP manager. */ if (bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL) != 0) { fe_irq_failure("LAK-AX031", sc->sc_unit, NO_IRQ, NULL); return ENXIO; } /* Fill softc struct accordingly. */ sc->type = FE_TYPE_SSI; sc->typestr = "LAK-AX031"; sc->mbitmap = MB_HT; sc->defmedia = MB_HT; return 0; }
/* * Probe and initialization for Gateway Communications' old cards. */ static int fe_probe_gwy(device_t dev) { struct fe_softc *sc = device_get_softc(dev); u_long iobase, irq; static struct fe_simple_probe_struct probe_table [] = { /* { FE_DLCR2, 0x70, 0x00 }, */ { FE_DLCR2, 0x58, 0x00 }, { FE_DLCR4, 0x08, 0x00 }, { 0 } }; /* See if the specified I/O address is possible for Gateway boards. */ if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) return ENXIO; if ((iobase & ~0x1E0) != 0x200) return ENXIO; /* That's all. The card occupies 32 I/O addresses, as always. */ if (fe_alloc_port(dev, 32)) return ENXIO; /* Setup an I/O address mapping table and some others. */ fe_softc_defaults(sc); /* See if the card is on its address. */ if (!fe_simple_probe(sc, probe_table)) return ENXIO; /* Get our station address from EEPROM. */ fe_inblk(sc, 0x18, sc->enaddr, ETHER_ADDR_LEN); /* Make sure it is Gateway Communication's. */ if (!fe_valid_Ether_p(sc->enaddr, 0x000061)) return ENXIO; /* Gateway's board requires an explicit IRQ to work, since it is not possible to probe the setting of jumpers. */ if (bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL) != 0) { fe_irq_failure("Gateway Ethernet", sc->sc_unit, NO_IRQ, NULL); return ENXIO; } /* Fill softc struct accordingly. */ sc->type = FE_TYPE_GWY; sc->typestr = "Gateway Ethernet (Fujitsu chipset)"; return 0; }
/* * Probe for Gateway Communications' old cards. * (both as Generic MB86960 probe routine) */ static int fe_probe_gwy(device_t dev) { struct fe_softc *sc = device_get_softc(dev); static struct fe_simple_probe_struct probe_table [] = { /* { FE_DLCR2, 0x70, 0x00 }, */ { FE_DLCR2, 0x58, 0x00 }, { FE_DLCR4, 0x08, 0x00 }, { 0 } }; /* * XXX * I'm not sure which address is possible, so accepts any. */ if (fe98_alloc_port(dev, FE_TYPE_GWY)) return ENXIO; /* Fill the softc struct with default values. */ fe_softc_defaults(sc); /* See if the card is on its address. */ if (!fe_simple_probe(sc, probe_table)) return ENXIO; /* Get our station address from EEPROM. */ fe_inblk(sc, 0x18, sc->enaddr, ETHER_ADDR_LEN); if (!fe_valid_Ether_p(sc->enaddr, 0x000000)) return ENXIO; /* Determine the card type. */ sc->typestr = "Generic MB86960 Ethernet"; if (fe_valid_Ether_p(sc->enaddr, 0x000061)) sc->typestr = "Gateway Ethernet (Fujitsu chipset)"; /* Gateway's board requires an explicit IRQ to work, since it is not possible to probe the setting of jumpers. */ if (bus_get_resource(dev, SYS_RES_IRQ, 0, NULL, NULL) != 0) { fe_irq_failure(sc->typestr, sc->sc_unit, NO_IRQ, NULL); return ENXIO; } return 0; }
/* Probe and initialization for Ungermann-Bass Network K.K. "Access/PC" boards. */ static int fe_probe_ubn(device_t dev) { struct fe_softc *sc = device_get_softc(dev); u_long iobase, irq; #if 0 u_char sum; #endif static struct fe_simple_probe_struct const probe_table [] = { { FE_DLCR2, 0x58, 0x00 }, { FE_DLCR4, 0x08, 0x00 }, { 0 } }; /* See if the specified I/O address is possible for AccessPC/ISA. */ if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) return ENXIO; if ((iobase & ~0x0E0) != 0x300) return ENXIO; /* We have 32 registers. */ if (fe_alloc_port(dev, 32)) return ENXIO; /* Setup an I/O address mapping table and some others. */ fe_softc_defaults(sc); /* Simple probe. */ if (!fe_simple_probe(sc, probe_table)) return ENXIO; /* Get our station address form ID ROM and make sure it is UBN's. */ fe_inblk(sc, 0x18, sc->enaddr, ETHER_ADDR_LEN); if (!fe_valid_Ether_p(sc->enaddr, 0x00DD01)) return ENXIO; #if 0 /* Calculate checksum. */ sum = fe_inb(sc, 0x1e); for (i = 0; i < ETHER_ADDR_LEN; i++) { sum ^= sc->enaddr[i]; } if (sum != 0) return ENXIO; #endif /* This looks like an AccessPC/ISA board. It requires an explicit IRQ setting in config. Make sure we have one, determining an appropriate value for the IRQ control register. */ irq = 0; bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL); switch (irq) { case 3: sc->priv_info = 0x02; break; case 4: sc->priv_info = 0x04; break; case 5: sc->priv_info = 0x08; break; case 10: sc->priv_info = 0x10; break; default: fe_irq_failure("Access/PC", sc->sc_unit, irq, "3/4/5/10"); return ENXIO; } /* Fill softc struct accordingly. */ sc->type = FE_TYPE_UBN; sc->typestr = "Access/PC"; sc->init = fe_init_ubn; return 0; }
/* * Probe and initialization for TDK/LANX LAC-AX012/013 boards. */ static int fe_probe_lnx(device_t dev) { struct fe_softc *sc = device_get_softc(dev); u_long iobase, irq; u_char eeprom [LNX_EEPROM_SIZE]; static struct fe_simple_probe_struct probe_table [] = { { FE_DLCR2, 0x58, 0x00 }, { FE_DLCR4, 0x08, 0x00 }, { 0 } }; /* See if the specified I/O address is possible for TDK/LANX boards. */ /* 300, 320, 340, and 360 are allowed. */ if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) return ENXIO; if ((iobase & ~0x060) != 0x300) return ENXIO; /* We have 32 registers. */ if (fe_alloc_port(dev, 32)) return ENXIO; /* Fill the softc struct with default values. */ fe_softc_defaults(sc); /* See if the card is on its address. */ if (!fe_simple_probe(sc, probe_table)) return ENXIO; /* We now have to read the config EEPROM. We should be very careful, since doing so destroys a register. (Remember, we are not yet sure we have a LAC-AX012/AX013 board here.) */ fe_read_eeprom_lnx(sc, eeprom); /* Make sure the Ethernet (MAC) station address is of TDK/LANX's. */ if (!fe_valid_Ether_p(eeprom, 0x008098)) return ENXIO; bcopy(eeprom, sc->enaddr, ETHER_ADDR_LEN); /* This looks like a TDK/LANX board. It requires an explicit IRQ setting in config. Make sure we have one, determining an appropriate value for the IRQ control register. */ irq = 0; bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL); switch (irq) { case 3: sc->priv_info = 0x40 | LNX_CLK_LO | LNX_SDA_HI; break; case 4: sc->priv_info = 0x20 | LNX_CLK_LO | LNX_SDA_HI; break; case 5: sc->priv_info = 0x10 | LNX_CLK_LO | LNX_SDA_HI; break; case 9: sc->priv_info = 0x80 | LNX_CLK_LO | LNX_SDA_HI; break; default: fe_irq_failure("LAC-AX012/AX013", sc->sc_unit, irq, "3/4/5/9"); return ENXIO; } /* Fill softc struct accordingly. */ sc->type = FE_TYPE_LNX; sc->typestr = "LAC-AX012/AX013"; sc->init = fe_init_lnx; return 0; }
/* * Probe for RATOC REX-9880/81/82/83 series. */ static int fe_probe_rex(device_t dev) { struct fe_softc *sc = device_get_softc(dev); int i; rman_res_t iobase, irq; u_char eeprom [REX_EEPROM_SIZE]; static struct fe_simple_probe_struct probe_table [] = { { FE_DLCR2, 0x58, 0x00 }, { FE_DLCR4, 0x08, 0x00 }, { 0 } }; /* See if the specified I/O address is possible for REX-9880. */ /* 6[46CE]D0 are allowed. */ if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) return ENXIO; if ((iobase & ~0xA00) != 0x64D0) return ENXIO; if (fe98_alloc_port(dev, FE_TYPE_REX)) return ENXIO; /* Fill the softc struct with default values. */ fe_softc_defaults(sc); /* See if the card is on its address. */ if (!fe_simple_probe(sc, probe_table)) return ENXIO; /* We now have to read the config EEPROM. We should be very careful, since doing so destroys a register. (Remember, we are not yet sure we have a REX-9880 board here.) */ fe_read_eeprom_rex(sc, eeprom); for (i = 0; i < ETHER_ADDR_LEN; i++) sc->enaddr[i] = eeprom[7 - i]; /* Make sure it is RATOC's. */ if (!fe_valid_Ether_p(sc->enaddr, 0x00C0D0) && !fe_valid_Ether_p(sc->enaddr, 0x00803D)) return 0; /* Setup the board type. */ sc->typestr = "REX-9880/9883"; /* This looks like a REX-9880 board. It requires an explicit IRQ setting in config. Make sure we have one, determining an appropriate value for the IRQ control register. */ irq = 0; bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL); switch (irq) { case 3: sc->priv_info = 0x10; break; case 5: sc->priv_info = 0x20; break; case 6: sc->priv_info = 0x40; break; case 12: sc->priv_info = 0x80; break; default: fe_irq_failure(sc->typestr, sc->sc_unit, irq, "3/5/6/12"); return ENXIO; } /* Setup hooks. We need a special initialization procedure. */ sc->init = fe_init_rex; /* REX-9880 has 64KB SRAM. */ sc->proto_dlcr6 = FE_D6_BUFSIZ_64KB | FE_D6_TXBSIZ_2x4KB | FE_D6_BBW_WORD | FE_D6_SBW_WORD | FE_D6_SRAM; #if 1 sc->proto_dlcr7 |= FE_D7_EOPPOL; /* XXX */ #endif return 0; }
/* * Probe for Ungermann-Bass Access/PC N98C+(Model 85152). */ static int fe_probe_ubn(device_t dev) { struct fe_softc *sc = device_get_softc(dev); u_char sum, save7; rman_res_t iobase, irq; int i; static struct fe_simple_probe_struct const probe_table [] = { { FE_DLCR2, 0x58, 0x00 }, { FE_DLCR4, 0x08, 0x00 }, { 0 } }; /* See if the specified I/O address is possible for Access/PC. */ /* [01][048C]D0 are allowed. */ if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) return ENXIO; if ((iobase & ~0x1C00) != 0xD0) return ENXIO; if (fe98_alloc_port(dev, FE_TYPE_UBN)) return ENXIO; /* Fill the softc struct with default values. */ fe_softc_defaults(sc); /* Simple probe. */ if (!fe_simple_probe(sc, probe_table)) return ENXIO; /* NOTE: Access/NOTE N98 sometimes freeze when reading station address. In case of using it togather with C-NET(9N)C, this problem usually happens. Writing DLCR7 prevents freezing, but I don't know why. FIXME. */ /* Save the current value for the DLCR7 register we are about to destroy. */ save7 = fe_inb(sc, FE_DLCR7); fe_outb(sc, FE_DLCR7, sc->proto_dlcr7 | FE_D7_RBS_BMPR | FE_D7_POWER_UP); /* Get our station address form ID ROM and make sure it is UBN's. */ fe_inblk(sc, 0x18, sc->enaddr, ETHER_ADDR_LEN); if (!fe_valid_Ether_p(sc->enaddr, 0x00DD01)) goto fail_ubn; #if 1 /* Calculate checksum. */ sum = fe_inb(sc, 0x1e); for (i = 0; i < ETHER_ADDR_LEN; i++) sum ^= sc->enaddr[i]; if (sum != 0) goto fail_ubn; #endif /* Setup the board type. */ sc->typestr = "Access/PC"; /* This looks like an AccessPC/N98C+ board. It requires an explicit IRQ setting in config. Make sure we have one, determining an appropriate value for the IRQ control register. */ irq = 0; bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL); switch (irq) { case 3: sc->priv_info = 0x01; break; case 5: sc->priv_info = 0x02; break; case 6: sc->priv_info = 0x04; break; case 12: sc->priv_info = 0x08; break; default: fe_irq_failure(sc->typestr, sc->sc_unit, irq, "3/5/6/12"); goto fail_ubn; } /* Setup hooks. We need a special initialization procedure. */ sc->init = fe_init_ubn; return 0; fail_ubn: fe_outb(sc, FE_DLCR7, save7); return ENXIO; }
/* * Probe for TDK LAC-98012/013/025/9N011 - parhaps. */ static int fe_probe_lnx(device_t dev) { struct fe_softc *sc = device_get_softc(dev); rman_res_t iobase, irq; u_char eeprom [LNX_EEPROM_SIZE]; static struct fe_simple_probe_struct probe_table [] = { { FE_DLCR2, 0x58, 0x00 }, { FE_DLCR4, 0x08, 0x00 }, { 0 } }; /* See if the specified I/O address is possible for TDK/LANX boards. */ /* 0D0, 4D0, 8D0, and CD0 are allowed. */ if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) return ENXIO; if ((iobase & ~0xC00) != 0xD0) return ENXIO; if (fe98_alloc_port(dev, FE_TYPE_LNX)) return ENXIO; /* Fill the softc struct with default values. */ fe_softc_defaults(sc); /* See if the card is on its address. */ if (!fe_simple_probe(sc, probe_table)) return ENXIO; /* We now have to read the config EEPROM. We should be very careful, since doing so destroys a register. (Remember, we are not yet sure we have a LAC-98012/98013 board here.) */ fe_read_eeprom_lnx(sc, eeprom); /* Make sure the Ethernet (MAC) station address is of TDK/LANX's. */ if (!fe_valid_Ether_p(eeprom, 0x008098)) return ENXIO; bcopy(eeprom, sc->enaddr, ETHER_ADDR_LEN); /* Setup the board type. */ sc->typestr = "LAC-98012/98013"; /* This looks like a TDK/LANX board. It requires an explicit IRQ setting in config. Make sure we have one, determining an appropriate value for the IRQ control register. */ irq = 0; if (bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL) != 0) return ENXIO; switch (irq) { case 3 : sc->priv_info = 0x10 | LNX_CLK_LO | LNX_SDA_HI; break; case 5 : sc->priv_info = 0x20 | LNX_CLK_LO | LNX_SDA_HI; break; case 6 : sc->priv_info = 0x40 | LNX_CLK_LO | LNX_SDA_HI; break; case 12: sc->priv_info = 0x80 | LNX_CLK_LO | LNX_SDA_HI; break; default: fe_irq_failure(sc->typestr, sc->sc_unit, irq, "3/5/6/12"); return ENXIO; } /* LAC-98's system bus width is 8-bit. */ sc->proto_dlcr6 = FE_D6_BUFSIZ_32KB | FE_D6_TXBSIZ_2x2KB | FE_D6_BBW_BYTE | FE_D6_SBW_BYTE | FE_D6_SRAM_150ns; /* Setup hooks. We need a special initialization procedure. */ sc->init = fe_init_lnx; return 0; }
/* * Probe for Contec C-NET(98)P2 series. * (Logitec LAN-98TP/LAN-98T25P - parhaps) */ static int fe_probe_ssi(device_t dev) { struct fe_softc *sc = device_get_softc(dev); rman_res_t iobase, irq; u_char eeprom [SSI_EEPROM_SIZE]; static struct fe_simple_probe_struct probe_table [] = { { FE_DLCR2, 0x08, 0x00 }, { FE_DLCR4, 0x08, 0x00 }, { 0 } }; static u_short const irqmap[] = { /* INT0 INT1 INT2 */ NO_IRQ, NO_IRQ, NO_IRQ, 3, NO_IRQ, 5, 6, NO_IRQ, NO_IRQ, 9, 10, NO_IRQ, 12, 13, NO_IRQ, NO_IRQ, /* INT3 INT41 INT5 INT6 */ }; /* See if the specified I/O address is possible for 78Q8377A. */ /* [0-D]3D0 are allowed. */ if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) return ENXIO; if ((iobase & 0xFFF) != 0x3D0) return ENXIO; if (fe98_alloc_port(dev, FE_TYPE_SSI)) return ENXIO; /* Fill the softc struct with default values. */ fe_softc_defaults(sc); /* See if the card is on its address. */ if (!fe_simple_probe(sc, probe_table)) return ENXIO; /* We now have to read the config EEPROM. We should be very careful, since doing so destroys a register. (Remember, we are not yet sure we have a C-NET(98)P2 board here.) Don't remember to select BMPRs bofore reading EEPROM, since other register bank may be selected before the probe() is called. */ fe_read_eeprom_ssi(sc, eeprom); /* Make sure the Ethernet (MAC) station address is of Contec's. */ if (!fe_valid_Ether_p(eeprom + FE_SSI_EEP_ADDR, 0x00804C)) return ENXIO; bcopy(eeprom + FE_SSI_EEP_ADDR, sc->enaddr, ETHER_ADDR_LEN); /* Setup the board type. */ sc->typestr = "C-NET(98)P2"; /* Non-PnP mode, set static resource from eeprom. */ if (!isa_get_vendorid(dev)) { /* Get IRQ configuration from EEPROM. */ irq = irqmap[eeprom[FE_SSI_EEP_IRQ]]; if (irq == NO_IRQ) { fe_irq_failure(sc->typestr, sc->sc_unit, irq, "3/5/6/9/10/12/13"); return ENXIO; } bus_set_resource(dev, SYS_RES_IRQ, 0, irq, 1); } /* Get Duplex-mode configuration from EEPROM. */ sc->proto_dlcr4 |= (eeprom[FE_SSI_EEP_DUPLEX] & FE_D4_DSC); /* Fill softc struct accordingly. */ sc->mbitmap = MB_HT; sc->defmedia = MB_HT; return 0; }
static int fe_probe_cnet9ne (device_t dev) { struct fe_softc *sc = device_get_softc(dev); rman_res_t iobase, irq; static struct fe_simple_probe_struct probe_table [] = { { FE_DLCR2, 0x58, 0x00 }, { FE_DLCR4, 0x08, 0x00 }, { 0 } }; /* See if the specified I/O address is possible for C-NET(9N)E. */ if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) return ENXIO; if (iobase != 0x73D0) return ENXIO; if (fe98_alloc_port(dev, FE_TYPE_CNET9NE)) return ENXIO; /* Fill the softc struct with default values. */ fe_softc_defaults(sc); /* See if the card is on its address. */ if (!fe_simple_probe(sc, probe_table)) return ENXIO; /* Get our station address from EEPROM. */ fe_inblk(sc, 0x18, sc->enaddr, ETHER_ADDR_LEN); /* Make sure it is Contec's. */ if (!fe_valid_Ether_p(sc->enaddr, 0x00804C)) return ENXIO; /* Determine the card type. */ if (sc->enaddr[3] == 0x06) { sc->typestr = "C-NET(9N)C"; /* We seems to need our own IDENT bits... FIXME. */ sc->proto_dlcr7 = FE_D7_BYTSWP_LH | FE_D7_IDENT_NICE; /* C-NET(9N)C requires an explicit IRQ to work. */ if (bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL) != 0) { fe_irq_failure(sc->typestr, sc->sc_unit, NO_IRQ, NULL); return ENXIO; } } else { sc->typestr = "C-NET(9N)E"; /* C-NET(9N)E works only IRQ5. */ if (bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL) != 0) return ENXIO; if (irq != 5) { fe_irq_failure(sc->typestr, sc->sc_unit, irq, "5"); return ENXIO; } /* We need an init hook to initialize ASIC before we start. */ sc->init = fe_init_cnet9ne; } /* C-NET(9N)E has 64KB SRAM. */ sc->proto_dlcr6 = FE_D6_BUFSIZ_64KB | FE_D6_TXBSIZ_2x4KB | FE_D6_BBW_WORD | FE_D6_SBW_WORD | FE_D6_SRAM; return 0; }
static int fe_probe_re1000(device_t dev) { struct fe_softc *sc = device_get_softc(dev); int i, n; rman_res_t iobase, irq; u_char sum; static struct fe_simple_probe_struct probe_table [] = { { FE_DLCR2, 0x58, 0x00 }, { FE_DLCR4, 0x08, 0x00 }, { 0 } }; /* See if the specified I/O address is possible for RE1000. */ /* [01]D[02468ACE] are allowed. */ if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) return ENXIO; if ((iobase & ~0x10E) != 0xD0) return ENXIO; if (fe98_alloc_port(dev, FE_TYPE_RE1000)) return ENXIO; /* Fill the softc struct with default values. */ fe_softc_defaults(sc); /* See if the card is on its address. */ if (!fe_simple_probe(sc, probe_table)) return ENXIO; /* Get our station address from EEPROM. */ fe_inblk(sc, 0x18, sc->enaddr, ETHER_ADDR_LEN); /* Make sure it is Allied-Telesis's. */ if (!fe_valid_Ether_p(sc->enaddr, 0x0000F4)) return ENXIO; #if 1 /* Calculate checksum. */ sum = fe_inb(sc, 0x1e); for (i = 0; i < ETHER_ADDR_LEN; i++) sum ^= sc->enaddr[i]; if (sum != 0) return ENXIO; #endif /* Setup the board type. */ sc->typestr = "RE1000"; /* This looks like an RE1000 board. It requires an explicit IRQ setting in config. Make sure we have one, determining an appropriate value for the IRQ control register. */ irq = 0; bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL); switch (irq) { case 3: n = 0x10; break; case 5: n = 0x20; break; case 6: n = 0x40; break; case 12: n = 0x80; break; default: fe_irq_failure(sc->typestr, sc->sc_unit, irq, "3/5/6/12"); return ENXIO; } sc->priv_info = (fe_inb(sc, FE_RE1000_IRQCONF) & 0x0f) | n; /* Setup hooks. We need a special initialization procedure. */ sc->init = fe_init_re1000; return 0; }