Annotation of 41BSD/4.0.upgrade/sys/stand/ts.c, revision 1.1.1.1

1.1       root        1: /*     ts.c    4.4     81/12/01        */
                      2: 
                      3: /*
                      4:  * TS11 tape driver
                      5:  */
                      6: 
                      7: #include "../h/param.h"
                      8: #include "../h/tsreg.h"
                      9: #include "../h/inode.h"
                     10: #include "../h/pte.h"
                     11: #include "../h/ubareg.h"
                     12: #include "saio.h"
                     13: #include "savax.h"
                     14: 
                     15: 
                     16: u_short        tsstd[] = { 0772520 };
                     17: 
                     18: struct iob     ctsbuf;
                     19: 
                     20: u_short        ts_uba;                 /* Unibus address of ts structure */
                     21: 
                     22: struct tsdevice *tsaddr = 0;
                     23: 
                     24: struct ts {
                     25:        struct ts_cmd ts_cmd;
                     26:        struct ts_char ts_char;
                     27:        struct ts_sts ts_sts;
                     28: } ts;
                     29: 
                     30: tsopen(io)
                     31:        register struct iob *io;
                     32: {
                     33:        static struct ts *ts_ubaddr;
                     34:        long i = 0;
                     35: 
                     36:        if (tsaddr == 0)
                     37:                tsaddr = ubamem(io->i_unit, tsstd[0]);
                     38:        tsaddr->tssr = 0;
                     39:        while ((tsaddr->tssr & TS_SSR)==0) {
                     40:                if (++i > 1000000) {
                     41:                        printf("ts: not ready\n");
                     42:                        return;
                     43:                }
                     44:        }
                     45:        if (tsaddr->tssr&TS_OFL) {
                     46:                printf("ts: offline\n");
                     47:                return;
                     48:        }
                     49:        if (tsaddr->tssr&TS_NBA) {
                     50:                int i;
                     51: 
                     52:                ctsbuf.i_ma = (caddr_t) &ts;
                     53:                ctsbuf.i_cc = sizeof(ts);
                     54:                if (ts_ubaddr == 0)
                     55:                        ts_ubaddr = (struct ts *)ubasetup(&ctsbuf, 2);
                     56:                ts_uba = (u_short)((long)ts_ubaddr + (((long)ts_ubaddr>>16)&03));
                     57:                ts.ts_char.char_addr = (int)&ts_ubaddr->ts_sts;
                     58:                ts.ts_char.char_size = sizeof(ts.ts_sts);
                     59:                ts.ts_char.char_mode = TS_ESS;
                     60:                ts.ts_cmd.c_cmd = TS_ACK|TS_SETCHR;
                     61:                i = (int)&ts_ubaddr->ts_char;
                     62:                ts.ts_cmd.c_loba = i;
                     63:                ts.ts_cmd.c_hiba = (i>>16)&3;
                     64:                ts.ts_cmd.c_size = sizeof(ts.ts_char);
                     65:                tsaddr->tsdb = ts_uba;
                     66:        }
                     67:        tsstrategy(io, TS_REW);
                     68:        if (io->i_cc = io->i_boff)
                     69:                tsstrategy(io, TS_SFORWF);
                     70: }
                     71: 
                     72: tsclose(io)
                     73:        register struct iob *io;
                     74: {
                     75: 
                     76:        tsstrategy(io, TS_REW);
                     77: }
                     78: 
                     79: tsstrategy(io, func)
                     80:        register struct iob *io;
                     81: {
                     82:        register int errcnt, info = 0;
                     83: 
                     84:        errcnt = 0;
                     85: retry:
                     86:        while ((tsaddr->tssr & TS_SSR) == 0)
                     87:                DELAY(100);
                     88:        if (func == TS_REW || func == TS_SFORWF)
                     89:                ts.ts_cmd.c_repcnt = io->i_cc;
                     90:        else {
                     91:                info = ubasetup(io, 1);
                     92:                ts.ts_cmd.c_size = io->i_cc;
                     93:                ts.ts_cmd.c_loba = info;
                     94:                ts.ts_cmd.c_hiba = (info>>16)&3;
                     95:        }
                     96:        if (func == READ)
                     97:                func = TS_RCOM;
                     98:        else if (func == WRITE)
                     99:                func = TS_WCOM;
                    100:        ts.ts_cmd.c_cmd = TS_ACK|TS_CVC|func;
                    101:        tsaddr->tsdb = ts_uba;
                    102:        do
                    103:                DELAY(100)
                    104:        while ((tsaddr->tssr & TS_SSR) == 0);
                    105:        if (info)
                    106:                ubafree(io, info);
                    107:        if (ts.ts_sts.s_xs0 & TS_TMK)
                    108:                return (0);
                    109:        if (tsaddr->tssr & TS_SC) {
                    110:                printf("ts tape error: er=%b, xs0=%b",
                    111:                    tsaddr->tssr, TSSR_BITS,
                    112:                    ts.ts_sts.s_xs0, TSXS0_BITS);
                    113:                if (errcnt==10) {
                    114:                        printf("ts: unrecovered error\n");
                    115:                        return (-1);
                    116:                }
                    117:                errcnt++;
                    118:                if (func == TS_RCOM || func == TS_WCOM)
                    119:                        func |= TS_RETRY;
                    120:                goto retry;
                    121:        }
                    122:        if (errcnt)
                    123:                printf("ts: recovered by retry\n");
                    124:        return (io->i_cc - ts.ts_sts.s_rbpcr);
                    125: }

unix.superglobalmegacorp.com

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