1*1811Sbill /* tm.c 4.1 11/14/80 */ 2*1811Sbill /* 3*1811Sbill * TM tape driver 4*1811Sbill */ 5*1811Sbill 6*1811Sbill #include "../h/param.h" 7*1811Sbill #include "../h/inode.h" 8*1811Sbill #include "../h/pte.h" 9*1811Sbill #include "../h/uba.h" 10*1811Sbill #include "saio.h" 11*1811Sbill 12*1811Sbill struct device { 13*1811Sbill short tmer; 14*1811Sbill short tmcs; 15*1811Sbill short tmbc; 16*1811Sbill u_short tmba; 17*1811Sbill short tmdb; 18*1811Sbill short tmrd; 19*1811Sbill }; 20*1811Sbill 21*1811Sbill #define TMADDR ((struct device *)(PHYSUMEM + 0772520 - UNIBASE)) 22*1811Sbill 23*1811Sbill #define GO 01 24*1811Sbill #define RCOM 02 25*1811Sbill #define WCOM 04 26*1811Sbill #define WEOF 06 27*1811Sbill #define SFORW 010 28*1811Sbill #define SREV 012 29*1811Sbill #define WIRG 014 30*1811Sbill #define REW 016 31*1811Sbill #define DENS 060000 /* 9-channel */ 32*1811Sbill #define IENABLE 0100 33*1811Sbill #define CRDY 0200 34*1811Sbill #define GAPSD 010000 35*1811Sbill #define TUR 1 36*1811Sbill #define SDWN 010 37*1811Sbill #define HARD 0102200 /* ILC, EOT, NXM */ 38*1811Sbill #define EOF 0040000 39*1811Sbill 40*1811Sbill #define SSEEK 1 41*1811Sbill #define SIO 2 42*1811Sbill 43*1811Sbill tmopen(io) 44*1811Sbill register struct iob *io; 45*1811Sbill { 46*1811Sbill register skip; 47*1811Sbill 48*1811Sbill tmstrategy(io, REW); 49*1811Sbill skip = io->i_boff; 50*1811Sbill while (skip--) { 51*1811Sbill io->i_cc = 0; 52*1811Sbill while (tmstrategy(io, SFORW)) 53*1811Sbill ; 54*1811Sbill } 55*1811Sbill } 56*1811Sbill 57*1811Sbill tmclose(io) 58*1811Sbill register struct iob *io; 59*1811Sbill { 60*1811Sbill tmstrategy(io, REW); 61*1811Sbill } 62*1811Sbill 63*1811Sbill tmstrategy(io, func) 64*1811Sbill register struct iob *io; 65*1811Sbill { 66*1811Sbill register int com, unit, errcnt; 67*1811Sbill int info; 68*1811Sbill 69*1811Sbill unit = io->i_unit; 70*1811Sbill errcnt = 0; 71*1811Sbill retry: 72*1811Sbill tmquiet(); 73*1811Sbill com = (unit<<8)|DENS; 74*1811Sbill info = ubasetup(io, 1); 75*1811Sbill TMADDR->tmbc = -io->i_cc; 76*1811Sbill TMADDR->tmba = info; 77*1811Sbill if (func == READ) 78*1811Sbill TMADDR->tmcs = com | RCOM | GO; 79*1811Sbill else if (func == WRITE) 80*1811Sbill TMADDR->tmcs = com | WCOM | GO; 81*1811Sbill else if (func == SREV) { 82*1811Sbill TMADDR->tmbc = -1; 83*1811Sbill TMADDR->tmcs = com | SREV | GO; 84*1811Sbill return(0); 85*1811Sbill } else 86*1811Sbill TMADDR->tmcs = com | func | GO; 87*1811Sbill while ((TMADDR->tmcs&CRDY) == 0) 88*1811Sbill ; 89*1811Sbill ubafree(info); 90*1811Sbill if (TMADDR->tmer&EOF) 91*1811Sbill return(0); 92*1811Sbill if (TMADDR->tmer < 0) { 93*1811Sbill if (errcnt == 0) 94*1811Sbill printf("tape error: er=%o", TMADDR->tmer); 95*1811Sbill if (errcnt==10) { 96*1811Sbill printf("\n"); 97*1811Sbill return(-1); 98*1811Sbill } 99*1811Sbill errcnt++; 100*1811Sbill tmstrategy(io, SREV); 101*1811Sbill goto retry; 102*1811Sbill } 103*1811Sbill if (errcnt) 104*1811Sbill printf(" recovered by retry\n"); 105*1811Sbill return( io->i_cc+TMADDR->tmbc ); 106*1811Sbill } 107*1811Sbill 108*1811Sbill tmquiet() 109*1811Sbill { 110*1811Sbill while ((TMADDR->tmcs&CRDY) == 0) 111*1811Sbill ; 112*1811Sbill while ((TMADDR->tmer&TUR) == 0) 113*1811Sbill ; 114*1811Sbill while ((TMADDR->tmer&SDWN) != 0) 115*1811Sbill ; 116*1811Sbill } 117