Annotation of sys/arch/mvme68k/dev/vsreg.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: vsreg.h,v 1.7 2006/12/21 02:28:47 krw Exp $ */
! 2: /*
! 3: * Copyright (c) 1999 Steve Murphree, Jr.
! 4: * Copyright (c) 1990 The Regents of the University of California.
! 5: * All rights reserved.
! 6: *
! 7: * This code is derived from source contributed by Mark Bellon.
! 8: *
! 9: * Redistribution and use in source and binary forms, with or without
! 10: * modification, are permitted provided that the following conditions
! 11: * are met:
! 12: * 1. Redistributions of source code must retain the above copyright
! 13: * notice, this list of conditions and the following disclaimer.
! 14: * 2. Redistributions in binary form must reproduce the above copyright
! 15: * notice, this list of conditions and the following disclaimer in the
! 16: * documentation and/or other materials provided with the distribution.
! 17: * 3. Neither the name of the University nor the names of its contributors
! 18: * may be used to endorse or promote products derived from this software
! 19: * without specific prior written permission.
! 20: *
! 21: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
! 22: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 23: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 24: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 25: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 26: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 27: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 28: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 29: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 30: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 31: * SUCH DAMAGE.
! 32: */
! 33:
! 34: #if !defined(_M328REG_H_)
! 35: #define _M328REG_H_
! 36:
! 37:
! 38: typedef struct LONGV
! 39: {
! 40: u_short msw;
! 41: u_short lsw;
! 42: } LONGV;
! 43:
! 44: #define MSW(x) ((x).msw)
! 45: #define LSW(x) ((x).lsw)
! 46:
! 47: /*
! 48: * macro to convert a unsigned long to a LONGV
! 49: */
! 50:
! 51: #define LV( a, b) \
! 52: { \
! 53: MSW( a ) = ( (( (unsigned long)(b) ) >> 16) & 0xffff ); \
! 54: LSW( a ) = ( ( (unsigned long)(b) ) & 0xffff); \
! 55: }
! 56:
! 57: /*
! 58: * macro to convert a LONGV to a unsigned long
! 59: */
! 60:
! 61: #define VL( a, b) \
! 62: { \
! 63: a = ( (((unsigned long) MSW(b)) << 16 ) | (((unsigned long) LSW(b)) & 0x0ffff) ); \
! 64: }
! 65:
! 66: #define COUGAR 0x4220 /* board type (config. status area) */
! 67: #define JAGUAR 0
! 68:
! 69: /*
! 70: * JAGUAR specific device limits.
! 71: */
! 72:
! 73: #define JAGUAR_MIN_Q_SIZ 2 /* got'a have at least one! */
! 74: #define JAGUAR_MAX_Q_SIZ 2 /* can't have more */
! 75: #define JAGUAR_MAX_CTLR_CMDS 80 /* Interphase says so */
! 76:
! 77: /*
! 78: * COUGAR specific device limits.
! 79: */
! 80:
! 81: #define COUGAR_MIN_Q_SIZ 2 /* got'a have at least one! */
! 82: #define COUGAR_CMDS_PER_256K 42 /* Interphase says so */
! 83:
! 84: /*
! 85: * Structures
! 86: */
! 87:
! 88: #define NUM_CQE 10
! 89: #define MAX_IOPB 64
! 90: #define NUM_IOPB NUM_CQE
! 91: #define S_IOPB_RES (MAX_IOPB - sizeof(M328_short_IOPB))
! 92: #define S_SHORTIO 2048
! 93: #define S_IOPB sizeof(M328_IOPB)
! 94: #define S_CIB sizeof(M328_CIB)
! 95: #define S_MCSB sizeof(M328_MCSB)
! 96: #define S_MCE sizeof(M328_CQE)
! 97: #define S_CQE (sizeof(M328_CQE) * NUM_CQE)
! 98: #define S_HIOPB (sizeof(M328_IOPB) * NUM_IOPB)
! 99: #define S_HSB sizeof(M328_HSB)
! 100: #define S_CRB sizeof(M328_CRB)
! 101: #define S_CSS sizeof(M328_CSB)
! 102: #define S_NOT_HOST (S_MCSB + S_MCE + S_CQE + S_HIOPB + S_IOPB + \
! 103: S_CIB + S_HSB + S_CRB + S_IOPB + S_CSS)
! 104: #define S_HUS_FREE (S_SHORTIO - S_NOT_HOST)
! 105:
! 106: #define S_WQCF sizeof(M328_WQCF)
! 107:
! 108: #define HOST_ID 0x4321
! 109:
! 110:
! 111: /**************** Master Control Status Block (MCSB) *******************/
! 112:
! 113: /*
! 114: * defines for Master Status Register
! 115: */
! 116:
! 117: #define M_MSR_QFC 0x0004 /* queue flush complete */
! 118: #define M_MSR_BOK 0x0002 /* board OK */
! 119: #define M_MSR_CNA 0x0001 /* controller not available */
! 120:
! 121: /*
! 122: * defines for Master Control Register
! 123: */
! 124:
! 125: #define M_MCR_SFEN 0x2000 /* sysfail enable */
! 126: #define M_MCR_RES 0x1000 /* reset controller */
! 127: #define M_MCR_FLQ 0x0800 /* flush queue */
! 128: #define M_MCR_FLQR 0x0004 /* flush queue and report */
! 129: #define M_MCR_SQM 0x0001 /* start queue mode */
! 130:
! 131: /*
! 132: * defines for Interrupt on Queue Available Register
! 133: */
! 134:
! 135: #define M_IQAR_IQEA 0x8000 /* interrupt on queue entry avail */
! 136: #define M_IQAR_IQEH 0x4000 /* interrupt on queue half empty */
! 137: #define M_IQAR_ILVL 0x0700 /* interrupt lvl on queue available */
! 138: #define M_IQAR_IVCT 0x00FF /* interrupt vector on queue avail */
! 139:
! 140: /*
! 141: * defines for Thaw Work Queue Register
! 142: */
! 143:
! 144: #define M_THAW_TWQN 0xff00 /* thaw work queue number */
! 145: #define M_THAW_TWQE 0x0001 /* thaw work queue enable */
! 146:
! 147: typedef struct mcsb
! 148: { /* Master control/Status Block */
! 149: volatile u_short mcsb_MSR; /* Master status register */
! 150: volatile u_short mcsb_MCR; /* Master Control register */
! 151: volatile u_short mcsb_IQAR; /* Interrupt on Queue Available Reg */
! 152: volatile u_short mcsb_QHDP; /* Queue head pointer */
! 153: volatile u_short mcsb_THAW; /* Thaw work Queue */
! 154: volatile u_short mcsb_RES0; /* Reserved word 0 */
! 155: volatile u_short mcsb_RES1; /* Reserved word 1 */
! 156: volatile u_short mcsb_RES2; /* Reserved word 2 */
! 157: } M328_MCSB;
! 158:
! 159: /**************** END Master Control Status Block (MCSB) *******************/
! 160:
! 161: /**************** Scater/Gather Stuff *******************/
! 162:
! 163: typedef struct {
! 164: union {
! 165: unsigned short bytes :16;
! 166: #define MAX_SG_BLOCK_SIZE (1<<16) /* the size *has* to be always *smaller* */
! 167: struct {
! 168: unsigned short :8;
! 169: unsigned short gather :8;
! 170: } scatter;
! 171: } count;
! 172: LONGV address;
! 173: unsigned short link :1;
! 174: unsigned short :3;
! 175: unsigned short transfer_type :2;
! 176: /* 0x0 is reserved */
! 177: #define SHORT_TRANSFER 0x1
! 178: #define LONG_TRANSFER 0x2
! 179: #define SCATTER_GATTER_LIST_IN_SHORT_IO 0x3
! 180: unsigned short memory_type :2;
! 181: #define NORMAL_TYPE 0x0
! 182: #define BLOCK_MODE 0x1
! 183: /* 0x2 is reserved */
! 184: /* 0x3 is reserved */
! 185: unsigned short address_modifier :8;
! 186: }sg_list_element_t;
! 187:
! 188: typedef sg_list_element_t * scatter_gather_list_t;
! 189:
! 190: #define MAX_SG_ELEMENTS 64
! 191:
! 192: struct m328_sg {
! 193: struct m328_sg *up;
! 194: int elements;
! 195: int level;
! 196: struct m328_sg *down[MAX_SG_ELEMENTS];
! 197: sg_list_element_t list[MAX_SG_ELEMENTS];
! 198: };
! 199:
! 200: typedef struct m328_sg *M328_SG;
! 201:
! 202: typedef struct {
! 203: struct scsi_xfer *xs;
! 204: M328_SG top_sg_list;
! 205: } M328_CMD;
! 206: /**************** END Scater/Gather Stuff *******************/
! 207:
! 208: /**************** Host Semaphore Block (HSB) *******************/
! 209:
! 210: typedef struct hsb
! 211: { /* Host Semaphore Block */
! 212: volatile u_short hsb_INITQ; /* Init MCE Flag */
! 213: volatile u_short hsb_WORKQ; /* Work Queue number */
! 214: volatile u_short hsb_MAGIC; /* Magic word */
! 215: volatile u_short hsb_RES0; /* Reserved word */
! 216: } M328_HSB;
! 217:
! 218: /**************** END Host Semaphore Block (HSB) *******************/
! 219:
! 220: /**************** Perform Diagnostics Command Format *******************/
! 221:
! 222: typedef struct pdcf
! 223: { /* Perform Diagnostics Cmd Format */
! 224: volatile u_short pdcf_CMD; /* Command normally 0x40 */
! 225: volatile u_short pdcf_RES0; /* Reserved word */
! 226: volatile u_short pdcf_STATUS; /* Return Status */
! 227: volatile u_short pdcf_RES1; /* Reserved Word */
! 228: volatile u_short pdcf_ROM; /* ROM Test Results */
! 229: volatile u_short pdcf_BUFRAM; /* Buffer RAM results */
! 230: volatile u_short pdcf_EVENT_RAM; /* Event Ram test Results */
! 231: volatile u_short pdcf_SCSI_PRI_PORT; /* SCSI Primary Port Reg test */
! 232: volatile u_short pdcf_SCSI_SEC_PORT; /* SCSI Secondary Port Reg test */
! 233: } M328_PDCF;
! 234:
! 235: #define PDCF_SUCCESS 0xFFFF
! 236:
! 237: /**************** END Perform Diagnostics Command Format *******************/
! 238:
! 239: /*************** Controller Initialization Block (CIB) *****************/
! 240:
! 241: /*
! 242: * defines for Interrupt Vectors
! 243: */
! 244:
! 245: #define M_VECT_ILVL 0x0700 /* Interrupt Level */
! 246: #define M_VECT_IVCT 0x00FF /* Interrupt Vector */
! 247:
! 248: /*
! 249: * defines for SCSI Bus ID Registers
! 250: */
! 251:
! 252: #define M_PSID_DFT 0x0008 /* default ID enable */
! 253: #define M_PSID_ID 0x0007 /* Primary/Secondary SCSI ID */
! 254:
! 255: /*
! 256: * Error recovery flags.
! 257: */
! 258:
! 259: #define M_ERRFLGS_FOSR 0x0001 /* Freeze on SCSI bus reset */
! 260: #define M_ERRFLGS_RIN 0x0002 /* SCSI bus reset interrupt */
! 261: #define M_ERRFLGS_RSE 0x0004 /* Report COUGAR SCSI errors */
! 262:
! 263: /*
! 264: * Controller Initialization Block
! 265: */
! 266:
! 267: typedef struct cib
! 268: {
! 269: volatile u_short cib_NCQE; /* Number of Command Queue Entries */
! 270: volatile u_short cib_BURST; /* DMA Burst count */
! 271: volatile u_short cib_NVECT; /* Normal Completion Vector */
! 272: volatile u_short cib_EVECT; /* Error Completion Vector */
! 273: volatile u_short cib_PID; /* Primary SCSI Bus ID */
! 274: volatile u_short cib_SID; /* Secondary SCSI Bus ID */
! 275: volatile u_short cib_CRBO; /* Command Response Block Offset */
! 276: volatile u_short cib_SELECT_msw;/* Selection timeout in milli_second */
! 277: volatile u_short cib_SELECT_lsw;/* Selection timeout in milli_second */
! 278: volatile u_short cib_WQ0TIMO_msw;/* Work Q - timeout in 256 ms */
! 279: volatile u_short cib_WQ0TIMO_lsw;/* Work Q - timeout in 256 ms */
! 280: volatile u_short cib_VMETIMO_msw;/* VME Time out in 32 ms */
! 281: volatile u_short cib_VMETIMO_lsw;/* VME Time out in 32 ms */
! 282: volatile u_short cib_RES0[2]; /* Reserved words */
! 283: volatile u_short cib_OBMT; /* offbrd CRB mtype/xfer type/ad mod */
! 284: volatile u_short cib_OBADDR_msw;/* host mem address for offboard CRB */
! 285: volatile u_short cib_OBADDR_lsw;/* host mem address for offboard CRB */
! 286: volatile u_short cib_ERR_FLGS; /* error recovery flags */
! 287: volatile u_short cib_RES1; /* reserved word */
! 288: volatile u_short cib_RES2; /* reserved word */
! 289: volatile u_short cib_SBRIV; /* SCSI Bus Reset Interrupt Vector */
! 290: volatile u_char cib_SOF0; /* Synchronous offset (Bus 0) */
! 291: volatile u_char cib_SRATE0; /* Sync negotiation rate (Bus 0) */
! 292: volatile u_char cib_SOF1; /* Synchronous offset (Bus 1) */
! 293: volatile u_char cib_SRATE1; /* Sync negotiation rate (Bus 1) */
! 294: } M328_CIB;
! 295:
! 296: /**************** END Controller Initialization Block (CIB) *****************/
! 297:
! 298: /**************** Command Queue Entry (CQE) *******************/
! 299:
! 300: /*
! 301: * defines for Queue Entry Control Register
! 302: */
! 303:
! 304: #define M_QECR_IOPB 0x0F00 /* IOPB type (must be zero) */
! 305: #define M_QECR_HPC 0x0004 /* High Priority command */
! 306: #define M_QECR_AA 0x0002 /* abort acknowledge */
! 307: #define M_QECR_GO 0x0001 /* Go/Busy */
! 308:
! 309: #define CQE_GO(qecr) ((qecr) |= M_QECR_GO)
! 310: #define CQE_AA_GO(qecr) ((qecr) |= (M_QECR_GO + M_QECR_AA))
! 311:
! 312: typedef struct cqe
! 313: { /* Command Queue Entry */
! 314: volatile u_short cqe_QECR; /* Queue Entry Control Register */
! 315: volatile u_short cqe_IOPB_ADDR; /* IOPB Address */
! 316: volatile LONGV cqe_CTAG; /* Command Tag */
! 317: volatile u_char cqe_IOPB_LENGTH;/* IOPB Length */
! 318: volatile u_char cqe_WORK_QUEUE; /* Work Queue Number */
! 319: volatile u_short cqe_RES0; /* Reserved word */
! 320: } M328_CQE;
! 321:
! 322: /**************** END Command Queue Entry (CQE) *******************/
! 323:
! 324: /**************** Command Response Block (CRB) *******************/
! 325:
! 326: /*
! 327: * defines for Command Response Status Word
! 328: */
! 329:
! 330: #define M_CRSW_SE 0x0800 /* SCSI error (COUGAR) */
! 331: #define M_CRSW_RST 0x0400 /* SCSI Bus reset (COUGAR) */
! 332: #define M_CRSW_SC 0x0080 /* status change */
! 333: #define M_CRSW_CQA 0x0040 /* Command queue entry available */
! 334: #define M_CRSW_QMS 0x0020 /* queue mode started */
! 335: #define M_CRSW_AQ 0x0010 /* abort queue */
! 336: #define M_CRSW_EX 0x0008 /* exception */
! 337: #define M_CRSW_ER 0x0004 /* error */
! 338: #define M_CRSW_CC 0x0002 /* command complete */
! 339: #define M_CRSW_CRBV 0x0001 /* cmd response block valid/clear */
! 340:
! 341: #define CRB_CLR_DONE(crsw) ((crsw) = 0)
! 342: #define CRB_CLR_ER(crsw) ((crsw) &= ~M_CRSW_ER)
! 343:
! 344: typedef struct crb
! 345: { /* Command Response Block */
! 346: volatile u_short crb_CRSW; /* Command Response Status Word */
! 347: volatile u_short crb_RES0; /* Reserved word */
! 348: volatile LONGV crb_CTAG; /* Command Tag */
! 349: volatile u_char crb_IOPB_LENGTH;/* IOPB Length */
! 350: volatile u_char crb_WORK_QUEUE; /* Work Queue Number */
! 351: volatile u_short crb_RES1; /* Reserved word */
! 352: } M328_CRB;
! 353:
! 354: /**************** END Command Response Block (CRB) *******************/
! 355:
! 356: /*********** Controller Error Vector Status Block (CEVSB) **************/
! 357:
! 358: typedef struct cevsb
! 359: { /* Command Response Block */
! 360: volatile u_short cevsb_CRSW; /* Command Response Status Word */
! 361: volatile u_char cevsb_TYPE; /* IOPB type */
! 362: volatile u_char cevsb_RES0; /* Reserved byte */
! 363: volatile LONGV cevsb_CTAG; /* Command Tag */
! 364: volatile u_char cevsb_IOPB_LENGTH;/* IOPB Length */
! 365: volatile u_char cevsb_WORK_QUEUE;/* Work Queue Number */
! 366: volatile u_short cevsb_RES1; /* Reserved word */
! 367: volatile u_char cevsb_RES2; /* Reserved byte */
! 368: volatile u_char cevsb_ERROR; /* error code */
! 369: volatile u_short cevsb_AUXERR; /* COUGAR error code */
! 370: } M328_CEVSB;
! 371:
! 372: /*********** END Controller Error Vector Status Block (CEVSB) **************/
! 373:
! 374: /**************** Configuration Status Block (CSB) *******************/
! 375:
! 376: typedef struct csb
! 377: { /* Configuration Status Blk */
! 378: volatile u_short csb_TYPE; /* 0x0=JAGUAR, 0x4220=COUGAR */
! 379: volatile u_char csb_RES1; /* Reserved byte */
! 380: volatile u_char csb_PCODE[3]; /* Product Code */
! 381: volatile u_short csb_RES2; /* Reserved word */
! 382: volatile u_char csb_RES3; /* Reserved byte */
! 383: volatile u_char csb_PVAR; /* Product Variation */
! 384: volatile u_short csb_RES4; /* Reserved word */
! 385: volatile u_char csb_RES5; /* Reserved byte */
! 386: volatile u_char csb_FREV[3]; /* Firmware Revision level */
! 387: volatile u_short csb_RES6; /* Reserved word */
! 388: volatile u_char csb_FDATE[8]; /* Firmware Release date */
! 389: volatile u_short csb_SSIZE; /* System memory size in Kbytes */
! 390: volatile u_short csb_BSIZE; /* Buffer memory size in Kbytes */
! 391: volatile u_short csb_RES8; /* Reserved word */
! 392: volatile u_char csb_PFECID; /* Primary Bus FEC ID */
! 393: volatile u_char csb_SFECID; /* Secondard Bus FEC ID */
! 394: volatile u_char csb_PID; /* Primary Bus ID */
! 395: volatile u_char csb_SID; /* Secondary Bus ID */
! 396: volatile u_char csb_LPDS; /* Last Primary Device Selected */
! 397: volatile u_char csb_LSDS; /* Last Secondary Device Selected */
! 398: volatile u_char csb_PPS; /* Primary Phase Sense */
! 399: volatile u_char csb_SPS; /* Secondary Phase Sense */
! 400: volatile u_char csb_RES10; /* Reserved byte */
! 401: volatile u_char csb_DBID; /* Daughter Board ID */
! 402: volatile u_char csb_RES11; /* Reserved byte */
! 403: volatile u_char csb_SDS; /* Software DIP Switch */
! 404: volatile u_short csb_RES12; /* Reserved word */
! 405: volatile u_short csb_FWQR; /* Frozen Work Queues Register */
! 406: volatile u_char csb_RES13[72]; /* Reserved bytes */
! 407: } M328_CSB;
! 408:
! 409: /**************** END Configuration Status Block (CSB) *******************/
! 410:
! 411: /**************** IOPB Format (IOPB) *******************/
! 412:
! 413: /*
! 414: * defines for IOPB Option Word
! 415: */
! 416:
! 417: #define M_OPT_HEAD_TAG 0x3000 /* head of queue command queue tag */
! 418: #define M_OPT_ORDERED_TAG 0x2000 /* order command queue tag */
! 419: #define M_OPT_SIMPLE_TAG 0x1000 /* simple command queue tag */
! 420: #define M_OPT_GO_WIDE 0x0800 /* use WIDE transfers */
! 421: #define M_OPT_DIR 0x0100 /* VME direction bit */
! 422: #define M_OPT_SG_BLOCK 0x0008 /* scatter/gather in 512 byte blocks */
! 423: #define M_OPT_SS 0x0004 /* Suppress synchronous transfer */
! 424: #define M_OPT_SG 0x0002 /* scatter/gather bit */
! 425: #define M_OPT_IE 0x0001 /* Interrupt enable */
! 426:
! 427: /*
! 428: * defines for IOPB Address Type and Modifier
! 429: */
! 430:
! 431: #define M_ADR_TRANS 0x0C00 /* transfer type */
! 432: #define M_ADR_MEMT 0x0300 /* memory type */
! 433: #define M_ADR_MOD 0x00FF /* VME address modifier */
! 434: #define M_ADR_SG_LINK 0x8000 /* Scatter/Gather Link bit */
! 435:
! 436: /*
! 437: * defines for IOPB Unit Address on SCSI Bus
! 438: */
! 439:
! 440: #define M_UNIT_EXT_LUN 0xFF00 /* Extended Address */
! 441: #define M_UNIT_EXT 0x0080 /* Extended Address Enable */
! 442: #define M_UNIT_BUS 0x0040 /* SCSI Bus Selection */
! 443: #define M_UNIT_LUN 0x0038 /* Logical Unit Number */
! 444: #define M_UNIT_ID 0x0007 /* SCSI Device ID */
! 445:
! 446: typedef struct short_iopb
! 447: {
! 448: volatile u_short iopb_CMD; /* IOPB Command code */
! 449: volatile u_short iopb_OPTION; /* IOPB Option word */
! 450: volatile u_short iopb_STATUS; /* IOPB Return Status word */
! 451: volatile u_short iopb_RES0; /* IOPB Reserved word */
! 452: volatile u_char iopb_NVCT; /* IOPB Normal completion Vector */
! 453: volatile u_char iopb_EVCT; /* IOPB Error completion Vector */
! 454: volatile u_short iopb_LEVEL; /* IOPB Interrupt Level */
! 455: volatile u_short iopb_RES1; /* IOPB Reserved word */
! 456: volatile u_short iopb_ADDR; /* IOPB Address type and modifer */
! 457: volatile LONGV iopb_BUFF; /* IOPB Buffer Address */
! 458: volatile LONGV iopb_LENGTH; /* IOPB Max-Transfer Length */
! 459: volatile LONGV iopb_SGTTL; /* IOPB Scatter/Gather Total Transfer len */
! 460: volatile u_short iopb_RES4; /* IOPB Reserved word */
! 461: volatile u_short iopb_UNIT; /* IOPB Unit address on SCSI bus */
! 462: } M328_short_IOPB;
! 463:
! 464: typedef struct iopb
! 465: {
! 466: volatile u_short iopb_CMD; /* IOPB Command code */
! 467: volatile u_short iopb_OPTION; /* IOPB Option word */
! 468: volatile u_short iopb_STATUS; /* IOPB Return Status word */
! 469: volatile u_short iopb_RES0; /* IOPB Reserved word */
! 470: volatile u_char iopb_NVCT; /* IOPB Normal completion Vector */
! 471: volatile u_char iopb_EVCT; /* IOPB Error completion Vector */
! 472: volatile u_short iopb_LEVEL; /* IOPB Interrupt Level */
! 473: volatile u_short iopb_RES1; /* IOPB Reserved word */
! 474: volatile u_short iopb_ADDR; /* IOPB Address type and modifer */
! 475: volatile LONGV iopb_BUFF; /* IOPB Buffer Address */
! 476: volatile LONGV iopb_LENGTH; /* IOPB Max-Transfer Length */
! 477: volatile LONGV iopb_SGTTL; /* IOPB Scatter/Gather Total Transfer len */
! 478: volatile u_short iopb_RES4; /* IOPB Reserved word */
! 479: volatile u_short iopb_UNIT; /* IOPB Unit address on SCSI bus */
! 480: u_short iopb_SCSI[S_IOPB_RES/2]; /* IOPB SCSI words for pass thru */
! 481: } M328_IOPB;
! 482:
! 483: /**************** END IOPB Format (IOPB) *******************/
! 484:
! 485: /**************** Initialize Work Queue Command Format (WQCF) ***********/
! 486:
! 487: #define M_WOPT_IWQ 0x8000 /* initialize work queue */
! 488: #define M_WOPT_PE 0x0008 /* parity check enable */
! 489: #define M_WOPT_FE 0x0004 /* freeze on error enable */
! 490: #define M_WOPT_TM 0x0002 /* target mode enable */
! 491: #define M_WOPT_AE 0x0001 /* abort enable */
! 492:
! 493: typedef struct wqcf
! 494: { /* Initialize Work Queue Cmd Format*/
! 495: volatile u_short wqcf_CMD; /* Command Normally (0x42) */
! 496: volatile u_short wqcf_OPTION; /* Command Options */
! 497: volatile u_short wqcf_STATUS; /* Return Status */
! 498: volatile u_short wqcf_RES0; /* Reserved word */
! 499: volatile u_char wqcf_NVCT; /* Normal Completion Vector */
! 500: volatile u_char wqcf_EVCT; /* Error Completion Vector */
! 501: volatile u_short wqcf_ILVL; /* Interrupt Level */
! 502: volatile u_short wqcf_RES1[8]; /* Reserved words */
! 503: volatile u_short wqcf_WORKQ; /* Work Queue Number */
! 504: volatile u_short wqcf_WOPT; /* Work Queue Options */
! 505: volatile u_short wqcf_SLOTS; /* Number of slots in Work Queues */
! 506: volatile u_short wqcf_RES2; /* Reserved word */
! 507: volatile LONGV wqcf_CMDTO; /* Command timeout */
! 508: volatile u_short wqcf_RES3; /* Reserved word */
! 509: } M328_WQCF;
! 510:
! 511: /**************** END Initialize Work Queue Command Format (WQCF) ***********/
! 512:
! 513: /**************** SCSI Reset Command Format (SRCF) ***********/
! 514:
! 515: typedef struct srcf
! 516: { /* SCSI Reset Cmd Format*/
! 517: volatile u_short srcf_CMD; /* Command Normally (0x22) */
! 518: volatile u_short srcf_OPTION; /* Command Options */
! 519: volatile u_short srcf_STATUS; /* Return Status */
! 520: volatile u_short srcf_RES0; /* Reserved word */
! 521: volatile u_char srcf_NVCT; /* Normal Completion Vector */
! 522: volatile u_char srcf_EVCT; /* Error Completion Vector */
! 523: volatile u_short srcf_ILVL; /* Interrupt Level */
! 524: volatile u_short srcf_RES1[8]; /* Reserved words */
! 525: volatile u_short srcf_BUSID; /* SCSI bus ID to reset */
! 526: } M328_SRCF;
! 527:
! 528: /**************** END SCSI Reset Command Format (SRCF) ***********/
! 529:
! 530: /**************** Device Reinitialize Command Format (DRCF) ***********/
! 531:
! 532: typedef struct drcf
! 533: { /* Device Reinitialize Cmd Format*/
! 534: volatile u_short drcf_CMD; /* Command Normally (0x4C) */
! 535: volatile u_short drcf_OPTION; /* Command Options */
! 536: volatile u_short drcf_STATUS; /* Return Status */
! 537: volatile u_short drcf_RES0; /* Reserved word */
! 538: volatile u_char drcf_NVCT; /* Normal Completion Vector */
! 539: volatile u_char drcf_EVCT; /* Error Completion Vector */
! 540: volatile u_short drcf_ILVL; /* Interrupt Level */
! 541: volatile u_short drcf_RES1[9]; /* Reserved words */
! 542: volatile u_short drcf_UNIT; /* Unit Address */
! 543: } M328_DRCF;
! 544:
! 545: /**************** END SCSI Reset Command Format (SRCF) ***********/
! 546:
! 547: /**************** Host Down Loadable Firmware (HDLF) ***********/
! 548:
! 549: typedef struct hdlf
! 550: { /* Host Down Loadable Firmware cmd */
! 551: volatile u_short hdlf_CMD; /* Command Normally (0x4F) */
! 552: volatile u_short hdlf_OPTION; /* Command Options */
! 553: volatile u_short hdlf_STATUS; /* Return Status */
! 554: volatile u_short hdlf_RES0; /* Reserved word */
! 555: volatile u_char hdlf_NVCT; /* Normal Completion Vector */
! 556: volatile u_char hdlf_EVCT; /* Error Completion Vector */
! 557: volatile u_short hdlf_ILVL; /* Interrupt Level */
! 558: volatile u_short hdlf_RES1; /* Reserved word */
! 559: volatile u_short hdlf_ADDR; /* Address type and modifer */
! 560: volatile LONGV hdlf_BUFF; /* Buffer Address */
! 561: volatile LONGV hdlf_LENGTH; /* Max-Transfer Length */
! 562: volatile LONGV hdlf_CSUM; /* Checksum */
! 563: volatile u_short hdlf_RES2; /* Reserved word */
! 564: volatile u_short hdlf_SEQ; /* Sequence number */
! 565: volatile u_short hdlf_RES3[6]; /* Reserved words */
! 566: } M328_HDLF;
! 567:
! 568: #define M328_INITIALIZE_DOWNLOAD 0x0010
! 569: #define M328_TRANSFER_PACKET 0x0020
! 570: #define M328_PROGRAM_FLASH 0x0040
! 571: #define M328_MOTOROLA_S_RECORDS 0x1000
! 572:
! 573: /**************** END SCSI Reset Command Format (SRCF) ***********/
! 574:
! 575: /**************** Short I/O Format *******************/
! 576:
! 577: struct vsreg
! 578: {
! 579: M328_MCSB sh_MCSB; /* Master Control / Status Block */
! 580: M328_CQE sh_MCE; /* Master Command Entry */
! 581: M328_CQE sh_CQE[NUM_CQE]; /* Command Queue Entry */
! 582: M328_IOPB sh_IOPB[NUM_IOPB]; /* Host IOPB Space */
! 583: M328_IOPB sh_MCE_IOPB; /* Host MCE IOPB Space */
! 584: M328_CIB sh_CIB; /* Controller Initialization Block */
! 585: volatile u_char sh_HUS[S_HUS_FREE];/* Host Usable Space */
! 586: M328_HSB sh_HSB; /* Host Semaphore Block */
! 587: M328_CRB sh_CRB; /* Command Response Block */
! 588: M328_IOPB sh_RET_IOPB; /* Returned IOPB */
! 589: M328_CSB sh_CSS; /* Controller Specific Space/Block */
! 590: };
! 591:
! 592: #define CRSW sc->sc_vsreg->sh_CRB.crb_CRSW
! 593: #define THAW_REG sc->sc_vsreg->sh_MCSB.mcsb_THAW
! 594: #define THAW(x) THAW_REG=((u_char)x << 8);THAW_REG |= M_THAW_TWQE
! 595: #define QUEUE_FZN(x) (sc->sc_vsreg->sh_CSS.csb_FWQR & (1 << x))
! 596: #define SELECTION_TIMEOUT 250 /* milliseconds */
! 597: #define VME_BUS_TIMEOUT 0xF /* units of 30ms */
! 598: #define M328_INFINITE_TIMEOUT 0 /* wait forever */
! 599:
! 600: /**************** END Short I/O Format *******************/
! 601:
! 602: /*
! 603: * Scatter gather structure
! 604: */
! 605:
! 606: typedef struct ipsg
! 607: {
! 608: volatile u_short sg_count; /* byte/entry count */
! 609: volatile u_short sg_addrhi; /* datablock/entry address high */
! 610: volatile u_short sg_addrlo; /* datablock/entry address low */
! 611: volatile u_short sg_meminfo; /* memory information */
! 612: }IPSG;
! 613:
! 614: #define MACSI_SG 256 /* number of MACSI scat/gat entries */
! 615: #define S_MACSI_SG (MACSI_SG * sizeof(IPSG))
! 616: #define MACSI_SG_RSIZE 65535 /* max len of each scatter/gather entry */
! 617:
! 618: /*
! 619: * SCSI IOPB definitions
! 620: */
! 621:
! 622: #define IOPB_PASS_THRU 0x20 /* SCSI Pass Through commands */
! 623: #define IOPB_PASS_THRU_EXT 0x21 /* SCSI Pass Through Extended commands */
! 624: #define IOPB_RESET 0x22 /* SCSI Reset bus */
! 625:
! 626: /*
! 627: * SCSI Control IOPB's
! 628: */
! 629:
! 630: #define CNTR_DIAG 0x40 /* Perform Diagnostics */
! 631: #define CNTR_INIT 0x41 /* Initialize Controller */
! 632: #define CNTR_INIT_WORKQ 0x42 /* Initialize Work Queue */
! 633: #define CNTR_DUMP_INIT 0x43 /* Dump Initialization Parameters */
! 634: #define CNTR_DUMP_WORDQ 0x44 /* Dump work Queue Parameters */
! 635: #define CNTR_CANCEL_IOPB 0x48 /* Cancel command tag */
! 636: #define CNTR_FLUSH_WORKQ 0x49 /* Flush Work Queue */
! 637: #define CNTR_DEV_REINIT 0x4C /* Reinitialize Device */
! 638: #define CNTR_ISSUE_ABORT 0x4E /* An abort has been issued */
! 639: #define CNTR_DOWNLOAD_FIRMWARE 0x4F /* Download firmware (COUGAR) */
! 640:
! 641:
! 642: /*
! 643: * Memory types
! 644: */
! 645:
! 646: #define MEMT_16BIT 1 /* 16 Bit Memory type */
! 647: #define MEMT_32BIT 2 /* 32 Bit Memory type */
! 648: #define MEMT_SHIO 3 /* Short I/O Memory type */
! 649: #define MEMTYPE MEMT_32BIT /* do 32-bit transfers */
! 650:
! 651: /*
! 652: * Transfer types
! 653: */
! 654:
! 655: #define TT_NORMAL 0 /* Normal Mode Transfers */
! 656: #define TT_BLOCK 1 /* block Mode Transfers */
! 657: #define TT_DISABLE_INC_ADDR 2 /* Disable Incrementing Addresses */
! 658: #define TT_D64 3 /* D64 Mode Transfers */
! 659:
! 660: /*
! 661: * Error codes.
! 662: */
! 663:
! 664: #define MACSI_GOOD_STATUS 0x00 /* Good status */
! 665: #define MACSI_QUEUE_FULL 0x01 /* The work queue is full */
! 666: #define MACSI_CMD_CODE_ERR 0x04 /* The IOPB command field is invalid */
! 667: #define MACSI_QUEUE_NUMBER_ERR 0x05 /* Invalid queue number */
! 668:
! 669: #define RESET_BUS_STATUS 0x11 /* SCSI bus reset IOPB forced this */
! 670: #define NO_SECONDARY_PORT 0x12 /* second SCSI bus not available */
! 671: #define SCSI_DEVICE_IS_RESET 0x14 /* device has been reset */
! 672: #define CMD_ABORT_BY_RESET 0x15 /* device has been reset */
! 673:
! 674: #define VME_BUS_ERROR 0x20 /* There was a VME BUS error */
! 675: #define VME_BUS_ACC_TIMEOUT 0x21
! 676: #define VME_BUS_BAD_ADDR 0x23
! 677: #define VME_BUS_BAD_MEM_TYPE 0x24
! 678: #define VME_BUS_BAD_COUNT 0x25
! 679: #define VME_BUS_FETCH_ERROR 0x26
! 680: #define VME_BUS_FETCH_TIMEOUT 0x27
! 681: #define VME_BUS_POST_ERROR 0x28
! 682: #define VME_BUS_POST_TIMEOUT 0x29
! 683: #define VME_BUS_BAD_FETCH_ADDR 0x2A
! 684: #define VME_BUS_BAD_POST_ADDR 0x2B
! 685: #define VME_BUS_SG_FETCH 0x2C
! 686: #define VME_BUS_SG_TIMEOUT 0x2D
! 687: #define VME_BUS_SG_COUNT 0x2E
! 688:
! 689: #define SCSI_SELECTION_TO 0x30 /* select time out */
! 690: #define SCSI_DISCONNECT_TIMEOUT 0x31 /* disconnect timeout */
! 691: #define SCSI_ABNORMAL_SEQ 0x32 /* abnormal sequence */
! 692: #define SCSI_DISCONNECT_ERR 0x33 /* disconnect error */
! 693: #define SCSI_XFER_EXCEPTION 0x34 /* transfer cnt exception */
! 694: #define SCSI_PARITY_ERROR 0x35 /* parity error */
! 695:
! 696: #define DEVICE_NO_IOPB 0x82 /* IOPB no available */
! 697: #define IOPB_CTLR_EHX 0x83 /* IOPB counter exhausted */
! 698: #define IOPB_DIR_ERROR 0x84 /* IOPB direction wrong */
! 699: #define COUGAR_ERROR 0x86 /* COUGAR unrecoverable error */
! 700: #define MACSI_INCORRECT_HARDWARE 0x90 /* Insufficient memory */
! 701: #define MACSI_ILGL_IOPB_VAL 0x92 /* Invalid field in the IOPB */
! 702: #define MACSI_ILLEGAL_IMAGE 0x9C /* Submitted fails reuested action */
! 703: #define IOPB_TYPE_ERR 0xC0 /* IOPB type not 0 */
! 704: #define IOPB_TIMEOUT 0xC1 /* IOPB timed out */
! 705:
! 706: #define COUGAR_PANIC 0xFF /* COUGAR paniced */
! 707:
! 708: #define MACSI_INVALID_TIMEOUT 0x843 /* The SCSI byte to byte timer expired */
! 709:
! 710: /*
! 711: * Handy vector macro.
! 712: */
! 713:
! 714: #define VEC(c, vec) (((c) -> mc_ipl << 8) + (vec))
! 715:
! 716: /*
! 717: * VME addressing modes
! 718: */
! 719:
! 720: #define ADRM_STD_S_P 0x3E /* Standard Supervisory Program */
! 721: #define ADRM_STD_S_D 0x3D /* Standard Supervisory Data */
! 722: #define ADRM_STD_N_P 0x3A /* Standard Normal Program */
! 723: #define ADRM_STD_N_D 0x39 /* Standard Normal Data */
! 724: #define ADRM_SHT_S_IO 0x2D /* Short Supervisory IO */
! 725: #define ADRM_SHT_N_IO 0x29 /* Short Normal IO */
! 726: #define ADRM_EXT_S_P 0x0E /* Extended Supervisory Program */
! 727: #define ADRM_EXT_S_D 0x0D /* Extended Supervisory Data */
! 728: #define ADRM_EXT_N_P 0x0A /* Extended Normal Program */
! 729: #define ADRM_EXT_N_D 0x09 /* Extended Normal Data */
! 730: #define ADRM_EXT_S_BM 0x0F /* Extended Supervisory Block Mode */
! 731: #define ADRM_EXT_S_D64 0x0C /* Extended Supervisory D64 Mode */
! 732:
! 733: #define ADDR_MOD ( (TT_NORMAL << 10) | (MEMTYPE << 8) | ADRM_EXT_S_D )
! 734: #define BLOCK_MOD ( (TT_BLOCK << 10) | (MEMTYPE << 8) | ADRM_EXT_S_BM )
! 735: #define D64_MOD ( (TT_D64 << 10) | (MEMTYPE << 8) | ADRM_EXT_S_D64 )
! 736: #define SHIO_MOD ( (TT_NORMAL << 10) | (MEMT_SHIO << 8) | ADRM_SHT_N_IO)
! 737:
! 738: /*
! 739: * Scatter/gather functions
! 740: */
! 741:
! 742: M328_SG vs_alloc_scatter_gather(void);
! 743: void vs_dealloc_scatter_gather(M328_SG sg);
! 744: M328_SG vs_build_memory_structure(struct scsi_xfer *xs, M328_IOPB *iopb);
! 745:
! 746: #endif /* _M328REG_H_ */
CVSweb