[BACK]Return to bugtty.c CVS log [TXT][DIR] Up to [local] / sys / arch / mvmeppc / dev

Annotation of sys/arch/mvmeppc/dev/bugtty.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: bugtty.c,v 1.10 2004/05/14 20:38:32 miod Exp $ */
                      2:
                      3: /* Copyright (c) 1998 Steve Murphree, Jr.
                      4:  * Copyright (c) 1995 Dale Rahn.
                      5:  * All rights reserved.
                      6:  *
                      7:  * Redistribution and use in source and binary forms, with or without
                      8:  * modification, are permitted provided that the following conditions
                      9:  * are met:
                     10:  * 1. Redistributions of source code must retain the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer.
                     12:  * 2. Redistributions in binary form must reproduce the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer in the
                     14:  *    documentation and/or other materials provided with the distribution.
                     15:  * 3. The name of the author may not be used to endorse or promote products
                     16:  *    derived from this software without specific prior written permission.
                     17:  *
                     18:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     19:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     20:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     21:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     22:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     23:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     24:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     25:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     26:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     27:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     28:  */
                     29:
                     30: #include <sys/param.h>
                     31: #include <sys/systm.h>
                     32: #include <sys/ioctl.h>
                     33: #include <sys/device.h>
                     34: #include <sys/tty.h>
                     35: #include <sys/proc.h>
                     36: #include <sys/uio.h>
                     37: #include <sys/queue.h>
                     38:
                     39: #include <machine/autoconf.h>
                     40: #include <machine/bugio.h>
                     41: #include <machine/conf.h>
                     42: #include <machine/cpu.h>
                     43:
                     44: #include <dev/cons.h>
                     45:
                     46: #include "bugtty.h"
                     47:
                     48: int bugttymatch(struct device *parent, void *self, void *aux);
                     49: void bugttyattach(struct device *parent, struct device *self, void *aux);
                     50:
                     51: struct cfattach bugtty_ca = {
                     52:         sizeof(struct device), bugttymatch, bugttyattach
                     53: };
                     54:
                     55: struct cfdriver bugtty_cd = {
                     56:         NULL, "bugtty", DV_TTY
                     57: };
                     58:
                     59: /* prototypes */
                     60: cons_decl(bugtty);
                     61: cdev_decl(bugtty);
                     62:
                     63: int bugttymctl(dev_t dev, int bits, int how);
                     64: int bugttyparam(struct tty *tp, struct termios *tm);
                     65: void bugtty_chkinput(void);
                     66:
                     67: #define DIALOUT(x) ((x) & 0x80)
                     68: #define SWFLAGS(dev) (bugttyswflags | (DIALOUT(dev) ? TIOCFLAG_SOFTCAR : 0))
                     69:
                     70: #define BUGBUF 80
                     71: char bugtty_ibuffer[BUGBUF+1];
                     72: volatile char *pinchar = bugtty_ibuffer;
                     73: char bug_obuffer[BUGBUF+1];
                     74:
                     75: #define        BUGTTYS 4
                     76: struct tty *bugtty_tty[BUGTTYS];
                     77:
                     78: int
                     79: bugttymatch(parent, self, aux)
                     80:        struct device *parent;
                     81:        void *self;
                     82:        void *aux;
                     83: {
                     84:        struct confargs *ca = aux;
                     85:
                     86:        if (strcmp(ca->ca_name, bugtty_cd.cd_name) != 0)
                     87:                return (0);
                     88:
                     89:        return (1);
                     90: }
                     91:
                     92: void
                     93: bugttyattach(parent, self, aux)
                     94:        struct device *parent;
                     95:        struct device *self;
                     96:        void *aux;
                     97: {
                     98:        printf(": fallback console\n");
                     99: }
                    100:
                    101: #define BUGTTYUNIT(x) ((x) & (0x7f))
                    102: void bugttyoutput(struct tty *tp);
                    103:
                    104: int bugttydefaultrate = TTYDEF_SPEED;
                    105: int bugttyswflags;
                    106:
                    107: struct tty *
                    108: bugttytty(dev)
                    109:        dev_t dev;
                    110: {
                    111:        int unit;
                    112:        unit = BUGTTYUNIT(dev);
                    113:        if (unit >= BUGTTYS) {
                    114:                return (NULL);
                    115:        }
                    116:        return bugtty_tty[unit];
                    117: }
                    118:
                    119: int
                    120: bugttymctl(dev, bits, how)
                    121:        dev_t dev;
                    122:        int bits, how;
                    123: {
                    124:        int s;
                    125:
                    126:        /*printf("mctl: dev %x, bits %x, how %x,",dev, bits, how);*/
                    127:
                    128:        /* settings are currently ignored */
                    129:        s = spltty();
                    130:        switch (how) {
                    131:        case DMSET:
                    132:                break;
                    133:        case DMBIC:
                    134:                break;
                    135:        case DMBIS:
                    136:                break;
                    137:        case DMGET:
                    138:                break;
                    139:        }
                    140:        splx(s);
                    141:
                    142:        bits = 0;
                    143:        /* proper defaults? */
                    144:        bits |= TIOCM_DTR;
                    145:        bits |= TIOCM_RTS;
                    146:        bits |= TIOCM_CTS;
                    147:        bits |= TIOCM_CD;
                    148:        /* bits |= TIOCM_RI; */
                    149:        bits |= TIOCM_DSR;
                    150:
                    151:        /* printf("retbits %x\n", bits); */
                    152:        return (bits);
                    153: }
                    154:
                    155: int
                    156: bugttyopen(dev, flag, mode, p)
                    157:        dev_t dev;
                    158:        int flag, mode;
                    159:        struct proc *p;
                    160: {
                    161:        int s, unit = BUGTTYUNIT(dev);
                    162:        struct tty *tp;
                    163:
                    164:        s = spltty();
                    165:        if (bugtty_tty[unit]) {
                    166:                tp = bugtty_tty[unit];
                    167:        } else {
                    168:                tp = bugtty_tty[unit] = ttymalloc();
                    169:        }
                    170:        tp->t_oproc = bugttyoutput;
                    171:        tp->t_param = NULL;
                    172:        tp->t_dev = dev;
                    173:
                    174:        if ((tp->t_state & TS_ISOPEN) == 0) {
                    175:                tp->t_state |= TS_WOPEN;
                    176:                ttychars(tp);
                    177:                if (tp->t_ispeed == 0) {
                    178:                        /*
                    179:                         * only when cleared do we reset to defaults.
                    180:                         */
                    181:                        tp->t_iflag = TTYDEF_IFLAG;
                    182:                        tp->t_oflag = TTYDEF_OFLAG;
                    183:                        tp->t_cflag = TTYDEF_CFLAG;
                    184:                        tp->t_lflag = TTYDEF_LFLAG;
                    185:                        tp->t_ispeed = tp->t_ospeed = bugttydefaultrate;
                    186:                }
                    187:                /* bugtty does not have carrier */
                    188:                tp->t_cflag |= CLOCAL;
                    189:                /*
                    190:                 * do these all the time
                    191:                 */
                    192:                if (bugttyswflags & TIOCFLAG_CLOCAL)
                    193:                        tp->t_cflag |= CLOCAL;
                    194:                if (bugttyswflags & TIOCFLAG_CRTSCTS)
                    195:                        tp->t_cflag |= CRTSCTS;
                    196:                if (bugttyswflags & TIOCFLAG_MDMBUF)
                    197:                        tp->t_cflag |= MDMBUF;
                    198:                bugttyparam(tp, &tp->t_termios);
                    199:                ttsetwater(tp);
                    200:
                    201:                (void)bugttymctl(dev, TIOCM_DTR | TIOCM_RTS, DMSET);
                    202:                /*
                    203:                if ((SWFLAGS(dev) & TIOCFLAG_SOFTCAR) ||
                    204:                    (bugttymctl(dev, 0, DMGET) & TIOCM_CD))
                    205:                        tp->t_state |= TS_CARR_ON;
                    206:                else
                    207:                        tp->t_state &= ~TS_CARR_ON;
                    208:                */
                    209:                tp->t_state |= TS_CARR_ON;
                    210:        } else if (tp->t_state & TS_XCLUDE && p->p_ucred->cr_uid != 0) {
                    211:                splx(s);
                    212:                return (EBUSY);
                    213:        }
                    214:
                    215:        /*
                    216:         * if NONBLOCK requested, ignore carrier
                    217:         */
                    218: /*
                    219:        if (flag & O_NONBLOCK)
                    220:                goto done;
                    221: */
                    222:
                    223:        splx(s);
                    224:        /*
                    225:         * Reset the tty pointer, as there could have been a dialout
                    226:         * use of the tty with a dialin open waiting.
                    227:         */
                    228:        tp->t_dev = dev;
                    229:        return ((*linesw[tp->t_line].l_open)(dev, tp));
                    230: }
                    231:
                    232: int
                    233: bugttyparam(tp, tm)
                    234:        struct tty *tp;
                    235:        struct termios *tm;
                    236: {
                    237:        return (0);
                    238: }
                    239:
                    240: void
                    241: bugttyoutput(tp)
                    242:        struct tty *tp;
                    243: {
                    244:        int cc, s, cnt;
                    245:
                    246:        /* only supports one unit */
                    247:
                    248:        if ((tp->t_state & TS_ISOPEN) == 0)
                    249:                return;
                    250:
                    251:        s = spltty();
                    252:        cc = tp->t_outq.c_cc;
                    253:        while (cc > 0) {
                    254:                cnt = min(BUGBUF, cc);
                    255:                cnt = q_to_b(&tp->t_outq, bug_obuffer, cnt);
                    256:                mvmeprom_outstr(bug_obuffer, &bug_obuffer[cnt]);
                    257:                cc -= cnt;
                    258:        }
                    259:        splx(s);
                    260: }
                    261:
                    262: int
                    263: bugttyclose(dev, flag, mode, p)
                    264:        dev_t dev;
                    265:        int flag, mode;
                    266:        struct proc *p;
                    267: {
                    268:        int unit = BUGTTYUNIT(dev);
                    269:        struct tty *tp = bugtty_tty[unit];
                    270:
                    271:        (*linesw[tp->t_line].l_close)(tp, flag);
                    272:
                    273:        ttyclose(tp);
                    274: #if 0
                    275:        bugtty_tty[unit] = NULL;
                    276: #endif
                    277:        return (0);
                    278: }
                    279:
                    280: int
                    281: bugttyread(dev, uio, flag)
                    282:        dev_t dev;
                    283:        struct uio *uio;
                    284:        int flag;
                    285: {
                    286:        struct tty *tp;
                    287:
                    288:        if ((tp = bugtty_tty[BUGTTYUNIT(dev)]) == NULL)
                    289:                return (ENXIO);
                    290:        return ((*linesw[tp->t_line].l_read)(tp, uio, flag));
                    291: }
                    292:
                    293: /* only to be called at splclk() */
                    294: void
                    295: bugtty_chkinput()
                    296: {
                    297:        struct tty *tp;
                    298:
                    299:        tp = bugtty_tty[0]; /* assumes console on the first port... */
                    300:        if (tp == NULL)
                    301:                return;
                    302:
                    303:        while (mvmeprom_instat() != 0) {
                    304:                u_char c = mvmeprom_getchar() & 0xff;
                    305:                (*linesw[tp->t_line].l_rint)(c, tp);
                    306:        }
                    307: }
                    308:
                    309: int
                    310: bugttywrite(dev, uio, flag)
                    311:        dev_t dev;
                    312:        struct uio *uio;
                    313:        int flag;
                    314: {
                    315: #if 0
                    316:        /* bypass tty output routines. */
                    317:        int i, cnt, s;
                    318:        int oldoff;
                    319:
                    320:        s = spltty();
                    321:        oldoff = uio->uio_offset;
                    322:        do  {
                    323:                uiomove(bug_obuffer, BUGBUF, uio);
                    324:                bugoutstr(bug_obuffer, &bug_obuffer[uio->uio_offset - oldoff]);
                    325:                oldoff = uio->uio_offset;
                    326:        } while (uio->uio_resid != 0);
                    327:        splx(s);
                    328:
                    329:        return (0);
                    330: #else
                    331:        struct tty *tp;
                    332:        if((tp = bugtty_tty[BUGTTYUNIT(dev)]) == NULL)
                    333:                return (ENXIO);
                    334:        return ((*linesw[tp->t_line].l_write)(tp, uio, flag));
                    335: #endif
                    336: }
                    337:
                    338: int
                    339: bugttyioctl(dev, cmd, data, flag, p)
                    340:        dev_t dev;
                    341:        u_long cmd;
                    342:        caddr_t data;
                    343:        int flag;
                    344:        struct proc *p;
                    345: {
                    346:        int unit = BUGTTYUNIT(dev);
                    347:        struct tty *tp = bugtty_tty[unit];
                    348:        int error;
                    349:
                    350:        if (!tp)
                    351:                return (ENXIO);
                    352:
                    353:        error = (*linesw[tp->t_line].l_ioctl)(tp, cmd, data, flag, p);
                    354:        if (error >= 0)
                    355:                return (error);
                    356:
                    357:        error = ttioctl(tp, cmd, data, flag, p);
                    358:        if (error >= 0)
                    359:                return (error);
                    360:
                    361:        switch (cmd) {
                    362:        case TIOCSBRK:
                    363:                /* */
                    364:                break;
                    365:
                    366:        case TIOCCBRK:
                    367:                /* */
                    368:                break;
                    369:
                    370:        case TIOCSDTR:
                    371:                (void) bugttymctl(dev, TIOCM_DTR | TIOCM_RTS, DMBIS);
                    372:                break;
                    373:
                    374:        case TIOCCDTR:
                    375:                (void) bugttymctl(dev, TIOCM_DTR | TIOCM_RTS, DMBIC);
                    376:                break;
                    377:
                    378:        case TIOCMSET:
                    379:                (void) bugttymctl(dev, *(int *) data, DMSET);
                    380:                break;
                    381:
                    382:        case TIOCMBIS:
                    383:                (void) bugttymctl(dev, *(int *) data, DMBIS);
                    384:                break;
                    385:
                    386:        case TIOCMBIC:
                    387:                (void) bugttymctl(dev, *(int *) data, DMBIC);
                    388:                break;
                    389:
                    390:        case TIOCMGET:
                    391:                *(int *)data = bugttymctl(dev, 0, DMGET);
                    392:                break;
                    393:        case TIOCGFLAGS:
                    394:                *(int *)data = SWFLAGS(dev);
                    395:                break;
                    396:        case TIOCSFLAGS:
                    397:                error = suser(p, 0);
                    398:                if (error != 0)
                    399:                        return (EPERM);
                    400:
                    401:                bugttyswflags = *(int *)data;
                    402:                bugttyswflags &= /* only allow valid flags */
                    403:                    (TIOCFLAG_SOFTCAR | TIOCFLAG_CLOCAL | TIOCFLAG_CRTSCTS);
                    404:                break;
                    405:        default:
                    406:                return (ENOTTY);
                    407:        }
                    408:
                    409:        return (0);
                    410: }
                    411:
                    412: int
                    413: bugttystop(tp, flag)
                    414:        struct tty *tp;
                    415:        int flag;
                    416: {
                    417:        int s;
                    418:
                    419:        s = spltty();
                    420:        if (tp->t_state & TS_BUSY) {
                    421:                if ((tp->t_state & TS_TTSTOP) == 0)
                    422:                        tp->t_state |= TS_FLUSH;
                    423:        }
                    424:        splx(s);
                    425:        return (0);
                    426: }
                    427:
                    428: /*
                    429:  * bugtty is the last possible choice for a console device.
                    430:  */
                    431: void
                    432: bugttycnprobe(cp)
                    433:        struct consdev *cp;
                    434: {
                    435:        int maj;
                    436:
                    437:        /* locate the major number */
                    438:        for (maj = 0; maj < nchrdev; maj++)
                    439:                if (cdevsw[maj].d_open == bugttyopen)
                    440:                        break;
                    441:
                    442:        cp->cn_dev = makedev(maj, 0);
                    443:        cp->cn_pri = CN_NORMAL;
                    444: }
                    445:
                    446: void
                    447: bugttycninit(cp)
                    448:        struct consdev *cp;
                    449: {
                    450:        /* Nothing to do */
                    451: }
                    452:
                    453: int
                    454: bugttycngetc(dev)
                    455:        dev_t dev;
                    456: {
                    457:        return (mvmeprom_getchar());
                    458: }
                    459:
                    460: void
                    461: bugttycnputc(dev, c)
                    462:        dev_t dev;
                    463:        char c;
                    464: {
                    465:        mvmeprom_outchar(c);
                    466: }

CVSweb