3 Copyright (c) 2002-2005 Alexandr A. Telyatnikov (Alter)
9 This file contains IDE, ATA, ATAPI and SCSI Miniport definitions
10 and function prototypes.
13 Alexander A. Telyatnikov (Alter)
20 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 Some definitions were taken from standard ATAPI.SYS sources from NT4 DDK by
36 Some definitions were taken from FreeBSD 4.3-4.6 ATA driver by
37 Søren Schmidt, Copyright (c) 1998,1999,2000,2001
39 Code was changed/updated by
40 Alter, Copyright (c) 2002-2004
68 #ifdef USE_DBGPRINT_LOGGER
69 #include "inc\PostDbgMesg.h"
70 #define DbgPrint DbgDump_Printf
71 #define Connect_DbgPrint() {DbgDump_SetAutoReconnect(TRUE); DbgDump_Reconnect();}
72 #else // USE_DBGPRINT_LOGGER
73 #define Connect_DbgPrint() {;}
74 #endif // USE_DBGPRINT_LOGGER
76 #ifdef SCSI_PORT_DBG_PRINT
82 ULONG DebugPrintLevel
,
87 #define PRINT_PREFIX 0,
89 #define KdPrint3(_x_) ScsiDebugPrint _x_ {;}
90 #define KdPrint2(_x_) {ScsiDebugPrint("%x: ", PsGetCurrentThread()) ; ScsiDebugPrint _x_ ; }
91 #define KdPrint(_x_) ScsiDebugPrint _x_ {;}
93 #else // SCSI_PORT_DBG_PRINT
95 //#ifndef USE_DBGPRINT_LOGGER
102 //#endif // USE_DBGPRINT_LOGGER
106 // Note, that using DbgPrint on raised IRQL will crash w2k
107 // tis will not happen immediately, so we shall see some logs
108 //#define LOG_ON_RAISED_IRQL_W2K TRUE
109 //#define LOG_ON_RAISED_IRQL_W2K FALSE
111 #define KdPrint3(_x_) {if(LOG_ON_RAISED_IRQL_W2K || MajorVersion < 0x05 || KeGetCurrentIrql() <= 2){/*DbgPrint("%x: ", PsGetCurrentThread()) ;*/ DbgPrint _x_ ; if(g_LogToDisplay){ PrintNtConsole _x_ ;} }}
112 #define KdPrint2(_x_) {if(LOG_ON_RAISED_IRQL_W2K || MajorVersion < 0x05 || KeGetCurrentIrql() <= 2){/*DbgPrint("%x: ", PsGetCurrentThread()) ;*/ DbgPrint _x_ ; if(g_LogToDisplay){ PrintNtConsole _x_ ;} }}
113 #define KdPrint(_x_) {if(LOG_ON_RAISED_IRQL_W2K || MajorVersion < 0x05 || KeGetCurrentIrql() <= 2){/*DbgPrint("%x: ", PsGetCurrentThread()) ;*/ DbgPrint _x_ ; if(g_LogToDisplay){ PrintNtConsole _x_ ;} }}
115 #define PRINT_PREFIX_PTR ((PCHAR)&__tmp__kdprint__buff__)
116 #define PRINT_UPREFIX_PTR ((PWCHAR)&__tmp__kdprint__ubuff__)
117 #define PRINT_PREFIX PRINT_PREFIX_PTR,
118 #define KdPrint2(_x_) \
120 WCHAR __tmp__kdprint__ubuff__[256]; \
121 CHAR __tmp__kdprint__buff__[256]; \
122 UNICODE_STRING __tmp__usrt__buff__; \
124 swprintf (PRINT_UPREFIX_PTR, L"%hs", PRINT_PREFIX_PTR); \
125 __tmp__usrt__buff__.Buffer = PRINT_UPREFIX_PTR; \
126 __tmp__usrt__buff__.Length = \
127 __tmp__usrt__buff__.MaximumLength = strlen(PRINT_PREFIX_PTR); \
128 NtDisplayString(&__tmp__usrt__buff__); \
130 #define KdPrint(_x_) DbgPrint _x_
132 #endif // SCSI_PORT_DBG_PRINT
134 //#define AtapiStallExecution(dt) { KdPrint2((" AtapiStallExecution(%d)\n", dt)); ScsiPortStallExecution(dt); }
135 #define AtapiStallExecution(dt) { ScsiPortStallExecution(dt); }
141 #define PRINT_PREFIX "UniATA: "
143 //#define KdPrint3(_x_) {if(LOG_ON_RAISED_IRQL_W2K || MajorVersion < 0x05 || KeGetCurrentIrql() <= 2){/*DbgPrint("%x: ", PsGetCurrentThread()) ;*/ DbgPrint _x_ ; if(g_LogToDisplay){ PrintNtConsole _x_ ;} }}
144 #define KdPrint3(_x_) {;}
145 #define KdPrint2(_x_) {;}
146 #define KdPrint(_x_) {;}
147 #define Connect_DbgPrint() {;}
149 #define AtapiStallExecution(dt) ScsiPortStallExecution(dt)
153 // IDE register definition
155 #pragma pack(push, 1)
157 typedef union _IDE_REGISTERS_1
{
180 } IDE_REGISTERS_1
, *PIDE_REGISTERS_1
;
183 #define IDX_IO1_SZ sizeof(IDE_REGISTERS_1)
186 #define IDX_IO1_SZ sizeof(IDE_REGISTERS_1)
187 #define IDX_IO1_i_Data (FIELD_OFFSET(IDE_REGISTERS_1, i.Data )+IDX_IO1)
188 #define IDX_IO1_i_Error (FIELD_OFFSET(IDE_REGISTERS_1, i.Error )+IDX_IO1)
189 #define IDX_IO1_i_BlockCount (FIELD_OFFSET(IDE_REGISTERS_1, i.BlockCount )+IDX_IO1)
190 #define IDX_IO1_i_BlockNumber (FIELD_OFFSET(IDE_REGISTERS_1, i.BlockNumber )+IDX_IO1)
191 #define IDX_IO1_i_CylinderLow (FIELD_OFFSET(IDE_REGISTERS_1, i.CylinderLow )+IDX_IO1)
192 #define IDX_IO1_i_CylinderHigh (FIELD_OFFSET(IDE_REGISTERS_1, i.CylinderHigh)+IDX_IO1)
193 #define IDX_IO1_i_DriveSelect (FIELD_OFFSET(IDE_REGISTERS_1, i.DriveSelect )+IDX_IO1)
194 #define IDX_IO1_i_Status (FIELD_OFFSET(IDE_REGISTERS_1, i.Status )+IDX_IO1)
196 #define IDX_IO1_o IDX_IO1_SZ
197 #define IDX_IO1_o_SZ sizeof(IDE_REGISTERS_1)
199 #define IDX_IO1_o_Data (FIELD_OFFSET(IDE_REGISTERS_1, o.Data )+IDX_IO1_o)
200 #define IDX_IO1_o_Feature (FIELD_OFFSET(IDE_REGISTERS_1, o.Feature )+IDX_IO1_o)
201 #define IDX_IO1_o_BlockCount (FIELD_OFFSET(IDE_REGISTERS_1, o.BlockCount )+IDX_IO1_o)
202 #define IDX_IO1_o_BlockNumber (FIELD_OFFSET(IDE_REGISTERS_1, o.BlockNumber )+IDX_IO1_o)
203 #define IDX_IO1_o_CylinderLow (FIELD_OFFSET(IDE_REGISTERS_1, o.CylinderLow )+IDX_IO1_o)
204 #define IDX_IO1_o_CylinderHigh (FIELD_OFFSET(IDE_REGISTERS_1, o.CylinderHigh)+IDX_IO1_o)
205 #define IDX_IO1_o_DriveSelect (FIELD_OFFSET(IDE_REGISTERS_1, o.DriveSelect )+IDX_IO1_o)
206 #define IDX_IO1_o_Command (FIELD_OFFSET(IDE_REGISTERS_1, o.Command )+IDX_IO1_o)
208 typedef struct _IDE_REGISTERS_2
{
211 } IDE_REGISTERS_2
, *PIDE_REGISTERS_2
;
213 #define IDX_IO2 (IDX_IO1_o+IDX_IO1_o_SZ)
214 #define IDX_IO2_SZ sizeof(IDE_REGISTERS_2)
216 #define IDX_IO2_AltStatus (FIELD_OFFSET(IDE_REGISTERS_2, AltStatus )+IDX_IO2)
217 #define IDX_IO2_DriveAddress (FIELD_OFFSET(IDE_REGISTERS_2, DriveAddress)+IDX_IO2)
219 #define IDX_IO2_o (IDX_IO2+IDX_IO2_SZ)
220 #define IDX_IO2_o_SZ sizeof(IDE_REGISTERS_2)
222 #define IDX_IO2_o_Control (FIELD_OFFSET(IDE_REGISTERS_2, AltStatus )+IDX_IO2_o)
224 // Device Extension Device Flags
227 #define DFLAGS_DEVICE_PRESENT 0x0001 // Indicates that some device is present.
228 #define DFLAGS_ATAPI_DEVICE 0x0002 // Indicates whether ATAPI commands can be used.
229 #define DFLAGS_TAPE_DEVICE 0x0004 // Indicates whether this is a tape device.
230 #define DFLAGS_INT_DRQ 0x0008 // Indicates whether device interrupts as DRQ is set after
231 // receiving ATAPI Packet Command
232 #define DFLAGS_REMOVABLE_DRIVE 0x0010 // Indicates that the drive has the 'removable' bit set in
233 // identify data (offset 128)
234 #define DFLAGS_MEDIA_STATUS_ENABLED 0x0020 // Media status notification enabled
235 #define DFLAGS_ATAPI_CHANGER 0x0040 // Indicates atapi 2.5 changer present.
236 #define DFLAGS_SANYO_ATAPI_CHANGER 0x0080 // Indicates multi-platter device, not conforming to the 2.5 spec.
237 #define DFLAGS_CHANGER_INITED 0x0100 // Indicates that the init path for changers has already been done.
238 #define DFLAGS_LBA_ENABLED 0x0200 // Indicates that we should use LBA addressing rather than CHS
239 #define DFLAGS_DWORDIO_ENABLED 0x0400 // Indicates that we should use 32-bit IO
240 #define DFLAGS_WCACHE_ENABLED 0x0800 // Indicates that we use write cache
241 #define DFLAGS_RCACHE_ENABLED 0x1000 // Indicates that we use read cache
242 #define DFLAGS_ORIG_GEOMETRY 0x2000 //
243 #define DFLAGS_REINIT_DMA 0x4000 //
244 #define DFLAGS_HIDDEN 0x8000 // Hidden device, available only with special IOCTLs
245 // via communication virtual device
246 //#define DFLAGS_ 0x10000 //
248 // Used to disable 'advanced' features.
254 // ATAPI command definitions
257 #define ATAPI_MODE_SENSE 0x5A
258 #define ATAPI_MODE_SELECT 0x55
259 #define ATAPI_FORMAT_UNIT 0x24
261 // ATAPI Command Descriptor Block
263 typedef struct _MODE_SENSE_10
{
269 UCHAR ParameterListLengthMsb
;
270 UCHAR ParameterListLengthLsb
;
272 } MODE_SENSE_10
, *PMODE_SENSE_10
;
274 typedef struct _MODE_SELECT_10
{
280 UCHAR ParameterListLengthMsb
;
281 UCHAR ParameterListLengthLsb
;
283 } MODE_SELECT_10
, *PMODE_SELECT_10
;
285 typedef struct _MODE_PARAMETER_HEADER_10
{
286 UCHAR ModeDataLengthMsb
;
287 UCHAR ModeDataLengthLsb
;
290 }MODE_PARAMETER_HEADER_10
, *PMODE_PARAMETER_HEADER_10
;
293 // IDE command definitions
296 #define IDE_COMMAND_ATAPI_RESET 0x08
297 #define IDE_COMMAND_RECALIBRATE 0x10
298 #define IDE_COMMAND_READ 0x20
299 #define IDE_COMMAND_READ_NO_RETR 0x21
300 #define IDE_COMMAND_READ48 0x24
301 #define IDE_COMMAND_READ_DMA48 0x25
302 #define IDE_COMMAND_READ_DMA_Q48 0x26
303 #define IDE_COMMAND_READ_NATIVE_SIZE48 0x27
304 #define IDE_COMMAND_READ_MUL48 0x29
305 #define IDE_COMMAND_READ_STREAM_DMA48 0x2A
306 #define IDE_COMMAND_READ_STREAM48 0x2B
307 #define IDE_COMMAND_READ_LOG48 0x2f
308 #define IDE_COMMAND_WRITE 0x30
309 #define IDE_COMMAND_WRITE_NO_RETR 0x31
310 #define IDE_COMMAND_WRITE48 0x34
311 #define IDE_COMMAND_WRITE_DMA48 0x35
312 #define IDE_COMMAND_WRITE_DMA_Q48 0x36
313 #define IDE_COMMAND_SET_NATIVE_SIZE48 0x37
314 #define IDE_COMMAND_WRITE_MUL48 0x39
315 #define IDE_COMMAND_WRITE_STREAM_DMA48 0x3a
316 #define IDE_COMMAND_WRITE_STREAM48 0x3b
317 #define IDE_COMMAND_WRITE_FUA_DMA48 0x3d
318 #define IDE_COMMAND_WRITE_FUA_DMA_Q48 0x3e
319 #define IDE_COMMAND_WRITE_LOG48 0x3f
320 #define IDE_COMMAND_VERIFY 0x40
321 #define IDE_COMMAND_VERIFY48 0x42
322 #define IDE_COMMAND_READ_LOG_DMA48 0x47
323 #define IDE_COMMAND_WRITE_LOG_DMA48 0x57
324 #define IDE_COMMAND_TRUSTED_RCV 0x5c
325 #define IDE_COMMAND_TRUSTED_RCV_DMA 0x5d
326 #define IDE_COMMAND_TRUSTED_SEND 0x5e
327 #define IDE_COMMAND_TRUSTED_SEND_DMA 0x5f
328 #define IDE_COMMAND_SEEK 0x70
329 #define IDE_COMMAND_SET_DRIVE_PARAMETERS 0x91
330 #define IDE_COMMAND_ATAPI_PACKET 0xA0
331 #define IDE_COMMAND_ATAPI_IDENTIFY 0xA1
332 #define IDE_COMMAND_READ_MULTIPLE 0xC4
333 #define IDE_COMMAND_WRITE_MULTIPLE 0xC5
334 #define IDE_COMMAND_SET_MULTIPLE 0xC6
335 #define IDE_COMMAND_READ_DMA_Q 0xC7
336 #define IDE_COMMAND_READ_DMA 0xC8
337 #define IDE_COMMAND_WRITE_DMA 0xCA
338 #define IDE_COMMAND_WRITE_DMA_Q 0xCC
339 #define IDE_COMMAND_WRITE_MUL_FUA48 0xCE
340 #define IDE_COMMAND_GET_MEDIA_STATUS 0xDA
341 #define IDE_COMMAND_DOOR_LOCK 0xDE
342 #define IDE_COMMAND_DOOR_UNLOCK 0xDF
343 #define IDE_COMMAND_STANDBY_IMMED 0xE0 // flush and spin down
344 #define IDE_COMMAND_STANDBY 0xE2 // flush and spin down and enable autopowerdown timer
345 #define IDE_COMMAND_SLEEP 0xE6 // flush, spin down and deactivate interface
346 #define IDE_COMMAND_FLUSH_CACHE 0xE7
347 #define IDE_COMMAND_IDENTIFY 0xEC
348 #define IDE_COMMAND_MEDIA_EJECT 0xED
349 #define IDE_COMMAND_FLUSH_CACHE48 0xEA
350 #define IDE_COMMAND_ENABLE_MEDIA_STATUS 0xEF
351 #define IDE_COMMAND_SET_FEATURES 0xEF /* features command,
352 IDE_COMMAND_ENABLE_MEDIA_STATUS */
353 #define IDE_COMMAND_READ_NATIVE_SIZE 0xF8
354 #define IDE_COMMAND_SET_NATIVE_SIZE 0xF9
356 #define SCSIOP_ATA_PASSTHROUGH 0xCC //
359 // IDE status definitions
362 #define IDE_STATUS_SUCCESS 0x00
363 #define IDE_STATUS_ERROR 0x01
364 #define IDE_STATUS_INDEX 0x02
365 #define IDE_STATUS_CORRECTED_ERROR 0x04
366 #define IDE_STATUS_DRQ 0x08
367 #define IDE_STATUS_DSC 0x10
368 //#define IDE_STATUS_DWF 0x10 /* drive write fault */
369 #define IDE_STATUS_DMA 0x20 /* DMA ready */
370 #define IDE_STATUS_DWF 0x20 /* drive write fault */
371 #define IDE_STATUS_DRDY 0x40
372 #define IDE_STATUS_IDLE 0x50
373 #define IDE_STATUS_BUSY 0x80
377 // IDE drive select/head definitions
380 #define IDE_DRIVE_SELECT 0xA0
381 #define IDE_DRIVE_1 0x00
382 #define IDE_DRIVE_2 0x10
383 #define IDE_DRIVE_SELECT_1 (IDE_DRIVE_SELECT | IDE_DRIVE_1)
384 #define IDE_DRIVE_SELECT_2 (IDE_DRIVE_SELECT | IDE_DRIVE_2)
386 #define IDE_USE_LBA 0x40
389 // IDE drive control definitions
392 #define IDE_DC_DISABLE_INTERRUPTS 0x02
393 #define IDE_DC_RESET_CONTROLLER 0x04
394 #define IDE_DC_A_4BIT 0x80
395 #define IDE_DC_USE_HOB 0x80 // use high-order byte(s)
396 #define IDE_DC_REENABLE_CONTROLLER 0x00
398 // IDE error definitions
401 #define IDE_ERROR_ICRC 0x80
402 #define IDE_ERROR_BAD_BLOCK 0x80
403 #define IDE_ERROR_DATA_ERROR 0x40
404 #define IDE_ERROR_MEDIA_CHANGE 0x20
405 #define IDE_ERROR_ID_NOT_FOUND 0x10
406 #define IDE_ERROR_MEDIA_CHANGE_REQ 0x08
407 #define IDE_ERROR_COMMAND_ABORTED 0x04
408 #define IDE_ERROR_END_OF_MEDIA 0x02
409 #define IDE_ERROR_NO_MEDIA 0x02
410 #define IDE_ERROR_ILLEGAL_LENGTH 0x01
413 // ATAPI register definition
416 typedef union _ATAPI_REGISTERS_1
{
431 UCHAR InterruptReason
;
439 //IDE_REGISTERS_1 ide;
441 } ATAPI_REGISTERS_1
, *PATAPI_REGISTERS_1
;
443 #define IDX_ATAPI_IO1 IDX_IO1
444 #define IDX_ATAPI_IO1_SZ sizeof(ATAPI_REGISTERS_1)
446 #define IDX_ATAPI_IO1_i_Data (FIELD_OFFSET(ATAPI_REGISTERS_1, i.Data )+IDX_ATAPI_IO1)
447 #define IDX_ATAPI_IO1_i_Error (FIELD_OFFSET(ATAPI_REGISTERS_1, i.Error )+IDX_ATAPI_IO1)
448 #define IDX_ATAPI_IO1_i_InterruptReason (FIELD_OFFSET(ATAPI_REGISTERS_1, i.InterruptReason)+IDX_ATAPI_IO1)
449 #define IDX_ATAPI_IO1_i_Unused1 (FIELD_OFFSET(ATAPI_REGISTERS_1, i.Unused1 )+IDX_ATAPI_IO1)
450 #define IDX_ATAPI_IO1_i_ByteCountLow (FIELD_OFFSET(ATAPI_REGISTERS_1, i.ByteCountLow )+IDX_ATAPI_IO1)
451 #define IDX_ATAPI_IO1_i_ByteCountHigh (FIELD_OFFSET(ATAPI_REGISTERS_1, i.ByteCountHigh )+IDX_ATAPI_IO1)
452 #define IDX_ATAPI_IO1_i_DriveSelect (FIELD_OFFSET(ATAPI_REGISTERS_1, i.DriveSelect )+IDX_ATAPI_IO1)
453 #define IDX_ATAPI_IO1_i_Status (FIELD_OFFSET(ATAPI_REGISTERS_1, i.Status )+IDX_ATAPI_IO1)
455 #define IDX_ATAPI_IO1_o_Data (FIELD_OFFSET(ATAPI_REGISTERS_1, o.Data )+IDX_ATAPI_IO1)
456 #define IDX_ATAPI_IO1_o_Feature (FIELD_OFFSET(ATAPI_REGISTERS_1, o.Feature )+IDX_ATAPI_IO1)
457 #define IDX_ATAPI_IO1_o_Unused0 (FIELD_OFFSET(ATAPI_REGISTERS_1, o.Unused0 )+IDX_ATAPI_IO1)
458 #define IDX_ATAPI_IO1_o_Unused1 (FIELD_OFFSET(ATAPI_REGISTERS_1, o.Unused1 )+IDX_ATAPI_IO1)
459 #define IDX_ATAPI_IO1_o_ByteCountLow (FIELD_OFFSET(ATAPI_REGISTERS_1, o.ByteCountLow )+IDX_ATAPI_IO1)
460 #define IDX_ATAPI_IO1_o_ByteCountHigh (FIELD_OFFSET(ATAPI_REGISTERS_1, o.ByteCountHigh)+IDX_ATAPI_IO1)
461 #define IDX_ATAPI_IO1_o_DriveSelect (FIELD_OFFSET(ATAPI_REGISTERS_1, o.DriveSelect )+IDX_ATAPI_IO1)
462 #define IDX_ATAPI_IO1_o_Command (FIELD_OFFSET(ATAPI_REGISTERS_1, o.Command )+IDX_ATAPI_IO1)
465 typedef union _ATAPI_REGISTERS_2 {
471 //IDE_REGISTERS_2 ide;
473 } ATAPI_REGISTERS_2, *PATAPI_REGISTERS_2;
475 #define IDX_ATAPI_IO2 IDX_ATAPI_IO2_SZ
476 #define IDX_ATAPI_IO2_SZ sizeof(ATAPI_REGISTERS_2)
480 // ATAPI interrupt reasons
483 #define ATAPI_IR_COD 0x01
484 #define ATAPI_IR_IO 0x02
490 #define ATA_F_DMA 0x01 /* enable DMA */
491 #define ATA_F_OVL 0x02 /* enable overlap */
493 #define ATA_C_F_SETXFER 0x03 /* set transfer mode */
495 #define ATA_C_F_ENAB_WCACHE 0x02 /* enable write cache */
496 #define ATA_C_F_DIS_WCACHE 0x82 /* disable write cache */
498 #define ATA_C_F_ENAB_RCACHE 0xaa /* enable readahead cache */
499 #define ATA_C_F_DIS_RCACHE 0x55 /* disable readahead cache */
501 #define ATA_C_F_ENAB_RELIRQ 0x5d /* enable release interrupt */
502 #define ATA_C_F_DIS_RELIRQ 0xdd /* disable release interrupt */
504 #define ATA_C_F_ENAB_SRVIRQ 0x5e /* enable service interrupt */
505 #define ATA_C_F_DIS_SRVIRQ 0xde /* disable service interrupt */
507 #define ATA_C_F_ENAB_MEDIASTAT 0x95 /* enable media status */
508 #define ATA_C_F_DIS_MEDIASTAT 0x31 /* disable media status */
511 // ATAPI interrupt reasons
514 #define ATA_I_CMD 0x01 /* cmd (1) | data (0) */
515 #define ATA_I_IN 0x02 /* read (1) | write (0) */
516 #define ATA_I_RELEASE 0x04 /* released bus (1) */
517 #define ATA_I_TAGMASK 0xf8 /* tag mask */
522 typedef struct _IDENTIFY_DATA
{
523 UCHAR AtapiCmdSize
:2; // 00 00
524 #define ATAPI_PSIZE_12 0 /* 12 bytes */
525 #define ATAPI_PSIZE_16 1 /* 16 bytes */
527 UCHAR DrqType
:2; // 00 00
528 #define ATAPI_DRQT_MPROC 0 /* cpu 3 ms delay */
529 #define ATAPI_DRQT_INTR 1 /* intr 10 ms delay */
530 #define ATAPI_DRQT_ACCEL 2 /* accel 50 us delay */
534 #define ATAPI_TYPE_DIRECT 0 /* disk/floppy */
535 #define ATAPI_TYPE_TAPE 1 /* streaming tape */
536 #define ATAPI_TYPE_CDROM 5 /* CD-ROM device */
537 #define ATAPI_TYPE_OPTICAL 7 /* optical disk */
539 UCHAR CmdProtocol
:2; // 00 00
540 #define ATAPI_PROTO_ATAPI 2
541 // USHORT GeneralConfiguration; // 00 00
543 USHORT NumberOfCylinders
; // 02 1
544 USHORT Reserved1
; // 04 2
545 USHORT NumberOfHeads
; // 06 3
546 USHORT UnformattedBytesPerTrack
; // 08 4 // Now obsolete
547 USHORT UnformattedBytesPerSector
; // 0A 5 // Now obsolete
548 USHORT SectorsPerTrack
; // 0C 6
550 USHORT VendorUnique1
[3]; // 0E 7-9
551 UCHAR SerialNumber
[20]; // 14 10-19
553 USHORT BufferType
; // 28 20
554 #define ATA_BT_SINGLEPORTSECTOR 1 /* 1 port, 1 sector buffer */
555 #define ATA_BT_DUALPORTMULTI 2 /* 2 port, mult sector buffer */
556 #define ATA_BT_DUALPORTMULTICACHE 3 /* above plus track cache */
558 USHORT BufferSectorSize
; // 2A 21
559 USHORT NumberOfEccBytes
; // 2C 22
560 USHORT FirmwareRevision
[4]; // 2E 23-26
561 USHORT ModelNumber
[20]; // 36 27-46
562 UCHAR MaximumBlockTransfer
; // 5E 47
563 UCHAR VendorUnique2
; // 5F
565 USHORT DoubleWordIo
; // 60 48
567 USHORT Reserved62_0
:8; // 62 49
570 USHORT DisableIordy
:1;
571 USHORT SupportIordy
:1;
573 USHORT StandbyOverlap
:1;
574 USHORT SupportQTag
:1; /* supports queuing overlap */
575 USHORT SupportIDma
:1; /* interleaved DMA supported */
576 /* USHORT Capabilities; // 62 49
577 #define IDENTIFY_CAPABILITIES_SUPPORT_DMA 0x0100
578 #define IDENTIFY_CAPABILITIES_SUPPORT_LBA 0x0200
579 #define IDENTIFY_CAPABILITIES_DISABLE_IORDY 0x0400
580 #define IDENTIFY_CAPABILITIES_SUPPORT_IORDY 0x0800
581 #define IDENTIFY_CAPABILITIES_SOFT_RESET 0x1000
582 #define IDENTIFY_CAPABILITIES_STDBY_OVLP 0x2000
583 #define IDENTIFY_CAPABILITIES_SUPPORT_QTAG 0x4000
584 #define IDENTIFY_CAPABILITIES_SUPPORT_IDMA 0x8000*/
586 USHORT DeviceStandbyMin
:1; // 64 50
587 USHORT Reserved50_1
:13;
588 USHORT DeviceCapability1
:1;
589 USHORT DeviceCapability0
:1;
592 UCHAR Vendor51
; // 66 51
593 UCHAR PioCycleTimingMode
; // 67
595 UCHAR Vendor52
; // 68 52
596 UCHAR DmaCycleTimingMode
; // 69
598 USHORT TranslationFieldsValid
:1; // 6A 53 /* 54-58 */
599 USHORT PioTimingsValid
:1; /* 64-70 */
600 USHORT UdmaModesValid
:1; /* 88 */
603 USHORT NumberOfCurrentCylinders
; // 6C 54 \-
604 USHORT NumberOfCurrentHeads
; // 6E 55 \-
605 USHORT CurrentSectorsPerTrack
; // 70 56 /- obsolete USHORT[5]
606 ULONG CurrentSectorCapacity
; // 72 57-58 /-
608 USHORT CurrentMultiSector
:8; // 59
609 USHORT CurrentMultiSectorValid
:1;
610 USHORT Reserved59_9
:7;
612 ULONG UserAddressableSectors
; // 60-61
614 USHORT SingleWordDMASupport
: 8; // 62 \- obsolete
615 USHORT SingleWordDMAActive
: 8; // /-
617 USHORT MultiWordDMASupport
: 8; // 63
618 USHORT MultiWordDMAActive
: 8;
620 USHORT AdvancedPIOModes
: 8; // 64
621 USHORT Reserved4
: 8;
623 #define AdvancedPIOModes_3 1
624 #define AdvancedPIOModes_4 2
625 #define AdvancedPIOModes_5 4 // non-standard
627 USHORT MinimumMWXferCycleTime
; // 65
628 USHORT RecommendedMWXferCycleTime
; // 66
629 USHORT MinimumPIOCycleTime
; // 67
630 USHORT MinimumPIOCycleTimeIORDY
; // 68
632 USHORT Reserved69_70
[2]; // 69-70
633 USHORT ReleaseTimeOverlapped
; // 71
634 USHORT ReleaseTimeServiceCommand
; // 72
635 USHORT Reserved73_74
[2]; // 73-74
637 USHORT QueueLength
: 5; // 75
638 USHORT Reserved75_6
: 11;
640 USHORT SataCapabilities
; // 76
641 #define ATA_SATA_GEN1 0x0002
642 #define ATA_SATA_GEN2 0x0004
643 #define ATA_SUPPORT_NCQ 0x0100
644 #define ATA_SUPPORT_IFPWRMNGTRCV 0x0200
646 USHORT Reserved77
; // 77
648 USHORT SataSupport
; // 78
649 #define ATA_SUPPORT_NONZERO 0x0002
650 #define ATA_SUPPORT_AUTOACTIVATE 0x0004
651 #define ATA_SUPPORT_IFPWRMNGT 0x0008
652 #define ATA_SUPPORT_INORDERDATA 0x0010
654 USHORT SataEnable
; // 79
655 USHORT MajorRevision
; // 80
656 USHORT MinorRevision
; // 81
659 USHORT Smart
:1; // 82/85
670 USHORT Reserved_82_11
:1;
671 USHORT WriteBuffer
:1;
674 USHORT Reserved_82_15
:1;
676 USHORT Microcode
:1; // 83/86
683 USHORT Reserver_83_7
:1;
684 USHORT MaxSecurity
:1; //
685 USHORT AutoAcoustic
:1; //
686 USHORT Address48
:1; //
687 USHORT ConfigOverlay
:1; //
688 USHORT FlushCache
:1; //
689 USHORT FlushCache48
:1; //
690 USHORT SupportOne
:1; //
691 USHORT SupportZero
:1; //
693 USHORT SmartErrorLog
:1; // 84/87
694 USHORT SmartSelfTest
:1;
695 USHORT MediaSerialNo
:1;
696 USHORT MediaCardPass
:1;
699 USHORT Reserver_84_6
:8;
700 USHORT ExtendedOne
:1; //
701 USHORT ExtendedZero
:1; //
702 } FeaturesSupport
, FeaturesEnabled
;
704 USHORT UltraDMASupport
: 8; // 88
705 USHORT UltraDMAActive
: 8;
707 USHORT EraseTime
; // 89
708 USHORT EnhancedEraseTime
; // 90
709 USHORT CurentAPMLevel
; // 91
711 USHORT MasterPasswdRevision
; // 92
713 USHORT HwResMaster
: 8; // 93
714 USHORT HwResSlave
: 5;
715 USHORT HwResCableId
: 1;
716 USHORT HwResValid
: 2;
718 USHORT CurrentAcoustic
: 8; // 94
719 USHORT VendorAcoustic
: 8;
721 USHORT StreamMinReqSize
; // 95
722 USHORT StreamTransferTime
; // 96
723 USHORT StreamAccessLatency
; // 97
724 ULONG StreamGranularity
; // 98-99
726 ULONGLONG UserAddressableSectors48
; // 100-103
728 USHORT Reserved104
[2]; // 104-105
730 USHORT PhysLogSectorSize
; // 106
733 USHORT PLSS_Reserved
:8;
734 USHORT PLSS_LargeL
:1; // =1 if 117-118 are valid
735 USHORT PLSS_LargeP
:1;
736 USHORT PLSS_Signature
:2; // = 0x01 = 01b
739 USHORT Reserved107
[10]; // 107-116
741 ULONG LargeSectorSize
; // 117-118
743 USHORT Reserved117
[8]; // 119-126
745 USHORT RemovableStatus
; // 127
746 USHORT SecurityStatus
; // 128
748 USHORT FeaturesSupport4
; // 129
749 USHORT Reserved130
[30]; // 130-159
750 USHORT CfAdvPowerMode
; // 160
751 USHORT Reserved161
[14]; // 161-175
752 USHORT MediaSerial
[30]; // 176-205
753 USHORT Reserved206
[49]; // 205-254
754 USHORT Integrity
; // 255
755 } IDENTIFY_DATA
, *PIDENTIFY_DATA
;
758 // Identify data without the Reserved4.
761 #define IDENTIFY_DATA2 IDENTIFY_DATA
762 #define PIDENTIFY_DATA2 PIDENTIFY_DATA
764 /*typedef struct _IDENTIFY_DATA2 {
765 UCHAR AtapiCmdSize:2; // 00 00
767 UCHAR DrqType:2; // 00 00
772 UCHAR CmdProtocol:2; // 00 00
773 // USHORT GeneralConfiguration; // 00
775 USHORT NumberOfCylinders; // 02
776 USHORT Reserved1; // 04
777 USHORT NumberOfHeads; // 06
778 USHORT UnformattedBytesPerTrack; // 08
779 USHORT UnformattedBytesPerSector; // 0A
780 USHORT SectorsPerTrack; // 0C
781 USHORT VendorUnique1[3]; // 0E
782 UCHAR SerialNumber[20]; // 14
783 USHORT BufferType; // 28
784 USHORT BufferSectorSize; // 2A
785 USHORT NumberOfEccBytes; // 2C
786 USHORT FirmwareRevision[4]; // 2E
787 USHORT ModelNumber[20]; // 36
788 UCHAR MaximumBlockTransfer; // 5E
789 UCHAR VendorUnique2; // 5F
790 USHORT DoubleWordIo; // 60
791 USHORT Capabilities; // 62
792 USHORT Reserved2; // 64
793 UCHAR VendorUnique3; // 66
794 UCHAR PioCycleTimingMode; // 67
795 UCHAR VendorUnique4; // 68
796 UCHAR DmaCycleTimingMode; // 69
797 USHORT TranslationFieldsValid:1; // 6A
799 USHORT NumberOfCurrentCylinders; // 6C
800 USHORT NumberOfCurrentHeads; // 6E
801 USHORT CurrentSectorsPerTrack; // 70
802 ULONG CurrentSectorCapacity; // 72
803 } IDENTIFY_DATA2, *PIDENTIFY_DATA2;*/
805 #define IDENTIFY_DATA_SIZE sizeof(IDENTIFY_DATA)
807 // IDENTIFY DMA timing cycle modes.
808 #define IDENTIFY_DMA_CYCLES_MODE_0 0x00
809 #define IDENTIFY_DMA_CYCLES_MODE_1 0x01
810 #define IDENTIFY_DMA_CYCLES_MODE_2 0x02
812 #define PCI_DEV_HW_SPEC(idhi, idlo) \
813 { #idlo, 4, #idhi, 4}
815 typedef struct _BROKEN_CONTROLLER_INFORMATION {
817 ULONG VendorIdLength;
819 ULONG DeviceIdLength;
820 }BROKEN_CONTROLLER_INFORMATION, *PBROKEN_CONTROLLER_INFORMATION;
822 BROKEN_CONTROLLER_INFORMATION const BrokenAdapters[] = {
823 // CMD 640 ATA controller !WARNING! buggy chip data loss possible
824 PCI_DEV_HW_SPEC( 0640, 1095 ), //{ "1095", 4, "0640", 4},
826 PCI_DEV_HW_SPEC( 0601, 1039 ), //{ "1039", 4, "0601", 4}
827 // RZ 100? ATA controller !WARNING! buggy chip data loss possible
828 PCI_DEV_HW_SPEC( 1000, 1042 ),
829 PCI_DEV_HW_SPEC( 1001, 1042 )
832 #define BROKEN_ADAPTERS (sizeof(BrokenAdapters) / sizeof(BROKEN_CONTROLLER_INFORMATION))
834 typedef struct _NATIVE_MODE_CONTROLLER_INFORMATION {
836 ULONG VendorIdLength;
838 ULONG DeviceIdLength;
839 }NATIVE_MODE_CONTROLLER_INFORMATION, *PNATIVE_MODE_CONTROLLER_INFORMATION;
841 NATIVE_MODE_CONTROLLER_INFORMATION const NativeModeAdapters[] = {
842 PCI_DEV_HW_SPEC( 0105, 10ad ) //{ "10ad", 4, "0105", 4}
845 #define NUM_NATIVE_MODE_ADAPTERS (sizeof(NativeModeAdapters) / sizeof(NATIVE_MODE_CONTROLLER_INFORMATION))
848 // Beautification macros
853 #define GetStatus(chan, Status) \
854 Status = AtapiReadPort1(chan, IDX_IO2_AltStatus);
856 #define GetBaseStatus(chan, pStatus) \
857 pStatus = AtapiReadPort1(chan, IDX_IO1_i_Status);
859 #define WriteCommand(chan, _Command) \
860 AtapiWritePort1(chan, IDX_IO1_o_Command, _Command);
863 #define SelectDrive(chan, unit) { \
864 if(chan && chan->lun[unit] && chan->lun[unit]->DeviceFlags & DFLAGS_ATAPI_CHANGER) KdPrint3((" Select %d\n", unit)); \
865 AtapiWritePort1(chan, IDX_IO1_o_DriveSelect, (unit) ? IDE_DRIVE_SELECT_2 : IDE_DRIVE_SELECT_1); \
869 #define ReadBuffer(chan, Buffer, Count, timing) \
870 AtapiReadBuffer2(chan, IDX_IO1_i_Data, \
875 #define WriteBuffer(chan, Buffer, Count, timing) \
876 AtapiWriteBuffer2(chan, IDX_IO1_o_Data, \
881 #define ReadBuffer2(chan, Buffer, Count, timing) \
882 AtapiReadBuffer4(chan, IDX_IO1_i_Data, \
887 #define WriteBuffer2(chan, Buffer, Count, timing) \
888 AtapiWriteBuffer4(chan, IDX_IO1_o_Data, \
896 IN
struct _HW_CHANNEL
* chan
/*,
897 PIDE_REGISTERS_2 BaseIoAddress*/
903 IN
struct _HW_CHANNEL
* chan
/*,
904 PIDE_REGISTERS_2 BaseIoAddress*/
910 IN
struct _HW_CHANNEL
* chan
/*,
911 PIDE_REGISTERS_1 BaseIoAddress*/
917 IN
struct _HW_CHANNEL
* chan
/*,
918 PIDE_REGISTERS_1 BaseIoAddress*/
924 IN
struct _HW_CHANNEL
* chan
/*,
925 PIDE_REGISTERS_2 BaseIoAddress*/
931 IN
struct _HW_CHANNEL
* chan
/*,
932 PIDE_REGISTERS_2 BaseIoAddress*/
938 IN
struct _HW_CHANNEL
* chan
,/*
939 PIDE_REGISTERS_1 BaseIoAddress*/
945 #define IS_RDP(OperationCode)\
946 ((OperationCode == SCSIOP_ERASE)||\
947 (OperationCode == SCSIOP_LOAD_UNLOAD)||\
948 (OperationCode == SCSIOP_LOCATE)||\
949 (OperationCode == SCSIOP_REWIND) ||\
950 (OperationCode == SCSIOP_SPACE)||\
951 (OperationCode == SCSIOP_SEEK)||\
952 /* (OperationCode == SCSIOP_FORMAT_UNIT)||\
953 (OperationCode == SCSIOP_BLANK)||*/ \
954 (OperationCode == SCSIOP_WRITE_FILEMARKS))
959 BuildMechanismStatusSrb (
960 IN PVOID HwDeviceExtension
,
961 IN PSCSI_REQUEST_BLOCK Srb
965 BuildRequestSenseSrb (
966 IN PVOID HwDeviceExtension
,
967 IN PSCSI_REQUEST_BLOCK Srb
971 AtapiHwInitializeChanger (
972 IN PVOID HwDeviceExtension
,
974 IN PMECHANICAL_STATUS_INFORMATION_HEADER MechanismStatus
979 IN PVOID HwDeviceExtension
,
980 IN PSCSI_REQUEST_BLOCK Srb
,
986 IN PVOID HwDeviceExtension
,
987 IN PSCSI_REQUEST_BLOCK Srb
,
991 #define AtapiCopyMemory RtlCopyMemory
999 #define AtapiStringCmp(s1, s2, n) _strnicmp(s1, s2, n)
1003 IN PVOID HwDeviceExtension
1008 IN PVOID HwDeviceExtension
,
1014 IN PVOID HwDeviceExtension
1018 IdeBuildSenseBuffer(
1019 IN PVOID HwDeviceExtension
,
1020 IN PSCSI_REQUEST_BLOCK Srb
1025 IN BOOLEAN EnableMSN
,
1026 IN PVOID HwDeviceExtension
,
1031 AtapiFindController(
1032 IN PVOID HwDeviceExtension
,
1034 IN PVOID BusInformation
,
1035 IN PCHAR ArgumentString
,
1036 IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
1041 AtapiParseArgumentString(
1048 IN PVOID HwDeviceExtension
,
1049 IN ULONG DeviceNumber
,
1057 IN PVOID HwDeviceExtension
,
1058 IN ULONG DeviceNumber
,
1064 IN PVOID HwDeviceExtension
,
1066 IN ULONG deviceNumber
,
1070 #define UNIATA_FIND_DEV_UNHIDE 0x01
1074 IN PVOID HwDeviceExtension
,
1083 #endif //__cplusplus
1088 AtapiResetController(
1089 IN PVOID HwDeviceExtension
,
1095 IN PVOID HwDeviceExtension
,
1096 IN PSCSI_REQUEST_BLOCK Srb
1101 IN PVOID HwDeviceExtension
,
1102 IN PSCSI_REQUEST_BLOCK Srb
,
1108 // IN PVOID HwDeviceExtension,
1109 IN
struct _HW_DEVICE_EXTENSION
* deviceExtension
,
1110 IN ULONG DeviceNumber
,
1121 // IN PVOID HwDeviceExtension,
1122 IN
struct _HW_DEVICE_EXTENSION
* deviceExtension
,
1123 IN ULONG DeviceNumber
,
1135 AtaPioMode(PIDENTIFY_DATA2 ident
);
1138 AtaWmode(PIDENTIFY_DATA2 ident
);
1141 AtaUmode(PIDENTIFY_DATA2 ident
);
1146 IN PVOID DeferredContext
,
1147 IN PVOID SystemArgument1
,
1148 IN PVOID SystemArgument2
1152 //#define AtaCommand(de, devn, chan, cmd, cyl, hd, sec, cnt, feat, flg)
1155 AtaPio2Mode(LONG pio
);
1158 AtaPioMode(PIDENTIFY_DATA2 ident
);
1161 AtapiEnableInterrupts(
1162 IN PVOID HwDeviceExtension
,
1167 AtapiDisableInterrupts(
1168 IN PVOID HwDeviceExtension
,
1172 #define CHAN_NOT_SPECIFIED (0xffffffffL)
1173 #define CHAN_NOT_SPECIFIED_CHECK_CABLE (0xfffffffeL)
1174 #define DEVNUM_NOT_SPECIFIED (0xffffffffL)
1175 #define IOMODE_NOT_SPECIFIED (0xffffffffL)
1178 AtapiRegCheckDevValue(
1179 IN PVOID HwDeviceExtension
,
1187 AtapiRegCheckParameterValue(
1188 IN PVOID HwDeviceExtension
,
1189 IN PWSTR PathSuffix
,
1194 extern ULONG g_LogToDisplay
;
1206 IN
struct _HW_DEVICE_EXTENSION
* deviceExtension
,
1207 IN
struct _IDE_BUSMASTER_REGISTERS
* BaseIoAddressBM_0
,
1213 IN
struct _HW_CHANNEL
* chan
,
1214 IN PIDE_REGISTERS_1 BaseIoAddress1
,
1215 IN PIDE_REGISTERS_2 BaseIoAddress2
1219 UniataInitSyncBaseIO(
1220 IN
struct _HW_CHANNEL
* chan
1226 IN
struct _HW_DEVICE_EXTENSION
* deviceExtension
,
1232 IN
struct _HW_CHANNEL
* chan
1243 UniAtaCalculateLBARegsBack(
1244 struct _HW_LU_EXTENSION
* LunExt
,
1250 IN PVOID HwDeviceExtension
,
1252 IN ULONG deviceNumber
1255 #define ATA_CMD_FLAG_LBAIOsupp 0x01
1256 #define ATA_CMD_FLAG_48supp 0x02
1257 #define ATA_CMD_FLAG_48 0x04
1258 #define ATA_CMD_FLAG_DMA 0x08
1260 extern UCHAR AtaCommands48
[256];
1261 extern UCHAR AtaCommandFlags
[256];
1264 #define PrintNtConsole _PrintNtConsole
1266 #define PrintNtConsole(x) {;}
1273 #endif // __GLOBAL_H__