xref: /original-bsd/sys/vax/uba/tmscp.c (revision a1c2194a)
1 /*-
2  * Copyright (c) 1991 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * %sccs.include.redist.c%
6  *
7  *	@(#)tmscp.c	7.16 (Berkeley) 05/09/91
8  */
9 
10 /*
11  * sccsid = "@(#)tmscp.c	1.24	(ULTRIX)	1/21/86";
12  */
13 
14 /************************************************************************
15  *									*
16  *        Licensed from Digital Equipment Corporation 			*
17  *                       Copyright (c) 					*
18  *               Digital Equipment Corporation				*
19  *                   Maynard, Massachusetts 				*
20  *                         1985, 1986 					*
21  *                    All rights reserved. 				*
22  *									*
23  *        The Information in this software is subject to change 	*
24  *   without notice and should not be construed as a commitment 	*
25  *   by  Digital  Equipment  Corporation.   Digital   makes  no 	*
26  *   representations about the suitability of this software for 	*
27  *   any purpose.  It is supplied "As Is" without expressed  or 	*
28  *   implied  warranty. 						*
29  *									*
30  *        If the Regents of the University of California or its 	*
31  *   licensees modify the software in a manner creating  		*
32  *   diriviative copyright rights, appropriate copyright  		*
33  *   legends may be placed on  the drivative work in addition  		*
34  *   to that set forth above. 						*
35  *									*
36  ************************************************************************
37  *
38  * tmscp.c - TMSCP (TK50/TU81) tape device driver
39  *
40  * Modification History:
41  *
42  * 06-Jan-86 - afd
43  *	Changed the probe routine to use DELAY (not TODR).  This now
44  *	works for MicroVAXen as well.  This eliminates the busy-wait
45  *	for MicroVAXen so a dead TK50 controller will not hang autoconf.
46  *
47  * 06-Dec-85 - afd
48  *	Fixed a bug in density selection.  The "set unit characteristics"
49  *	command to select density, was clearing the "unit flags" field
50  *	where the CACHE bit was for TU81-E.  Now the unit's "format" and
51  *	"unitflgs" are saved in tms_info struct.  And are used on STUNT
52  *	commands.
53  *
54  * 19-Oct-85 - afd
55  *	Added support to the open routine to allow drives to be opened
56  *	for low density (800 or 1600 bpi) use.  When the slave routine
57  *	initiates a "get-unit-char" cmd, the format menu for the unit
58  *	is saved in the tms_info structure. The format menu is used in the
59  *	start routine to select the proper low density.
60  *
61  * 02-Oct-85 - afd
62  *	When a tmscp-type controller is initializing, it is possible for
63  *	the sa reg to become 0 between states.  Thus the init code in
64  *	the interrupt routine had to be modified to reflect this.
65  *
66  * 21-Sep-85 - afd
67  *	The TK50 declares a serious exception when a tape mark is encountered.
68  *	This causes problems to dd (& other UN*X utilities).  So a flag
69  *	is set in the rsp() routine when a tape mark is encountered.  If
70  *	this flag is set, the start() routine appends the Clear Serious
71  *	Exception modifier to the next command.
72  *
73  * 03-Sep-85 -- jaw
74  *	messed up previous edit..
75  *
76  * 29-Aug-85 - jaw
77  *	fixed bugs in 8200 and 750 buffered datapath handling.
78  *
79  * 06-Aug-85 - afd
80  *   1. When repositioning records or files, the count of items skipped
81  *	does NOT HAVE to be returned by controllers (& the TU81 doesn't).
82  *	So tmscprsp() had to be modified to stop reporting
83  *	residual count errors on reposition commands.
84  *
85  *   2. Fixed bug in the open routine which allowed multiple opens.
86  *
87  * 18-Jul-85 - afd
88  *   1. Need to return status when mt status (or corresponding ioctl) is done.
89  *	Save resid, flags, endcode & status in tmscprsp() routine (except on
90  *	clear serious exception no-op).  Return these fields when status
91  *	ioctl is done (in tmscpcommand()).  How they are returned:
92  *		mt_resid = resid
93  *		mt_dsreg = flags|endcode
94  *		mt_erreg = status
95  *
96  *   2. Added latent support for enabling/disabling caching.  This is
97  *	handled along with all other ioctl commands.
98  *
99  *   3. Need to issue a no-op on unrecognized ioctl in tmscpstart(), since
100  *	we have already commited to issuing a command at that point.
101  *
102  *   4. In tmscprsp() routine if encode is 0200 (invalid command issued);
103  *	We need to: Unlink the buffer from the I/O wait queue,
104  *	and signal iodone, so the higher level command can exit!
105  *	Just as if it were a valid command.
106  *
107  * 11-jul-85 -- jaw
108  *	fix bua/bda map registers.
109  *
110  * 19-Jun-85 -- jaw
111  *	VAX8200 name change.
112  *
113  * 06-Jun-85 - jaw
114  *	fixes for 8200.
115  *
116  * 9-Apr-85 - afd
117  *	Added timeout code to the probe routine, so if the controller
118  *	fails to init in 10 seconds we return failed status.
119  *
120  * 13-Mar-85 -jaw
121  *	Changes for support of the VAX8200 were merged in.
122  *
123  * 27-Feb-85 -tresvik
124  *	Changes for support of the VAX8600 were merged in.
125  *
126  */
127 
128 #include "tms.h"
129 #if NTMSCP > 0
130 
131 #include "sys/param.h"
132 #include "sys/systm.h"
133 #include "sys/buf.h"
134 #include "sys/conf.h"
135 #include "sys/errno.h"
136 #include "sys/file.h"
137 #include "sys/map.h"
138 #include "sys/vm.h"
139 #include "sys/ioctl.h"
140 #include "sys/syslog.h"
141 #include "sys/mtio.h"
142 #include "sys/cmap.h"
143 #include "sys/uio.h"
144 #include "sys/tprintf.h"
145 
146 #include "../include/pte.h"
147 #include "../include/cpu.h"
148 #include "../include/mtpr.h"
149 #include "ubareg.h"
150 #include "ubavar.h"
151 
152 #define TENSEC	(1000)
153 #define	TMS_PRI	LOG_INFO
154 
155 #define NRSPL2  3               /* log2 number of response packets */
156 #define NCMDL2  3               /* log2 number of command packets */
157 #define NRSP    (1<<NRSPL2)
158 #define NCMD    (1<<NCMDL2)
159 
160 #include "tmscpreg.h"
161 #include "../vax/tmscp.h"
162 
163 /* Software state per controller */
164 
165 struct tmscp_softc {
166 	short   sc_state;       /* state of controller */
167 	short   sc_mapped;      /* Unibus map allocated for tmscp struct? */
168 	int     sc_ubainfo;     /* Unibus mapping info */
169 	struct	tmscp *sc_tmscp;   /* Unibus address of tmscp struct */
170 	int     sc_ivec;        /* interrupt vector address */
171 	short   sc_credits;     /* transfer credits */
172 	short   sc_lastcmd;     /* pointer into command ring */
173 	short   sc_lastrsp;     /* pointer into response ring */
174 	short   sc_ipl;		/* interrupt priority (Q-bus) */
175 } tmscp_softc[NTMSCP];
176 
177 struct tmscp {
178 	struct tmscpca	tmscp_ca;         /* communications area */
179 	struct mscp	tmscp_rsp[NRSP];  /* response packets */
180 	struct mscp	tmscp_cmd[NCMD];  /* command packets */
181 } tmscp[NTMSCP];
182 
183 /*
184  * Per drive-unit info
185  */
186 struct tms_info {
187 	daddr_t		tms_dsize;	/* Max user size from online pkt */
188 	unsigned	tms_type;	/* Drive type int field  */
189 	int		tms_resid;	/* residual from last xfer */
190 	u_char		tms_endcode;	/* last command endcode */
191 	u_char		tms_flags;	/* last command end flags */
192 	unsigned	tms_status;	/* Command status from last command */
193 	char		tms_openf;	/* lock against multiple opens */
194 	char		tms_lastiow;	/* last op was a write */
195 	char		tms_serex;	/* set when serious exception occurs */
196 	char		tms_clserex;	/* set when serex being cleared by no-op */
197 	short		tms_fmtmenu;	/* the unit's format (density) menu */
198 	short		tms_unitflgs;	/* unit flag parameters */
199 	short		tms_format;	/* the unit's current format (density) */
200 	tpr_t 		tms_tpr;	/* tprintf handle */
201 } tms_info[NTMS];
202 struct uba_ctlr *tmscpminfo[NTMSCP];
203 struct uba_device *tmsdinfo[NTMS];
204 /*
205  * ifdef other tmscp devices here if they allow more than 1 unit/controller
206  */
207 struct uba_device *tmscpip[NTMSCP][1];
208 struct buf ctmscpbuf[NTMSCP];		/* internal cmd buffer (for ioctls) */
209 struct buf tmsutab[NTMS];		/* Drive queue */
210 struct buf tmscpwtab[NTMSCP];		/* I/O wait queue, per controller */
211 int    tmscpmicro[NTMSCP];		/* to store microcode level */
212 short  utoctlr[NTMS];			/* Slave unit to controller mapping */
213 					/* filled in by the slave routine */
214 
215 /* Bits in minor device */
216 #define	TMSUNIT(dev)	(minor(dev)&03)
217 #define	T_NOREWIND	04
218 #define	T_HIDENSITY	010
219 
220 /* Slave unit to controller mapping */
221 #define TMSCPCTLR(dev)	(utoctlr[TMSUNIT(dev)])
222 
223 /*
224  * Internal (ioctl) command codes (these must also be declared in the
225  * tmscpioctl routine).  These correspond to ioctls in mtio.h
226  */
227 #define TMS_WRITM	0		/* write tape mark */
228 #define TMS_FSF		1		/* forward space file */
229 #define TMS_BSF		2		/* backward space file */
230 #define TMS_FSR		3		/* forward space record */
231 #define TMS_BSR		4		/* backward space record */
232 #define TMS_REW		5		/* rewind tape */
233 #define TMS_OFFL	6		/* rewind tape & mark unit offline */
234 #define TMS_SENSE	7		/* noop - do a get unit status */
235 #define TMS_CACHE	8		/* enable cache */
236 #define TMS_NOCACHE	9		/* disable cache */
237 /* These go last: after all real mt cmds, just bump the numbers up */
238 #define TMS_CSE		10		/* clear serious exception */
239 #define TMS_LOWDENSITY	11		/* set unit to low density */
240 #define TMS_HIDENSITY	12		/* set unit to high density */
241 
242 /*
243  * Controller states
244  */
245 #define S_IDLE  0               /* hasn't been initialized */
246 #define S_STEP1 1               /* doing step 1 init */
247 #define S_STEP2 2               /* doing step 2 init */
248 #define S_STEP3 3               /* doing step 3 init */
249 #define S_SCHAR 4               /* doing "set controller characteristics" */
250 #define S_RUN   5               /* running */
251 
252 int     tmscperror = 0;		/* causes hex dump of packets */
253 int	tmscp_cp_wait = 0;	/* Something to wait on for command */
254 				/* packets and or credits. */
255 int	wakeup();
256 extern	int	hz;		/* Should find the right include */
257 
258 #ifdef	DEBUG
259 #define printd if (tmscpdebug) printf
260 int tmscpdebug = 1;
261 #define	printd10 if(tmscpdebug >= 10) printf
262 #endif
263 
264 int     tmscpprobe(), tmscpslave(), tmscpattach(), tmscpintr();
265 struct  mscp *tmscpgetcp();
266 
267 #define DRVNAME "tms"
268 #define CTRLNAME "tmscp"
269 
270 u_short tmscpstd[] = { 0174500, 0 };
271 struct  uba_driver tmscpdriver =
272 { tmscpprobe, tmscpslave, tmscpattach, 0, tmscpstd, DRVNAME, tmsdinfo, CTRLNAME
273 , tmscpminfo, 0};
274 
275 #define b_qsize         b_resid         /* queue size per drive, in tmsutab */
276 #define b_ubinfo        b_resid         /* Unibus mapping info, per buffer */
277 
278 
279 /*************************************************************************/
280 
281 #define DELAYTEN 1000
282 
283 /*
284  * Unfortunately qbgetpri can't be used because the TK50 doesn't flip the
285  * TMSCP_STEP2 flag in the tmscpsa register until after the pending interrupt
286  * has been acknowledged by the cpu. If you are at spl6(), the TMSCP_STEP2
287  * flag never gets set and you return (0).
288  */
289 tmscpprobe(reg, ctlr)
290 	caddr_t reg;		/* address of the IP register */
291 	int ctlr;		/* index of controller in the tmscp_softc array */
292 {
293 	register int br, cvec;	/* MUST be 1st (r11 & r10): IPL and intr vec */
294 	register struct tmscp_softc *sc = &tmscp_softc[ctlr];
295 				/* ptr to software controller structure */
296 	struct tmscpdevice *tmscpaddr; /* ptr to tmscpdevice struct (IP & SA) */
297 	int count;		/* for probe delay time out */
298 
299 #	ifdef lint
300 	br = 0; cvec = br; br = cvec; reg = reg;
301 	tmscpreset(0); tmscpintr(0);
302 #	endif
303 
304 	tmscpaddr = (struct tmscpdevice *) reg;
305 	/*
306 	 * Set host-settable interrupt vector.
307 	 * Assign 0 to the ip register to start the tmscp-device initialization.
308 	 * The device is not really initialized at this point, this is just to
309 	 * find out if the device exists.
310 	 */
311 	sc->sc_ivec = (uba_hd[numuba].uh_lastiv -= 4);
312 	tmscpaddr->tmscpip = 0;
313 
314 	count=0;
315 	while(count < DELAYTEN)
316 		{	/* wait for at most 10 secs */
317 		if((tmscpaddr->tmscpsa & TMSCP_STEP1) != 0)
318 			break;
319 		DELAY(10000);
320 		count=count+1;
321 		}
322 	if (count == DELAYTEN)
323 		return(0);
324 
325 	tmscpaddr->tmscpsa = TMSCP_ERR|(NCMDL2<<11)|(NRSPL2<<8)|TMSCP_IE|(sc->sc_ivec/4);
326 
327 	count=0;
328 	while(count < DELAYTEN)
329 		{
330 		if((tmscpaddr->tmscpsa & TMSCP_STEP2) != 0)
331 			break;
332 		DELAY(10000);
333 		count = count+1;
334 		}
335 	if (count == DELAYTEN)
336 		return(0);
337 
338 #ifdef QBA
339 	sc->sc_ipl = br = 0x15;
340 #endif
341 	return(sizeof (struct tmscpdevice));
342 }
343 
344 /*
345  * Try to find a slave (a drive) on the controller.
346  * If the controller is not in the run state, call init to initialize it.
347  */
348 tmscpslave (ui, reg)
349 	struct uba_device *ui;	/* ptr to the uba device structure */
350 	caddr_t reg;		/* addr of the device controller */
351 {
352 	register struct uba_ctlr *um = tmscpminfo[ui->ui_ctlr];
353 	register struct tmscp_softc *sc = &tmscp_softc[ui->ui_ctlr];
354 	register struct tms_info *tms = &tms_info[ui->ui_unit];
355 	struct   tmscpdevice *tmscpaddr;	/* ptr to IP & SA */
356 	struct   mscp *mp;
357 	int	 i;			/* Something to write into to start */
358 					/* the tmscp polling */
359 
360 #	ifdef lint
361 	reg = reg;
362 #	endif
363 	tmscpaddr = (struct tmscpdevice *)um->um_addr;
364 	/*
365 	 * If its not in the run state, start the initialization process
366 	 * (tmscpintr will complete it);  if the initialization doesn't start;
367 	 * then return.
368 	 */
369 	if(sc->sc_state != S_RUN)
370 		{
371 #		ifdef DEBUG
372 		printd("tmscpslave: ctlr not running: calling init \n");
373 #		endif
374 		if(!tmscpinit(ui->ui_ctlr))
375 	    		return(0);
376 		}
377 	/*
378 	 * Wait for the controller to come into the run state or go idle.
379 	 * If it goes idle return.
380 	 */
381 #	ifdef DEBUG
382 	i=1;
383 #	endif
384 	while(sc->sc_state != S_RUN && sc->sc_state != S_IDLE)
385 #		ifdef DEBUG
386 		if (tmscpaddr->tmscpsa & TMSCP_ERR && i)
387 	    		{
388 	    		printd("tmscp-device: fatal error (%o)\n", tmscpaddr->tmscpsa&0xffff);
389 	    		i=0;
390 	   		 }
391 #		endif
392 		;	/* wait */
393 	if(sc->sc_state == S_IDLE)
394 		{	/* The tmscp device failed to initialize */
395 		printf("tmscp controller failed to init\n");
396 		return(0);
397 		}
398 	/* The controller is up so see if the drive is there */
399 	if(0 == (mp = tmscpgetcp(um)))
400 		{
401 		printf("tmscp can't get command packet\n");
402 		return(0);
403 		}
404 	/* Need to determine the drive type for generic driver */
405 	mp->mscp_opcode = M_OP_GTUNT;	/* This should give us the device type */
406 	mp->mscp_unit = ui->ui_slave;
407 	mp->mscp_cmdref = (long) ui->ui_slave;
408 	tms->tms_status = 0;	/* set to zero */
409 	tmscpip[ui->ui_ctlr][ui->ui_slave] = ui;
410 	*((long *) mp->mscp_dscptr ) |= TMSCP_OWN | TMSCP_INT;/* maybe we should poll*/
411 	i = tmscpaddr->tmscpip;
412 #ifdef lint
413 	i = i;
414 #endif
415 	while(!tms->tms_status)
416 		;				/* Wait for some status */
417 #	ifdef DEBUG
418 	printd("tmscpslave: status = %o\n",tms->tms_status & M_ST_MASK);
419 #	endif
420 	tmscpip[ui->ui_ctlr][ui->ui_slave] = 0;
421 	if(!tms->tms_type)			/* packet from a GTUNT */
422 		return(0);			/* Failed No such drive */
423 	else
424 		return(1);			/* Got it and it is there */
425 }
426 
427 
428 /*
429  * Set ui flags to zero to show device is not online & set tmscpip.
430  * Unit to Controller mapping is set up here.
431  * Open routine will issue the online command, later.
432  */
433 tmscpattach (ui)
434 	register struct uba_device *ui;		/* ptr to unibus dev struct */
435 {
436 
437 	ui->ui_flags = 0;
438 	tmscpip[ui->ui_ctlr][ui->ui_slave] = ui;
439 #	ifdef DEBUG
440 	/*
441 	 * Check to see if the drive is available.
442 	 * If not then just print debug.
443 	 */
444 	if(tms_info[ui->ui_unit].tms_status != M_ST_AVLBL)
445 		printd("tmscpattach: unavailable \n");
446 #	endif
447 	utoctlr[ui->ui_unit] = ui->ui_ctlr;
448 }
449 
450 
451 /*
452  * TMSCP interrupt routine.
453  */
454 tmscpintr (d)
455 	int d;		/* index to the controller */
456 {
457 	register struct uba_ctlr *um = tmscpminfo[d];
458 	register struct tmscpdevice *tmscpaddr = (struct tmscpdevice *)um->um_addr;
459 	struct buf *bp;
460 	register int i;
461 	register struct tmscp_softc *sc = &tmscp_softc[d];
462 	register struct tmscp *tm = &tmscp[d];
463 	struct tmscp *ttm;
464 	struct mscp *mp;
465 
466 #	ifdef DEBUG
467 	printd10("tmscpintr: state %d, tmscpsa %o\n", sc->sc_state, tmscpaddr->tmscpsa);
468 #	endif
469 
470 #ifdef QBA
471 	splx(sc->sc_ipl);
472 #endif
473 	/*
474 	 * How the interrupt is handled depends on the state of the controller.
475 	 */
476 	switch (sc->sc_state) {
477 
478 	case S_IDLE:
479 		printf("tmscp%d: random interrupt ignored\n", d);
480 		return;
481 
482 	/* Controller was in step 1 last, see if its gone to step 2 */
483 	case S_STEP1:
484 #		define STEP1MASK 0174377
485 #		define STEP1GOOD (TMSCP_STEP2|TMSCP_IE|(NCMDL2<<3)|NRSPL2)
486 		for (i = 0; i < 150; i++)
487 			{
488 			if ((tmscpaddr->tmscpsa&STEP1MASK) != STEP1GOOD)
489 				{ /* still in step 1 (wait 1/100 sec) */
490 				DELAY(10000);
491 #				ifdef DEBUG
492 				printd("still in step 1, delaying\n");
493 #				endif DEBUG
494 				}
495 			else
496 				break;
497 			}
498 		if (i > 149)
499 			{
500 			sc->sc_state = S_IDLE;
501 			printf("failed to initialize, in step1: sa 0x%x", tmscpaddr->tmscpsa);
502 			wakeup((caddr_t)um);
503 			return;
504 			}
505 		tmscpaddr->tmscpsa = ((int)&sc->sc_tmscp->tmscp_ca.ca_ringbase)
506 			| ((cpu == VAX_780 || cpu == VAX_8600) ? TMSCP_PI : 0);
507 		sc->sc_state = S_STEP2;
508 		return;
509 
510 	/* Controller was in step 2 last, see if its gone to step 3 */
511 	case S_STEP2:
512 #		define STEP2MASK 0174377
513 #		define STEP2GOOD (TMSCP_STEP3|TMSCP_IE|(sc->sc_ivec/4))
514 		for (i = 0; i < 150; i++)
515 			{
516 			if ((tmscpaddr->tmscpsa&STEP2MASK) != STEP2GOOD)
517 				{ /* still in step 2 (wait 1/100 sec) */
518 				DELAY(10000);
519 #				ifdef DEBUG
520 				printd("still in step 2, delaying\n");
521 #				endif DEBUG
522 				}
523 			else
524 				break;
525 			}
526 		if (i > 149)
527 			{
528 			sc->sc_state = S_IDLE;
529 			printf("failed to initialize, in step2: sa 0x%x", tmscpaddr->tmscpsa);
530 			wakeup((caddr_t)um);
531 			return;
532 			}
533 		tmscpaddr->tmscpsa = ((int)&sc->sc_tmscp->tmscp_ca.ca_ringbase)>>16;
534 		sc->sc_state = S_STEP3;
535 		return;
536 
537 	/* Controller was in step 3 last, see if its gone to step 4 */
538 	case S_STEP3:
539 #		define STEP3MASK 0174000
540 #		define STEP3GOOD TMSCP_STEP4
541 		for (i = 0; i < 150; i++)
542 			{
543 			if ((tmscpaddr->tmscpsa&STEP3MASK) != STEP3GOOD)
544 				{ /* still in step 3 (wait 1/100 sec) */
545 				DELAY(10000);
546 #				ifdef DEBUG
547 				printd("still in step 3, delaying\n");
548 #				endif DEBUG
549 				}
550 			else
551 				break;
552 			}
553 		if (i > 149)
554 			{
555 			sc->sc_state = S_IDLE;
556 			printf("failed to initialize, in step3: sa 0x%x", tmscpaddr->tmscpsa);
557 			wakeup((caddr_t)um);
558 			return;
559 			}
560 		/*
561 		 * Get microcode version and model number of controller;
562 		 * Signal initialization complete (_GO) (to the controller);
563 		 *    ask for Last Fail response if tmscperror is set;
564 		 * Set state to "set controller characteristics".
565 		 */
566 		tmscpmicro[d] = tmscpaddr->tmscpsa;
567 		tmscpaddr->tmscpsa = TMSCP_GO | (tmscperror? TMSCP_LF : 0);
568 		sc->sc_state = S_SCHAR;
569 #		ifdef DEBUG
570 		printd("tmscpintr: completed state %d \n", sc->sc_state);
571 		printd("tmscp%d Version %d model %d\n",d,tmscpmicro[d]&0xF,
572 			(tmscpmicro[d]>>4) & 0xF);
573 #		endif
574 
575 	    /*
576 	     * Initialize the data structures (response and command queues).
577 	     */
578 	    ttm = sc->sc_tmscp;
579 	    for (i = 0; i < NRSP; i++)
580 		    {
581 		    tm->tmscp_ca.ca_rspdsc[i] = TMSCP_OWN | TMSCP_INT |
582 			   (long)&ttm->tmscp_rsp[i].mscp_cmdref;
583 		    tm->tmscp_rsp[i].mscp_dscptr = &tm->tmscp_ca.ca_rspdsc[i];
584 		    tm->tmscp_rsp[i].mscp_header.tmscp_msglen = mscp_msglen;
585 		    }
586 	    for (i = 0; i < NCMD; i++)
587 		    {
588 		    tm->tmscp_ca.ca_cmddsc[i] = TMSCP_INT |
589 					(long)&ttm->tmscp_cmd[i].mscp_cmdref;
590 		    tm->tmscp_cmd[i].mscp_dscptr = &tm->tmscp_ca.ca_cmddsc[i];
591 		    tm->tmscp_cmd[i].mscp_header.tmscp_msglen = mscp_msglen;
592 		    tm->tmscp_cmd[i].mscp_header.tmscp_vcid = 1;
593 		    }
594 	    bp = &tmscpwtab[d];
595 	    bp->av_forw = bp->av_back = bp;
596 	    sc->sc_lastcmd = 1;
597 	    sc->sc_lastrsp = 0;
598 	    mp = &tmscp[um->um_ctlr].tmscp_cmd[0];
599 	    mp->mscp_unit = mp->mscp_modifier = 0;
600 	    mp->mscp_flags = 0;
601 	    mp->mscp_version = 0;
602 	    mp->mscp_cntflgs = M_CF_ATTN|M_CF_MISC|M_CF_THIS;
603 	    /*
604 	     * A host time out value of 0 means that the controller will not
605 	     * time out.  This is ok for the TK50.
606 	     */
607 	    mp->mscp_hsttmo = 0;
608 	    mp->mscp_time.val[0] = 0;
609 	    mp->mscp_time.val[1] = 0;
610 	    mp->mscp_cntdep = 0;
611 	    mp->mscp_opcode = M_OP_STCON;
612 	    *((long *)mp->mscp_dscptr) |= TMSCP_OWN|TMSCP_INT;
613 	    i = tmscpaddr->tmscpip;      /* initiate polling */
614 	    return;
615 
616 	case S_SCHAR:
617 	case S_RUN:
618 		break;
619 
620 	default:
621 	    printf("tmscp%d: interrupt in unknown state %d ignored\n",d,sc->sc_state);
622 	    return;
623 	}	/* end switch */
624 
625 	/*
626 	 * The controller state is S_SCHAR or S_RUN
627 	 */
628 
629 	/*
630 	 * If the error bit is set in the SA register then print an error
631 	 * message and reinitialize the controller.
632 	 */
633 	if (tmscpaddr->tmscpsa&TMSCP_ERR)
634 		{
635 		printf("tmscp%d: fatal error (%o)\n", d, tmscpaddr->tmscpsa&0xffff);
636 		tmscpaddr->tmscpip = 0;
637 		wakeup((caddr_t)um);
638 		}
639 	/*
640 	 * Check for a buffer purge request. (Won't happen w/ TK50 on Q22 bus)
641 	 */
642 	if (tm->tmscp_ca.ca_bdp)
643 		{
644 		UBAPURGE(um->um_hd->uh_uba, tm->tmscp_ca.ca_bdp);
645 		tm->tmscp_ca.ca_bdp = 0;
646 		tmscpaddr->tmscpsa = 0;      /* signal purge complete */
647 		}
648 
649 	/*
650 	 * Check for response ring transition.
651 	 */
652 	if (tm->tmscp_ca.ca_rspint)
653 		{
654 		tm->tmscp_ca.ca_rspint = 0;
655 		for (i = sc->sc_lastrsp;; i++)
656 			{
657 			i %= NRSP;
658 			if (tm->tmscp_ca.ca_rspdsc[i]&TMSCP_OWN)
659 			    break;
660 			tmscprsp(um, tm, sc, i);
661 			tm->tmscp_ca.ca_rspdsc[i] |= TMSCP_OWN;
662 			}
663 		sc->sc_lastrsp = i;
664 		}
665 
666 	/*
667 	 * Check for command ring transition.
668 	 */
669 	if (tm->tmscp_ca.ca_cmdint)
670 		{
671 #		ifdef DEBUG
672 		printd("tmscpintr: command ring transition\n");
673 #		endif
674 		tm->tmscp_ca.ca_cmdint = 0;
675 		}
676     	if(tmscp_cp_wait)
677 		wakeup((caddr_t)&tmscp_cp_wait);
678     	(void) tmscpstart(um);
679 }
680 
681 
682 /*
683  * Open a tmscp device and set the unit online.  If the controller is not
684  * in the run state, call init to initialize the tmscp controller first.
685  */
686 
687 /* ARGSUSED */
688 tmscpopen(dev, flag)
689 	dev_t dev;
690 	int flag;
691 {
692 	register int unit;
693 	register struct uba_device *ui;
694 	register struct tmscp_softc *sc;
695 	register struct tms_info *tms;
696 	register struct mscp *mp;
697 	register struct uba_ctlr *um;
698 	struct tmscpdevice *tmscpaddr;
699 	int s,i;
700 
701 	unit = TMSUNIT(dev);
702 #	ifdef DEBUG
703 	printd("tmscpopen unit %d\n",unit);
704 	if(tmscpdebug)DELAY(10000);
705 #	endif
706 	if (unit >= NTMS || (ui = tmsdinfo[unit]) == 0 || ui->ui_alive == 0)
707 		return (ENXIO);
708 	tms = &tms_info[ui->ui_unit];
709 	if (tms->tms_openf)
710 		return (EBUSY);
711 	sc = &tmscp_softc[ui->ui_ctlr];
712 	tms->tms_openf = 1;
713 	tms->tms_tpr = tprintf_open();
714 	s = spl5();
715 	if (sc->sc_state != S_RUN)
716 		{
717 		if (sc->sc_state == S_IDLE)
718 			if(!tmscpinit(ui->ui_ctlr))
719 				{
720 				printf("tmscp controller failed to init\n");
721 				(void) splx(s);
722 				tms->tms_openf = 0;
723 				return(ENXIO);
724 				}
725 		/*
726 		 * Wait for initialization to complete
727 		 */
728 		timeout(wakeup,(caddr_t)ui->ui_mi,11*hz);	/* to be sure*/
729 		sleep((caddr_t)ui->ui_mi, 0);
730 		if (sc->sc_state != S_RUN)
731 			{
732 			(void) splx(s);
733 			tms->tms_openf = 0;
734 			return (EIO);
735 			}
736 		}
737 	/*
738 	 * Check to see if the device is really there.
739 	 * this code was taken from Fred Canters 11 driver
740 	 */
741 	um = ui->ui_mi;
742 	tmscpaddr = (struct tmscpdevice *) um->um_addr;
743 	(void) splx(s);
744 	if(ui->ui_flags == 0)
745 		{
746 		s = spl5();
747 		while(0 ==(mp = tmscpgetcp(um)))
748 			{
749 			tmscp_cp_wait++;
750 			sleep((caddr_t)&tmscp_cp_wait,PSWP+1);
751 			tmscp_cp_wait--;
752 			}
753 		(void) splx(s);
754 		mp->mscp_opcode = M_OP_ONLIN;
755 		mp->mscp_unit = ui->ui_slave;
756 		mp->mscp_cmdref = (long) & tms->tms_type;
757 					    /* need to sleep on something */
758 #		ifdef DEBUG
759 		printd("tmscpopen: bring unit %d online\n",ui->ui_unit);
760 #		endif
761 		*((long *) mp->mscp_dscptr ) |= TMSCP_OWN | TMSCP_INT;
762 		i = tmscpaddr->tmscpip;
763 #ifdef lint
764 		i = i;
765 #endif
766 		/*
767 		 * To make sure we wake up, timeout in 240 seconds.
768 		 * Wakeup in tmscprsp routine.
769 		 * 240 seconds (4 minutes) is necessary since a rewind
770 		 * can take a few minutes.
771 		 */
772 		timeout(wakeup,(caddr_t) mp->mscp_cmdref,240 * hz);
773 		sleep((caddr_t) mp->mscp_cmdref,PSWP+1);
774 		}
775 	if(ui->ui_flags == 0) {
776 		tms->tms_openf = 0;
777 		return(ENXIO);  /* Didn't go online */
778 	}
779 	tms->tms_lastiow = 0;
780 	/*
781 	 * If the high density device is not specified, set unit to low
782 	 * density.  This is done as an "internal" ioctl command so
783 	 * that the command setup and response handling
784 	 * is done thru "regular" command routines.
785 	 */
786 	if ((minor(dev) & T_HIDENSITY) == 0)
787 		tmscpcommand(dev, TMS_LOWDENSITY, 1);
788 	else
789 		tmscpcommand(dev, TMS_HIDENSITY, 1);
790 	return (0);
791 }
792 
793 
794 /*
795  * Close tape device.
796  *
797  * If tape was open for writing or last operation was
798  * a write, then write two EOF's and backspace over the last one.
799  * Unless this is a non-rewinding special file, rewind the tape.
800  *
801  * NOTE:
802  *	We want to be sure that any serious exception is cleared on the
803  *	close. A Clear Serious Exception (CSE) modifier is always done on
804  *	the rewind command.  For the non-rewind case we check to see if the
805  *	"serex" field is set in the softc struct; if it is then issue a noop
806  *	command with the CSE modifier.
807  * Make the tape available to others, by clearing openf flag.
808  */
809 tmscpclose(dev, flag)
810 	register dev_t dev;
811 	register flag;
812 {
813 	register struct tms_info *tms;
814 	register struct uba_device *ui;
815 
816 	ui = tmsdinfo[TMSUNIT(dev)];
817 #	ifdef DEBUG
818 	printd("tmscpclose: ctlr =  %d\n",TMSCPCTLR(dev));
819 	printd("tmscpclose: unit = %d\n",TMSUNIT(dev));
820 	if(tmscpdebug)DELAY(10000);
821 #	endif
822 	tms = &tms_info[ui->ui_unit];
823 	if (flag == FWRITE || (flag&FWRITE) && tms->tms_lastiow)
824 		{
825 		/*	   device, command, count */
826 		tmscpcommand (dev, TMS_WRITM, 1);
827 		tmscpcommand (dev, TMS_WRITM, 1);
828 		tmscpcommand (dev, TMS_BSR, 1);
829 		}
830 	if ((minor(dev)&T_NOREWIND) == 0)
831 		/*
832 		 * Don't hang waiting for rewind complete.
833 		 */
834 		tmscpcommand(dev, TMS_REW, 0);
835 	else
836 		if (tms->tms_serex)
837 			{
838 #			ifdef DEBUG
839 			printd("tmscpclose: clearing serex\n");
840 			if(tmscpdebug)DELAY(10000);
841 #			endif
842 			tmscpcommand(dev, TMS_CSE, 1);
843 			}
844 	tprintf_close(tms->tms_tpr);
845 	tms->tms_openf = 0;
846 	return (0);
847 }
848 
849 
850 /*
851  * Execute a command on the tape drive a specified number of times.
852  * This routine sets up a buffer and calls the strategy routine which
853  * links the buffer onto the drive's buffer queue.
854  * The start routine will take care of creating a tmscp command packet
855  * with the command.  The start routine is called by the strategy or the
856  * interrupt routine.
857  */
858 
859 tmscpcommand (dev, com, count)
860 	register dev_t dev;
861 	int com, count;
862 {
863 	register struct uba_device *ui;
864 	register struct buf *bp;
865 	register int s;
866 	int unit = TMSUNIT(dev);
867 
868 	ui = tmsdinfo[unit];
869 	bp = &ctmscpbuf[ui->ui_ctlr];
870 
871 	s = spl5();
872 	while (bp->b_flags&B_BUSY)
873 		{
874 		/*
875 		 * This special check is because B_BUSY never
876 		 * gets cleared in the non-waiting rewind case.
877 		 */
878 		if (bp->b_bcount == 0 && (bp->b_flags&B_DONE))
879 			break;
880 		bp->b_flags |= B_WANTED;
881 		sleep((caddr_t)bp, PRIBIO);
882 		}
883 	bp->b_flags = B_BUSY|B_READ;
884 	splx(s);
885 	/*
886 	 * Load the buffer.  The b_count field gets used to hold the command
887 	 * count.  the b_resid field gets used to hold the command mneumonic.
888 	 * These 2 fields are "known" to be "safe" to use for this purpose.
889 	 * (Most other drivers also use these fields in this way.)
890 	 */
891 	bp->b_dev = dev;
892 	bp->b_bcount = count;
893 	bp->b_resid = com;
894 	bp->b_blkno = 0;
895 	tmscpstrategy(bp);
896 	/*
897 	 * In case of rewind from close, don't wait.
898 	 * This is the only case where count can be 0.
899 	 */
900 	if (count == 0)
901 		return;
902 	iowait(bp);
903 	if (bp->b_flags&B_WANTED)
904 		wakeup((caddr_t)bp);
905 	bp->b_flags &= B_ERROR;
906 }
907 
908 /*
909  * Find an unused command packet
910  */
911 struct mscp *
912 tmscpgetcp(um)
913 	struct uba_ctlr *um;
914 {
915 	register struct mscp *mp;
916 	register struct tmscpca *cp;
917 	register struct tmscp_softc *sc;
918 	register int i;
919 	int	s;
920 
921 	s = spl5();
922 	cp = &tmscp[um->um_ctlr].tmscp_ca;
923 	sc = &tmscp_softc[um->um_ctlr];
924 	/*
925 	 * If no credits, can't issue any commands
926 	 * until some outstanding commands complete.
927 	 */
928 	i = sc->sc_lastcmd;
929 #  	ifdef DEBUG
930 	printd10("tmscpgetcp: %d credits remain\n", sc->sc_credits);
931 #	endif
932 	if(((cp->ca_cmddsc[i]&(TMSCP_OWN|TMSCP_INT))==TMSCP_INT) &&
933 	  (sc->sc_credits >= 2))
934 		{
935 		sc->sc_credits--;       /* This commits to issuing a command */
936 		cp->ca_cmddsc[i] &= ~TMSCP_INT;
937 		mp = &tmscp[um->um_ctlr].tmscp_cmd[i];
938 		mp->mscp_unit = mp->mscp_modifier = 0;
939 		mp->mscp_opcode = mp->mscp_flags = 0;
940 		mp->mscp_bytecnt = mp->mscp_buffer = 0;
941 		sc->sc_lastcmd = (i + 1) % NCMD;
942 		(void) splx(s);
943 		return(mp);
944 		}
945 	(void) splx(s);
946 	return(NULL);
947 }
948 
949 
950 /*
951  * Initialize a TMSCP device.  Set up UBA mapping registers,
952  * initialize data structures, and start hardware
953  * initialization sequence.
954  */
955 tmscpinit (d)
956 	int d;			/* index to the controller */
957 {
958 	register struct tmscp_softc *sc;
959 	register struct tmscp *t;  /* communications area; cmd & resp packets */
960 	struct tmscpdevice *tmscpaddr;
961 	struct uba_ctlr *um;
962 
963 	sc = &tmscp_softc[d];
964 	um = tmscpminfo[d];
965 	um->um_tab.b_active++;
966 	t = &tmscp[d];
967 	tmscpaddr = (struct tmscpdevice *)um->um_addr;
968 	if (sc->sc_mapped == 0)
969 		{
970 		/*
971 		 * Map the communications area and command
972 		 * and response packets into Unibus address
973 		 * space.
974 		 */
975 		sc->sc_ubainfo = uballoc(um->um_ubanum, (caddr_t)t, sizeof (struct tmscp), 0);
976 		sc->sc_tmscp = (struct tmscp *)(UBAI_ADDR(sc->sc_ubainfo));
977 		sc->sc_mapped = 1;
978 		}
979 
980 	/*
981 	 * Start the hardware initialization sequence.
982 	 */
983 	tmscpaddr->tmscpip = 0;              /* start initialization */
984 
985 	while((tmscpaddr->tmscpsa & TMSCP_STEP1) == 0)
986 		{
987 #		ifdef DEBUG
988 		printd("tmscpinit: tmscpsa = 0%o\n",tmscpaddr->tmscpsa);
989 		DELAY(100000);
990 #		endif
991 		if(tmscpaddr->tmscpsa & TMSCP_ERR)
992 			return(0);	/* CHECK */
993 		}
994 	tmscpaddr->tmscpsa=TMSCP_ERR|(NCMDL2<<11)|(NRSPL2<<8)|TMSCP_IE|(sc->sc_ivec/4);
995 	/*
996 	 * Initialization continues in the interrupt routine.
997 	 */
998 	sc->sc_state = S_STEP1;
999 	sc->sc_credits = 0;
1000 	return(1);
1001 }
1002 
1003 
1004 /*
1005  * Start I/O operation
1006  * This code is convoluted.  The majority of it was copied from the uda driver.
1007  */
1008 
1009 tmscpstart(um)
1010 	register struct uba_ctlr *um;
1011 {
1012 	register struct buf *bp, *dp;
1013 	register struct mscp *mp;
1014 	register struct tmscp_softc *sc;
1015 	register struct tms_info *tms;
1016 	register struct uba_device *ui;
1017 	struct   tmscpdevice *tmscpaddr;
1018 	struct   tmscp *tm = &tmscp[um->um_ctlr];
1019 	int i,tempi;
1020 	char ioctl;		/* flag: set true if its an IOCTL command */
1021 
1022 	sc = &tmscp_softc[um->um_ctlr];
1023 
1024     for(;;)
1025 	{
1026 	if ((dp = um->um_tab.b_actf) == NULL)
1027 		{
1028 		/*
1029 		 * Release unneeded UBA resources and return
1030 		 * (drive was inactive)
1031 		 */
1032 		um->um_tab.b_active = 0;
1033 		break;
1034 		}
1035 	if ((bp = dp->b_actf) == NULL)
1036 		{
1037 		/*
1038 		 * No more requests for this drive, remove
1039 		 * from controller queue and look at next drive.
1040 		 * We know we're at the head of the controller queue.
1041 		 */
1042 		dp->b_active = 0;
1043 		um->um_tab.b_actf = dp->b_forw;
1044 		continue;		/* Need to check for loop */
1045 		}
1046 	um->um_tab.b_active++;
1047 	tmscpaddr = (struct tmscpdevice *)um->um_addr;
1048 	ui = tmsdinfo[(TMSUNIT(bp->b_dev))];
1049 	tms = &tms_info[ui->ui_unit];
1050 	if ((tmscpaddr->tmscpsa&TMSCP_ERR) || sc->sc_state != S_RUN)
1051 		{
1052 		tprintf(tms->tms_tpr,
1053 		    "tms%d: hard error bn%d\n",
1054 		    minor(bp->b_dev)&03, bp->b_blkno);
1055 		log(TMS_PRI, "tmscp%d: sa 0%o, state %d\n",um->um_ctlr,
1056 				tmscpaddr->tmscpsa&0xffff, sc->sc_state);
1057 		(void)tmscpinit(um->um_ctlr);
1058 		/* SHOULD REQUEUE OUTSTANDING REQUESTS, LIKE TMSCPRESET */
1059 		break;
1060 		}
1061 	/*
1062 	 * Default is that last command was NOT a write command;
1063 	 * if a write command is done it will be detected in tmscprsp.
1064 	 */
1065 	tms->tms_lastiow = 0;
1066 	if (ui->ui_flags == 0)
1067 		{        /* not online */
1068 		if ((mp = tmscpgetcp(um)) == NULL)
1069 			break;
1070 		mp->mscp_opcode = M_OP_ONLIN;
1071 		mp->mscp_unit = ui->ui_slave;
1072 		dp->b_active = 2;
1073 		um->um_tab.b_actf = dp->b_forw; /* remove from controller q */
1074 		*((long *)mp->mscp_dscptr) |= TMSCP_OWN|TMSCP_INT;
1075 		if (tmscpaddr->tmscpsa&TMSCP_ERR)
1076 			printf("tmscp%d fatal error (0%o)\n",um->um_ctlr,
1077 					tmscpaddr->tmscpsa&0xffff);
1078 		i = tmscpaddr->tmscpip;
1079 		continue;
1080 		}
1081 	switch (cpu) {
1082 
1083 	case VAX_8600:
1084 	case VAX_780:
1085 		i = UBA_NEEDBDP|UBA_CANTWAIT;
1086 		break;
1087 	case VAX_750:
1088 		i = um->um_ubinfo|UBA_HAVEBDP|UBA_CANTWAIT;
1089 		break;
1090 	case VAX_730:
1091 	case VAX_630:
1092 		i = UBA_CANTWAIT;
1093 		break;
1094 	}   /* end switch (cpu) */
1095 	/*
1096 	 * If command is an ioctl command then set the ioctl flag for later use.
1097 	 * If not (i.e. it is a read or write) then attempt
1098 	 * to set up a buffer pointer.
1099 	 */
1100 	ioctl = 0;
1101 	if (bp == &ctmscpbuf[um->um_ctlr])
1102 		ioctl = 1;
1103 	else
1104 		if ((i = ubasetup(um->um_ubanum, bp, i)) == 0)
1105 			{
1106 			if(dp->b_qsize != 0)
1107 				break; /* When a command completes and */
1108 				     /* frees a bdp tmscpstart will be called */
1109 			if ((mp = tmscpgetcp(um)) == NULL)
1110 				break;
1111 #			ifdef DEBUG
1112 			printd("tmscpstart: GTUNT %d ubasetup = %d\n",ui->ui_unit, i);
1113 			if(tmscpdebug)DELAY(10000);
1114 #			endif
1115 			mp->mscp_opcode = M_OP_GTUNT;
1116 			mp->mscp_unit = ui->ui_slave;
1117 			*((long *)mp->mscp_dscptr) |= TMSCP_OWN|TMSCP_INT;
1118 			if (tmscpaddr->tmscpsa&TMSCP_ERR)
1119 				printf("tmscp%d: fatal error (0%o)\n",um->um_ctlr,
1120 					    tmscpaddr->tmscpsa&0xffff);
1121 			i = tmscpaddr->tmscpip;	/* initiate polling */
1122 			break;
1123 			}
1124 #	if defined(VAX750)
1125 	if (cpu == VAX_750)
1126 		tempi = i & 0xfffffff;			/* mask off bdp */
1127 	else
1128 #	endif
1129 		tempi = i;
1130 	if ((mp = tmscpgetcp(um)) == NULL)
1131 		{
1132 		if (!ioctl)		/* only need to release if NOT ioctl */
1133 			ubarelse(um->um_ubanum,&tempi);
1134 		break;
1135 		}
1136 	mp->mscp_cmdref = (long)bp;		/* pointer to get back */
1137 	mp->mscp_unit = ui->ui_slave;
1138 	/*
1139 	 * If its an ioctl-type command then set up the appropriate
1140 	 * tmscp command;  by doing a switch on the "b_resid" field where
1141 	 * the command mneumonic is stored.
1142 	 */
1143 	if (ioctl)
1144 		{
1145 #		ifdef DEBUG
1146 		printd("tmscpstart: doing ioctl cmd %d\n", bp->b_resid);
1147 #		endif
1148 		/*
1149 		 * The reccnt and tmkcnt fields are set to zero by the getcp
1150 		 * routine (as bytecnt and buffer fields).  Thus reccnt and
1151 		 * tmkcnt are only modified here if they need to be set to
1152 		 * a non-zero value.
1153 		 */
1154 		switch ((int)bp->b_resid) {
1155 
1156 		case TMS_WRITM:
1157 			mp->mscp_opcode = M_OP_WRITM;
1158 			break;
1159 		case TMS_FSF:
1160 			mp->mscp_opcode = M_OP_REPOS;
1161 			mp->mscp_tmkcnt = bp->b_bcount;
1162 			break;
1163 		case TMS_BSF:
1164 			mp->mscp_opcode = M_OP_REPOS;
1165 			mp->mscp_modifier = M_MD_REVRS;
1166 			mp->mscp_tmkcnt = bp->b_bcount;
1167 			break;
1168 		case TMS_FSR:
1169 			mp->mscp_opcode = M_OP_REPOS;
1170 			mp->mscp_modifier = M_MD_OBJCT;
1171 			mp->mscp_reccnt = bp->b_bcount;
1172 			break;
1173 		case TMS_BSR:
1174 			mp->mscp_opcode = M_OP_REPOS;
1175 			mp->mscp_modifier = M_MD_REVRS | M_MD_OBJCT;
1176 			mp->mscp_reccnt = bp->b_bcount;
1177 			break;
1178 		/*
1179 		 * Clear serious exception is done for Rewind & Available cmds
1180 		 */
1181 		case TMS_REW:
1182 			mp->mscp_opcode = M_OP_REPOS;
1183 			mp->mscp_modifier = M_MD_REWND | M_MD_CLSEX;
1184 			if (bp->b_bcount == 0)
1185 				mp->mscp_modifier |= M_MD_IMMED;
1186 			tms->tms_serex = 0;
1187 			break;
1188 		case TMS_OFFL:
1189 			mp->mscp_opcode = M_OP_AVAIL;
1190 			mp->mscp_modifier = M_MD_UNLOD | M_MD_CLSEX;
1191 			tms->tms_serex = 0;
1192 			break;
1193 		case TMS_SENSE:
1194 			mp->mscp_opcode = M_OP_GTUNT;
1195 			break;
1196 		case TMS_CACHE:
1197 			mp->mscp_opcode = M_OP_STUNT;
1198 			tms->tms_unitflgs |= M_UF_WBKNV;
1199 			mp->mscp_unitflgs = tms->tms_unitflgs;
1200 			mp->mscp_format = tms->tms_format;
1201 			/* default device dependant parameters */
1202 			mp->mscp_mediaid = 0;
1203 			break;
1204 		case TMS_NOCACHE:
1205 			mp->mscp_opcode = M_OP_STUNT;
1206 			tms->tms_unitflgs &= ~(M_UF_WBKNV);
1207 			mp->mscp_unitflgs = tms->tms_unitflgs;
1208 			mp->mscp_format = tms->tms_format;
1209 			/* default device dependant parameters */
1210 			mp->mscp_mediaid = 0;
1211 			break;
1212 		case TMS_CSE:
1213 			/*
1214 			 * This is a no-op command. It performs a
1215 			 * clear serious exception only.  (Done on a
1216 			 * non-rewinding close after a serious exception.)
1217 			 */
1218 			mp->mscp_opcode = M_OP_REPOS;
1219 			mp->mscp_modifier = M_MD_CLSEX;
1220 			tms->tms_serex = 0;
1221 			tms->tms_clserex = 1;
1222 			break;
1223 		case TMS_LOWDENSITY:
1224 			/*
1225 			 * Set the unit to low density
1226 			 */
1227 			mp->mscp_opcode = M_OP_STUNT;
1228 			mp->mscp_unitflgs = tms->tms_unitflgs;
1229 			mp->mscp_mediaid = 0;	/* default device dependant parameters */
1230 			if ((tms->tms_fmtmenu & M_TF_800) != 0)
1231 				mp->mscp_format = M_TF_800;
1232 			else
1233 				mp->mscp_format = M_TF_PE & tms->tms_fmtmenu;
1234 			tms->tms_format = mp->mscp_format;
1235 			break;
1236 		case TMS_HIDENSITY:
1237 			/*
1238 			 * Set the unit to high density (format == 0)
1239 			 */
1240 			mp->mscp_opcode = M_OP_STUNT;
1241 			mp->mscp_unitflgs = tms->tms_unitflgs;
1242 			mp->mscp_mediaid = 0;	/* default device dependant parameters */
1243 			mp->mscp_format = 0;
1244 			tms->tms_format = 0;
1245 			break;
1246 		default:
1247 			printf("Bad ioctl on tms unit %d\n", ui->ui_unit);
1248 			/* Need a no-op. Reposition no amount */
1249 			mp->mscp_opcode = M_OP_REPOS;
1250 			break;
1251 		}   /* end switch (bp->b_resid) */
1252 		}
1253 	else    /* Its a read/write command (not an ioctl) */
1254 		{
1255 		mp->mscp_opcode = bp->b_flags&B_READ ? M_OP_READ : M_OP_WRITE;
1256 		mp->mscp_bytecnt = bp->b_bcount;
1257 		mp->mscp_buffer = UBAI_ADDR(i) | (UBAI_BDP(i) << 24);
1258 
1259 		bp->b_ubinfo = tempi;			/* save mapping info */
1260 		}
1261 	if (tms->tms_serex == 2)			/* if tape mark read */
1262 		{
1263 		mp->mscp_modifier |= M_MD_CLSEX;	/*  clear serious exc */
1264 		tms->tms_serex = 0;
1265 		}
1266 	*((long *)mp->mscp_dscptr) |= TMSCP_OWN|TMSCP_INT;
1267 #	ifdef DEBUG
1268 	printd("tmscpstart: opcode 0%o mod %o unit %d cnt %d\n",mp->mscp_opcode,mp->mscp_modifier,mp->mscp_unit,mp->mscp_bytecnt);
1269 	if(tmscpdebug)DELAY(100000);
1270 #	endif
1271 	i = tmscpaddr->tmscpip;              /* initiate polling */
1272 	dp->b_qsize++;
1273 	/*
1274 	 * Move drive to the end of the controller queue
1275 	 */
1276 	if (dp->b_forw != NULL)
1277 		{
1278 		um->um_tab.b_actf = dp->b_forw;
1279 		um->um_tab.b_actl->b_forw = dp;
1280 		um->um_tab.b_actl = dp;
1281 		dp->b_forw = NULL;
1282 		}
1283 	/*
1284 	 * Move buffer to I/O wait queue
1285 	 */
1286 	dp->b_actf = bp->av_forw;
1287 	dp = &tmscpwtab[um->um_ctlr];
1288 	bp->av_forw = dp;
1289 	bp->av_back = dp->av_back;
1290 	dp->av_back->av_forw = bp;
1291 	dp->av_back = bp;
1292 	if (tmscpaddr->tmscpsa&TMSCP_ERR)
1293 		{
1294 		printf("tmscp%d: fatal error (0%o)\n", um->um_ctlr, tmscpaddr->tmscpsa&0xffff);
1295 		(void)tmscpinit(um->um_ctlr);
1296 		break;
1297 		}
1298     }   /* end for */
1299     /*
1300      * Check for response ring transitions lost in the
1301      * Race condition
1302      */
1303     for (i = sc->sc_lastrsp;; i++)
1304 	    {
1305 	    i %= NRSP;
1306 	    if (tm->tmscp_ca.ca_rspdsc[i]&TMSCP_OWN)
1307 		    break;
1308 	    tmscprsp(um, tm, sc, i);
1309 	    tm->tmscp_ca.ca_rspdsc[i] |= TMSCP_OWN;
1310 	    }
1311     sc->sc_lastrsp = i;
1312 }
1313 
1314 
1315 /*
1316  * Process a response packet
1317  */
1318 tmscprsp(um, tm, sc, i)
1319 	register struct uba_ctlr *um;
1320 	register struct tmscp *tm;
1321 	register struct tmscp_softc *sc;
1322 	int i;
1323 {
1324 	register struct mscp *mp;
1325 	register struct tms_info *tms;
1326 	struct uba_device *ui;
1327 	struct buf *dp, *bp;
1328 	int st;
1329 
1330 	mp = &tm->tmscp_rsp[i];
1331 	mp->mscp_header.tmscp_msglen = mscp_msglen;
1332 	sc->sc_credits += mp->mscp_header.tmscp_credits & 0xf;  /* low 4 bits */
1333 	if ((mp->mscp_header.tmscp_credits & 0xf0) > 0x10)	/* Check */
1334 		return;
1335 #	ifdef DEBUG
1336 	printd("tmscprsp, opcode 0%o status 0%o\n",mp->mscp_opcode,mp->mscp_status&M_ST_MASK);
1337 #	endif
1338 	/*
1339 	 * If it's an error log message (datagram),
1340 	 * pass it on for more extensive processing.
1341 	 */
1342 	if ((mp->mscp_header.tmscp_credits & 0xf0) == 0x10)
1343 		{	/* check */
1344 		tmserror(um, (struct mslg *)mp);
1345 		return;
1346 		}
1347 	st = mp->mscp_status&M_ST_MASK;
1348 	/*
1349 	 * The controller interrupts as drive 0.
1350 	 * This means that you must check for controller interrupts
1351 	 * before you check to see if there is a drive 0.
1352 	 */
1353 	if((M_OP_STCON|M_OP_END) == mp->mscp_opcode)
1354 		{
1355 		if (st == M_ST_SUCC)
1356 			{
1357 #		  	ifdef DEBUG
1358 			printd("ctlr has %d credits\n", mp->mscp_header.tmscp_credits & 0xf);
1359 			printd("ctlr timeout = %d\n", mp->mscp_cnttmo);
1360 #			endif
1361 			sc->sc_state = S_RUN;
1362 			}
1363 		else
1364 			sc->sc_state = S_IDLE;
1365 		um->um_tab.b_active = 0;
1366 		wakeup((caddr_t)um);
1367 		return;
1368 		}
1369 	if (mp->mscp_unit >= NTMS)
1370 		return;
1371 	if ((ui = tmscpip[um->um_ctlr][mp->mscp_unit]) == 0)
1372 		return;
1373 	tms = &tms_info[ui->ui_unit];
1374 	/*
1375 	 * Save endcode, endflags, and status for mtioctl get unit status.
1376 	 * NOTE: Don't do this on Clear serious exception (reposition no-op);
1377 	 *    which is done on close since this would
1378 	 *    overwrite the real status we want.
1379 	 */
1380 	if (tms->tms_clserex != 1)
1381 		{
1382 		tms->tms_endcode = mp->mscp_opcode;
1383 		tms->tms_flags = mp->mscp_flags;
1384 		tms->tms_status = st;
1385 		}
1386 	else tms->tms_clserex = 0;
1387 
1388 	switch (mp->mscp_opcode) {
1389 	case M_OP_ONLIN|M_OP_END:
1390 		tms->tms_type = mp->mscp_mediaid;
1391 		dp = &tmsutab[ui->ui_unit];
1392 		if (st == M_ST_SUCC)
1393 			{
1394 			/*
1395 			 * Link the drive onto the controller queue
1396 			 */
1397 			dp->b_forw = NULL;
1398 			if (um->um_tab.b_actf == NULL)
1399 				um->um_tab.b_actf = dp;
1400 			else
1401 				um->um_tab.b_actl->b_forw = dp;
1402 			um->um_tab.b_actl = dp;
1403 			ui->ui_flags = 1;       /* mark it online */
1404 			tms->tms_dsize=(daddr_t)mp->mscp_maxwrt;
1405 #			ifdef DEBUG
1406 			printd("tmscprsp: unit %d online\n", mp->mscp_unit);
1407 #			endif
1408 			/*
1409 			 * This define decodes the Media type identifier
1410 			 */
1411 #	        	define F_to_C(x,i)     ( ((x)->mscp_mediaid) >> (i*5+7) & 0x1f ? ( ( (((x)->mscp_mediaid) >>( i*5 + 7)) & 0x1f) + 'A' - 1): ' ')
1412 #			ifdef DEBUG
1413 			printd("tmscprsp: unit %d online %x %c%c %c%c%c%d\n"
1414 				,mp->mscp_unit, mp->mscp_mediaid ,F_to_C(mp,4)
1415 				,F_to_C(mp,3), F_to_C(mp,2)
1416 				,F_to_C(mp,1), F_to_C(mp,0), mp->mscp_mediaid & 0x7f);
1417 #			endif
1418 			dp->b_active = 1;
1419 			}	/* end if st == M_ST_SUCC */
1420 		else
1421 			{
1422 			if (bp = dp->b_actf)
1423 				tprintf(tms->tms_tpr,
1424 				    "tms%d: hard error bn%d: OFFLINE\n",
1425 				    minor(bp->b_dev)&03, bp->b_blkno);
1426 			else
1427 				tprintf(tms->tms_tpr,
1428 				    "tms%d: hard error: OFFLINE\n",
1429 				    ui->ui_unit);
1430 			while (bp = dp->b_actf)
1431 				{
1432 				dp->b_actf = bp->av_forw;
1433 				bp->b_flags |= B_ERROR;
1434 				iodone(bp);
1435 				}
1436 			}
1437 		if(mp->mscp_cmdref!=NULL)
1438 			/* Seems to get lost sometimes in uda */
1439 			wakeup((caddr_t)mp->mscp_cmdref);
1440 		break;
1441 	/*
1442 	 * The AVAILABLE ATTENTION message occurs when the
1443 	 * unit becomes available after loading,
1444 	 * marking the unit offline (ui_flags = 0) will force an
1445 	 * online command prior to using the unit.
1446 	 */
1447 	case M_OP_AVATN:
1448 		ui->ui_flags = 0;
1449 		tms->tms_type = mp->mscp_mediaid;
1450 		break;
1451 	case M_OP_END:
1452 		/*
1453 		 * An endcode without an opcode (0200) is an invalid command.
1454 		 * The mscp specification states that this would be a protocol
1455 		 * type error, such as illegal opcodes. The mscp spec. also
1456 		 * states that parameter error type of invalid commands should
1457 		 * return the normal end message for the command. This does not appear
1458 		 * to be the case. An invalid logical block number returned an endcode
1459 		 * of 0200 instead of the 0241 (read) that was expected.
1460 		 */
1461 
1462 		printf("tmscp%d: invalid cmd, endcode = %o, status=%o\n",
1463 			um->um_ctlr, mp->mscp_opcode, st);
1464 		bp = (struct buf *)mp->mscp_cmdref;
1465 		/*
1466 		 * Unlink buffer from I/O wait queue.
1467 		 * And signal iodone, so the higher level command can exit!
1468 		 *
1469 		 */
1470 		bp->av_back->av_forw = bp->av_forw;
1471 		bp->av_forw->av_back = bp->av_back;
1472 		dp = &tmsutab[ui->ui_unit];
1473 		dp->b_qsize--;
1474 		iodone(bp);
1475 		break;
1476 	case M_OP_WRITE|M_OP_END:
1477 		/* mark the last io op as a write */
1478 		tms->tms_lastiow = 1;
1479 	case M_OP_READ|M_OP_END:
1480 	case M_OP_WRITM|M_OP_END:
1481 	case M_OP_REPOS|M_OP_END:
1482 	case M_OP_STUNT|M_OP_END:
1483 	/*
1484 	 * The AVAILABLE message occurs when the mt ioctl "rewoffl" is
1485 	 * issued.  For the ioctl, "rewoffl", a tmscp AVAILABLE command is
1486 	 * done with the UNLOAD modifier.  This performs a rewind, followed
1487 	 * by marking the unit offline.  So mark the unit offline
1488 	 * software wise as well (ui_flags = 0 and
1489 	 * tms->tms_openf = 0).
1490 	 */
1491 	case M_OP_AVAIL|M_OP_END:
1492 #		ifdef DEBUG
1493 		printd("tmscprsp: position = %d\n", mp->mscp_lbn);
1494 #		endif
1495 		bp = (struct buf *)mp->mscp_cmdref;
1496 		/*
1497 		 * Only need to release buffer if the command was read or write.
1498 		 * No ubasetup was done in "tmscpstart" if it was an ioctl cmd.
1499 		 */
1500 		if (mp->mscp_opcode == (M_OP_READ|M_OP_END) ||
1501 		    mp->mscp_opcode == (M_OP_WRITE|M_OP_END))
1502 			ubarelse(um->um_ubanum, (int *)&bp->b_ubinfo);
1503 		/*
1504 		 * Unlink buffer from I/O wait queue.
1505 		 */
1506 		bp->av_back->av_forw = bp->av_forw;
1507 		bp->av_forw->av_back = bp->av_back;
1508 #		if defined(VAX750)
1509 		if (cpu == VAX_750) {
1510 		    if ((tmscpwtab[um->um_ctlr].av_forw == &tmscpwtab[um->um_ctlr]) &&
1511 					(um->um_ubinfo != 0)) {
1512 			ubarelse(um->um_ubanum, &um->um_ubinfo);
1513 		    }
1514 		    else {
1515 			if (mp->mscp_opcode == (M_OP_READ|M_OP_END) ||
1516 		    	    mp->mscp_opcode == (M_OP_WRITE|M_OP_END))
1517 				UBAPURGE(uba_hd[um->um_ubanum].uh_uba,(um->um_ubinfo >>28) & 0x0f);
1518 		    }
1519 		}
1520 #		endif
1521 		dp = &tmsutab[ui->ui_unit];
1522 		dp->b_qsize--;
1523 		if (st == M_ST_OFFLN || st == M_ST_AVLBL)
1524 			{
1525 			ui->ui_flags = 0;       /* mark unit offline */
1526 			tms->tms_openf = 0;
1527 			tms->tms_type = mp->mscp_mediaid;
1528 			/*
1529 			 * Link the buffer onto the front of the drive queue
1530 			 */
1531 			if ((bp->av_forw = dp->b_actf) == 0)
1532 				dp->b_actl = bp;
1533 			dp->b_actf = bp;
1534 			/*
1535 			 * Link the drive onto the controller queue
1536 			 */
1537 			if (dp->b_active == 0)
1538 				{
1539 				dp->b_forw = NULL;
1540 				if (um->um_tab.b_actf == NULL)
1541 					um->um_tab.b_actf = dp;
1542 				else
1543 					um->um_tab.b_actl->b_forw = dp;
1544 				um->um_tab.b_actl = dp;
1545 				dp->b_active = 1;
1546 				}
1547 #			if defined(VAX750)
1548 			if (cpu == VAX_750 && um->um_ubinfo == 0)
1549 				um->um_ubinfo = uballoc(um->um_ubanum, (caddr_t)0, 0, UBA_NEEDBDP);
1550 #			endif
1551 			return;
1552 			}
1553 		if (st != M_ST_SUCC)
1554 			{
1555 			if (mp->mscp_flags & M_EF_SEREX)
1556 				tms->tms_serex = 1;
1557 			if (st != M_ST_TAPEM)
1558 				{
1559 				tprintf(tms->tms_tpr,
1560 				    "tms%d: hard error bn%d\n",
1561 				    minor(bp->b_dev)&03, bp->b_blkno);
1562 				errinfo(st);		/* produces more info */
1563 #				ifdef DEBUG
1564 				printd("tmscprsp: error; status sub-code = 0%o, flags = 0%o\n",
1565 					(mp->mscp_status & 177740)>>5, mp->mscp_flags);
1566 #				endif
1567 				bp->b_flags |= B_ERROR;
1568 				}
1569 			else
1570 				/* Hit a tape mark - Set serex flag to
1571 				 * a special value so we can clear the
1572 				 * serious exception on the next command.
1573 				 */
1574 				tms->tms_serex = 2;
1575 			}
1576 		/*
1577 		 * The tmscp spec states that controllers do not have to
1578 		 * report the number of records or files skipped.  So on
1579 		 * reposition commands we go strictly by cmd status.
1580 		 */
1581 		if (mp->mscp_opcode != (M_OP_REPOS|M_OP_END))
1582 			bp->b_resid = bp->b_bcount - mp->mscp_bytecnt;
1583 		else
1584 			bp->b_resid = 0;
1585 		tms->tms_resid = bp->b_resid;
1586 		iodone(bp);
1587 		break;
1588 
1589 	case M_OP_GTUNT|M_OP_END:
1590 #		ifdef DEBUG
1591 		printd("tmscprsp: GTUNT end packet status = 0%o\n",st);
1592 		printd("tmscprsp: unit %d mediaid %x %c%c %c%c%c%d %x %x t=%d\n"
1593 		    ,mp->mscp_unit, mp->mscp_mediaid
1594 		    ,F_to_C(mp,4),F_to_C(mp,3),F_to_C(mp,2)
1595 		    ,F_to_C(mp,1),F_to_C(mp,0)
1596 		    ,mp->mscp_mediaid & 0x7f
1597 		    ,mp->mscp_unitid.val[0]
1598 		    ,mp->mscp_unitid.val[1]
1599 		    ,mp->mscp_format);
1600 #		endif
1601 		tms->tms_type = mp->mscp_mediaid;
1602 		tms->tms_fmtmenu = mp->mscp_fmtmenu;
1603 		tms->tms_unitflgs = mp->mscp_unitflgs;
1604 		break;
1605 
1606 	default:
1607 		printf("tmscp unknown packet\n");
1608 		tmserror(um, (struct mslg *)mp);
1609 	}	/* end switch mp->mscp_opcode */
1610 }
1611 
1612 
1613 /*
1614  * Give a meaningful error when the mscp_status field returns an error code.
1615  */
1616 
1617 errinfo(st)
1618 	int st;			/* the status code */
1619 {
1620 	switch(st) {
1621 	case M_ST_ICMD:
1622 		printf("invalid command\n");
1623 		break;
1624 	case M_ST_ABRTD:
1625 		printf("command aborted\n");
1626 		break;
1627 	case M_ST_OFFLN:
1628 		printf("unit offline\n");
1629 		break;
1630 	case M_ST_WRTPR:
1631 		printf("unit write protected\n");
1632 		break;
1633 	case M_ST_COMP:
1634 		printf("compare error\n");
1635 		break;
1636 	case M_ST_DATA:
1637 		printf("data error\n");
1638 		break;
1639 	case M_ST_HSTBF:
1640 		printf("host buffer access error\n");
1641 		break;
1642 	case M_ST_CNTLR:
1643 		printf("controller error\n");
1644 		break;
1645 	case M_ST_DRIVE:
1646 		printf("drive error\n");
1647 		break;
1648 	case M_ST_FMTER:
1649 		printf("formatter error\n");
1650 		break;
1651 	case M_ST_BOT:
1652 		printf("BOT encountered\n");
1653 		break;
1654 	case M_ST_TAPEM:
1655 		printf("tape mark encountered\n");
1656 		break;
1657 	case M_ST_RDTRN:
1658 		printf("record data truncated\n");
1659 		break;
1660 	case M_ST_PLOST:
1661 		printf("position lost\n");
1662 		break;
1663 	case M_ST_SEX:
1664 		printf("serious exception\n");
1665 		break;
1666 	case M_ST_LED:
1667 		printf("LEOT detected\n");
1668 		break;
1669 	}
1670 }
1671 
1672 
1673 /*
1674  * Manage buffers and perform block mode read and write operations.
1675  */
1676 
1677 tmscpstrategy (bp)
1678 	register struct buf *bp;
1679 {
1680 	register struct uba_device *ui;
1681 	register struct uba_ctlr *um;
1682 	register struct buf *dp;
1683 	register int unit = TMSUNIT(bp->b_dev);
1684 	int s;
1685 
1686 	if (unit >= NTMS)
1687 		{
1688 #		ifdef DEBUG
1689 		printd ("tmscpstrategy: bad unit # %d\n",unit);
1690 #		endif
1691 		bp->b_flags |= B_ERROR;
1692 		iodone(bp);
1693 		return;
1694 		}
1695 	ui = tmsdinfo[unit];
1696 	um = ui->ui_mi;
1697 	if (ui == 0 || ui->ui_alive == 0)
1698 		{
1699 		bp->b_flags |= B_ERROR;
1700 		iodone(bp);
1701 		return;
1702 		}
1703 	s = spl5();
1704 	/*
1705 	 * Link the buffer onto the drive queue
1706 	 */
1707 	dp = &tmsutab[ui->ui_unit];
1708 	if (dp->b_actf == 0)
1709 		dp->b_actf = bp;
1710 	else
1711 		dp->b_actl->av_forw = bp;
1712 	dp->b_actl = bp;
1713 	bp->av_forw = 0;
1714 	/*
1715 	 * Link the drive onto the controller queue
1716 	 */
1717 	if (dp->b_active == 0)
1718 		{
1719 		dp->b_forw = NULL;
1720 		if (um->um_tab.b_actf == NULL)
1721 			um->um_tab.b_actf = dp;
1722 		else
1723 			um->um_tab.b_actl->b_forw = dp;
1724 		um->um_tab.b_actl = dp;
1725 		dp->b_active = 1;
1726 		}
1727 	/*
1728 	 * If the controller is not active, start it.
1729 	 */
1730 	if (um->um_tab.b_active == 0)
1731 		{
1732 #		if defined(VAX750)
1733 		if (cpu == VAX_750
1734 				 && tmscpwtab[um->um_ctlr].av_forw == &tmscpwtab[um->um_ctlr])
1735 			{
1736 			if (um->um_ubinfo != 0)
1737 				log(TMS_PRI, "tmscpstrategy: ubinfo 0x%x\n",
1738 				    um->um_ubinfo);
1739 			else
1740 				um->um_ubinfo = uballoc(um->um_ubanum, (caddr_t)0, 0, UBA_NEEDBDP);
1741 			}
1742 #		endif
1743 #		ifdef DEBUG
1744 		printd10("tmscpstrategy: Controller not active, starting it\n");
1745 #		endif
1746 		(void) tmscpstart(um);
1747 		}
1748 	splx(s);
1749 	return;
1750 }
1751 
1752 #define DBSIZE 32
1753 
1754 #define ca_Rspdsc       ca_rspdsc[0]
1755 #define ca_Cmddsc       ca_rspdsc[1]
1756 #define tmscp_Rsp       tmscp_rsp[0]
1757 #define tmscp_Cmd       tmscp_cmd[0]
1758 
1759 struct  tmscp     tmscpd[NTMSCP];
1760 
1761 tmscpdump(dev)
1762 	dev_t dev;
1763 {
1764 	struct tmscpdevice *tmscpaddr;
1765 	struct tmscp *tmscp_ubaddr;
1766 	char *start;
1767 	int num, blk, unit;
1768 	register struct uba_regs *uba;
1769 	register struct uba_device *ui;
1770 	register struct tmscp *tmscpp;
1771 	register struct pte *io;
1772 	register int i;
1773 
1774 	unit = minor(dev) & 03;
1775 	if (unit >= NTMS)
1776 		return (ENXIO);
1777 #	define phys(cast, addr) ((cast)((int)addr & 0x7fffffff))
1778 	ui = phys(struct uba_device *, tmsdinfo[unit]);
1779 	if (ui->ui_alive == 0)
1780 		return (ENXIO);
1781 	uba = phys(struct uba_hd *, ui->ui_hd)->uh_physuba;
1782 	ubainit(uba);
1783 	tmscpaddr = (struct tmscpdevice *)ui->ui_physaddr;
1784 	DELAY(2000000);
1785 	tmscpp = phys(struct tmscp *, &tmscpd[ui->ui_ctlr]);
1786 
1787 	num = btoc(sizeof(struct tmscp)) + 1;
1788 	io = &uba->uba_map[NUBMREG-num];
1789 	for(i = 0; i<num; i++)
1790 		*(int *)io++ = UBAMR_MRV|(btop(tmscpp)+i);
1791 	tmscp_ubaddr = (struct tmscp *)(((int)tmscpp & PGOFSET)|((NUBMREG-num)<<9));
1792 
1793 	tmscpaddr->tmscpip = 0;
1794 	while ((tmscpaddr->tmscpsa & TMSCP_STEP1) == 0)
1795 		if(tmscpaddr->tmscpsa & TMSCP_ERR) return(EFAULT);
1796 	tmscpaddr->tmscpsa = TMSCP_ERR;
1797 	while ((tmscpaddr->tmscpsa & TMSCP_STEP2) == 0)
1798 		if(tmscpaddr->tmscpsa & TMSCP_ERR) return(EFAULT);
1799 	tmscpaddr->tmscpsa = (short)&tmscp_ubaddr->tmscp_ca.ca_ringbase;
1800 	while ((tmscpaddr->tmscpsa & TMSCP_STEP3) == 0)
1801 		if(tmscpaddr->tmscpsa & TMSCP_ERR) return(EFAULT);
1802 	tmscpaddr->tmscpsa = (short)(((int)&tmscp_ubaddr->tmscp_ca.ca_ringbase) >> 16);
1803 	while ((tmscpaddr->tmscpsa & TMSCP_STEP4) == 0)
1804 		if(tmscpaddr->tmscpsa & TMSCP_ERR) return(EFAULT);
1805 	tmscpaddr->tmscpsa = TMSCP_GO;
1806 	tmscpp->tmscp_ca.ca_Rspdsc = (long)&tmscp_ubaddr->tmscp_Rsp.mscp_cmdref;
1807 	tmscpp->tmscp_ca.ca_Cmddsc = (long)&tmscp_ubaddr->tmscp_Cmd.mscp_cmdref;
1808 	tmscpp->tmscp_Cmd.mscp_header.tmscp_vcid = 1;	/* for tape */
1809 	tmscpp->tmscp_Cmd.mscp_cntflgs = 0;
1810 	tmscpp->tmscp_Cmd.mscp_version = 0;
1811 	if (tmscpcmd(M_OP_STCON, tmscpp, tmscpaddr) == 0) {
1812 		return(EFAULT);
1813 	}
1814 	tmscpp->tmscp_Cmd.mscp_unit = ui->ui_slave;
1815 	if (tmscpcmd(M_OP_ONLIN, tmscpp, tmscpaddr) == 0) {
1816 		return(EFAULT);
1817 	}
1818 
1819 	num = maxfree;
1820 	start = 0;
1821 	while (num > 0)
1822 		{
1823 		blk = num > DBSIZE ? DBSIZE : num;
1824 		io = uba->uba_map;
1825 		for (i = 0; i < blk; i++)
1826 			*(int *)io++ = (btop(start)+i) | UBAMR_MRV;
1827 		*(int *)io = 0;
1828 		tmscpp->tmscp_Cmd.mscp_lbn = btop(start);
1829 		tmscpp->tmscp_Cmd.mscp_unit = ui->ui_slave;
1830 		tmscpp->tmscp_Cmd.mscp_bytecnt = blk*NBPG;
1831 #		ifdef	MVAX
1832 		if( cpu == MVAX_I )
1833 			tmscpp->tmscp_Cmd.mscp_buffer = (long) start;
1834 		else
1835 #		endif 	MVAX
1836 			tmscpp->tmscp_Cmd.mscp_buffer = 0;
1837 		if (tmscpcmd(M_OP_WRITE, tmscpp, tmscpaddr) == 0)
1838 			return(EIO);
1839 		start += blk*NBPG;
1840 		num -= blk;
1841 		}
1842 	return (0);
1843 }
1844 
1845 
1846 /*
1847  * Perform a standalone tmscp command.  This routine is only used by tmscpdump.
1848  */
1849 
1850 tmscpcmd(op, tmscpp, tmscpaddr)
1851 	int op;
1852 	register struct tmscp *tmscpp;
1853 	struct tmscpdevice *tmscpaddr;
1854 {
1855 	int i;
1856 
1857 
1858 	tmscpp->tmscp_Cmd.mscp_opcode = op;
1859 	tmscpp->tmscp_Rsp.mscp_header.tmscp_msglen = mscp_msglen;
1860 	tmscpp->tmscp_Cmd.mscp_header.tmscp_msglen = mscp_msglen;
1861 	tmscpp->tmscp_ca.ca_Rspdsc |= TMSCP_OWN|TMSCP_INT;
1862 	tmscpp->tmscp_ca.ca_Cmddsc |= TMSCP_OWN|TMSCP_INT;
1863 	if (tmscpaddr->tmscpsa&TMSCP_ERR)
1864 		printf("tmscp fatal error (0%o)\n", tmscpaddr->tmscpsa&0xffff);
1865 	i = tmscpaddr->tmscpip;
1866 #ifdef lint
1867 	i = i;
1868 #endif
1869 	for (;;)
1870 		{
1871 		if (tmscpp->tmscp_ca.ca_cmdint)
1872 			tmscpp->tmscp_ca.ca_cmdint = 0;
1873 		if (tmscpp->tmscp_ca.ca_rspint)
1874 			break;
1875 		}
1876 	tmscpp->tmscp_ca.ca_rspint = 0;
1877 	if (tmscpp->tmscp_Rsp.mscp_opcode != (op|M_OP_END) ||
1878 	    (tmscpp->tmscp_Rsp.mscp_status&M_ST_MASK) != M_ST_SUCC)
1879 		{
1880 		printf("error: com %d opc 0x%x stat 0x%x\ndump ", op,
1881 			tmscpp->tmscp_Rsp.mscp_opcode, tmscpp->tmscp_Rsp.mscp_status);
1882 		return(0);
1883 		}
1884 	return(1);
1885 }
1886 
1887 /*
1888  * Catch ioctl commands, and call the "command" routine to do them.
1889  */
1890 
1891 /* ARGSUSED */
1892 tmscpioctl(dev, cmd, data, flag)
1893 	dev_t dev;
1894 	int cmd;
1895 	caddr_t data;
1896 	int flag;
1897 {
1898 	register struct buf *bp = &ctmscpbuf[TMSCPCTLR(dev)];
1899 	register callcount;	/* number of times to call cmd routine */
1900 	register struct uba_device *ui;
1901 	register struct tms_info *tms;
1902 	int fcount;		/* number of files (or records) to space */
1903 	int error = 0;
1904 	register struct mtop *mtop;	/* mag tape cmd op to perform */
1905 	register struct mtget *mtget;	/* mag tape struct to get info in */
1906 
1907 	/* we depend of the values and order of the TMS ioctl codes here */
1908 	static tmsops[] =
1909 	 {TMS_WRITM,TMS_FSF,TMS_BSF,TMS_FSR,TMS_BSR,TMS_REW,TMS_OFFL,TMS_SENSE,
1910 	  TMS_CACHE,TMS_NOCACHE};
1911 
1912 	switch (cmd) {
1913 	case MTIOCTOP:	/* tape operation */
1914 		mtop = (struct mtop *)data;
1915 		switch (mtop->mt_op) {
1916 
1917 		case MTWEOF:
1918 			callcount = mtop->mt_count;
1919 			fcount = 1;
1920 			break;
1921 		case MTFSF: case MTBSF:
1922 		case MTFSR: case MTBSR:
1923 			callcount = 1;
1924 			fcount = mtop->mt_count;
1925 			break;
1926 		case MTREW: case MTOFFL: case MTNOP:
1927 		case MTCACHE: case MTNOCACHE:
1928 			callcount = 1;
1929 			fcount = 1;		/* wait for this rewind */
1930 			break;
1931 		default:
1932 			return (ENXIO);
1933 		}	/* end switch mtop->mt_op */
1934 
1935 		if (callcount <= 0 || fcount <= 0)
1936 			return (EINVAL);
1937 		while (--callcount >= 0)
1938 			{
1939 			tmscpcommand(dev, tmsops[mtop->mt_op], fcount);
1940 			if ((mtop->mt_op == MTFSR || mtop->mt_op == MTBSR) &&
1941 			    bp->b_resid)
1942 				return (EIO);
1943 			if (bp->b_flags & B_ERROR)	/* like hitting BOT */
1944 				break;
1945 			}
1946 		if (bp->b_flags&B_ERROR)
1947 			if ((error = bp->b_error)==0)
1948 				return (EIO);
1949 		return (error);
1950 
1951 	case MTIOCGET:
1952 		/*
1953 		 * Return status info associated with the particular UNIT.
1954 		 */
1955 		ui = tmsdinfo[TMSUNIT(dev)];
1956 		tms = &tms_info[ui->ui_unit];
1957 		mtget = (struct mtget *)data;
1958 		mtget->mt_type = MT_ISTMSCP;
1959 		mtget->mt_dsreg = tms->tms_flags << 8;
1960 		mtget->mt_dsreg |= tms->tms_endcode;
1961 		mtget->mt_erreg = tms->tms_status;
1962 		mtget->mt_resid = tms->tms_resid;
1963 		break;
1964 
1965 	default:
1966 		return (ENXIO);
1967 	}
1968 	return (0);
1969 }
1970 
1971 
1972 /*
1973  * Reset (for raw mode use only).
1974  */
1975 
1976 tmscpreset (uban)
1977 	int uban;
1978 {
1979 	register struct uba_ctlr *um;
1980 	register struct uba_device *ui;
1981 	register struct buf *bp, *dp;
1982 	register int unit;
1983 	struct buf *nbp;
1984 	int d;
1985 
1986 	for (d = 0; d < NTMSCP; d++)
1987 		{
1988 		if ((um = tmscpminfo[d]) == 0 || um->um_ubanum != uban ||
1989 		    um->um_alive == 0)
1990 			continue;
1991 		printf(" tmscp%d", d);
1992 		um->um_tab.b_active = 0;
1993 		um->um_tab.b_actf = um->um_tab.b_actl = 0;
1994 		tmscp_softc[d].sc_state = S_IDLE;
1995 		tmscp_softc[d].sc_mapped = 0;
1996 		for (unit = 0; unit < NTMS; unit++)
1997 			{
1998 			if ((ui = tmsdinfo[unit]) == 0)
1999 				continue;
2000 			if (ui->ui_alive == 0 || ui->ui_mi != um)
2001 				continue;
2002 			tmsutab[unit].b_active = 0;
2003 			tmsutab[unit].b_qsize = 0;
2004 			}
2005 		for (bp = tmscpwtab[d].av_forw; bp != &tmscpwtab[d]; bp = nbp)
2006 			{
2007 			nbp = bp->av_forw;
2008 			bp->b_ubinfo = 0;
2009 			/*
2010 			 * Link the buffer onto the drive queue
2011 			 */
2012 			dp = &tmsutab[TMSUNIT(bp->b_dev)];
2013 			if (dp->b_actf == 0)
2014 				dp->b_actf = bp;
2015 			else
2016 				dp->b_actl->av_forw = bp;
2017 			dp->b_actl = bp;
2018 			bp->av_forw = 0;
2019 			/*
2020 			 * Link the drive onto the controller queue
2021 			 */
2022 			if (dp->b_active == 0)
2023 				{
2024 				dp->b_forw = NULL;
2025 				if (um->um_tab.b_actf == NULL)
2026 					um->um_tab.b_actf = dp;
2027 				else
2028 					um->um_tab.b_actl->b_forw = dp;
2029 				um->um_tab.b_actl = dp;
2030 				dp->b_active = 1;
2031 				}
2032 			}
2033 		(void)tmscpinit(d);
2034 		}
2035 }
2036 
2037 
2038 /*
2039  * Process an error log message
2040  *
2041  * Only minimal decoding is done, only "useful"
2042  * information is printed.  Eventually should
2043  * send message to an error logger.
2044  */
2045 
2046 tmserror(um, mp)
2047 	register struct uba_ctlr *um;
2048 	register struct mslg *mp;
2049 {
2050 	register i;
2051 
2052 #	ifdef DEBUG
2053 	printd("tmserror:\n");
2054 #	endif
2055 	if(!(mp->mslg_flags & (M_LF_SUCC | M_LF_CONT)))
2056 		log(TMS_PRI, "tmscp%d: %s error, ", um->um_ctlr,
2057 		mp->mslg_flags & ( M_LF_SUCC | M_LF_CONT ) ? "soft" : "hard");
2058 
2059 	switch (mp->mslg_format) {
2060 
2061 	case M_FM_CNTERR:
2062 		log(TMS_PRI, "controller error, event 0%o\n", mp->mslg_event);
2063 		break;
2064 	case M_FM_BUSADDR:
2065 		log(TMS_PRI, "host memory access error, event 0%o, addr 0%o\n",
2066 			mp->mslg_event, mp->mslg_busaddr);
2067 		break;
2068 	case M_FM_TAPETRN:
2069 		log(TMS_PRI, "tape transfer error, unit %d, grp 0x%x, event 0%o\n",
2070 			mp->mslg_unit, mp->mslg_group, mp->mslg_event);
2071 		break;
2072 	case M_FM_STIERR:
2073 		log(TMS_PRI, "STI error, unit %d, event 0%o\n",
2074 			mp->mslg_unit, mp->mslg_event);
2075 #ifdef notdef
2076 		/* too painful to do with log() */
2077 		for(i = 0; i < 62;i++)
2078 			mprintf("\t0x%x",mp->mslg_stiunsucc[i] & 0xff);
2079 		mprintf("\n");
2080 #endif
2081 		break;
2082 	case M_FM_STIDEL:
2083 		log(TMS_PRI, "STI Drive Error Log, unit %d, event 0%o\n",
2084 			mp->mslg_unit, mp->mslg_event);
2085 		break;
2086 	case M_FM_STIFEL:
2087 		log(TMS_PRI, "STI Formatter Error Log, unit %d, event 0%o\n",
2088 			mp->mslg_unit, mp->mslg_event);
2089 		break;
2090 	default:
2091 		log(TMS_PRI, "unknown error, unit %d, format 0%o, event 0%o\n",
2092 			mp->mslg_unit, mp->mslg_format, mp->mslg_event);
2093 	}
2094 
2095 	if (tmscperror)
2096 		{
2097 		register long *p = (long *)mp;
2098 
2099 		for (i = 0; i < mp->mslg_header.tmscp_msglen; i += sizeof(*p))
2100 			printf("%x ", *p++);
2101 		printf("\n");
2102 		}
2103 }
2104 #endif
2105