OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [before_ORP/] [uclinux/] [uClinux-2.0.x/] [drivers/] [block/] [DAC960.h] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 199 simons
/*
2
 
3
  Linux Driver for Mylex DAC960 PCI RAID Controllers
4
 
5
  Copyright 1998 by Leonard N. Zubkoff <lnz@dandelion.com>
6
 
7
  This program is free software; you may redistribute and/or modify it under
8
  the terms of the GNU General Public License Version 2 as published by the
9
  Free Software Foundation.
10
 
11
  This program is distributed in the hope that it will be useful, but
12
  WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
13
  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14
  for complete details.
15
 
16
  The author respectfully requests that any modifications to this software be
17
  sent directly to him for evaluation and testing.
18
 
19
*/
20
 
21
 
22
/*
23
  DAC960_DriverVersion protects the private portion of this file.
24
*/
25
 
26
#ifdef DAC960_DriverVersion
27
 
28
 
29
/*
30
  Define the maximum number of DAC960 Controllers supported by this driver.
31
*/
32
 
33
#define DAC960_MaxControllers                   8
34
 
35
 
36
/*
37
  Define the maximum number of Controller Channels supported by this driver.
38
*/
39
 
40
#define DAC960_MaxChannels                      3
41
 
42
 
43
/*
44
  Define the maximum number of Targets per Channel supported by this driver.
45
*/
46
 
47
#define DAC960_MaxTargets                       16
48
 
49
 
50
/*
51
  Define the maximum number of Logical Drives supported by any DAC960 model.
52
*/
53
 
54
#define DAC960_MaxLogicalDrives                 32
55
 
56
 
57
/*
58
  Define the maximum number of Partitions allowed for each Logical Drive.
59
*/
60
 
61
#define DAC960_MaxPartitions                    8
62
#define DAC960_MaxPartitionsBits                3
63
 
64
 
65
/*
66
  Define the maximum Driver Queue Depth and Controller Queue Depth supported
67
  by any DAC960 model.
68
*/
69
 
70
#define DAC960_MaxDriverQueueDepth              127
71
#define DAC960_MaxControllerQueueDepth          128
72
 
73
 
74
/*
75
  Define the maximum number of Scatter/Gather Segments supported by any
76
  DAC960 model.
77
*/
78
 
79
#define DAC960_MaxScatterGatherSegments         33
80
 
81
 
82
/*
83
  Define the DAC960 Controller Monitoring Timer Interval.
84
*/
85
 
86
#define DAC960_MonitoringTimerInterval          (7 * HZ)
87
 
88
 
89
/*
90
  Define the DAC960 Controller Secondary Monitoring Interval.
91
*/
92
 
93
#define DAC960_SecondaryMonitoringInterval      (60 * HZ)
94
 
95
 
96
/*
97
  Define the DAC960 Controller Rebuild Status Reporting Interval.
98
*/
99
 
100
#define DAC960_RebuildStatusReportingInterval   (60 * HZ)
101
 
102
 
103
/*
104
  Define the number of Command Mailboxes and Status Mailboxes used by the
105
  V4 Memory Mailbox Interface.
106
*/
107
 
108
#define DAC960_CommandMailboxCount              256
109
#define DAC960_StatusMailboxCount               1024
110
 
111
 
112
/*
113
  Define macros to extract the Controller Number, Logical Drive Number, and
114
  Partition Number from a Kernel Device, and to construct a Major Number, Minor
115
  Number, and Kernel Device from the Controller Number, Logical Drive Number,
116
  and Partition Number.  There is one Major Number assigned to each Controller.
117
  The associated Minor Number is divided into the Logical Drive Number and
118
  Partition Number.
119
*/
120
 
121
#define DAC960_ControllerNumber(Device) \
122
  (MAJOR(Device) - DAC960_MAJOR)
123
 
124
#define DAC960_LogicalDriveNumber(Device) \
125
  (MINOR(Device) >> DAC960_MaxPartitionsBits)
126
 
127
#define DAC960_PartitionNumber(Device) \
128
  (MINOR(Device) & (DAC960_MaxPartitions - 1))
129
 
130
#define DAC960_MajorNumber(ControllerNumber) \
131
  (DAC960_MAJOR + (ControllerNumber))
132
 
133
#define DAC960_MinorNumber(LogicalDriveNumber, PartitionNumber) \
134
   (((LogicalDriveNumber) << DAC960_MaxPartitionsBits) | (PartitionNumber))
135
 
136
#define DAC960_MinorCount                       (DAC960_MaxLogicalDrives \
137
                                                 * DAC960_MaxPartitions)
138
 
139
#define DAC960_KernelDevice(ControllerNumber,                                  \
140
                            LogicalDriveNumber,                                \
141
                            PartitionNumber)                                   \
142
   MKDEV(DAC960_MajorNumber(ControllerNumber),                                 \
143
         DAC960_MinorNumber(LogicalDriveNumber, PartitionNumber))
144
 
145
 
146
/*
147
  Define the DAC960 Controller fixed Block Size and Block Size Bits.
148
*/
149
 
150
#define DAC960_BlockSize                        512
151
#define DAC960_BlockSizeBits                    9
152
 
153
 
154
/*
155
  Define the Controller Line and Message Buffer Sizes.
156
*/
157
 
158
#define DAC960_LineBufferSize                   100
159
#define DAC960_MessageBufferSize                2048
160
 
161
 
162
/*
163
  Define the Driver Message Levels.
164
*/
165
 
166
typedef enum DAC960_MessageLevel
167
{
168
  DAC960_AnnounceLevel =                        0,
169
  DAC960_InfoLevel =                            1,
170
  DAC960_NoticeLevel =                          2,
171
  DAC960_WarningLevel =                         3,
172
  DAC960_ErrorLevel =                           4,
173
  DAC960_CriticalLevel =                        5
174
}
175
DAC960_MessageLevel_T;
176
 
177
static char
178
  *DAC960_MessageLevelMap[] =
179
    { KERN_NOTICE, KERN_NOTICE, KERN_NOTICE,
180
      KERN_WARNING, KERN_ERR, KERN_CRIT };
181
 
182
 
183
/*
184
  Define Driver Message macros.
185
*/
186
 
187
#define DAC960_Announce(Format, Arguments...) \
188
  DAC960_Message(DAC960_AnnounceLevel, Format, ##Arguments)
189
 
190
#define DAC960_Info(Format, Arguments...) \
191
  DAC960_Message(DAC960_InfoLevel, Format, ##Arguments)
192
 
193
#define DAC960_Notice(Format, Arguments...) \
194
  DAC960_Message(DAC960_NoticeLevel, Format, ##Arguments)
195
 
196
#define DAC960_Warning(Format, Arguments...) \
197
  DAC960_Message(DAC960_WarningLevel, Format, ##Arguments)
198
 
199
#define DAC960_Error(Format, Arguments...) \
200
  DAC960_Message(DAC960_ErrorLevel, Format, ##Arguments)
201
 
202
#define DAC960_Critical(Format, Arguments...) \
203
  DAC960_Message(DAC960_CriticalLevel, Format, ##Arguments)
204
 
205
 
206
/*
207
  Define the types of DAC960 Controllers that are supported.
208
*/
209
 
210
typedef enum
211
{
212
  DAC960_V4_Controller =                        1,      /* DAC960PTL/PJ/PG */
213
  DAC960_V3_Controller =                        2       /* DAC960PU/PD/PL */
214
}
215
DAC960_ControllerType_T;
216
 
217
 
218
/*
219
  Define a Boolean data type.
220
*/
221
 
222
typedef enum { false, true } __attribute__ ((packed)) boolean;
223
 
224
 
225
/*
226
  Define a 32 bit I/O Address data type.
227
*/
228
 
229
typedef unsigned int DAC960_IO_Address_T;
230
 
231
 
232
/*
233
  Define a 32 bit PCI Bus Address data type.
234
*/
235
 
236
typedef unsigned int DAC960_PCI_Address_T;
237
 
238
 
239
/*
240
  Define a 32 bit Bus Address data type.
241
*/
242
 
243
typedef unsigned int DAC960_BusAddress_T;
244
 
245
 
246
/*
247
  Define a 32 bit Byte Count data type.
248
*/
249
 
250
typedef unsigned int DAC960_ByteCount_T;
251
 
252
 
253
/*
254
  Define types for some of the structures that interface with the rest
255
  of the Linux Kernel and I/O Subsystem.
256
*/
257
 
258
typedef struct buffer_head BufferHeader_T;
259
typedef struct file File_T;
260
typedef struct file_operations FileOperations_T;
261
typedef struct gendisk GenericDiskInfo_T;
262
typedef struct hd_geometry DiskGeometry_T;
263
typedef struct hd_struct DiskPartition_T;
264
typedef struct inode Inode_T;
265
typedef kdev_t KernelDevice_T;
266
typedef unsigned long ProcessorFlags_T;
267
typedef struct pt_regs Registers_T;
268
typedef struct request IO_Request_T;
269
typedef struct semaphore Semaphore_T;
270
typedef struct timer_list Timer_T;
271
 
272
 
273
/*
274
  Define the DAC960 V4 Controller Interface Register Offsets.
275
*/
276
 
277
#define DAC960_V4_RegisterWindowSize            0x2000
278
 
279
typedef enum
280
{
281
  DAC960_V4_InboundDoorBellRegisterOffset =     0x0020,
282
  DAC960_V4_OutboundDoorBellRegisterOffset =    0x002C,
283
  DAC960_V4_InterruptMaskRegisterOffset =       0x0034,
284
  DAC960_V4_CommandOpcodeRegisterOffset =       0x1000,
285
  DAC960_V4_CommandIdentifierRegisterOffset =   0x1001,
286
  DAC960_V4_MailboxRegister2Offset =            0x1002,
287
  DAC960_V4_MailboxRegister3Offset =            0x1003,
288
  DAC960_V4_MailboxRegister4Offset =            0x1004,
289
  DAC960_V4_MailboxRegister5Offset =            0x1005,
290
  DAC960_V4_MailboxRegister6Offset =            0x1006,
291
  DAC960_V4_MailboxRegister7Offset =            0x1007,
292
  DAC960_V4_MailboxRegister8Offset =            0x1008,
293
  DAC960_V4_MailboxRegister9Offset =            0x1009,
294
  DAC960_V4_MailboxRegister10Offset =           0x100A,
295
  DAC960_V4_MailboxRegister11Offset =           0x100B,
296
  DAC960_V4_MailboxRegister12Offset =           0x100C,
297
  DAC960_V4_StatusCommandIdentifierRegOffset =  0x1018,
298
  DAC960_V4_StatusRegisterOffset =              0x101A
299
}
300
DAC960_V4_RegisterOffsets_T;
301
 
302
 
303
/*
304
  Define the structure of the DAC960 V4 Inbound Door Bell Register.
305
*/
306
 
307
typedef union DAC960_V4_InboundDoorBellRegister
308
{
309
  unsigned int All;
310
  struct {
311
    boolean NewCommand:1;                               /* Bit 0 */
312
    boolean AcknowledgeStatus:1;                        /* Bit 1 */
313
    boolean SoftReset:1;                                /* Bit 2 */
314
    unsigned int :29;                                   /* Bits 3-31 */
315
  } Write;
316
  struct {
317
    boolean MailboxFull:1;                              /* Bit 0 */
318
    unsigned int :31;                                   /* Bits 1-31 */
319
  } Read;
320
}
321
DAC960_V4_InboundDoorBellRegister_T;
322
 
323
 
324
/*
325
  Define the structure of the DAC960 V4 Outbound Door Bell Register.
326
*/
327
 
328
typedef union DAC960_V4_OutboundDoorBellRegister
329
{
330
  unsigned int All;
331
  struct {
332
    boolean AcknowledgeInterrupt:1;                     /* Bit 0 */
333
    unsigned int :31;                                   /* Bits 1-31 */
334
  } Write;
335
  struct {
336
    boolean StatusAvailable:1;                          /* Bit 0 */
337
    unsigned int :31;                                   /* Bits 1-31 */
338
  } Read;
339
}
340
DAC960_V4_OutboundDoorBellRegister_T;
341
 
342
 
343
/*
344
  Define the structure of the DAC960 V4 Interrupt Mask Register.
345
*/
346
 
347
typedef union DAC960_V4_InterruptMaskRegister
348
{
349
  unsigned int All;
350
  struct {
351
    unsigned int MessageUnitInterruptMask1:2;           /* Bits 0-1 */
352
    boolean DisableInterrupts:1;                        /* Bit 2 */
353
    unsigned int MessageUnitInterruptMask2:5;           /* Bits 3-7 */
354
    unsigned int Reserved0:24;                          /* Bits 8-31 */
355
  } Bits;
356
}
357
DAC960_V4_InterruptMaskRegister_T;
358
 
359
 
360
/*
361
  Define the DAC960 V3 Controller Interface Register Offsets.
362
*/
363
 
364
#define DAC960_V3_RegisterWindowSize            0x80
365
 
366
typedef enum
367
{
368
  DAC960_V3_CommandOpcodeRegisterOffset =       0x00,
369
  DAC960_V3_CommandIdentifierRegisterOffset =   0x01,
370
  DAC960_V3_MailboxRegister2Offset =            0x02,
371
  DAC960_V3_MailboxRegister3Offset =            0x03,
372
  DAC960_V3_MailboxRegister4Offset =            0x04,
373
  DAC960_V3_MailboxRegister5Offset =            0x05,
374
  DAC960_V3_MailboxRegister6Offset =            0x06,
375
  DAC960_V3_MailboxRegister7Offset =            0x07,
376
  DAC960_V3_MailboxRegister8Offset =            0x08,
377
  DAC960_V3_MailboxRegister9Offset =            0x09,
378
  DAC960_V3_MailboxRegister10Offset =           0x0A,
379
  DAC960_V3_MailboxRegister11Offset =           0x0B,
380
  DAC960_V3_MailboxRegister12Offset =           0x0C,
381
  DAC960_V3_StatusCommandIdentifierRegOffset =  0x0D,
382
  DAC960_V3_StatusRegisterOffset =              0x0E,
383
  DAC960_V3_InboundDoorBellRegisterOffset =     0x40,
384
  DAC960_V3_OutboundDoorBellRegisterOffset =    0x41,
385
  DAC960_V3_InterruptEnableRegisterOffset =     0x43
386
}
387
DAC960_V3_RegisterOffsets_T;
388
 
389
 
390
/*
391
  Define the structure of the DAC960 V3 Inbound Door Bell Register.
392
*/
393
 
394
typedef union DAC960_V3_InboundDoorBellRegister
395
{
396
  unsigned char All;
397
  struct {
398
    boolean NewCommand:1;                               /* Bit 0 */
399
    boolean AcknowledgeStatus:1;                        /* Bit 1 */
400
    unsigned char :1;                                   /* Bit 2 */
401
    boolean SoftReset:1;                                /* Bit 3 */
402
    unsigned char :4;                                   /* Bits 4-7 */
403
  } Write;
404
  struct {
405
    boolean MailboxFull:1;                              /* Bit 0 */
406
    unsigned char :7;                                   /* Bits 1-7 */
407
  } Read;
408
}
409
DAC960_V3_InboundDoorBellRegister_T;
410
 
411
 
412
/*
413
  Define the structure of the DAC960 V3 Outbound Door Bell Register.
414
*/
415
 
416
typedef union DAC960_V3_OutboundDoorBellRegister
417
{
418
  unsigned char All;
419
  struct {
420
    boolean AcknowledgeInterrupt:1;                     /* Bit 0 */
421
    unsigned char :7;                                   /* Bits 1-7 */
422
  } Write;
423
  struct {
424
    boolean StatusAvailable:1;                          /* Bit 0 */
425
    unsigned char :7;                                   /* Bits 1-7 */
426
  } Read;
427
}
428
DAC960_V3_OutboundDoorBellRegister_T;
429
 
430
 
431
/*
432
  Define the structure of the DAC960 V3 Interrupt Enable Register.
433
*/
434
 
435
typedef union DAC960_V3_InterruptEnableRegister
436
{
437
  unsigned char All;
438
  struct {
439
    boolean EnableInterrupts:1;                         /* Bit 0 */
440
    unsigned char :7;                                   /* Bits 1-7 */
441
  } Bits;
442
}
443
DAC960_V3_InterruptEnableRegister_T;
444
 
445
 
446
/*
447
  Define the DAC960 Command Identifier type.
448
*/
449
 
450
typedef unsigned char DAC960_CommandIdentifier_T;
451
 
452
 
453
/*
454
  Define the DAC960 Command Opcodes.
455
*/
456
 
457
typedef enum
458
{
459
  /* I/O Commands */
460
  DAC960_ReadExtended =                         0x33,
461
  DAC960_WriteExtended =                        0x34,
462
  DAC960_ReadAheadExtended =                    0x35,
463
  DAC960_ReadExtendedWithScatterGather =        0xB3,
464
  DAC960_WriteExtendedWithScatterGather =       0xB4,
465
  DAC960_Read =                                 0x36,
466
  DAC960_ReadWithOldScatterGather =             0xB6,
467
  DAC960_Write =                                0x37,
468
  DAC960_WriteWithOldScatterGather =            0xB7,
469
  DAC960_DCDB =                                 0x04,
470
  DAC960_DCDBWithScatterGather =                0x84,
471
  DAC960_Flush =                                0x0A,
472
  /* Controller Status Related Commands */
473
  DAC960_Enquiry =                              0x53,
474
  DAC960_Enquiry2 =                             0x1C,
475
  DAC960_GetLogicalDriveElement =               0x55,
476
  DAC960_GetLogicalDriveInformation =           0x19,
477
  DAC960_IOPortRead =                           0x39,
478
  DAC960_IOPortWrite =                          0x3A,
479
  DAC960_GetSDStats =                           0x3E,
480
  DAC960_GetPDStats =                           0x3F,
481
  DAC960_PerformEventLogOperation =             0x72,
482
  /* Device Related Commands */
483
  DAC960_StartDevice =                          0x10,
484
  DAC960_GetDeviceState =                       0x50,
485
  DAC960_StopChannel =                          0x13,
486
  DAC960_StartChannel =                         0x12,
487
  DAC960_ResetChannel =                         0x1A,
488
  /* Commands Associated with Data Consistency and Errors */
489
  DAC960_Rebuild =                              0x09,
490
  DAC960_RebuildAsync =                         0x16,
491
  DAC960_CheckConsistency =                     0x0F,
492
  DAC960_CheckConsistencyAsync =                0x1E,
493
  DAC960_RebuildStat =                          0x0C,
494
  DAC960_GetRebuildProgress =                   0x27,
495
  DAC960_RebuildControl =                       0x1F,
496
  DAC960_ReadBadBlockTable =                    0x0B,
497
  DAC960_ReadBadDataTable =                     0x25,
498
  DAC960_ClearBadDataTable =                    0x26,
499
  DAC960_GetErrorTable =                        0x17,
500
  DAC960_AddCapacityAsync =                     0x2A,
501
  /* Configuration Related Commands */
502
  DAC960_ReadConfig2 =                          0x3D,
503
  DAC960_WriteConfig2 =                         0x3C,
504
  DAC960_ReadConfigurationOnDisk =              0x4A,
505
  DAC960_WriteConfigurationOnDisk =             0x4B,
506
  DAC960_ReadConfiguration =                    0x4E,
507
  DAC960_ReadBackupConfiguration =              0x4D,
508
  DAC960_WriteConfiguration =                   0x4F,
509
  DAC960_AddConfiguration =                     0x4C,
510
  DAC960_ReadConfigurationLabel =               0x48,
511
  DAC960_WriteConfigurationLabel =              0x49,
512
  /* Firmware Upgrade Related Commands */
513
  DAC960_LoadImage =                            0x20,
514
  DAC960_StoreImage =                           0x21,
515
  DAC960_ProgramImage =                         0x22,
516
  /* Diagnostic Commands */
517
  DAC960_SetDiagnosticMode =                    0x31,
518
  DAC960_RunDiagnostic =                        0x32,
519
  /* Subsystem Service Commands */
520
  DAC960_GetSubsystemData =                     0x70,
521
  DAC960_SetSubsystemParameters =               0x71
522
}
523
__attribute__ ((packed))
524
DAC960_CommandOpcode_T;
525
 
526
 
527
/*
528
  Define the DAC960 Command Status Codes.
529
*/
530
 
531
#define DAC960_NormalCompletion                 0x0000  /* Common */
532
#define DAC960_CheckConditionReceived           0x0002  /* Common */
533
#define DAC960_NoDeviceAtAddress                0x0102  /* Common */
534
#define DAC960_InvalidDeviceAddress             0x0105  /* Common */
535
#define DAC960_InvalidParameter                 0x0105  /* Common */
536
#define DAC960_IrrecoverableDataError           0x0001  /* I/O */
537
#define DAC960_LogicalDriveNonexistentOrOffline 0x0002  /* I/O */
538
#define DAC960_AccessBeyondEndOfLogicalDrive    0x0105  /* I/O */
539
#define DAC960_BadDataEncountered               0x010C  /* I/O */
540
#define DAC960_DeviceBusy                       0x0008  /* DCDB */
541
#define DAC960_DeviceNonresponsive              0x000E  /* DCDB */
542
#define DAC960_CommandTerminatedAbnormally      0x000F  /* DCDB */
543
#define DAC960_UnableToStartDevice              0x0002  /* Device */
544
#define DAC960_InvalidChannelOrTarget           0x0105  /* Device */
545
#define DAC960_ChannelBusy                      0x0106  /* Device */
546
#define DAC960_ChannelNotStopped                0x0002  /* Device */
547
#define DAC960_AttemptToRebuildOnlineDrive      0x0002  /* Consistency */
548
#define DAC960_RebuildBadBlocksEncountered      0x0003  /* Consistency */
549
#define DAC960_NewDiskFailedDuringRebuild       0x0004  /* Consistency */
550
#define DAC960_RebuildOrCheckAlreadyInProgress  0x0106  /* Consistency */
551
#define DAC960_DependentDiskIsDead              0x0002  /* Consistency */
552
#define DAC960_InconsistentBlocksFound          0x0003  /* Consistency */
553
#define DAC960_InvalidOrNonredundantLogicalDrive 0x0105 /* Consistency */
554
#define DAC960_NoRebuildOrCheckInProgress       0x0105  /* Consistency */
555
#define DAC960_RebuildInProgress_DataValid      0x0000  /* Consistency */
556
#define DAC960_RebuildFailed_LogicalDriveFailure 0x0002 /* Consistency */
557
#define DAC960_RebuildFailed_BadBlocksOnOther   0x0003  /* Consistency */
558
#define DAC960_RebuildFailed_NewDriveFailed     0x0004  /* Consistency */
559
#define DAC960_RebuildSuccessful                0x0100  /* Consistency */
560
#define DAC960_AddCapacityInProgress            0x0004  /* Consistency */
561
#define DAC960_AddCapacityFailedOrSuspended     0x00F4  /* Consistency */
562
#define DAC960_Config2ChecksumError             0x0002  /* Configuration */
563
#define DAC960_ConfigurationSuspended           0x0106  /* Configuration */
564
#define DAC960_FailedToConfigureNVRAM           0x0105  /* Configuration */
565
#define DAC960_ConfigurationNotSavedStateChange 0x0106  /* Configuration */
566
#define DAC960_SubsystemNotInstalled            0x0001  /* Subsystem */
567
#define DAC960_SubsystemFailed                  0x0002  /* Subsystem */
568
#define DAC960_SubsystemBusy                    0x0106  /* Subsystem */
569
 
570
typedef unsigned short DAC960_CommandStatus_T;
571
 
572
 
573
/*
574
  Define the Enquiry reply structure.
575
*/
576
 
577
typedef struct DAC960_Enquiry
578
{
579
  unsigned char NumberOfLogicalDrives;                  /* Byte 0 */
580
  unsigned int :24;                                     /* Bytes 1-3 */
581
  unsigned int LogicalDriveSizes[32];                   /* Bytes 4-131 */
582
  unsigned short FlashAge;                              /* Bytes 132-133 */
583
  struct {
584
    boolean DeferredWriteError:1;                       /* Byte 134 Bit 0 */
585
    boolean BatteryLow:1;                               /* Byte 134 Bit 1 */
586
    unsigned char :6;                                   /* Byte 134 Bits 2-7 */
587
  } StatusFlags;
588
  unsigned char :8;                                     /* Byte 135 */
589
  unsigned char MinorFirmwareVersion;                   /* Byte 136 */
590
  unsigned char MajorFirmwareVersion;                   /* Byte 137 */
591
  enum {
592
    DAC960_NoStandbyRebuildOrCheckInProgress =                  0x00,
593
    DAC960_StandbyRebuildInProgress =                           0x01,
594
    DAC960_BackgroundRebuildInProgress =                        0x02,
595
    DAC960_BackgroundCheckInProgress =                          0x03,
596
    DAC960_StandbyRebuildCOmpletedWithError =                   0xFF,
597
    DAC960_BackgroundRebuildOrCheckFailed_DriveFailed =         0xF0,
598
    DAC960_BackgroundRebuildOrCheckFailed_LogicalDriveFailed =  0xF1,
599
    DAC960_BackgroundRebuildOrCheckFailed_OtherCauses =         0xF2,
600
    DAC960_BackgroundRebuildOrCheckSuccessfullyTerminated =     0xF3
601
  } __attribute__ ((packed)) RebuildFlag;               /* Byte 138 */
602
  unsigned char MaxCommands;                            /* Byte 139 */
603
  unsigned char OfflineLogicalDriveCount;               /* Byte 140 */
604
  unsigned char :8;                                     /* Byte 141 */
605
  unsigned short EventLogSequenceNumber;                /* Bytes 142-143 */
606
  unsigned char CriticalLogicalDriveCount;              /* Byte 144 */
607
  unsigned int :24;                                     /* Bytes 145-147 */
608
  unsigned char DeadDriveCount;                         /* Byte 148 */
609
  unsigned char :8;                                     /* Byte 149 */
610
  unsigned char RebuildCount;                           /* Byte 150 */
611
  struct {
612
    unsigned char :3;                                   /* Byte 151 Bits 0-2 */
613
    boolean BatteryBackupUnitPresent:1;                 /* Byte 151 Bit 3 */
614
    unsigned char :3;                                   /* Byte 151 Bits 4-6 */
615
    unsigned char :1;                                   /* Byte 151 Bit 7 */
616
  } MiscFlags;
617
  struct {
618
    unsigned char TargetID;
619
    unsigned char Channel;
620
  } DeadDrives[21];                                     /* Bytes 152-194 */
621
  unsigned char Reserved[62];                           /* Bytes 195-255 */
622
}
623
__attribute__ ((packed))
624
DAC960_Enquiry_T;
625
 
626
 
627
/*
628
  Define the Enquiry2 reply structure.
629
*/
630
 
631
typedef struct DAC960_Enquiry2
632
{
633
  struct {
634
    enum {
635
      DAC960_P_PD_PU =                          0x01,
636
      DAC960_PL =                               0x02,
637
      DAC960_PG =                               0x10,
638
      DAC960_PJ =                               0x11,
639
      DAC960_PTL_0 =                            0x14,
640
      DAC960_PTL_1 =                            0x16
641
    } __attribute__ ((packed)) SubModel;                /* Byte 0 */
642
    unsigned char ActualChannels;                       /* Byte 1 */
643
    enum {
644
      DAC960_FiveChannelBoard =                 0x01,
645
      DAC960_ThreeChannelBoard =                0x02,
646
      DAC960_TwoChannelBoard =                  0x03,
647
      DAC960_ThreeChannelASIC_DAC =             0x04
648
    } __attribute__ ((packed)) Model;                   /* Byte 2 */
649
    enum {
650
      DAC960_EISA_Controller =                  0x01,
651
      DAC960_MicroChannel_Controller =          0x02,
652
      DAC960_PCI_Controller =                   0x03,
653
      DAC960_SCSItoSCSI_Controller =            0x08
654
    } __attribute__ ((packed)) ProductFamily;           /* Byte 3 */
655
  } HardwareID;                                         /* Bytes 0-3 */
656
  /* MajorVersion.MinorVersion-FirmwareType-TurnID */
657
  struct {
658
    unsigned char MajorVersion;                         /* Byte 4 */
659
    unsigned char MinorVersion;                         /* Byte 5 */
660
    unsigned char TurnID;                               /* Byte 6 */
661
    char FirmwareType;                                  /* Byte 7 */
662
  } FirmwareID;                                         /* Bytes 4-7 */
663
  unsigned char :8;                                     /* Byte 8 */
664
  unsigned int :24;                                     /* Bytes 9-11 */
665
  unsigned char ConfiguredChannels;                     /* Byte 12 */
666
  unsigned char ActualChannels;                         /* Byte 13 */
667
  unsigned char MaxTargets;                             /* Byte 14 */
668
  unsigned char MaxTags;                                /* Byte 15 */
669
  unsigned char MaxLogicalDrives;                       /* Byte 16 */
670
  unsigned char MaxArms;                                /* Byte 17 */
671
  unsigned char MaxSpans;                               /* Byte 18 */
672
  unsigned char :8;                                     /* Byte 19 */
673
  unsigned int :32;                                     /* Bytes 20-23 */
674
  unsigned int MemorySize;                              /* Bytes 24-27 */
675
  unsigned int CacheSize;                               /* Bytes 28-31 */
676
  unsigned int FlashMemorySize;                         /* Bytes 32-35 */
677
  unsigned int NonVolatileMemorySize;                   /* Bytes 36-39 */
678
  struct {
679
    enum {
680
      DAC960_DRAM =                             0x00,
681
      DAC960_EDO =                              0x01
682
    } __attribute__ ((packed)) RamType:3;               /* Byte 40 Bits 0-2 */
683
    enum {
684
      DAC960_None =                             0x00,
685
      DAC960_Parity =                           0x01,
686
      DAC960_ECC =                              0x02
687
    } __attribute__ ((packed)) ErrorCorrection:3;       /* Byte 40 Bits 3-5 */
688
    boolean FastPageMode:1;                             /* Byte 40 Bit 6 */
689
    boolean LowPowerMemory:1;                           /* Byte 40 Bit 7 */
690
    unsigned char :8;                                   /* Bytes 41 */
691
  } MemoryType;
692
  unsigned short ClockSpeed;                            /* Bytes 42-43 */
693
  unsigned short MemorySpeed;                           /* Bytes 44-45 */
694
  unsigned short HardwareSpeed;                         /* Bytes 46-47 */
695
  unsigned int :32;                                     /* Bytes 48-51 */
696
  unsigned int :32;                                     /* Bytes 52-55 */
697
  unsigned char :8;                                     /* Byte 56 */
698
  unsigned char :8;                                     /* Byte 57 */
699
  unsigned short :16;                                   /* Bytes 58-59 */
700
  unsigned short MaxCommands;                           /* Bytes 60-61 */
701
  unsigned short MaxScatterGatherEntries;               /* Bytes 62-63 */
702
  unsigned short MaxDriveCommands;                      /* Bytes 64-65 */
703
  unsigned short MaxIODescriptors;                      /* Bytes 66-67 */
704
  unsigned short MaxCombinedSectors;                    /* Bytes 68-69 */
705
  unsigned char Latency;                                /* Byte 70 */
706
  unsigned char :8;                                     /* Byte 71 */
707
  unsigned char SCSITimeout;                            /* Byte 72 */
708
  unsigned char :8;                                     /* Byte 73 */
709
  unsigned short MinFreeLines;                          /* Bytes 74-75 */
710
  unsigned int :32;                                     /* Bytes 76-79 */
711
  unsigned int :32;                                     /* Bytes 80-83 */
712
  unsigned char RebuildRateConstant;                    /* Byte 84 */
713
  unsigned char :8;                                     /* Byte 85 */
714
  unsigned char :8;                                     /* Byte 86 */
715
  unsigned char :8;                                     /* Byte 87 */
716
  unsigned int :32;                                     /* Bytes 88-91 */
717
  unsigned int :32;                                     /* Bytes 92-95 */
718
  unsigned short PhysicalDriveBlockSize;                /* Bytes 96-97 */
719
  unsigned short LogicalDriveBlockSize;                 /* Bytes 98-99 */
720
  unsigned short MaxBlocksPerCommand;                   /* Bytes 100-101 */
721
  unsigned short BlockFactor;                           /* Bytes 102-103 */
722
  unsigned short CacheLineSize;                         /* Bytes 104-105 */
723
  struct {
724
    enum {
725
      DAC960_Narrow_8bit =                      0x00,
726
      DAC960_Wide_16bit =                       0x01,
727
      DAC960_Wide_32bit =                       0x02
728
    } __attribute__ ((packed)) BusWidth:2;              /* Byte 106 Bits 0-1 */
729
    enum {
730
      DAC960_Fast =                             0x00,
731
      DAC960_Ultra =                            0x01,
732
    } __attribute__ ((packed)) BusSpeed:2;              /* Byte 106 Bits 2-3 */
733
    boolean Differential:1;                             /* Byte 106 Bit 4 */
734
    unsigned char :3;                                   /* Byte 106 Bits 5-7 */
735
  } SCSICapability;
736
  unsigned char :8;                                     /* Byte 107 */
737
  unsigned int :32;                                     /* Bytes 108-111 */
738
  unsigned short FirmwareBuildNumber;                   /* Bytes 112-113 */
739
  enum {
740
    DAC960_AEMI =                               0x01,
741
    DAC960_OEM1 =                               0x02,
742
    DAC960_OEM2 =                               0x04,
743
    DAC960_OEM3 =                               0x08,
744
    DAC960_Conner =                             0x10,
745
    DAC960_SAFTE =                              0x20
746
  } __attribute__ ((packed)) FaultManagementType;       /* Byte 114 */
747
  unsigned char :8;                                     /* Byte 115 */
748
  struct {
749
    boolean Clustering:1;                               /* Byte 116 Bit 0 */
750
    boolean MylexOnlineRAIDExpansion:1;                 /* Byte 116 Bit 1 */
751
    unsigned int :30;                                   /* Bytes 116-119 */
752
  } FirmwareFeatures;
753
  unsigned int :32;                                     /* Bytes 120-123 */
754
  unsigned int :32;                                     /* Bytes 124-127 */
755
}
756
DAC960_Enquiry2_T;
757
 
758
 
759
/*
760
  Define the Get Logical Drive Information reply structure.
761
*/
762
 
763
typedef struct DAC960_LogicalDriveInformation
764
{
765
  unsigned int LogicalDriveSize;                        /* Bytes 0-3 */
766
  enum {
767
    DAC960_LogicalDrive_Online =                0x03,
768
    DAC960_LogicalDrive_Critical =              0x04,
769
    DAC960_LogicalDrive_Offline =               0xFF
770
  } __attribute__ ((packed)) LogicalDriveState;         /* Byte 4 */
771
  unsigned char RAIDLevel:7;                            /* Byte 5 Bits 0-6 */
772
  boolean WriteBack:1;                                  /* Byte 5 Bit 7 */
773
  unsigned int :16;                                     /* Bytes 6-7 */
774
}
775
DAC960_LogicalDriveInformation_T;
776
 
777
 
778
/*
779
  Define the Perform Event Log Operation Types.
780
*/
781
 
782
typedef enum
783
{
784
  DAC960_GetEventLogEntry =                             0x00
785
}
786
__attribute__ ((packed))
787
DAC960_PerformEventLogOpType_T;
788
 
789
 
790
/*
791
  Define the Get Event Log Entry reply structure.
792
*/
793
 
794
typedef struct DAC960_EventLogEntry
795
{
796
  unsigned char MessageType;                            /* Byte 0 */
797
  unsigned char MessageLength;                          /* Byte 1 */
798
  unsigned char TargetID:5;                             /* Byte 2 Bits 0-4 */
799
  unsigned char Channel:3;                              /* Byte 2 Bits 5-7 */
800
  unsigned char LogicalUnit:6;                          /* Byte 3 Bits 0-5 */
801
  unsigned char :2;                                     /* Byte 3 Bits 6-7 */
802
  unsigned short SequenceNumber;                        /* Bytes 4-5 */
803
  unsigned char ErrorCode:7;                            /* Byte 6 Bits 0-6 */
804
  boolean Valid:1;                                      /* Byte 6 Bit 7 */
805
  unsigned char SegmentNumber;                          /* Byte 7 */
806
  unsigned char SenseKey:4;                             /* Byte 8 Bits 0-3 */
807
  unsigned char :1;                                     /* Byte 8 Bit 4 */
808
  boolean ILI:1;                                        /* Byte 8 Bit 5 */
809
  boolean EOM:1;                                        /* Byte 8 Bit 6 */
810
  boolean Filemark:1;                                   /* Byte 8 Bit 7 */
811
  unsigned char Information[4];                         /* Bytes 9-12 */
812
  unsigned char AdditionalSenseLength;                  /* Byte 13 */
813
  unsigned char CommandSpecificInformation[4];          /* Bytes 14-17 */
814
  unsigned char AdditionalSenseCode;                    /* Byte 18 */
815
  unsigned char AdditionalSenseCodeQualifier;           /* Byte 19 */
816
  unsigned char Dummy[12];                              /* Bytes 20-31 */
817
}
818
DAC960_EventLogEntry_T;
819
 
820
#define DAC960_EventMessagesCount               13
821
 
822
static char
823
  *DAC960_EventMessages[DAC960_EventMessagesCount] =
824
     { "killed because write recovery failed",
825
       "killed because of SCSI bus reset failure",
826
       "killed because of double check condition",
827
       "killed because it was removed",
828
       "killed because of gross error on SCSI chip",
829
       "killed because of bad tag returned from drive",
830
       "killed because of timeout on SCSI command",
831
       "killed because of reset SCSI command issued from system",
832
       "killed because busy or parity error count exceeded limit",
833
       "killed because of 'kill drive' command from system",
834
       "killed because of selection timeout",
835
       "killed due to SCSI phase sequence error",
836
       "killed due to unknown status" };
837
 
838
 
839
/*
840
  Define the Get Device State reply structure.
841
*/
842
 
843
typedef struct DAC960_DeviceState
844
{
845
  boolean Present:1;                                    /* Byte 0 Bit 0 */
846
  unsigned char :7;                                     /* Byte 0 Bits 1-7 */
847
  enum {
848
    DAC960_OtherType =                          0x00,
849
    DAC960_DiskType =                           0x01,
850
    DAC960_SequentialType =                     0x02,
851
    DAC960_CDROM_or_WORM_Type =                 0x03
852
    } __attribute__ ((packed)) DeviceType:2;            /* Byte 1 Bits 0-1 */
853
  boolean :1;                                           /* Byte 1 Bit 2 */
854
  boolean Fast20:1;                                     /* Byte 1 Bit 3 */
855
  boolean Sync:1;                                       /* Byte 1 Bit 4 */
856
  boolean Fast:1;                                       /* Byte 1 Bit 5 */
857
  boolean Wide:1;                                       /* Byte 1 Bit 6 */
858
  boolean TaggedQueuingSupported:1;                     /* Byte 1 Bit 7 */
859
  enum {
860
    DAC960_Device_Dead =                        0x00,
861
    DAC960_Device_WriteOnly =                   0x02,
862
    DAC960_Device_Online =                      0x03,
863
    DAC960_Device_Standby =                     0x10
864
  } __attribute__ ((packed)) DeviceState;               /* Byte 2 */
865
  unsigned char :8;                                     /* Byte 3 */
866
  unsigned char SynchronousMultiplier;                  /* Byte 4 */
867
  unsigned char SynchronousOffset:5;                    /* Byte 5 Bits 0-4 */
868
  unsigned char :3;                                     /* Byte 5 Bits 5-7 */
869
  unsigned long DiskSize __attribute__ ((packed));      /* Bytes 6-9 */
870
}
871
DAC960_DeviceState_T;
872
 
873
 
874
/*
875
  Define the Get Rebuild Progress reply structure.
876
*/
877
 
878
typedef struct DAC960_RebuildProgress
879
{
880
  unsigned int LogicalDriveNumber;                      /* Bytes 0-3 */
881
  unsigned int LogicalDriveSize;                        /* Bytes 4-7 */
882
  unsigned int RemainingBlocks;                         /* Bytes 8-11 */
883
}
884
DAC960_RebuildProgress_T;
885
 
886
 
887
/*
888
  Define the Config2 reply structure.
889
*/
890
 
891
typedef struct DAC960_Config2
892
{
893
  unsigned char :1;                                     /* Byte 0 Bit 0 */
894
  boolean ActiveNegationEnabled:1;                      /* Byte 0 Bit 1 */
895
  unsigned char :5;                                     /* Byte 0 Bits 2-6 */
896
  boolean NoRescanIfResetReceivedDuringScan:1;          /* Byte 0 Bit 7 */
897
  boolean StorageWorksSupportEnabled:1;                 /* Byte 1 Bit 0 */
898
  boolean HewlettPackardSupportEnabled:1;               /* Byte 1 Bit 1 */
899
  boolean NoDisconnectOnFirstCommand:1;                 /* Byte 1 Bit 2 */
900
  unsigned char :2;                                     /* Byte 1 Bits 3-4 */
901
  boolean AEMI_ARM:1;                                   /* Byte 1 Bit 5 */
902
  boolean AEMI_OFM:1;                                   /* Byte 1 Bit 6 */
903
  unsigned char :1;                                     /* Byte 1 Bit 7 */
904
  enum {
905
    DAC960_OEMID_Mylex =                        0x00,
906
    DAC960_OEMID_IBM =                          0x08,
907
    DAC960_OEMID_HP =                           0x0A,
908
    DAC960_OEMID_DEC =                          0x0C,
909
    DAC960_OEMID_Siemens =                      0x10,
910
    DAC960_OEMID_Intel =                        0x12
911
  } __attribute__ ((packed)) OEMID;                     /* Byte 2 */
912
  unsigned char OEMModelNumber;                         /* Byte 3 */
913
  unsigned char PhysicalSector;                         /* Byte 4 */
914
  unsigned char LogicalSector;                          /* Byte 5 */
915
  unsigned char BlockFactor;                            /* Byte 6 */
916
  boolean ReadAheadEnabled:1;                           /* Byte 7 Bit 0 */
917
  boolean LowBIOSDelay:1;                               /* Byte 7 Bit 1 */
918
  unsigned char :2;                                     /* Byte 7 Bits 2-3 */
919
  boolean ReassignRestrictedToOneSector:1;              /* Byte 7 Bit 4 */
920
  unsigned char :1;                                     /* Byte 7 Bit 5 */
921
  boolean ForceUnitAccessDuringWriteRecovery:1;         /* Byte 7 Bit 6 */
922
  boolean EnableLeftSymmetricRAID5Algorithm:1;          /* Byte 7 Bit 7 */
923
  unsigned char DefaultRebuildRate;                     /* Byte 8 */
924
  unsigned char :8;                                     /* Byte 9 */
925
  unsigned char BlocksPerCacheLine;                     /* Byte 10 */
926
  unsigned char BlocksPerStripe;                        /* Byte 11 */
927
  struct {
928
    enum {
929
      DAC960_Async =                            0x00,
930
      DAC960_Sync_8MHz =                        0x01,
931
      DAC960_Sync_5MHz =                        0x02,
932
      DAC960_Sync_10or20MHz =                   0x03    /* Bits 0-1 */
933
    } __attribute__ ((packed)) Speed:2;
934
    boolean Force8Bit:1;                                /* Bit 2 */
935
    boolean DisableFast20:1;                            /* Bit 3 */
936
    unsigned char :3;                                   /* Bits 4-6 */
937
    boolean EnableTaggedQueuing:1;                      /* Bit 7 */
938
  } __attribute__ ((packed)) ChannelParameters[6];      /* Bytes 12-17 */
939
  unsigned char SCSIInitiatorID;                        /* Byte 18 */
940
  unsigned char :8;                                     /* Byte 19 */
941
  enum {
942
    DAC960_StartupMode_ControllerSpinUp =       0x00,
943
    DAC960_StartupMode_PowerOnSpinUp =          0x01
944
  } __attribute__ ((packed)) StartupMode;               /* Byte 20 */
945
  unsigned char SimultaneousDeviceSpinUpCount;          /* Byte 21 */
946
  unsigned char SecondsDelayBetweenSpinUps;             /* Byte 22 */
947
  unsigned char Reserved1[29];                          /* Bytes 23-51 */
948
  boolean BIOSDisabled:1;                               /* Byte 52 Bit 0 */
949
  boolean CDROMBootEnabled:1;                           /* Byte 52 Bit 1 */
950
  unsigned char :3;                                     /* Byte 52 Bits 2-4 */
951
  enum {
952
    DAC960_Geometry_128_32 =                    0x00,
953
    DAC960_Geometry_255_63 =                    0x01,
954
    DAC960_Geometry_Reserved1 =                 0x02,
955
    DAC960_Geometry_Reserved2 =                 0x03
956
  } __attribute__ ((packed)) DriveGeometry:2;           /* Byte 52 Bits 5-6 */
957
  unsigned char :1;                                     /* Byte 52 Bit 7 */
958
  unsigned char Reserved2[9];                           /* Bytes 53-61 */
959
  unsigned short Checksum;                              /* Bytes 62-63 */
960
}
961
DAC960_Config2_T;
962
 
963
 
964
/*
965
  Define the Scatter/Gather List Type 1 32 Bit Address 32 Bit Byte Count
966
  structure.
967
*/
968
 
969
typedef struct DAC960_ScatterGatherSegment
970
{
971
  DAC960_BusAddress_T SegmentDataPointer;               /* Bytes 0-3 */
972
  DAC960_ByteCount_T SegmentByteCount;                  /* Bytes 4-7 */
973
}
974
DAC960_ScatterGatherSegment_T;
975
 
976
 
977
/*
978
  Define the 13 Byte DAC960 Command Mailbox structure.  Bytes 13-15 are
979
  not used.  The Command Mailbox structure is padded to 16 bytes for
980
  efficient access.
981
*/
982
 
983
typedef union DAC960_CommandMailbox
984
{
985
  unsigned int Words[4];                                /* Words 0-3 */
986
  unsigned char Bytes[16];                              /* Bytes 0-15 */
987
  struct {
988
    DAC960_CommandOpcode_T CommandOpcode;               /* Byte 0 */
989
    DAC960_CommandIdentifier_T CommandIdentifier;       /* Byte 1 */
990
    unsigned char Dummy[14];                            /* Bytes 2-15 */
991
  } __attribute__ ((packed)) Common;
992
  struct {
993
    DAC960_CommandOpcode_T CommandOpcode;               /* Byte 0 */
994
    DAC960_CommandIdentifier_T CommandIdentifier;       /* Byte 1 */
995
    unsigned char Dummy1[6];                            /* Bytes 2-7 */
996
    DAC960_BusAddress_T BusAddress;                     /* Bytes 8-11 */
997
    unsigned char Dummy2[4];                            /* Bytes 12-15 */
998
  } __attribute__ ((packed)) Type3;
999
  struct {
1000
    DAC960_CommandOpcode_T CommandOpcode;               /* Byte 0 */
1001
    DAC960_CommandIdentifier_T CommandIdentifier;       /* Byte 1 */
1002
    unsigned char Channel;                              /* Byte 2 */
1003
    unsigned char TargetID;                             /* Byte 3 */
1004
    unsigned char Dummy1[4];                            /* Bytes 4-7 */
1005
    DAC960_BusAddress_T BusAddress;                     /* Bytes 8-11 */
1006
    unsigned char Dummy2[4];                            /* Bytes 12-15 */
1007
  } __attribute__ ((packed)) Type3D;
1008
  struct {
1009
    DAC960_CommandOpcode_T CommandOpcode;               /* Byte 0 */
1010
    DAC960_CommandIdentifier_T CommandIdentifier;       /* Byte 1 */
1011
    DAC960_PerformEventLogOpType_T OperationType;       /* Byte 2 */
1012
    unsigned char OperationQualifier;                   /* Byte 3 */
1013
    unsigned short SequenceNumber;                      /* Bytes 4-5 */
1014
    unsigned char Dummy1[2];                            /* Bytes 6-7 */
1015
    DAC960_BusAddress_T BusAddress;                     /* Bytes 8-11 */
1016
    unsigned char Dummy2[4];                            /* Bytes 12-15 */
1017
  } __attribute__ ((packed)) Type3E;
1018
  struct {
1019
    DAC960_CommandOpcode_T CommandOpcode;               /* Byte 0 */
1020
    DAC960_CommandIdentifier_T CommandIdentifier;       /* Byte 1 */
1021
    struct {
1022
      unsigned short TransferLength:11;                 /* Bytes 2-3 */
1023
      unsigned char LogicalDriveNumber:5;               /* Byte 3 Bits 3-7 */
1024
    } __attribute__ ((packed)) LD;
1025
    unsigned int LogicalBlockAddress;                   /* Bytes 4-7 */
1026
    DAC960_BusAddress_T BusAddress;                     /* Bytes 8-11 */
1027
    unsigned char ScatterGatherCount:6;                 /* Byte 12 Bits 0-5 */
1028
    enum {
1029
      DAC960_ScatterGather_32BitAddress_32BitByteCount =        0x0,
1030
      DAC960_ScatterGather_32BitAddress_16BitByteCount =        0x1,
1031
      DAC960_ScatterGather_32BitByteCount_32BitAddress =        0x2,
1032
      DAC960_ScatterGather_16BitByteCount_32BitAddress =        0x3
1033
    } __attribute__ ((packed)) ScatterGatherType:2;     /* Byte 12 Bits 6-7 */
1034
    unsigned char Dummy[3];                             /* Bytes 13-15 */
1035
  } __attribute__ ((packed)) Type5;
1036
  struct {
1037
    DAC960_CommandOpcode_T CommandOpcode;               /* Byte 0 */
1038
    DAC960_CommandIdentifier_T CommandIdentifier;       /* Byte 1 */
1039
    unsigned char CommandOpcode2;                       /* Byte 2 */
1040
    unsigned char :8;                                   /* Byte 3 */
1041
    DAC960_BusAddress_T CommandMailboxesBusAddress;     /* Bytes 4-7 */
1042
    DAC960_BusAddress_T StatusMailboxesBusAddress;      /* Bytes 8-11 */
1043
    unsigned char Dummy[4];                             /* Bytes 12-15 */
1044
  } __attribute__ ((packed)) TypeX;
1045
}
1046
DAC960_CommandMailbox_T;
1047
 
1048
 
1049
/*
1050
  Define the DAC960 V4 Controller Command Mailbox structure.
1051
*/
1052
 
1053
typedef DAC960_CommandMailbox_T DAC960_V4_CommandMailbox_T;
1054
 
1055
 
1056
/*
1057
  Define the DAC960 V4 Controller Status Mailbox structure.
1058
*/
1059
 
1060
typedef union DAC960_V4_StatusMailbox
1061
{
1062
  unsigned int Word;                                    /* Bytes 0-3 */
1063
  struct {
1064
    DAC960_CommandIdentifier_T CommandIdentifier;       /* Byte 0 */
1065
    unsigned char :7;                                   /* Byte 1 Bits 0-6 */
1066
    boolean Valid:1;                                    /* Byte 1 Bit 7 */
1067
    DAC960_CommandStatus_T CommandStatus;               /* Bytes 2-3 */
1068
  } Fields;
1069
}
1070
DAC960_V4_StatusMailbox_T;
1071
 
1072
 
1073
/*
1074
  Define the DAC960 Driver Command Types.
1075
*/
1076
 
1077
typedef enum
1078
{
1079
  DAC960_ReadCommand =                          1,
1080
  DAC960_WriteCommand =                         2,
1081
  DAC960_ReadRetryCommand =                     3,
1082
  DAC960_WriteRetryCommand =                    4,
1083
  DAC960_MonitoringCommand =                    5,
1084
  DAC960_ImmediateCommand =                     6
1085
}
1086
DAC960_CommandType_T;
1087
 
1088
 
1089
/*
1090
  Define the DAC960 Driver Command structure.
1091
*/
1092
 
1093
typedef struct DAC960_Command
1094
{
1095
  DAC960_CommandType_T CommandType;
1096
  DAC960_CommandMailbox_T CommandMailbox;
1097
  DAC960_CommandStatus_T CommandStatus;
1098
  struct DAC960_Controller *Controller;
1099
  struct DAC960_Command *Next;
1100
  Semaphore_T *Semaphore;
1101
  unsigned int LogicalDriveNumber;
1102
  unsigned int BlockNumber;
1103
  unsigned int BlockCount;
1104
  unsigned int SegmentCount;
1105
  BufferHeader_T *BufferHeader;
1106
  DAC960_ScatterGatherSegment_T
1107
    ScatterGatherList[DAC960_MaxScatterGatherSegments];
1108
}
1109
DAC960_Command_T;
1110
 
1111
 
1112
/*
1113
  Define the DAC960 Driver Controller structure.
1114
*/
1115
 
1116
typedef struct DAC960_Controller
1117
{
1118
  void *BaseAddress;
1119
  void *MemoryMappedAddress;
1120
  DAC960_ControllerType_T ControllerType;
1121
  DAC960_IO_Address_T IO_Address;
1122
  DAC960_PCI_Address_T PCI_Address;
1123
  unsigned char ControllerNumber;
1124
  unsigned char ModelName[12];
1125
  unsigned char FullModelName[18];
1126
  unsigned char FirmwareVersion[14];
1127
  unsigned char Bus;
1128
  unsigned char Device;
1129
  unsigned char Function;
1130
  unsigned char IRQ_Channel;
1131
  unsigned char Channels;
1132
  unsigned char MemorySize;
1133
  unsigned char LogicalDriveCount;
1134
  unsigned char GeometryTranslationHeads;
1135
  unsigned char GeometryTranslationSectors;
1136
  unsigned short ControllerQueueDepth;
1137
  unsigned short DriverQueueDepth;
1138
  unsigned short MaxBlocksPerCommand;
1139
  unsigned short MaxScatterGatherSegments;
1140
  unsigned short StripeSize;
1141
  unsigned short SegmentSize;
1142
  unsigned short NewEventLogSequenceNumber;
1143
  unsigned short OldEventLogSequenceNumber;
1144
  unsigned short MessageBufferLength;
1145
  unsigned int ControllerUsageCount;
1146
  unsigned int EnquiryIndex;
1147
  unsigned int LogicalDriveInformationIndex;
1148
  unsigned int DeviceStateIndex;
1149
  unsigned int DeviceStateChannel;
1150
  unsigned int DeviceStateTargetID;
1151
  unsigned long SecondaryMonitoringTime;
1152
  unsigned long RebuildLastReportTime;
1153
  boolean SAFTE_FaultManagementEnabled;
1154
  boolean MonitoringCommandDeferred;
1155
  boolean NeedLogicalDriveInformation;
1156
  boolean NeedDeviceStateInformation;
1157
  boolean NeedRebuildProgress;
1158
  GenericDiskInfo_T GenericDiskInfo;
1159
  Timer_T MonitoringTimer;
1160
  DAC960_Command_T *FreeCommands;
1161
  DAC960_V4_CommandMailbox_T *FirstCommandMailbox;
1162
  DAC960_V4_CommandMailbox_T *LastCommandMailbox;
1163
  DAC960_V4_CommandMailbox_T *NextCommandMailbox;
1164
  DAC960_V4_CommandMailbox_T *PreviousCommandMailbox;
1165
  DAC960_V4_StatusMailbox_T *FirstStatusMailbox;
1166
  DAC960_V4_StatusMailbox_T *LastStatusMailbox;
1167
  DAC960_V4_StatusMailbox_T *NextStatusMailbox;
1168
  DAC960_Enquiry_T Enquiry[2];
1169
  DAC960_LogicalDriveInformation_T
1170
    LogicalDriveInformation[2][DAC960_MaxLogicalDrives];
1171
  DAC960_DeviceState_T DeviceState[2][DAC960_MaxChannels][DAC960_MaxTargets];
1172
  DAC960_EventLogEntry_T EventLogEntry;
1173
  DAC960_RebuildProgress_T RebuildProgress;
1174
  DAC960_Command_T Commands[DAC960_MaxDriverQueueDepth];
1175
  DiskPartition_T DiskPartitions[DAC960_MinorCount];
1176
  int LogicalDriveUsageCount[DAC960_MaxLogicalDrives];
1177
  int PartitionSizes[DAC960_MinorCount];
1178
  int BlockSizes[DAC960_MinorCount];
1179
  int MaxSectorsPerRequest[DAC960_MinorCount];
1180
  int MaxSegmentsPerRequest[DAC960_MinorCount];
1181
  char MessageBuffer[DAC960_MessageBufferSize];
1182
}
1183
DAC960_Controller_T;
1184
 
1185
 
1186
/*
1187
  DAC960_AcquireControllerLock acquires exclusive access to Controller.
1188
*/
1189
 
1190
static inline
1191
void DAC960_AcquireControllerLock(DAC960_Controller_T *Controller,
1192
                                  ProcessorFlags_T *ProcessorFlags)
1193
{
1194
  save_flags(*ProcessorFlags);
1195
  cli();
1196
}
1197
 
1198
 
1199
/*
1200
  DAC960_ReleaseControllerLock releases exclusive access to Controller.
1201
*/
1202
 
1203
static inline
1204
void DAC960_ReleaseControllerLock(DAC960_Controller_T *Controller,
1205
                                  ProcessorFlags_T *ProcessorFlags)
1206
{
1207
  restore_flags(*ProcessorFlags);
1208
}
1209
 
1210
 
1211
/*
1212
  DAC960_AcquireControllerLockRF acquires exclusive access to Controller,
1213
  but is only called from the request function when interrupts are disabled.
1214
*/
1215
 
1216
static inline
1217
void DAC960_AcquireControllerLockRF(DAC960_Controller_T *Controller,
1218
                                    ProcessorFlags_T *ProcessorFlags)
1219
{
1220
}
1221
 
1222
 
1223
/*
1224
  DAC960_ReleaseControllerLockRF releases exclusive access to Controller,
1225
  but is only called from the request function when interrupts are disabled.
1226
*/
1227
 
1228
static inline
1229
void DAC960_ReleaseControllerLockRF(DAC960_Controller_T *Controller,
1230
                                    ProcessorFlags_T *ProcessorFlags)
1231
{
1232
}
1233
 
1234
 
1235
/*
1236
  DAC960_AcquireControllerLockIH acquires exclusive access to Controller,
1237
  but is only called from the interrupt handler when interrupts are disabled.
1238
*/
1239
 
1240
static inline
1241
void DAC960_AcquireControllerLockIH(DAC960_Controller_T *Controller,
1242
                                    ProcessorFlags_T *ProcessorFlags)
1243
{
1244
}
1245
 
1246
 
1247
/*
1248
  DAC960_ReleaseControllerLockIH releases exclusive access to Controller,
1249
  but is only called from the interrupt handler when interrupts are disabled.
1250
*/
1251
 
1252
static inline
1253
void DAC960_ReleaseControllerLockIH(DAC960_Controller_T *Controller,
1254
                                    ProcessorFlags_T *ProcessorFlags)
1255
{
1256
}
1257
 
1258
 
1259
/*
1260
  Define inline functions to provide an abstraction for reading and writing the
1261
  DAC960 V4 Controller Interface Registers.
1262
*/
1263
 
1264
static inline
1265
void DAC960_V4_NewCommand(void *ControllerBaseAddress)
1266
{
1267
  DAC960_V4_InboundDoorBellRegister_T InboundDoorBellRegister;
1268
  InboundDoorBellRegister.All = 0;
1269
  InboundDoorBellRegister.Write.NewCommand = true;
1270
  writel(InboundDoorBellRegister.All,
1271
         ControllerBaseAddress + DAC960_V4_InboundDoorBellRegisterOffset);
1272
}
1273
 
1274
static inline
1275
void DAC960_V4_AcknowledgeStatus(void *ControllerBaseAddress)
1276
{
1277
  DAC960_V4_InboundDoorBellRegister_T InboundDoorBellRegister;
1278
  InboundDoorBellRegister.All = 0;
1279
  InboundDoorBellRegister.Write.AcknowledgeStatus = true;
1280
  writel(InboundDoorBellRegister.All,
1281
         ControllerBaseAddress + DAC960_V4_InboundDoorBellRegisterOffset);
1282
}
1283
 
1284
static inline
1285
void DAC960_V4_SoftReset(void *ControllerBaseAddress)
1286
{
1287
  DAC960_V4_InboundDoorBellRegister_T InboundDoorBellRegister;
1288
  InboundDoorBellRegister.All = 0;
1289
  InboundDoorBellRegister.Write.SoftReset = true;
1290
  writel(InboundDoorBellRegister.All,
1291
         ControllerBaseAddress + DAC960_V4_InboundDoorBellRegisterOffset);
1292
}
1293
 
1294
static inline
1295
boolean DAC960_V4_MailboxFullP(void *ControllerBaseAddress)
1296
{
1297
  DAC960_V4_InboundDoorBellRegister_T InboundDoorBellRegister;
1298
  InboundDoorBellRegister.All =
1299
    readl(ControllerBaseAddress + DAC960_V4_InboundDoorBellRegisterOffset);
1300
  return InboundDoorBellRegister.Read.MailboxFull;
1301
}
1302
 
1303
static inline
1304
void DAC960_V4_AcknowledgeInterrupt(void *ControllerBaseAddress)
1305
{
1306
  DAC960_V4_OutboundDoorBellRegister_T OutboundDoorBellRegister;
1307
  OutboundDoorBellRegister.All = 0;
1308
  OutboundDoorBellRegister.Write.AcknowledgeInterrupt = true;
1309
  writel(OutboundDoorBellRegister.All,
1310
         ControllerBaseAddress + DAC960_V4_OutboundDoorBellRegisterOffset);
1311
}
1312
 
1313
static inline
1314
boolean DAC960_V4_StatusAvailableP(void *ControllerBaseAddress)
1315
{
1316
  DAC960_V4_OutboundDoorBellRegister_T OutboundDoorBellRegister;
1317
  OutboundDoorBellRegister.All =
1318
    readl(ControllerBaseAddress + DAC960_V4_OutboundDoorBellRegisterOffset);
1319
  return OutboundDoorBellRegister.Read.StatusAvailable;
1320
}
1321
 
1322
static inline
1323
void DAC960_V4_EnableInterrupts(void *ControllerBaseAddress)
1324
{
1325
  DAC960_V4_InterruptMaskRegister_T InterruptMaskRegister;
1326
  InterruptMaskRegister.All = 0;
1327
  InterruptMaskRegister.Bits.MessageUnitInterruptMask1 = 0x3;
1328
  InterruptMaskRegister.Bits.DisableInterrupts = false;
1329
  InterruptMaskRegister.Bits.MessageUnitInterruptMask2 = 0x1F;
1330
  writel(InterruptMaskRegister.All,
1331
         ControllerBaseAddress + DAC960_V4_InterruptMaskRegisterOffset);
1332
}
1333
 
1334
static inline
1335
void DAC960_V4_DisableInterrupts(void *ControllerBaseAddress)
1336
{
1337
  DAC960_V4_InterruptMaskRegister_T InterruptMaskRegister;
1338
  InterruptMaskRegister.All = 0;
1339
  InterruptMaskRegister.Bits.MessageUnitInterruptMask1 = 0x3;
1340
  InterruptMaskRegister.Bits.DisableInterrupts = true;
1341
  InterruptMaskRegister.Bits.MessageUnitInterruptMask2 = 0x1F;
1342
  writel(InterruptMaskRegister.All,
1343
         ControllerBaseAddress + DAC960_V4_InterruptMaskRegisterOffset);
1344
}
1345
 
1346
static inline
1347
boolean DAC960_V4_InterruptsEnabledP(void *ControllerBaseAddress)
1348
{
1349
  DAC960_V4_InterruptMaskRegister_T InterruptMaskRegister;
1350
  InterruptMaskRegister.All =
1351
    readl(ControllerBaseAddress + DAC960_V4_InterruptMaskRegisterOffset);
1352
  return !InterruptMaskRegister.Bits.DisableInterrupts;
1353
}
1354
 
1355
static inline
1356
void DAC960_V4_WriteCommandMailbox(DAC960_CommandMailbox_T *NextCommandMailbox,
1357
                                   DAC960_CommandMailbox_T *CommandMailbox)
1358
{
1359
  NextCommandMailbox->Words[1] = CommandMailbox->Words[1];
1360
  NextCommandMailbox->Words[2] = CommandMailbox->Words[2];
1361
  NextCommandMailbox->Words[3] = CommandMailbox->Words[3];
1362
  NextCommandMailbox->Words[0] = CommandMailbox->Words[0];
1363
}
1364
 
1365
static inline
1366
void DAC960_V4_WriteLegacyCommand(void *ControllerBaseAddress,
1367
                                  DAC960_CommandMailbox_T *CommandMailbox)
1368
{
1369
  writel(CommandMailbox->Words[0],
1370
         ControllerBaseAddress + DAC960_V4_CommandOpcodeRegisterOffset);
1371
  writel(CommandMailbox->Words[1],
1372
         ControllerBaseAddress + DAC960_V4_MailboxRegister4Offset);
1373
  writel(CommandMailbox->Words[2],
1374
         ControllerBaseAddress + DAC960_V4_MailboxRegister8Offset);
1375
  writeb(CommandMailbox->Bytes[12],
1376
         ControllerBaseAddress + DAC960_V4_MailboxRegister12Offset);
1377
}
1378
 
1379
static inline DAC960_CommandIdentifier_T
1380
DAC960_V4_ReadStatusCommandIdentifier(void *ControllerBaseAddress)
1381
{
1382
  return readb(ControllerBaseAddress
1383
               + DAC960_V4_StatusCommandIdentifierRegOffset);
1384
}
1385
 
1386
static inline DAC960_CommandStatus_T
1387
DAC960_V4_ReadStatusRegister(void *ControllerBaseAddress)
1388
{
1389
  return readw(ControllerBaseAddress + DAC960_V4_StatusRegisterOffset);
1390
}
1391
 
1392
 
1393
/*
1394
  Define inline functions to provide an abstraction for reading and writing the
1395
  DAC960 V3 Controller Interface Registers.
1396
*/
1397
 
1398
static inline
1399
void DAC960_V3_NewCommand(void *ControllerBaseAddress)
1400
{
1401
  DAC960_V3_InboundDoorBellRegister_T InboundDoorBellRegister;
1402
  InboundDoorBellRegister.All = 0;
1403
  InboundDoorBellRegister.Write.NewCommand = true;
1404
  writeb(InboundDoorBellRegister.All,
1405
         ControllerBaseAddress + DAC960_V3_InboundDoorBellRegisterOffset);
1406
}
1407
 
1408
static inline
1409
void DAC960_V3_AcknowledgeStatus(void *ControllerBaseAddress)
1410
{
1411
  DAC960_V3_InboundDoorBellRegister_T InboundDoorBellRegister;
1412
  InboundDoorBellRegister.All = 0;
1413
  InboundDoorBellRegister.Write.AcknowledgeStatus = true;
1414
  writeb(InboundDoorBellRegister.All,
1415
         ControllerBaseAddress + DAC960_V3_InboundDoorBellRegisterOffset);
1416
}
1417
 
1418
static inline
1419
void DAC960_V3_SoftReset(void *ControllerBaseAddress)
1420
{
1421
  DAC960_V3_InboundDoorBellRegister_T InboundDoorBellRegister;
1422
  InboundDoorBellRegister.All = 0;
1423
  InboundDoorBellRegister.Write.SoftReset = true;
1424
  writeb(InboundDoorBellRegister.All,
1425
         ControllerBaseAddress + DAC960_V3_InboundDoorBellRegisterOffset);
1426
}
1427
 
1428
static inline
1429
boolean DAC960_V3_MailboxFullP(void *ControllerBaseAddress)
1430
{
1431
  DAC960_V3_InboundDoorBellRegister_T InboundDoorBellRegister;
1432
  InboundDoorBellRegister.All =
1433
    readb(ControllerBaseAddress + DAC960_V3_InboundDoorBellRegisterOffset);
1434
  return InboundDoorBellRegister.Read.MailboxFull;
1435
}
1436
 
1437
static inline
1438
void DAC960_V3_AcknowledgeInterrupt(void *ControllerBaseAddress)
1439
{
1440
  DAC960_V3_OutboundDoorBellRegister_T OutboundDoorBellRegister;
1441
  OutboundDoorBellRegister.All = 0;
1442
  OutboundDoorBellRegister.Write.AcknowledgeInterrupt = true;
1443
  writeb(OutboundDoorBellRegister.All,
1444
         ControllerBaseAddress + DAC960_V3_OutboundDoorBellRegisterOffset);
1445
}
1446
 
1447
static inline
1448
boolean DAC960_V3_StatusAvailableP(void *ControllerBaseAddress)
1449
{
1450
  DAC960_V3_OutboundDoorBellRegister_T OutboundDoorBellRegister;
1451
  OutboundDoorBellRegister.All =
1452
    readb(ControllerBaseAddress + DAC960_V3_OutboundDoorBellRegisterOffset);
1453
  return OutboundDoorBellRegister.Read.StatusAvailable;
1454
}
1455
 
1456
static inline
1457
void DAC960_V3_EnableInterrupts(void *ControllerBaseAddress)
1458
{
1459
  DAC960_V3_InterruptEnableRegister_T InterruptEnableRegister;
1460
  InterruptEnableRegister.All = 0;
1461
  InterruptEnableRegister.Bits.EnableInterrupts = true;
1462
  writeb(InterruptEnableRegister.All,
1463
         ControllerBaseAddress + DAC960_V3_InterruptEnableRegisterOffset);
1464
}
1465
 
1466
static inline
1467
void DAC960_V3_DisableInterrupts(void *ControllerBaseAddress)
1468
{
1469
  DAC960_V3_InterruptEnableRegister_T InterruptEnableRegister;
1470
  InterruptEnableRegister.All = 0;
1471
  InterruptEnableRegister.Bits.EnableInterrupts = false;
1472
  writeb(InterruptEnableRegister.All,
1473
         ControllerBaseAddress + DAC960_V3_InterruptEnableRegisterOffset);
1474
}
1475
 
1476
static inline
1477
boolean DAC960_V3_InterruptsEnabledP(void *ControllerBaseAddress)
1478
{
1479
  DAC960_V3_InterruptEnableRegister_T InterruptEnableRegister;
1480
  InterruptEnableRegister.All =
1481
    readb(ControllerBaseAddress + DAC960_V3_InterruptEnableRegisterOffset);
1482
  return InterruptEnableRegister.Bits.EnableInterrupts;
1483
}
1484
 
1485
static inline
1486
void DAC960_V3_WriteCommandMailbox(void *ControllerBaseAddress,
1487
                                   DAC960_CommandMailbox_T *CommandMailbox)
1488
{
1489
  writel(CommandMailbox->Words[0],
1490
         ControllerBaseAddress + DAC960_V3_CommandOpcodeRegisterOffset);
1491
  writel(CommandMailbox->Words[1],
1492
         ControllerBaseAddress + DAC960_V3_MailboxRegister4Offset);
1493
  writel(CommandMailbox->Words[2],
1494
         ControllerBaseAddress + DAC960_V3_MailboxRegister8Offset);
1495
  writeb(CommandMailbox->Bytes[12],
1496
         ControllerBaseAddress + DAC960_V3_MailboxRegister12Offset);
1497
}
1498
 
1499
static inline DAC960_CommandIdentifier_T
1500
DAC960_V3_ReadStatusCommandIdentifier(void *ControllerBaseAddress)
1501
{
1502
  return readb(ControllerBaseAddress
1503
               + DAC960_V3_StatusCommandIdentifierRegOffset);
1504
}
1505
 
1506
static inline DAC960_CommandStatus_T
1507
DAC960_V3_ReadStatusRegister(void *ControllerBaseAddress)
1508
{
1509
  return readw(ControllerBaseAddress + DAC960_V3_StatusRegisterOffset);
1510
}
1511
 
1512
 
1513
/*
1514
  Virtual_to_Bus and Bus_to_Virtual map between Kernel Virtual Addresses
1515
  and PCI Bus Addresses.
1516
*/
1517
 
1518
static inline DAC960_BusAddress_T Virtual_to_Bus(void *VirtualAddress)
1519
{
1520
  return (DAC960_BusAddress_T) virt_to_bus(VirtualAddress);
1521
}
1522
 
1523
static inline void *Bus_to_Virtual(DAC960_BusAddress_T BusAddress)
1524
{
1525
  return (void *) bus_to_virt(BusAddress);
1526
}
1527
 
1528
 
1529
/*
1530
  Define compatibility macros between Linux 2.0 and Linux 2.1.
1531
*/
1532
 
1533
#if LINUX_VERSION_CODE < 0x20100
1534
 
1535
#define MODULE_PARM(Variable, Type)
1536
#define ioremap_nocache(Offset, Size)   vremap(Offset, Size)
1537
#define iounmap(Address)                vfree(Address)
1538
 
1539
#endif
1540
 
1541
 
1542
/*
1543
  Define prototypes for the forward referenced DAC960 Driver Internal Functions.
1544
*/
1545
 
1546
static void DAC960_RequestFunction0(void);
1547
static void DAC960_RequestFunction1(void);
1548
static void DAC960_RequestFunction2(void);
1549
static void DAC960_RequestFunction3(void);
1550
static void DAC960_RequestFunction4(void);
1551
static void DAC960_RequestFunction5(void);
1552
static void DAC960_RequestFunction6(void);
1553
static void DAC960_RequestFunction7(void);
1554
static void DAC960_InterruptHandler(int, void *, Registers_T *);
1555
static void DAC960_QueueMonitoringCommand(DAC960_Command_T *);
1556
static void DAC960_MonitoringTimerFunction(unsigned long);
1557
static int DAC960_Open(Inode_T *, File_T *);
1558
static void DAC960_Release(Inode_T *, File_T *);
1559
static int DAC960_Ioctl(Inode_T *, File_T *, unsigned int, unsigned long);
1560
static void DAC960_InitializeGenericDiskInfo(GenericDiskInfo_T *);
1561
static void DAC960_Message(DAC960_MessageLevel_T, char *,
1562
                           DAC960_Controller_T *, ...);
1563
 
1564
 
1565
#endif /* DAC960_DriverVersion */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.