3 Copyright (c) 2002-2016 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-20016
71 #ifdef USE_DBGPRINT_LOGGER
72 #include "inc/PostDbgMesg.h"
73 #define DbgPrint DbgDump_Printf
74 #define Connect_DbgPrint() {DbgDump_SetAutoReconnect(TRUE); DbgDump_Reconnect();}
75 #else // USE_DBGPRINT_LOGGER
76 #define Connect_DbgPrint() {;}
77 #endif // USE_DBGPRINT_LOGGER
79 #ifdef SCSI_PORT_DBG_PRINT
85 ULONG DebugPrintLevel
,
90 #define PRINT_PREFIX 0,
92 #define KdPrint3(_x_) ScsiDebugPrint _x_ {;}
93 #define KdPrint2(_x_) {ScsiDebugPrint("%x: ", PsGetCurrentThread()) ; ScsiDebugPrint _x_ ; }
94 #define KdPrint(_x_) ScsiDebugPrint _x_ {;}
96 #else // SCSI_PORT_DBG_PRINT
98 #ifndef USE_DBGPRINT_LOGGER
107 #endif // USE_DBGPRINT_LOGGER
111 // Note, that using DbgPrint on raised IRQL will crash w2k
112 // ttis will not happen immediately, so we shall see some logs
113 //#define LOG_ON_RAISED_IRQL_W2K TRUE
114 //#define LOG_ON_RAISED_IRQL_W2K FALSE
116 #define KdPrint3(_x_) {if(LOG_ON_RAISED_IRQL_W2K || MajorVersion < 0x05 || KeGetCurrentIrql() <= 2){/*DbgPrint("%x: ", PsGetCurrentThread()) ;*/ DbgPrint _x_ ; if(g_LogToDisplay){ PrintNtConsole _x_ ;} }}
117 #define KdPrint2(_x_) {if(LOG_ON_RAISED_IRQL_W2K || MajorVersion < 0x05 || KeGetCurrentIrql() <= 2){/*DbgPrint("%x: ", PsGetCurrentThread()) ;*/ DbgPrint _x_ ; if(g_LogToDisplay){ PrintNtConsole _x_ ;} }}
118 #define KdPrint(_x_) {if(LOG_ON_RAISED_IRQL_W2K || MajorVersion < 0x05 || KeGetCurrentIrql() <= 2){/*DbgPrint("%x: ", PsGetCurrentThread()) ;*/ DbgPrint _x_ ; if(g_LogToDisplay){ PrintNtConsole _x_ ;} }}
120 #define PRINT_PREFIX_PTR ((PCHAR)&__tmp__kdprint__buff__)
121 #define PRINT_UPREFIX_PTR ((PWCHAR)&__tmp__kdprint__ubuff__)
122 #define PRINT_PREFIX PRINT_PREFIX_PTR,
123 #define KdPrint2(_x_) \
125 WCHAR __tmp__kdprint__ubuff__[256]; \
126 CHAR __tmp__kdprint__buff__[256]; \
127 UNICODE_STRING __tmp__usrt__buff__; \
129 swprintf (PRINT_UPREFIX_PTR, L"%hs", PRINT_PREFIX_PTR); \
130 __tmp__usrt__buff__.Buffer = PRINT_UPREFIX_PTR; \
131 __tmp__usrt__buff__.Length = \
132 __tmp__usrt__buff__.MaximumLength = strlen(PRINT_PREFIX_PTR); \
133 NtDisplayString(&__tmp__usrt__buff__); \
135 #define KdPrint(_x_) DbgPrint _x_
137 #endif // SCSI_PORT_DBG_PRINT
139 //#define AtapiStallExecution(dt) { KdPrint2((" AtapiStallExecution(%d)\n", dt)); ScsiPortStallExecution(dt); }
140 #define AtapiStallExecution(dt) { ScsiPortStallExecution(dt); }
150 #define PRINT_PREFIX "UniATA: "
152 //#define KdPrint3(_x_) {if(LOG_ON_RAISED_IRQL_W2K || MajorVersion < 0x05 || KeGetCurrentIrql() <= 2){/*DbgPrint("%x: ", PsGetCurrentThread()) ;*/ DbgPrint _x_ ; if(g_LogToDisplay){ PrintNtConsole _x_ ;} }}
153 #define KdPrint3(_x_) {;}
154 #define KdPrint2(_x_) {;}
155 #define KdPrint(_x_) {;}
156 #define Connect_DbgPrint() {;}
158 #define AtapiStallExecution(dt) ScsiPortStallExecution(dt)
162 // IDE register definition
164 #pragma pack(push, 1)
166 typedef union _IDE_REGISTERS_1
{
189 } IDE_REGISTERS_1
, *PIDE_REGISTERS_1
;
192 #define IDX_IO1_SZ sizeof(IDE_REGISTERS_1)
195 #define IDX_IO1_SZ sizeof(IDE_REGISTERS_1)
196 #define IDX_IO1_i_Data (FIELD_OFFSET(IDE_REGISTERS_1, i.Data )+IDX_IO1)
197 #define IDX_IO1_i_Error (FIELD_OFFSET(IDE_REGISTERS_1, i.Error )+IDX_IO1)
198 #define IDX_IO1_i_BlockCount (FIELD_OFFSET(IDE_REGISTERS_1, i.BlockCount )+IDX_IO1)
199 #define IDX_IO1_i_BlockNumber (FIELD_OFFSET(IDE_REGISTERS_1, i.BlockNumber )+IDX_IO1)
200 #define IDX_IO1_i_CylinderLow (FIELD_OFFSET(IDE_REGISTERS_1, i.CylinderLow )+IDX_IO1)
201 #define IDX_IO1_i_CylinderHigh (FIELD_OFFSET(IDE_REGISTERS_1, i.CylinderHigh)+IDX_IO1)
202 #define IDX_IO1_i_DriveSelect (FIELD_OFFSET(IDE_REGISTERS_1, i.DriveSelect )+IDX_IO1)
203 #define IDX_IO1_i_Status (FIELD_OFFSET(IDE_REGISTERS_1, i.Status )+IDX_IO1)
205 #define IDX_IO1_o IDX_IO1_SZ
206 #define IDX_IO1_o_SZ sizeof(IDE_REGISTERS_1)
208 #define IDX_IO1_o_Data (FIELD_OFFSET(IDE_REGISTERS_1, o.Data )+IDX_IO1_o)
209 #define IDX_IO1_o_Feature (FIELD_OFFSET(IDE_REGISTERS_1, o.Feature )+IDX_IO1_o)
210 #define IDX_IO1_o_BlockCount (FIELD_OFFSET(IDE_REGISTERS_1, o.BlockCount )+IDX_IO1_o)
211 #define IDX_IO1_o_BlockNumber (FIELD_OFFSET(IDE_REGISTERS_1, o.BlockNumber )+IDX_IO1_o)
212 #define IDX_IO1_o_CylinderLow (FIELD_OFFSET(IDE_REGISTERS_1, o.CylinderLow )+IDX_IO1_o)
213 #define IDX_IO1_o_CylinderHigh (FIELD_OFFSET(IDE_REGISTERS_1, o.CylinderHigh)+IDX_IO1_o)
214 #define IDX_IO1_o_DriveSelect (FIELD_OFFSET(IDE_REGISTERS_1, o.DriveSelect )+IDX_IO1_o)
215 #define IDX_IO1_o_Command (FIELD_OFFSET(IDE_REGISTERS_1, o.Command )+IDX_IO1_o)
217 typedef union _IDE_REGISTERS_2
{
220 } IDE_REGISTERS_2
, *PIDE_REGISTERS_2
;
222 #define IDX_IO2 (IDX_IO1_o+IDX_IO1_o_SZ)
223 #define IDX_IO2_SZ sizeof(IDE_REGISTERS_2)
225 #define IDX_IO2_AltStatus (FIELD_OFFSET(IDE_REGISTERS_2, AltStatus )+IDX_IO2)
226 //#define IDX_IO2_DriveAddress (FIELD_OFFSET(IDE_REGISTERS_2, DriveAddress)+IDX_IO2)
228 #define IDX_IO2_o (IDX_IO2+IDX_IO2_SZ)
229 #define IDX_IO2_o_SZ sizeof(IDE_REGISTERS_2)
231 #define IDX_IO2_o_Control (FIELD_OFFSET(IDE_REGISTERS_2, Control)+IDX_IO2_o)
233 // Device Extension Device Flags
236 #define DFLAGS_DEVICE_PRESENT 0x0001 // Indicates that some device is present.
237 #define DFLAGS_ATAPI_DEVICE 0x0002 // Indicates whether ATAPI commands can be used.
238 #define DFLAGS_TAPE_DEVICE 0x0004 // Indicates whether this is a tape device.
239 #define DFLAGS_INT_DRQ 0x0008 // Indicates whether device interrupts as DRQ is set after
240 // receiving ATAPI Packet Command
241 #define DFLAGS_REMOVABLE_DRIVE 0x0010 // Indicates that the drive has the 'removable' bit set in
242 // identify data (offset 128)
243 #define DFLAGS_MEDIA_STATUS_ENABLED 0x0020 // Media status notification enabled
244 #define DFLAGS_ATAPI_CHANGER 0x0040 // Indicates atapi 2.5 changer present.
245 #define DFLAGS_SANYO_ATAPI_CHANGER 0x0080 // Indicates multi-platter device, not conforming to the 2.5 spec.
246 #define DFLAGS_CHANGER_INITED 0x0100 // Indicates that the init path for changers has already been done.
247 #define DFLAGS_LBA_ENABLED 0x0200 // Indicates that we should use LBA addressing rather than CHS
248 #define DFLAGS_DWORDIO_ENABLED 0x0400 // Indicates that we should use 32-bit IO
249 #define DFLAGS_WCACHE_ENABLED 0x0800 // Indicates that we use write cache
250 #define DFLAGS_RCACHE_ENABLED 0x1000 // Indicates that we use read cache
251 #define DFLAGS_ORIG_GEOMETRY 0x2000 //
252 #define DFLAGS_REINIT_DMA 0x4000 //
253 #define DFLAGS_HIDDEN 0x8000 // Hidden device, available only with special IOCTLs
254 // via communication virtual device
255 #define DFLAGS_MANUAL_CHS 0x10000 // For devices those have no IDENTIFY commands
256 //#define DFLAGS_ 0x10000 //
258 // Used to disable 'advanced' features.
264 // ATAPI command definitions
267 #define ATAPI_MODE_SENSE 0x5A
268 #define ATAPI_MODE_SELECT 0x55
269 #define ATAPI_FORMAT_UNIT 0x24
271 // ATAPI Command Descriptor Block
273 typedef struct _MODE_SENSE_10
{
279 UCHAR ParameterListLengthMsb
;
280 UCHAR ParameterListLengthLsb
;
282 } MODE_SENSE_10
, *PMODE_SENSE_10
;
284 typedef struct _MODE_SELECT_10
{
290 UCHAR ParameterListLengthMsb
;
291 UCHAR ParameterListLengthLsb
;
293 } MODE_SELECT_10
, *PMODE_SELECT_10
;
295 typedef struct _MODE_PARAMETER_HEADER_10
{
296 UCHAR ModeDataLengthMsb
;
297 UCHAR ModeDataLengthLsb
;
300 }MODE_PARAMETER_HEADER_10
, *PMODE_PARAMETER_HEADER_10
;
303 // values for TransferMode
306 #define ATA_PIO_NRDY 0x01
308 #define ATA_PIO0 0x08
309 #define ATA_PIO1 0x09
310 #define ATA_PIO2 0x0a
311 #define ATA_PIO3 0x0b
312 #define ATA_PIO4 0x0c
313 #define ATA_PIO5 0x0d
316 #define ATA_SDMA 0x10
317 #define ATA_SDMA0 0x10
318 #define ATA_SDMA1 0x11
319 #define ATA_SDMA2 0x12
321 #define ATA_WDMA 0x20
322 #define ATA_WDMA0 0x20
323 #define ATA_WDMA1 0x21
324 #define ATA_WDMA2 0x22
326 #define ATA_UDMA 0x40
327 #define ATA_UDMA0 0x40 // ATA-16
328 #define ATA_UDMA1 0x41 // ATA-25
329 #define ATA_UDMA2 0x42 // ATA-33
330 #define ATA_UDMA3 0x43 // ATA-44
331 #define ATA_UDMA4 0x44 // ATA-66
332 #define ATA_UDMA5 0x45 // ATA-100
333 #define ATA_UDMA6 0x46 // ATA-133
334 //#define ATA_UDMA7 0x47 // ATA-166
336 #define ATA_SA150 0x47 /*0x80*/
337 #define ATA_SA300 0x48 /*0x81*/
338 #define ATA_SA600 0x49 /*0x82*/
340 #define ATA_MODE_NOT_SPEC ((ULONG)(-1)) /*0x82*/
343 // IDE command definitions
346 #define IDE_COMMAND_DATA_SET_MGMT 0x06 // TRIM
347 #define IDE_COMMAND_ATAPI_RESET 0x08
348 #define IDE_COMMAND_RECALIBRATE 0x10
349 #define IDE_COMMAND_READ 0x20
350 #define IDE_COMMAND_READ_NO_RETR 0x21
351 #define IDE_COMMAND_READ48 0x24
352 #define IDE_COMMAND_READ_DMA48 0x25
353 #define IDE_COMMAND_READ_DMA_Q48 0x26
354 #define IDE_COMMAND_READ_NATIVE_SIZE48 0x27
355 #define IDE_COMMAND_READ_MUL48 0x29
356 #define IDE_COMMAND_READ_STREAM_DMA48 0x2A
357 #define IDE_COMMAND_READ_STREAM48 0x2B
358 #define IDE_COMMAND_READ_LOG48 0x2f
359 #define IDE_COMMAND_WRITE 0x30
360 #define IDE_COMMAND_WRITE_NO_RETR 0x31
361 #define IDE_COMMAND_WRITE48 0x34
362 #define IDE_COMMAND_WRITE_DMA48 0x35
363 #define IDE_COMMAND_WRITE_DMA_Q48 0x36
364 #define IDE_COMMAND_SET_NATIVE_SIZE48 0x37
365 #define IDE_COMMAND_WRITE_MUL48 0x39
366 #define IDE_COMMAND_WRITE_STREAM_DMA48 0x3a
367 #define IDE_COMMAND_WRITE_STREAM48 0x3b
368 #define IDE_COMMAND_WRITE_FUA_DMA48 0x3d
369 #define IDE_COMMAND_WRITE_FUA_DMA_Q48 0x3e
370 #define IDE_COMMAND_WRITE_LOG48 0x3f
371 #define IDE_COMMAND_VERIFY 0x40
372 #define IDE_COMMAND_VERIFY48 0x42
373 #define IDE_COMMAND_READ_LOG_DMA48 0x47
374 #define IDE_COMMAND_WRITE_LOG_DMA48 0x57
375 #define IDE_COMMAND_TRUSTED_RCV 0x5c
376 #define IDE_COMMAND_TRUSTED_RCV_DMA 0x5d
377 #define IDE_COMMAND_TRUSTED_SEND 0x5e
378 #define IDE_COMMAND_TRUSTED_SEND_DMA 0x5f
379 #define IDE_COMMAND_SEEK 0x70
380 #define IDE_COMMAND_SET_DRIVE_PARAMETERS 0x91
381 #define IDE_COMMAND_ATAPI_PACKET 0xA0
382 #define IDE_COMMAND_ATAPI_IDENTIFY 0xA1
383 #define IDE_COMMAND_READ_MULTIPLE 0xC4
384 #define IDE_COMMAND_WRITE_MULTIPLE 0xC5
385 #define IDE_COMMAND_SET_MULTIPLE 0xC6
386 #define IDE_COMMAND_READ_DMA_Q 0xC7
387 #define IDE_COMMAND_READ_DMA 0xC8
388 #define IDE_COMMAND_WRITE_DMA 0xCA
389 #define IDE_COMMAND_WRITE_DMA_Q 0xCC
390 #define IDE_COMMAND_WRITE_MUL_FUA48 0xCE
391 #define IDE_COMMAND_GET_MEDIA_STATUS 0xDA
392 #define IDE_COMMAND_DOOR_LOCK 0xDE
393 #define IDE_COMMAND_DOOR_UNLOCK 0xDF
394 #define IDE_COMMAND_STANDBY_IMMED 0xE0 // flush and spin down
395 #define IDE_COMMAND_IDLE_IMMED 0xE1
396 #define IDE_COMMAND_STANDBY 0xE2 // flush and spin down and enable autopowerdown timer
397 #define IDE_COMMAND_IDLE 0xE3
398 #define IDE_COMMAND_READ_PM 0xE4 // SATA PM
399 #define IDE_COMMAND_SLEEP 0xE6 // flush, spin down and deactivate interface
400 #define IDE_COMMAND_FLUSH_CACHE 0xE7
401 #define IDE_COMMAND_WRITE_PM 0xE8 // SATA PM
402 #define IDE_COMMAND_IDENTIFY 0xEC
403 #define IDE_COMMAND_MEDIA_EJECT 0xED
404 #define IDE_COMMAND_FLUSH_CACHE48 0xEA
405 #define IDE_COMMAND_ENABLE_MEDIA_STATUS 0xEF
406 #define IDE_COMMAND_SET_FEATURES 0xEF /* features command,
407 IDE_COMMAND_ENABLE_MEDIA_STATUS */
408 #define IDE_COMMAND_READ_NATIVE_SIZE 0xF8
409 #define IDE_COMMAND_SET_NATIVE_SIZE 0xF9
411 #define SCSIOP_ATA_PASSTHROUGH 0xCC //
414 // IDE status definitions
417 #define IDE_STATUS_SUCCESS 0x00
418 #define IDE_STATUS_ERROR 0x01
419 #define IDE_STATUS_INDEX 0x02
420 #define IDE_STATUS_CORRECTED_ERROR 0x04
421 #define IDE_STATUS_DRQ 0x08
422 #define IDE_STATUS_DSC 0x10
423 //#define IDE_STATUS_DWF 0x10 /* drive write fault */
424 #define IDE_STATUS_DMA 0x20 /* DMA ready */
425 #define IDE_STATUS_DWF 0x20 /* drive write fault */
426 #define IDE_STATUS_DRDY 0x40
427 #define IDE_STATUS_IDLE 0x50
428 #define IDE_STATUS_BUSY 0x80
430 #define IDE_STATUS_WRONG 0xff
431 #define IDE_STATUS_MASK 0xff
435 // IDE drive select/head definitions
438 #define IDE_DRIVE_SELECT 0xA0
439 #define IDE_DRIVE_1 0x00
440 #define IDE_DRIVE_2 0x10
441 #define IDE_DRIVE_SELECT_1 (IDE_DRIVE_SELECT | IDE_DRIVE_1)
442 #define IDE_DRIVE_SELECT_2 (IDE_DRIVE_SELECT | IDE_DRIVE_2)
443 #define IDE_DRIVE_MASK (IDE_DRIVE_SELECT_1 | IDE_DRIVE_SELECT_2)
445 #define IDE_USE_LBA 0x40
448 // IDE drive control definitions
451 #define IDE_DC_DISABLE_INTERRUPTS 0x02
452 #define IDE_DC_RESET_CONTROLLER 0x04
453 #define IDE_DC_A_4BIT 0x80
454 #define IDE_DC_USE_HOB 0x80 // use high-order byte(s)
455 #define IDE_DC_REENABLE_CONTROLLER 0x00
457 // IDE error definitions
460 #define IDE_ERROR_ICRC 0x80
461 #define IDE_ERROR_BAD_BLOCK 0x80
462 #define IDE_ERROR_DATA_ERROR 0x40
463 #define IDE_ERROR_MEDIA_CHANGE 0x20
464 #define IDE_ERROR_ID_NOT_FOUND 0x10
465 #define IDE_ERROR_MEDIA_CHANGE_REQ 0x08
466 #define IDE_ERROR_COMMAND_ABORTED 0x04
467 #define IDE_ERROR_END_OF_MEDIA 0x02
468 #define IDE_ERROR_NO_MEDIA 0x02
469 #define IDE_ERROR_ILLEGAL_LENGTH 0x01
472 // ATAPI register definition
475 typedef union _ATAPI_REGISTERS_1
{
490 UCHAR InterruptReason
;
498 //IDE_REGISTERS_1 ide;
500 } ATAPI_REGISTERS_1
, *PATAPI_REGISTERS_1
;
502 #define IDX_ATAPI_IO1 IDX_IO1
503 #define IDX_ATAPI_IO1_SZ sizeof(ATAPI_REGISTERS_1)
505 #define IDX_ATAPI_IO1_i_Data (FIELD_OFFSET(ATAPI_REGISTERS_1, i.Data )+IDX_ATAPI_IO1)
506 #define IDX_ATAPI_IO1_i_Error (FIELD_OFFSET(ATAPI_REGISTERS_1, i.Error )+IDX_ATAPI_IO1)
507 #define IDX_ATAPI_IO1_i_InterruptReason (FIELD_OFFSET(ATAPI_REGISTERS_1, i.InterruptReason)+IDX_ATAPI_IO1)
508 #define IDX_ATAPI_IO1_i_Unused1 (FIELD_OFFSET(ATAPI_REGISTERS_1, i.Unused1 )+IDX_ATAPI_IO1)
509 #define IDX_ATAPI_IO1_i_ByteCountLow (FIELD_OFFSET(ATAPI_REGISTERS_1, i.ByteCountLow )+IDX_ATAPI_IO1)
510 #define IDX_ATAPI_IO1_i_ByteCountHigh (FIELD_OFFSET(ATAPI_REGISTERS_1, i.ByteCountHigh )+IDX_ATAPI_IO1)
511 #define IDX_ATAPI_IO1_i_DriveSelect (FIELD_OFFSET(ATAPI_REGISTERS_1, i.DriveSelect )+IDX_ATAPI_IO1)
512 #define IDX_ATAPI_IO1_i_Status (FIELD_OFFSET(ATAPI_REGISTERS_1, i.Status )+IDX_ATAPI_IO1)
514 #define IDX_ATAPI_IO1_o_Data (FIELD_OFFSET(ATAPI_REGISTERS_1, o.Data )+IDX_ATAPI_IO1)
515 #define IDX_ATAPI_IO1_o_Feature (FIELD_OFFSET(ATAPI_REGISTERS_1, o.Feature )+IDX_ATAPI_IO1)
516 #define IDX_ATAPI_IO1_o_Unused0 (FIELD_OFFSET(ATAPI_REGISTERS_1, o.Unused0 )+IDX_ATAPI_IO1)
517 #define IDX_ATAPI_IO1_o_Unused1 (FIELD_OFFSET(ATAPI_REGISTERS_1, o.Unused1 )+IDX_ATAPI_IO1)
518 #define IDX_ATAPI_IO1_o_ByteCountLow (FIELD_OFFSET(ATAPI_REGISTERS_1, o.ByteCountLow )+IDX_ATAPI_IO1)
519 #define IDX_ATAPI_IO1_o_ByteCountHigh (FIELD_OFFSET(ATAPI_REGISTERS_1, o.ByteCountHigh)+IDX_ATAPI_IO1)
520 #define IDX_ATAPI_IO1_o_DriveSelect (FIELD_OFFSET(ATAPI_REGISTERS_1, o.DriveSelect )+IDX_ATAPI_IO1)
521 #define IDX_ATAPI_IO1_o_Command (FIELD_OFFSET(ATAPI_REGISTERS_1, o.Command )+IDX_ATAPI_IO1)
524 typedef union _ATAPI_REGISTERS_2 {
530 //IDE_REGISTERS_2 ide;
532 } ATAPI_REGISTERS_2, *PATAPI_REGISTERS_2;
534 #define IDX_ATAPI_IO2 IDX_ATAPI_IO2_SZ
535 #define IDX_ATAPI_IO2_SZ sizeof(ATAPI_REGISTERS_2)
539 // ATAPI interrupt reasons
542 // for IDX_ATAPI_IO1_i_InterruptReason
543 #define ATAPI_IR_COD 0x01
544 #define ATAPI_IR_COD_Data 0x0
545 #define ATAPI_IR_COD_Cmd 0x1
547 #define ATAPI_IR_IO 0x02
548 #define ATAPI_IR_IO_toDev 0x00
549 #define ATAPI_IR_IO_toHost 0x02
551 #define ATAPI_IR_Mask 0x03
557 #define ATA_F_DMA 0x01 /* enable DMA */
558 #define ATA_F_OVL 0x02 /* enable overlap */
559 #define ATA_F_DMAREAD 0x04 /* DMA Packet (ATAPI) read */
561 #define ATA_C_F_SETXFER 0x03 /* set transfer mode */
563 #define ATA_C_F_ENAB_WCACHE 0x02 /* enable write cache */
564 #define ATA_C_F_DIS_WCACHE 0x82 /* disable write cache */
566 #define ATA_C_F_ENAB_RCACHE 0xaa /* enable readahead cache */
567 #define ATA_C_F_DIS_RCACHE 0x55 /* disable readahead cache */
569 #define ATA_C_F_ENAB_RELIRQ 0x5d /* enable release interrupt */
570 #define ATA_C_F_DIS_RELIRQ 0xdd /* disable release interrupt */
572 #define ATA_C_F_ENAB_SRVIRQ 0x5e /* enable service interrupt */
573 #define ATA_C_F_DIS_SRVIRQ 0xde /* disable service interrupt */
575 #define ATA_C_F_ENAB_MEDIASTAT 0x95 /* enable media status */
576 #define ATA_C_F_DIS_MEDIASTAT 0x31 /* disable media status */
578 #define ATA_C_F_ENAB_APM 0x05 /* enable advanced power management */
579 #define ATA_C_F_DIS_APM 0x85 /* disable advanced power management */
580 #define ATA_C_F_APM_CNT_MAX_PERF 0xfe /* maximum performance */
581 #define ATA_C_F_APM_CNT_MIN_NO_STANDBY 0x80 /* min. power w/o standby */
582 #define ATA_C_F_APM_CNT_MIN_STANDBY 0x01 /* min. power with standby */
584 #define ATA_C_F_ENAB_ACOUSTIC 0x42 /* enable acoustic management */
585 #define ATA_C_F_DIS_ACOUSTIC 0xc2 /* disable acoustic management */
586 #define ATA_C_F_AAM_CNT_MAX_PERF 0xfe /* maximum performance */
587 #define ATA_C_F_AAM_CNT_MAX_POWER_SAVE 0x80 /* min. power */
589 // New SMART Feature definitions
590 #ifndef READ_LOG_SECTOR
591 #define READ_LOG_SECTOR 0xD5
592 #define WRITE_LOG_SECTOR 0xD6
593 #define WRITE_THRESHOLDS 0xD7
594 #define AUTO_OFFLINE 0xDB
595 #endif // READ_LOG_SECTOR
598 // ATAPI interrupt reasons
601 #define ATA_I_CMD 0x01 /* cmd (1) | data (0) */
602 #define ATA_I_IN 0x02 /* read (1) | write (0) */
603 #define ATA_I_RELEASE 0x04 /* released bus (1) */
604 #define ATA_I_TAGMASK 0xf8 /* tag mask */
609 typedef struct _IDENTIFY_DATA
{
610 UCHAR AtapiCmdSize
:2; // 00 00
611 #define ATAPI_PSIZE_12 0 /* 12 bytes */
612 #define ATAPI_PSIZE_16 1 /* 16 bytes */
614 UCHAR DrqType
:2; // 00 00
615 #define ATAPI_DRQT_MPROC 0 /* cpu 3 ms delay */
616 #define ATAPI_DRQT_INTR 1 /* intr 10 ms delay */
617 #define ATAPI_DRQT_ACCEL 2 /* accel 50 us delay */
621 #define ATAPI_TYPE_DIRECT 0 /* disk/floppy */
622 #define ATAPI_TYPE_TAPE 1 /* streaming tape */
623 #define ATAPI_TYPE_CDROM 5 /* CD-ROM device */
624 #define ATAPI_TYPE_OPTICAL 7 /* optical disk */
626 UCHAR CmdProtocol
:2; // 00 00
627 #define ATAPI_PROTO_ATAPI 2
628 // USHORT GeneralConfiguration; // 00 00
630 USHORT NumberOfCylinders
; // 02 1
631 USHORT Reserved1
; // 04 2
632 USHORT NumberOfHeads
; // 06 3
633 USHORT UnformattedBytesPerTrack
; // 08 4 // Now obsolete
634 USHORT UnformattedBytesPerSector
; // 0A 5 // Now obsolete
635 USHORT SectorsPerTrack
; // 0C 6
637 USHORT VendorUnique1
[3]; // 0E 7-9
638 UCHAR SerialNumber
[20]; // 14 10-19
640 USHORT BufferType
; // 28 20
641 #define ATA_BT_SINGLEPORTSECTOR 1 /* 1 port, 1 sector buffer */
642 #define ATA_BT_DUALPORTMULTI 2 /* 2 port, mult sector buffer */
643 #define ATA_BT_DUALPORTMULTICACHE 3 /* above plus track cache */
645 USHORT BufferSectorSize
; // 2A 21
646 USHORT NumberOfEccBytes
; // 2C 22
647 USHORT FirmwareRevision
[4]; // 2E 23-26
648 USHORT ModelNumber
[20]; // 36 27-46
649 UCHAR MaximumBlockTransfer
; // 5E 47
650 UCHAR VendorUnique2
; // 5F
652 USHORT DoubleWordIo
; // 60 48
654 USHORT Reserved62_0
:8; // 62 49
657 USHORT DisableIordy
:1;
658 USHORT SupportIordy
:1;
660 USHORT StandbyOverlap
:1;
661 USHORT SupportQTag
:1; /* supports queuing overlap */
662 USHORT SupportIDma
:1; /* interleaved DMA supported */
664 /* USHORT Capabilities; // 62 49
665 #define IDENTIFY_CAPABILITIES_SUPPORT_DMA 0x0100
666 #define IDENTIFY_CAPABILITIES_SUPPORT_LBA 0x0200
667 #define IDENTIFY_CAPABILITIES_DISABLE_IORDY 0x0400
668 #define IDENTIFY_CAPABILITIES_SUPPORT_IORDY 0x0800
669 #define IDENTIFY_CAPABILITIES_SOFT_RESET 0x1000
670 #define IDENTIFY_CAPABILITIES_STDBY_OVLP 0x2000
671 #define IDENTIFY_CAPABILITIES_SUPPORT_QTAG 0x4000
672 #define IDENTIFY_CAPABILITIES_SUPPORT_IDMA 0x8000*/
674 USHORT DeviceStandbyMin
:1; // 64 50
675 USHORT Reserved50_1
:13;
676 USHORT DeviceCapability1
:1;
677 USHORT DeviceCapability0
:1;
680 UCHAR Vendor51
; // 66 51
681 UCHAR PioCycleTimingMode
; // 67
683 UCHAR Vendor52
; // 68 52
684 UCHAR DmaCycleTimingMode
; // 69
686 USHORT TranslationFieldsValid
:1; // 6A 53 /* 54-58 */
687 USHORT PioTimingsValid
:1; /* 64-70 */
688 USHORT UdmaModesValid
:1; /* 88 */
691 USHORT NumberOfCurrentCylinders
; // 6C 54 \-
692 USHORT NumberOfCurrentHeads
; // 6E 55 \-
693 USHORT CurrentSectorsPerTrack
; // 70 56 /- obsolete USHORT[5]
694 ULONG CurrentSectorCapacity
; // 72 57-58 /-
696 USHORT CurrentMultiSector
:8; // 59
697 USHORT CurrentMultiSectorValid
:1;
698 USHORT Reserved59_9_11
:3;
699 USHORT SanitizeSupported
:1;
700 USHORT CryptoScrambleExtSupported
:1;
701 USHORT OverwriteExtSupported
:1;
702 USHORT BlockEraseExtSupported
:1;
704 ULONG UserAddressableSectors
; // 60-61
708 USHORT SingleWordDMASupport
: 8; // 62 ATA, obsolete
709 USHORT SingleWordDMAActive
: 8; //
712 USHORT UDMASupport
: 7; // 62 ATAPI
713 USHORT MultiWordDMASupport
: 3;
714 USHORT DMASupport
: 1;
715 USHORT Reseved62_11_14
: 4;
716 USHORT DMADirRequired
: 1;
720 USHORT MultiWordDMASupport
: 8; // 63
721 USHORT MultiWordDMAActive
: 8;
723 USHORT AdvancedPIOModes
: 8; // 64
724 USHORT Reserved4
: 8;
726 #define AdvancedPIOModes_3 1
727 #define AdvancedPIOModes_4 2
728 #define AdvancedPIOModes_5 4 // non-standard
730 USHORT MinimumMWXferCycleTime
; // 65
731 USHORT RecommendedMWXferCycleTime
; // 66
732 USHORT MinimumPIOCycleTime
; // 67
733 USHORT MinimumPIOCycleTimeIORDY
; // 68
735 USHORT Reserved69_0_4
:5; // 69
736 USHORT ReadZeroAfterTrim
:1;
737 USHORT Lba28Support
:1;
738 USHORT Reserved69_7_IEEE1667
:1;
739 USHORT MicrocodeDownloadDMA
:1;
741 USHORT WriteBufferDMA
:1;
742 USHORT ReadBufferDMA
:1;
743 USHORT DevConfigDMA
:1;
744 USHORT LongSectorErrorReporting
:1;
745 USHORT DeterministicReadAfterTrim
:1;
746 USHORT CFastSupport
:1;
748 USHORT Reserved70
; // 70
749 USHORT ReleaseTimeOverlapped
; // 71
750 USHORT ReleaseTimeServiceCommand
; // 72
751 USHORT Reserved73_74
[2]; // 73-74
753 USHORT QueueLength
: 5; // 75
754 USHORT Reserved75_6
: 11;
756 USHORT SataCapabilities
; // 76
757 #define ATA_SATA_GEN1 0x0002
758 #define ATA_SATA_GEN2 0x0004
759 #define ATA_SATA_GEN3 0x0008
760 #define ATA_SUPPORT_NCQ 0x0100
761 #define ATA_SUPPORT_IFPWRMNGTRCV 0x0200
762 #define ATA_SUPPORT_PHY_EVENT_COUNTER 0x0400
763 #define ATA_SUPPORT_NCQ_UNLOAD 0x0800
764 #define ATA_SUPPORT_NCQ_PRI_INFO 0x1000
766 USHORT Reserved77
; // 77
768 USHORT SataSupport
; // 78
769 #define ATA_SUPPORT_NONZERO 0x0002
770 #define ATA_SUPPORT_AUTOACTIVATE 0x0004
771 #define ATA_SUPPORT_IFPWRMNGT 0x0008
772 #define ATA_SUPPORT_INORDERDATA 0x0010
774 USHORT SataEnable
; // 79
775 USHORT MajorRevision
; // 80
776 USHORT MinorRevision
; // 81
778 #define ATA_VER_MJ_ATA4 0x0010
779 #define ATA_VER_MJ_ATA5 0x0020
780 #define ATA_VER_MJ_ATA6 0x0040
781 #define ATA_VER_MJ_ATA7 0x0080
782 #define ATA_VER_MJ_ATA8_ASC 0x0100
785 USHORT Smart
:1; // 82/85
796 USHORT Reserved_82_11
:1;
797 USHORT WriteBuffer
:1;
800 USHORT Reserved_82_15
:1;
802 USHORT Microcode
:1; // 83/86
809 USHORT Reserver_83_7
:1;
810 USHORT MaxSecurity
:1; //
811 USHORT AutoAcoustic
:1; //
812 USHORT Address48
:1; //
813 USHORT ConfigOverlay
:1; //
814 USHORT FlushCache
:1; //
815 USHORT FlushCache48
:1; //
816 USHORT SupportOne
:1; //
817 USHORT SupportZero
:1; //
819 USHORT SmartErrorLog
:1; // 84/87
820 USHORT SmartSelfTest
:1;
821 USHORT MediaSerialNo
:1;
822 USHORT MediaCardPass
:1;
825 USHORT Reserver_84_6
:8;
826 USHORT ExtendedOne
:1; //
827 USHORT ExtendedZero
:1; //
828 } FeaturesSupport
, FeaturesEnabled
;
830 USHORT UltraDMASupport
: 8; // 88
831 USHORT UltraDMAActive
: 8;
833 USHORT EraseTime
; // 89
834 USHORT EnhancedEraseTime
; // 90
835 USHORT CurentAPMLevel
; // 91
837 USHORT MasterPasswdRevision
; // 92
839 USHORT HwResMaster
: 8; // 93
840 USHORT HwResSlave
: 5;
841 USHORT HwResCableId
: 1;
842 USHORT HwResValid
: 2;
844 #define IDENTIFY_CABLE_ID_VALID 0x01
846 USHORT CurrentAcoustic
: 8; // 94
847 USHORT VendorAcoustic
: 8;
849 USHORT StreamMinReqSize
; // 95
850 USHORT StreamTransferTime
; // 96
851 USHORT StreamAccessLatency
; // 97
852 ULONG StreamGranularity
; // 98-99
854 ULONGLONG UserAddressableSectors48
; // 100-103
856 USHORT StreamingTransferTimePIO
; // 104
857 USHORT MaxLBARangeDescBlockCount
; // 105 // in 512b blocks
859 USHORT PhysLogSectorSize
; // 106
862 USHORT PLSS_Reserved
:8;
863 USHORT PLSS_LargeL
:1; // =1 if 117-118 are valid
864 USHORT PLSS_LargeP
:1;
865 USHORT PLSS_Signature
:2; // = 0x01 = 01b
868 USHORT InterSeekDelay
; // 107
869 USHORT WorldWideName
[4]; // 108-111
870 USHORT Reserved112
[5]; // 112-116
872 ULONG LargeSectorSize
; // 117-118
876 } CommandFeatureSetSupport
, CommandFeatureSetEnabled
; // 119-120
877 USHORT Reserved121
[4]; // 121-124
878 USHORT AtapiByteCount0
; // 125
879 USHORT Reserved126
; // 126
881 USHORT RemovableStatus
; // 127
883 USHORT SecurityStatus
; // 128
889 USHORT CountExpired
:1;
890 USHORT EnhancedEraseSupport
:1;
891 USHORT Reserved7_8
:2;
892 USHORT MasterPasswdCap
:1; // 0 - high, 1 - max
893 USHORT Reserved9_15
:7;
897 USHORT Reserved129
[31]; // 129-159
898 USHORT CfAdvPowerMode
; // 160
899 USHORT Reserved161
[7]; // 161-167
900 USHORT DeviceNominalFormFactor
:4; // 168
901 USHORT Reserved168_4_15
:12;
902 USHORT DataSetManagementSupported
:1; // 169
903 USHORT Reserved169_1_15
:15;
904 USHORT AdditionalProdNum
[4]; // 170-173
905 USHORT Reserved174
[2]; // 174-175
906 USHORT MediaSerial
[30]; // 176-205
910 USHORT SCT_Supported
:1;
912 USHORT SCT_WriteSame
:1;
913 USHORT SCT_ErrorRecovery
:1;
914 USHORT SCT_Feature
:1;
915 USHORT SCT_DataTables
:1;
916 USHORT Reserved_6_15
:10;
919 USHORT Reserved_CE_ATA
[2]; // 207-208
920 USHORT LogicalSectorOffset
:14; // 209
921 USHORT Reserved209_14_One
:1;
922 USHORT Reserved209_15_Zero
:1;
924 USHORT WriteReadVerify_CountMode2
[2]; // 210-211
925 USHORT WriteReadVerify_CountMode3
[2]; // 212-213
927 USHORT NVCache_PM_Supported
:1; // 214
928 USHORT NVCache_PM_Enabled
:1;
929 USHORT NVCache_Reserved_2_3
:2;
930 USHORT NVCache_Enabled
:1;
931 USHORT NVCache_Reserved_5_7
:3;
932 USHORT NVCache_PM_Version
:4;
933 USHORT NVCache_Version
:4;
935 USHORT NVCache_Size_LogicalBlocks
[2]; // 215-216
936 USHORT NominalMediaRotationRate
; // 217
937 USHORT Reserved218
; // 218
938 USHORT NVCache_DeviceSpinUpTime
:8; // 219
939 USHORT NVCache_Reserved219_8_15
:8;
941 USHORT WriteReadVerify_CurrentMode
:8; // 220
942 USHORT WriteReadVerify_Reserved220_8_15
:8;
944 USHORT Reserved221
; // 221
947 USHORT VersionFlags
:12;
948 USHORT TransportType
:4;
966 USHORT TransportMinor
; // 223
968 USHORT Reserved224
[10]; // 224-233
970 USHORT MinBlocks_MicrocodeDownload_Mode3
; // 234
971 USHORT MaxBlocks_MicrocodeDownload_Mode3
; // 235
973 USHORT Reserved236
[19]; // 236-254
976 USHORT Integrity
; // 255
978 #define ATA_ChecksumValid 0xA5
979 USHORT ChecksumValid
:8;
983 } IDENTIFY_DATA
, *PIDENTIFY_DATA
;
986 // Identify data without the Reserved4.
989 #define IDENTIFY_DATA2 IDENTIFY_DATA
990 #define PIDENTIFY_DATA2 PIDENTIFY_DATA
992 /*typedef struct _IDENTIFY_DATA2 {
993 UCHAR AtapiCmdSize:2; // 00 00
995 UCHAR DrqType:2; // 00 00
1000 UCHAR CmdProtocol:2; // 00 00
1001 // USHORT GeneralConfiguration; // 00
1003 USHORT NumberOfCylinders; // 02
1004 USHORT Reserved1; // 04
1005 USHORT NumberOfHeads; // 06
1006 USHORT UnformattedBytesPerTrack; // 08
1007 USHORT UnformattedBytesPerSector; // 0A
1008 USHORT SectorsPerTrack; // 0C
1009 USHORT VendorUnique1[3]; // 0E
1010 UCHAR SerialNumber[20]; // 14
1011 USHORT BufferType; // 28
1012 USHORT BufferSectorSize; // 2A
1013 USHORT NumberOfEccBytes; // 2C
1014 USHORT FirmwareRevision[4]; // 2E
1015 USHORT ModelNumber[20]; // 36
1016 UCHAR MaximumBlockTransfer; // 5E
1017 UCHAR VendorUnique2; // 5F
1018 USHORT DoubleWordIo; // 60
1019 USHORT Capabilities; // 62
1020 USHORT Reserved2; // 64
1021 UCHAR VendorUnique3; // 66
1022 UCHAR PioCycleTimingMode; // 67
1023 UCHAR VendorUnique4; // 68
1024 UCHAR DmaCycleTimingMode; // 69
1025 USHORT TranslationFieldsValid:1; // 6A
1026 USHORT Reserved3:15;
1027 USHORT NumberOfCurrentCylinders; // 6C
1028 USHORT NumberOfCurrentHeads; // 6E
1029 USHORT CurrentSectorsPerTrack; // 70
1030 ULONG CurrentSectorCapacity; // 72
1031 } IDENTIFY_DATA2, *PIDENTIFY_DATA2;*/
1033 #define IDENTIFY_DATA_SIZE sizeof(IDENTIFY_DATA)
1036 // IDENTIFY DMA timing cycle modes.
1037 #define IDENTIFY_DMA_CYCLES_MODE_0 0x00
1038 #define IDENTIFY_DMA_CYCLES_MODE_1 0x01
1039 #define IDENTIFY_DMA_CYCLES_MODE_2 0x02
1041 // for IDE_COMMAND_DATA_SET_MGMT
1042 typedef struct _TRIM_DATA
{
1044 ULONGLONG BlockCount
:16;
1045 } TRIM_DATA
, *PTRIM_DATA
;
1048 #define PCI_DEV_HW_SPEC(idhi, idlo) \
1049 { #idlo, 4, #idhi, 4}
1051 typedef struct _BROKEN_CONTROLLER_INFORMATION {
1053 ULONG VendorIdLength;
1055 ULONG DeviceIdLength;
1056 }BROKEN_CONTROLLER_INFORMATION, *PBROKEN_CONTROLLER_INFORMATION;
1058 BROKEN_CONTROLLER_INFORMATION const BrokenAdapters[] = {
1059 // CMD 640 ATA controller !WARNING! buggy chip data loss possible
1060 PCI_DEV_HW_SPEC( 0640, 1095 ), //{ "1095", 4, "0640", 4},
1062 PCI_DEV_HW_SPEC( 0601, 1039 ), //{ "1039", 4, "0601", 4}
1063 // RZ 100? ATA controller !WARNING! buggy chip data loss possible
1064 PCI_DEV_HW_SPEC( 1000, 1042 ),
1065 PCI_DEV_HW_SPEC( 1001, 1042 )
1068 #define BROKEN_ADAPTERS (sizeof(BrokenAdapters) / sizeof(BROKEN_CONTROLLER_INFORMATION))
1070 typedef struct _NATIVE_MODE_CONTROLLER_INFORMATION {
1072 ULONG VendorIdLength;
1074 ULONG DeviceIdLength;
1075 }NATIVE_MODE_CONTROLLER_INFORMATION, *PNATIVE_MODE_CONTROLLER_INFORMATION;
1077 NATIVE_MODE_CONTROLLER_INFORMATION const NativeModeAdapters[] = {
1078 PCI_DEV_HW_SPEC( 0105, 10ad ) //{ "10ad", 4, "0105", 4}
1081 #define NUM_NATIVE_MODE_ADAPTERS (sizeof(NativeModeAdapters) / sizeof(NATIVE_MODE_CONTROLLER_INFORMATION))
1084 // Beautification macros
1089 #define GetStatus(chan, Status) \
1090 Status = AtapiReadPort1(chan, IDX_IO2_AltStatus);
1092 #define GetBaseStatus(chan, pStatus) \
1093 pStatus = AtapiReadPort1(chan, IDX_IO1_i_Status);
1095 #define WriteCommand(chan, _Command) \
1096 AtapiWritePort1(chan, IDX_IO1_o_Command, _Command);
1099 #define SelectDrive(chan, unit) { \
1100 if(chan && chan->lun[unit] && chan->lun[unit]->DeviceFlags & DFLAGS_ATAPI_CHANGER) KdPrint3((" Select %d\n", unit)); \
1101 AtapiWritePort1(chan, IDX_IO1_o_DriveSelect, (unit) ? IDE_DRIVE_SELECT_2 : IDE_DRIVE_SELECT_1); \
1105 #define ReadBuffer(chan, Buffer, Count, timing) \
1106 AtapiReadBuffer2(chan, IDX_IO1_i_Data, \
1111 #define WriteBuffer(chan, Buffer, Count, timing) \
1112 AtapiWriteBuffer2(chan, IDX_IO1_o_Data, \
1117 #define ReadBuffer2(chan, Buffer, Count, timing) \
1118 AtapiReadBuffer4(chan, IDX_IO1_i_Data, \
1123 #define WriteBuffer2(chan, Buffer, Count, timing) \
1124 AtapiWriteBuffer4(chan, IDX_IO1_o_Data, \
1132 IN
struct _HW_CHANNEL
* chan
,
1133 IN ULONG DeviceNumber
1139 IN
struct _HW_CHANNEL
* chan
/*,
1140 PIDE_REGISTERS_2 BaseIoAddress*/
1146 IN
struct _HW_CHANNEL
* chan
/*,
1147 PIDE_REGISTERS_2 BaseIoAddress*/
1153 IN
struct _HW_CHANNEL
* chan
/*,
1154 PIDE_REGISTERS_1 BaseIoAddress*/
1160 IN
struct _HW_CHANNEL
* chan
/*,
1161 PIDE_REGISTERS_1 BaseIoAddress*/
1167 IN
struct _HW_CHANNEL
* chan
/*,
1168 PIDE_REGISTERS_2 BaseIoAddress*/
1174 IN
struct _HW_CHANNEL
* chan
/*,
1175 PIDE_REGISTERS_2 BaseIoAddress*/
1181 IN
struct _HW_CHANNEL
* chan
,/*
1182 PIDE_REGISTERS_1 BaseIoAddress*/
1183 IN ULONG DeviceNumber
1189 IN
struct _HW_CHANNEL
* chan
,
1190 IN BOOLEAN DisableInterrupts
,
1197 #define IS_RDP(OperationCode)\
1198 ((OperationCode == SCSIOP_ERASE)||\
1199 (OperationCode == SCSIOP_LOAD_UNLOAD)||\
1200 (OperationCode == SCSIOP_LOCATE)||\
1201 (OperationCode == SCSIOP_REWIND) ||\
1202 (OperationCode == SCSIOP_SPACE)||\
1203 (OperationCode == SCSIOP_SEEK)||\
1204 /* (OperationCode == SCSIOP_FORMAT_UNIT)||\
1205 (OperationCode == SCSIOP_BLANK)||*/ \
1206 (OperationCode == SCSIOP_WRITE_FILEMARKS))
1212 BuildMechanismStatusSrb (
1213 IN PVOID HwDeviceExtension
,
1214 IN PSCSI_REQUEST_BLOCK Srb
1219 BuildRequestSenseSrb (
1220 IN PVOID HwDeviceExtension
,
1221 IN PSCSI_REQUEST_BLOCK Srb
1226 AtapiHwInitializeChanger (
1227 IN PVOID HwDeviceExtension
,
1229 IN PMECHANICAL_STATUS_INFORMATION_HEADER MechanismStatus
1235 IN PVOID HwDeviceExtension
,
1236 IN PSCSI_REQUEST_BLOCK Srb
,
1243 IN PVOID HwDeviceExtension
,
1244 IN PSCSI_REQUEST_BLOCK Srb
,
1248 #define AtapiCopyMemory RtlCopyMemory
1257 #define AtapiStringCmp(s1, s2, n) _strnicmp(s1, s2, n)
1262 IN PVOID HwDeviceExtension
1268 IN PVOID HwDeviceExtension
,
1274 AtapiCheckInterrupt__(
1275 IN PVOID HwDeviceExtension
,
1279 #define INTERRUPT_REASON_IGNORE 0
1280 #define INTERRUPT_REASON_OUR 1
1281 #define INTERRUPT_REASON_UNEXPECTED 2
1286 IN PVOID HwDeviceExtension
1291 IdeBuildSenseBuffer(
1292 IN PVOID HwDeviceExtension
,
1293 IN PSCSI_REQUEST_BLOCK Srb
1300 IN PVOID HwDeviceExtension
,
1302 IN ULONG DeviceNumber
1307 AtapiFindIsaController(
1308 IN PVOID HwDeviceExtension
,
1310 IN PVOID BusInformation
,
1311 IN PCHAR ArgumentString
,
1312 IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
1318 AtapiReadArgumentString(
1319 IN PVOID HwDeviceExtension
,
1321 IN PVOID BusInformation
,
1322 IN PCHAR ArgumentString
,
1323 IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo
,
1329 AtapiParseArgumentString(
1337 IN PVOID HwDeviceExtension
,
1338 IN ULONG DeviceNumber
,
1347 IN PVOID HwDeviceExtension
,
1348 IN ULONG DeviceNumber
,
1355 IN PVOID HwDeviceExtension
,
1357 IN ULONG deviceNumber
,
1361 #define UNIATA_FIND_DEV_UNHIDE 0x01
1366 IN PVOID HwDeviceExtension
,
1375 #endif //__cplusplus
1381 AtapiResetController(
1382 IN PVOID HwDeviceExtension
,
1389 IN PVOID HwDeviceExtension
,
1390 IN PSCSI_REQUEST_BLOCK Srb
1396 IN PVOID HwDeviceExtension
,
1397 IN PSCSI_REQUEST_BLOCK Srb
,
1404 // IN PVOID HwDeviceExtension,
1405 IN
struct _HW_DEVICE_EXTENSION
* deviceExtension
,
1406 IN ULONG DeviceNumber
,
1418 // IN PVOID HwDeviceExtension,
1419 IN
struct _HW_DEVICE_EXTENSION
* deviceExtension
,
1420 IN ULONG DeviceNumber
,
1433 AtaPioMode(PIDENTIFY_DATA2 ident
);
1437 AtaWmode(PIDENTIFY_DATA2 ident
);
1441 AtaUmode(PIDENTIFY_DATA2 ident
);
1447 IN PVOID DeferredContext
,
1448 IN PVOID SystemArgument1
,
1449 IN PVOID SystemArgument2
1452 //#define AtaCommand(de, devn, chan, cmd, cyl, hd, sec, cnt, feat, flg)
1456 AtaPio2Mode(LONG pio
);
1460 AtaPioMode(PIDENTIFY_DATA2 ident
);
1464 AtapiEnableInterrupts(
1465 IN PVOID HwDeviceExtension
,
1471 AtapiDisableInterrupts(
1472 IN PVOID HwDeviceExtension
,
1477 UniataExpectChannelInterrupt(
1478 IN
struct _HW_CHANNEL
* chan
,
1479 IN BOOLEAN Expecting
1482 #define CHAN_NOT_SPECIFIED (0xffffffffL)
1483 #define CHAN_NOT_SPECIFIED_CHECK_CABLE (0xfffffffeL)
1484 #define DEVNUM_NOT_SPECIFIED (0xffffffffL)
1485 #define IOMODE_NOT_SPECIFIED (0xffffffffL)
1489 AtapiRegCheckDevValue(
1490 IN PVOID HwDeviceExtension
,
1499 AtapiRegCheckParameterValue(
1500 IN PVOID HwDeviceExtension
,
1501 IN PCWSTR PathSuffix
,
1506 extern ULONG g_LogToDisplay
;
1519 IN
struct _HW_DEVICE_EXTENSION
* deviceExtension
,
1520 IN
struct _IDE_BUSMASTER_REGISTERS
* BaseIoAddressBM_0
,
1527 IN
struct _HW_CHANNEL
* chan
,
1528 IN PIDE_REGISTERS_1 BaseIoAddress1
,
1529 IN PIDE_REGISTERS_2 BaseIoAddress2
1534 UniataInitSyncBaseIO(
1535 IN
struct _HW_CHANNEL
* chan
1540 IN
struct _HW_CHANNEL
* chan
,
1549 IN
struct _IORES
* IoRes
,
1558 IN
struct _HW_DEVICE_EXTENSION
* deviceExtension
,
1565 IN
struct _HW_CHANNEL
* chan
1578 UniAtaCalculateLBARegsBack(
1579 struct _HW_LU_EXTENSION
* LunExt
,
1586 IN PVOID HwDeviceExtension
,
1588 IN ULONG deviceNumber
1593 #define ATA_AT_HOME_HDD 0x01
1594 #define ATA_AT_HOME_ATAPI 0x02
1595 #define ATA_AT_HOME_XXX 0x04
1596 #define ATA_AT_HOME_NOBODY 0x00
1598 #define ATA_CMD_FLAG_LBAIOsupp 0x01
1599 #define ATA_CMD_FLAG_48supp 0x02
1600 #define ATA_CMD_FLAG_48 0x04
1601 #define ATA_CMD_FLAG_DMA 0x08
1602 #define ATA_CMD_FLAG_FUA 0x10
1603 #define ATA_CMD_FLAG_In 0x40
1604 #define ATA_CMD_FLAG_Out 0x80
1607 We need LBA48 when requested LBA or BlockCount are too large.
1608 But for LBA-based commands we have *special* limitation
1610 #define UniAta_need_lba48(command, lba, count, supp48) \
1611 ( ((AtaCommandFlags[command] & ATA_CMD_FLAG_LBAIOsupp) && (supp48) && (((lba+count) >= ATA_MAX_IOLBA28) || (count > 256)) ) || \
1612 (lba > ATA_MAX_LBA28) || (count > 255) )
1616 #define UniAtaClearAtaReq(AtaReq) \
1618 RtlZeroMemory((PCHAR)(AtaReq), FIELD_OFFSET(ATA_REQ, ata)); \
1621 extern UCHAR
const AtaCommands48
[256];
1622 extern UCHAR
const AtaCommandFlags
[256];
1624 //#define ATAPI_DEVICE(de, ldev) (de->lun[ldev].DeviceFlags & DFLAGS_ATAPI_DEVICE)
1625 #define ATAPI_DEVICE(chan, dev) ((chan->lun[dev]->DeviceFlags & DFLAGS_ATAPI_DEVICE) ? TRUE : FALSE)
1628 #define PrintNtConsole _PrintNtConsole
1630 #define PrintNtConsole(x) {;}
1638 PIDENTIFY_DATA ident
1641 return (ident
->SataCapabilities
&& ident
->SataCapabilities
!= 0xffff);
1642 } // end ata_is_sata()
1644 #define IDENT_MODE_MAX FALSE
1645 #define IDENT_MODE_ACTIVE TRUE
1649 ata_cur_mode_from_ident(
1650 PIDENTIFY_DATA ident
,
1655 if(ata_is_sata(ident
)) {
1656 if(ident
->SataCapabilities
& ATA_SATA_GEN3
) {
1659 if(ident
->SataCapabilities
& ATA_SATA_GEN2
) {
1662 if(ident
->SataCapabilities
& ATA_SATA_GEN1
) {
1668 if (ident
->UdmaModesValid
) {
1669 mode
= Active
? ident
->UltraDMAActive
: ident
->UltraDMASupport
;
1686 mode
= Active
? ident
->MultiWordDMAActive
: ident
->MultiWordDMASupport
;
1687 if (ident
->MultiWordDMAActive
& 0x04)
1689 if (ident
->MultiWordDMAActive
& 0x02)
1691 if (ident
->MultiWordDMAActive
& 0x01)
1694 mode
= Active
? ident
->SingleWordDMAActive
: ident
->SingleWordDMASupport
;
1695 if (ident
->SingleWordDMAActive
& 0x04)
1697 if (ident
->SingleWordDMAActive
& 0x02)
1699 if (ident
->SingleWordDMAActive
& 0x01)
1702 if (ident
->PioTimingsValid
) {
1703 mode
= ident
->AdvancedPIOModes
;
1704 if (mode
& AdvancedPIOModes_5
)
1706 if (mode
& AdvancedPIOModes_4
)
1708 if (mode
& AdvancedPIOModes_3
)
1711 mode
= ident
->PioCycleTimingMode
;
1712 if (ident
->PioCycleTimingMode
== 2)
1714 if (ident
->PioCycleTimingMode
== 1)
1716 if (ident
->PioCycleTimingMode
== 0)
1720 } // end ata_cur_mode_from_ident()
1724 #endif // __GLOBAL_H__