Annotation of Gnu-Mach/chips/dz_hdw.c, revision 1.1

1.1     ! root        1: /* 
        !             2:  * Mach Operating System
        !             3:  * Copyright (c) 1991,1990,1989 Carnegie Mellon University
        !             4:  * All Rights Reserved.
        !             5:  * 
        !             6:  * Permission to use, copy, modify and distribute this software and its
        !             7:  * documentation is hereby granted, provided that both the copyright
        !             8:  * notice and this permission notice appear in all copies of the
        !             9:  * software, derivative works or modified versions, and any portions
        !            10:  * thereof, and that both notices appear in supporting documentation.
        !            11:  * 
        !            12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
        !            13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
        !            14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
        !            15:  * 
        !            16:  * Carnegie Mellon requests users of this software to return to
        !            17:  * 
        !            18:  *  Software Distribution Coordinator  or  [email protected]
        !            19:  *  School of Computer Science
        !            20:  *  Carnegie Mellon University
        !            21:  *  Pittsburgh PA 15213-3890
        !            22:  * 
        !            23:  * any improvements or extensions that they make and grant Carnegie Mellon
        !            24:  * the rights to redistribute these changes.
        !            25:  */
        !            26: /*
        !            27:  *     File: dz_hdw.c
        !            28:  *     Author: Alessandro Forin, Carnegie Mellon University
        !            29:  *     Date:   9/90
        !            30:  *
        !            31:  *     Hardware-level operations for the DZ Serial Line Driver
        !            32:  */
        !            33: 
        !            34: #include <dz_.h>
        !            35: #if    NDZ_ > 0
        !            36: #include <bm.h>
        !            37: #include <platforms.h>
        !            38: 
        !            39: #include <mach_kdb.h>
        !            40: 
        !            41: #include <machine/machspl.h>           /* spl definitions */
        !            42: #include <device/io_req.h>
        !            43: #include <device/tty.h>
        !            44: 
        !            45: #include <chips/busses.h>
        !            46: #include <chips/screen_defs.h>
        !            47: #include <chips/serial_defs.h>
        !            48: 
        !            49: #include <chips/dz_7085.h>
        !            50: 
        !            51: 
        !            52: #ifdef DECSTATION
        !            53: #include <mips/mips_cpu.h>
        !            54: #include <mips/PMAX/kn01.h>
        !            55: #define        DZ_REGS_DEFAULT         (vm_offset_t)PHYS_TO_K1SEG(KN01_SYS_DZ)
        !            56: #define        PAD(n)                  char n[6];
        !            57: #endif /*DECSTATION*/
        !            58: 
        !            59: #ifdef VAXSTATION
        !            60: #define        DZ_REGS_DEFAULT         0
        !            61: #define wbflush()
        !            62: #define check_memory(addr,dow)  ((dow) ? wbadaddr(addr,4) : badaddr(addr,4))
        !            63: #define        PAD(n)                  char n[2];
        !            64: #endif /*VAXSTATION*/
        !            65: 
        !            66: #ifndef        PAD
        !            67: #define        PAD(n)
        !            68: #endif
        !            69: 
        !            70: typedef struct {
        !            71:        volatile unsigned short dz_csr;         /* Control and Status */
        !            72:                                                                PAD(pad0)
        !            73:        volatile unsigned short dz_rbuf;        /* Rcv buffer (RONLY) */
        !            74:                                                                PAD(pad1)
        !            75:        volatile unsigned short dz_tcr;         /* Xmt control (R/W)*/
        !            76:                                                                PAD(pad2)
        !            77:        volatile unsigned short dz_tbuf;        /* Xmt buffer (WONLY)*/
        !            78: #      define                  dz_lpr dz_rbuf  /* Line parameters (WONLY)*/
        !            79: #      define                  dz_msr dz_tbuf  /* Modem status (RONLY)*/
        !            80:                                                                PAD(pad3)
        !            81: } dz_padded_regmap_t;
        !            82: 
        !            83: 
        !            84: /* this is ok both for rcv (char) and xmt (csr) */
        !            85: #define        LINEOF(x)       (((x) >> 8) & 0x3)
        !            86: 
        !            87: /*
        !            88:  * Driver status
        !            89:  */
        !            90: struct dz7085_softc {
        !            91:        dz_padded_regmap_t      *regs;
        !            92:        unsigned short  breaks;
        !            93:        unsigned short  fake;   /* missing rs232 bits */
        !            94:        int             polling_mode;
        !            95:        unsigned short  prev_msr;
        !            96:        char            softCAR;
        !            97: } dz7085_softc_data[NDZ_];
        !            98: 
        !            99: typedef struct dz7085_softc *dz7085_softc_t;
        !           100: 
        !           101: dz7085_softc_t dz7085_softc[NDZ_];
        !           102: 
        !           103: static void            check_car();
        !           104: static void            check_ring();
        !           105: 
        !           106: dz7085_softCAR(unit, line, on)
        !           107: {
        !           108:        if (on)
        !           109:                dz7085_softc[unit]->softCAR |= 1<<line;
        !           110:        else
        !           111:                dz7085_softc[unit]->softCAR &= ~(1 << line);
        !           112: }
        !           113: 
        !           114: static
        !           115: short  dz7085_speeds[] =
        !           116:        { 0, DZ_LPAR_50, DZ_LPAR_75, DZ_LPAR_110, DZ_LPAR_134_5, DZ_LPAR_150,
        !           117:          0, DZ_LPAR_300, DZ_LPAR_600, DZ_LPAR_1200, DZ_LPAR_1800, DZ_LPAR_2400,
        !           118:          DZ_LPAR_4800, DZ_LPAR_9600, DZ_LPAR_MAX_SPEED, 0 };
        !           119: 
        !           120: 
        !           121: /*
        !           122:  * Definition of the driver for the auto-configuration program.
        !           123:  */
        !           124: 
        !           125: int    dz7085_probe(), dz7085_intr();
        !           126: static void    dz7085_attach();
        !           127: 
        !           128: vm_offset_t    dz7085_std[NDZ_] = { DZ_REGS_DEFAULT, };
        !           129: struct bus_device *dz7085_info[NDZ_];
        !           130: struct bus_driver dz_driver = 
        !           131:         { dz7085_probe, 0, dz7085_attach, 0, dz7085_std, "dz", dz7085_info,};
        !           132: 
        !           133: /*
        !           134:  * Adapt/Probe/Attach functions
        !           135:  */
        !           136: 
        !           137: static boolean_t       dz7085_full_modem = FALSE;
        !           138: boolean_t              dz7085_uses_modem_control = FALSE;/* patch this with adb */
        !           139: 
        !           140: set_dz_address( unit, regs, has_modem)
        !           141:        vm_offset_t             regs;
        !           142:        boolean_t       has_modem;
        !           143: {
        !           144:        extern int      dz7085_probe(), dz7085_param(), dz7085_start(),
        !           145:                        dz7085_putc(), dz7085_getc(),
        !           146:                        dz7085_pollc(), dz7085_mctl(), dz7085_softCAR();
        !           147: 
        !           148:        dz7085_std[unit] = regs;
        !           149:        dz7085_full_modem = has_modem & dz7085_uses_modem_control;
        !           150: 
        !           151:        /* Do this here */
        !           152:        console_probe           = dz7085_probe;
        !           153:        console_param           = dz7085_param;
        !           154:        console_start           = dz7085_start;
        !           155:        console_putc            = dz7085_putc;
        !           156:        console_getc            = dz7085_getc;
        !           157:        console_pollc           = dz7085_pollc;
        !           158:        console_mctl            = dz7085_mctl;
        !           159:        console_softCAR         = dz7085_softCAR;
        !           160: 
        !           161: }
        !           162: 
        !           163: dz7085_probe( xxx, ui)
        !           164:        struct bus_device *ui;
        !           165: {
        !           166:        int             unit = ui->unit;
        !           167:        dz7085_softc_t      sc;
        !           168:        register int    cntr;
        !           169:        register dz_padded_regmap_t     *regs;
        !           170: 
        !           171:        static int probed_once = 0;
        !           172: 
        !           173:        regs = (dz_padded_regmap_t *)dz7085_std[unit];  /* like the old days! */
        !           174:        if (regs == 0)
        !           175:                return 0;
        !           176:        /*
        !           177:         * If this is not there we are toast 
        !           178:         */
        !           179:        if (check_memory(regs, 0))
        !           180:                return 0;
        !           181: 
        !           182:        if (probed_once++)
        !           183:                return 1;
        !           184: 
        !           185:        sc = &dz7085_softc_data[unit];
        !           186:        dz7085_softc[unit] = sc;
        !           187:        sc->regs = regs;
        !           188: 
        !           189:        for (cntr = unit*NDZ_LINE; cntr < NDZ_LINE*(unit+1); cntr++) {
        !           190:                console_tty[cntr]->t_addr = (char*)regs;
        !           191:                console_tty[cntr]->t_state |= TS_MIN;
        !           192:        }
        !           193: 
        !           194:        /* pmaxen et al. lack many modem bits */
        !           195:        dz7085_set_modem_control(sc, dz7085_full_modem);
        !           196: 
        !           197:        regs->dz_tcr = 0;/* disable all lines, drop RTS,DTR */
        !           198:        return 1;
        !           199: }
        !           200: 
        !           201: boolean_t dz7085_timer_started = FALSE;
        !           202: 
        !           203: static void
        !           204: dz7085_attach(ui)
        !           205:        register struct bus_device *ui;
        !           206: {
        !           207:        int unit = ui->unit;
        !           208:        extern dz7085_scan();
        !           209:        extern int tty_inq_size;
        !           210:        int i;
        !           211: 
        !           212:        /* We only have 4 ttys, but always at 9600
        !           213:         * Give em a lot of room
        !           214:         */
        !           215:        tty_inq_size = 2048;
        !           216:        for (i = 0; i < (NDZ_*NDZ_LINE); i++)
        !           217:                ttychars(console_tty[i]);
        !           218: 
        !           219:        if (!dz7085_timer_started) {
        !           220:                dz7085_timer_started = TRUE;
        !           221:                dz7085_scan();
        !           222:        }
        !           223: 
        !           224: #if    NBM > 0
        !           225:        if (SCREEN_ISA_CONSOLE()) {
        !           226:                printf("\n sl0: "); lk201_attach(0, unit);
        !           227:                printf("\n sl1: "); mouse_attach(0, unit);
        !           228:                printf("\n sl2: \n sl3: ");
        !           229:                if (rcline == 3) printf("( rconsole )");
        !           230:        } else {
        !           231: #endif /*NBM > 0*/
        !           232:                printf("\n sl0:\n sl1:\n sl2:\n sl3: ( alternate console )");
        !           233: #if    NBM > 0
        !           234:        }
        !           235: #endif
        !           236: }
        !           237: 
        !           238: /*
        !           239:  * Would you like to make a phone call ?
        !           240:  */
        !           241: dz7085_set_modem_control(sc, on)
        !           242:        dz7085_softc_t      sc;
        !           243:        boolean_t       on;
        !           244: {
        !           245:        if (on)
        !           246:                /* your problem if the hardware then is broke */
        !           247:                sc->fake = 0;
        !           248:        else
        !           249:                sc->fake = DZ_MSR_CTS3|DZ_MSR_DSR3|DZ_MSR_CD3|
        !           250:                           DZ_MSR_CTS2|DZ_MSR_CD2;
        !           251: }
        !           252: 
        !           253: /*
        !           254:  * Polled I/O (debugger)
        !           255:  */
        !           256: dz7085_pollc(unit, on)
        !           257:        boolean_t               on;
        !           258: {
        !           259:        dz7085_softc_t          sc = dz7085_softc[unit];
        !           260: 
        !           261:        if (on) {
        !           262:                sc->polling_mode++;
        !           263: #if    NBM > 0
        !           264:                screen_on_off(unit, TRUE);
        !           265: #endif NBM > 0
        !           266:        } else
        !           267:                sc->polling_mode--;
        !           268: }
        !           269: 
        !           270: /*
        !           271:  * Interrupt routine
        !           272:  */
        !           273: dz_intr(unit,spllevel)
        !           274:        spl_t   spllevel;
        !           275: {
        !           276:        dz7085_softc_t          sc = dz7085_softc[unit];
        !           277:        register dz_padded_regmap_t     *regs = sc->regs;
        !           278:        register short          csr;
        !           279: 
        !           280:        csr = regs->dz_csr;
        !           281: 
        !           282:        if (csr & DZ_CSR_TRDY) {
        !           283:                register int             c;
        !           284: 
        !           285:                c = cons_simple_tint(unit*NDZ_LINE + LINEOF(csr), FALSE);
        !           286:                if (c == -1) {
        !           287:                        /* no more data for this line */
        !           288:                        regs->dz_tcr &= ~(1 << LINEOF(csr));
        !           289:                        c = cons_simple_tint(unit*NDZ_LINE + LINEOF(csr), TRUE);
        !           290:                        /* because funny race possible ifnot */
        !           291:                }
        !           292:                if (c != -1) {
        !           293:                        regs->dz_tbuf = (c & 0xff) | sc->breaks;
        !           294:                        /* and leave it enabled */
        !           295:                }
        !           296:        }
        !           297:        if (sc->polling_mode)
        !           298:                return;
        !           299: 
        !           300:        while (regs->dz_csr & DZ_CSR_RDONE) {
        !           301:                short           c = regs->dz_rbuf;
        !           302:                spl_t           oldspl;
        !           303: 
        !           304: #ifdef DECSTATION
        !           305:                oldspl = splhigh();
        !           306:                splx(spllevel);
        !           307: #endif /*DECSTATION*/
        !           308:                cons_simple_rint(unit*NDZ_LINE+LINEOF(c), LINEOF(c),
        !           309:                                c&0xff, c&0xff00);
        !           310: #ifdef DECSTATION
        !           311:                splx(oldspl);
        !           312: #endif /*DECSTATION*/
        !           313:        }
        !           314: }
        !           315: 
        !           316: /*
        !           317:  * Start transmission on a line
        !           318:  */
        !           319: dz7085_start(tp)
        !           320:        struct tty *tp;
        !           321: {
        !           322:        register dz_padded_regmap_t     *regs;
        !           323:        register int            line;
        !           324: 
        !           325:        line = tp->t_dev;
        !           326: 
        !           327:        regs = (dz_padded_regmap_t*)tp->t_addr;
        !           328:        regs->dz_tcr |= (1<<(line&3));
        !           329: 
        !           330:        /* no, we do not need a char out to interrupt */
        !           331: }
        !           332: 
        !           333: /*
        !           334:  * Get a char from a specific DZ line
        !           335:  */
        !           336: dz7085_getc( unit, line, wait, raw )
        !           337:        boolean_t       wait;
        !           338:        boolean_t       raw;
        !           339: {
        !           340:        dz7085_softc_t      sc = dz7085_softc[unit];
        !           341:        spl_t               s = spltty();
        !           342:        register dz_padded_regmap_t *regs = sc->regs;
        !           343:        unsigned short  c;
        !           344:        int             rl;
        !           345: 
        !           346: again:
        !           347:        /*
        !           348:         * wait till something in silo 
        !           349:         */
        !           350:        while ((regs->dz_csr & DZ_CSR_RDONE) == 0 && wait)
        !           351:                delay(10);
        !           352:        c = regs->dz_rbuf;
        !           353: 
        !           354:        /*
        !           355:         * check if right line. For keyboard, rconsole is ok too 
        !           356:         */
        !           357:        rl = LINEOF(c);
        !           358:        if (wait && (line != rl) &&
        !           359:            !((line == DZ_LINE_KEYBOARD) && rcline == rl))
        !           360:                goto again;
        !           361:        /*
        !           362:         * bad chars not ok 
        !           363:         */
        !           364:        if ((c & (DZ_RBUF_PERR | DZ_RBUF_OERR | DZ_RBUF_FERR)) && wait)
        !           365:                goto again;
        !           366: 
        !           367:        splx(s);
        !           368: 
        !           369:        /*
        !           370:         * if nothing found return -1 
        !           371:         */
        !           372:        if ( ! (c & DZ_RBUF_VALID))
        !           373:                return -1;
        !           374: 
        !           375: #if    NBM > 0
        !           376:        if ((rl == DZ_LINE_KEYBOARD) && !raw && SCREEN_ISA_CONSOLE())
        !           377:                return lk201_rint(SCREEN_CONS_UNIT(), c, wait, sc->polling_mode);
        !           378:        else
        !           379: #endif NBM > 0
        !           380:                return c & DZ_RBUF_CHAR;
        !           381: }
        !           382: 
        !           383: /*
        !           384:  * Put a char on a specific DZ line
        !           385:  */
        !           386: dz7085_putc( unit, line, c )
        !           387: {
        !           388:        dz7085_softc_t      sc = dz7085_softc[unit];
        !           389:        register dz_padded_regmap_t *regs = sc->regs;
        !           390:        spl_t               s = spltty();
        !           391: 
        !           392:        /*
        !           393:         * do not change the break status of other lines 
        !           394:         */
        !           395:        c = (c & 0xff) | sc->breaks;
        !           396: 
        !           397:        /*
        !           398:         * Xmit line info only valid if TRDY,
        !           399:         * but never TRDY if no xmit enabled
        !           400:         */
        !           401:        if ((regs->dz_tcr & DZ_TCR_LNENB) == 0)
        !           402:                goto select_it;
        !           403: 
        !           404:        while ((regs->dz_csr & DZ_CSR_TRDY) == 0)
        !           405:                delay(100);
        !           406: 
        !           407:        /*
        !           408:         * see if by any chance we are already on the right line 
        !           409:         */
        !           410:        if (LINEOF(regs->dz_csr) == line)
        !           411:                regs->dz_tbuf = c;
        !           412:        else {
        !           413:                unsigned short tcr;
        !           414: select_it:
        !           415:                tcr = regs->dz_tcr;
        !           416:                regs->dz_tcr = (1 << line) | (tcr & 0xff00);
        !           417:                wbflush();
        !           418: 
        !           419:                do
        !           420:                        delay(2);
        !           421:                while ((regs->dz_csr & DZ_CSR_TRDY) == 0 ||
        !           422:                       (LINEOF(regs->dz_csr) != line));
        !           423: 
        !           424:                regs->dz_tbuf = c;
        !           425:                wbflush();
        !           426: 
        !           427:                /* restore previous settings */
        !           428:                regs->dz_tcr = tcr;
        !           429:        }
        !           430: 
        !           431:        splx(s);
        !           432: }
        !           433: 
        !           434: 
        !           435: dz7085_param(tp, line)
        !           436:        register struct tty     *tp;
        !           437:        register int            line;
        !           438: {
        !           439:        register dz_padded_regmap_t *regs;
        !           440:        register int lpr;
        !           441:  
        !           442:        line = tp->t_dev;
        !           443:        regs = dz7085_softc[line/NDZ_LINE]->regs;
        !           444: 
        !           445:        /*
        !           446:         * Do not let user fool around with kbd&mouse
        !           447:         */
        !           448: #if    NBM > 0
        !           449:        if (screen_captures(line)) {
        !           450:                tp->t_ispeed = tp->t_ospeed = B4800;
        !           451:                tp->t_flags |= TF_LITOUT;
        !           452:        }
        !           453: #endif NBM > 0
        !           454:        regs->dz_csr = DZ_CSR_MSE|DZ_CSR_RIE|DZ_CSR_TIE;
        !           455:        if (tp->t_ispeed == 0) {
        !           456:                (void) (*console_mctl)(tp->t_dev, TM_HUP, DMSET);       /* hang up line */
        !           457:                return;
        !           458:        }
        !           459: /* 19200/38400 here */
        !           460:        lpr = dz7085_speeds[tp->t_ispeed] | (line&DZ_LPAR_LINE) | DZ_LPAR_ENABLE;
        !           461:        lpr |= DZ_LPAR_8BITS;
        !           462: 
        !           463:        if ((tp->t_flags & (TF_ODDP|TF_EVENP)) == TF_ODDP)
        !           464:                lpr |= DZ_LPAR_ODD_PAR;
        !           465: 
        !           466:        if (tp->t_ispeed == B110)
        !           467:                lpr |= DZ_LPAR_STOP;
        !           468:        regs->dz_lpr = lpr;
        !           469: }
        !           470:  
        !           471: /*
        !           472:  * This is a total mess: not only are bits spread out in
        !           473:  * various registers, but we have to fake some for pmaxen.
        !           474:  */
        !           475: dz7085_mctl(dev, bits, how)
        !           476:        int dev;
        !           477:        int bits, how;
        !           478: {
        !           479:        register dz_padded_regmap_t *regs;
        !           480:        register int unit;
        !           481:        register int tcr, msr, brk, n_tcr, n_brk;
        !           482:        int b;
        !           483:        spl_t s;
        !           484:        dz7085_softc_t      sc;
        !           485: 
        !           486:        unit = dev;
        !           487: 
        !           488:        /* no modem support on lines 0 & 1 */
        !           489: /* XXX break on 0&1 */
        !           490:        if ((unit & 2) == 0)
        !           491:                return TM_LE|TM_DTR|TM_CTS|TM_CAR|TM_DSR;
        !           492: 
        !           493:        b = 1 ^ (unit & 1);     /* line 2 ? */
        !           494:        
        !           495:        sc = dz7085_softc[unit>>2];
        !           496:        regs = sc->regs;
        !           497:        s = spltty();
        !           498: 
        !           499:        tcr = ((regs->dz_tcr | (sc->fake>>4)) & 0xf00) >> (8 + b*2);
        !           500:        brk = (sc->breaks >> (8 + (unit&3))) & 1;       /* THE break bit */
        !           501: 
        !           502:        n_tcr = (bits & (TM_RTS|TM_DTR)) >> 1;
        !           503:        n_brk = (bits & TM_BRK) >> 9;
        !           504: 
        !           505:        /* break transitions, must 'send' a char out */
        !           506:        bits = (brk ^ n_brk) & 1;
        !           507: 
        !           508:        switch (how) {
        !           509:        case DMSET:
        !           510:                tcr = n_tcr;
        !           511:                brk = n_brk;
        !           512:                break;
        !           513: 
        !           514:        case DMBIS:
        !           515:                tcr |= n_tcr;
        !           516:                brk |= n_brk;
        !           517:                break;
        !           518: 
        !           519:        case DMBIC:
        !           520:                tcr &= ~n_tcr;
        !           521:                brk = 0;
        !           522:                break;
        !           523: 
        !           524:        case DMGET:
        !           525:                msr = ((regs->dz_msr|sc->fake) & 0xf0f) >> (b*8);
        !           526:                (void) splx(s);
        !           527:                return  (tcr<<1)|/* DTR, RTS */
        !           528:                        ((msr&1)<<5)|/* CTS */
        !           529:                        ((msr&2)<<7)|/* DSR */
        !           530:                        ((msr&0xc)<<4)|/* CD, RNG */
        !           531:                        (brk << 9)|/* BRK */
        !           532:                        TM_LE;
        !           533:        }
        !           534:        n_tcr = (regs->dz_tcr & ~(3 << (8 + b*2))) |
        !           535:                (tcr << (8 + b*2));
        !           536: 
        !           537:        regs->dz_tcr = n_tcr;
        !           538:        sc->fake = (sc->fake & 0xf0f) | (n_tcr<<4&0xf000);
        !           539: 
        !           540:        sc->breaks = (sc->breaks & ~(1 << (8 + (unit&3)))) |
        !           541:                    (brk << (8 + (unit&3)));
        !           542:        if(bits) (*console_putc)( unit>>2, unit&3, 0);/* force break, now */
        !           543:        (void) splx(s);
        !           544:        return 0;/* useless to compute it */
        !           545: }
        !           546: 
        !           547: /*
        !           548:  * Periodically look at the CD signals:
        !           549:  * they do not generate interrupts.
        !           550:  */
        !           551: dz7085_scan()
        !           552: {
        !           553:        register i;
        !           554:        register dz_padded_regmap_t *regs;
        !           555:        register msr;
        !           556:        register struct tty *tp;
        !           557:  
        !           558:        for (i = 0; i < NDZ_; i++) {
        !           559:                dz7085_softc_t      sc = dz7085_softc[i];
        !           560:                register int    temp;
        !           561: 
        !           562:                if (sc == 0)
        !           563:                        continue;
        !           564:                regs = sc->regs;
        !           565: 
        !           566:                tp = console_tty[i * NDZ_LINE];
        !           567: 
        !           568:                msr = regs->dz_msr | (sc->fake & 0xf0f);
        !           569:                if (temp = sc->softCAR) {
        !           570:                        if (temp & 0x4)
        !           571:                                msr |= DZ_MSR_CD2 | DZ_MSR_CTS2;
        !           572:                        if (temp & 0x8)
        !           573:                                msr |= DZ_MSR_CD3 | DZ_MSR_CTS3;
        !           574:                }
        !           575: 
        !           576:                /* Lines 0 and 1 have carrier on by definition */
        !           577:                /* [horrid casts cuz compiler stupid] */
        !           578:                check_car((char*)tp + 0*sizeof(struct tty), 1);
        !           579:                check_car((char*)tp + 1*sizeof(struct tty), 1);
        !           580:                check_car((char*)tp + 2*sizeof(struct tty), msr & DZ_MSR_CD2);
        !           581:                check_car((char*)tp + 3*sizeof(struct tty), msr & DZ_MSR_CD3);
        !           582: 
        !           583:                /* nothing else to do if no msr transitions */
        !           584:                if ((temp = sc->prev_msr) == msr)
        !           585:                        continue;
        !           586:                else
        !           587:                        sc->prev_msr = msr;
        !           588: 
        !           589:                /* see if we have an incoming call */
        !           590: #define        RING    (DZ_MSR_RI2|DZ_MSR_RI3)
        !           591:                if ((msr & RING) != (temp & RING)) {
        !           592: /*printf("%s %x->%x\n", "ET Phone RI", temp & RING, msr & RING);*/
        !           593:                        check_ring((char*)tp + 2*sizeof(struct tty),
        !           594:                                msr & DZ_MSR_RI2, temp & DZ_MSR_RI2);
        !           595:                        check_ring((char*)tp + 3*sizeof(struct tty),
        !           596:                                msr & DZ_MSR_RI3, temp & DZ_MSR_RI3);
        !           597:                }
        !           598: #undef RING
        !           599:                /* see if we must do flow-control */
        !           600:                if ((msr ^ temp) & DZ_MSR_CTS2) {
        !           601:                        tty_cts((char*)tp + 2*sizeof(struct tty),
        !           602:                                msr & DZ_MSR_CTS2);
        !           603:                }
        !           604:                if ((msr ^ temp) & DZ_MSR_CTS3) {
        !           605:                        tty_cts((char*)tp + 3*sizeof(struct tty),
        !           606:                                msr & DZ_MSR_CTS3);
        !           607:                }
        !           608:        }
        !           609:        timeout(dz7085_scan, (vm_offset_t)0, 2*hz);
        !           610: }
        !           611: 
        !           612: static dz7085_hup(tp)
        !           613:        register struct tty *tp;
        !           614: {
        !           615:        (*console_mctl)(tp->t_dev, TM_DTR, DMBIC);
        !           616: }
        !           617: 
        !           618: static void check_car(tp, car)
        !           619:        register struct tty *tp;
        !           620: {
        !           621:        if (car) {
        !           622:                /* cancel modem timeout if need to */
        !           623:                if (car & (DZ_MSR_CD2|DZ_MSR_CD3))
        !           624:                        untimeout(dz7085_hup, (vm_offset_t)tp);
        !           625: 
        !           626:                /* I think this belongs in the MI code */
        !           627:                if (tp->t_state & TS_WOPEN)
        !           628:                        tp->t_state |= TS_ISOPEN;
        !           629:                /* carrier present */
        !           630:                if ((tp->t_state & TS_CARR_ON) == 0)
        !           631:                        (void)ttymodem(tp, 1);
        !           632:        } else if ((tp->t_state&TS_CARR_ON) && ttymodem(tp, 0) == 0)
        !           633:                (*console_mctl)( tp->t_dev, TM_DTR, DMBIC);
        !           634: }
        !           635: 
        !           636: int    dz7085_ring_timeout     = 60;   /* seconds, patchable */
        !           637: 
        !           638: static void check_ring(tp, ring, oring)
        !           639:        register struct tty *tp;
        !           640: {
        !           641:        if (ring == oring)
        !           642:                return;
        !           643:        if (ring) {
        !           644:                (*console_mctl)( tp->t_dev, TM_DTR, DMBIS);
        !           645:                /* give it ample time to find the right carrier */
        !           646:                timeout(dz7085_hup, (vm_offset_t)tp, dz7085_ring_timeout*hz);
        !           647:        }
        !           648: }
        !           649: #endif NDZ_ > 0

unix.superglobalmegacorp.com

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