1 /****************************************************************************
2 * Perceptive Solutions, Inc. PCI-2220I device driver for Linux.
4 * psi_dalei.h - Linux Host Driver for PCI-2220i EIDE Adapters
6 * Copyright (c) 1997-1999 Perceptive Solutions, Inc.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that redistributions of source
11 * code retain the above copyright notice and this comment without
14 * Technical updates and product information at:
15 * http://www.psidisk.com
17 * Please send questions, comments, bug reports to:
18 * tech@psidisk.com Technical Support
20 ****************************************************************************/
22 /************************************************/
23 /* Some defines that we like */
24 /************************************************/
26 #define UCHAR unsigned char
28 #define USHORT unsigned short
29 #define BOOL unsigned short
31 #define ULONG unsigned long
34 /************************************************/
36 /************************************************/
37 #define VENDOR_PSI 0x1256
38 #define DEVICE_DALE_1 0x4401 /* 'D1' */
39 #define DEVICE_BIGD_1 0x4201 /* 'B1' */
40 #define DEVICE_BIGD_2 0x4202 /* 'B2' */
42 /************************************************/
44 /************************************************/
45 #define DALE_MAXDRIVES 4
46 #define BIGD_MAXDRIVES 8
48 #define ATAPI_TRANSFER 8192
49 #define BYTES_PER_SECTOR 512
50 #define DEFAULT_TIMING_MODE 5
52 /************************************************/
53 /* EEPROM locations */
54 /************************************************/
55 #define DALE_FLASH_PAGE_SIZE 128 // number of bytes per page
56 #define DALE_FLASH_SIZE 65536L
58 #define DALE_FLASH_BIOS 0x00080000L // BIOS base address
59 #define DALE_FLASH_SETUP 0x00088000L // SETUP PROGRAM base address offset from BIOS
60 #define DALE_FLASH_RAID 0x00088400L // RAID signature storage
61 #define DALE_FLASH_FACTORY 0x00089000L // FACTORY data base address offset from BIOS
63 #define DALE_FLASH_BIOS_SIZE 32768U // size of FLASH BIOS REGION
65 /************************************************/
66 /* DALE Register address offsets */
67 /************************************************/
69 #define REG_ERROR 0x84
70 #define REG_SECTOR_COUNT 0x88
71 #define REG_LBA_0 0x8C
72 #define REG_LBA_8 0x90
73 #define REG_LBA_16 0x94
74 #define REG_LBA_24 0x98
75 #define REG_STAT_CMD 0x9C
76 #define REG_STAT_SEL 0xA0
78 #define REG_ALT_STAT 0xB8
79 #define REG_DRIVE_ADRS 0xBC
81 #define DALE_DATA_SLOW 0x00040000L
82 #define DALE_DATA_MODE2 0x00040000L
83 #define DALE_DATA_MODE3 0x00050000L
84 #define DALE_DATA_MODE4 0x00060000L
85 #define DALE_DATA_MODE5 0x00070000L
87 #define BIGD_DATA_SLOW 0x00000000L
88 #define BIGD_DATA_MODE0 0x00000000L
89 #define BIGD_DATA_MODE2 0x00000000L
90 #define BIGD_DATA_MODE3 0x00000008L
91 #define BIGD_DATA_MODE4 0x00000010L
92 #define BIGD_DATA_MODE5 0x00000020L
94 #define RTR_LOCAL_RANGE 0x000
95 #define RTR_LOCAL_REMAP 0x004
96 #define RTR_EXP_RANGE 0x010
97 #define RTR_EXP_REMAP 0x014
98 #define RTR_REGIONS 0x018
99 #define RTR_DM_MASK 0x01C
100 #define RTR_DM_LOCAL_BASE 0x020
101 #define RTR_DM_IO_BASE 0x024
102 #define RTR_DM_PCI_REMAP 0x028
103 #define RTR_DM_IO_CONFIG 0x02C
104 #define RTR_MAILBOX 0x040
105 #define RTR_LOCAL_DOORBELL 0x060
106 #define RTR_PCI_DOORBELL 0x064
107 #define RTR_INT_CONTROL_STATUS 0x068
108 #define RTR_EEPROM_CONTROL_STATUS 0x06C
110 #define RTR_DMA0_MODE 0x0080
111 #define RTR_DMA0_PCI_ADDR 0x0084
112 #define RTR_DMA0_LOCAL_ADDR 0x0088
113 #define RTR_DMA0_COUNT 0x008C
114 #define RTR_DMA0_DESC_PTR 0x0090
115 #define RTR_DMA1_MODE 0x0094
116 #define RTR_DMA1_PCI_ADDR 0x0098
117 #define RTR_DMA1_LOCAL_ADDR 0x009C
118 #define RTR_DMA1_COUNT 0x00A0
119 #define RTR_DMA1_DESC_PTR 0x00A4
120 #define RTR_DMA_COMMAND_STATUS 0x00A8
121 #define RTR_DMA_ARB0 0x00AC
122 #define RTR_DMA_ARB1 0x00B0
124 #define RTL_DMA0_MODE 0x00
125 #define RTL_DMA0_PCI_ADDR 0x04
126 #define RTL_DMA0_LOCAL_ADDR 0x08
127 #define RTL_DMA0_COUNT 0x0C
128 #define RTL_DMA0_DESC_PTR 0x10
129 #define RTL_DMA1_MODE 0x14
130 #define RTL_DMA1_PCI_ADDR 0x18
131 #define RTL_DMA1_LOCAL_ADDR 0x1C
132 #define RTL_DMA1_COUNT 0x20
133 #define RTL_DMA1_DESC_PTR 0x24
134 #define RTL_DMA_COMMAND_STATUS 0x28
135 #define RTL_DMA_ARB0 0x2C
136 #define RTL_DMA_ARB1 0x30
138 /************************************************/
139 /* Dale Scratchpad locations */
140 /************************************************/
141 #define DALE_CHANNEL_DEVICE_0 0 // device channel locations
142 #define DALE_CHANNEL_DEVICE_1 1
143 #define DALE_CHANNEL_DEVICE_2 2
144 #define DALE_CHANNEL_DEVICE_3 3
146 #define DALE_SCRATCH_DEVICE_0 4 // device type codes
147 #define DALE_SCRATCH_DEVICE_1 5
148 #define DALE_SCRATCH_DEVICE_2 6
149 #define DALE_SCRATCH_DEVICE_3 7
151 #define DALE_RAID_0_STATUS 8
152 #define DALE_RAID_1_STATUS 9
154 #define DALE_TIMING_MODE 12 // bus master timing mode (2, 3, 4, 5)
155 #define DALE_NUM_DRIVES 13 // number of addressable drives on this board
156 #define DALE_RAID_ON 14 // RAID status On
157 #define DALE_LAST_ERROR 15 // Last error code from BIOS
159 /************************************************/
160 /* BigD Scratchpad locations */
161 /************************************************/
162 #define BIGD_DEVICE_0 0 // device channel locations
163 #define BIGD_DEVICE_1 1
164 #define BIGD_DEVICE_2 2
165 #define BIGD_DEVICE_3 3
167 #define BIGD_DEVICE_4 4 // device type codes
168 #define BIGD_DEVICE_5 5
169 #define BIGD_DEVICE_6 6
170 #define BIGD_DEVICE_7 7
172 #define BIGD_ALARM_IMAGE 11 // ~image of alarm fail register
173 #define BIGD_TIMING_MODE 12 // bus master timing mode (2, 3, 4, 5)
174 #define BIGD_NUM_DRIVES 13 // number of addressable drives on this board
175 #define BIGD_RAID_ON 14 // RAID status is on for the whole board
176 #define BIGD_LAST_ERROR 15 // Last error code from BIOS
178 #define BIGD_RAID_0_STATUS 16
179 #define BIGD_RAID_1_STATUS 17
180 #define BIGD_RAID_2_STATUS 18
181 #define BIGD_RAID_3_STATUS 19
182 #define BIGD_RAID_4_STATUS 20
183 #define BIGD_RAID_5_STATUS 21
184 #define BIGD_RAID_6_STATUS 22
185 #define BIGD_RAID_7_STATUS 23
187 /************************************************/
188 /* Dale cable select bits */
189 /************************************************/
190 #define SEL_NONE 0x00
195 #define SEL_NEW_SPEED_1 0x20
196 #define SEL_COPY 0x40
197 #define SEL_IRQ_OFF 0x80
199 /************************************************/
200 /* Device/Geometry controls */
201 /************************************************/
202 #define GEOMETRY_NONE 0x0 // No device
203 #define GEOMETRY_SET 0x1 // Geometry set
204 #define GEOMETRY_LBA 0x2 // Geometry set in default LBA mode
205 #define GEOMETRY_PHOENIX 0x3 // Geometry set in Pheonix BIOS compatibility mode
207 #define DEVICE_NONE 0x0 // No device present
208 #define DEVICE_INACTIVE 0x1 // device present but not registered active
209 #define DEVICE_ATAPI 0x2 // ATAPI device (CD_ROM, Tape, Etc...)
210 #define DEVICE_DASD_NONLBA 0x3 // Non LBA incompatible device
211 #define DEVICE_DASD_LBA 0x4 // LBA compatible device
213 /************************************************/
214 /* BigD fail register bits */
215 /************************************************/
216 #define FAIL_NONE 0x00
220 #define FAIL_MULTIPLE 0x08
221 #define FAIL_GOOD 0x20
222 #define FAIL_AUDIBLE 0x40
223 #define FAIL_ANY 0x80
225 /************************************************/
226 /* Setup Structure Definitions */
227 /************************************************/
228 typedef struct // device setup parameters
230 UCHAR geometryControl
; // geometry control flags
231 UCHAR device
; // device code
232 USHORT sectors
; // number of sectors per track
233 USHORT heads
; // number of heads
234 USHORT cylinders
; // number of cylinders for this device
235 ULONG blocks
; // number of blocks on device
236 ULONG realCapacity
; // number of real blocks on this device for drive changed testing
237 } SETUP_DEVICE
, *PSETUP_DEVICE
;
239 typedef struct // master setup structure
249 SETUP_DEVICE setupDevice
[BIGD_MAXDRIVES
];
252 /************************************************/
253 /* RAID Structure Definitions */
254 /************************************************/
257 UCHAR signature
; // 0x55 our mirror signature
258 UCHAR status
; // current status bits
259 UCHAR pairIdentifier
; // unique identifier for pair
260 ULONG reconstructPoint
; // recontruction point for hot reconstruct
263 typedef struct DEVICE_RAID1
266 DISK_MIRROR DiskRaid1
;
267 } DEVICE_RAID1
, *PDEVICE_RAID1
;
269 #define DISK_MIRROR_POSITION 0x01A8
270 #define SIGNATURE 0x55
272 #define MASK_SERIAL_NUMBER 0x0FFE // mask for serial number matching
273 #define MASK_SERIAL_UNIT 0x0001 // mask for unit portion of serial number
276 #define UCBF_MIRRORED 0x0010 // drive has a pair
277 #define UCBF_MATCHED 0x0020 // drive pair is matched
278 #define UCBF_SURVIVOR 0x0040 // this unit is a survivor of a pair
279 #define UCBF_REBUILD 0x0080 // rebuild in progress on this device
281 // SCSI controls for RAID
282 #define SC_MY_RAID 0xBF // our special CDB command byte for Win95... interface
283 #define MY_SCSI_QUERY1 0x32 // byte 1 subcommand to query driver for RAID 1 informatation
284 #define MY_SCSI_REBUILD 0x40 // byte 1 subcommand to reconstruct a mirrored pair
285 #define MY_SCSI_DEMOFAIL 0x54 // byte 1 subcommand for RAID failure demonstration
286 #define MY_SCSI_ALARMMUTE 0x60 // byte 1 subcommand to mute any alarm currently on
288 /************************************************/
289 /* Timeout konstants */
290 /************************************************/
291 #define TIMEOUT_READY 100 // 100 mSec
292 #define TIMEOUT_DRQ 300 // 300 mSec
293 #define TIMEOUT_DATA (3 * HZ) // 3 seconds
295 /************************************************/
297 /************************************************/
298 #define ANY2SCSI(up, p) \
299 ((UCHAR *)up)[0] = (((ULONG)(p)) >> 8); \
300 ((UCHAR *)up)[1] = ((ULONG)(p));
302 #define SCSI2LONG(up) \
303 ( (((long)*(((UCHAR *)up))) << 16) \
304 + (((long)(((UCHAR *)up)[1])) << 8) \
305 + ((long)(((UCHAR *)up)[2])) )
307 #define XANY2SCSI(up, p) \
308 ((UCHAR *)up)[0] = ((long)(p)) >> 24; \
309 ((UCHAR *)up)[1] = ((long)(p)) >> 16; \
310 ((UCHAR *)up)[2] = ((long)(p)) >> 8; \
311 ((UCHAR *)up)[3] = ((long)(p));
313 #define XSCSI2LONG(up) \
314 ( (((long)(((UCHAR *)up)[0])) << 24) \
315 + (((long)(((UCHAR *)up)[1])) << 16) \
316 + (((long)(((UCHAR *)up)[2])) << 8) \
317 + ((long)(((UCHAR *)up)[3])) )
319 #define SelectSpigot(padapter,spigot) outb_p (spigot, padapter->regStatSel)
320 #define WriteCommand(padapter,cmd) outb_p (cmd, padapter->regStatCmd)
321 #define AtapiDevice(padapter,b) outb_p (b, padapter->regLba24);
322 #define AtapiCountLo(padapter,b) outb_p (b, padapter->regLba8)
323 #define AtapiCountHi(padapter,b) outb_p (b, padapter->regLba16)
325 /************************************************/
326 /* SCSI CDB operation codes */
327 /************************************************/
328 #define SCSIOP_TEST_UNIT_READY 0x00
329 #define SCSIOP_REZERO_UNIT 0x01
330 #define SCSIOP_REWIND 0x01
331 #define SCSIOP_REQUEST_BLOCK_ADDR 0x02
332 #define SCSIOP_REQUEST_SENSE 0x03
333 #define SCSIOP_FORMAT_UNIT 0x04
334 #define SCSIOP_READ_BLOCK_LIMITS 0x05
335 #define SCSIOP_REASSIGN_BLOCKS 0x07
336 #define SCSIOP_READ6 0x08
337 #define SCSIOP_RECEIVE 0x08
338 #define SCSIOP_WRITE6 0x0A
339 #define SCSIOP_PRINT 0x0A
340 #define SCSIOP_SEND 0x0A
341 #define SCSIOP_SEEK6 0x0B
342 #define SCSIOP_TRACK_SELECT 0x0B
343 #define SCSIOP_SLEW_PRINT 0x0B
344 #define SCSIOP_SEEK_BLOCK 0x0C
345 #define SCSIOP_PARTITION 0x0D
346 #define SCSIOP_READ_REVERSE 0x0F
347 #define SCSIOP_WRITE_FILEMARKS 0x10
348 #define SCSIOP_FLUSH_BUFFER 0x10
349 #define SCSIOP_SPACE 0x11
350 #define SCSIOP_INQUIRY 0x12
351 #define SCSIOP_VERIFY6 0x13
352 #define SCSIOP_RECOVER_BUF_DATA 0x14
353 #define SCSIOP_MODE_SELECT 0x15
354 #define SCSIOP_RESERVE_UNIT 0x16
355 #define SCSIOP_RELEASE_UNIT 0x17
356 #define SCSIOP_COPY 0x18
357 #define SCSIOP_ERASE 0x19
358 #define SCSIOP_MODE_SENSE 0x1A
359 #define SCSIOP_START_STOP_UNIT 0x1B
360 #define SCSIOP_STOP_PRINT 0x1B
361 #define SCSIOP_LOAD_UNLOAD 0x1B
362 #define SCSIOP_RECEIVE_DIAGNOSTIC 0x1C
363 #define SCSIOP_SEND_DIAGNOSTIC 0x1D
364 #define SCSIOP_MEDIUM_REMOVAL 0x1E
365 #define SCSIOP_READ_CAPACITY 0x25
366 #define SCSIOP_READ 0x28
367 #define SCSIOP_WRITE 0x2A
368 #define SCSIOP_SEEK 0x2B
369 #define SCSIOP_LOCATE 0x2B
370 #define SCSIOP_WRITE_VERIFY 0x2E
371 #define SCSIOP_VERIFY 0x2F
372 #define SCSIOP_SEARCH_DATA_HIGH 0x30
373 #define SCSIOP_SEARCH_DATA_EQUAL 0x31
374 #define SCSIOP_SEARCH_DATA_LOW 0x32
375 #define SCSIOP_SET_LIMITS 0x33
376 #define SCSIOP_READ_POSITION 0x34
377 #define SCSIOP_SYNCHRONIZE_CACHE 0x35
378 #define SCSIOP_COMPARE 0x39
379 #define SCSIOP_COPY_COMPARE 0x3A
380 #define SCSIOP_WRITE_DATA_BUFF 0x3B
381 #define SCSIOP_READ_DATA_BUFF 0x3C
382 #define SCSIOP_CHANGE_DEFINITION 0x40
383 #define SCSIOP_READ_SUB_CHANNEL 0x42
384 #define SCSIOP_READ_TOC 0x43
385 #define SCSIOP_READ_HEADER 0x44
386 #define SCSIOP_PLAY_AUDIO 0x45
387 #define SCSIOP_PLAY_AUDIO_MSF 0x47
388 #define SCSIOP_PLAY_TRACK_INDEX 0x48
389 #define SCSIOP_PLAY_TRACK_RELATIVE 0x49
390 #define SCSIOP_PAUSE_RESUME 0x4B
391 #define SCSIOP_LOG_SELECT 0x4C
392 #define SCSIOP_LOG_SENSE 0x4D
393 #define SCSIOP_MODE_SELECT10 0x55
394 #define SCSIOP_MODE_SENSE10 0x5A
395 #define SCSIOP_LOAD_UNLOAD_SLOT 0xA6
396 #define SCSIOP_MECHANISM_STATUS 0xBD
397 #define SCSIOP_READ_CD 0xBE
399 // IDE command definitions
400 #define IDE_COMMAND_ATAPI_RESET 0x08
401 #define IDE_COMMAND_READ 0x20
402 #define IDE_COMMAND_WRITE 0x30
403 #define IDE_COMMAND_RECALIBRATE 0x10
404 #define IDE_COMMAND_SEEK 0x70
405 #define IDE_COMMAND_SET_PARAMETERS 0x91
406 #define IDE_COMMAND_VERIFY 0x40
407 #define IDE_COMMAND_ATAPI_PACKET 0xA0
408 #define IDE_COMMAND_ATAPI_IDENTIFY 0xA1
409 #define IDE_CMD_READ_MULTIPLE 0xC4
410 #define IDE_CMD_WRITE_MULTIPLE 0xC5
411 #define IDE_CMD_SET_MULTIPLE 0xC6
412 #define IDE_COMMAND_IDENTIFY 0xEC
414 // IDE status definitions
415 #define IDE_STATUS_ERROR 0x01
416 #define IDE_STATUS_INDEX 0x02
417 #define IDE_STATUS_CORRECTED_ERROR 0x04
418 #define IDE_STATUS_DRQ 0x08
419 #define IDE_STATUS_DSC 0x10
420 #define IDE_STATUS_WRITE_FAULT 0x20
421 #define IDE_STATUS_DRDY 0x40
422 #define IDE_STATUS_BUSY 0x80
424 typedef struct _ATAPI_STATUS
436 typedef struct _ATAPI_REASON
443 typedef struct _ATAPI_ERROR
452 // IDE error definitions
453 #define IDE_ERROR_AMNF 0x01
454 #define IDE_ERROR_TKONF 0x02
455 #define IDE_ERROR_ABRT 0x04
456 #define IDE_ERROR_MCR 0x08
457 #define IDE_ERROR_IDFN 0x10
458 #define IDE_ERROR_MC 0x20
459 #define IDE_ERROR_UNC 0x40
460 #define IDE_ERROR_BBK 0x80
462 // SCSI read capacity structure
463 typedef struct _READ_CAPACITY_DATA
465 ULONG blks
; /* total blocks (converted to little endian) */
466 ULONG blksiz
; /* size of each (converted to little endian) */
467 } READ_CAPACITY_DATA
, *PREAD_CAPACITY_DATA
;
470 typedef struct _INQUIRYDATA
473 UCHAR DeviceTypeQualifier
:3;
474 UCHAR DeviceTypeModifier
:7;
475 UCHAR RemovableMedia
:1;
477 UCHAR ResponseDataFormat
;
478 UCHAR AdditionalLength
;
481 UCHAR CommandQueue
:1;
483 UCHAR LinkedCommands
:1;
484 UCHAR Synchronous
:1;
487 UCHAR RelativeAddressing
:1;
490 UCHAR ProductRevisionLevel
[4];
491 UCHAR VendorSpecific
[20];
493 } INQUIRYDATA
, *PINQUIRYDATA
;
497 typedef struct _IDENTIFY_DATA
499 USHORT GeneralConfiguration
; // 0
500 USHORT NumberOfCylinders
; // 1
501 USHORT Reserved1
; // 2
502 USHORT NumberOfHeads
; // 3
503 USHORT UnformattedBytesPerTrack
; // 4
504 USHORT UnformattedBytesPerSector
; // 5
505 USHORT SectorsPerTrack
; // 6
506 USHORT NumBytesISG
; // 7 Byte Len - inter-sector gap
507 USHORT NumBytesSync
; // 8 - sync field
508 USHORT NumWordsVUS
; // 9 Len - Vendor Unique Info
509 USHORT SerialNumber
[10]; // 10
510 USHORT BufferType
; // 20
511 USHORT BufferSectorSize
; // 21
512 USHORT NumberOfEccBytes
; // 22
513 USHORT FirmwareRevision
[4]; // 23
514 USHORT ModelNumber
[20]; // 27
515 USHORT NumSectorsPerInt
:8; // 47 Multiple Mode - Sec/Blk
516 USHORT Reserved2
:8; // 47
517 USHORT DoubleWordMode
; // 48 flag for double word mode capable
518 USHORT VendorUnique1
:8; // 49
519 USHORT SupportDMA
:1; // 49 DMA supported
520 USHORT SupportLBA
:1; // 49 LBA supported
521 USHORT SupportIORDYDisable
:1; // 49 IORDY can be disabled
522 USHORT SupportIORDY
:1; // 49 IORDY supported
523 USHORT ReservedPsuedoDMA
:1; // 49 reserved for pseudo DMA mode support
524 USHORT Reserved3
:3; // 49
525 USHORT Reserved4
; // 50
526 USHORT Reserved5
:8; // 51 Transfer Cycle Timing - PIO
527 USHORT PIOCycleTime
:8; // 51 Transfer Cycle Timing - PIO
528 USHORT Reserved6
:8; // 52 - DMA
529 USHORT DMACycleTime
:8; // 52 - DMA
530 USHORT Valid_54_58
:1; // 53 words 54 - 58 are vaild
531 USHORT Valid_64_70
:1; // 53 words 64 - 70 are valid
532 USHORT Reserved7
:14; // 53
533 USHORT LogNumCyl
; // 54 Current Translation - Num Cyl
534 USHORT LogNumHeads
; // 55 Num Heads
535 USHORT LogSectorsPerTrack
; // 56 Sec/Trk
536 ULONG LogTotalSectors
; // 57 Total Sec
537 USHORT CurrentNumSecPerInt
:8; // 59 current setting for number of sectors per interrupt
538 USHORT ValidNumSecPerInt
:1; // 59 Current setting is valid for number of sectors per interrupt
539 USHORT Reserved8
:7; // 59
540 ULONG LBATotalSectors
; // 60 LBA Mode - Sectors
541 USHORT DMASWordFlags
; // 62
542 USHORT DMAMWordFlags
; // 63
543 USHORT AdvancedPIOSupport
:8; // 64 Flow control PIO transfer modes supported
544 USHORT Reserved9
:8; // 64
545 USHORT MinMultiDMACycle
; // 65 minimum multiword DMA transfer cycle time per word
546 USHORT RecomendDMACycle
; // 66 Manufacturer's recommende multiword DMA transfer cycle time
547 USHORT MinPIOCycleWithoutFlow
; // 67 Minimum PIO transfer cycle time without flow control
548 USHORT MinPIOCylceWithFlow
; // 68 Minimum PIO transfer cycle time with IORDY flow control
549 USHORT ReservedSpace
[256-69]; // 69
550 } IDENTIFY_DATA
, *PIDENTIFY_DATA
;
552 // ATAPI configuration bits
553 typedef struct _ATAPI_GENERAL_0
555 USHORT CmdPacketSize
:2; // Command packet size
557 USHORT CmdDrqType
:2;
559 USHORT DeviceType
:5;
561 USHORT ProtocolType
:2;