BSD 3 development
authorBill Joy <wnj@ucbvax.Berkeley.EDU>
Thu, 3 Jan 1980 04:37:34 +0000 (20:37 -0800)
committerBill Joy <wnj@ucbvax.Berkeley.EDU>
Thu, 3 Jan 1980 04:37:34 +0000 (20:37 -0800)
Work on file usr/src/sys/stand/ht.c

Synthesized-from: 3bsd

usr/src/sys/stand/ht.c [new file with mode: 0644]

diff --git a/usr/src/sys/stand/ht.c b/usr/src/sys/stand/ht.c
new file mode 100644 (file)
index 0000000..ca7bc9a
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ * TJU16 tape driver
+ */
+
+#include "../h/param.h"
+#include "../h/inode.h"
+#include "../h/mba.h"
+#include "saio.h"
+
+struct device
+{
+       int     htcs1;
+       int     htds;
+       int     hter;
+       int     htmr;
+       int     htas;
+       int     htfc;
+       int     htdt;
+       int     htck;
+       int     htsn;
+       int     httc;
+};
+
+#define        HTADDR  ((struct device *)(PHYSMBA1 + MBA_ERB))
+
+#define        GO      01
+#define        WCOM    060
+#define        RCOM    070
+#define        NOP     0
+#define        WEOF    026
+#define        SFORW   030
+#define        SREV    032
+#define        ERASE   024
+#define        REW     06
+#define        DCLR    010
+#define P800   01700           /* 800 + pdp11 mode */
+#define        P1600   02300           /* 1600 + pdp11 mode */
+#define        IENABLE 0100
+#define        RDY     0200
+#define        TM      04
+#define        DRY     0200
+#define EOT    02000
+#define CS     02000
+#define COR    0100000
+#define PES    040
+#define WRL    04000
+#define MOL    010000
+#define ERR    040000
+#define FCE    01000
+#define        TRE     040000
+#define HARD   064023  /* UNS|OPI|NEF|FMT|RMR|ILR|ILF */
+
+#define        SIO     1
+#define        SSFOR   2
+#define        SSREV   3
+#define SRETRY 4
+#define SCOM   5
+#define SOK    6
+
+htopen(io)
+register struct iob *io;
+{
+       register skip;
+       int i;
+
+       htinit();
+       htstrategy(io, REW);
+       skip = io->i_boff;
+       while (skip--) {
+               io->i_cc = -1;
+               while (htstrategy(io, SFORW))
+                       ;
+               i = 65536;
+               while (--i)
+                       ;
+               htstrategy(io, NOP);
+       }
+}
+
+htclose(io)
+register struct iob *io;
+{
+       htstrategy(io, REW);
+}
+
+htstrategy(io, func)
+register struct iob *io;
+{
+       register int unit, den, errcnt, ds;
+       short fc;
+
+       unit = io->i_unit;
+       errcnt = 0;
+retry:
+       if(unit & 1)
+               den = P1600;
+       else
+               den = P800;
+       htquiet();
+       if((HTADDR->httc&03777) != den)
+               HTADDR->httc = den;
+       HTADDR->htfc = -io->i_cc;
+       if (func == SREV) {
+               HTADDR->htfc = -1;
+               HTADDR->htcs1 = SREV | GO;
+               return(0);
+       }
+       if (func == READ || func == WRITE)
+               mbastart(io, HTADDR, func);
+       else
+               HTADDR->htcs1 = func | GO;
+       htquiet();
+       ds = HTADDR->htds & TM;
+       if (ds&TM) {
+               htinit();
+               return(0);
+       }
+       if (ds&ERR) {
+               if (errcnt == 0)
+                       printf("tape error: ds=%x, er=%x, mbasr=%x",
+                           HTADDR->htds, HTADDR->hter, PHYSMBA1->mba_sr);
+               htinit();
+               if (errcnt == 10) {
+                       printf("\n");
+                       return(-1);
+               }
+               errcnt++;
+               htstrategy(io, SREV);
+               goto retry;
+       }
+       if (errcnt)
+               printf(" recovered by retry\n");
+       fc = HTADDR->htfc;
+       return(io->i_cc+fc);
+}
+
+htinit()
+{
+
+       HTADDR->htcs1 = DCLR|GO;
+}
+
+htquiet()
+{
+       register int s;
+
+       do
+               s = HTADDR->htds;
+       while ((s & RDY) == 0);
+}