Annotation of cci/sys/stand/vdfmt/io.c, revision 1.1

1.1     ! root        1: #include       "vdfmt.h"
        !             2: #include       "cmd.h"
        !             3: 
        !             4: 
        !             5: /*
        !             6: **
        !             7: */
        !             8: 
        !             9: extern int     wait_for_char;
        !            10: 
        !            11: static cmd_text_element        nul_table[] = {
        !            12:        { 0,    "",     "" }
        !            13: };
        !            14: 
        !            15: char   *clean_up = "Cleaning up...  Please wait.\n";
        !            16: 
        !            17: 
        !            18: /*
        !            19: **
        !            20: */
        !            21: 
        !            22: poll(wait)
        !            23: int    wait;
        !            24: {
        !            25:        int     tokens[10];
        !            26: 
        !            27:        wait_for_char = 0;
        !            28:        vdtimeout = wait*1000*1000;
        !            29:        uncache(&(dcb.operrsta));
        !            30:        while (!((dcb.operrsta) & (DCBCMP | DCBABT))) {
        !            31:                if(kill_processes == false) {
        !            32:                        get_text_cmd(nul_table, tokens);
        !            33:                        if(kill_processes == true) {
        !            34:                                indent();
        !            35:                                print(clean_up);
        !            36:                                exdent(1);
        !            37:                        }
        !            38:                }
        !            39:                vdtimeout--;
        !            40:                uncache(&(dcb.operrsta));
        !            41:                if (vdtimeout <= 0) {
        !            42:                        if(C_INFO.type == SMDCTLR)
        !            43:                                printf("\nVDDC");
        !            44:                        else
        !            45:                                printf("\nSMD-E");
        !            46:                        printf(": Controller timeout");
        !            47:                        VDDC_ABORT(C_INFO.addr, C_INFO.type);
        !            48:                        DELAY(30000);
        !            49:                        break;
        !            50:                }
        !            51:        }
        !            52:        if((vdtimeout > 0)) {
        !            53:                if(C_INFO.type == SMD_ECTLR) {
        !            54:                        uncache(&(C_INFO.addr->cdr_csr));
        !            55:                        while(C_INFO.addr->cdr_csr & CS_GO) {
        !            56:                                DELAY(50);
        !            57:                                uncache(&(C_INFO.addr->cdr_csr));
        !            58:                        }
        !            59:                }
        !            60:                DELAY(500);
        !            61:        }
        !            62:        if((dcb.opcode == RD) || (dcb.opcode == RD_RAW))
        !            63:                mtpr(0, PADC);
        !            64:        uncache(&(dcb.operrsta));
        !            65:        wait_for_char = 1;
        !            66: }
        !            67: 
        !            68: 
        !            69: /*
        !            70: **     Access_with_no_trailer is used to perform controller functions which
        !            71: ** require no data movement.
        !            72: */
        !            73: 
        !            74: access_with_no_trailer(function, wait_time)
        !            75: int    function, wait_time;
        !            76: {
        !            77:        dcb.opcode = function;          /* command */
        !            78:        dcb.intflg = NOINT;
        !            79:        dcb.nxtdcb = (fmt_dcb *)0;      /* end of chain */
        !            80:        dcb.operrsta  = 0;
        !            81:        dcb.devselect = (function == VDSTART) ? 0 : (char)cur.drive;
        !            82:        dcb.trailcnt = (char)0;
        !            83:        mdcb.firstdcb = &dcb;
        !            84:        mdcb.vddcstat = 0;
        !            85:        VDDC_ATTENTION(C_INFO.addr, &mdcb, C_INFO.type);        
        !            86:        poll(wait_time);
        !            87:        if(vdtimeout <= 0) {
        !            88:                printf(" during startup operation.\n");
        !            89:                _longjmp(abort_environ, 1);
        !            90:        }
        !            91:        return dcb.operrsta;
        !            92: }
        !            93: 
        !            94: 
        !            95: /*
        !            96: **     access_dsk is used by other routines to do reads and writes to the disk.
        !            97: ** The status of the read / write is returned to the caller for processing.
        !            98: */
        !            99: 
        !           100: access_dsk(buf, dskaddr, func, count, wait)
        !           101: char   *buf;
        !           102: dskadr *dskaddr;
        !           103: int    func, count, wait;
        !           104: {
        !           105:        cur.daddr.cylinder = dskaddr->cylinder;
        !           106:        cur.daddr.track = dskaddr->track;
        !           107:        wait_for_char = 0;
        !           108:        dcb.opcode = func;              /* format sector command */
        !           109:        dcb.intflg = NOINT;
        !           110:        dcb.nxtdcb = (fmt_dcb *)0;      /* end of chain */
        !           111:        dcb.operrsta  = 0;
        !           112:        dcb.devselect = (char)cur.drive;
        !           113:        if(func == SEEK) {
        !           114:                dcb.trailcnt = (char)(sizeof(trseek) / sizeof(long));
        !           115:                dcb.trail.sktrail.skaddr.cylinder = dskaddr->cylinder;
        !           116:                dcb.trail.sktrail.skaddr.track = dskaddr->track;
        !           117:                dcb.trail.sktrail.skaddr.sector = dskaddr->sector;
        !           118:        }
        !           119:        else {
        !           120:                dcb.trailcnt = (char)(sizeof(trrw) / sizeof(long));
        !           121:                dcb.trail.rwtrail.memadr = buf; 
        !           122:                dcb.trail.rwtrail.wcount=count*(CURRENT->secsize/sizeof(short));
        !           123:                dcb.trail.rwtrail.disk.cylinder = dskaddr->cylinder;
        !           124:                dcb.trail.rwtrail.disk.track = dskaddr->track;
        !           125:                dcb.trail.rwtrail.disk.sector = dskaddr->sector;
        !           126:        }
        !           127:        mdcb.firstdcb = &dcb;
        !           128:        mdcb.vddcstat = 0;
        !           129:        VDDC_ATTENTION(C_INFO.addr, &mdcb, C_INFO.type);
        !           130:        if(wait) {
        !           131:                poll(2*60);
        !           132:                if(vdtimeout <= 0) {
        !           133:                        printf(" in access_dsk.\n");
        !           134:                        _longjmp(abort_environ, 1);
        !           135:                }
        !           136:        }
        !           137:        wait_for_char = 1;
        !           138:        return dcb.operrsta;
        !           139: }
        !           140: 
        !           141: 
        !           142: /*
        !           143: **     Spin_up_drive starts the drives on a controller and waits around for
        !           144: ** the drive to spin up if it is not already spinning.
        !           145: */
        !           146: 
        !           147: spin_up_drive()
        !           148: {
        !           149:        VDDC_RESET(C_INFO.addr, C_INFO.type);
        !           150:        if(C_INFO.type == SMD_ECTLR) {
        !           151:                C_INFO.addr->cdr_csr =  0;
        !           152:                C_INFO.addr->mdcb_tcf =  AM_ENPDA;
        !           153:                C_INFO.addr->dcb_tcf =  AM_ENPDA;
        !           154:                C_INFO.addr->trail_tcf =  AM_ENPDA;
        !           155:                C_INFO.addr->data_tcf =  AM_ENPDA;
        !           156:                C_INFO.addr->cdr_ccf = CCF_SEN | 0x8 | CCF_STS |
        !           157:                    XMD_32BIT | BSZ_16WRD | CCF_ERR |
        !           158:                    CCF_ENP | CCF_EPE | CCF_EDE | CCF_ECE;
        !           159:        }
        !           160:        access_with_no_trailer(INIT, 10);
        !           161:        access_with_no_trailer(DIAG, 20);
        !           162:        configure_drive(0);
        !           163: }
        !           164: 
        !           165: /*
        !           166: **     Configure_drive tells the controller what kind of drive is attached
        !           167: ** on a particular line.
        !           168: */
        !           169: 
        !           170: configure_drive(pass)
        !           171: int    pass;
        !           172: {
        !           173:        dcb.opcode = RSTCFG;            /* command */
        !           174:        dcb.intflg = NOINT;
        !           175:        dcb.nxtdcb = (fmt_dcb *)0;      /* end of chain */
        !           176:        dcb.operrsta  = 0;
        !           177:        dcb.devselect = (char)cur.drive;
        !           178:        dcb.trail.rstrail.ncyl = CURRENT->ncyl;
        !           179:        dcb.trail.rstrail.nsurfaces = CURRENT->ntrak;
        !           180:        if(C_INFO.type == SMDCTLR)
        !           181:                dcb.trailcnt = (char)2;
        !           182:        else {
        !           183:                dcb.trailcnt = (char)4;
        !           184:                dcb.trail.rstrail.nsectors = CURRENT->nsec;
        !           185:                dcb.trail.rstrail.slip_sec = CURRENT->nslip;
        !           186:                dcb.trail.rstrail.recovery = 0x00;
        !           187:                C_INFO.addr->cyl_skew = (*C_INFO.cylinder_skew)();
        !           188:                C_INFO.addr->trk_skew = (*C_INFO.track_skew)();
        !           189:        }
        !           190:        mdcb.firstdcb = &dcb;
        !           191:        mdcb.vddcstat = 0;
        !           192:        VDDC_ATTENTION(C_INFO.addr, &mdcb, C_INFO.type);
        !           193:        poll(5);
        !           194:        if(vdtimeout <= 0) {
        !           195:                printf(" during drive configuration.\n");
        !           196:                _longjmp(abort_environ, 1);
        !           197:        }
        !           198:        if(dcb.operrsta & (NOTCYLERR | DRVNRDY)) {
        !           199:                if(pass) {
        !           200:                        printf("\nDrive failed to start!\n\n");
        !           201:                        _longjmp(abort_environ, -1);
        !           202:                }
        !           203:                access_with_no_trailer(VDSTART, (cur.drive * 6) + 62);
        !           204:                DELAY((cur.drive * 5500000) + 62000000);
        !           205:                configure_drive(1);
        !           206:        }
        !           207: }
        !           208: 
        !           209: 
        !           210: /*
        !           211: **     data_ok checks an error status word for bit patterns
        !           212: **  associated with error conditions from the VDDC controller.  If a hardware
        !           213: **  error is present then the problem is reported on the console and the program
        !           214: **  is halted.  If a data error is present the a zero is returned.
        !           215: **  If everything is OK then a 1 is returned.
        !           216: */
        !           217: 
        !           218: data_ok()
        !           219: {
        !           220:        register int    status = dcb.operrsta;
        !           221: 
        !           222:        if(status & HARD_ERROR){
        !           223:                if(status & DRVNRDY)
        !           224:                        printf("\nDrive is not ready!");
        !           225:                else if(status & INVDADR)
        !           226:                        printf("\nInvalid disk address issued!");
        !           227:                else if(status & DNEMEM)
        !           228:                        printf("\nNon-existent memory error!");
        !           229:                else if(status & PARERR)
        !           230:                        printf("\nMain memory parity error!");
        !           231:                else if(status & OPABRT) 
        !           232:                        printf("\nCPU aborted operation!");
        !           233:                else if(status & WPTERR)
        !           234:                        printf("\nDrive is write protected!");
        !           235:                else if(status & DSEEKERR)
        !           236:                        printf("\nDisk seek error!");
        !           237:                else if(status & CTLRERR)
        !           238:                        printf("\nController hardware error!");
        !           239:                else
        !           240:                        printf("\nNot on cylinder error!");
        !           241:                printf("   Status = 0x%lx", status);
        !           242:                if(C_INFO.type == SMD_ECTLR)
        !           243:                        printf("  Error code =  0x%x", dcb.err_code & 0xff);
        !           244:                printf("\n");
        !           245:                printf("cylinder = %d, track = %d,", dcb.err_cyl, dcb.err_trk);
        !           246:                printf(" sector = %d, op = 0x%x\n", dcb.err_sec, dcb.opcode);
        !           247:                reset_controller();
        !           248:                dcb.operrsta &= HEADER_ERROR;
        !           249:        }
        !           250:        return (int)(!(status & (DATA_ERROR | HEADER_ERROR)));
        !           251: }
        !           252: 
        !           253: 
        !           254: /*
        !           255: **
        !           256: */
        !           257: 
        !           258: reset_controller()
        !           259: {
        !           260:        printf("Resetting controller.  Please wait...\n");
        !           261:        spin_up_drive();
        !           262:        printf("Controller was reset successfully.\n");
        !           263: }
        !           264: 
        !           265: /*
        !           266: **
        !           267: */
        !           268: 
        !           269: static int     indent_count;
        !           270: 
        !           271: 
        !           272: /*
        !           273: **
        !           274: */
        !           275: 
        !           276: indent()
        !           277: {
        !           278:        indent_count += 2;
        !           279: }
        !           280: 
        !           281: 
        !           282: /*
        !           283: **
        !           284: */
        !           285: 
        !           286: exdent(count)
        !           287: int    count;
        !           288: {
        !           289:        if(count == -1)
        !           290:                indent_count = 0;
        !           291:        else
        !           292:                indent_count -= count * 2;
        !           293:        if(indent_count < 0)
        !           294:                        indent_count = 0;
        !           295: }
        !           296: 
        !           297: 
        !           298: /*
        !           299: **
        !           300: */
        !           301: /*VARARGS1*/
        !           302: print(par0, par1, par2, par3, par4, par5, par6)
        !           303: char   *par0, *par1, *par2, *par3, *par4, *par5, *par6;
        !           304: {
        !           305:        register int    count = indent_count;
        !           306: 
        !           307:        while(count--)
        !           308:                printf(" ");
        !           309:        printf(par0, par1, par2, par3, par4, par5, par6);
        !           310:        DELAY((strlen(par0) + 20) * 9000);
        !           311: }
        !           312: 

unix.superglobalmegacorp.com

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