diff options
author | nyan <nyan@FreeBSD.org> | 2004-05-01 06:46:10 +0000 |
---|---|---|
committer | nyan <nyan@FreeBSD.org> | 2004-05-01 06:46:10 +0000 |
commit | 4bd4019860ecb7f998f950c435998624b68a24e9 (patch) | |
tree | 13542a7f77899b7b28d6acbb2045be5665efaca6 /sys/pc98 | |
parent | 80f69a6d5ce03dd961f0e93a84040da2fc938a6d (diff) | |
download | FreeBSD-src-4bd4019860ecb7f998f950c435998624b68a24e9.zip FreeBSD-src-4bd4019860ecb7f998f950c435998624b68a24e9.tar.gz |
Merged from sys/dev/sio/sio.c revision 1.428.
Diffstat (limited to 'sys/pc98')
-rw-r--r-- | sys/pc98/cbus/sio.c | 125 | ||||
-rw-r--r-- | sys/pc98/pc98/sio.c | 125 |
2 files changed, 152 insertions, 98 deletions
diff --git a/sys/pc98/cbus/sio.c b/sys/pc98/cbus/sio.c index e627ca8..86b3376 100644 --- a/sys/pc98/cbus/sio.c +++ b/sys/pc98/cbus/sio.c @@ -192,6 +192,7 @@ #define COM_PPSCTS(flags) ((flags) & 0x10000) #define COM_ST16650A(flags) ((flags) & 0x20000) #define COM_TI16754(flags) ((flags) & 0x200000) +#define COM_ALTCONSOLE(flags) ((flags) & 0x400000) #define sio_getreg(com, off) \ (bus_space_read_1((com)->bst, (com)->bsh, (off))) @@ -1227,7 +1228,7 @@ sioprobe(dev, xrid, rclk, noprobe) sio_setreg(com, com_cfcr, CFCR_8BITS); mtx_unlock_spin(&sio_lock); bus_release_resource(dev, SYS_RES_IOPORT, rid, port); - if (iobase == siocniobase) + if (comconsole != -1 && iobase == siocniobase) result = 0; if (result != 0) { device_set_softc(dev, NULL); @@ -1291,6 +1292,7 @@ sioprobe(dev, xrid, rclk, noprobe) mtx_unlock_spin(&sio_lock); + result = 0; irqs = irqmap[1] & ~irqmap[0]; if (bus_get_resource(idev, SYS_RES_IRQ, 0, &xirq, NULL) == 0 && ((1 << xirq) & irqs) == 0) { @@ -1300,14 +1302,14 @@ sioprobe(dev, xrid, rclk, noprobe) printf( "sio%d: port may not be enabled\n", device_get_unit(dev)); + result = ENXIO; } if (bootverbose) printf("sio%d: irq maps: %#x %#x %#x %#x\n", device_get_unit(dev), irqmap[0], irqmap[1], irqmap[2], irqmap[3]); - result = 0; - for (fn = 0; fn < sizeof failures; ++fn) + for (fn = 0; result == 0 && fn < sizeof failures; ++fn) if (failures[fn]) { sio_setreg(com, com_mcr, 0); result = ENXIO; @@ -1322,7 +1324,7 @@ sioprobe(dev, xrid, rclk, noprobe) break; } bus_release_resource(dev, SYS_RES_IOPORT, rid, port); - if (iobase == siocniobase) + if (comconsole != -1 && iobase == siocniobase) result = 0; if (result != 0) { device_set_softc(dev, NULL); @@ -4024,6 +4026,9 @@ siocngetspeed(iobase, rclk) u_char cfcr; cfcr = inb(iobase + com_cfcr); + outb(iobase + com_cfcr, 0x0e); + if (inb(iobase + com_cfcr) != 0x0e) + return (0); outb(iobase + com_cfcr, CFCR_DLAB | cfcr); dlbl = inb(iobase + com_dlbl); @@ -4036,7 +4041,12 @@ siocngetspeed(iobase, rclk) /* XXX there should be more sanity checking. */ if (divisor == 0) return (CONSPEED); + +#ifdef FORCECONSPEED + return (CONSPEED); +#else return (rclk / (16UL * divisor)); +#endif } #endif @@ -4117,7 +4127,7 @@ siocnprobe(cp) speed_t boot_speed; u_char cfcr; u_int divisor; - int s, unit; + int s, unit, check_flags; struct siocnstate sp; /* @@ -4136,28 +4146,42 @@ siocnprobe(cp) */ cp->cn_pri = CN_DEAD; - for (unit = 0; unit < 16; unit++) { /* XXX need to know how many */ - int flags; + siocniobase = 0; + for(check_flags = 1; check_flags >= 0 && !siocniobase; check_flags--) { + for (unit = 0; unit < 16; unit++) { /* XXX need to know how + many */ + int flags; - if (resource_disabled("sio", unit)) - continue; - if (resource_int_value("sio", unit, "flags", &flags)) - continue; - if (COM_CONSOLE(flags) || COM_DEBUGGER(flags)) { - int port; - Port_t iobase; - - if (resource_int_value("sio", unit, "port", &port)) + if (resource_disabled("sio", unit)) + continue; + if (resource_int_value("sio", unit, "flags", &flags)) continue; - iobase = port; - s = spltty(); - if (boothowto & RB_SERIAL) { - boot_speed = - siocngetspeed(iobase, comdefaultrclk); - if (boot_speed) - comdefaultrate = boot_speed; + + if (!check_flags && COM_ALTCONSOLE(flags) + && !siocniobase){ + flags |= 0x10; } + if (COM_CONSOLE(flags) || COM_DEBUGGER(flags)) { + int port; + Port_t iobase; + + if (resource_int_value("sio", unit, "port", + &port)) + continue; + iobase = port; + s = spltty(); + if (boothowto & RB_SERIAL) { + boot_speed = siocngetspeed(iobase, + comdefaultrclk); + if (boot_speed) + comdefaultrate = boot_speed; + else { + splx(s); + continue; + } + } + /* * Initialize the divisor latch. We can't rely on * siocnopen() to do this the first time, since it @@ -4167,34 +4191,37 @@ siocnprobe(cp) * need to set the speed in hardware so that * switching it later is null. */ - cfcr = inb(iobase + com_cfcr); - outb(iobase + com_cfcr, CFCR_DLAB | cfcr); - divisor = siodivisor(comdefaultrclk, comdefaultrate); - outb(iobase + com_dlbl, divisor & 0xff); - outb(iobase + com_dlbh, divisor >> 8); - outb(iobase + com_cfcr, cfcr); - - siocnopen(&sp, iobase, comdefaultrate); - - splx(s); - if (COM_CONSOLE(flags) && !COM_LLCONSOLE(flags)) { - siocnset(cp, unit); - cp->cn_pri = COM_FORCECONSOLE(flags) - || boothowto & RB_SERIAL - ? CN_REMOTE : CN_NORMAL; - siocniobase = iobase; - siocnunit = unit; - } - if (COM_DEBUGGER(flags)) { - printf("sio%d: gdb debugging port\n", unit); - siogdbiobase = iobase; - siogdbunit = unit; + cfcr = inb(iobase + com_cfcr); + outb(iobase + com_cfcr, CFCR_DLAB | cfcr); + divisor = siodivisor(comdefaultrclk, comdefaultrate); + outb(iobase + com_dlbl, divisor & 0xff); + outb(iobase + com_dlbh, divisor >> 8); + outb(iobase + com_cfcr, cfcr); + + siocnopen(&sp, iobase, comdefaultrate); + + splx(s); + if (!siocniobase && COM_CONSOLE(flags) + && !COM_LLCONSOLE(flags)) { + siocnset(cp, unit); + cp->cn_pri = COM_FORCECONSOLE(flags) + || boothowto & RB_SERIAL + ? CN_REMOTE : CN_NORMAL; + siocniobase = iobase; + siocnunit = unit; + } + if (COM_DEBUGGER(flags)) { + printf("sio%d: gdb debugging port\n", + unit); + siogdbiobase = iobase; + siogdbunit = unit; #if DDB > 0 - siocnset(&gdbconsdev, unit); - gdb_arg = &gdbconsdev; - gdb_getc = siocngetc; - gdb_putc = siocnputc; + siocnset(&gdbconsdev, unit); + gdb_arg = &gdbconsdev; + gdb_getc = siocngetc; + gdb_putc = siocnputc; #endif + } } } } diff --git a/sys/pc98/pc98/sio.c b/sys/pc98/pc98/sio.c index e627ca8..86b3376 100644 --- a/sys/pc98/pc98/sio.c +++ b/sys/pc98/pc98/sio.c @@ -192,6 +192,7 @@ #define COM_PPSCTS(flags) ((flags) & 0x10000) #define COM_ST16650A(flags) ((flags) & 0x20000) #define COM_TI16754(flags) ((flags) & 0x200000) +#define COM_ALTCONSOLE(flags) ((flags) & 0x400000) #define sio_getreg(com, off) \ (bus_space_read_1((com)->bst, (com)->bsh, (off))) @@ -1227,7 +1228,7 @@ sioprobe(dev, xrid, rclk, noprobe) sio_setreg(com, com_cfcr, CFCR_8BITS); mtx_unlock_spin(&sio_lock); bus_release_resource(dev, SYS_RES_IOPORT, rid, port); - if (iobase == siocniobase) + if (comconsole != -1 && iobase == siocniobase) result = 0; if (result != 0) { device_set_softc(dev, NULL); @@ -1291,6 +1292,7 @@ sioprobe(dev, xrid, rclk, noprobe) mtx_unlock_spin(&sio_lock); + result = 0; irqs = irqmap[1] & ~irqmap[0]; if (bus_get_resource(idev, SYS_RES_IRQ, 0, &xirq, NULL) == 0 && ((1 << xirq) & irqs) == 0) { @@ -1300,14 +1302,14 @@ sioprobe(dev, xrid, rclk, noprobe) printf( "sio%d: port may not be enabled\n", device_get_unit(dev)); + result = ENXIO; } if (bootverbose) printf("sio%d: irq maps: %#x %#x %#x %#x\n", device_get_unit(dev), irqmap[0], irqmap[1], irqmap[2], irqmap[3]); - result = 0; - for (fn = 0; fn < sizeof failures; ++fn) + for (fn = 0; result == 0 && fn < sizeof failures; ++fn) if (failures[fn]) { sio_setreg(com, com_mcr, 0); result = ENXIO; @@ -1322,7 +1324,7 @@ sioprobe(dev, xrid, rclk, noprobe) break; } bus_release_resource(dev, SYS_RES_IOPORT, rid, port); - if (iobase == siocniobase) + if (comconsole != -1 && iobase == siocniobase) result = 0; if (result != 0) { device_set_softc(dev, NULL); @@ -4024,6 +4026,9 @@ siocngetspeed(iobase, rclk) u_char cfcr; cfcr = inb(iobase + com_cfcr); + outb(iobase + com_cfcr, 0x0e); + if (inb(iobase + com_cfcr) != 0x0e) + return (0); outb(iobase + com_cfcr, CFCR_DLAB | cfcr); dlbl = inb(iobase + com_dlbl); @@ -4036,7 +4041,12 @@ siocngetspeed(iobase, rclk) /* XXX there should be more sanity checking. */ if (divisor == 0) return (CONSPEED); + +#ifdef FORCECONSPEED + return (CONSPEED); +#else return (rclk / (16UL * divisor)); +#endif } #endif @@ -4117,7 +4127,7 @@ siocnprobe(cp) speed_t boot_speed; u_char cfcr; u_int divisor; - int s, unit; + int s, unit, check_flags; struct siocnstate sp; /* @@ -4136,28 +4146,42 @@ siocnprobe(cp) */ cp->cn_pri = CN_DEAD; - for (unit = 0; unit < 16; unit++) { /* XXX need to know how many */ - int flags; + siocniobase = 0; + for(check_flags = 1; check_flags >= 0 && !siocniobase; check_flags--) { + for (unit = 0; unit < 16; unit++) { /* XXX need to know how + many */ + int flags; - if (resource_disabled("sio", unit)) - continue; - if (resource_int_value("sio", unit, "flags", &flags)) - continue; - if (COM_CONSOLE(flags) || COM_DEBUGGER(flags)) { - int port; - Port_t iobase; - - if (resource_int_value("sio", unit, "port", &port)) + if (resource_disabled("sio", unit)) + continue; + if (resource_int_value("sio", unit, "flags", &flags)) continue; - iobase = port; - s = spltty(); - if (boothowto & RB_SERIAL) { - boot_speed = - siocngetspeed(iobase, comdefaultrclk); - if (boot_speed) - comdefaultrate = boot_speed; + + if (!check_flags && COM_ALTCONSOLE(flags) + && !siocniobase){ + flags |= 0x10; } + if (COM_CONSOLE(flags) || COM_DEBUGGER(flags)) { + int port; + Port_t iobase; + + if (resource_int_value("sio", unit, "port", + &port)) + continue; + iobase = port; + s = spltty(); + if (boothowto & RB_SERIAL) { + boot_speed = siocngetspeed(iobase, + comdefaultrclk); + if (boot_speed) + comdefaultrate = boot_speed; + else { + splx(s); + continue; + } + } + /* * Initialize the divisor latch. We can't rely on * siocnopen() to do this the first time, since it @@ -4167,34 +4191,37 @@ siocnprobe(cp) * need to set the speed in hardware so that * switching it later is null. */ - cfcr = inb(iobase + com_cfcr); - outb(iobase + com_cfcr, CFCR_DLAB | cfcr); - divisor = siodivisor(comdefaultrclk, comdefaultrate); - outb(iobase + com_dlbl, divisor & 0xff); - outb(iobase + com_dlbh, divisor >> 8); - outb(iobase + com_cfcr, cfcr); - - siocnopen(&sp, iobase, comdefaultrate); - - splx(s); - if (COM_CONSOLE(flags) && !COM_LLCONSOLE(flags)) { - siocnset(cp, unit); - cp->cn_pri = COM_FORCECONSOLE(flags) - || boothowto & RB_SERIAL - ? CN_REMOTE : CN_NORMAL; - siocniobase = iobase; - siocnunit = unit; - } - if (COM_DEBUGGER(flags)) { - printf("sio%d: gdb debugging port\n", unit); - siogdbiobase = iobase; - siogdbunit = unit; + cfcr = inb(iobase + com_cfcr); + outb(iobase + com_cfcr, CFCR_DLAB | cfcr); + divisor = siodivisor(comdefaultrclk, comdefaultrate); + outb(iobase + com_dlbl, divisor & 0xff); + outb(iobase + com_dlbh, divisor >> 8); + outb(iobase + com_cfcr, cfcr); + + siocnopen(&sp, iobase, comdefaultrate); + + splx(s); + if (!siocniobase && COM_CONSOLE(flags) + && !COM_LLCONSOLE(flags)) { + siocnset(cp, unit); + cp->cn_pri = COM_FORCECONSOLE(flags) + || boothowto & RB_SERIAL + ? CN_REMOTE : CN_NORMAL; + siocniobase = iobase; + siocnunit = unit; + } + if (COM_DEBUGGER(flags)) { + printf("sio%d: gdb debugging port\n", + unit); + siogdbiobase = iobase; + siogdbunit = unit; #if DDB > 0 - siocnset(&gdbconsdev, unit); - gdb_arg = &gdbconsdev; - gdb_getc = siocngetc; - gdb_putc = siocnputc; + siocnset(&gdbconsdev, unit); + gdb_arg = &gdbconsdev; + gdb_getc = siocngetc; + gdb_putc = siocnputc; #endif + } } } } |