Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/ed/if_ed_cbus.c
Show First 20 Lines • Show All 42 Lines • ▼ Show 20 Lines | |||||
static int | static int | ||||
ed98_alloc_memory(dev, rid) | ed98_alloc_memory(dev, rid) | ||||
device_t dev; | device_t dev; | ||||
int rid; | int rid; | ||||
{ | { | ||||
struct ed_softc *sc = device_get_softc(dev); | struct ed_softc *sc = device_get_softc(dev); | ||||
int error; | int error; | ||||
u_long conf_maddr, conf_msize; | rman_res_t conf_maddr, conf_msize; | ||||
error = bus_get_resource(dev, SYS_RES_MEMORY, 0, &conf_maddr, | error = bus_get_resource(dev, SYS_RES_MEMORY, 0, &conf_maddr, | ||||
&conf_msize); | &conf_msize); | ||||
if (error) | if (error) | ||||
return (error); | return (error); | ||||
if ((conf_maddr == 0) || (conf_msize == 0)) | if ((conf_maddr == 0) || (conf_msize == 0)) | ||||
return (ENXIO); | return (ENXIO); | ||||
▲ Show 20 Lines • Show All 84 Lines • ▼ Show 20 Lines | |||||
* Probe and vendor-specific initialization routine for C-NET(98) boards | * Probe and vendor-specific initialization routine for C-NET(98) boards | ||||
*/ | */ | ||||
static int | static int | ||||
ed_probe_CNET98(device_t dev, int port_rid, int flags) | ed_probe_CNET98(device_t dev, int port_rid, int flags) | ||||
{ | { | ||||
struct ed_softc *sc = device_get_softc(dev); | struct ed_softc *sc = device_get_softc(dev); | ||||
int error; | int error; | ||||
u_char tmp; | u_char tmp; | ||||
u_long conf_irq, junk; | rman_res_t conf_irq, junk; | ||||
#ifdef DIAGNOSTIC | #ifdef DIAGNOSTIC | ||||
u_char tmp_s; | u_char tmp_s; | ||||
#endif | #endif | ||||
error = ed98_alloc_port(dev, port_rid); | error = ed98_alloc_port(dev, port_rid); | ||||
if (error) | 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; | ||||
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 | |||||
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 12 Lines | |||||
*/ | */ | ||||
static int | static int | ||||
ed_probe_CNET98EL(device_t dev, int port_rid, int flags) | ed_probe_CNET98EL(device_t dev, int port_rid, int flags) | ||||
{ | { | ||||
struct ed_softc *sc = device_get_softc(dev); | struct ed_softc *sc = device_get_softc(dev); | ||||
int error; | int error; | ||||
int i; | int i; | ||||
u_char romdata[ETHER_ADDR_LEN * 2], tmp; | u_char romdata[ETHER_ADDR_LEN * 2], tmp; | ||||
u_long conf_irq, junk; | rman_res_t conf_irq, junk; | ||||
error = ed98_alloc_port(dev, port_rid); | error = ed98_alloc_port(dev, port_rid); | ||||
if (error) | 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 | |||||
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 All 11 Lines | |||||
* Probe and vendor-specific initialization routine for PC-9801-77 boards | * Probe and vendor-specific initialization routine for PC-9801-77 boards | ||||
*/ | */ | ||||
static int | static int | ||||
ed_probe_NEC77(device_t dev, int port_rid, int flags) | ed_probe_NEC77(device_t dev, int port_rid, int flags) | ||||
{ | { | ||||
struct ed_softc *sc = device_get_softc(dev); | struct ed_softc *sc = device_get_softc(dev); | ||||
int error; | int error; | ||||
u_char tmp; | u_char tmp; | ||||
u_long conf_irq, junk; | rman_res_t conf_irq, junk; | ||||
error = ed98_probe_Novell(dev, port_rid, flags); | error = ed98_probe_Novell(dev, port_rid, flags); | ||||
if (error) | if (error) | ||||
return (error); | return (error); | ||||
/* LA/T-98 does not need IRQ setting. */ | /* LA/T-98 does not need IRQ setting. */ | ||||
if (ED_TYPE98SUB(flags) == 0) | if (ED_TYPE98SUB(flags) == 0) | ||||
return (0); | return (0); | ||||
Show All 17 Lines | |||||
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); | ||||
} | } | ||||
/* | /* | ||||
* Probe and vendor-specific initialization routine for EC/EP-98X boards | * Probe and vendor-specific initialization routine for EC/EP-98X boards | ||||
*/ | */ | ||||
static int | static int | ||||
ed_probe_NW98X(device_t dev, int port_rid, int flags) | ed_probe_NW98X(device_t dev, int port_rid, int flags) | ||||
{ | { | ||||
struct ed_softc *sc = device_get_softc(dev); | struct ed_softc *sc = device_get_softc(dev); | ||||
int error; | int error; | ||||
u_char tmp; | u_char tmp; | ||||
u_long conf_irq, junk; | rman_res_t conf_irq, junk; | ||||
error = ed98_probe_Novell(dev, port_rid, flags); | error = ed98_probe_Novell(dev, port_rid, flags); | ||||
if (error) | if (error) | ||||
return (error); | return (error); | ||||
/* Networld 98X3 does not need IRQ setting. */ | /* Networld 98X3 does not need IRQ setting. */ | ||||
if (ED_TYPE98SUB(flags) == 0) | if (ED_TYPE98SUB(flags) == 0) | ||||
return (0); | return (0); | ||||
Show All 17 Lines | |||||
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 73 Lines • ▼ Show 20 Lines | |||||
* Probe and vendor-specific initialization routine for SB-9801 boards | * Probe and vendor-specific initialization routine for SB-9801 boards | ||||
*/ | */ | ||||
static int | static int | ||||
ed_probe_SB98(device_t dev, int port_rid, int flags) | ed_probe_SB98(device_t dev, int port_rid, int flags) | ||||
{ | { | ||||
struct ed_softc *sc = device_get_softc(dev); | struct ed_softc *sc = device_get_softc(dev); | ||||
int error; | int error; | ||||
u_char tmp; | u_char tmp; | ||||
u_long conf_irq, junk; | rman_res_t conf_irq, junk; | ||||
error = ed98_alloc_port(dev, port_rid); | error = ed98_alloc_port(dev, port_rid); | ||||
if (error) | 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 | |||||
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 42 Lines • Show Last 20 Lines |