lint should get param.c
[unix-history] / usr / src / sys / vax / mba / ht.c
CommitLineData
da7c5cc6
KM
1/*
2 * Copyright (c) 1982 Regents of the University of California.
3 * All rights reserved. The Berkeley software License Agreement
4 * specifies the terms and conditions for redistribution.
5 *
f2e181c6 6 * @(#)ht.c 6.7 (Berkeley) %G%
da7c5cc6 7 */
0deaf016 8
89bd2f01 9#include "tu.h"
a5cc519e 10#if NHT > 0
786dff00 11/*
fcc37d29 12 * TM03/TU?? tape driver
d565635a
BJ
13 *
14 * TODO:
3ee331b1 15 * cleanup messages on errors
d565635a
BJ
16 * test ioctl's
17 * see how many rewind interrups we get if we kick when not at BOT
3ee331b1 18 * fixup rle error on block tape code
786dff00 19 */
961945a8
SL
20#include "../machine/pte.h"
21
969e52ef
JB
22#include "param.h"
23#include "systm.h"
24#include "buf.h"
25#include "conf.h"
26#include "dir.h"
27#include "file.h"
28#include "user.h"
29#include "map.h"
30#include "ioctl.h"
31#include "mtio.h"
32#include "cmap.h"
33#include "uio.h"
48165e7b 34#include "tty.h"
786dff00 35
c895c266 36#include "../vax/cpu.h"
969e52ef
JB
37#include "mbareg.h"
38#include "mbavar.h"
39#include "htreg.h"
fcc37d29
BJ
40
41struct buf rhtbuf[NHT];
42struct buf chtbuf[NHT];
43
44short httypes[] =
fc4d0a69 45 { MBDT_TM03, MBDT_TE16, MBDT_TU45, MBDT_TU77, 0 };
89bd2f01 46struct mba_device *htinfo[NHT];
a0eab615 47int htattach(), htslave(), htustart(), htndtint(), htdtint();
fcc37d29 48struct mba_driver htdriver =
89bd2f01
BJ
49 { htattach, htslave, htustart, 0, htdtint, htndtint,
50 httypes, "ht", "tu", htinfo };
fcc37d29
BJ
51
52#define MASKREG(r) ((r) & 0xffff)
53
54/* bits in minor device */
89bd2f01 55#define TUUNIT(dev) (minor(dev)&03)
fcc37d29
BJ
56#define H_NOREWIND 04
57#define H_1600BPI 08
786dff00 58
d565635a 59#define HTUNIT(dev) (tutoht[TUUNIT(dev)])
89bd2f01 60
fcc37d29
BJ
61#define INF (daddr_t)1000000L /* a block number that wont exist */
62
d565635a 63struct tu_softc {
fcc37d29
BJ
64 char sc_openf;
65 char sc_flags;
66 daddr_t sc_blkno;
67 daddr_t sc_nxrec;
68 u_short sc_erreg;
69 u_short sc_dsreg;
70 short sc_resid;
71 short sc_dens;
89bd2f01
BJ
72 struct mba_device *sc_mi;
73 int sc_slave;
48165e7b 74 struct tty *sc_ttyp; /* record user's tty for errors */
d565635a
BJ
75} tu_softc[NTU];
76short tutoht[NTU];
fcc37d29 77
fcc37d29
BJ
78/*
79 * Bits for sc_flags.
80 */
81#define H_WRITTEN 1 /* last operation was a write */
82#define H_ERASED 2 /* last write retry was an erase gap */
83#define H_REWIND 4 /* last unit start was a rewind */
786dff00 84
3ee331b1
BJ
85char hter_bits[] = HTER_BITS;
86char htds_bits[] = HTDS_BITS;
87
fcc37d29 88/*ARGSUSED*/
89bd2f01
BJ
89htattach(mi)
90 struct mba_device *mi;
91{
92
93}
94
51250c66 95htslave(mi, ms, sn)
89bd2f01
BJ
96 struct mba_device *mi;
97 struct mba_slave *ms;
51250c66 98 int sn;
fcc37d29 99{
d565635a 100 register struct tu_softc *sc = &tu_softc[ms->ms_unit];
64614526
BJ
101 register struct htdevice *htaddr = (struct htdevice *)mi->mi_drv;
102
51250c66 103 htaddr->httc = sn;
64614526
BJ
104 if (htaddr->htdt & HTDT_SPR) {
105 sc->sc_mi = mi;
51250c66 106 sc->sc_slave = sn;
64614526
BJ
107 tutoht[ms->ms_unit] = mi->mi_unit;
108 return (1);
109 } else
110 return (0);
fcc37d29 111}
786dff00
BJ
112
113htopen(dev, flag)
fcc37d29
BJ
114 dev_t dev;
115 int flag;
786dff00 116{
d565635a 117 register int tuunit;
89bd2f01 118 register struct mba_device *mi;
d565635a 119 register struct tu_softc *sc;
cd470e1d 120 int olddens, dens;
786dff00 121
d565635a 122 tuunit = TUUNIT(dev);
1e6047bb
MK
123 if (tuunit >= NTU || (mi = htinfo[HTUNIT(dev)]) == 0 ||
124 mi->mi_alive == 0)
473a2e47 125 return (ENXIO);
1e6047bb
MK
126 if ((sc = &tu_softc[tuunit])->sc_openf)
127 return (EBUSY);
cd470e1d 128 olddens = sc->sc_dens;
3ee331b1 129 dens = sc->sc_dens =
d565635a
BJ
130 ((minor(dev)&H_1600BPI)?HTTC_1600BPI:HTTC_800BPI)|
131 HTTC_PDP11|sc->sc_slave;
cd470e1d
BJ
132 htcommand(dev, HT_SENSE, 1);
133 sc->sc_dens = olddens;
61add2a3 134 if ((sc->sc_dsreg & HTDS_MOL) == 0) {
1d78646d 135 uprintf("tu%d: not online\n", tuunit);
473a2e47 136 return (EIO);
61add2a3
BJ
137 }
138 if ((flag&FWRITE) && (sc->sc_dsreg&HTDS_WRL)) {
1d78646d 139 uprintf("tu%d: no write ring\n", tuunit);
473a2e47 140 return (EIO);
61add2a3
BJ
141 }
142 if ((sc->sc_dsreg & HTDS_BOT) == 0 && (flag&FWRITE) &&
143 dens != sc->sc_dens) {
1d78646d 144 uprintf("tu%d: can't change density in mid-tape\n", tuunit);
473a2e47 145 return (EIO);
fcc37d29 146 }
fcc37d29
BJ
147 sc->sc_openf = 1;
148 sc->sc_blkno = (daddr_t)0;
149 sc->sc_nxrec = INF;
150 sc->sc_flags = 0;
d565635a 151 sc->sc_dens = dens;
48165e7b 152 sc->sc_ttyp = u.u_ttyp;
473a2e47 153 return (0);
786dff00
BJ
154}
155
156htclose(dev, flag)
fcc37d29
BJ
157 register dev_t dev;
158 register flag;
786dff00 159{
d565635a 160 register struct tu_softc *sc = &tu_softc[TUUNIT(dev)];
786dff00 161
fcc37d29
BJ
162 if (flag == FWRITE || ((flag&FWRITE) && (sc->sc_flags&H_WRITTEN))) {
163 htcommand(dev, HT_WEOF, 1);
164 htcommand(dev, HT_WEOF, 1);
165 htcommand(dev, HT_SREV, 1);
786dff00 166 }
fcc37d29 167 if ((minor(dev)&H_NOREWIND) == 0)
fcc37d29
BJ
168 htcommand(dev, HT_REW, 0);
169 sc->sc_openf = 0;
786dff00
BJ
170}
171
fcc37d29
BJ
172htcommand(dev, com, count)
173 dev_t dev;
174 int com, count;
786dff00
BJ
175{
176 register struct buf *bp;
2311123d 177 register int s;
786dff00 178
fcc37d29 179 bp = &chtbuf[HTUNIT(dev)];
2311123d 180 s = spl5();
fcc37d29 181 while (bp->b_flags&B_BUSY) {
9f1dae18 182 if(bp->b_repcnt == 0 && (bp->b_flags&B_DONE))
89bd2f01 183 break;
786dff00
BJ
184 bp->b_flags |= B_WANTED;
185 sleep((caddr_t)bp, PRIBIO);
186 }
dc637456 187 bp->b_flags = B_BUSY|B_READ;
2311123d 188 splx(s);
786dff00 189 bp->b_dev = dev;
fcc37d29
BJ
190 bp->b_command = com;
191 bp->b_repcnt = count;
786dff00 192 bp->b_blkno = 0;
786dff00 193 htstrategy(bp);
fcc37d29
BJ
194 if (count == 0)
195 return;
786dff00 196 iowait(bp);
fcc37d29 197 if (bp->b_flags&B_WANTED)
786dff00 198 wakeup((caddr_t)bp);
fcc37d29 199 bp->b_flags &= B_ERROR;
786dff00
BJ
200}
201
202htstrategy(bp)
fcc37d29 203 register struct buf *bp;
786dff00 204{
d565635a 205 register struct mba_device *mi = htinfo[HTUNIT(bp->b_dev)];
fcc37d29 206 register struct buf *dp;
2311123d 207 register int s;
786dff00 208
786dff00 209 bp->av_forw = NULL;
fcc37d29 210 dp = &mi->mi_tab;
2311123d 211 s = spl5();
fcc37d29
BJ
212 if (dp->b_actf == NULL)
213 dp->b_actf = bp;
786dff00 214 else
fcc37d29
BJ
215 dp->b_actl->av_forw = bp;
216 dp->b_actl = bp;
217 if (dp->b_active == 0)
218 mbustart(mi);
2311123d 219 splx(s);
786dff00
BJ
220}
221
fcc37d29 222htustart(mi)
89bd2f01 223 register struct mba_device *mi;
786dff00 224{
fcc37d29
BJ
225 register struct htdevice *htaddr =
226 (struct htdevice *)mi->mi_drv;
227 register struct buf *bp = mi->mi_tab.b_actf;
d565635a 228 register struct tu_softc *sc = &tu_softc[TUUNIT(bp->b_dev)];
786dff00
BJ
229 daddr_t blkno;
230
fcc37d29 231 htaddr->httc = sc->sc_dens;
244b8363
MK
232#ifdef notdef
233 /* unneeded, may hang controller */
fc4d0a69 234 if (bp == &chtbuf[HTUNIT(bp->b_dev)] && bp->b_command == HT_SENSE) {
9f1dae18
BJ
235 htaddr->htcs1 = HT_SENSE|HT_GO;
236 mbclrattn(mi);
237 }
244b8363 238#endif
fcc37d29
BJ
239 sc->sc_dsreg = htaddr->htds;
240 sc->sc_erreg = htaddr->hter;
241 sc->sc_resid = htaddr->htfc;
242 sc->sc_flags &= ~(H_WRITTEN|H_REWIND);
243 if ((htaddr->htdt & HTDT_SPR) == 0 || (htaddr->htds & HTDS_MOL) == 0)
244 if (sc->sc_openf > 0)
245 sc->sc_openf = -1;
246 if (sc->sc_openf < 0) {
247 bp->b_flags |= B_ERROR;
248 return (MBU_NEXT);
249 }
d565635a 250 if (bp != &chtbuf[HTUNIT(bp->b_dev)]) {
43d66181 251 if (bdbtofsb(bp->b_blkno) > sc->sc_nxrec) {
fcc37d29
BJ
252 bp->b_flags |= B_ERROR;
253 bp->b_error = ENXIO;
0deaf016 254 return (MBU_NEXT);
d565635a 255 }
43d66181 256 if (bdbtofsb(bp->b_blkno) == sc->sc_nxrec &&
fcc37d29
BJ
257 bp->b_flags&B_READ) {
258 bp->b_resid = bp->b_bcount;
259 clrbuf(bp);
0deaf016 260 return (MBU_NEXT);
d565635a
BJ
261 }
262 if ((bp->b_flags&B_READ)==0)
43d66181 263 sc->sc_nxrec = bdbtofsb(bp->b_blkno) + 1;
fcc37d29 264 } else {
0deaf016 265 if (bp->b_command == HT_SENSE)
fcc37d29
BJ
266 return (MBU_NEXT);
267 if (bp->b_command == HT_REW)
268 sc->sc_flags |= H_REWIND;
269 else
270 htaddr->htfc = -bp->b_bcount;
271 htaddr->htcs1 = bp->b_command|HT_GO;
272 return (MBU_STARTED);
273 }
43d66181 274 if ((blkno = sc->sc_blkno) == bdbtofsb(bp->b_blkno)) {
fcc37d29
BJ
275 htaddr->htfc = -bp->b_bcount;
276 if ((bp->b_flags&B_READ) == 0) {
d565635a
BJ
277 if (mi->mi_tab.b_errcnt) {
278 if ((sc->sc_flags & H_ERASED) == 0) {
fcc37d29
BJ
279 sc->sc_flags |= H_ERASED;
280 htaddr->htcs1 = HT_ERASE | HT_GO;
281 return (MBU_STARTED);
282 }
d565635a
BJ
283 sc->sc_flags &= ~H_ERASED;
284 }
fcc37d29
BJ
285 if (htaddr->htds & HTDS_EOT) {
286 bp->b_resid = bp->b_bcount;
b0130242 287 bp->b_flags |= B_ERROR;
fcc37d29
BJ
288 return (MBU_NEXT);
289 }
786dff00 290 }
fcc37d29 291 return (MBU_DODATA);
786dff00 292 }
43d66181
SL
293 if (blkno < bdbtofsb(bp->b_blkno)) {
294 htaddr->htfc = blkno - bdbtofsb(bp->b_blkno);
fcc37d29 295 htaddr->htcs1 = HT_SFORW|HT_GO;
786dff00 296 } else {
43d66181 297 htaddr->htfc = bdbtofsb(bp->b_blkno) - blkno;
fcc37d29 298 htaddr->htcs1 = HT_SREV|HT_GO;
786dff00 299 }
fcc37d29 300 return (MBU_STARTED);
786dff00
BJ
301}
302
d565635a 303htdtint(mi, mbsr)
89bd2f01 304 register struct mba_device *mi;
d565635a 305 int mbsr;
786dff00 306{
fcc37d29
BJ
307 register struct htdevice *htaddr = (struct htdevice *)mi->mi_drv;
308 register struct buf *bp = mi->mi_tab.b_actf;
d565635a 309 register struct tu_softc *sc;
0deaf016 310 int ds, er, mbs;
786dff00 311
d565635a 312 sc = &tu_softc[TUUNIT(bp->b_dev)];
fcc37d29
BJ
313 ds = sc->sc_dsreg = MASKREG(htaddr->htds);
314 er = sc->sc_erreg = MASKREG(htaddr->hter);
315 sc->sc_resid = MASKREG(htaddr->htfc);
d565635a 316 mbs = mbsr;
fcc37d29
BJ
317 sc->sc_blkno++;
318 if((bp->b_flags & B_READ) == 0)
319 sc->sc_flags |= H_WRITTEN;
d565635a 320 if ((ds&(HTDS_ERR|HTDS_MOL)) != HTDS_MOL || mbs & MBSR_EBITS) {
fcc37d29 321 htaddr->htcs1 = HT_DCLR|HT_GO;
0deaf016
BJ
322 mbclrattn(mi);
323 if (bp == &rhtbuf[HTUNIT(bp->b_dev)]) {
fcc37d29 324 er &= ~HTER_FCE;
d565635a 325 mbs &= ~(MBSR_DTABT|MBSR_MBEXC);
ea59de47 326 }
fcc37d29
BJ
327 if (bp->b_flags & B_READ && ds & HTDS_PES)
328 er &= ~(HTER_CSITM|HTER_CORCRC);
d565635a 329 if (er&HTER_HARD || mbs&MBSR_EBITS || (ds&HTDS_MOL) == 0 ||
0deaf016 330 er && ++mi->mi_tab.b_errcnt >= 7) {
fcc37d29
BJ
331 if ((ds & HTDS_MOL) == 0 && sc->sc_openf > 0)
332 sc->sc_openf = -1;
9f1dae18
BJ
333 if ((er&HTER_HARD) == HTER_FCE &&
334 (mbs&MBSR_EBITS) == (MBSR_DTABT|MBSR_MBEXC) &&
335 (ds&HTDS_MOL))
336 goto noprint;
48165e7b 337 tprintf(sc->sc_ttyp, "tu%d: hard error bn%d mbsr=%b er=%b ds=%b\n",
89bd2f01 338 TUUNIT(bp->b_dev), bp->b_blkno,
d565635a 339 mbsr, mbsr_bits,
3ee331b1
BJ
340 sc->sc_erreg, hter_bits,
341 sc->sc_dsreg, htds_bits);
9f1dae18 342noprint:
786dff00 343 bp->b_flags |= B_ERROR;
fcc37d29 344 return (MBD_DONE);
786dff00 345 }
fcc37d29
BJ
346 if (er)
347 return (MBD_RETRY);
786dff00 348 }
fcc37d29
BJ
349 bp->b_resid = 0;
350 if (bp->b_flags & B_READ)
351 if (ds&HTDS_TM) { /* must be a read, right? */
352 bp->b_resid = bp->b_bcount;
43d66181 353 sc->sc_nxrec = bdbtofsb(bp->b_blkno);
fcc37d29
BJ
354 } else if(bp->b_bcount > MASKREG(htaddr->htfc))
355 bp->b_resid = bp->b_bcount - MASKREG(htaddr->htfc);
356 return (MBD_DONE);
357}
786dff00 358
fcc37d29 359htndtint(mi)
89bd2f01 360 register struct mba_device *mi;
fcc37d29
BJ
361{
362 register struct htdevice *htaddr = (struct htdevice *)mi->mi_drv;
363 register struct buf *bp = mi->mi_tab.b_actf;
d565635a 364 register struct tu_softc *sc;
fcc37d29 365 int er, ds, fc;
786dff00 366
d565635a
BJ
367 ds = MASKREG(htaddr->htds);
368 er = MASKREG(htaddr->hter);
369 fc = MASKREG(htaddr->htfc);
370 if (er) {
fcc37d29 371 htaddr->htcs1 = HT_DCLR|HT_GO;
0deaf016
BJ
372 mbclrattn(mi);
373 }
d565635a
BJ
374 if (bp == 0)
375 return (MBN_SKIP);
376 sc = &tu_softc[TUUNIT(bp->b_dev)];
377 sc->sc_dsreg = ds;
378 sc->sc_erreg = er;
379 sc->sc_resid = fc;
380 if (bp == &chtbuf[HTUNIT(bp->b_dev)]) {
3c58f9df 381 switch ((int)bp->b_command) {
d565635a 382 case HT_REWOFFL:
fcc37d29
BJ
383 /* offline is on purpose; don't do anything special */
384 ds |= HTDS_MOL;
d565635a
BJ
385 break;
386 case HT_SREV:
387 /* if backspace file hit bot, its not an error */
388 if (er == (HTER_NEF|HTER_FCE) && ds&HTDS_BOT &&
389 bp->b_repcnt == INF)
390 er &= ~HTER_NEF;
391 break;
392 }
fcc37d29
BJ
393 er &= ~HTER_FCE;
394 if (er == 0)
395 ds &= ~HTDS_ERR;
396 }
397 if ((ds & (HTDS_ERR|HTDS_MOL)) != HTDS_MOL) {
398 if ((ds & HTDS_MOL) == 0 && sc->sc_openf > 0)
399 sc->sc_openf = -1;
48165e7b 400 tprintf(sc->sc_ttyp, "tu%d: hard error bn%d er=%b ds=%b\n",
89bd2f01 401 TUUNIT(bp->b_dev), bp->b_blkno,
3ee331b1 402 sc->sc_erreg, hter_bits, sc->sc_dsreg, htds_bits);
fcc37d29
BJ
403 bp->b_flags |= B_ERROR;
404 return (MBN_DONE);
786dff00 405 }
d565635a 406 if (bp == &chtbuf[HTUNIT(bp->b_dev)]) {
fcc37d29
BJ
407 if (sc->sc_flags & H_REWIND)
408 return (ds & HTDS_BOT ? MBN_DONE : MBN_RETRY);
409 bp->b_resid = -sc->sc_resid;
410 return (MBN_DONE);
411 }
412 if (ds & HTDS_TM)
43d66181
SL
413 if (sc->sc_blkno > bdbtofsb(bp->b_blkno)) {
414 sc->sc_nxrec = bdbtofsb(bp->b_blkno) - fc;
fcc37d29 415 sc->sc_blkno = sc->sc_nxrec;
d565635a 416 } else {
43d66181 417 sc->sc_blkno = bdbtofsb(bp->b_blkno) + fc;
fcc37d29
BJ
418 sc->sc_nxrec = sc->sc_blkno - 1;
419 }
420 else
43d66181 421 sc->sc_blkno = bdbtofsb(bp->b_blkno);
fcc37d29 422 return (MBN_RETRY);
786dff00
BJ
423}
424
deb8980a 425htread(dev, uio)
fcc37d29 426 dev_t dev;
deb8980a 427 struct uio *uio;
786dff00 428{
23458a62 429 int errno;
fcc37d29 430
23458a62
BJ
431 errno = htphys(dev, uio);
432 if (errno)
433 return (errno);
434 return (physio(htstrategy, &rhtbuf[HTUNIT(dev)], dev, B_READ, minphys, uio));
786dff00
BJ
435}
436
2e9f5990
BJ
437htwrite(dev, uio)
438 dev_t dev;
6e7edb25 439 struct uio *uio;
786dff00 440{
23458a62 441 int errno;
fcc37d29 442
23458a62
BJ
443 errno = htphys(dev, uio);
444 if (errno)
445 return (errno);
446 return (physio(htstrategy, &rhtbuf[HTUNIT(dev)], dev, B_WRITE, minphys, uio));
786dff00
BJ
447}
448
deb8980a 449htphys(dev, uio)
fcc37d29 450 dev_t dev;
deb8980a 451 struct uio *uio;
786dff00 452{
d565635a
BJ
453 register int htunit;
454 register struct tu_softc *sc;
455 register struct mba_device *mi;
786dff00
BJ
456 daddr_t a;
457
d565635a 458 htunit = HTUNIT(dev);
406ddcbe 459 if (htunit >= NHT || (mi = htinfo[htunit]) == 0 || mi->mi_alive == 0)
deb8980a 460 return (ENXIO);
406ddcbe 461 a = uio->uio_offset >> 9;
d565635a 462 sc = &tu_softc[TUUNIT(dev)];
43d66181
SL
463 sc->sc_blkno = bdbtofsb(a);
464 sc->sc_nxrec = bdbtofsb(a)+1;
deb8980a 465 return (0);
786dff00 466}
f0a3ddbd 467
fcc37d29 468/*ARGSUSED*/
942f05a9 469htioctl(dev, cmd, data, flag)
fcc37d29
BJ
470 dev_t dev;
471 int cmd;
942f05a9 472 caddr_t data;
fcc37d29
BJ
473 int flag;
474{
d565635a
BJ
475 register struct tu_softc *sc = &tu_softc[TUUNIT(dev)];
476 register struct buf *bp = &chtbuf[HTUNIT(dev)];
fcc37d29
BJ
477 register callcount;
478 int fcount;
942f05a9
SL
479 struct mtop *mtop;
480 struct mtget *mtget;
fcc37d29
BJ
481 /* we depend of the values and order of the MT codes here */
482 static htops[] =
483 {HT_WEOF,HT_SFORW,HT_SREV,HT_SFORW,HT_SREV,HT_REW,HT_REWOFFL,HT_SENSE};
484
485 switch (cmd) {
942f05a9
SL
486
487 case MTIOCTOP: /* tape operation */
488 mtop = (struct mtop *)data;
489 switch (mtop->mt_op) {
490
fcc37d29 491 case MTWEOF:
942f05a9 492 callcount = mtop->mt_count;
fcc37d29
BJ
493 fcount = 1;
494 break;
942f05a9 495
fcc37d29 496 case MTFSF: case MTBSF:
942f05a9 497 callcount = mtop->mt_count;
fcc37d29
BJ
498 fcount = INF;
499 break;
942f05a9 500
fcc37d29
BJ
501 case MTFSR: case MTBSR:
502 callcount = 1;
942f05a9 503 fcount = mtop->mt_count;
fcc37d29 504 break;
942f05a9 505
fcc37d29
BJ
506 case MTREW: case MTOFFL:
507 callcount = 1;
508 fcount = 1;
509 break;
942f05a9 510
fcc37d29 511 default:
473a2e47 512 return (ENXIO);
fcc37d29 513 }
473a2e47
BJ
514 if (callcount <= 0 || fcount <= 0)
515 return (EINVAL);
fcc37d29 516 while (--callcount >= 0) {
942f05a9
SL
517 htcommand(dev, htops[mtop->mt_op], fcount);
518 if ((mtop->mt_op == MTFSR || mtop->mt_op == MTBSR) &&
473a2e47
BJ
519 bp->b_resid)
520 return (EIO);
d565635a 521 if ((bp->b_flags&B_ERROR) || sc->sc_dsreg&HTDS_BOT)
fcc37d29
BJ
522 break;
523 }
5a1f132a 524 return (geterror(bp));
942f05a9 525
fcc37d29 526 case MTIOCGET:
942f05a9
SL
527 mtget = (struct mtget *)data;
528 mtget->mt_dsreg = sc->sc_dsreg;
529 mtget->mt_erreg = sc->sc_erreg;
530 mtget->mt_resid = sc->sc_resid;
531 mtget->mt_type = MT_ISHT;
473a2e47 532 break;
942f05a9 533
fcc37d29 534 default:
473a2e47 535 return (ENXIO);
fcc37d29 536 }
473a2e47 537 return (0);
fcc37d29 538}
f0a3ddbd
BJ
539
540#define DBSIZE 20
541
fcc37d29 542htdump()
f0a3ddbd 543{
89bd2f01 544 register struct mba_device *mi;
fcc37d29
BJ
545 register struct mba_regs *mp;
546 register struct htdevice *htaddr;
547 int blk, num;
548 int start;
549
550 start = 0;
551 num = maxfree;
552#define phys(a,b) ((b)((int)(a)&0x7fffffff))
553 if (htinfo[0] == 0)
554 return (ENXIO);
89bd2f01 555 mi = phys(htinfo[0], struct mba_device *);
fcc37d29 556 mp = phys(mi->mi_hd, struct mba_hd *)->mh_physmba;
9f1dae18 557 mp->mba_cr = MBCR_IE;
fcc37d29
BJ
558 htaddr = (struct htdevice *)&mp->mba_drv[mi->mi_drive];
559 htaddr->httc = HTTC_PDP11|HTTC_1600BPI;
560 htaddr->htcs1 = HT_DCLR|HT_GO;
f0a3ddbd
BJ
561 while (num > 0) {
562 blk = num > DBSIZE ? DBSIZE : num;
fcc37d29
BJ
563 htdwrite(start, blk, htaddr, mp);
564 start += blk;
f0a3ddbd
BJ
565 num -= blk;
566 }
fcc37d29
BJ
567 hteof(htaddr);
568 hteof(htaddr);
9f1dae18 569 htwait(htaddr);
fc4d0a69 570 if (htaddr->htds&HTDS_ERR)
9f1dae18
BJ
571 return (EIO);
572 htaddr->htcs1 = HT_REW|HT_GO;
a0eab615 573 return (0);
f0a3ddbd
BJ
574}
575
fcc37d29
BJ
576htdwrite(dbuf, num, htaddr, mp)
577 register dbuf, num;
578 register struct htdevice *htaddr;
579 struct mba_regs *mp;
f0a3ddbd 580{
fcc37d29 581 register struct pte *io;
f0a3ddbd
BJ
582 register int i;
583
fcc37d29
BJ
584 htwait(htaddr);
585 io = mp->mba_map;
f0a3ddbd 586 for (i = 0; i < num; i++)
fcc37d29
BJ
587 *(int *)io++ = dbuf++ | PG_V;
588 htaddr->htfc = -(num*NBPG);
589 mp->mba_sr = -1;
590 mp->mba_bcr = -(num*NBPG);
591 mp->mba_var = 0;
592 htaddr->htcs1 = HT_WCOM|HT_GO;
f0a3ddbd
BJ
593}
594
fcc37d29
BJ
595htwait(htaddr)
596 struct htdevice *htaddr;
f0a3ddbd
BJ
597{
598 register s;
599
600 do
fcc37d29
BJ
601 s = htaddr->htds;
602 while ((s & HTDS_DRY) == 0);
f0a3ddbd
BJ
603}
604
fcc37d29
BJ
605hteof(htaddr)
606 struct htdevice *htaddr;
f0a3ddbd
BJ
607{
608
fcc37d29
BJ
609 htwait(htaddr);
610 htaddr->htcs1 = HT_WEOF|HT_GO;
f0a3ddbd 611}
a5cc519e 612#endif