1*9186Ssam /* tm.c 4.8 82/11/13 */ 23263Swnj 31811Sbill /* 43263Swnj * TM11/TE?? 51811Sbill */ 61811Sbill 71811Sbill #include "../h/param.h" 81811Sbill #include "../h/inode.h" 91811Sbill #include "../h/pte.h" 107447Sroot #include "../h/fs.h" 11*9186Ssam 12*9186Ssam #include "../vaxuba/ubareg.h" 13*9186Ssam #include "../vaxuba/tmreg.h" 14*9186Ssam 151811Sbill #include "saio.h" 163263Swnj #include "savax.h" 171811Sbill 181811Sbill 193263Swnj u_short tmstd[] = { 0172520 }; 201811Sbill 211811Sbill tmopen(io) 221924Swnj register struct iob *io; 231811Sbill { 241811Sbill register skip; 251811Sbill 263263Swnj tmstrategy(io, TM_REW); 271811Sbill skip = io->i_boff; 281811Sbill while (skip--) { 291811Sbill io->i_cc = 0; 303477Sroot tmstrategy(io, TM_SFORW); 311811Sbill } 321811Sbill } 331811Sbill 341811Sbill tmclose(io) 351924Swnj register struct iob *io; 361811Sbill { 371924Swnj 383263Swnj tmstrategy(io, TM_REW); 391811Sbill } 401811Sbill 411811Sbill tmstrategy(io, func) 421924Swnj register struct iob *io; 431811Sbill { 441811Sbill register int com, unit, errcnt; 455157Sroot register struct tmdevice *tmaddr = 465157Sroot (struct tmdevice *)ubamem(io->i_unit, tmstd[0]); 473263Swnj int word, info; 481811Sbill 491811Sbill unit = io->i_unit; 501811Sbill errcnt = 0; 511811Sbill retry: 523263Swnj tmquiet(tmaddr); 533263Swnj com = (unit<<8); 541811Sbill info = ubasetup(io, 1); 553263Swnj tmaddr->tmbc = -io->i_cc; 563263Swnj tmaddr->tmba = info; 571811Sbill if (func == READ) 583263Swnj tmaddr->tmcs = com | TM_RCOM | TM_GO; 591811Sbill else if (func == WRITE) 603263Swnj tmaddr->tmcs = com | TM_WCOM | TM_GO; 613263Swnj else if (func == TM_SREV) { 623263Swnj tmaddr->tmbc = -1; 633263Swnj tmaddr->tmcs = com | TM_SREV | TM_GO; 641924Swnj return (0); 651811Sbill } else 663263Swnj tmaddr->tmcs = com | func | TM_GO; 671924Swnj for (;;) { 683263Swnj word = tmaddr->tmcs; 693263Swnj if (word&TM_CUR) 701924Swnj break; 711924Swnj } 723263Swnj ubafree(io, info); 733263Swnj word = tmaddr->tmer; 743263Swnj if (word&TMER_EOT) 751811Sbill return(0); 761924Swnj if (word < 0) { 771811Sbill if (errcnt == 0) 783477Sroot printf("te error: er=%b", tmaddr->tmer, TMER_BITS); 791811Sbill if (errcnt==10) { 801811Sbill printf("\n"); 811811Sbill return(-1); 821811Sbill } 831811Sbill errcnt++; 843263Swnj tmstrategy(io, TM_SREV); 851811Sbill goto retry; 861811Sbill } 871811Sbill if (errcnt) 881811Sbill printf(" recovered by retry\n"); 893263Swnj return (io->i_cc+tmaddr->tmbc); 901811Sbill } 911811Sbill 923263Swnj tmquiet(tmaddr) 935157Sroot register struct tmdevice *tmaddr; 941811Sbill { 951924Swnj register word; 961924Swnj for (;;) { 973263Swnj word = tmaddr->tmcs; 983263Swnj if (word&TM_CUR) 991924Swnj break; 1001924Swnj } 1011924Swnj for (;;) { 1023263Swnj word = tmaddr->tmer; 1033263Swnj if ((word&TMER_TUR) && (word&TMER_SDWN)==0) 1041924Swnj break; 1051924Swnj } 1061811Sbill } 107