summaryrefslogtreecommitdiff
path: root/sys/arch/amiga/dev
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/amiga/dev')
-rw-r--r--sys/arch/amiga/dev/ser.c477
1 files changed, 279 insertions, 198 deletions
diff --git a/sys/arch/amiga/dev/ser.c b/sys/arch/amiga/dev/ser.c
index 4bd9db43c42..0428bf82ebc 100644
--- a/sys/arch/amiga/dev/ser.c
+++ b/sys/arch/amiga/dev/ser.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ser.c,v 1.8 1998/02/22 20:36:11 niklas Exp $ */
+/* $OpenBSD: ser.c,v 1.9 1998/02/22 23:33:05 niklas Exp $ */
/* $NetBSD: ser.c,v 1.43 1998/01/12 10:40:11 thorpej Exp $ */
/*
@@ -52,7 +52,10 @@
#include <sys/kernel.h>
#include <sys/syslog.h>
#include <sys/queue.h>
+#include <sys/conf.h>
+
#include <machine/cpu.h>
+
#include <amiga/amiga/device.h>
#include <amiga/dev/serreg.h>
#include <amiga/amiga/custom.h>
@@ -61,18 +64,35 @@
#include <dev/cons.h>
-#include <sys/conf.h>
+#ifdef DDB
+#include <ddb/db_var.h>
+#endif
+
#include <machine/conf.h>
#include "ser.h"
#if NSER > 0
+/* unit is in lower 7 bits (for now, only one unit:-))
+ dialin: open blocks until carrier present, hangup on carrier drop
+ dialout: carrier is ignored */
+
+#define SERUNIT(dev) (minor(dev) & 0x7f)
+#define SERCUA(dev) (minor(dev) & 0x80)
+
+/* Macros to clear/set/test flags. */
+#define SET(t, f) (t) |= (f)
+#define CLR(t, f) (t) &= ~(f)
+#define ISSET(t, f) ((t) & (f))
+
void serattach __P((struct device *, struct device *, void *));
int sermatch __P((struct device *, void *, void *));
struct ser_softc {
struct device dev;
struct tty *ser_tty;
+ u_char ser_cua;
+ int ser_swflags;
};
struct cfattach ser_ca = {
@@ -119,12 +139,9 @@ int serconsole = -1;
int serconsinit;
int serdefaultrate = TTYDEF_SPEED;
int sermajor;
-int serswflags;
-#define SWFLAGS(dev) (serswflags | (DIALOUT(dev) ? TIOCFLAG_SOFTCAR : 0))
struct vbl_node ser_vbl_node[NSER];
struct tty ser_cons;
-struct tty *ser_tty[NSER];
/*
* Since this UART is not particularly bright (to put it nicely), we'll
@@ -207,7 +224,7 @@ serattach(pdp, dp, auxp)
if (serconsole == 0)
kgdb_dev = NODEV; /* can't debug over console port */
else {
- (void) serinit(0, kgdb_rate);
+ (void)serinit(0, kgdb_rate);
serconsinit = 1; /* don't re-init in serputc */
if (kgdb_debug_init == 0)
printf(" kgdb enabled\n");
@@ -240,99 +257,110 @@ seropen(dev, flag, mode, p)
int flag, mode;
struct proc *p;
{
+ int unit = SERUNIT(dev);
+ struct ser_softc *sc;
struct tty *tp;
- int unit, error, s;
-
- error = 0;
- unit = SERUNIT(dev);
+ int s;
+ int error = 0;
if (unit >= NSER || (ser_active & (1 << unit)) == 0)
return (ENXIO);
+ sc = (struct ser_softc *)ser_cd.cd_devs[unit];
s = spltty();
-
- if (ser_tty[unit])
- tp = ser_tty[unit];
- else {
- tp = ((struct ser_softc *)ser_cd.cd_devs[unit])->ser_tty =
- ser_tty[unit] = ttymalloc();
+ if (!sc->ser_tty) {
+ tp = sc->ser_tty = ttymalloc();
tty_attach(tp);
- }
+ } else
+ tp = sc->ser_tty;
+ splx(s);
- tp->t_oproc = (void (*) (struct tty *)) serstart;
+ tp->t_oproc = serstart;
tp->t_param = serparam;
- tp->t_dev = dev;
tp->t_hwiflow = serhwiflow;
- if ((tp->t_state & TS_ISOPEN) == 0) {
- tp->t_state |= TS_WOPEN;
+ if (!ISSET(tp->t_state, TS_ISOPEN)) {
+ SET(tp->t_state, TS_WOPEN);
ttychars(tp);
- if (tp->t_ispeed == 0) {
- /*
- * only when cleared do we reset to defaults.
- */
- tp->t_iflag = TTYDEF_IFLAG;
- tp->t_oflag = TTYDEF_OFLAG;
- tp->t_cflag = TTYDEF_CFLAG;
- tp->t_lflag = TTYDEF_LFLAG;
- tp->t_ispeed = tp->t_ospeed = serdefaultrate;
- }
- /*
- * do these all the time
- */
- if (serswflags & TIOCFLAG_CLOCAL)
- tp->t_cflag |= CLOCAL;
- if (serswflags & TIOCFLAG_CRTSCTS)
- tp->t_cflag |= CRTSCTS;
- if (serswflags & TIOCFLAG_MDMBUF)
- tp->t_cflag |= MDMBUF;
+ tp->t_iflag = TTYDEF_IFLAG;
+ tp->t_oflag = TTYDEF_OFLAG;
+ if (ISSET(sc->ser_swflags, TIOCFLAG_CLOCAL))
+ SET(tp->t_cflag, CLOCAL);
+ if (ISSET(sc->ser_swflags, TIOCFLAG_CRTSCTS))
+ SET(tp->t_cflag, CRTSCTS);
+ if (ISSET(sc->ser_swflags, TIOCFLAG_MDMBUF))
+ SET(tp->t_cflag, MDMBUF);
+ tp->t_cflag = TTYDEF_CFLAG;
+ tp->t_lflag = TTYDEF_LFLAG;
+ tp->t_ispeed = tp->t_ospeed = serdefaultrate;
+
+ s = spltty();
+
serparam(tp, &tp->t_termios);
ttsetwater(tp);
- (void)sermctl(dev, TIOCM_DTR | TIOCM_RTS, DMSET);
- if ((SWFLAGS(dev) & TIOCFLAG_SOFTCAR) ||
- (sermctl(dev, 0, DMGET) & TIOCM_CD))
- tp->t_state |= TS_CARR_ON;
+ sermctl(dev, TIOCM_DTR | TIOCM_RTS, DMSET);
+ if (ISSET(sc->ser_swflags, TIOCFLAG_SOFTCAR) || SERCUA(dev) ||
+ ISSET(sermctl(dev, 0, DMGET), TIOCM_CD) ||
+ ISSET(tp->t_cflag, MDMBUF))
+ SET(tp->t_state, TS_CARR_ON);
else
- tp->t_state &= ~TS_CARR_ON;
- } else if (tp->t_state & TS_XCLUDE && p->p_ucred->cr_uid != 0) {
- splx(s);
- return(EBUSY);
+ CLR(tp->t_state, TS_CARR_ON);
+ } else if (ISSET(tp->t_state, TS_XCLUDE) && p->p_ucred->cr_uid != 0) {
+ return (EBUSY);
+ } else
+ s = spltty();
+
+ if (SERCUA(dev)) {
+ if (ISSET(tp->t_state, TS_ISOPEN)) {
+ /* Ah, but someone already is dialed in... */
+ splx(s);
+ return (EBUSY);
+ }
+ sc->ser_cua = 1; /* We go into CUA mode */
}
+ tp->t_dev = dev;
- /*
- * if NONBLOCK requested, ignore carrier
- */
- if (flag & O_NONBLOCK)
- goto done;
-
- /*
- * block waiting for carrier
- */
- while ((tp->t_state & TS_CARR_ON) == 0 && (tp->t_cflag & CLOCAL) == 0) {
- tp->t_state |= TS_WOPEN;
- error = ttysleep(tp, (caddr_t)&tp->t_rawq,
- TTIPRI | PCATCH, ttopen, 0);
- if (error) {
+ if (ISSET(flag, O_NONBLOCK)) {
+ if (!SERCUA(dev) && sc->ser_cua) {
+ /* Opening TTY non-blocking... but the CUA is busy */
splx(s);
- return(error);
+ return (EBUSY);
+ }
+ } else {
+ while (sc->ser_cua ||
+ (!ISSET(tp->t_cflag, CLOCAL) &&
+ !ISSET(tp->t_state, TS_CARR_ON))) {
+ SET(tp->t_state, TS_WOPEN);
+ error = ttysleep(tp, &tp->t_rawq, TTIPRI | PCATCH,
+ ttopen, 0);
+ if (!SERCUA(dev) && sc->ser_cua && error == EINTR)
+ continue;
+ if (error) {
+ /* XXX should turn off chip if we're the
+ only waiter */
+ if (SERCUA(dev)) {
+ sc->ser_cua = 0;
+ tp->t_dev = SERUNIT(dev);
+ }
+ CLR(tp->t_state, TS_WOPEN);
+ splx(s);
+ return error;
+ }
+ if (!SERCUA(dev) && sc->ser_cua)
+ continue;
}
}
-done:
+
/* This is a way to handle lost XON characters */
- if ((flag & O_TRUNC) && (tp->t_state & TS_TTSTOP)) {
- tp->t_state &= ~TS_TTSTOP;
- ttstart (tp);
+ if (ISSET(flag, O_TRUNC) && ISSET(tp->t_state, TS_TTSTOP)) {
+ CLR(tp->t_state, TS_TTSTOP);
+ ttstart(tp);
}
-
splx(s);
- /*
- * Reset the tty pointer, as there could have been a dialout
- * use of the tty with a dialin open waiting.
- */
- tp->t_dev = dev;
+
ser_open_speed = tp->t_ispeed;
- return((*linesw[tp->t_line].l_open)(dev, tp));
+ return ((*linesw[tp->t_line].l_open)(dev, tp));
}
/*ARGSUSED*/
@@ -342,13 +370,11 @@ serclose(dev, flag, mode, p)
int flag, mode;
struct proc *p;
{
- struct tty *tp;
- int unit;
+ int unit = SERUNIT(dev);
+ struct ser_softc *sc = (struct ser_softc *)ser_cd.cd_devs[unit];
+ struct tty *tp = sc->ser_tty;
int closebits;
- unit = SERUNIT(dev);
-
- tp = ser_tty[unit];
(*linesw[tp->t_line].l_close)(tp, flag);
custom.adkcon = ADKCONF_UARTBRK; /* clear break */
#ifdef KGDB
@@ -376,12 +402,13 @@ serclose(dev, flag, mode, p)
* immediately.
*/
(void)tsleep(tp, TTIPRI, ttclos, hz);
+ sc->ser_cua = 0; /* XXX spltty? */
ttyclose(tp);
#if not_yet
if (tp != &ser_cons) {
remove_vbl_function(&ser_vbl_node[unit]);
ttyfree(tp);
- ser_tty[unit] = (struct tty *) NULL;
+ sc->ser_tty = NULL;
}
#endif
ser_open_speed = tp->t_ispeed;
@@ -394,10 +421,13 @@ serread(dev, uio, flag)
struct uio *uio;
int flag;
{
- struct tty *tp;
- if ((tp = ser_tty[SERUNIT(dev)]) == NULL)
- return(ENXIO);
- return((*linesw[tp->t_line].l_read)(tp, uio, flag));
+ int unit = SERUNIT(dev);
+ struct ser_softc *sc = (struct ser_softc *)ser_cd.cd_devs[unit];
+ struct tty *tp = sc->ser_tty;
+
+ if (!tp)
+ return (ENXIO);
+ return ((*linesw[tp->t_line].l_read)(tp, uio, flag));
}
int
@@ -406,18 +436,24 @@ serwrite(dev, uio, flag)
struct uio *uio;
int flag;
{
- struct tty *tp;
+ int unit = SERUNIT(dev);
+ struct ser_softc *sc = (struct ser_softc *)ser_cd.cd_devs[unit];
+ struct tty *tp = sc->ser_tty;
- if((tp = ser_tty[SERUNIT(dev)]) == NULL)
- return(ENXIO);
- return((*linesw[tp->t_line].l_write)(tp, uio, flag));
+ if (!tp)
+ return (ENXIO);
+ return ((*linesw[tp->t_line].l_write)(tp, uio, flag));
}
struct tty *
sertty(dev)
dev_t dev;
{
- return (ser_tty[SERUNIT(dev)]);
+ int unit = SERUNIT(dev);
+ struct ser_softc *sc = (struct ser_softc *)ser_cd.cd_devs[unit];
+ struct tty *tp = sc->ser_tty;
+
+ return (tp);
}
/*
@@ -487,7 +523,8 @@ serintr(unit)
int unit;
{
int s1, s2, ovfl;
- struct tty *tp = ser_tty[unit];
+ struct ser_softc *sc = (struct ser_softc *)ser_cd.cd_devs[unit];
+ struct tty *tp = sc->ser_tty;
/*
* Make sure we're not interrupted by another
@@ -498,7 +535,7 @@ serintr(unit)
/*
* pass along any acumulated information
*/
- while (sbcnt > 0 && (tp->t_state & TS_TBLOCK) == 0) {
+ while (sbcnt > 0 && !ISSET(tp->t_state, TS_TBLOCK)) {
/*
* no collision with ser_fastint()
*/
@@ -520,7 +557,7 @@ serintr(unit)
ovfl);
}
s2 = splser();
- if (sbcnt == 0 && (tp->t_state & TS_TBLOCK) == 0)
+ if (sbcnt == 0 && ISSET(tp->t_state, TS_TBLOCK))
SETRTS(ciab.pra); /* start accepting data again */
splx(s2);
splx(s1);
@@ -530,15 +567,15 @@ void
sereint(unit, stat)
int unit, stat;
{
- struct tty *tp;
+ struct ser_softc *sc = (struct ser_softc *)ser_cd.cd_devs[unit];
+ struct tty *tp = sc->ser_tty;
u_char ch;
int c;
- tp = ser_tty[unit];
ch = stat & 0xff;
c = ch;
- if ((tp->t_state & TS_ISOPEN) == 0) {
+ if (!ISSET(tp->t_state, TS_ISOPEN)) {
#ifdef KGDB
/* we don't care about parity errors */
if (kgdb_dev == makedev(sermajor, unit) && c == FRAME_END)
@@ -551,13 +588,13 @@ sereint(unit, stat)
* Check for break and (if enabled) parity error.
*/
if ((stat & 0x1ff) == 0)
- c |= TTY_FE;
- else if ((tp->t_cflag & PARENB) &&
- (((ch >> 7) + even_parity[ch & 0x7f]
- + !!(tp->t_cflag & PARODD)) & 1))
- c |= TTY_PE;
+ SET(c, TTY_FE);
+ else if (ISSET(tp->t_cflag, PARENB) &&
+ ((ch >> 7) + even_parity[ch & 0x7f] +
+ (ISSET(tp->t_cflag, PARODD) ? 1 : 0)))
+ SET(c, TTY_PE);
- if (stat & SERDATRF_OVRUN)
+ if (ISSET(stat, SERDATRF_OVRUN))
log(LOG_WARNING, "ser0: silo overflow\n");
(*linesw[tp->t_line].l_rint)(c, tp);
@@ -573,14 +610,18 @@ void
sermint(unit)
int unit;
{
- struct tty *tp;
+ struct ser_softc *sc = (struct ser_softc *)ser_cd.cd_devs[unit];
+ struct tty *tp = sc->ser_tty;
u_char stat, last, istat;
+#ifdef PPS_SYNC
+ struct timeval tv;
+ long usec;
+#endif /* PPS_SYNC */
- tp = ser_tty[unit];
if (!tp)
return;
- if ((tp->t_state & (TS_ISOPEN | TS_WOPEN)) == 0) {
+ if (!ISSET(tp->t_state, TS_ISOPEN | TS_WOPEN)) {
sbrpt = sbwpt = serbuf;
return;
}
@@ -598,32 +639,43 @@ sermint(unit)
*/
istat = stat ^ last;
- if ((istat & CIAB_PRA_CD) &&
- (SWFLAGS(tp->t_dev) & TIOCFLAG_SOFTCAR) == 0) {
- if (ISDCD(stat))
- (*linesw[tp->t_line].l_modem)(tp, 1);
- else if ((*linesw[tp->t_line].l_modem)(tp, 0) == 0) {
+ if (ISSET(istat, CIAB_PRA_CD)) {
+#ifdef PPS_SYNC
+ if (ISSET(sc->ser_swflags, TIOCFLAG_PPS)) {
+ if (ISDCD(stat)) {
+ usec = time.tv_usec;
+ microtime(&tv);
+ usec = tv.tv_usec - usec;
+ if (usec < 0)
+ usec += 1000000;
+ hardpps(&tv, usec);
+ }
+ }
+#endif /* PPS_SYNC */
+ if (!ISSET(sc->ser_swflags, TIOCFLAG_SOFTCAR) &&
+ (*linesw[tp->t_line].l_modem)(tp, ISDCD(stat)) ==
+ 0) {
CLRDTR(stat);
CLRRTS(stat);
ciab.pra = stat;
last_ciab_pra = stat;
}
}
- if ((istat & CIAB_PRA_CTS) && (tp->t_state & TS_ISOPEN) &&
- (tp->t_cflag & CRTSCTS)) {
+ if (ISSET(istat, CIAB_PRA_CTS) && ISSET(tp->t_state, TS_ISOPEN) &&
+ ISSET(tp->t_cflag, CRTSCTS)) {
#if 0
/* the line is up and we want to do rts/cts flow control */
if (ISCTS(stat)) {
- tp->t_state &= ~TS_TTSTOP;
+ CLR(tp->t_state, TS_TTSTOP);
ttstart(tp);
/* cause tbe-int if we were stuck there */
custom.intreq = INTF_SETCLR | INTF_TBE;
} else
- tp->t_state |= TS_TTSTOP;
+ SET(tp->t_state, TS_TTSTOP);
#else
/* do this on hardware level, not with tty driver */
if (ISCTS(stat)) {
- tp->t_state &= ~TS_TTSTOP;
+ CLR(tp->t_state, TS_TTSTOP);
/* cause TBE interrupt */
custom.intreq = INTF_SETCLR | INTF_TBE;
}
@@ -639,21 +691,21 @@ serioctl(dev, cmd, data, flag, p)
int flag;
struct proc *p;
{
- register struct tty *tp;
- register int unit = SERUNIT(dev);
- register int error;
+ int unit = SERUNIT(dev);
+ struct ser_softc *sc = (struct ser_softc *)ser_cd.cd_devs[unit];
+ struct tty *tp = sc->ser_tty;
+ int error;
- tp = ser_tty[unit];
if (!tp)
return ENXIO;
error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, p);
if (error >= 0)
- return(error);
+ return (error);
error = ttioctl(tp, cmd, data, flag, p);
if (error >= 0)
- return(error);
+ return (error);
switch (cmd) {
case TIOCSBRK:
@@ -665,45 +717,47 @@ serioctl(dev, cmd, data, flag, p)
break;
case TIOCSDTR:
- (void) sermctl(dev, TIOCM_DTR | TIOCM_RTS, DMBIS);
+ (void)sermctl(dev, TIOCM_DTR | TIOCM_RTS, DMBIS);
break;
case TIOCCDTR:
- (void) sermctl(dev, TIOCM_DTR | TIOCM_RTS, DMBIC);
+ (void)sermctl(dev, TIOCM_DTR | TIOCM_RTS, DMBIC);
break;
case TIOCMSET:
- (void) sermctl(dev, *(int *) data, DMSET);
+ (void)sermctl(dev, *(int *) data, DMSET);
break;
case TIOCMBIS:
- (void) sermctl(dev, *(int *) data, DMBIS);
+ (void)sermctl(dev, *(int *) data, DMBIS);
break;
case TIOCMBIC:
- (void) sermctl(dev, *(int *) data, DMBIC);
+ (void)sermctl(dev, *(int *) data, DMBIC);
break;
case TIOCMGET:
*(int *)data = sermctl(dev, 0, DMGET);
break;
+
case TIOCGFLAGS:
- *(int *)data = SWFLAGS(dev);
+ *(int *)data = sc->ser_swflags;
break;
case TIOCSFLAGS:
error = suser(p->p_ucred, &p->p_acflag);
if (error != 0)
- return(EPERM);
+ return (EPERM);
- serswflags = *(int *)data;
- serswflags &= /* only allow valid flags */
- (TIOCFLAG_SOFTCAR | TIOCFLAG_CLOCAL | TIOCFLAG_CRTSCTS);
+ sc->ser_swflags = *(int *)data;
+ sc->ser_swflags &= /* only allow valid flags */
+ (TIOCFLAG_SOFTCAR | TIOCFLAG_CLOCAL | TIOCFLAG_CRTSCTS |
+ TIOCFLAG_MDMBUF | TIOCFLAG_PPS);
break;
default:
- return(ENOTTY);
+ return (ENOTTY);
}
- return(0);
+ return (0);
}
int
@@ -711,27 +765,45 @@ serparam(tp, t)
struct tty *tp;
struct termios *t;
{
- int cflag, unit, ospeed = 0;
+ struct ser_softc *sc =
+ (struct ser_softc *)ser_cd.cd_devs[SERUNIT(tp->t_dev)];
+ int ospeed = 0;
+ tcflag_t cflag, oldcflag;
+ int rec_mode, s;
cflag = t->c_cflag;
- unit = SERUNIT(tp->t_dev);
if (t->c_ospeed > 0) {
if (t->c_ospeed < 110)
- return(EINVAL);
+ return (EINVAL);
ospeed = SERBRD(t->c_ospeed);
}
if (t->c_ispeed && t->c_ispeed != t->c_ospeed)
- return(EINVAL);
+ return (EINVAL);
+
+ switch (t->c_cflag & CSIZE) {
+ case CS7:
+ if (!ISSET(t->c_cflag, PARENB))
+ return (EINVAL);
+ rec_mode = 0; /* 8 bits */
+ break;
+ case CS8:
+ rec_mode = ISSET(t->c_cflag, PARENB) ? 1 : 0;
+ break;
+ default:
+ return (EINVAL);
+ }
+
+ s = spltty();
/*
* copy to tty
*/
- tp->t_ispeed = t->c_ispeed;
+ ser_open_speed = tp->t_ispeed = t->c_ispeed;
tp->t_ospeed = t->c_ospeed;
+ oldcflag = tp->t_cflag;
tp->t_cflag = cflag;
- ser_open_speed = tp->t_ispeed;
/*
* enable interrupts
@@ -744,12 +816,27 @@ serparam(tp, t)
else {
/*
* (re)enable DTR
- * and set baud rate. (8 bit mode)
+ * and set baud rate & 8/9-bit mode.
*/
(void)sermctl(tp->t_dev, TIOCM_DTR | TIOCM_RTS, DMSET);
- custom.serper = (0 << 15) | ospeed;
+ custom.serper = (rec_mode << 15) | ospeed;
}
- return(0);
+
+ /*
+ * If DCD is off and MDMBUF is changed, ask the tty layer if we should
+ * stop the device.
+ */
+ if (!ISDCD(last_ciab_pra) &&
+ !ISSET(sc->ser_swflags, TIOCFLAG_SOFTCAR) &&
+ ISSET(oldcflag, MDMBUF) != ISSET(tp->t_cflag, MDMBUF) &&
+ (*linesw[tp->t_line].l_modem)(tp, 0) == 0) {
+ CLRDTR(ciab.pra);
+ }
+
+ /* Just to be sure... */
+ splx(s);
+ serstart(tp);
+ return (0);
}
int serhwiflow(tp, flag)
@@ -763,7 +850,7 @@ int serhwiflow(tp, flag)
CLRRTS(ciab.pra);
else
SETRTS(ciab.pra);
- return 1;
+ return (1);
}
static void
@@ -771,22 +858,22 @@ ser_putchar(tp, c)
struct tty *tp;
u_short c;
{
- if ((tp->t_cflag & CSIZE) == CS7 || (tp->t_cflag & PARENB))
+ if ((tp->t_cflag & CSIZE) == CS7 || ISSET(tp->t_cflag, PARENB))
c &= 0x7f;
/*
* handle parity if necessary
*/
- if (tp->t_cflag & PARENB) {
+ if (ISSET(tp->t_cflag, PARENB)) {
if (even_parity[c])
c |= 0x80;
- if (tp->t_cflag & PARODD)
+ if (ISSET(tp->t_cflag, PARODD))
c ^= 0x80;
}
/*
* add stop bit(s)
*/
- if (tp->t_cflag & CSTOPB)
+ if (ISSET(tp->t_cflag, CSTOPB))
c |= 0x300;
else
c |= 0x100;
@@ -801,16 +888,16 @@ static u_char *sob_ptr = ser_outbuf, *sob_end = ser_outbuf;
void
ser_outintr()
{
- struct tty *tp = ser_tty[0];
+ struct ser_softc *sc = (struct ser_softc *)ser_cd.cd_devs[0];
+ struct tty *tp = sc->ser_tty;
int s;
- tp = ser_tty[0];
s = spltty();
if (tp == 0)
goto out;
- if ((custom.intreqr & INTF_TBE) == 0)
+ if (!ISSET(custom.intreqr, INTF_TBE))
goto out;
/*
@@ -819,7 +906,7 @@ ser_outintr()
custom.intreq = INTF_TBE;
if (sob_ptr == sob_end) {
- tp->t_state &= ~(TS_BUSY | TS_FLUSH);
+ CLR(tp->t_state, TS_BUSY | TS_FLUSH);
if (tp->t_line)
(*linesw[tp->t_line].l_start)(tp);
else
@@ -844,35 +931,33 @@ void
serstart(tp)
struct tty *tp;
{
- int cc, s, unit, hiwat;
+ int cc, s, hiwat;
hiwat = 0;
- if ((tp->t_state & TS_ISOPEN) == 0)
+ if (!ISSET(tp->t_state, TS_ISOPEN))
return;
- unit = SERUNIT(tp->t_dev);
-
s = spltty();
- if (tp->t_state & (TS_TIMEOUT | TS_TTSTOP))
+ if (ISSET(tp->t_state, TS_TIMEOUT | TS_TTSTOP))
goto out;
cc = tp->t_outq.c_cc;
if (cc <= tp->t_lowat) {
- if (tp->t_state & TS_ASLEEP) {
- tp->t_state &= ~TS_ASLEEP;
- wakeup((caddr_t) & tp->t_outq);
+ if (ISSET(tp->t_state, TS_ASLEEP)) {
+ CLR(tp->t_state, TS_ASLEEP);
+ wakeup((caddr_t)&tp->t_outq);
}
selwakeup(&tp->t_wsel);
}
- if (cc == 0 || (tp->t_state & TS_BUSY))
+ if (cc == 0 || ISSET(tp->t_state, TS_BUSY))
goto out;
/*
* We only do bulk transfers if using CTSRTS flow control, not for
* (probably sloooow) ixon/ixoff devices.
*/
- if ((tp->t_cflag & CRTSCTS) == 0)
+ if (!ISSET(tp->t_cflag, CRTSCTS))
cc = 1;
/*
@@ -885,7 +970,7 @@ serstart(tp)
}
cc = q_to_b(&tp->t_outq, ser_outbuf, cc);
if (cc > 0) {
- tp->t_state |= TS_BUSY;
+ SET(tp->t_state, TS_BUSY);
sob_ptr = ser_outbuf;
sob_end = ser_outbuf + cc;
@@ -913,10 +998,8 @@ serstop(tp, flag)
int s;
s = spltty();
- if (tp->t_state & TS_BUSY) {
- if ((tp->t_state & TS_TTSTOP) == 0)
- tp->t_state |= TS_FLUSH;
- }
+ if (ISSET(tp->t_state, TS_BUSY) && !ISSET(tp->t_state, TS_TTSTOP))
+ SET(tp->t_state, TS_FLUSH);
splx(s);
return (0);
}
@@ -926,29 +1009,27 @@ sermctl(dev, bits, how)
dev_t dev;
int bits, how;
{
- int unit, s;
+ int s;
u_char ub = 0;
- unit = SERUNIT(dev);
-
/*
* convert TIOCM* mask into CIA mask
* which is active low
*/
if (how != DMGET) {
ub = 0;
- if (bits & TIOCM_DTR)
- ub |= CIAB_PRA_DTR;
- if (bits & TIOCM_RTS)
- ub |= CIAB_PRA_RTS;
- if (bits & TIOCM_CTS)
- ub |= CIAB_PRA_CTS;
- if (bits & TIOCM_CD)
- ub |= CIAB_PRA_CD;
- if (bits & TIOCM_RI)
- ub |= CIAB_PRA_SEL; /* collision with /dev/par ! */
- if (bits & TIOCM_DSR)
- ub |= CIAB_PRA_DSR;
+ if (ISSET(bits, TIOCM_DTR))
+ SET(ub, CIAB_PRA_DTR);
+ if (ISSET(bits, TIOCM_RTS))
+ SET(ub, CIAB_PRA_RTS);
+ if (ISSET(bits, TIOCM_CTS))
+ SET(ub, CIAB_PRA_CTS);
+ if (ISSET(bits, TIOCM_CD))
+ SET(ub, CIAB_PRA_CD);
+ if (ISSET(bits, TIOCM_RI))
+ SET(ub, CIAB_PRA_SEL); /* collision with /dev/par ! */
+ if (ISSET(bits, TIOCM_DSR))
+ SET(ub, CIAB_PRA_DSR);
}
s = spltty();
switch (how) {
@@ -974,20 +1055,20 @@ sermctl(dev, bits, how)
(void)splx(s);
bits = 0;
- if (ub & CIAB_PRA_DTR)
- bits |= TIOCM_DTR;
- if (ub & CIAB_PRA_RTS)
- bits |= TIOCM_RTS;
- if (ub & CIAB_PRA_CTS)
- bits |= TIOCM_CTS;
- if (ub & CIAB_PRA_CD)
- bits |= TIOCM_CD;
- if (ub & CIAB_PRA_SEL)
- bits |= TIOCM_RI;
- if (ub & CIAB_PRA_DSR)
- bits |= TIOCM_DSR;
-
- return(bits);
+ if (ISSET(ub, CIAB_PRA_DTR))
+ SET(bits, TIOCM_DTR);
+ if (ISSET(ub, CIAB_PRA_RTS))
+ SET(bits, TIOCM_RTS);
+ if (ISSET(ub, CIAB_PRA_CTS))
+ SET(bits, TIOCM_CTS);
+ if (ISSET(ub, CIAB_PRA_CD))
+ SET(bits, TIOCM_CD);
+ if (ISSET(ub, CIAB_PRA_SEL))
+ SET(bits, TIOCM_RI);
+ if (ISSET(ub, CIAB_PRA_DSR))
+ SET(bits, TIOCM_DSR);
+
+ return (bits);
}
/*
@@ -1044,7 +1125,7 @@ serinit(unit, rate)
/*
* might want to fiddle with the CIA later ???
*/
- custom.serper = (rate>=110 ? SERBRD(rate) : 0);
+ custom.serper = (rate >= 110 ? SERBRD(rate) : 0);
splx(s);
}
@@ -1059,7 +1140,7 @@ sercngetc(dev)
/*
* poll
*/
- while (((stat = custom.serdatr & 0xffff) & SERDATRF_RBF) == 0)
+ while (!ISSET(stat = custom.serdatr & 0xffff, SERDATRF_RBF))
;
c = stat & 0xff;
/*
@@ -1092,7 +1173,7 @@ sercnputc(dev, c)
* wait for any pending transmission to finish
*/
timo = 50000;
- while (!(custom.serdatr & SERDATRF_TBE) && --timo);
+ while (!ISSET(custom.serdatr, SERDATRF_TBE) && --timo);
/*
* transmit char.
@@ -1103,7 +1184,7 @@ sercnputc(dev, c)
* wait for this transmission to complete
*/
timo = 1500000;
- while (!(custom.serdatr & SERDATRF_TBE) && --timo)
+ while (!ISSET(custom.serdatr, SERDATRF_TBE) && --timo)
;
/*