summaryrefslogblamecommitdiffstats
path: root/private/ntos/miniport/symbios/symc810/symsiop.h
blob: 15b67c09a2c393e0c01f0db625b78c86c675104d (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452



































































































































































































































































































































































































































































                                                                                              
/************************************************************************
*                                                                       *
*         Copyright 1994 Symbios Logic Inc.  All rights reserved.       *
*                                                                       *
*   This file is confidential and a trade secret of Symbios Logic Inc.  *
*   The receipt of or possession of this file does not convey any       *
*   rights to reproduce or disclose its contents or to manufacture,     *
*   use, or sell anything is may describe, in whole, or in part,        *
*   without the specific written consent of Symbios Logic Inc.          *
*                                                                       *
************************************************************************/

/*+++HDR
 *
 *  Version History
 *  ---------------
 *
 *    Date    Who?  Description
 *  --------  ----  -------------------------------------------------------
 *   1-16-96  SPD   Added define for new ISR disposition
 *
---*/


#ifndef _SYMSIOP_
#define _SYMSIOP_

//
// Define miniport constants.
//

#define MAX_SYNCH_TABLE_ENTRY   8      // # of entries in synch period array
#define ASYNCHRONOUS_MODE_PARAMS 0x00  // asychronous xfer mode
#define MAX_SG_ELEMENTS         18     // max # of page breaks + 1
#define MAX_ABORT_TRIES         100    // max times we will try to abort script
#define ABORT_STALL_TIME        3      // stall time between script abort tries
#define MAX_SYNCH_OFFSET        0x08   // max synchronous offset supported
#define MAX_875_SYNCH_OFFSET    0x10   // 875 larger sync offset
#define ENABLE_WIDE             0x08   // enable wide scsi
#define MAX_PHYS_BREAK_COUNT    18     // Max # of S/G elements
#define MESSAGE_BUFFER_SIZE     8      // maximum message size
#define RESET_STALL_TIME        30     // length of time bus reset line high
#define POST_RESET_STALL_TIME   1000   // drive recovery time after reset
#define CLEAR_FIFO_STALL_TIME   500    // Time to clear SCSI and DMA fifos
#define MAX_CLEAR_FIFO_LOOP     10     // Number of times in clear loop
#define SYM_MAX_TARGETS         16
#define SYM_NARROW_MAX_TARGETS  8

//#define ADAPTER_CRYSTAL_SPEED   40     // adapter crystal speed
//#define DCNTL_DIVIDE_FACTOR     2      // crystal divide factor set in DCNTL
                                         // register (see 53c8xx data manual)
#define MAX_XFER_LENGTH 0x00FFFFFF       // maximum transfer length per request
// speed at which SIOP is clocked...
//#define SIOP_CLOCK_SPEED  (ADAPTER_CRYSTAL_SPEED / DCNTL_DIVIDE_FACTOR)

//
// SCSI equates and flags not included in SCSI.H
// TODO:  Rework code to omit these
//

#define SCSIMESS_IDENTIFY_DISC_PRIV_MASK    0x40
#define SCSIMESS_IDENTIFY_LUN_MASK          0x07
#define DSPS_RESELOP                        0x80

#define CTEST3_CLEAR_FIFO               0x04
#define CTEST3_FLUSH_FIFO               0x08
#define CTEST5_USE_LARGE_FIFO           0x20
#define CTEST5_BURST                    0x04

#define DCMD_WAIT_DISCONNECT    0x48
#define SSTAT1_ORF              0x40
#define SSTAT1_OLF              0x20
#define SSTAT2_ORF              0x40
#define SSTAT2_OLF              0x20
#define SBCL_MSG                0x04
#define DFIFO_LOW_SEVEN         0x7F

//
// Retry limits.
//

#define MAX_SELECTION_RETRIES 1

//
// Symbios Logic 53C8xx script interrupt definitions.  These values are returned in the
// DSPS register when a script routine completes.
//

#define SCRIPT_INT_COMMAND_COMPLETE      0x00   // SCSI command complete
#define SCRIPT_INT_SAVE_DATA_PTRS        0x01   // save data ptrs
#define SCRIPT_INT_SAVE_WITH_DISCONNECT  0x02   // combination SDP & disconnect
#define SCRIPT_INT_DISCONNECT            0x03   // disconnect from SCSI bus
#define SCRIPT_INT_RESTORE_POINTERS      0x04   // restore data pointers
#define SCRIPT_INT_SCRIPT_ABORTED        0x05   // SCSI script aborted
#define SCRIPT_INT_TAG_RECEIVED          0x06   // Queue tag message recieved
#define SCRIPT_INT_DEV_RESET_OCCURRED    0x07   // indicates device was reset
                                                // due to wierd phase
#define SCRIPT_INT_DEV_RESET_FAILED      0x08   // indicates above effort
                                                // failed
#define SCRIPT_INT_IDE_MSG_SENT          0x0A   // initiator detected error
#define SCRIPT_INT_SYNC_NOT_SUPP         0x0B   // synchronous not supported
#define SCRIPT_INT_SYNC_NEGOT_COMP       0x0C   // synchronous neg complete
#define SCRIPT_INT_WIDE_NOT_SUPP         0x1B   // synchronous not supported
#define SCRIPT_INT_WIDE_NEGOT_COMP       0x1C   // synchronous neg complete
#define SCRIPT_INT_INVALID_RESELECT      0x0D   // reselecting device returned
                                                // invalid SCSI id.
#define SCRIPT_INT_REJECT_MSG_RECEIVED   0x0E   // message reject msg received
#define SCRIPT_INT_INVALID_TAG_MESSAGE   0x0F   // target did not send tag
#define SCRIPT_INT_ABORT_OCCURRED        0x10
#define SCRIPT_INT_ABORT_FAILED          0x11


//
// define 53C810 SCSI Script instruction size
//

#define SCRIPT_INS_SIZE         8               // size of a script instruction

//
// ISR disposition codes. these codes are returned by ISR subroutines to
// indicate what should be done next.
//

#define ISR_START_NEXT_REQUEST  0x00    // indicates bus is free for new req.
#define ISR_RESTART_SCRIPT      0x01    // indicates script restart necessary
#define ISR_EXIT                0x02    // indicates no action needed
#define ISR_CONT_NEG_SCRIPT     0x03    // indicates to continue with Synch
                                        // negotiations after wide
                                        // negotiations have completed

//
// Device Extension driver flags.
//

#define DFLAGS_WORK_REQUESTED   0x01    // indicates new work has been requested.
                                        // this flag was necessary because
                                        // NextRequest port notification is not
                                        // reentrant

#define DFLAGS_BUS_RESET        0x02    // indicates SCSI bus was reset internally

#define DFLAGS_SCRIPT_RUNNING   0x04    // indicates SCSI scripts processor running
                                        // this flag does NOT indicate bus busy.
                                        // (used in conjunction with WAIT
                                        // RESELECT script instruction which runs
                                        // when bus is not busy)

#define DFLAGS_CONNECTED        0x08    // indicate that a lun is currently
                                        // connected, but is not active.

#define DFLAGS_TAGGED_SELECT    0x10    // The last select was for a tagged command.

#define DFLAGS_DIFF_SCSI        0x40    // indicates that this SIOP should be
                                        // configured to support differential
                                        // SCSI devices

#define DFLAGS_IRQ_NOT_CONNECTED 0x80   // Indicates that the chip is 'disabled' but resources
                                        // were still assigned. (Omniplex problem)

//
// Logical Unit Extension flags.
//

#define LUFLAGS_SYNC_NEGOT_PEND    0x0001 // synch negot in prog.
#define LUFLAGS_SYNC_NEGOT_DONE    0x0002 // synch negot done
#define LUFLAGS_SYNC_NEGOT_FAILED  0x0004 // synch not supp.

//
//      Future wide...
//

#define LUFLAGS_WIDE_NEGOT_PEND    0x0010 // wide negot in prog.
#define LUFLAGS_WIDE_NEGOT_DONE    0x0020 // wide negot done
#define LUFLAGS_WIDE_NEGOT_FAILED  0x0040 // wide not supp.
#define LUFLAGS_WIDE_NEGOT_CHECK   0x0080 // need to check inquiry data

#define LUFLAGS_WIDE_NEGOT_MASK    0xFF0F // mask for wide flags

#define LUFLAGS_ASYNC_NEGOT_PEND   0x0100 // asynch negot in prog.
#define LUFLAGS_ASYNC_NEGOT_DONE   0x0200 // asynch negot done.
#define LUFLAGS_NARROW_NEGOT_PEND  0x0400 // narrow negot in prog.
#define LUFLAGS_NARROW_NEGOT_DONE  0x0800 // narrow negot done.


#define HBA_CAPABILITY_WIDE              0x01
#define HBA_CAPABILITY_DIFFERENTIAL      0x02
#define HBA_CAPABILITY_FAST20            0x04
#define HBA_CAPABILITY_REGISTRY_FAST20   0x08
#define HBA_CAPABILITY_SYNC_16           0x10
#define HBA_CAPABILITY_810_FAMILY        0x20
#define HBA_CAPABILITY_825_FAMILY        0x40
#define HBA_CAPABILITY_875_LARGE_FIFO    0x80
#define HBA_CAPABILITY_SCRIPT_RAM        0x100
#define HBA_CAPABILITY_875_FAMILY        0x200

//
// Inquiry data representing the capabilities of the SCSI peripheral.
//

#define INQUIRY_DATA_SYNC_SUPPORTED 0x10
#define INQUIRY_DATA_WIDE_SUPPORTED 0x20
#define INQUIRY_DATA_TAGS_SUPPORTED 0x02

//
// SCSI Protocol Chip Definitions. 
//

//
// Define the SCSI Control Register 0 bit equates 
//

#define SCNTL0_ARB_MODE_1       0x80
#define SCNTL0_ARB_MODE_0       0x40
#define SCNTL0_ENA_PARITY_CHK   0x08

#define SCNTL0_ASSERT_ATN_PAR   0x02
#define SCNTL0_TAR              0x01

//
// Define the SCSI Control Register 1 bit equates 
//

#define SCNTL1_EXT_CLK_CYC      0x80
#define SCNTL1_SODLTOSCSI       0x40

#define SCNTL1_CONNECTED        0x10
#define SCNTL1_RESET_SCSI_BUS   0x08

//
// Define the SCSI Control Register 2 bit equates
//

#define SCNTL2_WSS              0x08
#define SCNTL2_WSR              0x01

//
// Define the SCSI Interrupt Enable register bit equates
//

#define SIEN0_PHASE_MISMATCH     0x80
#define SIEN0_FUNCTION_COMP      0x40

#define SIEN0_RESELECT           0x10
#define SIEN0_SCSI_GROSS_ERROR   0x08
#define SIEN0_UNEXPECTED_DISCON  0x04
#define SIEN0_RST_RECEIVED       0x02
#define SIEN0_PARITY_ERROR       0x01

//
// Define the DMA Status Register bit equates
//

#define DSTAT_ILLEGAL_INSTRUCTION   0x01
#define DSTAT_ABORTED               0x10
#define DSTAT_SCRPTINT              0x04

//
// Define the SCSI Status Register 0 bit equates
//

#define SSTAT0_PHASE_MISMATCH           0x80
#define SSTAT0_RESELECTED               0x10
#define SSTAT0_GROSS_ERROR              0x08
#define SSTAT0_UNEXPECTED_DISCONNECT    0x04
#define SSTAT0_RESET                    0x02
#define SSTAT0_PARITY_ERROR             0x01

//
// Define the Interrupt Status Register bit equates
//

#define ISTAT_ABORT             0x80
#define ISTAT_RESET             0x40
#define ISTAT_SIGP              0x20
#define ISTAT_SEM               0x10
#define ISTAT_CON               0x08
#define ISTAT_INTF              0x04
#define ISTAT_SCSI_INT          0x02
#define ISTAT_DMA_INT           0x01

//
// Define the DMA Mode Register bit equates
//

#define DMODE_BURST_1           0x80
#define DMODE_BURST_0           0x40

//
// Define the DMA Interrupt Enable Register bit equates
//
#define DIEN_BUS_FAULT          0x20
#define DIEN_ENA_ABRT_INT       0x10
#define DIEN_ENA_SNGL_STP_INT   0x08
#define DIEN_ENABLE_INT_RCVD    0x04
#define DIEN_ENABLE_ILL_INST    0x01

//
// Define the SIST1 equates.  SCSI Interrupt Status 1.
//

#define SIST1_SEL_RESEL_TIMEOUT 0x04

//
// Define STEST1 equates
//

#define STEST1_DOUBLER_SELECT           0x04
#define STEST1_DOUBLER_ENABLE           0x08

//
// Define STEST2 equates
//

#define STEST2_DIFF_MODE                0x20

//
// Define STEST3 equates
//

#define STEST3_HALT_CLOCK               0x20

//
// Define GPCNTL equates
//

#define GPCNTL_GPIO3                    0x08


//
// Define specific script instruction structures
//

//
// Define the scatter/gather move script instruction
//

typedef struct _SCRIPTSG {
    ULONG SGByteCount;
    ULONG SGBufferPtr;
} SCRIPTSG, *PSCRIPTSG;

//
// Define the structure for the CDB move script instruction
//

typedef struct _SCRIPTCDB {
    UCHAR CDBLength;
    UCHAR Reserved1;
    UCHAR Reserved2;
    UCHAR CDBMoveOpcode;
    ULONG CDBBufferPtr;
} SCRIPTCDB, *PSCRIPTCDB;

//
// Define the structure for the SELECT script instruction
//

typedef struct _SCRIPTSELECT {
    UCHAR Reserved1;
    UCHAR Reserved2;
    UCHAR SelectID;
    UCHAR SelectOpcode;
    ULONG AltAddress;
} SCRIPTSELECT, *PSCRIPTSELECT;

//
// Define the structure for the JUMP script instruction
//

typedef struct _SCRIPTJUMP {
    ULONG JumpOpcode;
    ULONG JumpAddress;
} SCRIPTJUMP, *PSCRIPTJUMP;

//
// Build a composite script instruction structure
//

typedef union _SCRIPTINS {
    SCRIPTCDB    ScriptCDB;
    SCRIPTSELECT ScriptSelect;
    SCRIPTJUMP   ScriptJump;
    SCRIPTSG     ScriptSG;
} SCRIPTINS, *PSCRIPTINS;

//
// SDTR extended message structure used by scsi scripts
//

typedef struct SYNCH_MESSAGE_STRUCT {
    UCHAR ExtMsg;
    UCHAR ExtMsgCount;
    UCHAR SynchMsgOpcode;
    UCHAR OurSynchPeriod;
    UCHAR OurSynchOffset;
} SYNCHMESSAGESTRUCT, *PSYNCHMESSAGESTRUCT;

//
// Symbios SIOP I/O macros.
//

#ifdef PORT_IO   // either driver can use Port IO
#define READ_SIOP_UCHAR(RegisterOffset)            \
    (ScsiPortReadPortUchar( &(DeviceExtension->    \
             SIOPRegisterBase)->RegisterOffset))   \


#define WRITE_SIOP_UCHAR(RegisterOffset, BitMask)  \
{                                                  \
    ScsiPortWritePortUchar( &(DeviceExtension->    \
            SIOPRegisterBase)->RegisterOffset,     \
            BitMask);                              \
}

#define READ_SIOP_ULONG(RegisterOffset)            \
    (ScsiPortReadPortUlong( &(DeviceExtension->    \
             SIOPRegisterBase)->RegisterOffset))   \


#define WRITE_SIOP_ULONG(RegisterOffset, BitMask)  \
{                                                  \
    ScsiPortWritePortUlong( &(DeviceExtension->    \
            SIOPRegisterBase)->RegisterOffset,     \
            BitMask);                              \
}
#else // NT will use Memory Mapped IO
#define READ_SIOP_UCHAR(RegisterOffset)               \
    (ScsiPortReadRegisterUchar( &(DeviceExtension->   \
             SIOPRegisterBase)->RegisterOffset))      \


#define WRITE_SIOP_UCHAR(RegisterOffset, BitMask)     \
{                                                     \
    ScsiPortWriteRegisterUchar( &(DeviceExtension->   \
            SIOPRegisterBase)->RegisterOffset,        \
            BitMask);                                 \
}

#define READ_SIOP_ULONG(RegisterOffset)               \
    (ScsiPortReadRegisterUlong( &(DeviceExtension->   \
             SIOPRegisterBase)->RegisterOffset))      \


#define WRITE_SIOP_ULONG(RegisterOffset, BitMask)     \
{                                                     \
    ScsiPortWriteRegisterUlong( &(DeviceExtension->   \
            SIOPRegisterBase)->RegisterOffset,        \
            BitMask);                                 \
}
#endif

#endif