1*5157Sroot /* tm.c 4.6 81/12/01 */ 23263Swnj 31811Sbill /* 43263Swnj * TM11/TE?? 51811Sbill */ 61811Sbill 71811Sbill #include "../h/param.h" 81811Sbill #include "../h/inode.h" 91811Sbill #include "../h/pte.h" 103263Swnj #include "../h/ubareg.h" 111811Sbill #include "saio.h" 123263Swnj #include "savax.h" 131811Sbill 143263Swnj #include "../h/tmreg.h" 151811Sbill 163263Swnj u_short tmstd[] = { 0172520 }; 171811Sbill 181811Sbill tmopen(io) 191924Swnj register struct iob *io; 201811Sbill { 211811Sbill register skip; 221811Sbill 233263Swnj tmstrategy(io, TM_REW); 241811Sbill skip = io->i_boff; 251811Sbill while (skip--) { 261811Sbill io->i_cc = 0; 273477Sroot tmstrategy(io, TM_SFORW); 281811Sbill } 291811Sbill } 301811Sbill 311811Sbill tmclose(io) 321924Swnj register struct iob *io; 331811Sbill { 341924Swnj 353263Swnj tmstrategy(io, TM_REW); 361811Sbill } 371811Sbill 381811Sbill tmstrategy(io, func) 391924Swnj register struct iob *io; 401811Sbill { 411811Sbill register int com, unit, errcnt; 42*5157Sroot register struct tmdevice *tmaddr = 43*5157Sroot (struct tmdevice *)ubamem(io->i_unit, tmstd[0]); 443263Swnj int word, info; 451811Sbill 461811Sbill unit = io->i_unit; 471811Sbill errcnt = 0; 481811Sbill retry: 493263Swnj tmquiet(tmaddr); 503263Swnj com = (unit<<8); 511811Sbill info = ubasetup(io, 1); 523263Swnj tmaddr->tmbc = -io->i_cc; 533263Swnj tmaddr->tmba = info; 541811Sbill if (func == READ) 553263Swnj tmaddr->tmcs = com | TM_RCOM | TM_GO; 561811Sbill else if (func == WRITE) 573263Swnj tmaddr->tmcs = com | TM_WCOM | TM_GO; 583263Swnj else if (func == TM_SREV) { 593263Swnj tmaddr->tmbc = -1; 603263Swnj tmaddr->tmcs = com | TM_SREV | TM_GO; 611924Swnj return (0); 621811Sbill } else 633263Swnj tmaddr->tmcs = com | func | TM_GO; 641924Swnj for (;;) { 653263Swnj word = tmaddr->tmcs; 663263Swnj if (word&TM_CUR) 671924Swnj break; 681924Swnj } 693263Swnj ubafree(io, info); 703263Swnj word = tmaddr->tmer; 713263Swnj if (word&TMER_EOT) 721811Sbill return(0); 731924Swnj if (word < 0) { 741811Sbill if (errcnt == 0) 753477Sroot printf("te error: er=%b", tmaddr->tmer, TMER_BITS); 761811Sbill if (errcnt==10) { 771811Sbill printf("\n"); 781811Sbill return(-1); 791811Sbill } 801811Sbill errcnt++; 813263Swnj tmstrategy(io, TM_SREV); 821811Sbill goto retry; 831811Sbill } 841811Sbill if (errcnt) 851811Sbill printf(" recovered by retry\n"); 863263Swnj return (io->i_cc+tmaddr->tmbc); 871811Sbill } 881811Sbill 893263Swnj tmquiet(tmaddr) 90*5157Sroot register struct tmdevice *tmaddr; 911811Sbill { 921924Swnj register word; 931924Swnj for (;;) { 943263Swnj word = tmaddr->tmcs; 953263Swnj if (word&TM_CUR) 961924Swnj break; 971924Swnj } 981924Swnj for (;;) { 993263Swnj word = tmaddr->tmer; 1003263Swnj if ((word&TMER_TUR) && (word&TMER_SDWN)==0) 1011924Swnj break; 1021924Swnj } 1031811Sbill } 104