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

Defined functions

errinfo defined in line 1610; used 1 times
tmscpattach defined in line 420; used 2 times
tmscpclose defined in line 792; never used
tmscpcmd defined in line 1843; used 3 times
tmscpcommand defined in line 840; used 8 times
tmscpdump defined in line 1754; never used
tmscpgetcp defined in line 892; used 6 times
tmscpinit defined in line 936; used 5 times
tmscpintr defined in line 441; used 3 times
tmscpioctl defined in line 1918; never used
tmscpopen defined in line 672; never used
tmscpprobe defined in line 279; used 2 times
tmscpread defined in line 1885; never used
tmscpreset defined in line 1998; used 1 times
tmscprsp defined in line 1311; used 2 times
tmscpslave defined in line 335; used 2 times
tmscpstart defined in line 995; used 2 times
tmscpstrategy defined in line 1670; used 3 times
tmscpwrite defined in line 1901; never used
tmserror defined in line 2068; used 2 times

Defined variables

ctmscpbuf defined in line 204; used 3 times
rtmsbuf defined in line 203; used 2 times
sccsid defined in line 4; never used
tms_info defined in line 196; used 7 times
tmscp defined in line 176; used 6 times
tmscp_cp_wait defined in line 249; used 5 times
tmscp_softc defined in line 170; used 9 times
tmscpd defined in line 1752; used 1 times
tmscpdebug defined in line 256; used 7 times
tmscpdriver defined in line 267; used 3 times
tmscperror defined in line 248; used 2 times
tmscpip defined in line 202; used 15 times
tmscpmicro defined in line 207; used 3 times
tmscpminfo defined in line 197; used 5 times
tmscpstd defined in line 266; used 1 times
tmscpwtab defined in line 206; used 8 times
tmsdinfo defined in line 198; used 9 times
tmsutab defined in line 205; used 7 times
utoctlr defined in line 208; used 2 times

Defined struct's

tms_info defined in line 181; used 12 times
tmscp defined in line 172; used 31 times
tmscp_softc defined in line 161; used 16 times

Defined macros

CTRLNAME defined in line 264; used 1 times
DBSIZE defined in line 1745; used 2 times
DELAYTEN defined in line 277; used 4 times
DRVNAME defined in line 263; used 1 times
F_to_C defined in line 1404; used 10 times
NCMD defined in line 154; used 3 times
NCMDL2 defined in line 152; used 4 times
NRSP defined in line 153; used 4 times
NRSPL2 defined in line 151; used 4 times
STEP1GOOD defined in line 469; used 1 times
STEP1MASK defined in line 468; used 1 times
STEP2GOOD defined in line 497; used 1 times
STEP2MASK defined in line 496; used 1 times
STEP3GOOD defined in line 524; used 1 times
STEP3MASK defined in line 523; used 1 times
S_IDLE defined in line 241; used 8 times
S_RUN defined in line 246; used 6 times
S_SCHAR defined in line 245; used 1 times
S_STEP1 defined in line 242; used 1 times
S_STEP2 defined in line 243; used 1 times
S_STEP3 defined in line 244; used 1 times
TENSEC defined in line 148; never used
TMSCPCTLR defined in line 217; used 2 times
TMSUNIT defined in line 212; used 11 times
TMS_BSF defined in line 225; used 1 times
TMS_BSR defined in line 227; used 2 times
TMS_CACHE defined in line 231; used 1 times
TMS_CSE defined in line 234; used 1 times
TMS_FSF defined in line 224; used 1 times
TMS_FSR defined in line 226; used 1 times
TMS_HIDENSITY defined in line 236; used 1 times
TMS_LOWDENSITY defined in line 235; used 1 times
TMS_NOCACHE defined in line 232; used 1 times
TMS_OFFL defined in line 229; used 1 times
TMS_PRI defined in line 149; used 10 times
TMS_REW defined in line 228; used 2 times
TMS_SENSE defined in line 230; used 1 times
TMS_WRITM defined in line 223; used 3 times
T_HIDENSITY defined in line 214; used 1 times
T_NOREWIND defined in line 213; used 1 times
b_qsize defined in line 271; used 5 times
b_ubinfo defined in line 272; used 3 times
ca_Cmddsc defined in line 1748; used 2 times
ca_Rspdsc defined in line 1747; used 2 times
phys defined in line 1770; used 3 times
printd defined in line 255; used 30 times
printd10 defined in line 257; used 3 times
tmscp_Cmd defined in line 1750; used 12 times
tmscp_Rsp defined in line 1749; used 6 times
Last modified: 1986-06-05
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 6437
Valid CSS Valid XHTML 1.0 Strict