1*11383Ssam /* tm.c 4.10 83/03/02 */ 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*11383Ssam if (word & TM_CUR) 701924Swnj break; 711924Swnj } 723263Swnj ubafree(io, info); 733263Swnj word = tmaddr->tmer; 74*11383Ssam if (word & TMER_EOT) 75*11383Ssam return (0); 76*11383Ssam if (word & TM_ERR) { 77*11383Ssam if (word & TMER_EOF) 78*11383Ssam return (0); 791811Sbill if (errcnt == 0) 80*11383Ssam printf("te error: er=%b", word, TMER_BITS); 81*11383Ssam if (errcnt == 10) { 821811Sbill printf("\n"); 83*11383Ssam return (-1); 841811Sbill } 851811Sbill errcnt++; 863263Swnj tmstrategy(io, TM_SREV); 871811Sbill goto retry; 881811Sbill } 891811Sbill if (errcnt) 901811Sbill printf(" recovered by retry\n"); 91*11383Ssam if (word & TMER_EOF) 92*11383Ssam return (0); 93*11383Ssam return (io->i_cc + tmaddr->tmbc); 941811Sbill } 951811Sbill 963263Swnj tmquiet(tmaddr) 975157Sroot register struct tmdevice *tmaddr; 981811Sbill { 991924Swnj register word; 1001924Swnj for (;;) { 1013263Swnj word = tmaddr->tmcs; 1023263Swnj if (word&TM_CUR) 1031924Swnj break; 1041924Swnj } 1051924Swnj for (;;) { 1063263Swnj word = tmaddr->tmer; 1073263Swnj if ((word&TMER_TUR) && (word&TMER_SDWN)==0) 1081924Swnj break; 1091924Swnj } 1101811Sbill } 111