diff options
author | nyan <nyan@FreeBSD.org> | 1999-09-12 13:44:54 +0000 |
---|---|---|
committer | nyan <nyan@FreeBSD.org> | 1999-09-12 13:44:54 +0000 |
commit | c5bcb23f600d5a97c8648b467379141eeb6aff73 (patch) | |
tree | 308f8dcb5e944e54c422b2d0427c407023d62245 /sys/pc98 | |
parent | f8827333964c5c8892f027d1dc2034fd0c328a14 (diff) | |
download | FreeBSD-src-c5bcb23f600d5a97c8648b467379141eeb6aff73.zip FreeBSD-src-c5bcb23f600d5a97c8648b467379141eeb6aff73.tar.gz |
Fixed missing changes from sys/isa/sio.c.
Diffstat (limited to 'sys/pc98')
-rw-r--r-- | sys/pc98/cbus/sio.c | 312 | ||||
-rw-r--r-- | sys/pc98/pc98/sio.c | 312 |
2 files changed, 220 insertions, 404 deletions
diff --git a/sys/pc98/cbus/sio.c b/sys/pc98/cbus/sio.c index 714dda8..0aaa670 100644 --- a/sys/pc98/cbus/sio.c +++ b/sys/pc98/cbus/sio.c @@ -40,8 +40,6 @@ #include "opt_ddb.h" #include "opt_sio.h" #include "sio.h" -/* #include "pnp.h" */ -#define NPNP 0 /* * Serial driver, based on 386BSD-0.1 com driver. @@ -183,23 +181,19 @@ #endif #if 0 - #include "card.h" #if NCARD > 0 #include <sys/module.h> #include <pccard/cardinfo.h> #include <pccard/slot.h> #endif - -#if NPNP > 0 -#include <i386/isa/pnp.h> -#endif - +#else +#define NCARD 0 #endif #ifndef __i386__ -#define disable_intr() 0 -#define enable_intr() 0 +#define disable_intr() +#define enable_intr() #endif #ifdef SMP @@ -208,11 +202,7 @@ #endif /* SMP */ #ifndef EXTRA_SIO -#if NPNP > 0 -#define EXTRA_SIO MAX_PNP_CARDS -#else -#define EXTRA_SIO 0 -#endif +#define EXTRA_SIO 4 /* XXX shouldn't need NSIO */ #endif #define NSIOTOT (NSIO + EXTRA_SIO) @@ -402,6 +392,9 @@ struct com_s { u_int delta_error_counts[CE_NTYPES]; u_long error_counts[CE_NTYPES]; + struct resource *irqres; + struct resource *ioportres; + /* * Data area for output buffers. Someday we should build the output * buffer queue without copying data. @@ -506,12 +499,6 @@ static int sio_timeout; static int sio_timeouts_until_log; static struct callout_handle sio_timeout_handle = CALLOUT_HANDLE_INITIALIZER(&sio_timeout_handle); -#if 0 /* XXX */ -static struct tty *sio_tty[NSIOTOT]; -#else -static struct tty sio_tty[NSIOTOT]; -#endif -static const int nsio_tty = NSIOTOT; #ifdef PC98 struct siodev { @@ -900,12 +887,9 @@ sioinit(struct pccard_devinfo *devi) devi->isahd.id_flags |= COM_C_NOPROBE; /* - * Probe the device. If a value is returned, the - * device was found at the location. + * attach the device. */ - if (sioprobe(&devi->isahd) == 0) - return(ENXIO); - if (sioattach(&devi->isahd) == 0) + if (sioattach(devi->isahd.id_device) == 0) return(ENXIO); return(0); @@ -971,8 +955,18 @@ card_intr(struct pccard_devinfo *devi) } #endif /* NCARD > 0 */ -#define SET_FLAG(dev, bit) device_set_flags(dev, device_get_flags(dev) | (bit)) -#define CLR_FLAG(dev, bit) device_set_flags(dev, device_get_flags(dev) & ~(bit)) +#define SET_FLAG(dev, bit) device_set_flags(dev, device_get_flags(dev) | (bit)) +#define CLR_FLAG(dev, bit) device_set_flags(dev, device_get_flags(dev) & ~(bit)) + +static struct isa_pnp_id sio_ids[] = { + {0x0005d041, "Standard PC COM port"}, /* PNP0500 */ + {0x0105d041, "16550A-compatible COM port"}, /* PNP0501 */ + {0x0205d041, "Multiport serial device (non-intelligent 16550)"}, /* PNP0502 */ + {0x1005d041, "Generic IRDA-compatible device"}, /* PNP0510 */ + {0x1105d041, "Generic IRDA-compatible device"}, /* PNP0511 */ + {0x31307256, "USR3031"}, /* USR3031 */ + {0} +}; static int sioprobe(dev) @@ -989,6 +983,8 @@ sioprobe(dev) int result; device_t xdev; u_int flags = device_get_flags(dev); + int rid; + struct resource *port; #ifdef PC98 int irqout=0; int tmp; @@ -997,6 +993,21 @@ sioprobe(dev) Port_t rsabase = NULL; #endif + /* Check isapnp ids */ + if (ISA_PNP_PROBE(device_get_parent(dev), dev, sio_ids) == ENXIO) + return (ENXIO); + + rid = 0; +#ifdef PC98 + port = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, + 0, ~0, 1, RF_ACTIVE); /* XXX */ +#else + port = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, + 0, ~0, IO_COMSIZE, RF_ACTIVE); +#endif + if (!port) + return ENXIO; + if (!already_init) { /* * Turn off MCR_IENABLE for all likely serial ports. An unused @@ -1011,20 +1022,23 @@ sioprobe(dev) #ifdef PC98 for (i = 0; i < count; i++) { xdev = devs[i]; - tmp = (flags >> 24) & 0xff; - if (IS_8251(tmp)) - outb((isa_get_port(xdev) & 0xff00) | PC98SIO_cmd_port(tmp & 0x0f), 0xf2); - else - if (tmp == COM_IF_RSA98III) { - rsabase = isa_get_port(xdev) & 0xfff0; - outb(isa_get_port(xdev) + 8 + (com_mcr << if_16550a_type[tmp & 0x0f].port_shift), 0); - } else - outb(isa_get_port(xdev) + (com_mcr << if_16550a_type[tmp & 0x0f].port_shift), 0); + if (device_is_enabled(xdev)) { + tmp = (flags >> 24) & 0xff; + if (IS_8251(tmp)) + outb((isa_get_port(xdev) & 0xff00) | PC98SIO_cmd_port(tmp & 0x0f), 0xf2); + else + if (tmp == COM_IF_RSA98III) { + rsabase = isa_get_port(xdev) & 0xfff0; + outb(isa_get_port(xdev) + 8 + (com_mcr << if_16550a_type[tmp & 0x0f].port_shift), 0); + } else + outb(isa_get_port(xdev) + (com_mcr << if_16550a_type[tmp & 0x0f].port_shift), 0); + } } #else for (i = 0; i < count; i++) { xdev = devs[i]; - outb(isa_get_port(xdev) + com_mcr, 0); + if (device_is_enabled(xdev)) + outb(isa_get_port(xdev) + com_mcr, 0); } #endif free(devs, M_TEMP); @@ -1081,7 +1095,7 @@ sioprobe(dev) if (epson_machine_id==0x20) { /* XXX */ result = 0; } - isa_set_portsize(dev, 4); + bus_release_resource(dev, SYS_RES_IOPORT, rid, port); return result; } #endif /* PC98 */ @@ -1117,7 +1131,6 @@ sioprobe(dev) if (idev == NULL) { printf("sio%d: master device %d not configured\n", device_get_unit(dev), COM_MPMASTER(flags)); - isa_set_irq(dev, 0); idev = dev; } #ifndef PC98 @@ -1151,7 +1164,7 @@ sioprobe(dev) port_shift = if_16550a_type[iod.if_type & 0x0f].port_shift; #endif bzero(failures, sizeof failures); - iobase = isa_get_port(dev); + iobase = rman_get_start(port); #ifdef PC98 if (iod.if_type == COM_IF_RSA98III) iobase += 8; @@ -1265,7 +1278,7 @@ sioprobe(dev) outb(iobase + com_mcr, mcr_image); #endif /* PC98 */ - /* + /* * It's a definitly Serial PCMCIA(16550A), but still be required * for IIR_TXRDY implementation ( Palido 321s, DC-1S... ) */ @@ -1280,12 +1293,6 @@ sioprobe(dev) #endif } /* Check IIR_TXRDY clear ? */ -#ifdef PC98 - isa_set_portsize(dev, - if_16550a_type[iod.if_type & 0x0f].io_size); -#else - isa_set_portsize(dev, IO_COMSIZE); -#endif result = 0; if ( failures[6] & IIR_TXRDY ) { /* Nop, Double check with clearing IER */ @@ -1300,7 +1307,7 @@ sioprobe(dev) /* Ok. we're familia this gang */ SET_FLAG(dev, COM_C_IIR_TXRDYBUG); /* Set IIR_TXRDYBUG */ } else { - /* Unknow, Just omit this chip.. XXX*/ + /* Unknown, Just omit this chip.. XXX */ result = ENXIO; } } else { @@ -1313,6 +1320,7 @@ sioprobe(dev) outb(iobase + com_cfcr, CFCR_8BITS); #endif enable_intr(); + bus_release_resource(dev, SYS_RES_IOPORT, rid, port); return (iobase == siocniobase ? 0 : result); } @@ -1400,11 +1408,6 @@ sioprobe(dev) device_get_unit(dev), irqmap[0], irqmap[1], irqmap[2], irqmap[3]); -#ifdef PC98 - isa_set_portsize(dev, if_16550a_type[iod.if_type & 0x0f].io_size); -#else - isa_set_portsize(dev, IO_COMSIZE); -#endif result = 0; for (fn = 0; fn < sizeof failures; ++fn) if (failures[fn]) { @@ -1424,6 +1427,7 @@ sioprobe(dev) } break; } + bus_release_resource(dev, SYS_RES_IOPORT, rid, port); return (iobase == siocniobase ? 0 : result); } @@ -1518,16 +1522,27 @@ sioattach(dev) Port_t iobase; int unit; void *ih; - struct resource *res; - int zero = 0; u_int flags = device_get_flags(dev); + int rid; + struct resource *port; #ifdef PC98 int port_shift = 0; u_char *obuf; u_long obufsize; #endif - iobase = isa_get_port(dev); + rid = 0; +#ifdef PC98 + port = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, + 0, ~0, 1, RF_ACTIVE); /* XXX */ +#else + port = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, + 0, ~0, IO_COMSIZE, RF_ACTIVE); +#endif + if (!port) + return ENXIO; + + iobase = rman_get_start(port); #ifdef PC98 if (((flags >> 24) & 0xff) == COM_IF_RSA98III) iobase += 8; @@ -1562,6 +1577,7 @@ sioattach(dev) com->obuf2 = obuf + obufsize; #endif com->unit = unit; + com->ioportres = port; com->cfcr_image = CFCR_8BITS; com->dtr_wait = 3 * hz; com->loses_outints = COM_LOSESOUTINTS(flags) != 0; @@ -1821,25 +1837,26 @@ determined_type: ; register_swi(SWI_TTY, siopoll); sio_registered = TRUE; } - make_dev(&sio_cdevsw, unit, - UID_ROOT, GID_WHEEL, 0600, "ttyd%r", unit); - make_dev(&sio_cdevsw, unit | CONTROL_INIT_STATE, - UID_ROOT, GID_WHEEL, 0600, "ttyid%r", unit); - make_dev(&sio_cdevsw, unit | CONTROL_LOCK_STATE, - UID_ROOT, GID_WHEEL, 0600, "ttyld%r", unit); - make_dev(&sio_cdevsw, unit | CALLOUT_MASK, - UID_UUCP, GID_DIALER, 0660, "cuaa%r", unit); - make_dev(&sio_cdevsw, unit | CALLOUT_MASK | CONTROL_INIT_STATE, - UID_UUCP, GID_DIALER, 0660, "cuaia%r", unit); - make_dev(&sio_cdevsw, unit | CALLOUT_MASK | CONTROL_LOCK_STATE, - UID_UUCP, GID_DIALER, 0660, "cuala%r", unit); - com->flags = device_get_flags(dev); /* Heritate id_flags for later */ + make_dev(&sio_cdevsw, unit, + UID_ROOT, GID_WHEEL, 0600, "ttyd%r", unit); + make_dev(&sio_cdevsw, unit | CONTROL_INIT_STATE, + UID_ROOT, GID_WHEEL, 0600, "ttyid%r", unit); + make_dev(&sio_cdevsw, unit | CONTROL_LOCK_STATE, + UID_ROOT, GID_WHEEL, 0600, "ttyld%r", unit); + make_dev(&sio_cdevsw, unit | CALLOUT_MASK, + UID_UUCP, GID_DIALER, 0660, "cuaa%r", unit); + make_dev(&sio_cdevsw, unit | CALLOUT_MASK | CONTROL_INIT_STATE, + UID_UUCP, GID_DIALER, 0660, "cuaia%r", unit); + make_dev(&sio_cdevsw, unit | CALLOUT_MASK | CONTROL_LOCK_STATE, + UID_UUCP, GID_DIALER, 0660, "cuala%r", unit); + com->flags = flags; com->pps.ppscap = PPS_CAPTUREASSERT | PPS_CAPTURECLEAR; pps_init(&com->pps); - res = bus_alloc_resource(dev, SYS_RES_IRQ, &zero, 0ul, ~0ul, 1, - RF_SHAREABLE | RF_ACTIVE); - BUS_SETUP_INTR(device_get_parent(dev), dev, res, + rid = 0; + com->irqres = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0ul, ~0ul, 1, + RF_SHAREABLE | RF_ACTIVE); + BUS_SETUP_INTR(device_get_parent(dev), dev, com->irqres, INTR_TYPE_TTY | INTR_TYPE_FAST, siointr, com, &ih); @@ -1872,11 +1889,7 @@ sioopen(dev, flag, mode, p) return (ENXIO); if (mynor & CONTROL_MASK) return (0); -#if 0 /* XXX */ - tp = com->tp = sio_tty[unit] = ttymalloc(sio_tty[unit]); -#else - tp = com->tp = &sio_tty[unit]; -#endif + tp = dev->si_tty = com->tp = ttymalloc(com->tp); s = spltty(); #ifdef PC98 @@ -2541,7 +2554,7 @@ more_intr: count = tc->tc_get_timecount(tc); pps_event(&com->pps, tc, count, (modem_status & MSR_DCD) ? - PPS_CAPTURECLEAR : PPS_CAPTUREASSERT); + PPS_CAPTUREASSERT : PPS_CAPTURECLEAR); } } line_status = inb(com->line_status_port); @@ -3160,7 +3173,7 @@ comparam(tp, t) /* check requested parameters */ divisor = ttspeedtab(t->c_ospeed, comspeedtab); #endif - if (divisor < 0 || divisor > 0 && t->c_ispeed != t->c_ospeed) + if (divisor < 0 || (divisor > 0 && t->c_ispeed != t->c_ospeed)) return (EINVAL); /* parameters are OK, convert them to the com struct and the device */ @@ -3678,7 +3691,7 @@ siodevtotty(dev) unit = MINOR_TO_UNIT(mynor); if ((u_int) unit >= NSIOTOT) return (NULL); - return (&sio_tty[unit]); + return (dev->si_tty); } static int @@ -3904,20 +3917,21 @@ static void siocnclose __P((struct siocnstate *sp, Port_t iobase)); static void siocnopen __P((struct siocnstate *sp, Port_t iobase, int speed)); static void siocntxwait __P((Port_t iobase)); -#ifdef __i386__ static cn_probe_t siocnprobe; static cn_init_t siocninit; static cn_checkc_t siocncheckc; static cn_getc_t siocngetc; static cn_putc_t siocnputc; +#ifdef __i386__ CONS_DRIVER(sio, siocnprobe, siocninit, NULL, siocngetc, siocncheckc, siocnputc); +#endif + /* To get the GDB related variables */ #if DDB > 0 #include <ddb/ddb.h> #endif -#endif static void siocntxwait(iobase) @@ -4039,10 +4053,7 @@ siocnclose(sp, iobase) outb(iobase + com_ier, sp->ier); } -#ifdef __i386__ -static -#endif -void +static void siocnprobe(cp) struct consdev *cp; { @@ -4069,6 +4080,11 @@ siocnprobe(cp) for (unit = 0; unit < 16; unit++) { /* XXX need to know how many */ int flags; + int disabled; + if (resource_int_value("sio", unit, "disabled", &disabled) == 0) { + if (disabled) + continue; + } if (resource_int_value("sio", unit, "flags", &flags)) continue; if (COM_CONSOLE(flags) || COM_DEBUGGER(flags)) { @@ -4110,21 +4126,18 @@ siocnprobe(cp) cp->cn_pri = COM_FORCECONSOLE(flags) || boothowto & RB_SERIAL ? CN_REMOTE : CN_NORMAL; - printf("sio%d: system console\n", unit); siocniobase = iobase; siocnunit = unit; } - if (COM_DEBUGGER(flags) && !COM_LLCONSOLE(flags)) { + if (COM_DEBUGGER(flags)) { printf("sio%d: gdb debugging port\n", unit); siogdbiobase = iobase; siogdbunit = unit; -#ifdef __i386__ #if DDB > 0 gdbdev = makedev(CDEV_MAJOR, unit); gdb_getc = siocngetc; gdb_putc = siocnputc; #endif -#endif } } } @@ -4152,12 +4165,7 @@ siocnprobe(cp) #ifdef __alpha__ -struct consdev siocons = { - NULL, NULL, siocngetc, siocncheckc, siocnputc, - NULL, 0, CN_NORMAL, -}; - -extern struct consdev *cn_tab; +CONS_DRIVER(sio, NULL, NULL, NULL, siocngetc, siocncheckc, siocnputc); int siocnattach(port, speed) @@ -4170,6 +4178,8 @@ siocnattach(port, speed) siocniobase = port; comdefaultrate = speed; + sio_consdev.cn_pri = CN_NORMAL; + sio_consdev.cn_dev = makedev(CDEV_MAJOR, 0); s = spltty(); @@ -4193,8 +4203,7 @@ siocnattach(port, speed) siocnopen(&sp, siocniobase, comdefaultrate); splx(s); - siocons.cn_dev = makedev(CDEV_MAJOR, 0); - cn_tab = &siocons; + cn_tab = &sio_consdev; return 0; } @@ -4237,20 +4246,14 @@ siogdbattach(port, speed) #endif -#ifdef __i386__ -static -#endif -void +static void siocninit(cp) struct consdev *cp; { comconsole = DEV_TO_UNIT(cp->cn_dev); } -#ifdef __i386__ -static -#endif -int +static int siocncheckc(dev) dev_t dev; { @@ -4355,101 +4358,6 @@ siogdbputc(c) } #endif - -/* - * support PnP cards if we are using 'em - */ - -#if NPNP > 0 - -static pnpid_t siopnp_ids[] = { - { 0x5015f435, "MOT1550"}, - { 0x8113b04e, "Supra1381"}, - { 0x9012b04e, "Supra1290"}, - { 0x7121b04e, "SupraExpress 56i Sp"}, - { 0x11007256, "USR0011"}, - { 0x30207256, "USR2030"}, - { 0x31307256, "USR3031"}, - { 0x90307256, "USR3090"}, - { 0x0100440e, "Cardinal MVP288IV"}, - { 0 } -}; - -static char *siopnp_probe(u_long csn, u_long vend_id); -static void siopnp_attach(u_long csn, u_long vend_id, char *name, - struct isa_device *dev); -static u_long nsiopnp = NSIO; - -static struct pnp_device siopnp = { - "siopnp", - siopnp_probe, - siopnp_attach, - &nsiopnp, - &tty_imask -}; -DATA_SET (pnpdevice_set, siopnp); - -static char * -siopnp_probe(u_long csn, u_long vend_id) -{ - pnpid_t *id; - char *s = NULL; - - for(id = siopnp_ids; id->vend_id != 0; id++) { - if (vend_id == id->vend_id) { - s = id->id_str; - break; - } - } - - if (s) { - struct pnp_cinfo d; - read_pnp_parms(&d, 0); - if (d.enable == 0 || d.flags & 1) { - printf("CSN %lu is disabled.\n", csn); - return (NULL); - } - - } - - return (s); -} - -static void -siopnp_attach(u_long csn, u_long vend_id, char *name, struct isa_device *dev) -{ - struct pnp_cinfo d; - - if (dev->id_unit >= NSIOTOT) - return; - - if (read_pnp_parms(&d, 0) == 0) { - printf("failed to read pnp parms\n"); - return; - } - - write_pnp_parms(&d, 0); - - enable_pnp_card(); - - dev->id_iobase = d.port[0]; - dev->id_irq = (1 << d.irq[0]); - dev->id_ointr = siointr; - dev->id_ri_flags = RI_FAST; - dev->id_drq = -1; - - if (dev->id_driver == NULL) { - dev->id_driver = &siodriver; - dev->id_id = isa_compat_nextid(); - } - - if ((dev->id_alive = sioprobe(dev)) != 0) - sioattach(dev); - else - printf("sio%d: probe failed\n", dev->id_unit); -} -#endif - DEV_DRIVER_MODULE(sio, isa, sio_driver, sio_devclass, sio_cdevsw, 0, 0); #ifdef PC98 diff --git a/sys/pc98/pc98/sio.c b/sys/pc98/pc98/sio.c index 714dda8..0aaa670 100644 --- a/sys/pc98/pc98/sio.c +++ b/sys/pc98/pc98/sio.c @@ -40,8 +40,6 @@ #include "opt_ddb.h" #include "opt_sio.h" #include "sio.h" -/* #include "pnp.h" */ -#define NPNP 0 /* * Serial driver, based on 386BSD-0.1 com driver. @@ -183,23 +181,19 @@ #endif #if 0 - #include "card.h" #if NCARD > 0 #include <sys/module.h> #include <pccard/cardinfo.h> #include <pccard/slot.h> #endif - -#if NPNP > 0 -#include <i386/isa/pnp.h> -#endif - +#else +#define NCARD 0 #endif #ifndef __i386__ -#define disable_intr() 0 -#define enable_intr() 0 +#define disable_intr() +#define enable_intr() #endif #ifdef SMP @@ -208,11 +202,7 @@ #endif /* SMP */ #ifndef EXTRA_SIO -#if NPNP > 0 -#define EXTRA_SIO MAX_PNP_CARDS -#else -#define EXTRA_SIO 0 -#endif +#define EXTRA_SIO 4 /* XXX shouldn't need NSIO */ #endif #define NSIOTOT (NSIO + EXTRA_SIO) @@ -402,6 +392,9 @@ struct com_s { u_int delta_error_counts[CE_NTYPES]; u_long error_counts[CE_NTYPES]; + struct resource *irqres; + struct resource *ioportres; + /* * Data area for output buffers. Someday we should build the output * buffer queue without copying data. @@ -506,12 +499,6 @@ static int sio_timeout; static int sio_timeouts_until_log; static struct callout_handle sio_timeout_handle = CALLOUT_HANDLE_INITIALIZER(&sio_timeout_handle); -#if 0 /* XXX */ -static struct tty *sio_tty[NSIOTOT]; -#else -static struct tty sio_tty[NSIOTOT]; -#endif -static const int nsio_tty = NSIOTOT; #ifdef PC98 struct siodev { @@ -900,12 +887,9 @@ sioinit(struct pccard_devinfo *devi) devi->isahd.id_flags |= COM_C_NOPROBE; /* - * Probe the device. If a value is returned, the - * device was found at the location. + * attach the device. */ - if (sioprobe(&devi->isahd) == 0) - return(ENXIO); - if (sioattach(&devi->isahd) == 0) + if (sioattach(devi->isahd.id_device) == 0) return(ENXIO); return(0); @@ -971,8 +955,18 @@ card_intr(struct pccard_devinfo *devi) } #endif /* NCARD > 0 */ -#define SET_FLAG(dev, bit) device_set_flags(dev, device_get_flags(dev) | (bit)) -#define CLR_FLAG(dev, bit) device_set_flags(dev, device_get_flags(dev) & ~(bit)) +#define SET_FLAG(dev, bit) device_set_flags(dev, device_get_flags(dev) | (bit)) +#define CLR_FLAG(dev, bit) device_set_flags(dev, device_get_flags(dev) & ~(bit)) + +static struct isa_pnp_id sio_ids[] = { + {0x0005d041, "Standard PC COM port"}, /* PNP0500 */ + {0x0105d041, "16550A-compatible COM port"}, /* PNP0501 */ + {0x0205d041, "Multiport serial device (non-intelligent 16550)"}, /* PNP0502 */ + {0x1005d041, "Generic IRDA-compatible device"}, /* PNP0510 */ + {0x1105d041, "Generic IRDA-compatible device"}, /* PNP0511 */ + {0x31307256, "USR3031"}, /* USR3031 */ + {0} +}; static int sioprobe(dev) @@ -989,6 +983,8 @@ sioprobe(dev) int result; device_t xdev; u_int flags = device_get_flags(dev); + int rid; + struct resource *port; #ifdef PC98 int irqout=0; int tmp; @@ -997,6 +993,21 @@ sioprobe(dev) Port_t rsabase = NULL; #endif + /* Check isapnp ids */ + if (ISA_PNP_PROBE(device_get_parent(dev), dev, sio_ids) == ENXIO) + return (ENXIO); + + rid = 0; +#ifdef PC98 + port = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, + 0, ~0, 1, RF_ACTIVE); /* XXX */ +#else + port = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, + 0, ~0, IO_COMSIZE, RF_ACTIVE); +#endif + if (!port) + return ENXIO; + if (!already_init) { /* * Turn off MCR_IENABLE for all likely serial ports. An unused @@ -1011,20 +1022,23 @@ sioprobe(dev) #ifdef PC98 for (i = 0; i < count; i++) { xdev = devs[i]; - tmp = (flags >> 24) & 0xff; - if (IS_8251(tmp)) - outb((isa_get_port(xdev) & 0xff00) | PC98SIO_cmd_port(tmp & 0x0f), 0xf2); - else - if (tmp == COM_IF_RSA98III) { - rsabase = isa_get_port(xdev) & 0xfff0; - outb(isa_get_port(xdev) + 8 + (com_mcr << if_16550a_type[tmp & 0x0f].port_shift), 0); - } else - outb(isa_get_port(xdev) + (com_mcr << if_16550a_type[tmp & 0x0f].port_shift), 0); + if (device_is_enabled(xdev)) { + tmp = (flags >> 24) & 0xff; + if (IS_8251(tmp)) + outb((isa_get_port(xdev) & 0xff00) | PC98SIO_cmd_port(tmp & 0x0f), 0xf2); + else + if (tmp == COM_IF_RSA98III) { + rsabase = isa_get_port(xdev) & 0xfff0; + outb(isa_get_port(xdev) + 8 + (com_mcr << if_16550a_type[tmp & 0x0f].port_shift), 0); + } else + outb(isa_get_port(xdev) + (com_mcr << if_16550a_type[tmp & 0x0f].port_shift), 0); + } } #else for (i = 0; i < count; i++) { xdev = devs[i]; - outb(isa_get_port(xdev) + com_mcr, 0); + if (device_is_enabled(xdev)) + outb(isa_get_port(xdev) + com_mcr, 0); } #endif free(devs, M_TEMP); @@ -1081,7 +1095,7 @@ sioprobe(dev) if (epson_machine_id==0x20) { /* XXX */ result = 0; } - isa_set_portsize(dev, 4); + bus_release_resource(dev, SYS_RES_IOPORT, rid, port); return result; } #endif /* PC98 */ @@ -1117,7 +1131,6 @@ sioprobe(dev) if (idev == NULL) { printf("sio%d: master device %d not configured\n", device_get_unit(dev), COM_MPMASTER(flags)); - isa_set_irq(dev, 0); idev = dev; } #ifndef PC98 @@ -1151,7 +1164,7 @@ sioprobe(dev) port_shift = if_16550a_type[iod.if_type & 0x0f].port_shift; #endif bzero(failures, sizeof failures); - iobase = isa_get_port(dev); + iobase = rman_get_start(port); #ifdef PC98 if (iod.if_type == COM_IF_RSA98III) iobase += 8; @@ -1265,7 +1278,7 @@ sioprobe(dev) outb(iobase + com_mcr, mcr_image); #endif /* PC98 */ - /* + /* * It's a definitly Serial PCMCIA(16550A), but still be required * for IIR_TXRDY implementation ( Palido 321s, DC-1S... ) */ @@ -1280,12 +1293,6 @@ sioprobe(dev) #endif } /* Check IIR_TXRDY clear ? */ -#ifdef PC98 - isa_set_portsize(dev, - if_16550a_type[iod.if_type & 0x0f].io_size); -#else - isa_set_portsize(dev, IO_COMSIZE); -#endif result = 0; if ( failures[6] & IIR_TXRDY ) { /* Nop, Double check with clearing IER */ @@ -1300,7 +1307,7 @@ sioprobe(dev) /* Ok. we're familia this gang */ SET_FLAG(dev, COM_C_IIR_TXRDYBUG); /* Set IIR_TXRDYBUG */ } else { - /* Unknow, Just omit this chip.. XXX*/ + /* Unknown, Just omit this chip.. XXX */ result = ENXIO; } } else { @@ -1313,6 +1320,7 @@ sioprobe(dev) outb(iobase + com_cfcr, CFCR_8BITS); #endif enable_intr(); + bus_release_resource(dev, SYS_RES_IOPORT, rid, port); return (iobase == siocniobase ? 0 : result); } @@ -1400,11 +1408,6 @@ sioprobe(dev) device_get_unit(dev), irqmap[0], irqmap[1], irqmap[2], irqmap[3]); -#ifdef PC98 - isa_set_portsize(dev, if_16550a_type[iod.if_type & 0x0f].io_size); -#else - isa_set_portsize(dev, IO_COMSIZE); -#endif result = 0; for (fn = 0; fn < sizeof failures; ++fn) if (failures[fn]) { @@ -1424,6 +1427,7 @@ sioprobe(dev) } break; } + bus_release_resource(dev, SYS_RES_IOPORT, rid, port); return (iobase == siocniobase ? 0 : result); } @@ -1518,16 +1522,27 @@ sioattach(dev) Port_t iobase; int unit; void *ih; - struct resource *res; - int zero = 0; u_int flags = device_get_flags(dev); + int rid; + struct resource *port; #ifdef PC98 int port_shift = 0; u_char *obuf; u_long obufsize; #endif - iobase = isa_get_port(dev); + rid = 0; +#ifdef PC98 + port = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, + 0, ~0, 1, RF_ACTIVE); /* XXX */ +#else + port = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid, + 0, ~0, IO_COMSIZE, RF_ACTIVE); +#endif + if (!port) + return ENXIO; + + iobase = rman_get_start(port); #ifdef PC98 if (((flags >> 24) & 0xff) == COM_IF_RSA98III) iobase += 8; @@ -1562,6 +1577,7 @@ sioattach(dev) com->obuf2 = obuf + obufsize; #endif com->unit = unit; + com->ioportres = port; com->cfcr_image = CFCR_8BITS; com->dtr_wait = 3 * hz; com->loses_outints = COM_LOSESOUTINTS(flags) != 0; @@ -1821,25 +1837,26 @@ determined_type: ; register_swi(SWI_TTY, siopoll); sio_registered = TRUE; } - make_dev(&sio_cdevsw, unit, - UID_ROOT, GID_WHEEL, 0600, "ttyd%r", unit); - make_dev(&sio_cdevsw, unit | CONTROL_INIT_STATE, - UID_ROOT, GID_WHEEL, 0600, "ttyid%r", unit); - make_dev(&sio_cdevsw, unit | CONTROL_LOCK_STATE, - UID_ROOT, GID_WHEEL, 0600, "ttyld%r", unit); - make_dev(&sio_cdevsw, unit | CALLOUT_MASK, - UID_UUCP, GID_DIALER, 0660, "cuaa%r", unit); - make_dev(&sio_cdevsw, unit | CALLOUT_MASK | CONTROL_INIT_STATE, - UID_UUCP, GID_DIALER, 0660, "cuaia%r", unit); - make_dev(&sio_cdevsw, unit | CALLOUT_MASK | CONTROL_LOCK_STATE, - UID_UUCP, GID_DIALER, 0660, "cuala%r", unit); - com->flags = device_get_flags(dev); /* Heritate id_flags for later */ + make_dev(&sio_cdevsw, unit, + UID_ROOT, GID_WHEEL, 0600, "ttyd%r", unit); + make_dev(&sio_cdevsw, unit | CONTROL_INIT_STATE, + UID_ROOT, GID_WHEEL, 0600, "ttyid%r", unit); + make_dev(&sio_cdevsw, unit | CONTROL_LOCK_STATE, + UID_ROOT, GID_WHEEL, 0600, "ttyld%r", unit); + make_dev(&sio_cdevsw, unit | CALLOUT_MASK, + UID_UUCP, GID_DIALER, 0660, "cuaa%r", unit); + make_dev(&sio_cdevsw, unit | CALLOUT_MASK | CONTROL_INIT_STATE, + UID_UUCP, GID_DIALER, 0660, "cuaia%r", unit); + make_dev(&sio_cdevsw, unit | CALLOUT_MASK | CONTROL_LOCK_STATE, + UID_UUCP, GID_DIALER, 0660, "cuala%r", unit); + com->flags = flags; com->pps.ppscap = PPS_CAPTUREASSERT | PPS_CAPTURECLEAR; pps_init(&com->pps); - res = bus_alloc_resource(dev, SYS_RES_IRQ, &zero, 0ul, ~0ul, 1, - RF_SHAREABLE | RF_ACTIVE); - BUS_SETUP_INTR(device_get_parent(dev), dev, res, + rid = 0; + com->irqres = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0ul, ~0ul, 1, + RF_SHAREABLE | RF_ACTIVE); + BUS_SETUP_INTR(device_get_parent(dev), dev, com->irqres, INTR_TYPE_TTY | INTR_TYPE_FAST, siointr, com, &ih); @@ -1872,11 +1889,7 @@ sioopen(dev, flag, mode, p) return (ENXIO); if (mynor & CONTROL_MASK) return (0); -#if 0 /* XXX */ - tp = com->tp = sio_tty[unit] = ttymalloc(sio_tty[unit]); -#else - tp = com->tp = &sio_tty[unit]; -#endif + tp = dev->si_tty = com->tp = ttymalloc(com->tp); s = spltty(); #ifdef PC98 @@ -2541,7 +2554,7 @@ more_intr: count = tc->tc_get_timecount(tc); pps_event(&com->pps, tc, count, (modem_status & MSR_DCD) ? - PPS_CAPTURECLEAR : PPS_CAPTUREASSERT); + PPS_CAPTUREASSERT : PPS_CAPTURECLEAR); } } line_status = inb(com->line_status_port); @@ -3160,7 +3173,7 @@ comparam(tp, t) /* check requested parameters */ divisor = ttspeedtab(t->c_ospeed, comspeedtab); #endif - if (divisor < 0 || divisor > 0 && t->c_ispeed != t->c_ospeed) + if (divisor < 0 || (divisor > 0 && t->c_ispeed != t->c_ospeed)) return (EINVAL); /* parameters are OK, convert them to the com struct and the device */ @@ -3678,7 +3691,7 @@ siodevtotty(dev) unit = MINOR_TO_UNIT(mynor); if ((u_int) unit >= NSIOTOT) return (NULL); - return (&sio_tty[unit]); + return (dev->si_tty); } static int @@ -3904,20 +3917,21 @@ static void siocnclose __P((struct siocnstate *sp, Port_t iobase)); static void siocnopen __P((struct siocnstate *sp, Port_t iobase, int speed)); static void siocntxwait __P((Port_t iobase)); -#ifdef __i386__ static cn_probe_t siocnprobe; static cn_init_t siocninit; static cn_checkc_t siocncheckc; static cn_getc_t siocngetc; static cn_putc_t siocnputc; +#ifdef __i386__ CONS_DRIVER(sio, siocnprobe, siocninit, NULL, siocngetc, siocncheckc, siocnputc); +#endif + /* To get the GDB related variables */ #if DDB > 0 #include <ddb/ddb.h> #endif -#endif static void siocntxwait(iobase) @@ -4039,10 +4053,7 @@ siocnclose(sp, iobase) outb(iobase + com_ier, sp->ier); } -#ifdef __i386__ -static -#endif -void +static void siocnprobe(cp) struct consdev *cp; { @@ -4069,6 +4080,11 @@ siocnprobe(cp) for (unit = 0; unit < 16; unit++) { /* XXX need to know how many */ int flags; + int disabled; + if (resource_int_value("sio", unit, "disabled", &disabled) == 0) { + if (disabled) + continue; + } if (resource_int_value("sio", unit, "flags", &flags)) continue; if (COM_CONSOLE(flags) || COM_DEBUGGER(flags)) { @@ -4110,21 +4126,18 @@ siocnprobe(cp) cp->cn_pri = COM_FORCECONSOLE(flags) || boothowto & RB_SERIAL ? CN_REMOTE : CN_NORMAL; - printf("sio%d: system console\n", unit); siocniobase = iobase; siocnunit = unit; } - if (COM_DEBUGGER(flags) && !COM_LLCONSOLE(flags)) { + if (COM_DEBUGGER(flags)) { printf("sio%d: gdb debugging port\n", unit); siogdbiobase = iobase; siogdbunit = unit; -#ifdef __i386__ #if DDB > 0 gdbdev = makedev(CDEV_MAJOR, unit); gdb_getc = siocngetc; gdb_putc = siocnputc; #endif -#endif } } } @@ -4152,12 +4165,7 @@ siocnprobe(cp) #ifdef __alpha__ -struct consdev siocons = { - NULL, NULL, siocngetc, siocncheckc, siocnputc, - NULL, 0, CN_NORMAL, -}; - -extern struct consdev *cn_tab; +CONS_DRIVER(sio, NULL, NULL, NULL, siocngetc, siocncheckc, siocnputc); int siocnattach(port, speed) @@ -4170,6 +4178,8 @@ siocnattach(port, speed) siocniobase = port; comdefaultrate = speed; + sio_consdev.cn_pri = CN_NORMAL; + sio_consdev.cn_dev = makedev(CDEV_MAJOR, 0); s = spltty(); @@ -4193,8 +4203,7 @@ siocnattach(port, speed) siocnopen(&sp, siocniobase, comdefaultrate); splx(s); - siocons.cn_dev = makedev(CDEV_MAJOR, 0); - cn_tab = &siocons; + cn_tab = &sio_consdev; return 0; } @@ -4237,20 +4246,14 @@ siogdbattach(port, speed) #endif -#ifdef __i386__ -static -#endif -void +static void siocninit(cp) struct consdev *cp; { comconsole = DEV_TO_UNIT(cp->cn_dev); } -#ifdef __i386__ -static -#endif -int +static int siocncheckc(dev) dev_t dev; { @@ -4355,101 +4358,6 @@ siogdbputc(c) } #endif - -/* - * support PnP cards if we are using 'em - */ - -#if NPNP > 0 - -static pnpid_t siopnp_ids[] = { - { 0x5015f435, "MOT1550"}, - { 0x8113b04e, "Supra1381"}, - { 0x9012b04e, "Supra1290"}, - { 0x7121b04e, "SupraExpress 56i Sp"}, - { 0x11007256, "USR0011"}, - { 0x30207256, "USR2030"}, - { 0x31307256, "USR3031"}, - { 0x90307256, "USR3090"}, - { 0x0100440e, "Cardinal MVP288IV"}, - { 0 } -}; - -static char *siopnp_probe(u_long csn, u_long vend_id); -static void siopnp_attach(u_long csn, u_long vend_id, char *name, - struct isa_device *dev); -static u_long nsiopnp = NSIO; - -static struct pnp_device siopnp = { - "siopnp", - siopnp_probe, - siopnp_attach, - &nsiopnp, - &tty_imask -}; -DATA_SET (pnpdevice_set, siopnp); - -static char * -siopnp_probe(u_long csn, u_long vend_id) -{ - pnpid_t *id; - char *s = NULL; - - for(id = siopnp_ids; id->vend_id != 0; id++) { - if (vend_id == id->vend_id) { - s = id->id_str; - break; - } - } - - if (s) { - struct pnp_cinfo d; - read_pnp_parms(&d, 0); - if (d.enable == 0 || d.flags & 1) { - printf("CSN %lu is disabled.\n", csn); - return (NULL); - } - - } - - return (s); -} - -static void -siopnp_attach(u_long csn, u_long vend_id, char *name, struct isa_device *dev) -{ - struct pnp_cinfo d; - - if (dev->id_unit >= NSIOTOT) - return; - - if (read_pnp_parms(&d, 0) == 0) { - printf("failed to read pnp parms\n"); - return; - } - - write_pnp_parms(&d, 0); - - enable_pnp_card(); - - dev->id_iobase = d.port[0]; - dev->id_irq = (1 << d.irq[0]); - dev->id_ointr = siointr; - dev->id_ri_flags = RI_FAST; - dev->id_drq = -1; - - if (dev->id_driver == NULL) { - dev->id_driver = &siodriver; - dev->id_id = isa_compat_nextid(); - } - - if ((dev->id_alive = sioprobe(dev)) != 0) - sioattach(dev); - else - printf("sio%d: probe failed\n", dev->id_unit); -} -#endif - DEV_DRIVER_MODULE(sio, isa, sio_driver, sio_devclass, sio_cdevsw, 0, 0); #ifdef PC98 |