Annotation of 43BSD/sys/stand/tmscp.c, revision 1.1.1.1

1.1       root        1: 
                      2: /*     @(#)tmscp.c     7.1 (Berkeley) 6/5/86 */
                      3: 
                      4: /****************************************************************
                      5:  *                                                              *
                      6:  *        Licensed from Digital Equipment Corporation           *
                      7:  *                       Copyright (c)                          *
                      8:  *               Digital Equipment Corporation                  *
                      9:  *                   Maynard, Massachusetts                     *
                     10:  *                         1985, 1986                           *
                     11:  *                    All rights reserved.                      *
                     12:  *                                                              *
                     13:  *        The Information in this software is subject to change *
                     14:  *   without notice and should not be construed as a commitment *
                     15:  *   by  Digital  Equipment  Corporation.   Digital   makes  no *
                     16:  *   representations about the suitability of this software for *
                     17:  *   any purpose.  It is supplied "As Is" without expressed  or *
                     18:  *   implied  warranty.                                         *
                     19:  *                                                              *
                     20:  *        If the Regents of the University of California or its *
                     21:  *   licensees modify the software in a manner creating         *
                     22:  *   diriviative copyright rights, appropriate copyright        *
                     23:  *   legends may be placed on  the drivative work in addition   *
                     24:  *   to that set forth above.                                   *
                     25:  ***************************************************************/
                     26: /*
                     27:  * tmscp.c - TMSCP (TK50/TU81) standalone driver
                     28:  */
                     29:  
                     30: # ifndef lint
                     31: static char *sccsid = "@(#)tmscp.c     1.5     (ULTRIX)        4/18/86";
                     32: # endif not lint
                     33:  
                     34: /* ------------------------------------------------------------------------
                     35:  * Modification History: /sys/stand/tmscp.c
                     36:  *
                     37:  * 3-15-85  afd
                     38:  *     Don't ask for an interrupt when commands are issued and
                     39:  *     check ownership bit in the response descriptor to detect when a
                     40:  *     command is complete.  Necessary due to the TU81's failure to set
                     41:  *     the response interrupt field in the communications area.
                     42:  *
                     43:  * ------------------------------------------------------------------------
                     44:  */
                     45:  
                     46: #include "../machine/pte.h"
                     47:  
                     48: #include "../h/param.h"
                     49: #include "../h/gnode.h"
                     50: #include "../h/devio.h"
                     51:  
                     52: #include "savax.h"
                     53:  
                     54: #include "saio.h"
                     55:  
                     56: /*
                     57:  * Parameters for the communications area
                     58:  * (Only 1 cmd & 1 rsp packet)
                     59:  */
                     60: #define        NRSPL2  0
                     61: #define        NCMDL2  0
                     62: #define        NRSP    (1<<NRSPL2)
                     63: #define        NCMD    (1<<NCMDL2)
                     64:  
                     65: #include "../vaxuba/tmscpreg.h"
                     66: #include "../vaxuba/ubareg.h"
                     67: #include "../vax/tmscp.h"
                     68:  
                     69: u_short tmscpstd[] = { 0174500 };
                     70:  
                     71: struct iob     ctmscpbuf;
                     72:  
                     73: struct tmscpdevice *tmscpaddr = 0;
                     74:  
                     75: struct tmscp {
                     76:        struct tmscpca  tmscp_ca;
                     77:        struct mscp     tmscp_rsp;
                     78:        struct mscp     tmscp_cmd;
                     79:        } tmscp;
                     80:  
                     81: struct tmscp *tmscp_ubaddr;            /* Unibus address of tmscp structure */
                     82:  
                     83: struct mscp *tmscpcmd();
                     84:  
                     85: int tmscp_offline = 1;         /* Flag to prevent multiple STCON */
                     86: int tms_offline[4] = {1,1,1,1}; /* Flag to prevent multiple ONLIN */
                     87:  
                     88:  
                     89: /*
                     90:  * Open a tmscp device. Initialize the controller and set the unit online.
                     91:  */
                     92: tmscpopen(io)
                     93:        register struct iob *io;
                     94: {
                     95:        register struct mscp *mp;
                     96:        int i;
                     97:  
                     98:        /*
                     99:         * Have the tmscp controller characteristics already been set up
                    100:         * (STCON)?
                    101:         */
                    102:        if (tmscp_offline)
                    103:                {
                    104:                if (tmscpaddr == 0)
                    105:                        tmscpaddr = (struct tmscpdevice *)ubamem(io->i_unit, tmscpstd[0]);
                    106:                if (tmscp_ubaddr == 0)
                    107:                        {
                    108:                        ctmscpbuf.i_unit = io->i_unit;
                    109:                        ctmscpbuf.i_ma = (caddr_t)&tmscp;
                    110:                        ctmscpbuf.i_cc = sizeof(tmscp);
                    111:                        tmscp_ubaddr = (struct tmscp *)ubasetup(&ctmscpbuf, 2);
                    112:                        }
                    113:                /*
                    114:                 * Initialize the tmscp device and wait for the 4 steps
                    115:                 * to complete.
                    116:                 */
                    117:                tmscpaddr->tmscpip = 0;
                    118:                while ((tmscpaddr->tmscpsa & TMSCP_STEP1) == 0)
                    119:                        ;
                    120:                tmscpaddr->tmscpsa =TMSCP_ERR|(NCMDL2<<11)|(NRSPL2<<8);
                    121:  
                    122:                while ((tmscpaddr->tmscpsa & TMSCP_STEP2) == 0)
                    123:                        ;
                    124: #              define STEP1MASK 0174377
                    125: #              define STEP1GOOD (TMSCP_STEP2|TMSCP_IE|(NCMDL2<<3)|NRSPL2)
                    126:                if ((tmscpaddr->tmscpsa&STEP1MASK) != STEP1GOOD)
                    127:                        printf("tmscpopen: step 1 not successful sa=%o\n",tmscpaddr->tmscpsa&0xffff);
                    128:                tmscpaddr->tmscpsa = (short)&tmscp_ubaddr->tmscp_ca.ca_ringbase;
                    129:  
                    130:                while ((tmscpaddr->tmscpsa & TMSCP_STEP3) == 0)
                    131:                        ;
                    132: #              define STEP2MASK 0174377
                    133: #              define STEP2GOOD (TMSCP_STEP3)
                    134:                if ((tmscpaddr->tmscpsa&STEP2MASK) != STEP2GOOD)
                    135:                        printf("tmscpopen: step 2 not successful sa=%o\n",tmscpaddr->tmscpsa&0xffff);
                    136:                tmscpaddr->tmscpsa = (short)(((int)&tmscp_ubaddr->tmscp_ca.ca_ringbase) >> 16);
                    137:  
                    138:                while ((tmscpaddr->tmscpsa & TMSCP_STEP4) == 0)
                    139:                        ;
                    140: #              define STEP3MASK 0174000
                    141: #              define STEP3GOOD TMSCP_STEP4
                    142:                if ((tmscpaddr->tmscpsa&STEP3MASK) != STEP3GOOD)
                    143:                        printf("tmscpopen: step 3 not successful sa=%o\n",tmscpaddr->tmscpsa&0xffff);
                    144:                tmscpaddr->tmscpsa = TMSCP_GO;
                    145:  
                    146:                /*
                    147:                 * Init cmd & rsp area
                    148:                 */
                    149:                tmscp.tmscp_ca.ca_cmddsc[0] = (long)&tmscp_ubaddr->tmscp_cmd.mscp_cmdref;
                    150:                tmscp.tmscp_cmd.mscp_dscptr = tmscp.tmscp_ca.ca_cmddsc;
                    151:                tmscp.tmscp_cmd.mscp_header.tmscp_vcid = 1;     /* for tape */
                    152:  
                    153:                tmscp.tmscp_ca.ca_rspdsc[0] = (long)&tmscp_ubaddr->tmscp_rsp.mscp_cmdref;
                    154:                tmscp.tmscp_rsp.mscp_dscptr = tmscp.tmscp_ca.ca_rspdsc;
                    155:                tmscp.tmscp_cmd.mscp_cntflgs = 0;
                    156:                if (tmscpcmd(M_OP_STCON, 0) == 0)
                    157:                        {
                    158:                        _stop("tms: open error, STCON");
                    159:                        return;
                    160:                        }
                    161:                tmscp_offline = 0;
                    162:                }
                    163:        tmscp.tmscp_cmd.mscp_unit = io->i_unit&03;
                    164:        /* 
                    165:         * Has this unit been issued an ONLIN?
                    166:         */
                    167:        if (tms_offline[tmscp.tmscp_cmd.mscp_unit])
                    168:                {
                    169:                if ((mp = tmscpcmd(M_OP_ONLIN, 0)) == 0)
                    170:                        {
                    171:                        _stop("tms: open error, ONLIN");
                    172:                        return;
                    173:                        }
                    174:                tms_offline[tmscp.tmscp_cmd.mscp_unit] = 0;
                    175:                }
                    176:        if (io->i_boff < 0 || io->i_boff > 3)
                    177:                _stop("tms: bad offset");
                    178:        else if (io->i_boff > 0)
                    179:                /*
                    180:                 * Skip forward the appropriate number of files on the tape.
                    181:                 */
                    182:                {
                    183:                tmscp.tmscp_cmd.mscp_tmkcnt = io->i_boff;
                    184:                tmscpcmd(M_OP_REPOS, 0);
                    185:                tmscp.tmscp_cmd.mscp_tmkcnt = 0;
                    186:                }
                    187: }
                    188:  
                    189:  
                    190: /*
                    191:  * Close the device (rewind it to BOT)
                    192:  */
                    193: tmscpclose(io)
                    194:        register struct iob *io;
                    195: {
                    196:        tmscpcmd(M_OP_REPOS, M_MD_REWND);
                    197: }
                    198:  
                    199:  
                    200: /*
                    201:  * Set up tmscp command packet.  Cause the controller to poll to pick up
                    202:  * the command.
                    203:  */
                    204: struct mscp *
                    205: tmscpcmd(op,mod)
                    206:        int op, mod;                    /* opcode and modifier (usu 0) */
                    207: {
                    208:        struct mscp *mp;                /* ptr to cmd packet */
                    209:        int i;                          /* read into to init polling */
                    210:  
                    211:        tmscp.tmscp_cmd.mscp_opcode = op;
                    212:        tmscp.tmscp_cmd.mscp_modifier = mod;
                    213:        tmscp.tmscp_cmd.mscp_header.tmscp_msglen = mscp_msglen;
                    214:        tmscp.tmscp_ca.ca_cmddsc[0] |= TMSCP_OWN;       /* | TMSCP_INT */
                    215:        tmscp.tmscp_rsp.mscp_header.tmscp_msglen = mscp_msglen;
                    216:        tmscp.tmscp_ca.ca_rspdsc[0] |= TMSCP_OWN;       /* | TMSCP_INT */
                    217:  
                    218:        i = tmscpaddr->tmscpip;
                    219:        for (;;)
                    220:                {
                    221:                if (tmscpaddr->tmscpsa & TMSCP_ERR)
                    222:                        {
                    223:                        printf("tmscpcmd: Fatal error sa=%o\n", tmscpaddr->tmscpsa & 0xffff);
                    224:                        return(0);
                    225:                        }
                    226:  
                    227:                if (tmscp.tmscp_ca.ca_cmdint)
                    228:                        tmscp.tmscp_ca.ca_cmdint = 0;
                    229:                /*
                    230:                 * This is to handle the case of devices not setting the
                    231:                 * interrupt field in the communications area. Some
                    232:                 * devices (early TU81's) only clear the ownership field
                    233:                 * in the Response Descriptor.
                    234:                 */
                    235: /*
                    236:                if (tmscp.tmscp_ca.ca_rspint)
                    237:                        break;
                    238: */
                    239:                if (!(tmscp.tmscp_ca.ca_rspdsc[0] & (TMSCP_OWN)))
                    240:                        break;
                    241:                }
                    242:        tmscp.tmscp_ca.ca_rspint = 0;
                    243:        mp = &tmscp.tmscp_rsp;
                    244:        if (mp->mscp_opcode != (op|M_OP_END) ||
                    245:           (mp->mscp_status&M_ST_MASK) != M_ST_SUCC)
                    246:                {
                    247:                /* Detect hitting tape mark.  This signifies the end of the
                    248:                 * tape mini-root file.  We don't want to return an error
                    249:                 * condition to the strategy routine.
                    250:                 */
                    251:                if ((mp->mscp_status & M_ST_MASK) == M_ST_TAPEM)
                    252:                        return(mp);
                    253:                return(0);
                    254:                }
                    255:        return(mp);
                    256: }
                    257:  
                    258:  
                    259: /*
                    260:  * Set up to do reads and writes; call tmscpcmd to issue the cmd.
                    261:  */
                    262: tmscpstrategy(io, func)
                    263:        register struct iob *io;
                    264:        int func;
                    265: {
                    266:        register struct mscp *mp;
                    267:        int ubinfo;
                    268:  
                    269:        ubinfo = ubasetup(io, 1);
                    270:        mp = &tmscp.tmscp_cmd;
                    271:        mp->mscp_lbn = io->i_bn;
                    272:        mp->mscp_unit = io->i_unit&03;
                    273:        mp->mscp_bytecnt = io->i_cc;
                    274:        mp->mscp_buffer = (ubinfo & 0x3fffff) | (((ubinfo>>28)&0xf)<<24);
                    275:        if ((mp = tmscpcmd(func == READ ? M_OP_READ : M_OP_WRITE, 0)) == 0)
                    276:                {
                    277:                ubafree(io, ubinfo);
                    278:                printf("tms: I/O error\n");
                    279:                return(-1);
                    280:                }
                    281:        ubafree(io, ubinfo);
                    282:        /*
                    283:         * Detect hitting tape mark so we do it gracefully and return a
                    284:         * character count of 0 to signify end of copy.  Rewind the tape
                    285:         * before returning.
                    286:         */
                    287:        if ((mp->mscp_status & M_ST_MASK) == M_ST_TAPEM)
                    288:                return(0);
                    289:        return(io->i_cc);
                    290: }
                    291:  
                    292: /*ARGSUSED*/
                    293: tmscpioctl(io, cmd, arg)
                    294:        struct iob *io;
                    295:        int cmd;
                    296:        caddr_t arg;
                    297: {
                    298:        return (ECMD);
                    299: }

unix.superglobalmegacorp.com

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