1*3263Swnj /* tm.c 4.3 81/03/15 */ 2*3263Swnj 31811Sbill /* 4*3263Swnj * TM11/TE?? 51811Sbill */ 61811Sbill 71811Sbill #include "../h/param.h" 81811Sbill #include "../h/inode.h" 91811Sbill #include "../h/pte.h" 10*3263Swnj #include "../h/ubareg.h" 111811Sbill #include "saio.h" 12*3263Swnj #include "savax.h" 131811Sbill 14*3263Swnj #include "../h/tmreg.h" 151811Sbill 16*3263Swnj u_short tmstd[] = { 0172520 }; 171811Sbill 181811Sbill tmopen(io) 191924Swnj register struct iob *io; 201811Sbill { 211811Sbill register skip; 221811Sbill 23*3263Swnj tmstrategy(io, TM_REW); 241811Sbill skip = io->i_boff; 251811Sbill while (skip--) { 261811Sbill io->i_cc = 0; 27*3263Swnj while (tmstrategy(io, TM_SFORW)) 281811Sbill ; 291811Sbill } 301811Sbill } 311811Sbill 321811Sbill tmclose(io) 331924Swnj register struct iob *io; 341811Sbill { 351924Swnj 36*3263Swnj tmstrategy(io, TM_REW); 371811Sbill } 381811Sbill 391811Sbill tmstrategy(io, func) 401924Swnj register struct iob *io; 411811Sbill { 421811Sbill register int com, unit, errcnt; 43*3263Swnj register struct device *tmaddr = 44*3263Swnj (struct device *)ubamem(io->i_unit, tmstd[0]); 45*3263Swnj int word, info; 461811Sbill 471811Sbill unit = io->i_unit; 481811Sbill errcnt = 0; 491811Sbill retry: 50*3263Swnj tmquiet(tmaddr); 51*3263Swnj com = (unit<<8); 521811Sbill info = ubasetup(io, 1); 53*3263Swnj tmaddr->tmbc = -io->i_cc; 54*3263Swnj tmaddr->tmba = info; 551811Sbill if (func == READ) 56*3263Swnj tmaddr->tmcs = com | TM_RCOM | TM_GO; 571811Sbill else if (func == WRITE) 58*3263Swnj tmaddr->tmcs = com | TM_WCOM | TM_GO; 59*3263Swnj else if (func == TM_SREV) { 60*3263Swnj tmaddr->tmbc = -1; 61*3263Swnj tmaddr->tmcs = com | TM_SREV | TM_GO; 621924Swnj return (0); 631811Sbill } else 64*3263Swnj tmaddr->tmcs = com | func | TM_GO; 651924Swnj for (;;) { 66*3263Swnj word = tmaddr->tmcs; 67*3263Swnj if (word&TM_CUR) 681924Swnj break; 691924Swnj } 701811Sbill ; 71*3263Swnj ubafree(io, info); 72*3263Swnj word = tmaddr->tmer; 73*3263Swnj if (word&TMER_EOT) 741811Sbill return(0); 751924Swnj if (word < 0) { 761811Sbill if (errcnt == 0) 77*3263Swnj printf("te error: er=%o", tmaddr->tmer); 781811Sbill if (errcnt==10) { 791811Sbill printf("\n"); 801811Sbill return(-1); 811811Sbill } 821811Sbill errcnt++; 83*3263Swnj tmstrategy(io, TM_SREV); 841811Sbill goto retry; 851811Sbill } 861811Sbill if (errcnt) 871811Sbill printf(" recovered by retry\n"); 88*3263Swnj return (io->i_cc+tmaddr->tmbc); 891811Sbill } 901811Sbill 91*3263Swnj tmquiet(tmaddr) 92*3263Swnj register struct device *tmaddr; 931811Sbill { 941924Swnj register word; 951924Swnj for (;;) { 96*3263Swnj word = tmaddr->tmcs; 97*3263Swnj if (word&TM_CUR) 981924Swnj break; 991924Swnj } 1001924Swnj for (;;) { 101*3263Swnj word = tmaddr->tmer; 102*3263Swnj if ((word&TMER_TUR) && (word&TMER_SDWN)==0) 1031924Swnj break; 1041924Swnj } 1051811Sbill } 106