Annotation of Gnu-Mach/chips/dtop_hdw.c, revision 1.1.1.1

1.1       root        1: /* 
                      2:  * Mach Operating System
                      3:  * Copyright (c) 1993,1992 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: dtop_hdw.c
                     28:  *     Author: Alessandro Forin, Carnegie Mellon University
                     29:  *     Date:   1/92
                     30:  *
                     31:  *     Hardware-level operations for the Desktop serial line
                     32:  *     bus (i2c aka ACCESS).
                     33:  */
                     34: 
                     35: #include <dtop.h>
                     36: #if    NDTOP > 0
                     37: #include <bm.h>
                     38: #include <platforms.h>
                     39: 
                     40: #include <machine/machspl.h>           /* spl definitions */
                     41: #include <mach/std_types.h>
                     42: #include <device/io_req.h>
                     43: #include <device/tty.h>
                     44: 
                     45: #include <chips/busses.h>
                     46: #include <chips/serial_defs.h>
                     47: #include <chips/screen_defs.h>
                     48: #include <chips/lk201.h>
                     49: #include <mips/PMAX/tc.h>
                     50: 
                     51: #include <chips/dtop.h>
                     52: 
                     53: #define        DTOP_MAX_POLL   0x7fff          /* about half a sec */
                     54: 
                     55: #ifdef MAXINE
                     56: 
                     57: typedef volatile unsigned int  *data_reg_t;    /* uC  */
                     58: #define        DTOP_GET_BYTE(data)     (((*(data)) >> 8) & 0xff)
                     59: #define        DTOP_PUT_BYTE(data,c)   { *(data) = (c) << 8; }
                     60: 
                     61: typedef volatile unsigned int  *poll_reg_t;    /* SIR */
                     62: #define        DTOP_RX_AVAIL(poll)     (*(poll) & 1)
                     63: #define        DTOP_TX_AVAIL(poll)     (*(poll) & 2)
                     64: 
                     65: #else
                     66: 
                     67: define how to get/put DTOP packets on this box
                     68: 
                     69: #endif
                     70: 
                     71: /*
                     72:  * Driver status
                     73:  */
                     74: 
                     75: struct dtop_softc {
                     76:        data_reg_t      data;
                     77:        poll_reg_t      poll;
                     78:        char            polling_mode;
                     79:        char            probed_once;
                     80:        short           bad_pkts;
                     81: 
                     82:        struct dtop_ds {
                     83:                int             (*handler)(dtop_device_t,
                     84:                                           dtop_message_t, 
                     85:                                           int, 
                     86:                                           unsigned char);
                     87:                dtop_device     status;
                     88:        } device[(DTOP_ADDR_DEFAULT - DTOP_ADDR_FIRST) >> 1];
                     89: 
                     90: #      define  DTOP_DEVICE_NO(address) (((address)-DTOP_ADDR_FIRST)>>1)
                     91: 
                     92: } dtop_softc_data[NDTOP];
                     93: 
                     94: typedef struct dtop_softc *dtop_softc_t;
                     95: 
                     96: dtop_softc_t   dtop_softc[NDTOP];
                     97: 
                     98: /*
                     99:  * Definition of the driver for the auto-configuration program.
                    100:  */
                    101: 
                    102: int    dtop_probe(), dtop_intr();
                    103: static void    dtop_attach();
                    104: 
                    105: vm_offset_t    dtop_std[NDTOP] = { 0 };
                    106: struct bus_device *dtop_info[NDTOP];
                    107: struct bus_driver dtop_driver = 
                    108:         { dtop_probe, 0, dtop_attach, 0, dtop_std, "dtop", dtop_info,};
                    109: 
                    110: 
                    111: int dtop_print_debug = 0;
                    112: 
                    113: /*
                    114:  * Adapt/Probe/Attach functions
                    115:  */
                    116: 
                    117: set_dtop_address( dtopunit, poll_reg)
                    118:        data_reg_t      poll_reg;
                    119: {
                    120:        int i;
                    121: 
                    122:        extern int      dtop_probe(), dtop_param(), dtop_start(),
                    123:                        dtop_putc(), dtop_getc(),
                    124:                        dtop_pollc(), dtop_mctl(), dtop_softCAR();
                    125: 
                    126:        dtop_std[dtopunit] = (vm_offset_t)poll_reg;
                    127: 
                    128:        /* Do this here */
                    129:        console_probe           = dtop_probe;
                    130:        console_param           = dtop_param;
                    131:        console_start           = dtop_start;
                    132:        console_putc            = dtop_putc;
                    133:        console_getc            = dtop_getc;
                    134:        console_pollc           = dtop_pollc;
                    135:        console_mctl            = dtop_mctl;
                    136:        console_softCAR         = dtop_softCAR;
                    137: 
                    138: }
                    139: 
                    140: dtop_probe( data_reg, ui)
                    141:        data_reg_t              data_reg;
                    142:        struct bus_device       *ui;
                    143: {
                    144:        int             dtopunit = ui->unit, i;
                    145:        dtop_softc_t    dtop;
                    146: 
                    147:        dtop = &dtop_softc_data[dtopunit];
                    148:        dtop_softc[dtopunit] = dtop;
                    149: 
                    150:        dtop->poll = (poll_reg_t)dtop_std[dtopunit];
                    151:        dtop->data = data_reg;
                    152: 
                    153:        for (i = 0; i < DTOP_MAX_DEVICES; i++)
                    154:                dtop->device[i].handler = dtop_null_device_handler;
                    155: 
                    156:        /* a lot more needed here, fornow: */
                    157:        dtop->device[DTOP_DEVICE_NO(0x6a)].handler = dtop_locator_handler;
                    158:        dtop->device[DTOP_DEVICE_NO(0x6a)].status.locator.type =
                    159:                DEV_MOUSE;
                    160:        dtop->device[DTOP_DEVICE_NO(0x6a)].status.locator.relative =
                    161:                1;
                    162:        dtop->device[DTOP_DEVICE_NO(0x6a)].status.locator.button_code[0] =
                    163:                KEY_LEFT_BUTTON;
                    164:        dtop->device[DTOP_DEVICE_NO(0x6a)].status.locator.button_code[1] =
                    165:                KEY_RIGHT_BUTTON;
                    166:        dtop->device[DTOP_DEVICE_NO(0x6a)].status.locator.button_code[2] =
                    167:                KEY_MIDDLE_BUTTON;
                    168:        dtop->device[DTOP_DEVICE_NO(0x6a)].status.locator.n_coords =
                    169:                2;
                    170: 
                    171:        dtop->device[DTOP_DEVICE_NO(0x6c)].handler = dtop_keyboard_handler;
                    172:        dtop->device[DTOP_DEVICE_NO(0x6c)].status.keyboard.poll_frequency =
                    173:                (hz * 5) / 100; /* x0.01 secs */
                    174:        dtop->device[DTOP_DEVICE_NO(0x6c)].status.keyboard.bell_volume =
                    175:                DTOP_CLICK_VOLUME_MAX;
                    176: 
                    177:        return 1;
                    178: }
                    179: 
                    180: static void
                    181: dtop_attach(ui)
                    182:        struct bus_device       *ui;
                    183: {
                    184:        int             i;
                    185: 
                    186:        /* Initialize all the console ttys */
                    187:        for (i = 0; i < 4; i++)
                    188:                ttychars(console_tty[i]);
                    189:        /* Mark keyboard and mouse present */
                    190:        for (i = 0; i < 2; i++)
                    191:                console_tty[i]->t_addr = (char*)1;
                    192: }
                    193: 
                    194: /*
                    195:  * Polled I/O (debugger)
                    196:  */
                    197: dtop_pollc(unit, on)
                    198:        boolean_t               on;
                    199: {
                    200:        dtop_softc_t            dtop;
                    201: 
                    202:        dtop = dtop_softc[unit];
                    203:        if (on) {
                    204:                dtop->polling_mode++;
                    205: #if    NBM > 0
                    206:                screen_on_off(unit, TRUE);
                    207: #endif NBM > 0
                    208:        } else
                    209:                dtop->polling_mode--;
                    210: }
                    211: 
                    212: /*
                    213:  * Interrupt routine
                    214:  */
                    215: dtop_intr (unit, spllevel, recvd)
                    216:        spl_t           spllevel;
                    217:        boolean_t       recvd;
                    218: {
                    219: 
                    220:        if (recvd) {
                    221:                dtop_message    msg;
                    222:                int             devno;
                    223:                dtop_softc_t    dtop;
                    224: 
                    225:                ssaver_bump(unit);
                    226: 
                    227: #ifdef mips
                    228:                splx(spllevel);
                    229: #endif
                    230: 
                    231:                dtop = dtop_softc[unit];
                    232:                if (dtop_get_packet(dtop, &msg) < 0) {
                    233:                  if (dtop_print_debug)
                    234:                    printf("%s", "dtop: overrun (or stray)\n");
                    235:                  return;
                    236:                }
                    237: 
                    238:                devno = DTOP_DEVICE_NO(msg.src_address);
                    239:                if (devno < 0 || devno > 15) return;    /* sanity */
                    240: 
                    241:                (void) (*dtop->device[devno].handler)
                    242:                                (&dtop->device[devno].status, &msg,
                    243:                                 DTOP_EVENT_RECEIVE_PACKET, 0);
                    244: 
                    245:        } else {
                    246:                /* fornow xmit is not intr based */
                    247:                (*tc_enable_interrupt)( dtop_info[unit]->adaptor, FALSE, TRUE);
                    248:        }
                    249: }
                    250: 
                    251: boolean_t
                    252: dtop_start(tp)
                    253:        struct tty *tp;
                    254: {
                    255:        register int            line, temp;
                    256: 
                    257:        /* no, we do not need a char out first */
                    258:        return FALSE;
                    259: }
                    260: 
                    261: dtop_w_test(n, a,b,c,d,e,f,g,h)
                    262: {
                    263:        int *p = (int*)0xbc2a0000;
                    264: 
                    265:        if (n <= 0) return;
                    266: 
                    267:        a <<= 8; *p = a;
                    268:        if (--n == 0) goto out;
                    269:        delay(20);
                    270:        b <<= 8; *p = b;
                    271:        if (--n == 0) goto out;
                    272:        delay(20);
                    273:        c <<= 8; *p = c;
                    274:        if (--n == 0) goto out;
                    275:        delay(20);
                    276:        d <<= 8; *p = d;
                    277:        if (--n == 0) goto out;
                    278:        delay(20);
                    279:        e <<= 8; *p = e;
                    280:        if (--n == 0) goto out;
                    281:        delay(20);
                    282:        f <<= 8; *p = f;
                    283:        if (--n == 0) goto out;
                    284:        delay(20);
                    285:        g <<= 8; *p = g;
                    286:        if (--n == 0) goto out;
                    287:        delay(20);
                    288:        h <<= 8; *p = h;
                    289: out:
                    290:        delay(10000);
                    291:        {
                    292:                int buf[100];
                    293: 
                    294:                delay(20);
                    295:                a = *p;
                    296:                buf[0] = a;
                    297:                c = 1;
                    298:                for (n = 0; n < 100; n++) {
                    299:                        delay(20);
                    300:                        b = *p;
                    301:                        if (b != a) {
                    302:                                buf[c++] = b;
                    303:                                b = a;
                    304:                        }
                    305:                }
                    306:                for (n = 0; n < c; n++)
                    307:                        db_printf("%x ", ((buf[n])>>8)&0xff);
                    308:        }
                    309:        return c;
                    310: }
                    311: 
                    312: /*
                    313:  * Take a packet off dtop interface
                    314:  * A packet MUST be there, this is not checked for.
                    315:  */
                    316: #define        DTOP_ESC_CHAR           0xf8
                    317: dtop_escape(c)
                    318: {
                    319:        /* I donno much about this stuff.. */
                    320:        switch (c) {
                    321:        case 0xe8:      return 0xf8;
                    322:        case 0xe9:      return 0xf9;
                    323:        case 0xea:      return 0xfa;
                    324:        case 0xeb:      return 0xfb;
                    325:        default:        /* printf("{esc %x}", c); */
                    326:                        return c;
                    327:        }
                    328: }
                    329: 
                    330: dtop_get_packet(dtop, pkt)
                    331:        dtop_softc_t    dtop;
                    332:        dtop_message_t  pkt;
                    333: {
                    334:        register poll_reg_t     poll;
                    335:        register data_reg_t     data;
                    336:        register int            max, i, len;
                    337:        register unsigned char  c;
                    338: 
                    339:        poll = dtop->poll;
                    340:        data = dtop->data;
                    341: 
                    342:        /*
                    343:         * The interface does not handle us the first byte,
                    344:         * which is our address and cannot ever be anything
                    345:         * else but 0x50.  This is a good thing, it makes
                    346:         * the average packet exactly one word long, too.
                    347:         */
                    348:        pkt->src_address = DTOP_GET_BYTE(data);
                    349: 
                    350:        for (max = 0; (max < DTOP_MAX_POLL) && !DTOP_RX_AVAIL(poll); max++)
                    351:                delay(16);
                    352:        if (max == DTOP_MAX_POLL) goto bad;
                    353:        pkt->code.bits = DTOP_GET_BYTE(data);
                    354: 
                    355:        /*
                    356:         * Now get data and checksum
                    357:         */
                    358:        len = pkt->code.val.len + 1;
                    359:        c = 0;
                    360:        for (i = 0; i < len; i++) {
                    361: 
                    362: again:         for (max = 0; (max < DTOP_MAX_POLL) && !DTOP_RX_AVAIL(poll); max++)
                    363:                        delay(16);
                    364:                if (max == DTOP_MAX_POLL) goto bad;
                    365:                if (c == DTOP_ESC_CHAR) {
                    366:                        c = dtop_escape(DTOP_GET_BYTE(data) & 0xff);
                    367:                } else {
                    368:                        c = DTOP_GET_BYTE(data);
                    369:                        if (c == DTOP_ESC_CHAR)
                    370:                                goto again;
                    371:                }
                    372: 
                    373:                pkt->body[i] = c;
                    374:        }
                    375:        return len;
                    376: bad:
                    377:        dtop->bad_pkts++;
                    378:        return -1;
                    379: }
                    380: 
                    381: /* Conversely... */
                    382: dtop_put_packet(dtop, pkt)
                    383:        dtop_softc_t    dtop;
                    384:        dtop_message_t  pkt;
                    385: {
                    386:        register int i, max;
                    387:        register unsigned char *cp;
                    388:        register unsigned int spl;
                    389:        register unsigned char c;
                    390:        
                    391:        spl = spltty();
                    392:        pkt->src_address = pkt->dest_address;
                    393:        i = 0;
                    394:        cp = (unsigned char *)&pkt->src_address;
                    395:        while (i < pkt->code.val.len + 2) {
                    396:                for (max = 0; max < DTOP_MAX_POLL && !DTOP_TX_AVAIL(dtop->poll);
                    397:                     max++);
                    398:                if (max == DTOP_MAX_POLL)
                    399:                        goto bad;
                    400:                DTOP_PUT_BYTE(dtop->data, *cp);
                    401:                cp++;
                    402:                i++;
                    403:        }
                    404:        for (max = 0; (max < DTOP_MAX_POLL) && !DTOP_RX_AVAIL(dtop->poll); max++)
                    405:                delay(16);
                    406:        if (max == DTOP_MAX_POLL)
                    407:                goto bad;
                    408:        c = DTOP_GET_BYTE(dtop->data);
                    409:        if (c == DTOP_ESC_CHAR) {
                    410:                for (max = 0; (max < DTOP_MAX_POLL)
                    411:                     && !DTOP_RX_AVAIL(dtop->poll); max++)
                    412:                        delay(16);
                    413:                if (max == DTOP_MAX_POLL)
                    414:                        goto bad;
                    415:                c = DTOP_GET_BYTE(dtop->data);
                    416:        }
                    417:        splx(spl);
                    418:        switch (c) {
                    419:        case 0xfb:              /* XMT, ok */
                    420:                break;
                    421:        default:
                    422:                return 0;
                    423:        }
                    424:        return 1;
                    425:  bad:
                    426:        splx(spl);
                    427:        return 0;
                    428: }
                    429: 
                    430: 
                    431: /*
                    432:  * Get a char from a specific DTOP line
                    433:  * [this is only used for console&screen purposes]
                    434:  */
                    435: dtop_getc( unit, line, wait, raw )
                    436:        boolean_t       wait;
                    437:        boolean_t       raw;
                    438: {
                    439:        register int c;
                    440:        dtop_softc_t    dtop;
                    441: 
                    442:        dtop = dtop_softc[unit];
                    443: again:
                    444:        c = -1;
                    445: 
                    446:        /*
                    447:         * Try rconsole first
                    448:         */
                    449:        if (rcline && line == SCREEN_LINE_KEYBOARD) {
                    450:                c = scc_getc( 0, rcline, FALSE, raw);
                    451:                if (c != -1) return c;
                    452:        }
                    453: 
                    454:        /*
                    455:         * Now check keyboard
                    456:         */
                    457:        if (DTOP_RX_AVAIL(dtop->poll)) {
                    458: 
                    459:                dtop_message    msg;
                    460:                struct dtop_ds  *ds;
                    461: 
                    462:                if (dtop_get_packet(dtop, &msg) >= 0) {
                    463: 
                    464:                    ds = &dtop->device[DTOP_DEVICE_NO(msg.src_address)];
                    465:                    if (ds->handler == dtop_keyboard_handler) {
                    466: 
                    467:                        c = dtop_keyboard_handler(
                    468:                                        &ds->status, &msg,
                    469:                                        DTOP_EVENT_RECEIVE_PACKET, -1);
                    470: 
                    471:                        if (c > 0) return c;
                    472: 
                    473:                        c = -1;
                    474:                    }
                    475:                }
                    476:        }
                    477: 
                    478:        if (wait && (c == -1)) {
                    479:                delay(100);
                    480:                goto again;
                    481:        }
                    482: 
                    483:        return c;
                    484: }
                    485: 
                    486: /*
                    487:  * Put a char on a specific DTOP line
                    488:  */
                    489: dtop_putc( unit, line, c )
                    490: {
                    491:        if (rcline && line == rcline) {
                    492:                scc_putc(0, rcline, c);
                    493:        }
                    494: /*     dprintf("%c", c); */
                    495: }
                    496: 
                    497: dtop_param(tp, line)
                    498:        struct tty      *tp;
                    499: {
                    500:        if (tp->t_ispeed == 0)
                    501:                ttymodem(tp, 0);
                    502:        else
                    503:                /* called too early to invoke ttymodem, sigh */
                    504:                tp->t_state |= TS_CARR_ON;
                    505: }
                    506:  
                    507: /*
                    508:  * Modem control functions, we don't need 'em
                    509:  */
                    510: dtop_mctl(dev, bits, how)
                    511:        int dev;
                    512:        int bits, how;
                    513: {
                    514:        return 0;
                    515: }
                    516: 
                    517: dtop_softCAR(unit, line, on)
                    518: {
                    519: }
                    520: 
                    521: /* Some keyboard specific stuff, probably belongs elsewhere */
                    522: 
                    523: dtop_kbd_probe(unit)
                    524: {
                    525:        if (dtop_std[unit]) {
                    526:                lk201_probe(unit);
                    527:                return 1;
                    528:        }
                    529:        return 0;
                    530: }
                    531: 
                    532: io_return_t 
                    533: dtop_set_status(unit, flavor, status, status_count)
                    534:        int             unit;
                    535:        int             flavor;
                    536:        dev_status_t    status;
                    537:        unsigned int    status_count;
                    538: {
                    539:        dtop_device_t dev;
                    540: 
                    541:        dev = &dtop_softc[unit]->device[DTOP_DEVICE_NO(0x6c)].status;
                    542: 
                    543:        switch (flavor) {
                    544:        case LK201_SEND_CMD: {
                    545:                register lk201_cmd_t    *cmd = (lk201_cmd_t *)status;
                    546:                unsigned int            cnt;
                    547:                
                    548:                if ((status_count < (sizeof(*cmd)/sizeof(int))) ||
                    549:                    ((cnt = cmd->len) > 2))
                    550:                        return D_INVALID_SIZE;
                    551:                switch (cmd->command) {
                    552:                case LK_CMD_ENB_BELL:
                    553:                        cmd->params[0] ^= 0x7;
                    554:                        if (dtop_print_debug)
                    555:                                printf("LK_CMD_ENB_BELL %d\n", cmd->params[0]);
                    556:                        dev->keyboard.bell_volume = cmd->params[0] & 0x7;
                    557:                        break;
                    558:                case LK_CMD_DIS_BELL:
                    559:                        dev->keyboard.bell_volume = 0;
                    560:                        break;
                    561:                case LK_CMD_BELL:
                    562:                        dtop_ring_bell(unit);
                    563:                        break;
                    564:                case LK_CMD_LEDS_ON:
                    565:                        cmd->params[0] &= ~0x80;
                    566:                        if (dtop_print_debug)
                    567:                                printf("LK_CMD_LEDS_ON %d %x\n",
                    568:                                       cmd->params[0], cmd->params[0]);
                    569:                        dev->keyboard.led_status |= cmd->params[0];
                    570:                        dtop_leds(unit, dev->keyboard.led_status);
                    571:                        break;
                    572:                case LK_CMD_LEDS_OFF:
                    573:                        cmd->params[0] &= ~0x80;
                    574:                        dev->keyboard.led_status &= ~cmd->params[0];
                    575:                        dtop_leds(unit, dev->keyboard.led_status);
                    576:                        break;
                    577:                case LK_CMD_ENB_KEYCLK:
                    578:                case LK_CMD_DIS_KEYCLK:
                    579:                case LK_CMD_SOUND_CLK:
                    580:                case LK_CMD_DIS_CTLCLK:
                    581:                case LK_CMD_ENB_CTLCLK:
                    582:                        break;
                    583:                default:
                    584:                        break;
                    585:                }
                    586:                break;
                    587:        }
                    588:        default:
                    589:                break;
                    590:        }
                    591:        return lk201_set_status(unit, flavor, status, status_count);
                    592: }
                    593: 
                    594: dtop_kbd_reset(unit)
                    595: {
                    596:        return lk201_reset(unit);
                    597: }
                    598: 
                    599: #define DTOP_BITS(p, len)      (((p) << 7) | (len))
                    600: 
                    601: dtop_ring_bell(unit)
                    602: {
                    603:        dtop_message msg;
                    604:        dtop_device_t dev;
                    605:        int vol;
                    606: 
                    607:        dev = &dtop_softc[unit]->device[DTOP_DEVICE_NO(0x6c)].status;
                    608:        vol = dev->keyboard.bell_volume;
                    609: 
                    610:        if (dtop_print_debug)
                    611:                printf("dtop_ring_bell: %d\n", vol);
                    612:        msg.dest_address = DTOP_ADDR_KBD;
                    613:        msg.code.bits = DTOP_BITS(1, 2);
                    614:        msg.body[0] = DTOP_KMSG_BELL;
                    615:        msg.body[1] = vol;
                    616:        if (!dtop_put_packet(dtop_softc[unit], &msg)) {
                    617:          if (dtop_print_debug)
                    618:            printf("dtop_ring_bell: dtop_put_packet failed\n");
                    619:          return -1;
                    620:        }
                    621:        return 0;
                    622: }
                    623: 
                    624: dtop_leds(unit, mask)
                    625: {
                    626:        dtop_message msg;
                    627: 
                    628:        if (dtop_print_debug)
                    629:                printf("dtop_leds %x\n", mask);
                    630:        msg.dest_address = DTOP_ADDR_KBD;
                    631:        msg.code.bits = DTOP_BITS(1, 2);
                    632:        msg.body[0] = DTOP_KMSG_LED;
                    633:        msg.body[1] = mask;
                    634:        if (!dtop_put_packet(dtop_softc[unit], &msg)) {
                    635:          if (dtop_print_debug)
                    636:            printf("dtop_leds: dtop_put_packet failed\n");
                    637:          return -1;
                    638:        }
                    639:        return 0;
                    640: }
                    641: 
                    642: 
                    643: 
                    644: #endif NDTOP > 0

unix.superglobalmegacorp.com

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