3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: services/storage/include/scsi.h
6 * PURPOSE: SCSI class driver definitions
7 * PROGRAMMER: Eric Kohl (ekohl@rz-online.de)
10 #ifndef __STORAGE_INCLUDE_SCSI_H
11 #define __STORAGE_INCLUDE_SCSI_H
14 /* Command Descriptor Block */
18 /* Generic 6-Byte CDB */
23 UCHAR CommandUniqueBits:4;
24 UCHAR LogicalUnitNumber:3;
25 UCHAR CommandUniqueBytes[3];
30 } CDB6GENERIC, *PCDB6GENERIC;
32 /* Standard 6-byte CDB */
36 UCHAR LogicalBlockMsb1:5;
37 UCHAR LogicalUnitNumber:3;
38 UCHAR LogicalBlockMsb0;
39 UCHAR LogicalBlockLsb;
42 } CDB6READWRITE, *PCDB6READWRITE;
44 /* SCSI Inquiry CDB */
49 UCHAR LogicalUnitNumber:3;
52 UCHAR AllocationLength;
54 } CDB6INQUIRY, *PCDB6INQUIRY;
60 UCHAR FormatControl:5;
61 UCHAR LogicalUnitNumber:3;
66 } CDB6FORMAT, *PCDB6FORMAT;
68 /* Standard 10-byte CDB */
72 UCHAR RelativeAddress:1;
74 UCHAR ForceUnitAccess:1;
75 UCHAR DisablePageOut:1;
76 UCHAR LogicalUnitNumber:3;
77 UCHAR LogicalBlockByte0;
78 UCHAR LogicalBlockByte1;
79 UCHAR LogicalBlockByte2;
80 UCHAR LogicalBlockByte3;
82 UCHAR TransferBlocksMsb;
83 UCHAR TransferBlocksLsb;
87 /* CD Rom Audio CDBs */
92 UCHAR LogicalUnitNumber:3;
96 } PAUSE_RESUME, *PPAUSE_RESUME;
98 /* Read Table of Contents */
105 UCHAR LogicalUnitNumber:3;
108 UCHAR AllocationLength[2];
111 } READ_TOC, *PREAD_TOC;
113 struct _PLAY_AUDIO_MSF
117 UCHAR LogicalUnitNumber:3;
126 } PLAY_AUDIO_MSF, *PPLAY_AUDIO_MSF;
128 /* Read SubChannel Data */
135 UCHAR LogicalUnitNumber:3;
142 UCHAR AllocationLength[2];
144 } SUBCHANNEL, *PSUBCHANNEL;
146 /* Read CD. Used by Atapi for raw sector reads. */
151 UCHAR ExpectedSectorType:3;
153 UCHAR StartingLBA[4];
154 UCHAR TransferBlocks[3];
158 UCHAR IncludeUserData:1;
160 UCHAR IncludeSyncData:1;
161 UCHAR SubChannelSelection:3;
164 } READ_CD, *PREAD_CD;
166 /* Plextor Read CD-DA */
167 struct _PLXTR_READ_CDDA
171 UCHAR LogicalUnitNumber:3;
172 UCHAR LogicalBlockByte0;
173 UCHAR LogicalBlockByte1;
174 UCHAR LogicalBlockByte2;
175 UCHAR LogicalBlockByte3;
176 UCHAR TransferBlockByte0;
177 UCHAR TransferBlockByte1;
178 UCHAR TransferBlockByte2;
179 UCHAR TransferBlockByte3;
182 } PLXTR_READ_CDDA, *PPLXTR_READ_CDDA;
185 struct _NEC_READ_CDDA
189 UCHAR LogicalBlockByte0;
190 UCHAR LogicalBlockByte1;
191 UCHAR LogicalBlockByte2;
192 UCHAR LogicalBlockByte3;
194 UCHAR TransferBlockByte0;
195 UCHAR TransferBlockByte1;
197 } NEC_READ_CDDA, *PNEC_READ_CDDA;
206 UCHAR LogicalUnitNumber:3;
210 UCHAR AllocationLength;
212 } MODE_SENSE, *PMODE_SENSE;
220 UCHAR LogicalUnitNumber:3;
224 UCHAR AllocationLength[2];
226 } MODE_SENSE10, *PMODE_SENSE10;
235 UCHAR LogicalUnitNumber:3;
237 UCHAR ParameterListLength;
239 } MODE_SELECT, *PMODE_SELECT;
241 struct _MODE_SELECT10
247 UCHAR LogicalUnitNumber:3;
249 UCHAR ParameterListLength[2];
251 } MODE_SELECT10, *PMODE_SELECT10;
260 UCHAR LogicalUnitNumber:3;
262 UCHAR LogicalBlockAddress[4];
274 UCHAR LogicalUnitNumber:3;
279 UCHAR ParameterPointer[2]; /* [0]=MSB, [1]=LSB */
280 UCHAR AllocationLength[2]; /* [0]=MSB, [1]=LSB */
282 } LOGSENSE, *PLOGSENSE;
288 UCHAR LogicalUnitNumber:3;
289 UCHAR TransferLength[3];
297 UCHAR LogicalUnitNumber:3;
298 UCHAR LogicalBlockAddress[4];
309 UCHAR LogicalUnitNumber:3;
319 UCHAR LogicalUnitNumber:3;
325 } START_STOP, *PSTART_STOP;
327 struct _MEDIA_REMOVAL
331 UCHAR LogicalUnitNumber:3;
335 } MEDIA_REMOVAL, *PMEDIA_REMOVAL;
343 UCHAR BlockAddress[3];
347 UCHAR VendorUnique:2;
348 } SEEK_BLOCK, *PSEEK_BLOCK;
350 struct _REQUEST_BLOCK_ADDRESS
354 UCHAR AllocationLength;
358 UCHAR VendorUnique:2;
359 } REQUEST_BLOCK_ADDRESS, *PREQUEST_BLOCK_ADDRESS;
366 UCHAR PartitionSelect:6;
369 } PARTITION, *PPARTITION;
371 struct _WRITE_TAPE_MARKS
375 UCHAR WriteSetMarks:1;
377 UCHAR LogicalUnitNumber:3;
378 UCHAR TransferLength[3];
380 } WRITE_TAPE_MARKS, *PWRITE_TAPE_MARKS;
382 struct _SPACE_TAPE_MARKS
387 UCHAR LogicalUnitNumber:3;
399 UCHAR VendorUnique:2;
402 } SPACE_TAPE_MARKS, *PSPACE_TAPE_MARKS;
404 /* Read tape position */
405 struct _READ_POSITION
413 } READ_POSITION, *PREAD_POSITION;
415 /* ReadWrite for Tape */
416 struct _CDB6READWRITETAPE
419 UCHAR VendorSpecific:5;
421 UCHAR TransferLenMSB;
423 UCHAR TransferLenLSB;
427 UCHAR VendorUnique:2;
428 } CDB6READWRITETAPE, *PCDB6READWRITETAPE;
430 /* Atapi 2.5 Changer 12-byte CDBs */
443 } LOAD_UNLOAD, *PLOAD_UNLOAD;
449 UCHAR AllocationLength[2];
451 } MECH_STATUS, *PMECH_STATUS;
455 /* Command Descriptor Block constants */
457 #define CDB6GENERIC_LENGTH 6
458 #define CDB10GENERIC_LENGTH 10
459 #define CDB12GENERIC_LENGTH 12
465 /* Mode Sense/Select page constants */
467 #define MODE_PAGE_ERROR_RECOVERY 0x01
468 #define MODE_PAGE_DISCONNECT 0x02
469 #define MODE_PAGE_FORMAT_DEVICE 0x03
470 #define MODE_PAGE_RIGID_GEOMETRY 0x04
471 #define MODE_PAGE_FLEXIBILE 0x05
472 #define MODE_PAGE_VERIFY_ERROR 0x07
473 #define MODE_PAGE_CACHING 0x08
474 #define MODE_PAGE_PERIPHERAL 0x09
475 #define MODE_PAGE_CONTROL 0x0A
476 #define MODE_PAGE_MEDIUM_TYPES 0x0B
477 #define MODE_PAGE_NOTCH_PARTITION 0x0C
478 #define MODE_SENSE_RETURN_ALL 0x3f
479 #define MODE_SENSE_CURRENT_VALUES 0x00
480 #define MODE_SENSE_CHANGEABLE_VALUES 0x40
481 #define MODE_SENSE_DEFAULT_VAULES 0x80
482 #define MODE_SENSE_SAVED_VALUES 0xc0
483 #define MODE_PAGE_DEVICE_CONFIG 0x10
484 #define MODE_PAGE_MEDIUM_PARTITION 0x11
485 #define MODE_PAGE_DATA_COMPRESS 0x0f
486 #define MODE_PAGE_CAPABILITIES 0x2A
489 /* SCSI CDB operation codes */
491 #define SCSIOP_TEST_UNIT_READY 0x00
492 #define SCSIOP_REZERO_UNIT 0x01
493 #define SCSIOP_REWIND 0x01
494 #define SCSIOP_REQUEST_BLOCK_ADDR 0x02
495 #define SCSIOP_REQUEST_SENSE 0x03
496 #define SCSIOP_FORMAT_UNIT 0x04
497 #define SCSIOP_READ_BLOCK_LIMITS 0x05
498 #define SCSIOP_REASSIGN_BLOCKS 0x07
499 #define SCSIOP_READ6 0x08
500 #define SCSIOP_RECEIVE 0x08
501 #define SCSIOP_WRITE6 0x0A
502 #define SCSIOP_PRINT 0x0A
503 #define SCSIOP_SEND 0x0A
504 #define SCSIOP_SEEK6 0x0B
505 #define SCSIOP_TRACK_SELECT 0x0B
506 #define SCSIOP_SLEW_PRINT 0x0B
507 #define SCSIOP_SEEK_BLOCK 0x0C
508 #define SCSIOP_PARTITION 0x0D
509 #define SCSIOP_READ_REVERSE 0x0F
510 #define SCSIOP_WRITE_FILEMARKS 0x10
511 #define SCSIOP_FLUSH_BUFFER 0x10
512 #define SCSIOP_SPACE 0x11
513 #define SCSIOP_INQUIRY 0x12
514 #define SCSIOP_VERIFY6 0x13
515 #define SCSIOP_RECOVER_BUF_DATA 0x14
516 #define SCSIOP_MODE_SELECT 0x15
517 #define SCSIOP_RESERVE_UNIT 0x16
518 #define SCSIOP_RELEASE_UNIT 0x17
519 #define SCSIOP_COPY 0x18
520 #define SCSIOP_ERASE 0x19
521 #define SCSIOP_MODE_SENSE 0x1A
522 #define SCSIOP_START_STOP_UNIT 0x1B
523 #define SCSIOP_STOP_PRINT 0x1B
524 #define SCSIOP_LOAD_UNLOAD 0x1B
525 #define SCSIOP_RECEIVE_DIAGNOSTIC 0x1C
526 #define SCSIOP_SEND_DIAGNOSTIC 0x1D
527 #define SCSIOP_MEDIUM_REMOVAL 0x1E
528 #define SCSIOP_READ_CAPACITY 0x25
529 #define SCSIOP_READ 0x28
530 #define SCSIOP_WRITE 0x2A
531 #define SCSIOP_SEEK 0x2B
532 #define SCSIOP_LOCATE 0x2B
533 #define SCSIOP_WRITE_VERIFY 0x2E
534 #define SCSIOP_VERIFY 0x2F
535 #define SCSIOP_SEARCH_DATA_HIGH 0x30
536 #define SCSIOP_SEARCH_DATA_EQUAL 0x31
537 #define SCSIOP_SEARCH_DATA_LOW 0x32
538 #define SCSIOP_SET_LIMITS 0x33
539 #define SCSIOP_READ_POSITION 0x34
540 #define SCSIOP_SYNCHRONIZE_CACHE 0x35
541 #define SCSIOP_COMPARE 0x39
542 #define SCSIOP_COPY_COMPARE 0x3A
543 #define SCSIOP_WRITE_DATA_BUFF 0x3B
544 #define SCSIOP_READ_DATA_BUFF 0x3C
545 #define SCSIOP_CHANGE_DEFINITION 0x40
546 #define SCSIOP_READ_SUB_CHANNEL 0x42
547 #define SCSIOP_READ_TOC 0x43
548 #define SCSIOP_READ_HEADER 0x44
549 #define SCSIOP_PLAY_AUDIO 0x45
550 #define SCSIOP_PLAY_AUDIO_MSF 0x47
551 #define SCSIOP_PLAY_TRACK_INDEX 0x48
552 #define SCSIOP_PLAY_TRACK_RELATIVE 0x49
553 #define SCSIOP_PAUSE_RESUME 0x4B
554 #define SCSIOP_LOG_SELECT 0x4C
555 #define SCSIOP_LOG_SENSE 0x4D
556 #define SCSIOP_MODE_SELECT10 0x55
557 #define SCSIOP_MODE_SENSE10 0x5A
558 #define SCSIOP_LOAD_UNLOAD_SLOT 0xA6
559 #define SCSIOP_MECHANISM_STATUS 0xBD
560 #define SCSIOP_READ_CD 0xBE
563 // If the IMMED bit is 1, status is returned as soon
564 // as the operation is initiated. If the IMMED bit
565 // is 0, status is not returned until the operation
569 #define CDB_RETURN_ON_COMPLETION 0
570 #define CDB_RETURN_IMMEDIATE 1
574 // CDB Force media access used in extended read and write commands.
577 #define CDB_FORCE_MEDIA_ACCESS 0x08
580 // Denon CD ROM operation codes
583 #define SCSIOP_DENON_EJECT_DISC 0xE6
584 #define SCSIOP_DENON_STOP_AUDIO 0xE7
585 #define SCSIOP_DENON_PLAY_AUDIO 0xE8
586 #define SCSIOP_DENON_READ_TOC 0xE9
587 #define SCSIOP_DENON_READ_SUBCODE 0xEB
593 #define SCSIMESS_ABORT 0x06
594 #define SCSIMESS_ABORT_WITH_TAG 0x0D
595 #define SCSIMESS_BUS_DEVICE_RESET 0X0C
596 #define SCSIMESS_CLEAR_QUEUE 0X0E
597 #define SCSIMESS_COMMAND_COMPLETE 0X00
598 #define SCSIMESS_DISCONNECT 0X04
599 #define SCSIMESS_EXTENDED_MESSAGE 0X01
600 #define SCSIMESS_IDENTIFY 0X80
601 #define SCSIMESS_IDENTIFY_WITH_DISCON 0XC0
602 #define SCSIMESS_IGNORE_WIDE_RESIDUE 0X23
603 #define SCSIMESS_INITIATE_RECOVERY 0X0F
604 #define SCSIMESS_INIT_DETECTED_ERROR 0X05
605 #define SCSIMESS_LINK_CMD_COMP 0X0A
606 #define SCSIMESS_LINK_CMD_COMP_W_FLAG 0X0B
607 #define SCSIMESS_MESS_PARITY_ERROR 0X09
608 #define SCSIMESS_MESSAGE_REJECT 0X07
609 #define SCSIMESS_NO_OPERATION 0X08
610 #define SCSIMESS_HEAD_OF_QUEUE_TAG 0X21
611 #define SCSIMESS_ORDERED_QUEUE_TAG 0X22
612 #define SCSIMESS_SIMPLE_QUEUE_TAG 0X20
613 #define SCSIMESS_RELEASE_RECOVERY 0X10
614 #define SCSIMESS_RESTORE_POINTERS 0X03
615 #define SCSIMESS_SAVE_DATA_POINTER 0X02
616 #define SCSIMESS_TERMINATE_IO_PROCESS 0X11
619 // SCSI Extended Message operation codes
622 #define SCSIMESS_MODIFY_DATA_POINTER 0X00
623 #define SCSIMESS_SYNCHRONOUS_DATA_REQ 0X01
624 #define SCSIMESS_WIDE_DATA_REQUEST 0X03
627 // SCSI Extended Message Lengths
630 #define SCSIMESS_MODIFY_DATA_LENGTH 5
631 #define SCSIMESS_SYNCH_DATA_LENGTH 3
632 #define SCSIMESS_WIDE_DATA_LENGTH 2
635 // SCSI extended message structure
639 typedef struct _SCSI_EXTENDED_MESSAGE
641 UCHAR InitialMessageCode;
644 union _EXTENDED_ARGUMENTS
653 UCHAR TransferPeriod;
662 }SCSI_EXTENDED_MESSAGE, *PSCSI_EXTENDED_MESSAGE;
666 /* SCSI bus status codes */
668 #define SCSISTAT_GOOD 0x00
669 #define SCSISTAT_CHECK_CONDITION 0x02
670 #define SCSISTAT_CONDITION_MET 0x04
671 #define SCSISTAT_BUSY 0x08
672 #define SCSISTAT_INTERMEDIATE 0x10
673 #define SCSISTAT_INTERMEDIATE_COND_MET 0x14
674 #define SCSISTAT_RESERVATION_CONFLICT 0x18
675 #define SCSISTAT_COMMAND_TERMINATED 0x22
676 #define SCSISTAT_QUEUE_FULL 0x28
679 // Enable Vital Product Data Flag (EVPD)
680 // used with INQUIRY command.
683 #define CDB_INQUIRY_EVPD 0x01
686 // Defines for format CDB
689 #define LUN0_FORMAT_SAVING_DEFECT_LIST 0
690 #define USE_DEFAULTMSB 0
691 #define USE_DEFAULTLSB 0
693 #define START_UNIT_CODE 0x01
694 #define STOP_UNIT_CODE 0x00
699 // Inquiry buffer structure. This is the data returned from the target
700 // after it receives an inquiry.
702 // This structure may be extended by the number of bytes specified
703 // in the field AdditionalLength. The defined size constant only
704 // includes fields through ProductRevisionLevel.
706 // The NT SCSI drivers are only interested in the first 36 bytes of data.
709 #define INQUIRYDATABUFFERSIZE 36
712 typedef struct _INQUIRYDATA
715 UCHAR DeviceTypeQualifier:3;
716 UCHAR DeviceTypeModifier:7;
717 UCHAR RemovableMedia:1;
719 UCHAR ResponseDataFormat;
720 UCHAR AdditionalLength;
723 UCHAR CommandQueue:1;
725 UCHAR LinkedCommands:1;
729 UCHAR RelativeAddressing:1;
732 UCHAR ProductRevisionLevel[4];
733 UCHAR VendorSpecific[20];
735 } INQUIRYDATA, *PINQUIRYDATA;
738 // Inquiry defines. Used to interpret data returned from target as result
739 // of inquiry command.
744 #define DIRECT_ACCESS_DEVICE 0x00 // disks
745 #define SEQUENTIAL_ACCESS_DEVICE 0x01 // tapes
746 #define PRINTER_DEVICE 0x02 // printers
747 #define PROCESSOR_DEVICE 0x03 // scanners, printers, etc
748 #define WRITE_ONCE_READ_MULTIPLE_DEVICE 0x04 // worms
749 #define READ_ONLY_DIRECT_ACCESS_DEVICE 0x05 // cdroms
750 #define SCANNER_DEVICE 0x06 // scanners
751 #define OPTICAL_DEVICE 0x07 // optical disks
752 #define MEDIUM_CHANGER 0x08 // jukebox
753 #define COMMUNICATION_DEVICE 0x09 // network
754 #define LOGICAL_UNIT_NOT_PRESENT_DEVICE 0x7F
755 #define DEVICE_QUALIFIER_NOT_SUPPORTED 0x03
758 // DeviceTypeQualifier field
761 #define DEVICE_CONNECTED 0x00
764 /* Sense Data Format */
766 typedef struct _SENSE_DATA
773 UCHAR IncorrectLength:1;
776 UCHAR Information[4];
777 UCHAR AdditionalSenseLength;
778 UCHAR CommandSpecificInformation[4];
779 UCHAR AdditionalSenseCode;
780 UCHAR AdditionalSenseCodeQualifier;
781 UCHAR FieldReplaceableUnitCode;
782 UCHAR SenseKeySpecific[3];
783 } SENSE_DATA, *PSENSE_DATA;
786 /* Default request sense buffer size */
788 #define SENSE_BUFFER_SIZE 18
792 #define SCSI_SENSE_NO_SENSE 0x00
793 #define SCSI_SENSE_RECOVERED_ERROR 0x01
794 #define SCSI_SENSE_NOT_READY 0x02
795 #define SCSI_SENSE_MEDIUM_ERROR 0x03
796 #define SCSI_SENSE_HARDWARE_ERROR 0x04
797 #define SCSI_SENSE_ILLEGAL_REQUEST 0x05
798 #define SCSI_SENSE_UNIT_ATTENTION 0x06
799 #define SCSI_SENSE_DATA_PROTECT 0x07
800 #define SCSI_SENSE_BLANK_CHECK 0x08
801 #define SCSI_SENSE_UNIQUE 0x09
802 #define SCSI_SENSE_COPY_ABORTED 0x0A
803 #define SCSI_SENSE_ABORTED_COMMAND 0x0B
804 #define SCSI_SENSE_EQUAL 0x0C
805 #define SCSI_SENSE_VOL_OVERFLOW 0x0D
806 #define SCSI_SENSE_MISCOMPARE 0x0E
807 #define SCSI_SENSE_RESERVED 0x0F
809 /* Additional tape bit */
811 #define SCSI_ILLEGAL_LENGTH 0x20
812 #define SCSI_EOM 0x40
813 #define SCSI_FILE_MARK 0x80
815 /* Additional Sense codes */
817 #define SCSI_ADSENSE_NO_SENSE 0x00
818 #define SCSI_ADSENSE_LUN_NOT_READY 0x04
819 #define SCSI_ADSENSE_ILLEGAL_COMMAND 0x20
820 #define SCSI_ADSENSE_ILLEGAL_BLOCK 0x21
821 #define SCSI_ADSENSE_INVALID_LUN 0x25
822 #define SCSI_ADSENSE_INVALID_CDB 0x24
823 #define SCSI_ADSENSE_MUSIC_AREA 0xA0
824 #define SCSI_ADSENSE_DATA_AREA 0xA1
825 #define SCSI_ADSENSE_VOLUME_OVERFLOW 0xA7
827 #define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE 0x3a
828 #define SCSI_ADWRITE_PROTECT 0x27
829 #define SCSI_ADSENSE_MEDIUM_CHANGED 0x28
830 #define SCSI_ADSENSE_BUS_RESET 0x29
831 #define SCSI_ADSENSE_TRACK_ERROR 0x14
832 #define SCSI_ADSENSE_SEEK_ERROR 0x15
833 #define SCSI_ADSENSE_REC_DATA_NOECC 0x17
834 #define SCSI_ADSENSE_REC_DATA_ECC 0x18
836 /* Additional sense code qualifier */
838 #define SCSI_SENSEQ_FORMAT_IN_PROGRESS 0x04
839 #define SCSI_SENSEQ_INIT_COMMAND_REQUIRED 0x02
840 #define SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED 0x03
841 #define SCSI_SENSEQ_BECOMING_READY 0x01
842 #define SCSI_SENSEQ_FILEMARK_DETECTED 0x01
843 #define SCSI_SENSEQ_SETMARK_DETECTED 0x03
844 #define SCSI_SENSEQ_END_OF_MEDIA_DETECTED 0x02
845 #define SCSI_SENSEQ_BEGINNING_OF_MEDIA_DETECTED 0x04
847 /* SCSI IO Device Control Codes */
849 #define FILE_DEVICE_SCSI 0x0000001b
851 #define IOCTL_SCSI_EXECUTE_IN ((FILE_DEVICE_SCSI << 16) + 0x0011)
852 #define IOCTL_SCSI_EXECUTE_OUT ((FILE_DEVICE_SCSI << 16) + 0x0012)
853 #define IOCTL_SCSI_EXECUTE_NONE ((FILE_DEVICE_SCSI << 16) + 0x0013)
855 /* SMART support in atapi */
857 #define IOCTL_SCSI_MINIPORT_SMART_VERSION ((FILE_DEVICE_SCSI << 16) + 0x0500)
858 #define IOCTL_SCSI_MINIPORT_IDENTIFY ((FILE_DEVICE_SCSI << 16) + 0x0501)
859 #define IOCTL_SCSI_MINIPORT_READ_SMART_ATTRIBS ((FILE_DEVICE_SCSI << 16) + 0x0502)
860 #define IOCTL_SCSI_MINIPORT_READ_SMART_THRESHOLDS ((FILE_DEVICE_SCSI << 16) + 0x0503)
861 #define IOCTL_SCSI_MINIPORT_ENABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0504)
862 #define IOCTL_SCSI_MINIPORT_DISABLE_SMART ((FILE_DEVICE_SCSI << 16) + 0x0505)
863 #define IOCTL_SCSI_MINIPORT_RETURN_STATUS ((FILE_DEVICE_SCSI << 16) + 0x0506)
864 #define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTOSAVE ((FILE_DEVICE_SCSI << 16) + 0x0507)
865 #define IOCTL_SCSI_MINIPORT_SAVE_ATTRIBUTE_VALUES ((FILE_DEVICE_SCSI << 16) + 0x0508)
866 #define IOCTL_SCSI_MINIPORT_EXECUTE_OFFLINE_DIAGS ((FILE_DEVICE_SCSI << 16) + 0x0509)
869 /* Read Capacity Data - returned in Big Endian format */
871 typedef struct _READ_CAPACITY_DATA
873 ULONG LogicalBlockAddress;
875 } READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
879 // Read Block Limits Data - returned in Big Endian format
880 // This structure returns the maximum and minimum block
881 // size for a TAPE device.
884 typedef struct _READ_BLOCK_LIMITS
887 UCHAR BlockMaximumSize[3];
888 UCHAR BlockMinimumSize[2];
889 } READ_BLOCK_LIMITS_DATA, *PREAD_BLOCK_LIMITS_DATA;
893 // Mode data structures.
897 // Define Mode parameter header.
900 typedef struct _MODE_PARAMETER_HEADER
902 UCHAR ModeDataLength;
904 UCHAR DeviceSpecificParameter;
905 UCHAR BlockDescriptorLength;
906 }MODE_PARAMETER_HEADER, *PMODE_PARAMETER_HEADER;
908 typedef struct _MODE_PARAMETER_HEADER10
910 UCHAR ModeDataLength[2];
912 UCHAR DeviceSpecificParameter;
914 UCHAR BlockDescriptorLength[2];
915 }MODE_PARAMETER_HEADER10, *PMODE_PARAMETER_HEADER10;
917 #define MODE_FD_SINGLE_SIDE 0x01
918 #define MODE_FD_DOUBLE_SIDE 0x02
919 #define MODE_FD_MAXIMUM_TYPE 0x1E
920 #define MODE_DSP_FUA_SUPPORTED 0x10
921 #define MODE_DSP_WRITE_PROTECT 0x80
924 // Define the mode parameter block.
927 typedef struct _MODE_PARAMETER_BLOCK
930 UCHAR NumberOfBlocks[3];
932 UCHAR BlockLength[3];
933 }MODE_PARAMETER_BLOCK, *PMODE_PARAMETER_BLOCK;
936 /* Define Disconnect-Reconnect page */
937 typedef struct _MODE_DISCONNECT_PAGE
943 UCHAR BufferFullRatio;
944 UCHAR BufferEmptyRatio;
945 UCHAR BusInactivityLimit[2];
946 UCHAR BusDisconnectTime[2];
947 UCHAR BusConnectTime[2];
948 UCHAR MaximumBurstSize[2];
949 UCHAR DataTransferDisconnect:2;
951 }MODE_DISCONNECT_PAGE, *PMODE_DISCONNECT_PAGE;
954 // Define mode caching page.
957 typedef struct _MODE_CACHING_PAGE
963 UCHAR ReadDisableCache:1;
964 UCHAR MultiplicationFactor:1;
965 UCHAR WriteCacheEnable:1;
967 UCHAR WriteRetensionPriority:4;
968 UCHAR ReadRetensionPriority:4;
969 UCHAR DisablePrefetchTransfer[2];
970 UCHAR MinimumPrefetch[2];
971 UCHAR MaximumPrefetch[2];
972 UCHAR MaximumPrefetchCeiling[2];
973 }MODE_CACHING_PAGE, *PMODE_CACHING_PAGE;
976 // Define mode flexible disk page.
979 typedef struct _MODE_FLEXIBLE_DISK_PAGE
985 UCHAR TransferRate[2];
987 UCHAR SectorsPerTrack;
988 UCHAR BytesPerSector[2];
989 UCHAR NumberOfCylinders[2];
990 UCHAR StartWritePrecom[2];
991 UCHAR StartReducedCurrent[2];
993 UCHAR StepPluseWidth;
994 UCHAR HeadSettleDelay[2];
998 UCHAR MotorOnAsserted:1;
999 UCHAR StartSectorNumber:1;
1000 UCHAR TrueReadySignal:1;
1001 UCHAR StepPlusePerCyclynder:4;
1003 UCHAR WriteCompenstation;
1004 UCHAR HeadLoadDelay;
1005 UCHAR HeadUnloadDelay;
1010 UCHAR MediumRotationRate[2];
1012 }MODE_FLEXIBLE_DISK_PAGE, *PMODE_FLEXIBLE_DISK_PAGE;
1015 // Define mode format page.
1018 typedef struct _MODE_FORMAT_PAGE
1022 UCHAR PageSavable:1;
1024 UCHAR TracksPerZone[2];
1025 UCHAR AlternateSectorsPerZone[2];
1026 UCHAR AlternateTracksPerZone[2];
1027 UCHAR AlternateTracksPerLogicalUnit[2];
1028 UCHAR SectorsPerTrack[2];
1029 UCHAR BytesPerPhysicalSector[2];
1030 UCHAR Interleave[2];
1031 UCHAR TrackSkewFactor[2];
1032 UCHAR CylinderSkewFactor[2];
1034 UCHAR SurfaceFirst:1;
1035 UCHAR RemovableMedia:1;
1036 UCHAR HardSectorFormating:1;
1037 UCHAR SoftSectorFormating:1;
1039 }MODE_FORMAT_PAGE, *PMODE_FORMAT_PAGE;
1042 // Define rigid disk driver geometry page.
1045 typedef struct _MODE_RIGID_GEOMETRY_PAGE
1049 UCHAR PageSavable:1;
1051 UCHAR NumberOfCylinders[2];
1052 UCHAR NumberOfHeads;
1053 UCHAR StartWritePrecom[2];
1054 UCHAR StartReducedCurrent[2];
1055 UCHAR DriveStepRate[2];
1056 UCHAR LandZoneCyclinder[2];
1057 UCHAR RotationalPositionLock:2;
1059 UCHAR RotationOffset;
1061 UCHAR RoataionRate[2];
1063 }MODE_RIGID_GEOMETRY_PAGE, *PMODE_RIGID_GEOMETRY_PAGE;
1066 // Define read write recovery page
1069 typedef struct _MODE_READ_WRITE_RECOVERY_PAGE
1083 UCHAR ReadRetryCount;
1085 UCHAR WriteRetryCount;
1087 } MODE_READ_WRITE_RECOVERY_PAGE, *PMODE_READ_WRITE_RECOVERY_PAGE;
1090 // Define read recovery page - cdrom
1093 typedef struct _MODE_READ_RECOVERY_PAGE
1106 UCHAR ReadRetryCount;
1108 } MODE_READ_RECOVERY_PAGE, *PMODE_READ_RECOVERY_PAGE;
1111 // Define CD-ROM Capabilities and Mechanical Status Page.
1114 typedef struct _MODE_CAPABILITIES_PAGE2
1121 UCHAR Capabilities[4];
1122 UCHAR MaximumSpeedSupported[2];
1124 UCHAR NumberVolumeLevels;
1125 UCHAR BufferSize[2];
1126 UCHAR CurrentSpeed[2];
1129 UCHAR DigitalOutput:4;
1132 } MODE_CAPABILITIES_PAGE2, *PMODE_CAPABILITIES_PAGE2;
1135 // Bit definitions of Capabilites and DigitalOutput
1138 #define AUDIO_PLAY_SUPPORTED 0x01
1139 #define MODE2_FORM1_SUPPORTED 0x10
1140 #define MODE2_FORM2_SUPPORTED 0x20
1141 #define MULTI_SESSION_SUPPORTED 0x40
1143 #define READ_CD_SUPPORTED 0x01
1145 #define MEDIA_LOCKING_SUPPORTED 0x01
1146 #define CURRENT_LOCK_STATE 0x02
1147 #define SOFTWARE_EJECT_SUPPORT 0x08
1149 #define DISC_PRESENT_REPORTING 0x04
1152 // Mode parameter list block descriptor -
1153 // set the block length for reading/writing
1157 #define MODE_BLOCK_DESC_LENGTH 8
1158 #define MODE_HEADER_LENGTH 4
1159 #define MODE_HEADER_LENGTH10 8
1161 typedef struct _MODE_PARM_READ_WRITE
1163 MODE_PARAMETER_HEADER ParameterListHeader; /* List Header Format */
1164 MODE_PARAMETER_BLOCK ParameterListBlock; /* List Block Descriptor */
1165 } MODE_PARM_READ_WRITE_DATA, *PMODE_PARM_READ_WRITE_DATA;
1169 // CDROM audio control (0x0E)
1172 #define CDB_AUDIO_PAUSE 0
1173 #define CDB_AUDIO_RESUME 1
1175 #define CDB_DEVICE_START 0x11
1176 #define CDB_DEVICE_STOP 0x10
1178 #define CDB_EJECT_MEDIA 0x10
1179 #define CDB_LOAD_MEDIA 0x01
1181 #define CDB_SUBCHANNEL_HEADER 0x00
1182 #define CDB_SUBCHANNEL_BLOCK 0x01
1184 #define CDROM_AUDIO_CONTROL_PAGE 0x0E
1185 #define MODE_SELECT_IMMEDIATE 0x04
1186 #define MODE_SELECT_PFBIT 0x10
1188 #define CDB_USE_MSF 0x01
1190 typedef struct _PORT_OUTPUT
1192 UCHAR ChannelSelection;
1194 } PORT_OUTPUT, *PPORT_OUTPUT;
1196 typedef struct _AUDIO_OUTPUT
1199 UCHAR ParameterLength;
1203 UCHAR LogicalBlocksPerSecond[2];
1204 PORT_OUTPUT PortOutput[4];
1205 } AUDIO_OUTPUT, *PAUDIO_OUTPUT;
1208 /* Multisession CDROM */
1210 #define GET_LAST_SESSION 0x01
1211 #define GET_SESSION_DATA 0x02;
1214 /* Atapi 2.5 changer */
1216 typedef struct _MECHANICAL_STATUS_INFORMATION_HEADER
1218 UCHAR CurrentSlot:5;
1219 UCHAR ChangerState:2;
1222 UCHAR MechanismState:3;
1223 UCHAR CurrentLogicalBlockAddress[3];
1224 UCHAR NumberAvailableSlots;
1225 UCHAR SlotTableLength[2];
1226 } MECHANICAL_STATUS_INFORMATION_HEADER, *PMECHANICAL_STATUS_INFORMATION_HEADER;
1228 typedef struct _SLOT_TABLE_INFORMATION
1230 UCHAR DiscChanged:1;
1232 UCHAR DiscPresent:1;
1234 } SLOT_TABLE_INFORMATION, *PSLOT_TABLE_INFORMATION;
1236 typedef struct _MECHANICAL_STATUS
1238 MECHANICAL_STATUS_INFORMATION_HEADER MechanicalStatusHeader;
1239 SLOT_TABLE_INFORMATION SlotTableInfo[1];
1240 } MECHANICAL_STATUS, *PMECHANICAL_STATUS;
1243 /* Tape definitions */
1245 typedef struct _TAPE_POSITION_DATA
1248 UCHAR BlockPositionUnsupported:1;
1250 UCHAR EndOfPartition:1;
1251 UCHAR BeginningOfPartition:1;
1252 UCHAR PartitionNumber;
1254 UCHAR FirstBlock[4];
1257 UCHAR NumberOfBlocks[3];
1258 UCHAR NumberOfBytes[4];
1259 } TAPE_POSITION_DATA, *PTAPE_POSITION_DATA;
1262 * This structure is used to convert little endian
1263 * ULONGs to SCSI CDB 4 byte big endians values.
1266 typedef struct _FOUR_BYTE
1272 } FOUR_BYTE, *PFOUR_BYTE;
1275 * Byte reversing macro for converting
1276 * between big- and little-endian formats
1279 #define REVERSE_BYTES(Destination, Source) \
1281 PFOUR_BYTE d = (PFOUR_BYTE)(Destination); \
1282 PFOUR_BYTE s = (PFOUR_BYTE)(Source); \
1283 d->Byte3 = s->Byte0; \
1284 d->Byte2 = s->Byte1; \
1285 d->Byte1 = s->Byte2; \
1286 d->Byte0 = s->Byte3; \
1290 /* This macro has the effect of Bit = log2(Data) */
1292 #define WHICH_BIT(Data, Bit) \
1294 for (Bit = 0; Bit < 32; Bit++) \
1296 if ((Data >> Bit) == 1) \
1304 #endif /* __STORAGE_INCLUDE_SCSI_H */