Annotation of sys/arch/mvme68k/dev/vsreg.h, Revision 1.1.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