Annotation of 43BSD/sys/vaxuba/ik.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1982, 1986 Regents of the University of California.
        !             3:  * All rights reserved.  The Berkeley software License Agreement
        !             4:  * specifies the terms and conditions for redistribution.
        !             5:  *
        !             6:  *     @(#)ik.c        7.1 (Berkeley) 6/5/86
        !             7:  */
        !             8: 
        !             9: #include "ik.h"
        !            10: #if NIK > 0
        !            11: /*
        !            12:  * Ikonas Frame Buffer Interface -- Bill Reeves.
        !            13:  */
        !            14: #include "../machine/pte.h"
        !            15: 
        !            16: #include "param.h"
        !            17: #include "dir.h"
        !            18: #include "user.h"
        !            19: #include "buf.h"
        !            20: #include "systm.h"
        !            21: #include "map.h"
        !            22: #include "uio.h"
        !            23: #include "ioctl.h"
        !            24: 
        !            25: #include "ubareg.h"
        !            26: #include "ubavar.h"
        !            27: #include "ikreg.h"
        !            28: 
        !            29: #define IKBUSY 01
        !            30: #define IKDMAPRI (PZERO-1)
        !            31: #define IKWAITPRI (PZERO+1)
        !            32: 
        !            33: int    ikprobe(), ikattach(), ikintr();
        !            34: struct uba_device *ikdinfo[NIK];
        !            35: u_short        ikstd[] = { 0772460, 0000000, 0 };
        !            36: struct uba_driver ikdriver =
        !            37:        { ikprobe, 0, ikattach, 0, ikstd, "ik", ikdinfo, 0, 0 };
        !            38: 
        !            39: struct ik_softc {
        !            40:        char    ik_open;
        !            41:        short   ik_uid;
        !            42:        short   ik_state;
        !            43:        int     ik_ubinfo;
        !            44:        int     ik_count;
        !            45:        struct  buf *ik_bp;
        !            46:        int     ik_bufp;
        !            47:        int     ik_icnt;
        !            48: } ik_softc[NIK];
        !            49: 
        !            50: int    ikstrategy();
        !            51: u_int  ikminphys();
        !            52: struct buf rikbuf[NIK];
        !            53: 
        !            54: #define IKUNIT(dev) (minor(dev))
        !            55: 
        !            56: ikprobe(reg)
        !            57:        caddr_t reg;
        !            58: {
        !            59:        register int br, cvec;          /* value-result */
        !            60:        register struct ikdevice *ikaddr = (struct ikdevice *) reg;
        !            61: 
        !            62: #ifdef lint
        !            63:        br = 0; cvec = br; br = cvec;
        !            64:        ikintr(0);
        !            65: #endif
        !            66:        ikaddr->ik_istat = 0;
        !            67:        ikaddr->ik_xaddr = 0;
        !            68:        ikaddr->ik_yaddr = 0;
        !            69:        ikaddr->ik_ustat = IK_IENABLE | IK_GO;
        !            70:        DELAY(10000);
        !            71:        ikaddr->ik_ustat = 0;
        !            72:        return (sizeof (struct ikdevice));
        !            73: }
        !            74: 
        !            75: /*ARGSUSED*/
        !            76: ikattach(ui)
        !            77:        struct uba_device *ui;
        !            78: {
        !            79: 
        !            80: }
        !            81: 
        !            82: ikopen(dev)
        !            83:        dev_t dev;
        !            84: {
        !            85:        register struct ik_softc *ikp;
        !            86:        register struct uba_device *ui;
        !            87: 
        !            88:        if (IKUNIT(dev) >= NIK || (ikp = &ik_softc[minor(dev)])->ik_open ||
        !            89:            (ui = ikdinfo[IKUNIT(dev)]) == 0 || ui->ui_alive == 0)
        !            90:                return (ENXIO);
        !            91:        ikp->ik_open = 1;
        !            92:        ikp->ik_icnt = 0;
        !            93:        ikp->ik_state = 0;
        !            94:        ikp->ik_uid = u.u_uid;
        !            95:        maptouser(ui->ui_addr);
        !            96:        return (0);
        !            97: }
        !            98: 
        !            99: ikclose(dev)
        !           100:        dev_t dev;
        !           101: {
        !           102: 
        !           103:        ik_softc[minor(dev)].ik_open = 0;
        !           104:        ik_softc[minor(dev)].ik_state = 0;
        !           105:        unmaptouser(ikdinfo[IKUNIT(dev)]->ui_addr);
        !           106: }
        !           107: 
        !           108: ikread(dev, uio)
        !           109:        dev_t dev;
        !           110:        struct uio *uio;
        !           111: {
        !           112:        register int unit = IKUNIT(dev);
        !           113: 
        !           114:        if (unit >= NIK)
        !           115:                return (ENXIO);
        !           116:        return (physio(ikstrategy, &rikbuf[unit], dev, B_READ, ikminphys, uio));
        !           117: }
        !           118: 
        !           119: ikwrite(dev, uio)
        !           120:        dev_t dev;
        !           121:        struct uio *uio;
        !           122: {
        !           123:        register int unit = IKUNIT(dev);
        !           124: 
        !           125:        if (unit >= NIK)
        !           126:                return (ENXIO);
        !           127:        return (physio(ikstrategy, &rikbuf[unit], dev, B_WRITE, ikminphys, uio));
        !           128: }
        !           129: 
        !           130: u_int
        !           131: ikminphys(bp)
        !           132:        register struct buf *bp;
        !           133: {
        !           134: 
        !           135:        if (bp->b_bcount > 65536)       /* may be able to do twice as much */
        !           136:                bp->b_bcount = 65536;
        !           137: }
        !           138: 
        !           139: ikstrategy(bp)
        !           140:        register struct buf *bp;
        !           141: {
        !           142:        register struct ik_softc *ikp = &ik_softc[IKUNIT(bp->b_dev)];
        !           143:        register struct uba_device *ui;
        !           144: 
        !           145:        if (IKUNIT(bp->b_dev) >= NIK || (ui = ikdinfo[IKUNIT(bp->b_dev)]) == 0
        !           146:                                || ui->ui_alive == 0)
        !           147:                goto bad;
        !           148:        (void) spl5();
        !           149:        while (ikp->ik_state & IKBUSY)
        !           150:                sleep((caddr_t)ikp, IKDMAPRI+1);
        !           151:        ikp->ik_state |= IKBUSY;
        !           152:        ikp->ik_bp = bp;
        !           153:        ikp->ik_ubinfo = ubasetup(ui->ui_ubanum, bp, UBA_NEEDBDP);
        !           154:        ikp->ik_bufp = ikp->ik_ubinfo & 0x3ffff;
        !           155:        ikp->ik_count = -(bp->b_bcount>>1);     /* its a word count */
        !           156:        ikstart(ui);
        !           157:        while (ikp->ik_state&IKBUSY)
        !           158:                sleep((caddr_t)ikp, IKDMAPRI);
        !           159:        ikp->ik_count = 0;
        !           160:        ikp->ik_bufp = 0;
        !           161:        (void) spl0();
        !           162:        ubarelse(ui->ui_ubanum, &ikp->ik_ubinfo);
        !           163:        ikp->ik_bp = 0;
        !           164:        iodone(bp);
        !           165:        wakeup((caddr_t)ikp);
        !           166:        return;
        !           167: bad:
        !           168:        bp->b_flags |= B_ERROR;
        !           169:        iodone(bp);
        !           170:        return;
        !           171: }
        !           172: 
        !           173: ikstart(ui)
        !           174:        register struct uba_device *ui;
        !           175: {
        !           176:        register int istat;
        !           177:        register struct ikdevice *ikaddr = (struct ikdevice *) ui->ui_addr;
        !           178:        register struct ik_softc *ikp = &ik_softc[IKUNIT(ui->ui_unit)];
        !           179: 
        !           180:        istat = ikaddr->ik_istat|DMAENABLE;
        !           181:        ikaddr->ik_istat = istat;
        !           182:        ikaddr->ik_wc =  ikp->ik_count;
        !           183:        ikaddr->ik_ubaddr = ikp->ik_bufp;
        !           184:        ikaddr->ik_ustat = IK_GO|IK_IENABLE|((ikp->ik_bufp>>12)&060);
        !           185: }
        !           186: 
        !           187: /*ARGSUSED*/
        !           188: ikioctl(dev, cmd, data, flag)
        !           189:        dev_t dev;
        !           190:        int cmd;
        !           191:        register caddr_t data;
        !           192:        int flag;
        !           193: {
        !           194:        register struct uba_device *ui = ikdinfo[IKUNIT(dev)];
        !           195:        register struct ik_softc *ikp;
        !           196: 
        !           197:        switch (cmd) {
        !           198: 
        !           199:        case IKIOGETADDR:
        !           200:                *(caddr_t *)data = ui->ui_addr;
        !           201:                break;
        !           202: 
        !           203:        case IKIOWAITINT:
        !           204:                ikp = &ik_softc[IKUNIT(dev)];
        !           205:                ikp->ik_state |= IKBUSY;
        !           206:                while (ikp->ik_state&IKBUSY)
        !           207:                        sleep((caddr_t)ikp, IKWAITPRI);
        !           208:                break;
        !           209: 
        !           210:        default:
        !           211:                return (ENOTTY);
        !           212:        }
        !           213:        return (0);
        !           214: }
        !           215: 
        !           216: /*ARGSUSED*/
        !           217: ikintr(dev)
        !           218:        dev_t dev;
        !           219: {
        !           220:        register struct ikdevice *ikaddr =
        !           221:                        (struct ikdevice *) ikdinfo[IKUNIT(dev)]->ui_addr;
        !           222:        register struct ik_softc *ikp = &ik_softc[IKUNIT(dev)];
        !           223: 
        !           224:        ikp->ik_icnt++;
        !           225:        if (ikp->ik_state&IKBUSY) {
        !           226:                ikaddr->ik_ustat = 0;
        !           227:                ikp->ik_state &= ~IKBUSY;
        !           228:                wakeup((caddr_t)ikp);
        !           229:        }
        !           230: }
        !           231: 
        !           232: ikreset(uban)
        !           233:        int uban;
        !           234: {
        !           235:        register int i;
        !           236:        register struct uba_device *ui;
        !           237:        register struct ik_softc *ikp = ik_softc;
        !           238: 
        !           239:        for (i = 0; i < NIK; i++, ikp++) {
        !           240:                if ((ui = ikdinfo[i]) == 0 || ui->ui_alive == 0 ||
        !           241:                    ui->ui_ubanum != uban || ikp->ik_open == 0)
        !           242:                        continue;
        !           243:                printf(" ik%d", i);
        !           244:                if ((ikp->ik_state&IKBUSY) == 0)
        !           245:                        continue;
        !           246:                ikp->ik_ubinfo =
        !           247:                    ubasetup(ui->ui_ubanum, ikp->ik_bp, UBA_NEEDBDP);
        !           248:                ikp->ik_count = -(ikp->ik_bp->b_bcount/2);
        !           249:                ikstart(ui);
        !           250:        }
        !           251: }
        !           252: #endif

unix.superglobalmegacorp.com

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