Annotation of sys/arch/mvme88k/dev/cl.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: cl.c,v 1.52 2006/05/08 14:36:10 miod Exp $ */
! 2:
! 3: /*
! 4: * Copyright (c) 1995 Dale Rahn. All rights reserved.
! 5: *
! 6: * Redistribution and use in source and binary forms, with or without
! 7: * modification, are permitted provided that the following conditions
! 8: * are met:
! 9: * 1. Redistributions of source code must retain the above copyright
! 10: * notice, this list of conditions and the following disclaimer.
! 11: * 2. Redistributions in binary form must reproduce the above copyright
! 12: * notice, this list of conditions and the following disclaimer in the
! 13: * documentation and/or other materials provided with the distribution.
! 14: *
! 15: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 16: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 17: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 18: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! 19: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 20: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 21: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! 22: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 23: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 24: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 25: */
! 26:
! 27: /* DMA mode still does not work!!! */
! 28:
! 29: #include <sys/param.h>
! 30: #include <sys/ioctl.h>
! 31: #include <sys/proc.h>
! 32: #include <sys/tty.h>
! 33: #include <sys/uio.h>
! 34: #include <sys/systm.h>
! 35: #include <sys/time.h>
! 36: #include <sys/device.h>
! 37: #include <sys/syslog.h>
! 38:
! 39: #include <machine/autoconf.h>
! 40: #include <machine/conf.h>
! 41: #include <machine/cpu.h>
! 42: #include <machine/psl.h>
! 43:
! 44: #include <dev/cons.h>
! 45:
! 46: #include <mvme88k/dev/clreg.h>
! 47: #include <mvme88k/dev/pcctworeg.h>
! 48: #include <mvme88k/dev/pcctwovar.h>
! 49:
! 50: #ifdef DDB
! 51: #include <ddb/db_var.h>
! 52: #endif
! 53:
! 54: #define splcl() spltty()
! 55:
! 56: /* min timeout 0xa, what is a good value */
! 57: #define CL_TIMEOUT 0x10
! 58: #define CL_FIFO_MAX 0x10
! 59: #define CL_FIFO_CNT 0xc
! 60: #define CL_RX_TIMEOUT 0x10
! 61:
! 62: #define CL_RXDMAINT 0x82
! 63: #define CL_TXDMAINT 0x42
! 64: #define CL_TXMASK 0x47
! 65: #define CL_RXMASK 0x87
! 66: #define CL_TXINTR 0x02
! 67: #define CL_RXINTR 0x02
! 68:
! 69: struct cl_cons {
! 70: bus_space_tag_t cl_iot;
! 71: bus_space_handle_t cl_ioh;
! 72: volatile u_int8_t *cl_rxiack;
! 73: u_int8_t channel;
! 74: } cl_cons;
! 75:
! 76: struct cl_info {
! 77: struct tty *tty;
! 78: u_char cl_swflags;
! 79: u_char cl_softchar;
! 80: u_char cl_consio;
! 81: u_char cl_speed;
! 82: u_char cl_parstop; /* parity, stop bits. */
! 83: u_char cl_rxmode;
! 84: u_char cl_txmode;
! 85: u_char cl_clen;
! 86: u_char cl_parity;
! 87: #if 0
! 88: u_char transmitting;
! 89: #endif
! 90: u_long txcnt;
! 91: u_long rxcnt;
! 92:
! 93: void *rx[2];
! 94: void *rxp[2];
! 95: void *tx[2];
! 96: void *txp[2];
! 97: };
! 98: #define CLCD_PORTS_PER_CHIP 4
! 99: #define CL_BUFSIZE 256
! 100:
! 101: #ifndef DO_MALLOC
! 102: /* four (4) buffers per port */
! 103: char cl_dmabuf[CLCD_PORTS_PER_CHIP * CL_BUFSIZE * 4];
! 104: char cl_dmabuf1[CLCD_PORTS_PER_CHIP * CL_BUFSIZE * 4];
! 105: #endif
! 106:
! 107: struct clsoftc {
! 108: struct device sc_dev;
! 109: bus_space_tag_t sc_iot;
! 110: bus_space_handle_t sc_ioh;
! 111: time_t sc_fotime; /* time of last fifo overrun */
! 112: struct cl_info sc_cl[CLCD_PORTS_PER_CHIP];
! 113: struct intrhand sc_ih_e;
! 114: struct intrhand sc_ih_m;
! 115: struct intrhand sc_ih_t;
! 116: struct intrhand sc_ih_r;
! 117: char sc_errintrname[16 + 4];
! 118: char sc_mxintrname[16 + 3];
! 119: char sc_rxintrname[16 + 3];
! 120: char sc_txintrname[16 + 3];
! 121: struct pcctwosoftc *sc_pcctwo;
! 122: };
! 123:
! 124: const struct {
! 125: u_int speed;
! 126: u_char divisor;
! 127: u_char clock;
! 128: u_char rx_timeout;
! 129: } cl_clocks[] = {
! 130: { 64000, 0x26, 0, 0x01},
! 131: { 56000, 0x2c, 0, 0x01},
! 132: { 38400, 0x40, 0, 0x01},
! 133: { 19200, 0x81, 0, 0x02},
! 134: { 9600, 0x40, 1, 0x04},
! 135: { 7200, 0x56, 1, 0x04},
! 136: { 4800, 0x81, 1, 0x08},
! 137: { 3600, 0xad, 1, 0x08},
! 138: { 2400, 0x40, 2, 0x10},
! 139: { 1200, 0x81, 2, 0x20},
! 140: { 600, 0x40, 3, 0x40},
! 141: { 300, 0x81, 3, 0x80},
! 142: { 150, 0x40, 3, 0x80},
! 143: { 110, 0x58, 4, 0xff},
! 144: { 50, 0xC2, 4, 0xff},
! 145: { 0, 0x00, 0, 0},
! 146: };
! 147:
! 148: #define CL_SAFE_CLOCK 4 /* 9600 entry */
! 149:
! 150: /* prototypes */
! 151: cons_decl(cl);
! 152: int cl_instat(struct clsoftc *sc);
! 153: u_int8_t cl_clkdiv(int speed);
! 154: u_int8_t cl_clknum(int speed);
! 155: u_int8_t cl_clkrxtimeout(int speed);
! 156: void clstart(struct tty *tp);
! 157: void cl_unblock(struct tty *tp);
! 158: int clccparam(struct clsoftc *sc, struct termios *par, int channel);
! 159:
! 160: int clparam(struct tty *tp, struct termios *t);
! 161: int cl_mintr(void *);
! 162: int cl_txintr(void *);
! 163: int cl_rxintr(void *);
! 164: void cl_overflow(struct clsoftc *sc, int channel, long *ptime, char *msg);
! 165: void cl_parity(struct clsoftc *sc, int channel);
! 166: void cl_frame(struct clsoftc *sc, int channel);
! 167: void cl_break( struct clsoftc *sc, int channel);
! 168: int clmctl(dev_t dev, int bits, int how);
! 169: #ifdef DEBUG
! 170: void cl_dumpport(struct clsoftc *, int);
! 171: #endif
! 172:
! 173: int clprobe(struct device *parent, void *self, void *aux);
! 174: void clattach(struct device *parent, struct device *self, void *aux);
! 175:
! 176: void cl_initchannel(struct clsoftc *sc, int channel);
! 177: void clputc(struct clsoftc *sc, int unit, u_char c);
! 178:
! 179: struct cfattach cl_ca = {
! 180: sizeof(struct clsoftc), clprobe, clattach
! 181: };
! 182:
! 183: struct cfdriver cl_cd = {
! 184: NULL, "cl", DV_TTY
! 185: };
! 186:
! 187: #if 0
! 188: #define CLCDBUF 80
! 189: void cloutput(struct tty *tp);
! 190: #endif
! 191:
! 192: #define CL_UNIT(x) (minor(x) >> 2)
! 193: #define CL_CHANNEL(x) (minor(x) & 3)
! 194:
! 195: struct tty *
! 196: cltty(dev)
! 197: dev_t dev;
! 198: {
! 199: int unit, channel;
! 200: struct clsoftc *sc;
! 201:
! 202: unit = CL_UNIT(dev);
! 203: if (unit >= cl_cd.cd_ndevs ||
! 204: (sc = (struct clsoftc *)cl_cd.cd_devs[unit]) == NULL) {
! 205: return NULL;
! 206: }
! 207: channel = CL_CHANNEL(dev);
! 208: return sc->sc_cl[channel].tty;
! 209: }
! 210:
! 211: int
! 212: clprobe(parent, self, aux)
! 213: struct device *parent;
! 214: void *self;
! 215: void *aux;
! 216: {
! 217: struct confargs *ca = aux;
! 218: bus_space_handle_t ioh;
! 219: int rc;
! 220:
! 221: if (brdtyp == BRD_188)
! 222: return 0;
! 223:
! 224: /*
! 225: * We do not accept empty locators here...
! 226: */
! 227: if (ca->ca_paddr == CD2400_BASE_ADDR ||
! 228: (ca->ca_paddr == CD2400_SECONDARY_ADDR && brdtyp == BRD_8120)) {
! 229: if (bus_space_map(ca->ca_iot, ca->ca_paddr, CD2400_SIZE,
! 230: 0, &ioh) != 0)
! 231: return 0;
! 232: rc = badaddr((vaddr_t)bus_space_vaddr(ca->ca_iot, ioh), 1);
! 233: bus_space_unmap(ca->ca_iot, ioh, CD2400_SIZE);
! 234: return rc == 0;
! 235: }
! 236:
! 237: return 0;
! 238: }
! 239:
! 240: void
! 241: clattach(parent, self, aux)
! 242: struct device *parent;
! 243: struct device *self;
! 244: void *aux;
! 245: {
! 246: struct clsoftc *sc = (struct clsoftc *)self;
! 247: struct confargs *ca = aux;
! 248: bus_space_tag_t iot;
! 249: bus_space_handle_t ioh;
! 250: int i;
! 251:
! 252: if (ca->ca_ipl < 0)
! 253: ca->ca_ipl = IPL_TTY;
! 254:
! 255: iot = sc->sc_iot = ca->ca_iot;
! 256: if (bus_space_map(iot, ca->ca_paddr, CD2400_SIZE, 0, &ioh) != 0) {
! 257: printf(": can't map registers!\n");
! 258: return;
! 259: }
! 260: sc->sc_ioh = ioh;
! 261: sc->sc_pcctwo = (struct pcctwosoftc *)parent;
! 262:
! 263: if (ca->ca_paddr == CD2400_BASE_ADDR) {
! 264: /*
! 265: * Although we are still running using the BUG routines,
! 266: * this device will be elected as the console after
! 267: * autoconf. Mark it as such.
! 268: */
! 269: sc->sc_cl[0].cl_consio = 1;
! 270: printf(": console");
! 271: } else {
! 272: /* reset chip only if we are not console device */
! 273: /* wait for GFRCR */
! 274: }
! 275: /* allow chip to settle before continuing */
! 276: delay(800);
! 277:
! 278: /* set up global registers */
! 279: bus_space_write_1(iot, ioh, CL_TPR, CL_TIMEOUT);
! 280: bus_space_write_1(iot, ioh, CL_RPILR, 0x03);
! 281: bus_space_write_1(iot, ioh, CL_TPILR, 0x02);
! 282: bus_space_write_1(iot, ioh, CL_MPILR, 0x01);
! 283:
! 284: #ifdef DO_MALLOC
! 285: sc->sc_cl[0].rx[0] = (void *)(dvma_malloc(16 * CL_BUFSIZE));
! 286: #else
! 287: /* XXX */
! 288: if ((vaddr_t)ca->ca_paddr == CD2400_BASE_ADDR)
! 289: sc->sc_cl[0].rx[0] = (void *)(&cl_dmabuf);
! 290: else
! 291: sc->sc_cl[0].rx[0] = (void *)(&cl_dmabuf1);
! 292: #endif
! 293: sc->sc_cl[0].rx[1] = (void *)(((int)sc->sc_cl[0].rx[0]) + CL_BUFSIZE);
! 294: sc->sc_cl[1].rx[0] = (void *)(((int)sc->sc_cl[0].rx[1]) + CL_BUFSIZE);
! 295: sc->sc_cl[1].rx[1] = (void *)(((int)sc->sc_cl[1].rx[0]) + CL_BUFSIZE);
! 296:
! 297: sc->sc_cl[2].rx[0] = (void *)(((int)sc->sc_cl[1].rx[1]) + CL_BUFSIZE);
! 298: sc->sc_cl[2].rx[1] = (void *)(((int)sc->sc_cl[2].rx[0]) + CL_BUFSIZE);
! 299: sc->sc_cl[3].rx[0] = (void *)(((int)sc->sc_cl[2].rx[1]) + CL_BUFSIZE);
! 300: sc->sc_cl[3].rx[1] = (void *)(((int)sc->sc_cl[3].rx[0]) + CL_BUFSIZE);
! 301:
! 302: sc->sc_cl[0].tx[0] = (void *)(((int)sc->sc_cl[3].rx[1]) + CL_BUFSIZE);
! 303: sc->sc_cl[0].tx[1] = (void *)(((int)sc->sc_cl[0].tx[0]) + CL_BUFSIZE);
! 304: sc->sc_cl[1].tx[0] = (void *)(((int)sc->sc_cl[0].tx[1]) + CL_BUFSIZE);
! 305: sc->sc_cl[1].tx[1] = (void *)(((int)sc->sc_cl[1].tx[0]) + CL_BUFSIZE);
! 306:
! 307: sc->sc_cl[2].tx[0] = (void *)(((int)sc->sc_cl[1].tx[1]) + CL_BUFSIZE);
! 308: sc->sc_cl[2].tx[1] = (void *)(((int)sc->sc_cl[2].tx[0]) + CL_BUFSIZE);
! 309: sc->sc_cl[3].tx[0] = (void *)(((int)sc->sc_cl[2].tx[1]) + CL_BUFSIZE);
! 310: sc->sc_cl[3].tx[1] = (void *)(((int)sc->sc_cl[3].tx[0]) + CL_BUFSIZE);
! 311: for (i = 0; i < CLCD_PORTS_PER_CHIP; i++) {
! 312: #if 0
! 313: int j;
! 314:
! 315: for (j = 0; j < 2 ; j++) {
! 316: sc->sc_cl[i].rxp[j] = (void *)kvtop(sc->sc_cl[i].rx[j]);
! 317: printf("cl[%d].rxbuf[%d] %x p %x\n",
! 318: i, j, sc->sc_cl[i].rx[j], sc->sc_cl[i].rxp[j]);
! 319: sc->sc_cl[i].txp[j] = (void *)kvtop(sc->sc_cl[i].tx[j]);
! 320: printf("cl[%d].txbuf[%d] %x p %x\n",
! 321: i, j, sc->sc_cl[i].tx[j], sc->sc_cl[i].txp[j]);
! 322: }
! 323: #endif
! 324: #if 0
! 325: sc->sc_cl[i].cl_rxmode =
! 326: !(!((flags >> (i * CL_FLAG_BIT_PCH)) & 0x01));
! 327: sc->sc_cl[i].cl_txmode =
! 328: !(!((flags >> (i * CL_FLAG_BIT_PCH)) & 0x02));
! 329: sc->sc_cl[i].cl_softchar =
! 330: !(!((flags >> (i * CL_FLAG_BIT_PCH)) & 0x04));
! 331: #endif
! 332: cl_initchannel(sc, i);
! 333: }
! 334:
! 335: /* clear errors */
! 336: bus_space_write_1(sc->sc_pcctwo->sc_iot, sc->sc_pcctwo->sc_ioh,
! 337: PCCTWO_SCCERR, 0x01);
! 338:
! 339: /* enable interrupts */
! 340: sc->sc_ih_e.ih_fn = cl_rxintr;
! 341: sc->sc_ih_e.ih_arg = sc;
! 342: sc->sc_ih_e.ih_wantframe = 0;
! 343: sc->sc_ih_e.ih_ipl = ca->ca_ipl;
! 344:
! 345: sc->sc_ih_m.ih_fn = cl_mintr;
! 346: sc->sc_ih_m.ih_arg = sc;
! 347: sc->sc_ih_m.ih_wantframe = 0;
! 348: sc->sc_ih_m.ih_ipl = ca->ca_ipl;
! 349:
! 350: sc->sc_ih_t.ih_fn = cl_txintr;
! 351: sc->sc_ih_t.ih_arg = sc;
! 352: sc->sc_ih_t.ih_wantframe = 0;
! 353: sc->sc_ih_t.ih_ipl = ca->ca_ipl;
! 354:
! 355: sc->sc_ih_r.ih_fn = cl_rxintr;
! 356: sc->sc_ih_r.ih_arg = sc;
! 357: sc->sc_ih_r.ih_wantframe = 0;
! 358: sc->sc_ih_r.ih_ipl = ca->ca_ipl;
! 359:
! 360: snprintf(sc->sc_errintrname, sizeof sc->sc_errintrname,
! 361: "%s_err", self->dv_xname);
! 362: snprintf(sc->sc_mxintrname, sizeof sc->sc_mxintrname,
! 363: "%s_mx", self->dv_xname);
! 364: snprintf(sc->sc_rxintrname, sizeof sc->sc_rxintrname,
! 365: "%s_rx", self->dv_xname);
! 366: snprintf(sc->sc_txintrname, sizeof sc->sc_txintrname,
! 367: "%s_tx", self->dv_xname);
! 368:
! 369: pcctwointr_establish(PCC2V_SCC_RXE, &sc->sc_ih_e, sc->sc_errintrname);
! 370: pcctwointr_establish(PCC2V_SCC_M, &sc->sc_ih_m, sc->sc_mxintrname);
! 371: pcctwointr_establish(PCC2V_SCC_TX, &sc->sc_ih_t, sc->sc_txintrname);
! 372: pcctwointr_establish(PCC2V_SCC_RX, &sc->sc_ih_r, sc->sc_rxintrname);
! 373:
! 374: bus_space_write_1(sc->sc_pcctwo->sc_iot, sc->sc_pcctwo->sc_ioh,
! 375: PCCTWO_SCCICR, PCC2_IRQ_IEN | (ca->ca_ipl & PCC2_IRQ_IPL));
! 376: bus_space_write_1(sc->sc_pcctwo->sc_iot, sc->sc_pcctwo->sc_ioh,
! 377: PCCTWO_SCCTX, PCC2_IRQ_IEN | (ca->ca_ipl & PCC2_IRQ_IPL));
! 378: bus_space_write_1(sc->sc_pcctwo->sc_iot, sc->sc_pcctwo->sc_ioh,
! 379: PCCTWO_SCCRX, PCC2_IRQ_IEN | (ca->ca_ipl & PCC2_IRQ_IPL));
! 380:
! 381: printf("\n");
! 382: }
! 383:
! 384: void
! 385: cl_initchannel(sc, channel)
! 386: struct clsoftc *sc;
! 387: int channel;
! 388: {
! 389: int s;
! 390: bus_space_tag_t iot;
! 391: bus_space_handle_t ioh;
! 392:
! 393: iot = sc->sc_iot;
! 394: ioh = sc->sc_ioh;
! 395:
! 396: /* set up option registers */
! 397: sc->sc_cl[channel].tty = NULL;
! 398: s = splhigh();
! 399:
! 400: bus_space_write_1(iot, ioh, CL_CAR, channel);
! 401: bus_space_write_1(iot, ioh, CL_LIVR, PCC2_VECT + PCC2V_SCC_RXE);
! 402: bus_space_write_1(iot, ioh, CL_IER, 0);
! 403:
! 404: if (sc->sc_cl[channel].cl_consio == 0) {
! 405: bus_space_write_1(iot, ioh, CL_CMR, 0x02);
! 406: bus_space_write_1(iot, ioh, CL_COR1, 0x17);
! 407: bus_space_write_1(iot, ioh, CL_COR2, 0x00);
! 408: bus_space_write_1(iot, ioh, CL_COR3, 0x02);
! 409: bus_space_write_1(iot, ioh, CL_COR4, 0xec);
! 410: bus_space_write_1(iot, ioh, CL_COR5, 0xec);
! 411: bus_space_write_1(iot, ioh, CL_COR6, 0x00);
! 412: bus_space_write_1(iot, ioh, CL_COR7, 0x00);
! 413: bus_space_write_1(iot, ioh, CL_SCHR1, 0x00);
! 414: bus_space_write_1(iot, ioh, CL_SCHR2, 0x00);
! 415: bus_space_write_1(iot, ioh, CL_SCHR3, 0x00);
! 416: bus_space_write_1(iot, ioh, CL_SCHR4, 0x00);
! 417: bus_space_write_1(iot, ioh, CL_SCRL, 0x00);
! 418: bus_space_write_1(iot, ioh, CL_SCRH, 0x00);
! 419: bus_space_write_1(iot, ioh, CL_LNXT, 0x00);
! 420: bus_space_write_1(iot, ioh, CL_RBPR, 0x40); /* 9600 */
! 421: bus_space_write_1(iot, ioh, CL_RCOR, 0x01);
! 422: bus_space_write_1(iot, ioh, CL_TBPR, 0x40); /* 9600 */
! 423: bus_space_write_1(iot, ioh, CL_TCOR, 0x01 << 5);
! 424: /* console port should be 0x88 already */
! 425: bus_space_write_1(iot, ioh, CL_MSVR_RTS, 0x00);
! 426: bus_space_write_1(iot, ioh, CL_MSVR_DTR, 0x00);
! 427: bus_space_write_1(iot, ioh, CL_RTPRL, CL_RX_TIMEOUT);
! 428: bus_space_write_1(iot, ioh, CL_RTPRH, 0x00);
! 429: }
! 430: bus_space_write_1(iot, ioh, CL_CCR, 0x20);
! 431: while (bus_space_read_1(iot, ioh, CL_CCR) != 0)
! 432: ;
! 433:
! 434: splx(s);
! 435: }
! 436:
! 437:
! 438: int cldefaultrate = TTYDEF_SPEED;
! 439:
! 440: int
! 441: clmctl(dev, bits, how)
! 442: dev_t dev;
! 443: int bits;
! 444: int how;
! 445: {
! 446: struct clsoftc *sc;
! 447: bus_space_tag_t iot;
! 448: bus_space_handle_t ioh;
! 449: int s;
! 450:
! 451: /* should only be called with valid device */
! 452: sc = (struct clsoftc *)cl_cd.cd_devs[CL_UNIT(dev)];
! 453: iot = sc->sc_iot;
! 454: ioh = sc->sc_ioh;
! 455:
! 456: /* settings are currently ignored */
! 457: s = splcl();
! 458: switch (how) {
! 459: case DMSET:
! 460: if (bits & TIOCM_RTS)
! 461: bus_space_write_1(iot, ioh, CL_MSVR_RTS, 0x01);
! 462: else
! 463: bus_space_write_1(iot, ioh, CL_MSVR_RTS, 0x00);
! 464: if (bits & TIOCM_DTR)
! 465: bus_space_write_1(iot, ioh, CL_MSVR_DTR, 0x02);
! 466: else
! 467: bus_space_write_1(iot, ioh, CL_MSVR_DTR, 0x00);
! 468: break;
! 469:
! 470: case DMBIC:
! 471: if (bits & TIOCM_RTS)
! 472: bus_space_write_1(iot, ioh, CL_MSVR_RTS, 0x00);
! 473: if (bits & TIOCM_DTR)
! 474: bus_space_write_1(iot, ioh, CL_MSVR_DTR, 0x00);
! 475: break;
! 476:
! 477: case DMBIS:
! 478: if (bits & TIOCM_RTS)
! 479: bus_space_write_1(iot, ioh, CL_MSVR_RTS, 0x01);
! 480: if (bits & TIOCM_DTR)
! 481: bus_space_write_1(iot, ioh, CL_MSVR_DTR, 0x02);
! 482: break;
! 483:
! 484: case DMGET:
! 485: bits = 0;
! 486:
! 487: {
! 488: u_int8_t msvr;
! 489:
! 490: msvr = bus_space_read_1(iot, ioh, CL_MSVR_RTS);
! 491: if (msvr & 0x80)
! 492: bits |= TIOCM_DSR;
! 493: if (msvr & 0x40)
! 494: bits |= TIOCM_CD;
! 495: if (msvr & 0x20)
! 496: bits |= TIOCM_CTS;
! 497: if (msvr & 0x10)
! 498: bits |= TIOCM_DTR;
! 499: if (msvr & 0x02)
! 500: bits |= TIOCM_DTR;
! 501: if (msvr & 0x01)
! 502: bits |= TIOCM_RTS;
! 503: }
! 504: break;
! 505: }
! 506: splx(s);
! 507: #if 0
! 508: bits = 0;
! 509: /* proper defaults? */
! 510: bits |= TIOCM_DTR;
! 511: bits |= TIOCM_RTS;
! 512: bits |= TIOCM_CTS;
! 513: bits |= TIOCM_CD;
! 514: /* bits |= TIOCM_RI; */
! 515: bits |= TIOCM_DSR;
! 516: #endif
! 517:
! 518: return bits;
! 519: }
! 520:
! 521: int
! 522: clopen(dev, flag, mode, p)
! 523: dev_t dev;
! 524: int flag;
! 525: int mode;
! 526: struct proc *p;
! 527: {
! 528: int s, unit, channel;
! 529: struct cl_info *cl;
! 530: struct clsoftc *sc;
! 531: struct tty *tp;
! 532:
! 533: unit = CL_UNIT(dev);
! 534: if (unit >= cl_cd.cd_ndevs ||
! 535: (sc = (struct clsoftc *)cl_cd.cd_devs[unit]) == NULL) {
! 536: return ENODEV;
! 537: }
! 538:
! 539: channel = CL_CHANNEL(dev);
! 540: cl = &sc->sc_cl[channel];
! 541:
! 542: s = splcl();
! 543: if (cl->tty) {
! 544: tp = cl->tty;
! 545: } else {
! 546: tp = cl->tty = ttymalloc();
! 547: }
! 548: tp->t_oproc = clstart;
! 549: tp->t_param = clparam;
! 550: tp->t_dev = dev;
! 551:
! 552: if ((tp->t_state & TS_ISOPEN) == 0) {
! 553: tp->t_state |= TS_WOPEN;
! 554: ttychars(tp);
! 555: if (tp->t_ispeed == 0) {
! 556: /*
! 557: * only when cleared do we reset to defaults.
! 558: */
! 559: tp->t_iflag = TTYDEF_IFLAG;
! 560: tp->t_oflag = TTYDEF_OFLAG;
! 561: tp->t_lflag = TTYDEF_LFLAG;
! 562: tp->t_ispeed = tp->t_ospeed = cldefaultrate;
! 563:
! 564: if (sc->sc_cl[channel].cl_consio != 0) {
! 565: /* console is 8N1 */
! 566: tp->t_cflag = (CREAD | CS8 | HUPCL);
! 567: } else {
! 568: tp->t_cflag = TTYDEF_CFLAG;
! 569: }
! 570: }
! 571: /*
! 572: * do these all the time
! 573: */
! 574: if (cl->cl_swflags & TIOCFLAG_CLOCAL)
! 575: tp->t_cflag |= CLOCAL;
! 576: if (cl->cl_swflags & TIOCFLAG_CRTSCTS)
! 577: tp->t_cflag |= CRTSCTS;
! 578: if (cl->cl_swflags & TIOCFLAG_MDMBUF)
! 579: tp->t_cflag |= MDMBUF;
! 580: clparam(tp, &tp->t_termios);
! 581: ttsetwater(tp);
! 582:
! 583: (void)clmctl(dev, TIOCM_DTR | TIOCM_RTS, DMSET);
! 584: #ifdef XXX
! 585: if ((cl->cl_swflags & TIOCFLAG_SOFTCAR) ||
! 586: (clmctl(dev, 0, DMGET) & TIOCM_CD)) {
! 587: tp->t_state |= TS_CARR_ON;
! 588: } else {
! 589: tp->t_state &= ~TS_CARR_ON;
! 590: }
! 591: #endif
! 592: tp->t_state |= TS_CARR_ON;
! 593: {
! 594: u_int8_t save;
! 595:
! 596: save = bus_space_read_1(sc->sc_iot, sc->sc_ioh, CL_CAR);
! 597: bus_space_write_1(sc->sc_iot, sc->sc_ioh, CL_CAR,
! 598: channel);
! 599: bus_space_write_1(sc->sc_iot, sc->sc_ioh, CL_IER, 0x88);
! 600: bus_space_write_1(sc->sc_iot, sc->sc_ioh, CL_CAR,
! 601: save);
! 602: }
! 603: } else if (tp->t_state & TS_XCLUDE && p->p_ucred->cr_uid != 0) {
! 604: splx(s);
! 605: return EBUSY;
! 606: }
! 607: splx(s);
! 608:
! 609: /*
! 610: * Reset the tty pointer, as there could have been a dialout
! 611: * use of the tty with a dialin open waiting.
! 612: */
! 613: tp->t_dev = dev;
! 614: #ifdef DEBUG
! 615: cl_dumpport(sc, channel);
! 616: #endif
! 617: return (*linesw[tp->t_line].l_open)(dev, tp);
! 618: }
! 619:
! 620: int
! 621: clparam(tp, t)
! 622: struct tty *tp;
! 623: struct termios *t;
! 624: {
! 625: int unit, channel;
! 626: struct clsoftc *sc;
! 627: int s;
! 628: dev_t dev;
! 629:
! 630: dev = tp->t_dev;
! 631: unit = CL_UNIT(dev);
! 632: if (unit >= cl_cd.cd_ndevs ||
! 633: (sc = (struct clsoftc *)cl_cd.cd_devs[unit]) == NULL) {
! 634: return ENODEV;
! 635: }
! 636: channel = CL_CHANNEL(dev);
! 637: tp->t_ispeed = t->c_ispeed;
! 638: tp->t_ospeed = t->c_ospeed;
! 639: tp->t_cflag = t->c_cflag;
! 640: clccparam(sc, t, channel);
! 641: s = splcl();
! 642: cl_unblock(tp);
! 643: splx(s);
! 644: return 0;
! 645: }
! 646:
! 647: #if 0
! 648: void
! 649: cloutput(tp)
! 650: struct tty *tp;
! 651: {
! 652: int cc, s, unit, cnt;
! 653: u_char *tptr;
! 654: int channel;
! 655: struct clsoftc *sc;
! 656: dev_t dev;
! 657: u_char cl_obuffer[CLCDBUF+1];
! 658:
! 659: dev = tp->t_dev;
! 660: unit = CL_UNIT(dev);
! 661: if (unit >= cl_cd.cd_ndevs ||
! 662: (sc = (struct clsoftc *)cl_cd.cd_devs[unit]) == NULL) {
! 663: return;
! 664: }
! 665: channel = CL_CHANNEL(dev);
! 666:
! 667: if ((tp->t_state & TS_ISOPEN) == 0)
! 668: return;
! 669:
! 670: s = splcl();
! 671: cc = tp->t_outq.c_cc;
! 672: while (cc > 0) {
! 673: /*XXX*/
! 674: cnt = min (CLCDBUF,cc);
! 675: cnt = q_to_b(&tp->t_outq, cl_obuffer, cnt);
! 676: if (cnt == 0) {
! 677: break;
! 678: }
! 679: for (tptr = cl_obuffer; tptr < &cl_obuffer[cnt]; tptr++) {
! 680: clputc(sc, channel, *tptr);
! 681: }
! 682: cc -= cnt;
! 683: }
! 684: splx(s);
! 685: }
! 686: #endif
! 687:
! 688: int
! 689: clclose(dev, flag, mode, p)
! 690: dev_t dev;
! 691: int flag;
! 692: int mode;
! 693: struct proc *p;
! 694: {
! 695: int unit, channel;
! 696: struct tty *tp;
! 697: struct cl_info *cl;
! 698: struct clsoftc *sc;
! 699: bus_space_tag_t iot;
! 700: bus_space_handle_t ioh;
! 701: int s;
! 702:
! 703: unit = CL_UNIT(dev);
! 704: if (unit >= cl_cd.cd_ndevs ||
! 705: (sc = (struct clsoftc *)cl_cd.cd_devs[unit]) == NULL) {
! 706: return ENODEV;
! 707: }
! 708: channel = CL_CHANNEL(dev);
! 709: cl = &sc->sc_cl[channel];
! 710: iot = sc->sc_iot;
! 711: ioh = sc->sc_ioh;
! 712: tp = cl->tty;
! 713: (*linesw[tp->t_line].l_close)(tp, flag);
! 714:
! 715: s = splcl();
! 716: bus_space_write_1(iot, ioh, CL_CAR, channel);
! 717: if (cl->cl_consio == 0 && (tp->t_cflag & HUPCL) != 0) {
! 718: bus_space_write_1(iot, ioh, CL_MSVR_RTS, 0x00);
! 719: bus_space_write_1(iot, ioh, CL_MSVR_DTR, 0x00);
! 720: bus_space_write_1(iot, ioh, CL_CCR, 0x05);
! 721: }
! 722:
! 723:
! 724: splx(s);
! 725: ttyclose(tp);
! 726:
! 727: #if 0
! 728: cl->tty = NULL;
! 729: #endif
! 730: #ifdef DEBUG
! 731: cl_dumpport(sc, channel);
! 732: #endif
! 733:
! 734: return 0;
! 735: }
! 736:
! 737: int
! 738: clread(dev, uio, flag)
! 739: dev_t dev;
! 740: struct uio *uio;
! 741: int flag;
! 742: {
! 743: int unit, channel;
! 744: struct tty *tp;
! 745: struct cl_info *cl;
! 746: struct clsoftc *sc;
! 747: unit = CL_UNIT(dev);
! 748: if (unit >= cl_cd.cd_ndevs ||
! 749: (sc = (struct clsoftc *)cl_cd.cd_devs[unit]) == NULL) {
! 750: return ENODEV;
! 751: }
! 752: channel = CL_CHANNEL(dev);
! 753: cl = &sc->sc_cl[channel];
! 754: tp = cl->tty;
! 755: if (tp == NULL)
! 756: return ENXIO;
! 757: return (*linesw[tp->t_line].l_read)(tp, uio, flag);
! 758: }
! 759:
! 760: int
! 761: clwrite(dev, uio, flag)
! 762: dev_t dev;
! 763: struct uio *uio;
! 764: int flag;
! 765: {
! 766: int unit, channel;
! 767: struct tty *tp;
! 768: struct cl_info *cl;
! 769: struct clsoftc *sc;
! 770: unit = CL_UNIT(dev);
! 771: if (unit >= cl_cd.cd_ndevs ||
! 772: (sc = (struct clsoftc *)cl_cd.cd_devs[unit]) == NULL) {
! 773: return ENODEV;
! 774: }
! 775: channel = CL_CHANNEL(dev);
! 776: cl = &sc->sc_cl[channel];
! 777: tp = cl->tty;
! 778: if (tp == NULL)
! 779: return ENXIO;
! 780: return (*linesw[tp->t_line].l_write)(tp, uio, flag);
! 781: }
! 782:
! 783: int
! 784: clioctl(dev, cmd, data, flag, p)
! 785: dev_t dev;
! 786: u_long cmd;
! 787: caddr_t data;
! 788: int flag;
! 789: struct proc *p;
! 790: {
! 791: int error;
! 792: int unit, channel;
! 793: struct tty *tp;
! 794: struct cl_info *cl;
! 795: struct clsoftc *sc;
! 796: unit = CL_UNIT(dev);
! 797: if (unit >= cl_cd.cd_ndevs ||
! 798: (sc = (struct clsoftc *)cl_cd.cd_devs[unit]) == NULL) {
! 799: return ENODEV;
! 800: }
! 801: channel = CL_CHANNEL(dev);
! 802: cl = &sc->sc_cl[channel];
! 803: tp = cl->tty;
! 804: if (tp == NULL)
! 805: return ENXIO;
! 806:
! 807: error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, p);
! 808: if (error >= 0)
! 809: return error;
! 810:
! 811: error = ttioctl(tp, cmd, data, flag, p);
! 812: if (error >= 0)
! 813: return error;
! 814:
! 815: switch (cmd) {
! 816: case TIOCSBRK:
! 817: /* */
! 818: break;
! 819:
! 820: case TIOCCBRK:
! 821: /* */
! 822: break;
! 823:
! 824: case TIOCSDTR:
! 825: (void) clmctl(dev, TIOCM_DTR | TIOCM_RTS, DMBIS);
! 826: break;
! 827:
! 828: case TIOCCDTR:
! 829: (void) clmctl(dev, TIOCM_DTR | TIOCM_RTS, DMBIC);
! 830: break;
! 831:
! 832: case TIOCMSET:
! 833: (void) clmctl(dev, *(int *) data, DMSET);
! 834: break;
! 835:
! 836: case TIOCMBIS:
! 837: (void) clmctl(dev, *(int *) data, DMBIS);
! 838: break;
! 839:
! 840: case TIOCMBIC:
! 841: (void) clmctl(dev, *(int *) data, DMBIC);
! 842: break;
! 843:
! 844: case TIOCMGET:
! 845: *(int *)data = clmctl(dev, 0, DMGET);
! 846: break;
! 847: case TIOCGFLAGS:
! 848: *(int *)data = cl->cl_swflags;
! 849: break;
! 850: case TIOCSFLAGS:
! 851: error = suser(p, 0);
! 852: if (error != 0)
! 853: return EPERM;
! 854:
! 855: cl->cl_swflags = *(int *)data;
! 856: cl->cl_swflags &= /* only allow valid flags */
! 857: (TIOCFLAG_SOFTCAR | TIOCFLAG_CLOCAL | TIOCFLAG_CRTSCTS);
! 858: break;
! 859: default:
! 860: return ENOTTY;
! 861: }
! 862:
! 863: return 0;
! 864: }
! 865:
! 866: int
! 867: clstop(tp, flag)
! 868: struct tty *tp;
! 869: int flag;
! 870: {
! 871: int s;
! 872:
! 873: s = splcl();
! 874: if (tp->t_state & TS_BUSY) {
! 875: if ((tp->t_state & TS_TTSTOP) == 0)
! 876: tp->t_state |= TS_FLUSH;
! 877: }
! 878: splx(s);
! 879: return 0;
! 880: }
! 881:
! 882: void
! 883: clcnprobe(cp)
! 884: struct consdev *cp;
! 885: {
! 886: int maj;
! 887:
! 888: /* bomb if it'a a MVME188 */
! 889: if (brdtyp == BRD_188 || badaddr(CD2400_BASE_ADDR, 1) != 0)
! 890: return;
! 891:
! 892: /* do not attach as console if cl has been disabled */
! 893: if (cl_cd.cd_ndevs == 0 || cl_cd.cd_devs[0] == NULL)
! 894: return;
! 895:
! 896: /* locate the major number */
! 897: for (maj = 0; maj < nchrdev; maj++)
! 898: if (cdevsw[maj].d_open == clopen)
! 899: break;
! 900: if (maj == nchrdev)
! 901: return;
! 902:
! 903: cp->cn_dev = makedev(maj, 0);
! 904: cp->cn_pri = CN_NORMAL;
! 905: }
! 906:
! 907: void
! 908: clcninit(cp)
! 909: struct consdev *cp;
! 910: {
! 911: struct clsoftc *sc;
! 912:
! 913: sc = (struct clsoftc *)cl_cd.cd_devs[0];
! 914: cl_cons.cl_iot = sc->sc_iot;
! 915: cl_cons.cl_ioh = sc->sc_ioh;
! 916: cl_cons.cl_rxiack = (void *)(sc->sc_pcctwo->sc_base + PCCTWO_SCCRXIACK);
! 917: }
! 918:
! 919: int
! 920: cl_instat(sc)
! 921: struct clsoftc *sc;
! 922: {
! 923: u_int8_t rir;
! 924:
! 925: if (sc == NULL)
! 926: rir = bus_space_read_1(cl_cons.cl_iot, cl_cons.cl_ioh, CL_RIR);
! 927: else
! 928: rir = bus_space_read_1(sc->sc_iot, sc->sc_ioh, CL_RIR);
! 929:
! 930: return (rir & 0x40);
! 931: }
! 932:
! 933: int
! 934: clcngetc(dev)
! 935: dev_t dev;
! 936: {
! 937: u_int8_t val, reoir, licr, data;
! 938: int got_char = 0;
! 939: u_int8_t ier_old;
! 940: bus_space_tag_t iot;
! 941: bus_space_handle_t ioh;
! 942:
! 943: iot = cl_cons.cl_iot;
! 944: ioh = cl_cons.cl_ioh;
! 945:
! 946: bus_space_write_1(iot, ioh, CL_CAR, 0);
! 947: ier_old = bus_space_read_1(iot, ioh, CL_IER);
! 948: if ((ier_old & 0x08) == 0) {
! 949: bus_space_write_1(iot, ioh, CL_IER, 0x08);
! 950: } else
! 951: ier_old = 0xff;
! 952:
! 953: while (got_char == 0) {
! 954: val = bus_space_read_1(iot, ioh, CL_RIR);
! 955: /* if no receive interrupt pending wait */
! 956: if ((val & 0x80) == 0)
! 957: continue;
! 958:
! 959: /* XXX do we need to suck the entire FIFO contents? */
! 960: reoir = *cl_cons.cl_rxiack; /* receive PIACK */
! 961: licr = bus_space_read_1(iot, ioh, CL_LICR);
! 962: /* is the interrupt for us? (port 0) */
! 963: if (((licr >> 2) & 0x3) == 0) {
! 964: (void)bus_space_read_1(iot, ioh, CL_RISRL);
! 965: (void)bus_space_read_1(iot, ioh, CL_RFOC);
! 966: data = bus_space_read_1(iot, ioh, CL_RDR);
! 967: if (ier_old != 0xff)
! 968: bus_space_write_1(iot, ioh, CL_IER, ier_old);
! 969: got_char = 1;
! 970: } else {
! 971: /* read and discard the character */
! 972: data = bus_space_read_1(iot, ioh, CL_RDR);
! 973: }
! 974: bus_space_write_1(iot, ioh, CL_TEOIR, 0x00);
! 975: }
! 976:
! 977: return data;
! 978: }
! 979:
! 980: void
! 981: clcnputc(dev, c)
! 982: dev_t dev;
! 983: u_char c;
! 984: {
! 985: clputc(0, 0, c);
! 986: }
! 987:
! 988: void
! 989: clcnpollc(dev, on)
! 990: dev_t dev;
! 991: int on;
! 992: {
! 993: if (on != 0) {
! 994: /* enable polling */
! 995: } else {
! 996: /* disable polling */
! 997: }
! 998: }
! 999:
! 1000: void
! 1001: clputc(sc, unit, c)
! 1002: struct clsoftc *sc;
! 1003: int unit;
! 1004: u_char c;
! 1005: {
! 1006: u_int8_t schar;
! 1007: u_int8_t oldchannel;
! 1008: bus_space_tag_t iot;
! 1009: bus_space_handle_t ioh;
! 1010: int s;
! 1011:
! 1012: if (sc == NULL) {
! 1013: /* output on console */
! 1014: iot = cl_cons.cl_iot;
! 1015: ioh = cl_cons.cl_ioh;
! 1016: } else {
! 1017: iot = sc->sc_iot;
! 1018: ioh = sc->sc_ioh;
! 1019: }
! 1020:
! 1021: s = splhigh();
! 1022: oldchannel = bus_space_read_1(iot, ioh, CL_CAR);
! 1023: bus_space_write_1(iot, ioh, CL_CAR, unit);
! 1024: if (unit == 0) {
! 1025: schar = bus_space_read_1(iot, ioh, CL_SCHR3);
! 1026: /* send special char, number 3 */
! 1027: bus_space_write_1(iot, ioh, CL_SCHR3, c);
! 1028: bus_space_write_1(iot, ioh, CL_STCR, 0x08 | 3);
! 1029: while (bus_space_read_1(iot, ioh, CL_STCR) != 0) {
! 1030: /* wait until cl notices the command
! 1031: * otherwise it may not notice the character
! 1032: * if we send characters too fast.
! 1033: */
! 1034: }
! 1035: DELAY(5);
! 1036: bus_space_write_1(iot, ioh, CL_SCHR3, schar);
! 1037: } else {
! 1038: if (bus_space_read_1(iot, ioh, CL_TFTC) != 0)
! 1039: bus_space_write_1(iot, ioh, CL_TDR, c);
! 1040: }
! 1041: bus_space_write_1(iot, ioh, CL_CAR, oldchannel);
! 1042: splx(s);
! 1043: }
! 1044:
! 1045: int
! 1046: clccparam(sc, par, channel)
! 1047: struct clsoftc *sc;
! 1048: struct termios *par;
! 1049: int channel;
! 1050: {
! 1051: bus_space_tag_t iot;
! 1052: bus_space_handle_t ioh;
! 1053: u_int divisor, clk, clen;
! 1054: int s, imask, ints;
! 1055:
! 1056: iot = sc->sc_iot;
! 1057: ioh = sc->sc_ioh;
! 1058:
! 1059: s = splcl();
! 1060: bus_space_write_1(iot, ioh, CL_CAR, channel);
! 1061: if (par->c_ospeed == 0) {
! 1062: /* dont kill the console */
! 1063: if (sc->sc_cl[channel].cl_consio == 0) {
! 1064: /* disconnect, drop RTS DTR stop receiver */
! 1065: bus_space_write_1(iot, ioh, CL_MSVR_RTS, 0x00);
! 1066: bus_space_write_1(iot, ioh, CL_MSVR_DTR, 0x00);
! 1067: bus_space_write_1(iot, ioh, CL_CCR, 0x05);
! 1068: }
! 1069: splx(s);
! 1070: return 0xff;
! 1071: }
! 1072:
! 1073: bus_space_write_1(iot, ioh, CL_MSVR_RTS, 0x03);
! 1074: bus_space_write_1(iot, ioh, CL_MSVR_DTR, 0x03);
! 1075:
! 1076: divisor = cl_clkdiv(par->c_ospeed);
! 1077: clk = cl_clknum(par->c_ospeed);
! 1078: bus_space_write_1(iot, ioh, CL_TBPR, divisor);
! 1079: bus_space_write_1(iot, ioh, CL_TCOR, clk << 5);
! 1080: divisor = cl_clkdiv(par->c_ispeed);
! 1081: clk = cl_clknum(par->c_ispeed);
! 1082: bus_space_write_1(iot, ioh, CL_RBPR, divisor);
! 1083: bus_space_write_1(iot, ioh, CL_RCOR, clk);
! 1084: bus_space_write_1(iot, ioh, CL_RTPRL, cl_clkrxtimeout(par->c_ispeed));
! 1085: bus_space_write_1(iot, ioh, CL_RTPRH, 0x00);
! 1086:
! 1087: switch (par->c_cflag & CSIZE) {
! 1088: case CS5:
! 1089: clen = 4; /* this is the mask for the chip. */
! 1090: imask = 0x1F;
! 1091: break;
! 1092: case CS6:
! 1093: clen = 5;
! 1094: imask = 0x3F;
! 1095: break;
! 1096: case CS7:
! 1097: clen = 6;
! 1098: imask = 0x7F;
! 1099: break;
! 1100: default:
! 1101: clen = 7;
! 1102: imask = 0xFF;
! 1103: }
! 1104:
! 1105: bus_space_write_1(iot, ioh, CL_COR3, par->c_cflag & PARENB ? 4 : 2);
! 1106:
! 1107: {
! 1108: u_int8_t cor1;
! 1109: if (par->c_cflag & PARENB) {
! 1110: if (par->c_cflag & PARODD) {
! 1111: cor1 = 0xE0 | clen ; /* odd */
! 1112: } else {
! 1113: cor1 = 0x40 | clen ; /* even */
! 1114: }
! 1115: } else {
! 1116: cor1 = 0x10 | clen; /* ignore parity */
! 1117: }
! 1118:
! 1119: if (bus_space_read_1(iot, ioh, CL_COR1) != cor1) {
! 1120: bus_space_write_1(iot, ioh, CL_COR1, cor1);
! 1121: bus_space_write_1(iot, ioh, CL_CCR, 0x20);
! 1122: while (bus_space_read_1(iot, ioh, CL_CCR) != 0)
! 1123: ;
! 1124: }
! 1125: }
! 1126:
! 1127: if (sc->sc_cl[channel].cl_consio == 0 && (par->c_cflag & CREAD) == 0)
! 1128: bus_space_write_1(iot, ioh, CL_CCR, 0x08);
! 1129: else
! 1130: bus_space_write_1(iot, ioh, CL_CCR, 0x0a);
! 1131:
! 1132: while (bus_space_read_1(iot, ioh, CL_CCR) != 0)
! 1133: ;
! 1134:
! 1135: ints = 0;
! 1136: #define SCC_DSR 0x80
! 1137: #define SCC_DCD 0x40
! 1138: #define SCC_CTS 0x20
! 1139: if ((par->c_cflag & CLOCAL) == 0) {
! 1140: ints |= SCC_DCD;
! 1141: }
! 1142: if ((par->c_cflag & CCTS_OFLOW) != 0) {
! 1143: ints |= SCC_CTS;
! 1144: }
! 1145: if ((par->c_cflag & CRTSCTS) != 0) {
! 1146: ints |= SCC_CTS;
! 1147: }
! 1148: #ifdef DONT_LET_HARDWARE
! 1149: if ((par->c_cflag & CCTS_IFLOW) != 0) {
! 1150: ints |= SCC_DSR;
! 1151: }
! 1152: #endif
! 1153: bus_space_write_1(iot, ioh, CL_COR4, ints | CL_FIFO_CNT);
! 1154: bus_space_write_1(iot, ioh, CL_COR5, ints | CL_FIFO_CNT);
! 1155:
! 1156: splx(s);
! 1157:
! 1158: return imask;
! 1159: }
! 1160:
! 1161: static int clknum = 0;
! 1162:
! 1163: u_int8_t
! 1164: cl_clkdiv(speed)
! 1165: int speed;
! 1166: {
! 1167: int i;
! 1168:
! 1169: if (cl_clocks[clknum].speed == speed)
! 1170: return cl_clocks[clknum].divisor;
! 1171:
! 1172: for (i = 0; cl_clocks[i].speed != 0; i++) {
! 1173: if (cl_clocks[i].speed == speed) {
! 1174: clknum = i;
! 1175: return cl_clocks[clknum].divisor;
! 1176: }
! 1177: }
! 1178:
! 1179: /* return some sane value if unknown speed */
! 1180: return cl_clocks[CL_SAFE_CLOCK].divisor;
! 1181: }
! 1182:
! 1183: u_int8_t
! 1184: cl_clknum(speed)
! 1185: int speed;
! 1186: {
! 1187: int i;
! 1188:
! 1189: if (cl_clocks[clknum].speed == speed)
! 1190: return cl_clocks[clknum].clock;
! 1191:
! 1192: for (i = 0; cl_clocks[i].speed != 0; i++) {
! 1193: if (cl_clocks[clknum].speed == speed) {
! 1194: clknum = i;
! 1195: return cl_clocks[clknum].clock;
! 1196: }
! 1197: }
! 1198:
! 1199: /* return some sane value if unknown speed */
! 1200: return cl_clocks[CL_SAFE_CLOCK].clock;
! 1201: }
! 1202:
! 1203: u_int8_t
! 1204: cl_clkrxtimeout(speed)
! 1205: int speed;
! 1206: {
! 1207: int i;
! 1208:
! 1209: if (cl_clocks[clknum].speed == speed)
! 1210: return cl_clocks[clknum].rx_timeout;
! 1211:
! 1212: for (i = 0; cl_clocks[i].speed != 0; i++) {
! 1213: if (cl_clocks[i].speed == speed) {
! 1214: clknum = i;
! 1215: return cl_clocks[clknum].rx_timeout;
! 1216: }
! 1217: }
! 1218:
! 1219: /* return some sane value if unknown speed */
! 1220: return cl_clocks[CL_SAFE_CLOCK].rx_timeout;
! 1221: }
! 1222:
! 1223: void
! 1224: cl_unblock(tp)
! 1225: struct tty *tp;
! 1226: {
! 1227: tp->t_state &= ~TS_FLUSH;
! 1228: if (tp->t_outq.c_cc != 0)
! 1229: clstart(tp);
! 1230: }
! 1231:
! 1232: void
! 1233: clstart(tp)
! 1234: struct tty *tp;
! 1235: {
! 1236: dev_t dev;
! 1237: struct clsoftc *sc;
! 1238: int channel, unit, s;
! 1239: #if 0
! 1240: int cnt;
! 1241: u_int8_t cbuf;
! 1242: #endif
! 1243:
! 1244: dev = tp->t_dev;
! 1245: channel = CL_CHANNEL(dev);
! 1246: /* hack to test output on non console only */
! 1247: #if 0
! 1248: if (channel == 0) {
! 1249: cloutput(tp);
! 1250: return;
! 1251: }
! 1252: #endif
! 1253: unit = CL_UNIT(dev);
! 1254: if (unit >= cl_cd.cd_ndevs ||
! 1255: (sc = (struct clsoftc *)cl_cd.cd_devs[unit]) == NULL) {
! 1256: return;
! 1257: }
! 1258:
! 1259: if ((tp->t_state & TS_ISOPEN) == 0)
! 1260: return;
! 1261:
! 1262: s = splcl();
! 1263: #if 0
! 1264: if (sc->sc_cl[channel].transmitting == 1) {
! 1265: /* i'm busy, go away, I will get to it later. */
! 1266: splx(s);
! 1267: return;
! 1268: }
! 1269: cnt = q_to_b(&tp->t_outq, &cbuf, 1);
! 1270: if ( cnt != 0 ) {
! 1271: sc->sc_cl[channel].transmitting = 1;
! 1272: bus_space_write_1(sc->sc_iot, sc->sc_ioh, CL_CAR, channel);
! 1273: bus_space_write_1(sc->sc_iot, sc->sc_ioh, CL_TDR, cbuf);
! 1274: } else {
! 1275: sc->sc_cl[channel].transmitting = 0;
! 1276: }
! 1277: #else
! 1278: if ((tp->t_state & (TS_TIMEOUT | TS_BUSY | TS_TTSTOP | TS_FLUSH)) == 0)
! 1279: {
! 1280: tp->t_state |= TS_BUSY;
! 1281: bus_space_write_1(sc->sc_iot, sc->sc_ioh, CL_CAR, channel);
! 1282: bus_space_write_1(sc->sc_iot, sc->sc_ioh, CL_IER,
! 1283: bus_space_read_1(sc->sc_iot, sc->sc_ioh, CL_IER) | 0x03);
! 1284: }
! 1285: #endif
! 1286: splx(s);
! 1287: }
! 1288:
! 1289: int
! 1290: cl_mintr(arg)
! 1291: void *arg;
! 1292: {
! 1293: struct clsoftc *sc = arg;
! 1294: bus_space_tag_t iot;
! 1295: bus_space_handle_t ioh;
! 1296: u_int8_t mir, misr, msvr;
! 1297: int channel;
! 1298:
! 1299: iot = sc->sc_iot;
! 1300: ioh = sc->sc_ioh;
! 1301:
! 1302: mir = bus_space_read_1(iot, ioh, CL_MIR);
! 1303: if ((mir & 0x40) == 0) {
! 1304: return 0;
! 1305: }
! 1306:
! 1307: channel = mir & 0x03;
! 1308: misr = bus_space_read_1(iot, ioh, CL_MISR);
! 1309: msvr = bus_space_read_1(iot, ioh, CL_MSVR_RTS);
! 1310: if (misr & 0x01) {
! 1311: /* timers are not currently used?? */
! 1312: log(LOG_WARNING, "cl_mintr: channel %x timer 1 unexpected\n",channel);
! 1313: }
! 1314: if (misr & 0x02) {
! 1315: /* timers are not currently used?? */
! 1316: log(LOG_WARNING, "cl_mintr: channel %x timer 2 unexpected\n",channel);
! 1317: }
! 1318: if (misr & 0x20) {
! 1319: #ifdef DEBUG
! 1320: log(LOG_WARNING, "cl_mintr: channel %x cts %x\n",channel,
! 1321: ((msvr & 0x20) != 0x0)
! 1322: );
! 1323: #endif
! 1324: }
! 1325: if (misr & 0x40) {
! 1326: struct tty *tp = sc->sc_cl[channel].tty;
! 1327: #ifdef DEBUG
! 1328: log(LOG_WARNING, "cl_mintr: channel %x cd %x\n",channel,
! 1329: ((msvr & 0x40) != 0x0)
! 1330: );
! 1331: #endif
! 1332: ttymodem(tp, ((msvr & 0x40) != 0x0) );
! 1333: }
! 1334: if (misr & 0x80) {
! 1335: #ifdef DEBUG
! 1336: log(LOG_WARNING, "cl_mintr: channel %x dsr %x\n",channel,
! 1337: ((msvr & 0x80) != 0x0)
! 1338: );
! 1339: #endif
! 1340: }
! 1341: bus_space_write_1(iot, ioh, CL_MEOIR, 0);
! 1342: return 1;
! 1343: }
! 1344:
! 1345: int
! 1346: cl_txintr(arg)
! 1347: void *arg;
! 1348: {
! 1349: static int empty;
! 1350: struct clsoftc *sc = arg;
! 1351: bus_space_tag_t iot;
! 1352: bus_space_handle_t ioh;
! 1353: u_int8_t tir, cmr, teoir;
! 1354: u_int8_t max;
! 1355: int channel;
! 1356: struct tty *tp;
! 1357: int cnt;
! 1358: u_char buffer[CL_FIFO_MAX +1];
! 1359:
! 1360: iot = sc->sc_iot;
! 1361: ioh = sc->sc_ioh;
! 1362: tir = bus_space_read_1(iot, ioh, CL_TIR);
! 1363: if ((tir & 0x40) == 0) {
! 1364: return 0;
! 1365: }
! 1366:
! 1367: channel = tir & 0x03;
! 1368: sc->sc_cl[channel].txcnt ++;
! 1369:
! 1370: cmr = bus_space_read_1(iot, ioh, CL_CMR);
! 1371:
! 1372: tp = sc->sc_cl[channel].tty;
! 1373: if (tp == NULL || (tp->t_state & TS_ISOPEN) == 0) {
! 1374: bus_space_write_1(iot, ioh, CL_IER,
! 1375: bus_space_read_1(iot, ioh, CL_IER) & ~0x03);
! 1376: bus_space_write_1(iot, ioh, CL_TEOIR, 0x08);
! 1377: return 1;
! 1378: }
! 1379:
! 1380: switch (cmr & CL_TXMASK) {
! 1381: case CL_TXDMAINT:
! 1382: {
! 1383: u_int8_t dmabsts;
! 1384: int nbuf, busy, resid;
! 1385: void *pbuffer;
! 1386:
! 1387: dmabsts = bus_space_read_1(iot, ioh, CL_DMABSTS);
! 1388: nbuf = ((dmabsts & 0x8) >> 3) & 0x1;
! 1389: busy = ((dmabsts & 0x4) >> 2) & 0x1;
! 1390:
! 1391: do {
! 1392: pbuffer = sc->sc_cl[channel].tx[nbuf];
! 1393: resid = tp->t_outq.c_cc;
! 1394: cnt = min (CL_BUFSIZE,resid);
! 1395: log(LOG_WARNING, "cl_txintr: resid %x cnt %x pbuf %p\n",
! 1396: resid, cnt, pbuffer);
! 1397: if (cnt != 0) {
! 1398: cnt = q_to_b(&tp->t_outq, pbuffer, cnt);
! 1399: resid -= cnt;
! 1400: if (nbuf == 0) {
! 1401: bus_space_write_2(iot, ioh, CL_ATBADRU,
! 1402: ((u_long)sc->sc_cl[channel].txp[nbuf]) >> 16);
! 1403: bus_space_write_2(iot, ioh, CL_ATBADRL,
! 1404: ((u_long) sc->sc_cl[channel].txp[nbuf]) & 0xffff);
! 1405: bus_space_write_2(iot, ioh, CL_ATBCNT,
! 1406: cnt);
! 1407: bus_space_write_1(iot, ioh, CL_ATBSTS,
! 1408: 0x43);
! 1409: } else {
! 1410: bus_space_write_2(iot, ioh, CL_BTBADRU,
! 1411: ((u_long)sc->sc_cl[channel].txp[nbuf]) >> 16);
! 1412: bus_space_write_2(iot, ioh, CL_BTBADRL,
! 1413: ((u_long) sc->sc_cl[channel].txp[nbuf]) & 0xffff);
! 1414: bus_space_write_2(iot, ioh, CL_BTBCNT,
! 1415: cnt);
! 1416: bus_space_write_1(iot, ioh, CL_BTBSTS,
! 1417: 0x43);
! 1418: }
! 1419: teoir = 0x08;
! 1420: } else {
! 1421: teoir = 0x08;
! 1422: if (tp->t_state & TS_BUSY) {
! 1423: tp->t_state &= ~(TS_BUSY | TS_FLUSH);
! 1424: if (tp->t_state & TS_ASLEEP) {
! 1425: tp->t_state &= ~TS_ASLEEP;
! 1426: wakeup((caddr_t) &tp->t_outq);
! 1427: }
! 1428: selwakeup(&tp->t_wsel);
! 1429: }
! 1430: bus_space_write_1(iot, ioh, CL_IER,
! 1431: bus_space_read_1(iot, ioh, CL_IER) & ~0x03);
! 1432: }
! 1433: nbuf = ~nbuf & 0x1;
! 1434: busy--;
! 1435: } while (resid != 0 && busy != -1);/* if not busy do other buffer */
! 1436: }
! 1437: break;
! 1438: case CL_TXINTR:
! 1439: max = bus_space_read_1(iot, ioh, CL_TFTC);
! 1440: cnt = min((int)max,tp->t_outq.c_cc);
! 1441: if (cnt != 0) {
! 1442: cnt = q_to_b(&tp->t_outq, buffer, cnt);
! 1443: empty = 0;
! 1444: bus_space_write_multi_1(iot, ioh, CL_TDR, buffer, cnt);
! 1445: teoir = 0x00;
! 1446: } else {
! 1447: if (empty > 5 && ((empty % 20000 )== 0)) {
! 1448: log(LOG_WARNING, "cl_txintr to many empty intr %d channel %d\n",
! 1449: empty, channel);
! 1450: }
! 1451: empty++;
! 1452: teoir = 0x08;
! 1453: if (tp->t_state & TS_BUSY) {
! 1454: tp->t_state &= ~(TS_BUSY | TS_FLUSH);
! 1455: if (tp->t_state & TS_ASLEEP) {
! 1456: tp->t_state &= ~TS_ASLEEP;
! 1457: wakeup((caddr_t) &tp->t_outq);
! 1458: }
! 1459: selwakeup(&tp->t_wsel);
! 1460: }
! 1461: bus_space_write_1(iot, ioh, CL_IER,
! 1462: bus_space_read_1(iot, ioh, CL_IER) & ~0x03);
! 1463: }
! 1464: break;
! 1465: default:
! 1466: log(LOG_WARNING, "cl_txintr unknown mode %x\n", cmr);
! 1467: /* we probably will go to hell quickly now */
! 1468: teoir = 0x08;
! 1469: }
! 1470: bus_space_write_1(iot, ioh, CL_TEOIR, teoir);
! 1471: return 1;
! 1472: }
! 1473:
! 1474: int
! 1475: cl_rxintr(arg)
! 1476: void *arg;
! 1477: {
! 1478: struct clsoftc *sc = arg;
! 1479: bus_space_tag_t iot;
! 1480: bus_space_handle_t ioh;
! 1481: u_int8_t rir, channel, cmr, risrl;
! 1482: u_int8_t fifocnt;
! 1483: struct tty *tp;
! 1484: int i;
! 1485: u_int8_t reoir;
! 1486: u_char buffer[CL_FIFO_MAX +1];
! 1487: #ifdef DDB
! 1488: int wantddb = 0;
! 1489: #endif
! 1490:
! 1491: iot = sc->sc_iot;
! 1492: ioh = sc->sc_ioh;
! 1493:
! 1494: rir = bus_space_read_1(iot, ioh, CL_RIR);
! 1495: if ((rir & 0x40) == 0x0) {
! 1496: return 0;
! 1497: }
! 1498:
! 1499: channel = rir & 0x3;
! 1500: cmr = bus_space_read_1(iot, ioh, CL_CMR);
! 1501:
! 1502: sc->sc_cl[channel].rxcnt ++;
! 1503: risrl = bus_space_read_1(iot, ioh, CL_RISRL);
! 1504: if (risrl & 0x80) {
! 1505: /* timeout, no characters */
! 1506: } else
! 1507: /* We don't need no stinkin special characters */
! 1508: if (risrl & 0x08) {
! 1509: cl_overflow(sc, channel, (long *)&sc->sc_fotime, "fifo");
! 1510: } else
! 1511: if (risrl & 0x04) {
! 1512: cl_parity(sc, channel);
! 1513: } else
! 1514: if (risrl & 0x02) {
! 1515: cl_frame(sc, channel);
! 1516: } else
! 1517: if (risrl & 0x01) {
! 1518: #ifdef DDB
! 1519: if (sc->sc_cl[channel].cl_consio)
! 1520: wantddb = db_console;
! 1521: #endif
! 1522: cl_break(sc, channel);
! 1523: }
! 1524: reoir = 0x08;
! 1525:
! 1526: switch (cmr & CL_RXMASK) {
! 1527: case CL_RXDMAINT:
! 1528: {
! 1529: int nbuf;
! 1530: u_int16_t cnt;
! 1531: int bufcomplete;
! 1532: u_int8_t status, dmabsts;
! 1533: u_int8_t risrh;
! 1534:
! 1535: risrh = bus_space_read_1(iot, ioh, CL_RISRH);
! 1536: dmabsts = bus_space_read_1(iot, ioh, CL_DMABSTS);
! 1537: nbuf = (risrh & 0x08) ? 1 : 0;
! 1538: bufcomplete = (risrh & 0x20) ? 1 : 0;
! 1539: if (nbuf == 0) {
! 1540: cnt = bus_space_read_2(iot, ioh, CL_ARBCNT);
! 1541: status = bus_space_read_1(iot, ioh, CL_ARBSTS);
! 1542: } else {
! 1543: cnt = bus_space_read_2(iot, ioh, CL_BRBCNT);
! 1544: status = bus_space_read_1(iot, ioh, CL_BRBSTS);
! 1545: }
! 1546: #if USE_BUFFER
! 1547: cl_appendbufn(sc, channel, sc->rx[nbuf], cnt);
! 1548: #else
! 1549: {
! 1550: int i;
! 1551: u_char *pbuf;
! 1552:
! 1553: tp = sc->sc_cl[channel].tty;
! 1554: pbuf = sc->sc_cl[channel].rx[nbuf];
! 1555: /* this should be done at off level */
! 1556: {
! 1557: u_int16_t rcbadru, rcbadrl;
! 1558: u_int8_t arbsts, brbsts;
! 1559: u_char *pbufs, *pbufe;
! 1560:
! 1561: rcbadru = bus_space_read_2(iot, ioh,
! 1562: CL_RCBADRU);
! 1563: rcbadrl = bus_space_read_2(iot, ioh,
! 1564: CL_RCBADRL);
! 1565: arbsts = bus_space_read_1(iot, ioh, CL_ARBSTS);
! 1566: brbsts = bus_space_read_1(iot, ioh, CL_BRBSTS);
! 1567: pbufs = sc->sc_cl[channel].rxp[nbuf];
! 1568: pbufe = (u_char *)(((u_long)rcbadru << 16) | (u_long)rcbadrl);
! 1569: cnt = pbufe - pbufs;
! 1570: }
! 1571: reoir = 0x0 | (bufcomplete) ? 0 : 0xd0;
! 1572: bus_space_write_1(iot, ioh, CL_REOIR, reoir);
! 1573:
! 1574: DELAY(10); /* give the chip a moment */
! 1575:
! 1576: for (i = 0; i < cnt; i++) {
! 1577: u_char c;
! 1578: c = pbuf[i];
! 1579: (*linesw[tp->t_line].l_rint)(c,tp);
! 1580: }
! 1581: /* this should be done at off level */
! 1582: if (nbuf == 0) {
! 1583: bus_space_write_2(iot, ioh, CL_ARBCNT,
! 1584: CL_BUFSIZE);
! 1585: bus_space_write_2(iot, ioh, CL_ARBSTS, 0x01);
! 1586: } else {
! 1587: bus_space_write_2(iot, ioh, CL_BRBCNT,
! 1588: CL_BUFSIZE);
! 1589: bus_space_write_2(iot, ioh, CL_BRBSTS, 0x01);
! 1590: }
! 1591: }
! 1592: #endif
! 1593: }
! 1594: bus_space_write_1(iot, ioh, CL_REOIR, reoir);
! 1595: break;
! 1596: case CL_RXINTR:
! 1597: fifocnt = bus_space_read_1(iot, ioh, CL_RFOC);
! 1598: tp = sc->sc_cl[channel].tty;
! 1599: bus_space_read_multi_1(iot, ioh, CL_RDR, buffer, fifocnt);
! 1600: if (tp == NULL) {
! 1601: /* if the channel is not configured,
! 1602: * dont send characters upstream.
! 1603: * also fix problem with NULL dereference
! 1604: */
! 1605: reoir = 0x00;
! 1606: break;
! 1607: }
! 1608:
! 1609: bus_space_write_1(iot, ioh, CL_REOIR, reoir);
! 1610: for (i = 0; i < fifocnt; i++) {
! 1611: u_char c;
! 1612: c = buffer[i];
! 1613: #if USE_BUFFER
! 1614: cl_appendbuf(sc, channel, c);
! 1615: #else
! 1616: /* does any restricitions exist on spl
! 1617: * for this call
! 1618: */
! 1619: (*linesw[tp->t_line].l_rint)(c,tp);
! 1620: #endif
! 1621: }
! 1622: break;
! 1623: default:
! 1624: log(LOG_WARNING, "cl_rxintr unknown mode %x\n", cmr);
! 1625: /* we probably will go to hell quickly now */
! 1626: bus_space_write_1(iot, ioh, CL_REOIR, 0x08);
! 1627: }
! 1628: #ifdef DDB
! 1629: if (wantddb != 0)
! 1630: Debugger();
! 1631: #endif
! 1632: return 1;
! 1633: }
! 1634:
! 1635: void
! 1636: cl_overflow(sc, channel, ptime, msg)
! 1637: struct clsoftc *sc;
! 1638: int channel;
! 1639: long *ptime;
! 1640: char *msg;
! 1641: {
! 1642: log(LOG_WARNING, "%s[%d]: %s overrun\n", sc->sc_dev.dv_xname,
! 1643: channel, msg);
! 1644: }
! 1645:
! 1646: void
! 1647: cl_parity(sc, channel)
! 1648: struct clsoftc *sc;
! 1649: int channel;
! 1650: {
! 1651: log(LOG_WARNING, "%s[%d]: parity error\n", sc->sc_dev.dv_xname,
! 1652: channel);
! 1653: }
! 1654:
! 1655: void
! 1656: cl_frame(sc, channel)
! 1657: struct clsoftc *sc;
! 1658: int channel;
! 1659: {
! 1660: log(LOG_WARNING, "%s[%d]: frame error\n", sc->sc_dev.dv_xname,
! 1661: channel);
! 1662: }
! 1663:
! 1664: void
! 1665: cl_break(sc, channel)
! 1666: struct clsoftc *sc;
! 1667: int channel;
! 1668: {
! 1669: #ifdef DEBUG
! 1670: log(LOG_WARNING, "%s[%d]: break detected\n", sc->sc_dev.dv_xname,
! 1671: channel);
! 1672: #endif
! 1673: }
! 1674:
! 1675: #ifdef DEBUG
! 1676: void
! 1677: cl_dumpport(struct clsoftc *sc, int channel)
! 1678: {
! 1679: bus_space_tag_t iot;
! 1680: bus_space_handle_t ioh;
! 1681: u_int8_t livr, cmr, cor1, cor2, cor3, cor4, cor5, cor6, cor7,
! 1682: schr1, schr2, schr3, schr4, scrl, scrh, lnxt,
! 1683: rbpr, rcor, tbpr, tcor, rpilr, rir, tpr, ier, ccr,
! 1684: dmabsts, arbsts, brbsts, atbsts, btbsts,
! 1685: csr, rts, dtr, rtprl, rtprh;
! 1686: u_int16_t rcbadru, rcbadrl, arbadru, arbadrl, arbcnt,
! 1687: brbadru, brbadrl, brbcnt;
! 1688: u_int16_t tcbadru, tcbadrl, atbadru, atbadrl, atbcnt,
! 1689: btbadru, btbadrl, btbcnt;
! 1690: int s;
! 1691:
! 1692: iot = sc->sc_iot;
! 1693: ioh = sc->sc_ioh;
! 1694:
! 1695: s = splcl();
! 1696: bus_space_write_1(iot, ioh, CL_CAR, channel);
! 1697: livr = bus_space_read_1(iot, ioh, CL_LIVR);
! 1698: cmr = bus_space_read_1(iot, ioh, CL_CMR);
! 1699: cor1 = bus_space_read_1(iot, ioh, CL_COR1);
! 1700: cor2 = bus_space_read_1(iot, ioh, CL_COR2);
! 1701: cor3 = bus_space_read_1(iot, ioh, CL_COR3);
! 1702: cor4 = bus_space_read_1(iot, ioh, CL_COR4);
! 1703: cor5 = bus_space_read_1(iot, ioh, CL_COR5);
! 1704: cor6 = bus_space_read_1(iot, ioh, CL_COR6);
! 1705: cor7 = bus_space_read_1(iot, ioh, CL_COR7);
! 1706: schr1 = bus_space_read_1(iot, ioh, CL_SCHR1);
! 1707: schr2 = bus_space_read_1(iot, ioh, CL_SCHR2);
! 1708: schr3 = bus_space_read_1(iot, ioh, CL_SCHR3);
! 1709: schr4 = bus_space_read_1(iot, ioh, CL_SCHR4);
! 1710: scrl = bus_space_read_1(iot, ioh, CL_SCRL);
! 1711: scrh = bus_space_read_1(iot, ioh, CL_SCRH);
! 1712: lnxt = bus_space_read_1(iot, ioh, CL_LNXT);
! 1713: rbpr = bus_space_read_1(iot, ioh, CL_RBPR);
! 1714: rcor = bus_space_read_1(iot, ioh, CL_RCOR);
! 1715: tbpr = bus_space_read_1(iot, ioh, CL_TBPR);
! 1716: rpilr = bus_space_read_1(iot, ioh, CL_RPILR);
! 1717: rir = bus_space_read_1(iot, ioh, CL_RIR);
! 1718: ier = bus_space_read_1(iot, ioh, CL_IER);
! 1719: ccr = bus_space_read_1(iot, ioh, CL_CCR);
! 1720: tcor = bus_space_read_1(iot, ioh, CL_TCOR);
! 1721: csr = bus_space_read_1(iot, ioh, CL_CSR);
! 1722: tpr = bus_space_read_1(iot, ioh, CL_TPR);
! 1723: rts = bus_space_read_1(iot, ioh, CL_MSVR_RTS);
! 1724: dtr = bus_space_read_1(iot, ioh, CL_MSVR_DTR);
! 1725: rtprl = bus_space_read_1(iot, ioh, CL_RTPRL);
! 1726: rtprh = bus_space_read_1(iot, ioh, CL_RTPRH);
! 1727: dmabsts = bus_space_read_1(iot, ioh, CL_DMABSTS);
! 1728: tcbadru = bus_space_read_2(iot, ioh, CL_TCBADRU);
! 1729: tcbadrl = bus_space_read_2(iot, ioh, CL_TCBADRL);
! 1730: rcbadru = bus_space_read_2(iot, ioh, CL_RCBADRU);
! 1731: rcbadrl = bus_space_read_2(iot, ioh, CL_RCBADRL);
! 1732: arbadru = bus_space_read_2(iot, ioh, CL_ARBADRU);
! 1733: arbadrl = bus_space_read_2(iot, ioh, CL_ARBADRL);
! 1734: arbcnt = bus_space_read_2(iot, ioh, CL_ARBCNT);
! 1735: arbsts = bus_space_read_1(iot, ioh, CL_ARBSTS);
! 1736: brbadru = bus_space_read_2(iot, ioh, CL_BRBADRU);
! 1737: brbadrl = bus_space_read_2(iot, ioh, CL_BRBADRL);
! 1738: brbcnt = bus_space_read_2(iot, ioh, CL_BRBCNT);
! 1739: brbsts = bus_space_read_1(iot, ioh, CL_BRBSTS);
! 1740: atbadru = bus_space_read_2(iot, ioh, CL_ATBADRU);
! 1741: atbadrl = bus_space_read_2(iot, ioh, CL_ATBADRL);
! 1742: atbcnt = bus_space_read_2(iot, ioh, CL_ATBCNT);
! 1743: atbsts = bus_space_read_1(iot, ioh, CL_ATBSTS);
! 1744: btbadru = bus_space_read_2(iot, ioh, CL_BTBADRU);
! 1745: btbadrl = bus_space_read_2(iot, ioh, CL_BTBADRL);
! 1746: btbcnt = bus_space_read_2(iot, ioh, CL_BTBCNT);
! 1747: btbsts = bus_space_read_1(iot, ioh, CL_BTBSTS);
! 1748: splx(s);
! 1749:
! 1750: printf("{ port %x livr %x cmr %x\n",
! 1751: channel,livr, cmr);
! 1752: printf("cor1 %x cor2 %x cor3 %x cor4 %x cor5 %x cor6 %x cor7 %x\n",
! 1753: cor1, cor2, cor3, cor4, cor5, cor6, cor7);
! 1754: printf("schr1 %x schr2 %x schr3 %x schr4 %x\n",
! 1755: schr1, schr2, schr3, schr4);
! 1756: printf("scrl %x scrh %x lnxt %x\n",
! 1757: scrl, scrh, lnxt);
! 1758: printf("rbpr %x rcor %x tbpr %x tcor %x\n",
! 1759: rbpr, rcor, tbpr, tcor);
! 1760: printf("rpilr %x rir %x ier %x ccr %x\n",
! 1761: rpilr, rir, ier, ccr);
! 1762: printf("tpr %x csr %x rts %x dtr %x\n",
! 1763: tpr, csr, rts, dtr);
! 1764: printf("rtprl %x rtprh %x\n",
! 1765: rtprl, rtprh);
! 1766: printf("rxcnt %x txcnt %x\n",
! 1767: sc->sc_cl[channel].rxcnt, sc->sc_cl[channel].txcnt);
! 1768: printf("dmabsts %x, tcbadru %x, tcbadrl %x, rcbadru %x, rcbadrl %x,\n",
! 1769: dmabsts, tcbadru, tcbadrl, rcbadru, rcbadrl );
! 1770: printf("arbadru %x, arbadrl %x, arbcnt %x, arbsts %x\n",
! 1771: arbadru, arbadrl, arbcnt, arbsts);
! 1772: printf("brbadru %x, brbadrl %x, brbcnt %x, brbsts %x\n",
! 1773: brbadru, brbadrl, brbcnt, brbsts);
! 1774: printf("atbadru %x, atbadrl %x, atbcnt %x, atbsts %x\n",
! 1775: atbadru, atbadrl, atbcnt, atbsts);
! 1776: printf("btbadru %x, btbadrl %x, btbcnt %x, btbsts %x\n",
! 1777: btbadru, btbadrl, btbcnt, btbsts);
! 1778: printf("}\n");
! 1779: }
! 1780: #endif
CVSweb