summaryrefslogtreecommitdiff
path: root/sys/arch/mvme68k/dev
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/mvme68k/dev')
-rw-r--r--sys/arch/mvme68k/dev/cl.c.dale1666
1 files changed, 0 insertions, 1666 deletions
diff --git a/sys/arch/mvme68k/dev/cl.c.dale b/sys/arch/mvme68k/dev/cl.c.dale
deleted file mode 100644
index c59ad812a10..00000000000
--- a/sys/arch/mvme68k/dev/cl.c.dale
+++ /dev/null
@@ -1,1666 +0,0 @@
-/* $NetBSD$ */
-/*
- * Copyright (c) 1995 Dale Rahn. All rights reserved.
- *
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by Dale Rahn.
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/param.h>
-#include <sys/callout.h>
-#include <sys/conf.h>
-#include <sys/ioctl.h>
-#include <sys/proc.h>
-#include <sys/tty.h>
-#include <sys/uio.h>
-#include <sys/systm.h>
-#include <sys/time.h>
-#include <sys/device.h>
-/* #include <sys/queue.h> */
-#include <machine/cpu.h>
-#include <machine/autoconf.h>
-#include <dev/cons.h>
-#include <mvme68k/dev/cd2400reg.h>
-#include <sys/syslog.h>
-#include "cl.h"
-
-#include "pcctwo.h"
-
-#if NPCCTWO > 0
-#include <mvme68k/dev/pcctworeg.h>
-#endif
-
-#define splcl() spl3()
-
-/* min timeout 0xa, what is a good value */
-#define CL_TIMEOUT 0x10
-#define CL_FIFO_MAX 0x10
-#define CL_FIFO_CNT 0xc
-#define CL_RX_TIMEOUT 0x10
-
-#define CL_DMAMODE 0x1
-#define CL_INTRMODE 0x0
-
-struct cl_cons {
- u_char *cl_paddr;
- volatile u_char *cl_vaddr;
- volatile struct pcctworeg *pcctwoaddr;
- u_char channel;
-} cl_cons;
-
-struct cl_info {
- struct tty *tty;
- u_char cl_swflags;
- u_char cl_softchar;
- u_char cl_consio;
- u_char cl_speed;
- u_char cl_parstop; /* parity, stop bits. */
- u_char cl_rxmode;
- u_char cl_txmode;
- u_char cl_clen;
- u_char cl_parity;
- u_char transmitting;
- u_long txcnt;
- u_long rxcnt;
-};
-#define CLCD_PORTS_PER_CHIP 4
-struct clsoftc {
- struct device sc_dev;
- struct evcnt sc_txintrcnt;
- struct evcnt sc_rxintrcnt;
- struct evcnt sc_mxintrcnt;
- time_t sc_rotime; /* time of last ring overrun */
- time_t sc_fotime; /* time of last fifo overrun */
- u_char *pbase;
- volatile u_char *vbase;
- struct cl_info sc_cl[CLCD_PORTS_PER_CHIP];
- struct intrhand sc_ih_e;
- struct intrhand sc_ih_m;
- struct intrhand sc_ih_t;
- struct intrhand sc_ih_r;
- struct pcctworeg *sc_pcctwo;
- int sc_flags;
-};
-struct {
- u_int speed;
- u_char divisor;
- u_char clock;
- u_char rx_timeout;
-} cl_clocks[] = {
- { 64000, 0x26, 0, 0x01},
- { 56000, 0x2c, 0, 0x01},
- { 38400, 0x40, 0, 0x01},
- { 19200, 0x81, 0, 0x02},
- { 9600, 0x40, 1, 0x04},
- { 7200, 0x56, 1, 0x04},
- { 4800, 0x81, 1, 0x08},
- { 3600, 0xad, 1, 0x08},
- { 2400, 0x40, 2, 0x10},
- { 1200, 0x81, 2, 0x20},
- { 600, 0x40, 3, 0x40},
- { 300, 0x81, 3, 0x80},
- { 150, 0x40, 3, 0x80},
- { 110, 0x58, 4, 0xff},
- { 50, 0xC2, 4, 0xff},
- { 0, 0x00, 0, 0},
-};
-
-/* prototypes */
-int clcnprobe __P((struct consdev *cp));
-int clcninit __P((struct consdev *cp));
-int clcngetc __P((dev_t dev));
-int clcnputc __P((dev_t dev, char c));
-u_char cl_clkdiv __P((int speed));
-u_char cl_clknum __P((int speed));
-u_char cl_clkrxtimeout __P((int speed));
-void clstart __P((struct tty *tp));
-void cl_unblock __P((struct tty *tp));
-int clccparam __P((struct clsoftc *sc, struct termios *par, int channel));
-
-int clparam __P((struct tty *tp, struct termios *t));
-int cl_mintr __P((struct clsoftc *sc));
-int cl_txintr __P((struct clsoftc *sc));
-int cl_rxintr __P((struct clsoftc *sc));
-void cl_overflow __P((struct clsoftc *sc, int channel, long *ptime, char *msg));
-void cl_parity __P((struct clsoftc *sc, int channel));
-void cl_frame __P((struct clsoftc *sc, int channel));
-void cl_break __P(( struct clsoftc *sc, int channel));
-int clmctl __P((dev_t dev, int bits, int how));
-void cl_dumpport __P((int channel));
-
-int clprobe __P((struct device *parent, void *self, void *aux));
-void clattach __P((struct device *parent, struct device *self, void *aux));
-
-int clopen __P((dev_t dev, int flag, int mode, struct proc *p));
-int clclose __P((dev_t dev, int flag, int mode, struct proc *p));
-int clread __P((dev_t dev, struct uio *uio, int flag));
-int clwrite __P((dev_t dev, struct uio *uio, int flag));
-int clioctl __P((dev_t dev, int cmd, caddr_t data, int flag, struct proc *p));
-int clstop __P((struct tty *tp, int flag));
-
-static void cl_initchannel __P((struct clsoftc *sc, int channel));
-static void clputc __P((struct clsoftc *sc, int unit, char c));
-static u_char clgetc __P((struct clsoftc *sc, int *channel));
-static void cloutput __P( (struct tty *tp));
-
-struct cfdriver clcd = {
- NULL, "cl", clprobe, clattach, DV_TTY, sizeof(struct clsoftc), 0
-};
-
-#if 0
-struct {
- u_char *pbase;
- u_char *vbase;
- struct cl_info info[CLCD_PORTS_PER_CHIP];
-} cl[NCL];
-#endif
-
-#define CLCDBUF 80
-
-int dopoll = 1;
-
-#define CL_UNIT(x) (minor(x) >> 2)
-#define CL_CHANNEL(x) (minor(x) & 3)
-#define CL_TTY(x) (minor(x))
-
-extern int cputyp;
-
-struct tty * cltty(dev)
- dev_t dev;
-{
- int unit, channel;
- struct clsoftc *sc;
- unit = CL_UNIT(dev);
- if (unit >= clcd.cd_ndevs ||
- (sc = (struct clsoftc *) clcd.cd_devs[unit]) == NULL) {
- return (NULL);
- }
- channel = CL_CHANNEL(dev);
- return sc->sc_cl[channel].tty;
-}
-
-int clprobe(parent, self, aux)
- struct device *parent;
- void *self;
- void *aux;
-{
- /* probing onboard 166/167/187 CL-cd2400
- * should be previously configured,
- * we can check the value before resetting the chip
- */
- volatile u_char *cd_base;
- struct confargs *ca = aux;
- int ret;
- if (cputyp != CPU_167 && cputyp != CPU_166
-#ifdef CPU_187
- && cputyp != CPU_187
-#endif
- )
- {
- return 0;
- }
- cd_base = ca->ca_vaddr;
-
-#if 0
- ret = !badvaddr(&cd_base[CD2400_GFRCR],1);
-#else
- ret = 1;
-#endif
- return ret;
-}
-
-void
-clattach(parent, self, aux)
- struct device *parent;
- struct device *self;
- void *aux;
-{
- struct clsoftc *sc = (struct clsoftc *)self;
- struct confargs *ca = aux;
- int i;
-
- sc->vbase = ca->ca_vaddr;
- sc->sc_pcctwo = ca->ca_master;
-
- if (ca->ca_paddr == cl_cons.cl_paddr) {
- /* if this device is configured as console,
- * line cl_cons.channel is the console */
- sc->sc_cl[cl_cons.channel].cl_consio = 1;
- printf(" console");
- } else {
- /* reset chip only if we are not console device */
- /* wait for GFRCR */
- }
- /* set up global registers */
- sc->vbase[CD2400_TPR] = CL_TIMEOUT;
- sc->vbase[CD2400_RPILR] = 0x03;
- sc->vbase[CD2400_TPILR] = 0x02;
- sc->vbase[CD2400_MPILR] = 0x01;
-
- for (i = 0; i < CLCD_PORTS_PER_CHIP; i++) {
-#if 0
- sc->sc_cl[i].cl_rxmode =
- !(!((flags >> (i * CL_FLAG_BIT_PCH)) & 0x01));
- sc->sc_cl[i].cl_txmode =
- !(!((flags >> (i * CL_FLAG_BIT_PCH)) & 0x02));
- sc->sc_cl[i].cl_softchar =
- !(!((flags >> (i * CL_FLAG_BIT_PCH)) & 0x04));
-#endif
- cl_initchannel(sc, i);
- }
- /* enable interrupts */
- sc->sc_ih_e.ih_fn = cl_rxintr;
- sc->sc_ih_e.ih_arg = sc;
- sc->sc_ih_e.ih_ipl = ca->ca_ipl;
- sc->sc_ih_e.ih_wantframe = 0;
-
- sc->sc_ih_m.ih_fn = cl_mintr;
- sc->sc_ih_m.ih_arg = sc;
- sc->sc_ih_m.ih_ipl = ca->ca_ipl;
- sc->sc_ih_m.ih_wantframe = 0;
-
- sc->sc_ih_t.ih_fn = cl_txintr;
- sc->sc_ih_t.ih_arg = sc;
- sc->sc_ih_t.ih_ipl = ca->ca_ipl;
- sc->sc_ih_t.ih_wantframe = 0;
-
- sc->sc_ih_r.ih_fn = cl_rxintr;
- sc->sc_ih_r.ih_arg = sc;
- sc->sc_ih_r.ih_ipl = ca->ca_ipl;
- sc->sc_ih_r.ih_wantframe = 0;
- switch (ca->ca_bustype) {
- case BUS_PCCTWO:
- dopoll = 0;
- pcctwointr_establish(PCC2V_SCC_RXE,&sc->sc_ih_e);
- pcctwointr_establish(PCC2V_SCC_M,&sc->sc_ih_m);
- pcctwointr_establish(PCC2V_SCC_TX,&sc->sc_ih_t);
- pcctwointr_establish(PCC2V_SCC_RX,&sc->sc_ih_r);
- sc->sc_pcctwo = (void *)ca->ca_master;
- sc->sc_pcctwo->pcc2_sccerr = 0x01; /* clear errors */
-
- /* enable all interrupts at ca_ipl */
- sc->sc_pcctwo->pcc2_sccirq = 0x10 | (ca->ca_ipl & 0x7);
- sc->sc_pcctwo->pcc2_scctx = 0x10 | (ca->ca_ipl & 0x7);
- sc->sc_pcctwo->pcc2_sccrx = 0x10 | (ca->ca_ipl & 0x7);
- break;
- default:
- /* oops */
- panic ("cl driver on unknown bus\n");
- }
-
- evcnt_attach(&sc->sc_dev, "intr", &sc->sc_txintrcnt);
- evcnt_attach(&sc->sc_dev, "intr", &sc->sc_rxintrcnt);
- evcnt_attach(&sc->sc_dev, "intr", &sc->sc_mxintrcnt);
- printf("\n");
-}
-static void
-cl_initchannel(sc, channel)
- struct clsoftc *sc;
- int channel;
-{
- int s;
- volatile u_char *cd_base = sc->vbase;
- /* set up option registers */
- sc->sc_cl[channel].tty = NULL;
- s = splhigh();
- cd_base[CD2400_CAR] = (char) channel;
- /* async, do we want to try DMA at some point? */
- cd_base[CD2400_LIVR] = PCC2_VECBASE + 0xc;/* set vector base at 5C */
- cd_base[CD2400_IER] = 0x88; /* should change XXX */
- cd_base[CD2400_LICR] = 0x00; /* will change if DMA support XXX */
- /* if the port is not the console */
- if (sc->sc_cl[channel].cl_consio != 1) {
- cd_base[CD2400_CMR] = 0x02;
- cd_base[CD2400_COR1] = 0x17;
- cd_base[CD2400_COR2] = 0x00;
- cd_base[CD2400_COR3] = 0x02;
- cd_base[CD2400_COR4] = 0xec;
- cd_base[CD2400_COR5] = 0xec;
- cd_base[CD2400_COR6] = 0x00;
- cd_base[CD2400_COR7] = 0x00;
- cd_base[CD2400_SCHR1] = 0x00;
- cd_base[CD2400_SCHR2] = 0x00;
- cd_base[CD2400_SCHR3] = 0x00;
- cd_base[CD2400_SCHR4] = 0x00;
- cd_base[CD2400_SCRl] = 0x00;
- cd_base[CD2400_SCRh] = 0x00;
- cd_base[CD2400_LNXT] = 0x00;
- cd_base[CD2400_RBPR] = 0x40; /* 9600 */
- cd_base[CD2400_RCOR] = 0x01;
- cd_base[CD2400_TBPR] = 0x40; /* 9600 */
- cd_base[CD2400_TCOR] = 0x01 << 5;
- /* console port should be 0x88 already */
- cd_base[CD2400_MSVR_RTS] = 0x00;
- cd_base[CD2400_MSVR_DTR] = 0x00;
- cd_base[CD2400_RTPRl] = CL_RX_TIMEOUT;
- cd_base[CD2400_RTPRh] = 0x00;
- }
-
- splx(s);
-}
-
-
-int cldefaultrate = TTYDEF_SPEED;
-
-int clmctl (dev, bits, how)
- dev_t dev;
- int bits;
- int how;
-{
- int s;
- struct clsoftc *sc;
- /* should only be called with valid device */
- sc = (struct clsoftc *) clcd.cd_devs[CL_UNIT(dev)];
- /*
- printf("mctl: dev %x, bits %x, how %x,\n",dev, bits, how);
- */
- /* settings are currently ignored */
- s = splcl();
- switch (how) {
- case DMSET:
- if( bits & TIOCM_RTS) {
- sc->vbase[CD2400_MSVR_RTS] = 0x01;
- } else {
- sc->vbase[CD2400_MSVR_RTS] = 0x00;
- }
- if( bits & TIOCM_DTR) {
- sc->vbase[CD2400_MSVR_DTR] = 0x02;
- } else {
- sc->vbase[CD2400_MSVR_DTR] = 0x00;
- }
- break;
-
- case DMBIC:
- if( bits & TIOCM_RTS) {
- sc->vbase[CD2400_MSVR_RTS] = 0x00;
- }
- if( bits & TIOCM_DTR) {
- sc->vbase[CD2400_MSVR_DTR] = 0x00;
- }
- break;
-
- case DMBIS:
- if( bits & TIOCM_RTS) {
- sc->vbase[CD2400_MSVR_RTS] = 0x01;
- }
- if( bits & TIOCM_DTR) {
- sc->vbase[CD2400_MSVR_DTR] = 0x02;
- }
- break;
-
- case DMGET:
- bits = 0;
-
- {
- u_char msvr;
- msvr = sc->vbase[CD2400_MSVR_RTS];
- if( msvr & 0x80) {
- bits |= TIOCM_DSR;
- }
- if( msvr & 0x40) {
- bits |= TIOCM_CD;
- }
- if( msvr & 0x20) {
- bits |= TIOCM_CTS;
- }
- if( msvr & 0x10) {
- bits |= TIOCM_DTR;
- }
- if( msvr & 0x02) {
- bits |= TIOCM_DTR;
- }
- if( msvr & 0x01) {
- bits |= TIOCM_RTS;
- }
-
- }
- break;
- }
- (void)splx(s);
-#if 0
- bits = 0;
- /* proper defaults? */
- bits |= TIOCM_DTR;
- bits |= TIOCM_RTS;
- bits |= TIOCM_CTS;
- bits |= TIOCM_CD;
- /* bits |= TIOCM_RI; */
- bits |= TIOCM_DSR;
-#endif
-
- /*
- printf("retbits %x\n", bits);
- */
- return(bits);
-}
-
-int clopen (dev, flag, mode, p)
- dev_t dev;
- int flag;
- int mode;
- struct proc *p;
-{
- int s, unit, channel;
- struct cl_info *cl;
- struct clsoftc *sc;
- struct tty *tp;
-
- unit = CL_UNIT(dev);
- if (unit >= clcd.cd_ndevs ||
- (sc = (struct clsoftc *) clcd.cd_devs[unit]) == NULL) {
- return (ENODEV);
- }
- channel = CL_CHANNEL(dev);
- cl = &sc->sc_cl[channel];
- s = splcl();
- if (cl->tty) {
- tp = cl->tty;
- } else {
- tp = cl->tty = ttymalloc();
- }
- tp->t_oproc = clstart;
- tp->t_param = clparam;
- tp->t_dev = dev;
-
- if ((tp->t_state & TS_ISOPEN) == 0) {
- 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 = cldefaultrate;
- }
- /*
- * do these all the time
- */
- if (cl->cl_swflags & TIOCFLAG_CLOCAL)
- tp->t_cflag |= CLOCAL;
- if (cl->cl_swflags & TIOCFLAG_CRTSCTS)
- tp->t_cflag |= CRTSCTS;
- if (cl->cl_swflags & TIOCFLAG_MDMBUF)
- tp->t_cflag |= MDMBUF;
- clparam(tp, &tp->t_termios);
- ttsetwater(tp);
-
- (void)clmctl(dev, TIOCM_DTR | TIOCM_RTS, DMSET);
-#ifdef XXX
- if ((cl->cl_swflags & TIOCFLAG_SOFTCAR) ||
- (clmctl(dev, 0, DMGET) & TIOCM_CD)) {
- tp->t_state |= TS_CARR_ON;
- } else {
- tp->t_state &= ~TS_CARR_ON;
- }
-#endif
- tp->t_state |= TS_CARR_ON;
- } else if (tp->t_state & TS_XCLUDE && p->p_ucred->cr_uid != 0) {
- splx(s);
- return(EBUSY);
- }
-#ifdef XXX
- /*
- * if NONBLOCK requested, ignore carrier
- */
- if (flag & O_NONBLOCK)
- goto done;
-#endif
-
- 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;
-#ifdef DEBUG
- cl_dumpport(channel);
-#endif
- return((*linesw[tp->t_line].l_open)(dev, tp));
-}
-int clparam(tp, t)
- struct tty *tp;
- struct termios *t;
-{
- int unit, channel;
- struct clsoftc *sc;
- int s;
- dev_t dev;
-
- dev = tp->t_dev;
- unit = CL_UNIT(dev);
- if (unit >= clcd.cd_ndevs ||
- (sc = (struct clsoftc *) clcd.cd_devs[unit]) == NULL) {
- return (ENODEV);
- }
- channel = CL_CHANNEL(dev);
- tp->t_ispeed = t->c_ispeed;
- tp->t_ospeed = t->c_ospeed;
- tp->t_cflag = t->c_cflag;
- clccparam(sc, t, channel);
- s = splcl();
- cl_unblock(tp);
- splx(s);
- return 0;
-}
-
-void cloutput(tp)
- struct tty *tp;
-{
- int cc, s, unit, cnt;
- char *tptr;
- int channel;
- struct clsoftc *sc;
- dev_t dev;
- char cl_obuffer[CLCDBUF+1];
-
- dev = tp->t_dev;
- unit = CL_UNIT(dev);
- if (unit >= clcd.cd_ndevs ||
- (sc = (struct clsoftc *) clcd.cd_devs[unit]) == NULL) {
- return;
- }
- channel = CL_CHANNEL(dev);
-
- if ((tp->t_state & TS_ISOPEN) == 0)
- return;
-
- s = splcl();
- cc = tp->t_outq.c_cc;
- while (cc > 0) {
-/*XXX*/
- cnt = min (CLCDBUF,cc);
- cnt = q_to_b(&tp->t_outq, cl_obuffer, cnt);
- if (cnt == 0) {
- break;
- }
- for (tptr = cl_obuffer; tptr < &cl_obuffer[cnt]; tptr++) {
- clputc(sc, channel, *tptr);
- }
- cc -= cnt;
- }
- splx(s);
-}
-
-int clclose (dev, flag, mode, p)
- dev_t dev;
- int flag;
- int mode;
- struct proc *p;
-{
- int unit, channel;
- struct tty *tp;
- struct cl_info *cl;
- struct clsoftc *sc;
- int s;
- unit = CL_UNIT(dev);
- if (unit >= clcd.cd_ndevs ||
- (sc = (struct clsoftc *) clcd.cd_devs[unit]) == NULL) {
- return (ENODEV);
- }
- channel = CL_CHANNEL(dev);
- cl = &sc->sc_cl[channel];
- tp = cl->tty;
- (*linesw[tp->t_line].l_close)(tp, flag);
-
- s = splcl();
-
- sc->vbase[CD2400_CAR] = channel;
- if(cl->cl_consio == 0 && (tp->t_cflag & HUPCL) != 0) {
- sc->vbase[CD2400_MSVR_RTS] = 0x00;
- sc->vbase[CD2400_MSVR_DTR] = 0x00;
- sc->vbase[CD2400_CCR] = 0x05;
- }
-
- splx(s);
- ttyclose(tp);
-
-#if 0
- cl->tty = NULL;
-#endif
-#ifdef DEBUG
- cl_dumpport(channel);
-#endif
-
- return 0;
-}
-int clread (dev, uio, flag)
- dev_t dev;
- struct uio *uio;
-int flag;
-{
- int unit, channel;
- struct tty *tp;
- struct cl_info *cl;
- struct clsoftc *sc;
- unit = CL_UNIT(dev);
- if (unit >= clcd.cd_ndevs ||
- (sc = (struct clsoftc *) clcd.cd_devs[unit]) == NULL) {
- return (ENODEV);
- }
- channel = CL_CHANNEL(dev);
- cl = &sc->sc_cl[channel];
- tp = cl->tty;
- if (!tp)
- return ENXIO;
- return((*linesw[tp->t_line].l_read)(tp, uio, flag));
-}
-int clwrite (dev, uio, flag)
- dev_t dev;
- struct uio *uio;
- int flag;
-{
- int unit, channel;
- struct tty *tp;
- struct cl_info *cl;
- struct clsoftc *sc;
- unit = CL_UNIT(dev);
- if (unit >= clcd.cd_ndevs ||
- (sc = (struct clsoftc *) clcd.cd_devs[unit]) == NULL) {
- return (ENODEV);
- }
- channel = CL_CHANNEL(dev);
- cl = &sc->sc_cl[channel];
- tp = cl->tty;
- if (!tp)
- return ENXIO;
- return((*linesw[tp->t_line].l_write)(tp, uio, flag));
-}
-int clioctl (dev, cmd, data, flag, p)
- dev_t dev;
- int cmd;
- caddr_t data;
- int flag;
- struct proc *p;
-{
- int error;
- int unit, channel;
- struct tty *tp;
- struct cl_info *cl;
- struct clsoftc *sc;
- unit = CL_UNIT(dev);
- if (unit >= clcd.cd_ndevs ||
- (sc = (struct clsoftc *) clcd.cd_devs[unit]) == NULL) {
- return (ENODEV);
- }
- channel = CL_CHANNEL(dev);
- cl = &sc->sc_cl[channel];
- tp = cl->tty;
- if (!tp)
- return ENXIO;
-
- error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, p);
- if (error >= 0)
- return(error);
-
- error = ttioctl(tp, cmd, data, flag, p);
- if (error >= 0)
- return(error);
-
- switch (cmd) {
- case TIOCSBRK:
- /* */
- break;
-
- case TIOCCBRK:
- /* */
- break;
-
- case TIOCSDTR:
- (void) clmctl(dev, TIOCM_DTR | TIOCM_RTS, DMBIS);
- break;
-
- case TIOCCDTR:
- (void) clmctl(dev, TIOCM_DTR | TIOCM_RTS, DMBIC);
- break;
-
- case TIOCMSET:
- (void) clmctl(dev, *(int *) data, DMSET);
- break;
-
- case TIOCMBIS:
- (void) clmctl(dev, *(int *) data, DMBIS);
- break;
-
- case TIOCMBIC:
- (void) clmctl(dev, *(int *) data, DMBIC);
- break;
-
- case TIOCMGET:
- *(int *)data = clmctl(dev, 0, DMGET);
- break;
- case TIOCGFLAGS:
- *(int *)data = cl->cl_swflags;
- break;
- case TIOCSFLAGS:
- error = suser(p->p_ucred, &p->p_acflag);
- if (error != 0)
- return(EPERM);
-
- cl->cl_swflags = *(int *)data;
- cl->cl_swflags &= /* only allow valid flags */
- (TIOCFLAG_SOFTCAR | TIOCFLAG_CLOCAL | TIOCFLAG_CRTSCTS);
- break;
- default:
- return(ENOTTY);
- }
-
- return 0;
-}
-int
-clstop(tp, flag)
- struct tty *tp;
- int flag;
-{
- int s;
-
- s = splcl();
- if (tp->t_state & TS_BUSY) {
- if ((tp->t_state & TS_TTSTOP) == 0)
- tp->t_state |= TS_FLUSH;
- }
- splx(s);
- return 0;
-}
-
-int
-clcnprobe(cp)
- struct consdev *cp;
-{
- /* always there ? */
- /* serial major */
- int maj;
-
- /* locate the major number */
- for (maj = 0; maj < nchrdev; maj++)
- if (cdevsw[maj].d_open == clopen)
- break;
- cp->cn_dev = makedev (maj, 0);
- cp->cn_pri = CN_NORMAL;
-
- return 1;
-}
-
-int
-clcninit(cp)
-struct consdev *cp;
-{
-#ifdef MAP_DOES_WORK
- int size = (0x1ff + PGOFSET) & ~PGOFSET;
- int pcc2_size = (0x3C + PGOFSET) & ~PGOFSET;
-#endif
- volatile u_char *cd_base;
-
- cl_cons.cl_paddr = (void *)0xfff45000;
-#ifdef MAP_DOES_WORK
- cl_cons.cl_vaddr = mapiodev(cl_cons.cl_paddr,size);
- cd_pcc2_base = mapiodev(0xfff42000,pcc2_size);
-#else
- cl_cons.cl_vaddr = cl_cons.cl_paddr;
- cl_cons.pcctwoaddr = (void *)0xfff42000;
-#endif
- cd_base = cl_cons.cl_vaddr;
- /* reset the chip? */
-#ifdef CLCD_DO_RESET
-#endif
-#ifdef NEW_CLCD_STRUCT
- /* set up globals */
- cl->tftc = 0x10;
- cl->tpr = CL_TIMEOUT; /* is this correct?? */
- cl->rpilr = 0x03;
- cl->tpilr = 0x02;
- cl->mpilr = 0x01;
-
- /* set up the tty00 to be 9600 8N1 */
- cl->car = 0x00;
- cl->cor1 = 0x17; /* No parity, ignore parity, 8 bit char */
- cl->cor2 = 0x00;
- cl->cor3 = 0x02; /* 1 stop bit */
- cl->cor4 = 0x00;
- cl->cor5 = 0x00;
- cl->cor6 = 0x00;
- cl->cor7 = 0x00;
- cl->schr1 = 0x00;
- cl->schr2 = 0x00;
- cl->schr3 = 0x00;
- cl->schr4 = 0x00;
- cl->scrl = 0x00;
- cl->scrh = 0x00;
- cl->lnxt = 0x00;
- cl->cpsr = 0x00;
-#else
- /* set up globals */
-#ifdef NOT_ALREADY_SETUP
- cd_base[CD2400_TFTC] = 0x10;
- cd_base[CD2400_TPR] = CL_TIMEOUT; /* is this correct?? */
- cd_base[CD2400_RPILR] = 0x03;
- cd_base[CD2400_TPILR] = 0x02;
- cd_base[CD2400_MPILR] = 0x01;
-
- /* set up the tty00 to be 9600 8N1 */
- cd_base[CD2400_CAR] = 0x00;
- cd_base[CD2400_COR1] = 0x17; /* No parity, ignore parity, 8 bit char */
- cd_base[CD2400_COR2] = 0x00;
- cd_base[CD2400_COR3] = 0x02; /* 1 stop bit */
- cd_base[CD2400_COR4] = 0x00;
- cd_base[CD2400_COR5] = 0x00;
- cd_base[CD2400_COR6] = 0x00;
- cd_base[CD2400_COR7] = 0x00;
- cd_base[CD2400_SCHR1] = 0x00;
- cd_base[CD2400_SCHR2] = 0x00;
- cd_base[CD2400_SCHR3] = 0x00;
- cd_base[CD2400_SCHR4] = 0x00;
- cd_base[CD2400_SCRl] = 0x00;
- cd_base[CD2400_SCRh] = 0x00;
- cd_base[CD2400_LNXT] = 0x00;
- cd_base[CD2400_CPSR] = 0x00;
-#endif
-#endif
- return 0;
-}
-
-int
-cl_instat(sc)
- struct clsoftc *sc;
-{
- volatile u_char *cd_base;
- if ( NULL == sc) {
- cd_base = cl_cons.cl_vaddr;
- } else {
- cd_base = sc->vbase;
- }
- return (cd_base[CD2400_RIR] & 0x80);
-}
-int
-clcngetc(dev)
- dev_t dev;
-{
- u_char val, reoir, licr, isrl, data, status, fifo_cnt;
- int got_char = 0;
- volatile u_char *cd_base = cl_cons.cl_vaddr;
- volatile struct pcctworeg *pcc2_base = cl_cons.pcctwoaddr;
- while (got_char == 0) {
- val = cd_base[CD2400_RIR];
- /* if no receive interrupt pending wait */
- if (!(val & 0x80)) {
- continue;
- }
- /* XXX do we need to suck the entire FIFO contents? */
- reoir = pcc2_base->pcc2_sccrxiack; /* receive PIACK */
- licr = cd_base[CD2400_LICR];
- if (((licr >> 2) & 0x3) == 0) {
- /* is the interrupt for us (port 0) */
- /* the character is for us yea. */
- isrl = cd_base[CD2400_RISRl];
-#if 0
- if (isrl & 0x01) {
- status = BREAK;
- }
- if (isrl & 0x02) {
- status = FRAME;
- }
- if (isrl & 0x04) {
- status = PARITY;
- }
- if (isrl & 0x08) {
- status = OVERFLOW;
- }
- /* we do not have special characters ;-) */
-#endif
- fifo_cnt = cd_base[CD2400_RFOC];
- data = cd_base[CD2400_RDR];
- got_char = 1;
- cd_base[CD2400_TEOIR] = 0x00;
- } else {
- data = cd_base[CD2400_RDR];
- cd_base[CD2400_TEOIR] = 0x00;
- }
-
- }
-
- return data;
-}
-
-int
-clcnputc(dev, c)
- dev_t dev;
- char c;
-{
- /* is this the correct location for the cr -> cr/lf tranlation? */
- if (c == '\n')
- clputc(0, 0, '\r');
-
- clputc(0, 0, c);
- return 0;
-}
-clcnpollc(dev, on)
- dev_t dev;
- int on;
-{
- if (1 == on) {
- /* enable polling */
- } else {
- /* disable polling */
- }
- return;
-}
-static void
-clputc(sc, unit, c)
- struct clsoftc *sc;
- int unit;
- char c;
-{
- int s;
- u_char schar;
- u_char oldchannel;
- volatile u_char *cd_base;
- if (0 == sc) {
- /* output on console */
- cd_base = cl_cons.cl_vaddr;
- } else {
- cd_base = sc->vbase;
- }
-#ifdef NEW_CLCD_STRUCT
- /* should we disable, flush and all that goo? */
- cl->car = unit;
- schar = cl->schr3;
- cl->schr3 = c;
- cl->stcr = 0x08 | 0x03; /* send special char, char 3 */
- while (0 != cl->stcr) {
- /* wait until cl notices the command
- * otherwise it may not notice the character
- * if we send characters too fast.
- */
- }
- cl->schr3 = schar;
-#else
-if (unit == 0) {
- s = splhigh();
- oldchannel = cd_base[CD2400_CAR];
- cd_base[CD2400_CAR] = unit;
- schar = cd_base[CD2400_SCHR3];
- cd_base[CD2400_SCHR3] = c;
- cd_base[CD2400_STCR] = 0x08 | 0x03; /* send special char, char 3 */
- while (0 != cd_base[CD2400_STCR]) {
- /* wait until cl notices the command
- * otherwise it may not notice the character
- * if we send characters too fast.
- */
- }
- DELAY(5);
- cd_base[CD2400_SCHR3] = schar;
- cd_base[CD2400_CAR] = oldchannel;
- splx(s);
-} else {
- s = splhigh();
- oldchannel = cd_base[CD2400_CAR];
- cd_base[CD2400_CAR] = unit;
- if (cd_base[CD2400_TFTC] > 0) {
- cd_base[CD2400_TDR] = c;
- }
- cd_base[CD2400_CAR] = oldchannel;
- splx(s);
-}
-#endif
- return;
-}
-
-/*
-#ifdef CLCD_DO_POLLED_INPUT
-*/
-#if 1
-void
-cl_chkinput()
-{
- struct tty *tp;
- int unit;
- struct clsoftc *sc;
- int channel;
-
- if (dopoll == 0)
- return;
- for (unit = 0; unit < clcd.cd_ndevs; unit++) {
- if (unit >= clcd.cd_ndevs ||
- (sc = (struct clsoftc *) clcd.cd_devs[unit]) == NULL) {
- continue;
- }
- if (cl_instat(sc)) {
- while (cl_instat(sc)){
- int ch;
- u_char c;
- /*
- *(pinchar++) = clcngetc();
- */
- ch = clgetc(sc,&channel) & 0xff;
- c = ch;
-
- tp = sc->sc_cl[channel].tty;
- if (NULL != tp) {
- (*linesw[tp->t_line].l_rint)(c,tp);
- }
- }
- /*
- wakeup(tp);
- */
- }
- }
-}
-#endif
-static u_char
-clgetc(sc, channel)
- struct clsoftc *sc;
- int *channel;
-{
- volatile u_char *cd_base;
- volatile struct pcctworeg *pcc2_base;
- u_char val, reoir, licr, isrl, fifo_cnt, data;
- if (0 == sc) {
- cd_base = cl_cons.cl_vaddr;
- pcc2_base = cl_cons.pcctwoaddr;
- } else {
- cd_base = sc->vbase;
- pcc2_base = sc->sc_pcctwo;
- }
- val = cd_base[CD2400_RIR];
- /* if no receive interrupt pending wait */
- if (!(val & 0x80)) {
- return 0;
- }
- /* XXX do we need to suck the entire FIFO contents? */
- reoir = pcc2_base->pcc2_sccrxiack; /* receive PIACK */
- licr = cd_base[CD2400_LICR];
- *channel = (licr >> 2) & 0x3;
- /* is the interrupt for us (port 0) */
- /* the character is for us yea. */
- isrl = cd_base[CD2400_RISRl];
-#if 0
- if (isrl & 0x01) {
- status = BREAK;
- }
- if (isrl & 0x02) {
- status = FRAME;
- }
- if (isrl & 0x04) {
- status = PARITY;
- }
- if (isrl & 0x08) {
- status = OVERFLOW;
- }
- /* we do not have special characters ;-) */
-#endif
- fifo_cnt = cd_base[CD2400_RFOC];
- if (fifo_cnt > 0) {
- data = cd_base[CD2400_RDR];
- cd_base[CD2400_TEOIR] = 0x00;
- } else {
- data = 0;
- cd_base[CD2400_TEOIR] = 0x08;
- }
- return data;
-}
-int
-clccparam(sc, par, channel)
- struct clsoftc *sc;
- struct termios *par;
- int channel;
-{
- u_int divisor, clk, clen;
- int s, imask, ints;
-
- s = splcl();
- sc->vbase[CD2400_CAR] = channel;
- if (par->c_ospeed == 0) {
- /* dont kill the console */
- if(sc->sc_cl[channel].cl_consio == 0) {
- /* disconnect, drop RTS DTR stop reciever */
- sc->vbase[CD2400_MSVR_RTS] = 0x00;
- sc->vbase[CD2400_MSVR_DTR] = 0x00;
- sc->vbase[CD2400_CCR] = 0x05;
- }
- splx(s);
- return (0xff);
- }
-
- sc->vbase[CD2400_MSVR_RTS] = 0x03;
- sc->vbase[CD2400_MSVR_DTR] = 0x03;
-
- divisor = cl_clkdiv(par->c_ospeed);
- clk = cl_clknum(par->c_ospeed);
- sc->vbase[CD2400_TBPR] = divisor;
- sc->vbase[CD2400_TCOR] = clk << 5;
- divisor = cl_clkdiv(par->c_ispeed);
- clk = cl_clknum(par->c_ispeed);
- sc->vbase[CD2400_RBPR] = divisor;
- sc->vbase[CD2400_RCOR] = clk;
- sc->vbase[CD2400_RTPRl] = cl_clkrxtimeout(par->c_ispeed);
- sc->vbase[CD2400_RTPRh] = 0x00;
-
- switch (par->c_cflag & CSIZE) {
- case CS5:
- clen = 4; /* this is the mask for the chip. */
- imask = 0x1F;
- break;
- case CS6:
- clen = 5;
- imask = 0x3F;
- break;
- case CS7:
- clen = 6;
- imask = 0x7F;
- break;
- default:
- clen = 7;
- imask = 0xFF;
- }
- sc->vbase[CD2400_COR3] = par->c_cflag & PARENB ? 4 : 2;
-
- if (par->c_cflag & PARENB) {
- if (par->c_cflag & PARODD) {
- sc->vbase[CD2400_COR1] = 0xE0 | clen ; /* odd */
- } else {
- sc->vbase[CD2400_COR1] = 0x40 | clen ; /* even */
- }
- } else {
- sc->vbase[CD2400_COR1] = 0x10 | clen; /* ignore parity */
- }
-
- if (sc->sc_cl[channel].cl_consio == 0
- && (par->c_cflag & CREAD) == 0 )
- {
- sc->vbase[CD2400_CCR] = 0x08;
- } else {
- sc->vbase[CD2400_CCR] = 0x0a;
- }
- ints = 0;
-#define SCC_DSR 0x80
-#define SCC_DCD 0x40
-#define SCC_CTS 0x20
- if ((par->c_cflag & CLOCAL) == 0) {
- ints |= SCC_DCD;
- }
- if ((par->c_cflag & CCTS_OFLOW) != 0) {
- ints |= SCC_CTS;
- }
- if ((par->c_cflag & CRTSCTS) != 0) {
- ints |= SCC_CTS;
- }
-#ifdef DONT_LET_HARDWARE
- if ((par->c_cflag & CCTS_IFLOW) != 0) {
- ints |= SCC_DSR;
- }
-#endif
- sc->vbase[CD2400_COR4] = ints | CL_FIFO_CNT;
- sc->vbase[CD2400_COR5] = ints | CL_FIFO_CNT;
-
- return imask;
-}
-static int clknum = 0;
-u_char
-cl_clkdiv(speed)
- int speed;
-{
- int i = 0;
- if (cl_clocks[clknum].speed == speed) {
- return cl_clocks[clknum].divisor;
- }
- for (i = 0; cl_clocks[i].speed != 0; i++) {
- if (cl_clocks[i].speed == speed) {
- clknum = i;
- return cl_clocks[clknum].divisor;
- }
- }
- /* return some sane value if unknown speed */
- return cl_clocks[4].divisor;
-}
-u_char
-cl_clknum(speed)
- int speed;
-{
- int found = 0;
- int i = 0;
- if (cl_clocks[clknum].speed == speed) {
- return cl_clocks[clknum].clock;
- }
- for (i = 0; found != 0 && cl_clocks[i].speed != 0; i++) {
- if (cl_clocks[clknum].speed == speed) {
- clknum = i;
- return cl_clocks[clknum].clock;
- }
- }
- /* return some sane value if unknown speed */
- return cl_clocks[4].clock;
-}
-u_char
-cl_clkrxtimeout(speed)
- int speed;
-{
- int i = 0;
- if (cl_clocks[clknum].speed == speed) {
- return cl_clocks[clknum].rx_timeout;
- }
- for (i = 0; cl_clocks[i].speed != 0; i++) {
- if (cl_clocks[i].speed == speed) {
- clknum = i;
- return cl_clocks[clknum].rx_timeout;
- }
- }
- /* return some sane value if unknown speed */
- return cl_clocks[4].rx_timeout;
-}
-void
-cl_unblock(tp)
- struct tty *tp;
-{
- tp->t_state &= ~TS_FLUSH;
- if (tp->t_outq.c_cc != 0)
- clstart(tp);
-}
-void
-clstart(tp)
- struct tty *tp;
-{
- dev_t dev;
- u_char cbuf;
- struct clsoftc *sc;
- int channel, unit, s, cnt;
-
- dev = tp->t_dev;
- channel = CL_CHANNEL(dev);
-/* hack to test output on non console only */
-#if 0
- if (channel == 0) {
- cloutput(tp);
- return;
- }
-#endif
- unit = CL_UNIT(dev);
- if (unit >= clcd.cd_ndevs ||
- (sc = (struct clsoftc *) clcd.cd_devs[unit]) == NULL) {
- return;
- }
-
- if ((tp->t_state & TS_ISOPEN) == 0)
- return;
-
- s = splcl();
-#if 0
- if (sc->sc_cl[channel].transmitting == 1) {
- /* i'm busy, go away, I will get to it later. */
- splx(s);
- return;
- }
- cnt = q_to_b(&tp->t_outq, &cbuf, 1);
- if ( cnt != 0 ) {
- sc->sc_cl[channel].transmitting = 1;
- sc->vbase[CD2400_CAR] = channel;
- sc->vbase[CD2400_TDR] = cbuf;
- } else {
- sc->sc_cl[channel].transmitting = 0;
- }
-#else
- if ((tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP | TS_FLUSH)) == 0)
- {
- tp->t_state |= TS_BUSY;
- sc->vbase[CD2400_CAR] = channel;
- sc->vbase[CD2400_IER] = sc->vbase[CD2400_IER] | 0x3;
- }
-#endif
- splx(s);
- return;
-}
-int
-cl_mintr(sc)
- struct clsoftc *sc;
-{
- u_char mir, misr, msvr;
- int channel;
- struct tty *tp;
- if(((mir = sc->vbase[CD2400_MIR]) & 0x40) == 0x0) {
- /* only if intr is not shared? */
- printf("cl_mintr extra intr\n");
- return 0;
- }
- sc->sc_mxintrcnt.ev_count++;
-
- channel = mir & 0x03;
- misr = sc->vbase[CD2400_MISR];
- msvr = sc->vbase[CD2400_MSVR_RTS];
- if (misr & 0x01) {
- /* timers are not currently used?? */
- printf ("cl_mintr: channel %x timer 1 unexpected\n",channel);
- }
- if (misr & 0x02) {
- /* timers are not currently used?? */
- printf ("cl_mintr: channel %x timer 2 unexpected\n",channel);
- }
- if (misr & 0x20) {
- printf ("cl_mintr: channel %x cts %x\n",channel,
- ((msvr & 0x20) != 0x0)
- );
- }
- if (misr & 0x40) {
- struct tty *tp = sc->sc_cl[channel].tty;
- printf ("cl_mintr: channel %x cd %x\n",channel,
- ((msvr & 0x40) != 0x0)
- );
- ttymodem(tp, ((msvr & 0x40) != 0x0) );
- }
- if (misr & 0x80) {
- printf ("cl_mintr: channel %x dsr %x\n",channel,
- ((msvr & 0x80) != 0x0)
- );
- }
- sc->vbase[CD2400_MEOIR] = 0x00;
- return 1;
-}
-
-int
-cl_txintr(sc)
- struct clsoftc *sc;
-{
- static empty = 0;
- u_char tir, licr, teoir;
- u_char max;
- int channel;
- struct tty *tp;
- int cnt;
- u_char buffer[CL_FIFO_MAX +1];
- u_char *tptr;
- if(((tir = sc->vbase[CD2400_TIR]) & 0x40) == 0x0) {
- /* only if intr is not shared ??? */
- printf ("cl_txintr extra intr\n");
- return 0;
- }
- sc->sc_txintrcnt.ev_count++;
-
- channel = tir & 0x03;
- licr = sc->vbase[CD2400_LICR];
-
- sc->sc_cl[channel].txcnt ++;
-
- tp = sc->sc_cl[channel].tty;
- if (tp == NULL || (tp->t_state & TS_ISOPEN) == 0) {
- sc->vbase[CD2400_TEOIR] = 0x08;
- return 1;
- }
- switch ((licr >> 4)& 0x3) {
- case CL_DMAMODE:
- teoir = 0x08;
- break;
- case CL_INTRMODE:
- max = sc->vbase[CD2400_TFTC];
- cnt = min ((int)max,tp->t_outq.c_cc);
- if (cnt != 0) {
- cnt = q_to_b(&tp->t_outq, buffer, cnt);
- empty = 0;
- for (tptr = buffer; tptr < &buffer[cnt]; tptr++) {
- sc->vbase[CD2400_TDR]= *tptr;
- }
- teoir = 0x00;
- } else {
- if (empty > 5 && ((empty % 20000 )== 0)) {
- printf("cl_txintr to many empty intr %d channel %d\n",
- empty, channel);
- }
- empty++;
- teoir = 0x08;
- if (tp->t_state & TS_BUSY) {
- tp->t_state &= ~(TS_BUSY | TS_FLUSH);
- if (tp->t_state & TS_ASLEEP) {
- tp->t_state &= ~TS_ASLEEP;
- wakeup((caddr_t) &tp->t_outq);
- }
- selwakeup(&tp->t_wsel);
- }
- sc->vbase[CD2400_IER] = sc->vbase[CD2400_IER] & ~0x3;
- }
- break;
- default:
- printf("cl_txintr unknown mode %x\n", ((licr >> 4) & 0x3));
- /* we probably will go to hell quickly now */
- teoir = 0x08;
- }
- sc->vbase[CD2400_TEOIR] = teoir;
- return 1;
-}
-
-int
-cl_rxintr(sc)
- struct clsoftc *sc;
-{
- u_char rir, channel, licr, risrl;
- u_char c;
- u_char fifocnt;
- struct tty *tp;
- int i;
- u_char reoir;
-
- if(((rir = sc->vbase[CD2400_RIR]) & 0x40) == 0x0) {
- /* only if intr is not shared ??? */
- printf ("cl_rxintr extra intr\n");
- return 0;
- }
- sc->sc_rxintrcnt.ev_count++;
- channel = rir & 0x3;
- licr = sc->vbase[CD2400_LICR];
- reoir = 0x08;
-
- sc->sc_cl[channel].rxcnt ++;
-
- switch (licr & 0x03) {
- case CL_DMAMODE:
- reoir = 0x08;
- break;
- case CL_INTRMODE:
- risrl = sc->vbase[CD2400_RISRl];
- if (risrl & 0x80) {
- /* timeout, no characters */
- reoir = 0x08;
- } else
- /* We don't need no sinkin special characters */
- if (risrl & 0x08) {
- cl_overflow (sc, channel, &sc->sc_fotime, "fifo");
- reoir = 0x08;
- } else
- if (risrl & 0x04) {
- cl_parity(sc, channel);
- reoir = 0x08;
- } else
- if (risrl & 0x02) {
- cl_frame(sc, channel);
- reoir = 0x08;
- } else
- if (risrl & 0x01) {
- cl_break(sc, channel);
- reoir = 0x08;
- } else {
- fifocnt = sc->vbase[CD2400_RFOC];
- tp = sc->sc_cl[channel].tty;
- for (i = 0; i < fifocnt; i++) {
- c = sc->vbase[CD2400_RDR];
-#if USE_BUFFER
- cl_appendbuf(sc, channel, c);
-#else
- /* does any restricitions exist on spl
- * for this call
- */
- (*linesw[tp->t_line].l_rint)(c,tp);
- reoir = 0x00;
-#endif
- }
- }
- break;
- default:
- printf("cl_rxintr unknown mode %x\n",licr & 0x03);
- /* we probably will go to hell quickly now */
- reoir = 0x08;
- }
- sc->vbase[CD2400_REOIR] = reoir;
- return 1;
-}
-
-void
-cl_overflow (sc, channel, ptime, msg)
-struct clsoftc *sc;
-int channel;
-long *ptime;
-char *msg;
-{
-/*
- if (*ptime != time.tv_sec) {
-*/
- {
-/*
- *ptime = time.tv_sec);
-*/
- log(LOG_WARNING, "%s%d[%d]: %s overrun", clcd.cd_name,
- 0 /* fix */, channel, msg);
- }
- return;
-}
-void
-cl_parity (sc, channel)
- struct clsoftc *sc;
- int channel;
-{
- log(LOG_WARNING, "%s%d[%d]: parity error", clcd.cd_name, 0, channel);
- return;
-}
-void
-cl_frame (sc, channel)
- struct clsoftc *sc;
- int channel;
-{
- log(LOG_WARNING, "%s%d[%d]: frame error", clcd.cd_name, 0, channel);
- return;
-}
-void
-cl_break (sc, channel)
- struct clsoftc *sc;
- int channel;
-{
- log(LOG_WARNING, "%s%d[%d]: break detected", clcd.cd_name, 0, channel);
- return;
-}
-
-void
-cl_dumpport0()
-{
- cl_dumpport(0);
- return;
-}
-void
-cl_dumpport1()
-{
- cl_dumpport(1);
- return;
-}
-void
-cl_dumpport2()
-{
- cl_dumpport(2);
- return;
-}
-void
-cl_dumpport3()
-{
- cl_dumpport(3);
- return;
-}
-
-void
-cl_dumpport(channel)
- int channel;
-{
- u_char livr, cmr, cor1, cor2, cor3, cor4, cor5, cor6, cor7,
- schr1, schr2, schr3, schr4, scrl, scrh, lnxt,
- rbpr, rcor, tbpr, tcor, rpilr, rir, tpr, ier, ccr,
- csr, rts, dtr, rtprl, rtprh;
- struct clsoftc *sc;
-
- volatile u_char *cd_base;
- int s;
-
- cd_base = cl_cons.cl_vaddr;
-
- sc = (struct clsoftc *) clcd.cd_devs[0];
-
- s = splcl();
- cd_base[CD2400_CAR] = (char) channel;
- livr = cd_base[CD2400_LIVR];
- cmr = cd_base[CD2400_CMR];
- cor1 = cd_base[CD2400_COR1];
- cor2 = cd_base[CD2400_COR2];
- cor3 = cd_base[CD2400_COR3];
- cor4 = cd_base[CD2400_COR4];
- cor5 = cd_base[CD2400_COR5];
- cor6 = cd_base[CD2400_COR6];
- cor7 = cd_base[CD2400_COR7];
- schr1 = cd_base[CD2400_SCHR1];
- schr2 = cd_base[CD2400_SCHR2];
- schr3 = cd_base[CD2400_SCHR3];
- schr4 = cd_base[CD2400_SCHR4];
- scrl = cd_base[CD2400_SCRl];
- scrh = cd_base[CD2400_SCRh];
- lnxt = cd_base[CD2400_LNXT];
- rbpr = cd_base[CD2400_RBPR];
- rcor = cd_base[CD2400_RCOR];
- tbpr = cd_base[CD2400_TBPR];
- rpilr = cd_base[CD2400_RPILR];
- ier = cd_base[CD2400_IER];
- ccr = cd_base[CD2400_CCR];
- tcor = cd_base[CD2400_TCOR];
- csr = cd_base[CD2400_CSR];
- tpr = cd_base[CD2400_TPR];
- rts = cd_base[CD2400_MSVR_RTS];
- dtr = cd_base[CD2400_MSVR_DTR];
- rtprl = cd_base[CD2400_RTPRl];
- rtprh = cd_base[CD2400_RTPRh];
- splx(s);
-
- printf("{ port %x livr %x cmr %x\n",
- channel,livr, cmr);
- printf("cor1 %x cor2 %x cor3 %x cor4 %x cor5 %x cor6 %x cor7 %x\n",
- cor1, cor2, cor3, cor4, cor5, cor6, cor7);
- printf("schr1 %x schr2 %x schr3 %x schr4 %x\n",
- schr1, schr2, schr3, schr4);
- printf("scrl %x scrh %x lnxt %x\n",
- scrl, scrh, lnxt);
- printf("rbpr %x rcor %x tbpr %x tcor %x\n",
- rbpr, rcor, tbpr, tcor);
- printf("rpilr %x rir %x ier %x ccr %x\n",
- rpilr, rir, ier, ccr);
- printf("tpr %x csr %x rts %x dtr %x\n",
- tpr, csr, rts, dtr);
- printf("rtprl %x rtprh %x\n",
- rtprl, rtprh);
- printf("rxcnt %x txcnt %x\n",
- sc->sc_cl[channel].rxcnt, sc->sc_cl[channel].txcnt);
- printf("}\n");
- return;
-}