[BACK]Return to gencons.c CVS log [TXT][DIR] Up to [local] / sys / arch / vax / vax

Annotation of sys/arch/vax/vax/gencons.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: gencons.c,v 1.17 2006/07/19 20:21:08 miod Exp $       */
                      2: /*     $NetBSD: gencons.c,v 1.22 2000/01/24 02:40:33 matt Exp $        */
                      3:
                      4: /*
                      5:  * Copyright (c) 1994 Gordon W. Ross
                      6:  * Copyright (c) 1994 Ludd, University of Lule}, Sweden.
                      7:  * All rights reserved.
                      8:  *
                      9:  * Redistribution and use in source and binary forms, with or without
                     10:  * modification, are permitted provided that the following conditions
                     11:  * are met:
                     12:  * 1. Redistributions of source code must retain the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer.
                     14:  * 2. Redistributions in binary form must reproduce the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer in the
                     16:  *    documentation and/or other materials provided with the distribution.
                     17:  * 3. All advertising materials mentioning features or use of this software
                     18:  *    must display the following acknowledgement:
                     19:  *     This product includes software developed at Ludd, University of Lule}.
                     20:  * 4. The name of the author may not be used to endorse or promote products
                     21:  *    derived from this software without specific prior written permission
                     22:  *
                     23:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     24:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     25:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     26:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     27:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     28:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     29:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     30:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     31:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     32:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     33:  *
                     34:  *     kd.c,v 1.2 1994/05/05 04:46:51 gwr Exp $
                     35:  */
                     36:
                     37:  /* All bugs are subject to removal without further notice */
                     38:
                     39: #include <sys/param.h>
                     40: #include <sys/proc.h>
                     41: #include <sys/systm.h>
                     42: #include <sys/ioctl.h>
                     43: #include <sys/tty.h>
                     44: #include <sys/file.h>
                     45: #include <sys/conf.h>
                     46: #include <sys/device.h>
                     47: #include <sys/reboot.h>
                     48:
                     49: #include <dev/cons.h>
                     50:
                     51: #include <machine/mtpr.h>
                     52: #include <machine/sid.h>
                     53: #include <machine/cpu.h>
                     54: #include <machine/scb.h>
                     55: #include <machine/../vax/gencons.h>
                     56:
                     57: struct tty *gencn_tty[4];
                     58:
                     59: int consopened = 0;
                     60: int maxttys = 1;
                     61:
                     62: int pr_txcs[4] = {PR_TXCS, PR_TXCS1, PR_TXCS2, PR_TXCS3};
                     63: int pr_rxcs[4] = {PR_RXCS, PR_RXCS1, PR_RXCS2, PR_RXCS3};
                     64: int pr_txdb[4] = {PR_TXDB, PR_TXDB1, PR_TXDB2, PR_TXDB3};
                     65: int pr_rxdb[4] = {PR_RXDB, PR_RXDB1, PR_RXDB2, PR_RXDB3};
                     66:
                     67: cons_decl(gen);
                     68: cdev_decl(gencn);
                     69:
                     70: int gencnparam(struct tty *, struct termios *);
                     71: void gencnstart(struct tty *);
                     72: void gencnrint(void *);
                     73: void gencntint(void *);
                     74:
                     75: int
                     76: gencnopen(dev, flag, mode, p)
                     77:        dev_t   dev;
                     78:        int     flag, mode;
                     79:        struct proc *p;
                     80: {
                     81:        int unit;
                     82:        struct tty *tp;
                     83:
                     84:        unit = minor(dev);
                     85:        if (unit >= maxttys)
                     86:                return ENXIO;
                     87:
                     88:        if (gencn_tty[unit] == NULL)
                     89:                gencn_tty[unit] = ttymalloc();
                     90:
                     91:        tp = gencn_tty[unit];
                     92:
                     93:        tp->t_oproc = gencnstart;
                     94:        tp->t_param = gencnparam;
                     95:        tp->t_dev = dev;
                     96:        if ((tp->t_state & TS_ISOPEN) == 0) {
                     97:                ttychars(tp);
                     98:                tp->t_iflag = TTYDEF_IFLAG;
                     99:                tp->t_oflag = TTYDEF_OFLAG;
                    100:                tp->t_cflag = TTYDEF_CFLAG;
                    101:                tp->t_lflag = TTYDEF_LFLAG;
                    102:                tp->t_ispeed = tp->t_ospeed = TTYDEF_SPEED;
                    103:                gencnparam(tp, &tp->t_termios);
                    104:                ttsetwater(tp);
                    105:        } else if (tp->t_state & TS_XCLUDE && p->p_ucred->cr_uid != 0)
                    106:                return EBUSY;
                    107:        tp->t_state |= TS_CARR_ON;
                    108:        if (unit == 0)
                    109:                consopened = 1;
                    110:        mtpr(GC_RIE, pr_rxcs[unit]); /* Turn on interrupts */
                    111:        mtpr(GC_TIE, pr_txcs[unit]);
                    112:
                    113:         return ((*linesw[tp->t_line].l_open)(dev, tp));
                    114: }
                    115:
                    116: int
                    117: gencnclose(dev, flag, mode, p)
                    118:         dev_t dev;
                    119:         int flag, mode;
                    120:         struct proc *p;
                    121: {
                    122:        struct tty *tp = gencn_tty[minor(dev)];
                    123:
                    124:        if (minor(dev) == 0)
                    125:                consopened = 0;
                    126:        (*linesw[tp->t_line].l_close)(tp, flag);
                    127:        ttyclose(tp);
                    128:        return (0);
                    129: }
                    130:
                    131: struct tty *
                    132: gencntty(dev_t dev)
                    133: {
                    134:        return gencn_tty[minor(dev)];
                    135: }
                    136:
                    137: int
                    138: gencnread(dev_t dev, struct uio *uio, int flag)
                    139: {
                    140:        struct tty *tp = gencn_tty[minor(dev)];
                    141:
                    142:        return ((*linesw[tp->t_line].l_read)(tp, uio, flag));
                    143: }
                    144:
                    145: int
                    146: gencnwrite(dev_t dev, struct uio *uio, int flag)
                    147: {
                    148:        struct tty *tp = gencn_tty[minor(dev)];
                    149:
                    150:        return ((*linesw[tp->t_line].l_write)(tp, uio, flag));
                    151: }
                    152:
                    153: int
                    154: gencnioctl(dev, cmd, data, flag, p)
                    155:         dev_t dev;
                    156:         u_long cmd;
                    157:         caddr_t data;
                    158:         int flag;
                    159:         struct proc *p;
                    160: {
                    161:        struct tty *tp = gencn_tty[minor(dev)];
                    162:        int error;
                    163:
                    164:        error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, p);
                    165:        if (error >= 0)
                    166:                return error;
                    167:        error = ttioctl(tp, cmd, data, flag, p);
                    168:        if (error >= 0)
                    169:                return error;
                    170:
                    171:        return ENOTTY;
                    172: }
                    173:
                    174: void
                    175: gencnstart(struct tty *tp)
                    176: {
                    177:        struct clist *cl;
                    178:        int s, ch;
                    179:
                    180:        s = spltty();
                    181:        if (tp->t_state & (TS_BUSY|TS_TTSTOP|TS_TIMEOUT))
                    182:                goto out;
                    183:        cl = &tp->t_outq;
                    184:
                    185:        if(cl->c_cc){
                    186:                tp->t_state |= TS_BUSY;
                    187:                ch = getc(cl);
                    188:                mtpr(ch, pr_txdb[minor(tp->t_dev)]);
                    189:        } else {
                    190:                if (tp->t_state & TS_ASLEEP) {
                    191:                        tp->t_state &= ~TS_ASLEEP;
                    192:                        wakeup((caddr_t)cl);
                    193:                }
                    194:                selwakeup(&tp->t_wsel);
                    195:        }
                    196:
                    197: out:   splx(s);
                    198: }
                    199:
                    200: void
                    201: gencnrint(void *arg)
                    202: {
                    203:        struct tty *tp = *(struct tty **) arg;
                    204:        int unit = (struct tty **) arg - gencn_tty;
                    205:        int i;
                    206:
                    207:        i = mfpr(pr_rxdb[unit]) & 0377; /* Mask status flags etc... */
                    208:
                    209: #ifdef DDB
                    210:        if (tp->t_dev == cn_tab->cn_dev) {
                    211:                int j = kdbrint(i);
                    212:
                    213:                if (j == 1)     /* Escape received, just return */
                    214:                        return;
                    215:
                    216:                if (j == 2)     /* Second char wasn't 'D' */
                    217:                        (*linesw[tp->t_line].l_rint)(27, tp);
                    218:        }
                    219: #endif
                    220:
                    221:        (*linesw[tp->t_line].l_rint)(i, tp);
                    222:        return;
                    223: }
                    224:
                    225: int
                    226: gencnstop(struct tty *tp, int flag)
                    227: {
                    228:        return 0;
                    229: }
                    230:
                    231: void
                    232: gencntint(void *arg)
                    233: {
                    234:        struct tty *tp = *(struct tty **) arg;
                    235:
                    236:        tp->t_state &= ~TS_BUSY;
                    237:
                    238:        gencnstart(tp);
                    239: }
                    240:
                    241: int
                    242: gencnparam(struct tty *tp, struct termios *t)
                    243: {
                    244:        /* XXX - These are ignored... */
                    245:        tp->t_ispeed = t->c_ispeed;
                    246:        tp->t_ospeed = t->c_ospeed;
                    247:        tp->t_cflag = t->c_cflag;
                    248:        return 0;
                    249: }
                    250:
                    251: void
                    252: gencnprobe(struct consdev *cndev)
                    253: {
                    254:        if ((vax_cputype < VAX_TYP_UV2) || /* All older has MTPR console */
                    255:            (vax_boardtype == VAX_BTYP_9RR) ||
                    256:            (vax_boardtype == VAX_BTYP_630) ||
                    257:            (vax_boardtype == VAX_BTYP_650) ||
                    258:            (vax_boardtype == VAX_BTYP_660) ||
                    259:            (vax_boardtype == VAX_BTYP_670) ||
                    260:            (vax_boardtype == VAX_BTYP_1301) ||
                    261:            (vax_boardtype == VAX_BTYP_1305)) {
                    262:                cndev->cn_dev = makedev(25, 0);
                    263:                cndev->cn_pri = CN_NORMAL;
                    264:        }
                    265: }
                    266:
                    267: void
                    268: gencninit(struct consdev *cndev)
                    269: {
                    270:
                    271:        /* Allocate interrupt vectors */
                    272:        scb_vecalloc(SCB_G0R, gencnrint, &gencn_tty[0], SCB_ISTACK, NULL);
                    273:        scb_vecalloc(SCB_G0T, gencntint, &gencn_tty[0], SCB_ISTACK, NULL);
                    274:
                    275:        if (vax_cputype == VAX_TYP_8SS) {
                    276:                maxttys = 4;
                    277:                scb_vecalloc(SCB_G1R, gencnrint, &gencn_tty[1], SCB_ISTACK, NULL);
                    278:                scb_vecalloc(SCB_G1T, gencntint, &gencn_tty[1], SCB_ISTACK, NULL);
                    279:
                    280:                scb_vecalloc(SCB_G2R, gencnrint, &gencn_tty[2], SCB_ISTACK, NULL);
                    281:                scb_vecalloc(SCB_G2T, gencntint, &gencn_tty[2], SCB_ISTACK, NULL);
                    282:
                    283:                scb_vecalloc(SCB_G3R, gencnrint, &gencn_tty[3], SCB_ISTACK, NULL);
                    284:                scb_vecalloc(SCB_G3T, gencntint, &gencn_tty[3], SCB_ISTACK, NULL);
                    285:        }
                    286:        mtpr(0, PR_RXCS);
                    287:        mtpr(0, PR_TXCS);
                    288:        mtpr(0, PR_TBIA); /* ??? */
                    289: }
                    290:
                    291: void
                    292: gencnputc(dev_t dev, int ch)
                    293: {
                    294: #ifdef VAX8800
                    295:        /*
                    296:         * On KA88 we may get C-S/C-Q from the console.
                    297:         * XXX - this will cause a loop at spltty() in kernel and will
                    298:         * interfere with other console communication. Fortunately
                    299:         * kernel printf's are uncommon.
                    300:         */
                    301:        if (vax_cputype == VAX_TYP_8NN) {
                    302:                int s = spltty();
                    303:
                    304:                while (mfpr(PR_RXCS) & GC_DON) {
                    305:                        if ((mfpr(PR_RXDB) & 0x7f) == 19) {
                    306:                                while (1) {
                    307:                                        while ((mfpr(PR_RXCS) & GC_DON) == 0)
                    308:                                                ;
                    309:                                        if ((mfpr(PR_RXDB) & 0x7f) == 17)
                    310:                                                break;
                    311:                                }
                    312:                        }
                    313:                }
                    314:                splx(s);
                    315:        }
                    316: #endif
                    317:
                    318:        while ((mfpr(PR_TXCS) & GC_RDY) == 0) /* Wait until xmit ready */
                    319:                ;
                    320:        mtpr(ch, PR_TXDB);      /* xmit character */
                    321:        if(ch == 10)
                    322:                gencnputc(dev, 13); /* CR/LF */
                    323:
                    324: }
                    325:
                    326: int
                    327: gencngetc(dev_t dev)
                    328: {
                    329:        int i;
                    330:
                    331:        while ((mfpr(PR_RXCS) & GC_DON) == 0) /* Receive chr */
                    332:                ;
                    333:        i = mfpr(PR_RXDB) & 0x7f;
                    334:        if (i == 13)
                    335:                i = 10;
                    336:        return i;
                    337: }
                    338:
                    339: void
                    340: gencnpollc(dev_t dev, int pollflag)
                    341: {
                    342:        if (pollflag)  {
                    343:                mtpr(0, PR_RXCS);
                    344:                mtpr(0, PR_TXCS);
                    345:        } else if (consopened) {
                    346:                mtpr(GC_RIE, PR_RXCS);
                    347:                mtpr(GC_TIE, PR_TXCS);
                    348:        }
                    349: }

CVSweb