1*3477Sroot /* tm.c 4.4 81/04/03 */ 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; 27*3477Sroot 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; 423263Swnj register struct device *tmaddr = 433263Swnj (struct device *)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; 71*3477Sroot printf("tmer %b\n", word, TMER_BITS); 723263Swnj if (word&TMER_EOT) 731811Sbill return(0); 741924Swnj if (word < 0) { 751811Sbill if (errcnt == 0) 76*3477Sroot printf("te error: er=%b", tmaddr->tmer, TMER_BITS); 771811Sbill if (errcnt==10) { 781811Sbill printf("\n"); 791811Sbill return(-1); 801811Sbill } 811811Sbill errcnt++; 823263Swnj tmstrategy(io, TM_SREV); 831811Sbill goto retry; 841811Sbill } 851811Sbill if (errcnt) 861811Sbill printf(" recovered by retry\n"); 873263Swnj return (io->i_cc+tmaddr->tmbc); 881811Sbill } 891811Sbill 903263Swnj tmquiet(tmaddr) 913263Swnj register struct device *tmaddr; 921811Sbill { 931924Swnj register word; 941924Swnj for (;;) { 953263Swnj word = tmaddr->tmcs; 963263Swnj if (word&TM_CUR) 971924Swnj break; 981924Swnj } 991924Swnj for (;;) { 1003263Swnj word = tmaddr->tmer; 1013263Swnj if ((word&TMER_TUR) && (word&TMER_SDWN)==0) 1021924Swnj break; 1031924Swnj } 1041811Sbill } 105