Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/ed/if_ed_cbus.c
Show First 20 Lines • Show All 1,015 Lines • ▼ Show 20 Lines | #endif | ||||
error = ed98_alloc_memory(dev, 0); | error = ed98_alloc_memory(dev, 0); | ||||
if (error) | if (error) | ||||
return (error); | return (error); | ||||
/* Check I/O address. 0x[a-f]3d0 are allowed. */ | /* Check I/O address. 0x[a-f]3d0 are allowed. */ | ||||
if (((rman_get_start(sc->port_res) & 0x0fff) != 0x03d0) | if (((rman_get_start(sc->port_res) & 0x0fff) != 0x03d0) | ||||
|| ((rman_get_start(sc->port_res) & 0xf000) < (u_short) 0xa000)) { | || ((rman_get_start(sc->port_res) & 0xf000) < (u_short) 0xa000)) { | ||||
#ifdef DIAGNOSTIC | #ifdef DIAGNOSTIC | ||||
device_printf(dev, "Invalid i/o port configuration (0x%lx) " | device_printf(dev, "Invalid i/o port configuration (0x%jx) " | ||||
"must be %s for %s\n", rman_get_start(sc->port_res), | "must be %s for %s\n", rman_get_start(sc->port_res), | ||||
"0x[a-f]3d0", "CNET98"); | "0x[a-f]3d0", "CNET98"); | ||||
#endif | #endif | ||||
return (ENXIO); | return (ENXIO); | ||||
} | } | ||||
#ifdef DIAGNOSTIC | #ifdef DIAGNOSTIC | ||||
/* Check window area address */ | /* Check window area address */ | ||||
tmp_s = rman_get_start(sc->mem_res) >> 12; | tmp_s = rman_get_start(sc->mem_res) >> 12; | ||||
if (tmp_s < 0x80) { | if (tmp_s < 0x80) { | ||||
device_printf(dev, "Please change window address(0x%lx)\n", | device_printf(dev, "Please change window address(0x%jx)\n", | ||||
rman_get_start(sc->mem_res)); | rman_get_start(sc->mem_res)); | ||||
return (ENXIO); | return (ENXIO); | ||||
} | } | ||||
tmp_s &= 0x0f; | tmp_s &= 0x0f; | ||||
tmp = rman_get_start(sc->port_res) >> 12; | tmp = rman_get_start(sc->port_res) >> 12; | ||||
if ((tmp_s <= tmp) && (tmp < (tmp_s + 4))) { | if ((tmp_s <= tmp) && (tmp < (tmp_s + 4))) { | ||||
device_printf(dev, "Please change iobase address(0x%lx) " | device_printf(dev, "Please change iobase address(0x%jx) " | ||||
"or window address(0x%lx)\n", | "or window address(0x%jx)\n", | ||||
rman_get_start(sc->port_res), | rman_get_start(sc->port_res), | ||||
rman_get_start(sc->mem_res)); | rman_get_start(sc->mem_res)); | ||||
return (ENXIO); | return (ENXIO); | ||||
} | } | ||||
#endif | #endif | ||||
/* Reset the board */ | /* Reset the board */ | ||||
ed_reset_CNET98(sc, flags); | ed_reset_CNET98(sc, flags); | ||||
▲ Show 20 Lines • Show All 70 Lines • ▼ Show 20 Lines | case 9: | ||||
break; | break; | ||||
case 12: | case 12: | ||||
tmp = ED_CNET98_INT_IRQ12; | tmp = ED_CNET98_INT_IRQ12; | ||||
break; | break; | ||||
case 13: | case 13: | ||||
tmp = ED_CNET98_INT_IRQ13; | tmp = ED_CNET98_INT_IRQ13; | ||||
break; | break; | ||||
default: | default: | ||||
device_printf(dev, "Invalid irq configuration (%ld) must be " | device_printf(dev, "Invalid irq configuration (%jd) must be " | ||||
"%s for %s\n", conf_irq, "3,5,6,9,12,13", "CNET98"); | "%s for %s\n", conf_irq, "3,5,6,9,12,13", "CNET98"); | ||||
return (ENXIO); | return (ENXIO); | ||||
} | } | ||||
ed_asic_outb(sc, ED_CNET98_INT_LEV, tmp); | ed_asic_outb(sc, ED_CNET98_INT_LEV, tmp); | ||||
DELAY(1000); | DELAY(1000); | ||||
/* | /* | ||||
* Set interrupt mask. | * Set interrupt mask. | ||||
* bit7:1 all interrupt mask | * bit7:1 all interrupt mask | ||||
Show All 24 Lines | if (error) | ||||
return (error); | return (error); | ||||
sc->asic_offset = ED_NOVELL_ASIC_OFFSET; | sc->asic_offset = ED_NOVELL_ASIC_OFFSET; | ||||
sc->nic_offset = ED_NOVELL_NIC_OFFSET; | sc->nic_offset = ED_NOVELL_NIC_OFFSET; | ||||
/* Check I/O address. 0x[0-f]3d0 are allowed. */ | /* Check I/O address. 0x[0-f]3d0 are allowed. */ | ||||
if ((rman_get_start(sc->port_res) & 0x0fff) != 0x03d0) { | if ((rman_get_start(sc->port_res) & 0x0fff) != 0x03d0) { | ||||
#ifdef DIAGNOSTIC | #ifdef DIAGNOSTIC | ||||
device_printf(dev, "Invalid i/o port configuration (0x%lx) " | device_printf(dev, "Invalid i/o port configuration (0x%jx) " | ||||
"must be %s for %s\n", rman_get_start(sc->port_res), | "must be %s for %s\n", rman_get_start(sc->port_res), | ||||
"0x?3d0", "CNET98E/L"); | "0x?3d0", "CNET98E/L"); | ||||
#endif | #endif | ||||
return (ENXIO); | return (ENXIO); | ||||
} | } | ||||
/* Reset the board */ | /* Reset the board */ | ||||
ed_reset_CNET98(sc, flags); | ed_reset_CNET98(sc, flags); | ||||
Show All 37 Lines | case 6: | ||||
tmp = ED_CNET98EL_ICR_IRQ6; | tmp = ED_CNET98EL_ICR_IRQ6; | ||||
break; | break; | ||||
#if 0 | #if 0 | ||||
case 12: | case 12: | ||||
tmp = ED_CNET98EL_ICR_IRQ12; | tmp = ED_CNET98EL_ICR_IRQ12; | ||||
break; | break; | ||||
#endif | #endif | ||||
default: | default: | ||||
device_printf(dev, "Invalid irq configuration (%ld) must be " | device_printf(dev, "Invalid irq configuration (%jd) must be " | ||||
"%s for %s\n", conf_irq, "3,5,6", "CNET98E/L"); | "%s for %s\n", conf_irq, "3,5,6", "CNET98E/L"); | ||||
return (ENXIO); | return (ENXIO); | ||||
} | } | ||||
ed_asic_outb(sc, ED_CNET98EL_ICR, tmp); | ed_asic_outb(sc, ED_CNET98EL_ICR, tmp); | ||||
ed_asic_outb(sc, ED_CNET98EL_IMR, 0x7e); | ed_asic_outb(sc, ED_CNET98EL_IMR, 0x7e); | ||||
/* Get station address from on-board ROM */ | /* Get station address from on-board ROM */ | ||||
ed_pio_readmem(sc, 16384, romdata, sizeof(romdata)); | ed_pio_readmem(sc, 16384, romdata, sizeof(romdata)); | ||||
▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | case 6: | ||||
break; | break; | ||||
case 12: | case 12: | ||||
tmp = ED_NEC77_IRQ12; | tmp = ED_NEC77_IRQ12; | ||||
break; | break; | ||||
case 13: | case 13: | ||||
tmp = ED_NEC77_IRQ13; | tmp = ED_NEC77_IRQ13; | ||||
break; | break; | ||||
default: | default: | ||||
device_printf(dev, "Invalid irq configuration (%ld) must be " | device_printf(dev, "Invalid irq configuration (%jd) must be " | ||||
"%s for %s\n", conf_irq, "3,5,6,12,13", "PC-9801-77"); | "%s for %s\n", conf_irq, "3,5,6,12,13", "PC-9801-77"); | ||||
return (ENXIO); | return (ENXIO); | ||||
} | } | ||||
ed_asic_outb(sc, ED_NEC77_IRQ, tmp); | ed_asic_outb(sc, ED_NEC77_IRQ, tmp); | ||||
return (0); | return (0); | ||||
} | } | ||||
Show All 35 Lines | case 6: | ||||
break; | break; | ||||
case 12: | case 12: | ||||
tmp = ED_NW98X_IRQ12; | tmp = ED_NW98X_IRQ12; | ||||
break; | break; | ||||
case 13: | case 13: | ||||
tmp = ED_NW98X_IRQ13; | tmp = ED_NW98X_IRQ13; | ||||
break; | break; | ||||
default: | default: | ||||
device_printf(dev, "Invalid irq configuration (%ld) must be " | device_printf(dev, "Invalid irq configuration (%jd) must be " | ||||
"%s for %s\n", conf_irq, "3,5,6,12,13", "EC/EP-98X"); | "%s for %s\n", conf_irq, "3,5,6,12,13", "EC/EP-98X"); | ||||
return (ENXIO); | return (ENXIO); | ||||
} | } | ||||
ed_asic_outb(sc, ED_NW98X_IRQ, tmp); | ed_asic_outb(sc, ED_NW98X_IRQ, tmp); | ||||
return (0); | return (0); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 85 Lines • ▼ Show 20 Lines | if (error) | ||||
return (error); | return (error); | ||||
sc->asic_offset = ED_NOVELL_ASIC_OFFSET; | sc->asic_offset = ED_NOVELL_ASIC_OFFSET; | ||||
sc->nic_offset = ED_NOVELL_NIC_OFFSET; | sc->nic_offset = ED_NOVELL_NIC_OFFSET; | ||||
/* Check I/O address. 00d[02468ace] are allowed. */ | /* Check I/O address. 00d[02468ace] are allowed. */ | ||||
if ((rman_get_start(sc->port_res) & ~0x000e) != 0x00d0) { | if ((rman_get_start(sc->port_res) & ~0x000e) != 0x00d0) { | ||||
#ifdef DIAGNOSTIC | #ifdef DIAGNOSTIC | ||||
device_printf(dev, "Invalid i/o port configuration (0x%lx) " | device_printf(dev, "Invalid i/o port configuration (0x%jx) " | ||||
"must be %s for %s\n", rman_get_start(sc->port_res), | "must be %s for %s\n", rman_get_start(sc->port_res), | ||||
"0xd?", "SB9801"); | "0xd?", "SB9801"); | ||||
#endif | #endif | ||||
return (ENXIO); | return (ENXIO); | ||||
} | } | ||||
/* Write I/O port address and read 4 times */ | /* Write I/O port address and read 4 times */ | ||||
outb(ED_SB98_IO_INHIBIT, rman_get_start(sc->port_res) & 0xff); | outb(ED_SB98_IO_INHIBIT, rman_get_start(sc->port_res) & 0xff); | ||||
Show All 19 Lines | case 5: | ||||
break; | break; | ||||
case 6: | case 6: | ||||
tmp = ED_SB98_CFG_IRQ6; | tmp = ED_SB98_CFG_IRQ6; | ||||
break; | break; | ||||
case 12: | case 12: | ||||
tmp = ED_SB98_CFG_IRQ12; | tmp = ED_SB98_CFG_IRQ12; | ||||
break; | break; | ||||
default: | default: | ||||
device_printf(dev, "Invalid irq configuration (%ld) must be " | device_printf(dev, "Invalid irq configuration (%jd) must be " | ||||
"%s for %s\n", conf_irq, "3,5,6,12", "SB9801"); | "%s for %s\n", conf_irq, "3,5,6,12", "SB9801"); | ||||
return (ENXIO); | return (ENXIO); | ||||
} | } | ||||
if (flags & ED_FLAGS_DISABLE_TRANCEIVER) | if (flags & ED_FLAGS_DISABLE_TRANCEIVER) | ||||
tmp |= ED_SB98_CFG_ALTPORT; | tmp |= ED_SB98_CFG_ALTPORT; | ||||
ed_asic_outb(sc, ED_SB98_CFG, ED_SB98_CFG_ENABLE | tmp); | ed_asic_outb(sc, ED_SB98_CFG, ED_SB98_CFG_ENABLE | tmp); | ||||
ed_asic_outb(sc, ED_SB98_POLARITY, 0x01); | ed_asic_outb(sc, ED_SB98_POLARITY, 0x01); | ||||
▲ Show 20 Lines • Show All 143 Lines • Show Last 20 Lines |