Annotation of 40BSD/sys/dev/cons.c, revision 1.1.1.1

1.1       root        1: /*     cons.c  4.2     11/9/80 */
                      2: 
                      3: /*
                      4:  * Vax console driver and floppy interface
                      5:  */
                      6: #include "../h/param.h"
                      7: #include "../h/conf.h"
                      8: #include "../h/dir.h"
                      9: #include "../h/user.h"
                     10: #include "../h/tty.h"
                     11: #include "../h/systm.h"
                     12: #include "../h/cons.h"
                     13: #include "../h/mtpr.h"
                     14: #include "../h/mx.h"
                     15: 
                     16: /*
                     17:  * When running dz's using only SAE (silo alarm) on input
                     18:  * it is necessary to call dzrint() at clock interrupt time.
                     19:  * This is unsafe unless spl5()s in tty code are changed to
                     20:  * spl6()s to block clock interrupts.  Note that the dh driver
                     21:  * currently in use works the same way as the dz, even though
                     22:  * we could try to more intelligently manage its silo.
                     23:  * Thus don't take this out if you have no dz's unless you
                     24:  * change clock.c and dhtimer().
                     25:  */
                     26: #define        spl5    spl6
                     27: 
                     28: #define        NL1     000400
                     29: #define        NL2     001000
                     30: #define        CR2     020000
                     31: #define        FF1     040000
                     32: #define        TAB1    002000
                     33: 
                     34: struct tty cons;
                     35: int    cnstart();
                     36: int    ttrstrt();
                     37: char   partab[];
                     38: 
                     39: /*ARGSUSED*/
                     40: cnopen(dev, flag)
                     41: dev_t dev;
                     42: {
                     43:        register struct tty *tp;
                     44: 
                     45:        tp = &cons;
                     46:        tp->t_oproc = cnstart;
                     47:        tp->t_iproc = NULL;
                     48:        if ((tp->t_state&ISOPEN) == 0) {
                     49:                ttychars(tp);
                     50:                tp->t_state = ISOPEN|CARR_ON;
                     51:                tp->t_flags = EVENP|ECHO|XTABS|CRMOD;
                     52:        }
                     53:        if (tp->t_state&XCLUDE && u.u_uid != 0) {
                     54:                u.u_error = EBUSY;
                     55:                return;
                     56:        }
                     57:        mtpr(RXCS, mfpr(RXCS)|RXCS_IE);
                     58:        mtpr(TXCS, mfpr(TXCS)|TXCS_IE);
                     59:        (*linesw[tp->t_line].l_open)(dev, tp);
                     60: }
                     61: 
                     62: /*ARGSUSED*/
                     63: cnclose(dev)
                     64: dev_t dev;
                     65: {
                     66:        register struct tty *tp;
                     67: 
                     68:        tp = &cons;
                     69:        (*linesw[tp->t_line].l_close)(tp);
                     70:        ttyclose(tp);
                     71: }
                     72: 
                     73: /*ARGSUSED*/
                     74: cnread(dev)
                     75: dev_t dev;
                     76: {
                     77:        register struct tty *tp;
                     78: 
                     79:        tp = &cons;
                     80:        (*linesw[tp->t_line].l_read)(tp);
                     81: }
                     82: 
                     83: /*ARGSUSED*/
                     84: cnwrite(dev)
                     85: dev_t dev;
                     86: {
                     87:        register struct tty *tp;
                     88: 
                     89:        tp = &cons;
                     90:        (*linesw[tp->t_line].l_write)(tp);
                     91: }
                     92: 
                     93: /*
                     94:  * Got a level-20 receive interrupt -
                     95:  * the LSI wants to give us a character.
                     96:  * Catch the character, and see who it goes to.
                     97:  */
                     98: /*ARGSUSED*/
                     99: cnrint(dev)
                    100: dev_t dev;
                    101: {
                    102:        register int c;
                    103:        register struct tty *tp;
                    104: 
                    105:        c = mfpr(RXDB);
                    106:        if (c&RXDB_ID) {
                    107:                cnrfl(c);
                    108:                return;
                    109:        }
                    110:        tp = &cons;
                    111:        (*linesw[tp->t_line].l_rint)(c, tp);
                    112: }
                    113: 
                    114: /*ARGSUSED*/
                    115: cnioctl(dev, cmd, addr, flag)
                    116: dev_t dev;
                    117: caddr_t addr;
                    118: {
                    119:        register struct tty *tp;
                    120:  
                    121:        tp = &cons;
                    122:        cmd = (*linesw[tp->t_line].l_ioctl)(tp, cmd, addr);
                    123:        if (cmd == 0)
                    124:                return;
                    125:        if (ttioctl(cmd, tp, addr, dev, flag) == 0)
                    126:                u.u_error = ENOTTY;
                    127: }
                    128: 
                    129: /*
                    130:  * Got a level-20 transmission interrupt -
                    131:  * the LSI wants another character.  First,
                    132:  * see if we can send something to the typewriter.
                    133:  * If not, try the floppy.
                    134:  */
                    135: /*ARGSUSED*/
                    136: cnxint(dev)
                    137: dev_t dev;
                    138: {
                    139:        register struct tty *tp;
                    140: 
                    141:        tp = &cons;
                    142:        tp->t_state &= ~BUSY;
                    143:        if (tp->t_line)
                    144:                (*linesw[tp->t_line].l_start)(tp);
                    145:        else
                    146:                cnstart(tp);
                    147:        if ((tp->t_state & BUSY) == 0)
                    148:                conxfl();
                    149: }
                    150: 
                    151: cnstart(tp)
                    152: register struct tty *tp;
                    153: {
                    154:        register c;
                    155:        register s;
                    156: 
                    157:        s = spl5();
                    158:        if (tp->t_state & (TIMEOUT|BUSY|TTSTOP))
                    159:                goto out;
                    160:        if (tp->t_state&ASLEEP && tp->t_outq.c_cc <= TTLOWAT(tp)) {
                    161:                tp->t_state &= ~ASLEEP;
                    162:                if (tp->t_chan)
                    163:                        mcstart(tp->t_chan, (caddr_t)&tp->t_outq);
                    164:                else
                    165:                        wakeup((caddr_t)&tp->t_outq);
                    166:        }
                    167:        if (tp->t_outq.c_cc == 0)
                    168:                goto out;
                    169:        if ((mfpr(TXCS)&TXCS_RDY) == 0)
                    170:                return;
                    171:        if ((c=getc(&tp->t_outq)) >= 0) {
                    172:                if (tp->t_flags&RAW)
                    173:                        mtpr(TXDB, c&0xff);
                    174:                else if (c<=0177)
                    175:                        mtpr(TXDB, (c | (partab[c]&0200))&0xff);
                    176:                else {
                    177:                        timeout(ttrstrt, (caddr_t)tp, (c&0177));
                    178:                        tp->t_state |= TIMEOUT;
                    179:                        goto out;
                    180:                }
                    181:        }
                    182:        tp->t_state |= BUSY;
                    183:     out:
                    184:        splx(s);
                    185: }
                    186: 
                    187: /*
                    188:  * Print a character on console.
                    189:  * Attempts to save and restore device
                    190:  * status.
                    191:  */
                    192: cnputc(c)
                    193: register c;
                    194: {
                    195:        register s, timo;
                    196: 
                    197:        timo = 30000;
                    198:        /*
                    199:         * Try waiting for the console tty to come ready,
                    200:         * otherwise give up after a reasonable time.
                    201:         */
                    202:        while((mfpr(TXCS)&TXCS_RDY) == 0)
                    203:                if(--timo == 0)
                    204:                        break;
                    205:        if(c == 0)
                    206:                return;
                    207:        s = mfpr(TXCS);
                    208:        mtpr(TXCS, 0);
                    209:        mtpr(TXDB, c&0xff);
                    210:        if(c == '\n')
                    211:                cnputc('\r');
                    212:        cnputc(0);
                    213:        mtpr(TXCS, s);
                    214: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.