1*13568Ssam /* tm.c 4.11 83/07/01 */ 23263Swnj 31811Sbill /* 43263Swnj * TM11/TE?? 51811Sbill */ 69806Ssam #include "../machine/pte.h" 71811Sbill 81811Sbill #include "../h/param.h" 91811Sbill #include "../h/inode.h" 107447Sroot #include "../h/fs.h" 119186Ssam 129186Ssam #include "../vaxuba/ubareg.h" 139186Ssam #include "../vaxuba/tmreg.h" 149186Ssam 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; 69*13568Ssam DELAY(100); 7011383Ssam if (word & TM_CUR) 711924Swnj break; 721924Swnj } 733263Swnj ubafree(io, info); 743263Swnj word = tmaddr->tmer; 7511383Ssam if (word & TMER_EOT) 7611383Ssam return (0); 7711383Ssam if (word & TM_ERR) { 7811383Ssam if (word & TMER_EOF) 7911383Ssam return (0); 801811Sbill if (errcnt == 0) 8111383Ssam printf("te error: er=%b", word, TMER_BITS); 8211383Ssam if (errcnt == 10) { 831811Sbill printf("\n"); 8411383Ssam return (-1); 851811Sbill } 861811Sbill errcnt++; 873263Swnj tmstrategy(io, TM_SREV); 881811Sbill goto retry; 891811Sbill } 901811Sbill if (errcnt) 911811Sbill printf(" recovered by retry\n"); 9211383Ssam if (word & TMER_EOF) 9311383Ssam return (0); 9411383Ssam return (io->i_cc + tmaddr->tmbc); 951811Sbill } 961811Sbill 973263Swnj tmquiet(tmaddr) 985157Sroot register struct tmdevice *tmaddr; 991811Sbill { 1001924Swnj register word; 1011924Swnj for (;;) { 1023263Swnj word = tmaddr->tmcs; 103*13568Ssam DELAY(100); 1043263Swnj if (word&TM_CUR) 1051924Swnj break; 1061924Swnj } 1071924Swnj for (;;) { 1083263Swnj word = tmaddr->tmer; 109*13568Ssam DELAY(100); 1103263Swnj if ((word&TMER_TUR) && (word&TMER_SDWN)==0) 1111924Swnj break; 1121924Swnj } 1131811Sbill } 114