Annotation of embedaddon/smartmontools/os_qnxnto.h, revision 1.1

1.1     ! misho       1: /*
        !             2:  * os_generic.h
        !             3:  *
        !             4:  * Home page of code is: http://smartmontools.sourceforge.net
        !             5:  *
        !             6:  * Copyright (C) Joerg Hering       <smartmontools-support@lists.sourceforge.net>
        !             7:  * Copyright (C) 2003-8 Bruce Allen <smartmontools-support@lists.sourceforge.net>
        !             8:  *
        !             9:  * This program is free software; you can redistribute it and/or modify
        !            10:  * it under the terms of the GNU General Public License as published by
        !            11:  * the Free Software Foundation; either version 2, or (at your option)
        !            12:  * any later version.
        !            13:  *
        !            14:  * You should have received a copy of the GNU General Public License
        !            15:  * (for example COPYING); if not, write to the Free
        !            16:  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
        !            17:  *
        !            18:  * This code was originally developed as a Senior Thesis by Michael Cornwell
        !            19:  * at the Concurrent Systems Laboratory (now part of the Storage Systems
        !            20:  * Research Center), Jack Baskin School of Engineering, University of
        !            21:  * California, Santa Cruz. http://ssrc.soe.ucsc.edu/
        !            22:  *
        !            23:  */
        !            24: #ifndef OS_QNXNTO_H_
        !            25: #define OS_QNXNTO_H_
        !            26: #define OS_QNXNTO_H_CVSID "$Id: os_qnxnto.h,v 1.2 2008/03/04 22:09:47 ballen4705 Exp $\n"
        !            27: 
        !            28: // Additional material should start here.  Note: to keep the '-V' CVS
        !            29: // reporting option working as intended, you should only #include
        !            30: // system include files <something.h>.  Local #include files
        !            31: // <"something.h"> should be #included in os_generic.c
        !            32: #include <sys/cpt.h>
        !            33: 
        !            34: #ifndef __TYPES_H_INCLUDED
        !            35: #include <sys/types.h>
        !            36: #endif
        !            37: 
        !            38: #include <stdio.h>
        !            39: #include <fcntl.h>
        !            40: #include <gulliver.h>
        !            41: #include <sys/cpt.h>
        !            42: #include <sys/dcmd_cam.h>
        !            43: #include <sys/cam_device.h>
        !            44: #include "atacmds.h"
        !            45: 
        !            46: //----------------------------------------------------------------------------------------------------------
        !            47: typedef struct _ata_pass_thru   ATA_PASS_THRU;
        !            48: typedef struct _eide_identify   EIDE_IDENTIFY;
        !            49: typedef struct _ata_sense       ATA_SENSE;
        !            50: 
        !            51: typedef void CCB;
        !            52: struct _sim_hba;
        !            53: struct _resmgr_context;
        !            54: 
        !            55: 
        !            56: typedef struct _drive_attribute
        !            57:  {
        !            58:   int  id;
        !            59:   int  threshold;
        !            60:   char *name;
        !            61:  }DRIVE_ATTRIBUTE;
        !            62: 
        !            63: //----------------------------------------------------------------------------------------------------------
        !            64: /* UNIVOS OSD defines and data structures. */
        !            65: 
        !            66: #define INQLEN  36              /* Inquiry string length to store. */
        !            67: 
        !            68: #define CAM_SUCCESS     0       /* For signaling general success */
        !            69: #define CAM_FAILURE     1       /* For signaling general failure */
        !            70: 
        !            71: #define CAM_FALSE       0       /* General purpose flag value */
        !            72: #define CAM_TRUE        1       /* General purpose flag value */
        !            73: 
        !            74: //----------------------------------------------------------------------------------------------------------
        !            75: // Group 3 and 4, command codes 60H-9FH are reserved
        !            76: #define SC_ATA_PT16     0x85   // ATA Pass-through
        !            77: //----------------------------------------------------------------------------------------------------------
        !            78: #define ATA_SMART_LBA_MID_SIG  0x4f
        !            79: #define ATA_SMART_LBA_HI_SIG   0xc2
        !            80: #define ATA_SMART_SIG          0xc24f
        !            81: //----------------------------------------------------------------------------------------------------------
        !            82:        struct _ata_pass_thru {
        !            83:                uchar_t         opcode;
        !            84: #define ATA_PROTO_MSK                          0x1e
        !            85: #define ATA_PROTO_RESPONSE                     (15 << 1)
        !            86: #define ATA_PROTO_FPDMA                                (12 << 1)
        !            87: #define ATA_PROTO_UDMA_DATA_OUT                (11 << 1)
        !            88: #define ATA_PROTO_UDMA_DATA_IN         (10 << 1)
        !            89: #define ATA_PROTO_DEVICE_RESET         (9 << 1)
        !            90: #define ATA_PROTO_DEVICE_DIAGNOSTIC    (8 << 1)
        !            91: #define ATA_PROTO_DMA_QUEUED           (7 << 1)
        !            92: #define ATA_PROTO_DMA                          (6 << 1)
        !            93: #define ATA_PROTO_PIO_DATA_OUT         (5 << 1)
        !            94: #define ATA_PROTO_PIO_DATA_IN          (4 << 1)
        !            95: #define ATA_PROTO_DATA_NONE                    (3 << 1)
        !            96: #define ATA_PROTO_SRST                         (1 << 1)
        !            97: #define ATA_PROTO_HRST                         (0 << 1)
        !            98: #define ATA_PROTO_EXTEND                       0x01
        !            99:                uchar_t         protocol;      // multiple count, protocol
        !           100: #define ATA_MCOUNT_MSK                         0xe0
        !           101: 
        !           102: #define ATA_FLG_CK_COND                                0x20
        !           103: #define ATA_FLG_T_DIR                          0x08            // data from device
        !           104: #define ATA_FLG_BYT_BLOK                       0x04
        !           105: #define ATA_FLG_TLEN_STPSIU                    0x03
        !           106: #define ATA_FLG_TLEN_SECTOR_COUNT      0x02
        !           107: #define ATA_FLG_TLEN_FEATURE           0x01
        !           108:                uchar_t         flags;
        !           109: 
        !           110:                uchar_t         efeatures;
        !           111:                uchar_t         features;
        !           112:                uchar_t         esector_count;
        !           113:                uchar_t         sector_count;
        !           114:                uchar_t         elba_low;
        !           115:                uchar_t         lba_low;
        !           116:                uchar_t         elba_mid;
        !           117:                uchar_t         lba_mid;
        !           118:                uchar_t         elba_high;
        !           119:                uchar_t         lba_high;
        !           120:                uchar_t         device;
        !           121:                uchar_t         command;
        !           122:                uchar_t         control;
        !           123:        } ata_pass_thru_;
        !           124: //----------------------------------------------------------------------------------------------------------
        !           125: #define SENSE_DATA_FMT_DESCRIPTOR      0x02
        !           126: 
        !           127: // Fixed Format Sense Data Structure
        !           128: // Note: The field "error" has the following format:
        !           129: //        bit    7     - Address valid bit
        !           130: //               bits 6-4  - Error class
        !           131: //               bits 3-0  - Error code 
        !           132: //
        !           133: // Error classes 0-6 are vendor unique and also indicate that the
        !           134: // sense data is in _nonextended_ format. (i.e. not usually used)
        !           135: //             struct _scsi_nonextended_sense {
        !           136: //                     uchar_t sd_err;
        !           137: //                     ulong_t sd_block_address;
        !           138: //             };
        !           139: //
        !           140: //     An error class of 7 and an error code of 0 (70H) indicate SCSI-1
        !           141: //     extended sense data format (or SCSI-2 sense data format).
        !           142: //
        !           143: //     An error class of 7 and an error code of 1 (71H) indicate SCSI-2
        !           144: //     deferred errors.
        !           145: //
        !           146: //     Error codes 74H to 7EH are reserved and error code 7FH indicates
        !           147: //     a vendor-specific sense data format.
        !           148: typedef struct _scsi_sense {
        !           149:        uchar_t         error;                          // Error Code
        !           150:        uchar_t         segment;                        // Segment number
        !           151:        uchar_t         sense;                          // Sense key/flags
        !           152:        uchar_t         info[4];                        // Information (32bit big-endian value)
        !           153:        uchar_t         asl;                            // Additional Sense Length
        !           154:        uchar_t         csinfo[4];                      // Command-Specific Information
        !           155:        uchar_t         asc;                            // Additional Sense Code
        !           156:        uchar_t         ascq;                           // Additional Sense Code Qualifier
        !           157:        uchar_t         fruc;                           // Field Replaceable Unit Code
        !           158:        uchar_t         sks;                            // Sense Key Specific
        !           159:        ushort_t        sks_data;                       // Sense Key Specific Data (16bit big-endian)
        !           160:        ushort_t        asb;                            // Additional Sense uchar_ts (Max 256-18)
        !           161: } SCSI_SENSE;
        !           162: 
        !           163: // Descriptor Format Sense Data Structure
        !           164: //     error code of 72 current, 73 deferred
        !           165: //     extended sense data format (or SCSI-2 sense data format).
        !           166: typedef struct _scsi_sense_descriptor {
        !           167:        uchar_t         error;                          // Error Code
        !           168:        uchar_t         sense;                          // Sense key/flags
        !           169:        uchar_t         asc;                            // Additional Sense Code
        !           170:        uchar_t         ascq;                           // Additional Sense Code Qualifier
        !           171:        uchar_t         rsvd[3];
        !           172:        uchar_t         asl;                            // Additional Sense Length
        !           173: } SCSI_SENSE_DESCRIPTOR;
        !           174: 
        !           175: typedef struct _scsi_sense_desriptor_header {
        !           176:        uchar_t                 descriptor_type;
        !           177:        uchar_t                 descriptor_len;
        !           178: } SCSI_SENSE_DESCRIPTOR_HEADER;
        !           179: 
        !           180: #define SENSE_DTYPE_INFORMATION                0x00
        !           181: #define SENSE_DTYPE_CSI                                0x01    // Command Specific Information
        !           182: #define SENSE_DTYPE_SKS                                0x02    // Sense Key Specific
        !           183: #define SENSE_DTYPE_FRU                                0x03    // Field Replaceable Unit
        !           184: #define SENSE_DTYPE_STREAM                     0x04
        !           185: #define SENSE_DTYPE_BLOCK                      0x05
        !           186: #define SENSE_DTYPE_OSD_OBJ_IDENT      0x06    // OSD Object Identification
        !           187: #define SENSE_DTYPE_OSD_INTEGRITY      0x07    // OSD Response Integrity Check Value
        !           188: #define SENSE_DTYPE_OSD_ATR_IDENT      0x08    // OSD Attribute Identification
        !           189: #define SENSE_DTYPE_ATA                                0x09
        !           190: 
        !           191: typedef struct _ata_status_descriptor {
        !           192:        uchar_t                 descriptor_type;
        !           193: #define ATA_SD_DLEN                                    0x0c
        !           194:        uchar_t                 descriptor_len;                 /* 0xc */
        !           195: #define ATA_SD_FLG_EXTEND                      0x01
        !           196:        uchar_t                 flags;
        !           197:        uchar_t                 error;
        !           198:        uchar_t                 esector_count;                  /* (15:8) */
        !           199:        uchar_t                 sector_count;                   /* (7:0) */
        !           200:        uchar_t                 elba_low;                               /* (15:8) */
        !           201:        uchar_t                 lba_low;                                /* (7:0) */
        !           202:        uchar_t                 elba_mid;                               /* (15:8) */
        !           203:        uchar_t                 lba_mid;                                /* (7:0) */
        !           204:        uchar_t                 elba_high;                              /* (15:8) */
        !           205:        uchar_t                 lba_high;                               /* (7:0) */
        !           206:        uchar_t                 device;
        !           207:        uchar_t                 status;
        !           208: } ATA_STATUS_DESCRIPTOR;
        !           209: 
        !           210: //----------------------------------------------------------------------------------------------------------
        !           211: // Sense Keys
        !           212: #define SK_MSK                 0x0F    // mask to sd_sense field for key
        !           213: 
        !           214: #define SK_NO_SENSE            0               // No sense data (no error)
        !           215:                #define ASCQ_FILEMARK_DETECTED                  0x01
        !           216:                #define ASCQ_EOPM_DETECTED                              0x02    // End of Partition/Medium Detected
        !           217:                #define ASCQ_SETMARK_DETECTED                   0x03
        !           218:                #define ASCQ_BOPM_DETECTED                              0x04    // Beginning of Partition/Medium Detected
        !           219: 
        !           220: #define SK_RECOVERED   1               // Recovered error
        !           221:                #define ASC_ATA_PASS_THRU                                       0x00
        !           222:                        #define ASCQ_ATA_PASS_THRU_INFO_AVAIL   0x1d
        !           223: 
        !           224: #define SK_NOT_RDY             2               // Device not ready
        !           225:        #define ASC_NO_SEEK_COMPLETE                            0x02
        !           226:        #define ASC_NOT_READY                                           0x04
        !           227:                #define ASCQ_CAUSE_NOT_REPORTABLE                       0x00
        !           228:                #define ASCQ_BECOMING_READY                                     0x01
        !           229:                #define ASCQ_INIT_COMMAND_REQUIRED                      0x02
        !           230:                #define ASCQ_MANUAL_INTERVENTION_REQUIRED       0x03
        !           231:                #define ASCQ_FORMAT_IN_PROGRESS                         0x04
        !           232:                #define ASCQ_UNKNOWN_CHANGED                            0xff    // NTO extension for fdc's
        !           233:        #define ASC_MEDIA_FORMAT                                        0x30            // bad format
        !           234:        #define ASC_MEDIA_NOT_PRESENT                           0x3a
        !           235:        #define ASC_NOT_CONFIGURED                                      0x3e
        !           236: 
        !           237: #define SK_MEDIUM              3               // Medium error
        !           238:        #define ASC_UNRECOVERABLE_READ_ERROR    0x11
        !           239:        #define ASC_RECORD_NOT_FOUND                    0x14
        !           240:                #define ASCQ_RECORD_NOT_FOUND           0x01
        !           241:        #define ASC_UNABLE_TO_RECOVER_TOC               0x57
        !           242:        #define ASC_INCOMPATIBLE_MEDIUM                 0x64
        !           243: 
        !           244: #define SK_HARDWARE            4               // Hardware error
        !           245:        #define ASC_INTERNAL_TARGET_FAILURE             0x44
        !           246:        #define ASC_MEDIA_LOAD_EJECT_FAILURE    0x53
        !           247:                #define ASCQ_UNRECOVERABLE_CIRC                         0x06
        !           248: 
        !           249: #define SK_ILLEGAL             5               // Illegal Request (bad command)
        !           250:        #define ASC_INVALID_COMMAND                     0x20
        !           251:        #define ASC_INVALID_FIELD                       0x24
        !           252:        #define ASC_INVALID_FIELD_PARAMETER     0x26
        !           253:        #define ASC_COMMAND_SEQUENCE_ERROR      0x2c
        !           254:                #define ASCQ_READ_SCRAMBLED             0x03
        !           255:        #define ASC_ILLEGAL_MODE                        0x64
        !           256:        #define ASC_COPY_PROTECTION                     0x6f
        !           257: 
        !           258: #define SK_UNIT_ATN            6               // Unit Attention
        !           259:        #define ASC_MEDIUM_CHANGED                                      0x28
        !           260:        #define ASC_BUS_RESET                                           0x29
        !           261:        #define ASC_INSUFFICIENT_TIME_FOR_OPERATION     0x2e
        !           262:        #define ASC_OPERATOR_REQUEST                            0x5a
        !           263:                #define ASCQ_OPERATOR_MEDIUM_REMOVAL    0x01
        !           264: 
        !           265: #define SK_DATA_PROT   7               // Data Protect
        !           266:        #define ASC_WRITE_PROTECTED                     0x27
        !           267: 
        !           268: #define SK_BLNK_CHK            8               // Blank Check
        !           269: #define SK_VENDOR              9               // Vendor Specific
        !           270: #define SK_CPY_ABORT   10              // Copy Aborted
        !           271: #define SK_CMD_ABORT   11              // Aborted Command
        !           272: #define SK_EQUAL               12              // Equal
        !           273: #define SK_VOL_OFL             13              // Volume Overflow
        !           274: #define SK_MISCMP              14              // Miscompare
        !           275: #define SK_RESERVED            15              // Reserved
        !           276: //----------------------------------------------------------------------------------------------------------
        !           277: // Command Descriptor Block structure definitions
        !           278: 
        !           279: // CDB Flags
        !           280: #define CF_LINK                        0x01    // Linked-command indication
        !           281: #define CF_FLAG                        0x02    // Linked-command with flag bit
        !           282: #define CF_VENDOR0             0x40    // Vendor unique bits
        !           283: #define CF_VENDOR1             0x80
        !           284: 
        !           285: #define CF_FUA                 0x08
        !           286: #define CF_DPO                 0x10
        !           287: 
        !           288: typedef union _cdb {
        !           289:        // generic 6 byte command descriptor block
        !           290:        struct {
        !           291:                uchar_t         opcode;
        !           292:                uchar_t         lun_opt;
        !           293:                uchar_t         lba_byte1;
        !           294:                uchar_t         lba_byte0;                              // LSB
        !           295:                uchar_t         transfer_len;
        !           296:                uchar_t         control;
        !           297:        } gen6;
        !           298: 
        !           299:        // generic 10 byte command descriptor block
        !           300:        struct {
        !           301:                uchar_t         opcode;
        !           302:                uchar_t         lun_opt;
        !           303:                uchar_t         lba_byte3;
        !           304:                uchar_t         lba_byte4;
        !           305:                uchar_t         lba_byte1;
        !           306:                uchar_t         lba_byte0;
        !           307:                uchar_t         rsvd;
        !           308:                uchar_t         transfer_len[2];
        !           309:                uchar_t         control;
        !           310:        } gen10;
        !           311: 
        !           312:        // generic 12 byte command descriptor block
        !           313:        struct {
        !           314:                uchar_t         opcode;
        !           315:                uchar_t         lun_opt;
        !           316:                uchar_t         lba_byte3;
        !           317:                uchar_t         lba_byte4;
        !           318:                uchar_t         lba_byte1;
        !           319:                uchar_t         lba_byte0;
        !           320:                uchar_t         transfer_len[4];
        !           321:                uchar_t         rsvd10;
        !           322:                uchar_t         control;
        !           323:        } gen12;
        !           324: 
        !           325:        struct _format_unit {
        !           326:         uchar_t         op_code;
        !           327: #define FU_RSVD0        0xc0                    // reserved bits
        !           328: #define FU_FMTDAT       0x10
        !           329: #define FU_CMPLIST      0x08
        !           330:         uchar_t         defect_list_fmt;
        !           331:         uchar_t         track_num;
        !           332:         ushort_t        interleave;
        !           333:         uchar_t         rsvd1[7];
        !           334:        } format_unit;
        !           335: 
        !           336:        struct _format_unit_old {
        !           337:         uchar_t         op_code;
        !           338:         uchar_t         rsvd0;
        !           339:         uchar_t         medium_type_code;
        !           340:         uchar_t         rsvd1;
        !           341:         uchar_t         interleave;
        !           342:         uchar_t         rsvd2;
        !           343: #define FMT_RSVD3               0x80
        !           344: #define FMT_SECT_SIZE_CD        0x70
        !           345: #define FMT_IMMED               0x08
        !           346: #define FMT_HEAD                0x04
        !           347: #define FMT_ST                  0x02
        !           348: #define FMT_CERT                0x01
        !           349:         uchar_t         cert;
        !           350:         uchar_t         track_addr;
        !           351:         uchar_t         rsvd4[4];
        !           352:        } format_unit_old;
        !           353: 
        !           354: #define RW_OPT_RELADR  0x01
        !           355: #define RW_OPT_CORRCT  0x02                                    // Disable Corrections
        !           356: #define RW_OPT_FUA             0x08                                    // Force Unit Access
        !           357: #define RW_OPT_DPO             0x10                                    // Disable Page Out
        !           358:        struct {
        !           359:                uchar_t         opcode;
        !           360:                uchar_t         lun_lba;
        !           361:                uchar_t         lba[2];
        !           362:                uchar_t         transfer_len;
        !           363:                uchar_t         control;
        !           364:        } read_write6;
        !           365: 
        !           366:        struct {
        !           367:                uchar_t         opcode;
        !           368:                uchar_t         lun_opt;
        !           369:                uchar_t         lba[4];
        !           370:                uchar_t         rsvd2;
        !           371:                uchar_t         transfer_len[2];
        !           372:                uchar_t         control;
        !           373:        } read_write10;
        !           374: 
        !           375:        struct {
        !           376:                uchar_t         opcode;
        !           377:                uchar_t         lun_opt;
        !           378:                uchar_t         lba[4];
        !           379:                uchar_t         transfer_len[4];
        !           380:                uchar_t         rsvd2;
        !           381:                uchar_t         control;
        !           382:        } read_write12;
        !           383: 
        !           384: #define MSEL_OPT_PF            0x10                    // Page Format
        !           385: #define MSEL_OPT_SP            0x01                    // Save Page
        !           386:        struct {
        !           387:                uchar_t         opcode;
        !           388:                uchar_t         lun_opt;
        !           389:                uchar_t         rsvd2;
        !           390:                uchar_t         rsvd3;
        !           391:                uchar_t         param_length;
        !           392:                uchar_t         control;
        !           393:        } mode_select;
        !           394: 
        !           395:        struct {
        !           396:                uchar_t         opcode;
        !           397:                uchar_t         lun_opt;
        !           398:                uchar_t         rsvd2;
        !           399:                uchar_t         rsvd3;
        !           400:                uchar_t         rsvd4;
        !           401:                uchar_t         rsvd5;
        !           402:                uchar_t         rsvd6;
        !           403:                uchar_t         param_length[2];
        !           404:                uchar_t         control;
        !           405:        } mode_select10;
        !           406: 
        !           407:        struct {
        !           408:                uchar_t         opcode;
        !           409: #define LS_OPT_SP              0x01                    // Save Parameters
        !           410: #define LS_OPT_PCR             0x02                    // Parameter Code Reset
        !           411:                uchar_t         lun_opt;
        !           412: #define LS_PC_CUR_THRESHOLD            0x00
        !           413: #define LS_PC_CUR_CUMULATIVE   0x01
        !           414: #define LS_PC_DFLT_THRESHOLD   0x02
        !           415: #define LS_PC_DFLT_CUMULATIVE  0x03
        !           416:                uchar_t         pc;                                     // Page Control
        !           417:                uchar_t         rsvd3;
        !           418:                uchar_t         rsvd4;
        !           419:                uchar_t         rsvd5;
        !           420:                uchar_t         rsvd6;
        !           421:                uchar_t         param_length[2];
        !           422:                uchar_t         control;
        !           423:        } log_select;
        !           424: 
        !           425:        struct {
        !           426:                uchar_t         opcode;
        !           427: #define MSNS_OPT_DBD   0x08                    // Disable Block Descriptors
        !           428:                uchar_t         lun_opt;
        !           429: #define PC_CURRENT             0x00
        !           430: #define PC_CHANGEABLE  0x40
        !           431: #define PC_DEFAULT             0x80
        !           432: #define PC_SAVED               0xC0
        !           433: #define PC_MSK                 0xC0
        !           434:                uchar_t         pc_page;
        !           435:                uchar_t         subpage;
        !           436:                uchar_t         allocation_length;
        !           437:                uchar_t         control;
        !           438:        } mode_sense;
        !           439: 
        !           440:        struct _mode_sense10 {
        !           441:                uchar_t         opcode;
        !           442:                uchar_t         lun_opt;
        !           443:                uchar_t         pc_page;
        !           444:                uchar_t         subpage;
        !           445:                uchar_t         rsvd4;
        !           446:                uchar_t         rsvd5;
        !           447:                uchar_t         rsvd6;
        !           448:                uchar_t         allocation_length[2];
        !           449:                uchar_t         control;
        !           450:        } mode_sense10;
        !           451: 
        !           452:        struct {
        !           453:                uchar_t         opcode;
        !           454:                uchar_t         lun_opt;
        !           455:                uchar_t         pc_page;
        !           456:                uchar_t         rsvd3;
        !           457:                uchar_t         rsvd4;
        !           458:                uchar_t         parameter_pointer[2];
        !           459:                uchar_t         allocation_length[2];
        !           460:                uchar_t         control;
        !           461:        } log_sense;
        !           462: 
        !           463:        struct {
        !           464:                uchar_t         opcode;
        !           465:                uchar_t         lun_opt;
        !           466:                uchar_t         rsvd2;
        !           467:                uchar_t         rsvd3;
        !           468:                uchar_t         prevent;
        !           469:                uchar_t         control;
        !           470:        } removal;
        !           471: 
        !           472:        struct {
        !           473:                uchar_t         opcode;
        !           474: #define LD_OPT_IMMED   0x01
        !           475:                uchar_t         lun_opt;
        !           476:                uchar_t         rsvd2;
        !           477:                uchar_t         rsvd3;
        !           478: #define LD_CMD_START   0x01
        !           479: #define LD_CMD_LOEJ            0x02
        !           480: #define LD_CMD_STOP            0x00
        !           481: #define LD_CMD_EJECT   0x02
        !           482: #define LD_CMD_LOAD            0x03
        !           483: 
        !           484: // Sequential-Access
        !           485: #define LD_CMD_SA_HOLD         0x08
        !           486: #define LD_CMD_SA_EOT          0x04
        !           487: #define LD_CMD_SA_RT           0x02                    // re-tension
        !           488: #define LD_CMD_SA_LOEJ         0x01
        !           489: 
        !           490: // Block
        !           491: #define LD_CMD_PC_MSK          0xf0
        !           492: #define LD_CMD_PC_NC           0
        !           493: #define LD_CMD_PC_ACTIVE       1
        !           494: #define LD_CMD_PC_IDLE         2
        !           495: #define LD_CMD_PC_STANDBY      3
        !           496: #define LD_CMD_PC_SLEEP                5
        !           497: 
        !           498:                uchar_t         cmd;
        !           499:                uchar_t         control;
        !           500:        } load;
        !           501: 
        !           502:        struct {
        !           503:                uchar_t         opcode;
        !           504:                uchar_t         lun_opt;
        !           505: #define SC_OPT_RELADR  0x01
        !           506: #define SC_OPT_IMMED   0x02
        !           507:                uchar_t         lba[4];
        !           508:                uchar_t         num_blocks[2];
        !           509:                uchar_t         control;
        !           510:        } synchronize_cache;
        !           511: 
        !           512: // cdrom commands
        !           513:        struct {
        !           514:                uchar_t         opcode;
        !           515:                uchar_t         rsvd1;
        !           516:                uchar_t         rsvd2;
        !           517:                uchar_t         rsvd3;
        !           518:                uchar_t         rsvd4;
        !           519:                uchar_t         rsvd5;
        !           520:                uchar_t         rsvd6;
        !           521:                uchar_t         allocation_length[2];
        !           522:                uchar_t         control;
        !           523:        } read_disc_information;
        !           524: 
        !           525:        struct {
        !           526:                uchar_t         opcode;
        !           527:                uchar_t         lun_opt;
        !           528:                uchar_t         rsvd2;
        !           529:                uchar_t         rsvd3;
        !           530:                uchar_t         rsvd4;
        !           531:                uchar_t         rsvd5;
        !           532:                uchar_t         rsvd6;
        !           533:                uchar_t         rsvd7;
        !           534:                uchar_t         resume;
        !           535:                uchar_t         control;
        !           536:        } pause_resume;
        !           537: 
        !           538:        struct {
        !           539:                uchar_t         opcode;
        !           540:                uchar_t         lun_opt;
        !           541:                uchar_t         rsvd2;
        !           542:                uchar_t         start_minute;
        !           543:                uchar_t         start_second;
        !           544:                uchar_t         start_frame;
        !           545:                uchar_t         end_minute;
        !           546:                uchar_t         end_second;
        !           547:                uchar_t         end_frame;
        !           548:                uchar_t         control;
        !           549:        } play_audio_msf;
        !           550: 
        !           551:        struct {
        !           552:                uchar_t         opcode;
        !           553:                uchar_t         lun_opt;
        !           554:                uchar_t         rsvd2;
        !           555:                uchar_t         rsvd3;
        !           556:                uchar_t         start_track;
        !           557:                uchar_t         start_index;
        !           558:                uchar_t         rsvd6;
        !           559:                uchar_t         end_track;
        !           560:                uchar_t         end_index;
        !           561:                uchar_t         control;
        !           562:        } play_audio_ti;
        !           563: 
        !           564:        struct {
        !           565:                uchar_t         opcode;
        !           566: #define CD_SCAN_DIR_FORWARD            0x00
        !           567: #define CD_SCAN_DIR_REVERSE            0x10
        !           568:                uchar_t         opt;
        !           569:                uchar_t         start_address[4];
        !           570: #define CD_SCAN_TYPE_LBA               0x00
        !           571: #define CD_SCAN_TYPE_MSF               0x40
        !           572: #define CD_SCAN_TYPE_TRK               0x80
        !           573: #define CD_SCAN_TYPE_MSK               0xc0
        !           574:                uchar_t         rsvd6;
        !           575:                uchar_t         rsvd7;
        !           576:                uchar_t         rsvd8;
        !           577:                uchar_t         type;
        !           578:                uchar_t         rsvd10;
        !           579:                uchar_t         rsvd11;
        !           580:        } cd_scan;
        !           581: 
        !           582:        struct {
        !           583:                uchar_t         opcode;
        !           584: #define RTOC_OPT_MSF   0x02
        !           585:                uchar_t         lun_opt;
        !           586: #define RTOC_FMT_TOC           0x0
        !           587: #define RTOC_FMT_SESSION       0x1
        !           588: #define RTOC_FMT_QSUBCODE      0x2
        !           589: #define RTOC_FMT_QSUBCHNL      0x3
        !           590: #define RTOC_FMT_ATIP          0x4
        !           591: #define RTOC_FMT_CDTEXT                0x5
        !           592:                uchar_t         format;
        !           593:                uchar_t         rsvd3;
        !           594:                uchar_t         rsvd4;
        !           595:                uchar_t         rsvd5;
        !           596:                uchar_t         start_track;
        !           597:                uchar_t         allocation_length[2];
        !           598: #define RTOC_CNTL_FMT_SESSION  0x40
        !           599:                uchar_t         control_format;
        !           600:        } read_toc;
        !           601: 
        !           602:        struct {
        !           603:                uchar_t         opcode;
        !           604:                uchar_t         lun_opt;
        !           605:                uchar_t         rsvd2[6];
        !           606:                uchar_t         allocation_length[2];
        !           607:                uchar_t         rsvd3[2];
        !           608:        } mechanism_status;
        !           609: 
        !           610:        struct {
        !           611:                uchar_t         opcode;
        !           612: #define EXCHANGE_OPT_IMMED     0x01
        !           613:                uchar_t         lun_opt;
        !           614:                uchar_t         rsvd2;
        !           615:                uchar_t         rsvd3;
        !           616: #define EXCHANGE_CMD_START     0x01
        !           617: #define EXCHANGE_CMD_LOEJ      0x02
        !           618:                uchar_t         cmd;
        !           619:                uchar_t         rsvd5;
        !           620:                uchar_t         rsvd6;
        !           621:                uchar_t         rsvd7;
        !           622:                uchar_t         slot;
        !           623:                uchar_t         rsvd9;
        !           624:                uchar_t         rsvd10;
        !           625:                uchar_t         rsvd11;
        !           626:        } exchange;
        !           627: 
        !           628:        struct {
        !           629:                uchar_t         opcode;
        !           630:                uchar_t         rt;
        !           631:                uchar_t         feature_number[2];
        !           632:                uchar_t         rsvd4;
        !           633:                uchar_t         rsvd5;
        !           634:                uchar_t         rsvd6;
        !           635:                uchar_t         allocation_length[2];
        !           636:                uchar_t         control;
        !           637:        } get_configuration;
        !           638: 
        !           639:        struct {
        !           640:                uchar_t         opcode;
        !           641: #define GE_OPT_POLLED                  0x01
        !           642:                uchar_t         opt;
        !           643:                uchar_t         rsvd2;
        !           644:                uchar_t         rsvd3;
        !           645: #define NCR_OPERATIONAL_CHANGE 0x02
        !           646: #define NCR_POWER_MANAGEMENT   0x04
        !           647: #define NCR_EXTERNAL_REQUEST   0x08
        !           648: #define NCR_MEDIA                              0x10
        !           649: #define NCR_MULTI_INITIATOR            0x20
        !           650: #define NCR_DEVICE_BUSY                        0x40
        !           651:                uchar_t         ncr;         // notification class request
        !           652:                uchar_t         rsvd5;
        !           653:                uchar_t         rsvd6;
        !           654:                uchar_t         allocation_length[2];
        !           655:                uchar_t         control;
        !           656:        } get_event;
        !           657: 
        !           658:        struct {
        !           659:                uchar_t         opcode;
        !           660:                uchar_t         lun_opt;
        !           661:                uchar_t         rsvd2;
        !           662:                uchar_t         rsvd3;
        !           663:                uchar_t         rsvd4;
        !           664:                uchar_t         rsvd5;
        !           665:                uchar_t         rsvd6;
        !           666:                uchar_t         allocation_length[2];
        !           667:                uchar_t         control;
        !           668:        } read_formated_capacities;
        !           669: 
        !           670:        struct {
        !           671:                uchar_t         opcode;
        !           672:                uchar_t         lun_opt;
        !           673:                uchar_t         read_speed[2];
        !           674:                uchar_t         write_speed[2];
        !           675:                uchar_t         rsvd2[6];
        !           676:        } cd_speed;             
        !           677: 
        !           678:        struct {
        !           679:                uchar_t         opcode;
        !           680: #define RSCHNL_OPT_MSF         0x02
        !           681:                uchar_t         lun_opt;
        !           682: #define RSCHNL_DATA_SUBQ       0x40
        !           683:                uchar_t         data;
        !           684:                uchar_t         data_format;
        !           685:                uchar_t         rsvd4;
        !           686:                uchar_t         rsvd5;
        !           687:                uchar_t         track;
        !           688:                uchar_t         allocation_length[2];
        !           689:                uchar_t         control;
        !           690:        } read_subchannel;
        !           691: 
        !           692: #define CD_FRAME_SYNC_SIZE         12
        !           693: #define CD_FRAME_HDR_SIZE           4
        !           694: #define CD_FRAME_SUB_HDR_SIZE       8
        !           695: #define CD_FRAME_EDC_SIZE           4
        !           696: #define CD_FRAME_ECC_SIZE         276
        !           697: #define CD_FRAME_AUX_SIZE           8
        !           698: #define CD_FRAME_ZERO_SIZE          8
        !           699: #define CD_FRAME_SPARE_SIZE         4
        !           700: #define CD_FRAME_C2_ERR_SIZE      294
        !           701: #define CD_FRAME_BLOCK_ERR_SIZE     2
        !           702: 
        !           703:        struct {
        !           704:                uchar_t         opcode;
        !           705:                uchar_t         lun_stype;
        !           706: // expected sector type
        !           707: #define RDCD_EST_ANY_SECTOR                            (0 << 2)
        !           708: #define RDCD_EST_CDDA_SECTOR                   (1 << 2)
        !           709: #define RDCD_EST_YELLOW_MODE1_SECTOR   (2 << 2)
        !           710: #define RDCD_EST_YELLOW_MODE2_SECTOR   (3 << 2)
        !           711: #define RDCD_EST_XA_SECTOR                             (4 << 2)
        !           712: #define RDCD_EST_XA_FORM2_SECTOR               (5 << 2)
        !           713: #define RDCD_EST_MSK                                   (7 << 2)
        !           714:                uchar_t         lba[4];
        !           715:                uchar_t         transfer_len[3];
        !           716:                uchar_t         flags;
        !           717: #define RDCD_FLG_SYNC                  0x80
        !           718: #define RDCD_FLG_UDATA                 0x10
        !           719: #define RDCD_FLG_ECC                   0x08
        !           720: #define RDCD_FLG_CD_ERR                        0x02
        !           721: #define RDCD_FLG_CD_BLOCK_ERR  0x04
        !           722: #define RDCD_FLG_HC_NONE               ( 0x00 << 5 )
        !           723: #define RDCD_FLG_HC_HDR                        ( 0x01 << 5 )
        !           724: #define RDCD_FLG_HC_SUBHEADER  ( 0x02 << 5 )
        !           725: #define RDCD_FLG_HC_ALL_HEADERS        ( 0x03 << 5 )
        !           726:                uchar_t         subch_selection;
        !           727:                uchar_t         rsvd3;
        !           728:        } read_cd;
        !           729: 
        !           730:        struct {
        !           731:                uchar_t         opcode;
        !           732:                uchar_t         lun_stype;
        !           733:                uchar_t         rsvd2;
        !           734:                uchar_t         start_minute;
        !           735:                uchar_t         start_second;
        !           736:                uchar_t         start_frame;
        !           737:                uchar_t         end_minute;
        !           738:                uchar_t         end_second;
        !           739:                uchar_t         end_frame;
        !           740:                uchar_t         flags;
        !           741:                uchar_t         subch_selection;
        !           742:                uchar_t         rsvd11;
        !           743:        } read_cd_msf;
        !           744: 
        !           745:        struct _ata_pass_thru {
        !           746:                uchar_t         opcode;
        !           747: #define ATA_PROTO_MSK                          0x1e
        !           748: #define ATA_PROTO_RESPONSE                     (15 << 1)
        !           749: #define ATA_PROTO_FPDMA                                (12 << 1)
        !           750: #define ATA_PROTO_UDMA_DATA_OUT                (11 << 1)
        !           751: #define ATA_PROTO_UDMA_DATA_IN         (10 << 1)
        !           752: #define ATA_PROTO_DEVICE_RESET         (9 << 1)
        !           753: #define ATA_PROTO_DEVICE_DIAGNOSTIC    (8 << 1)
        !           754: #define ATA_PROTO_DMA_QUEUED           (7 << 1)
        !           755: #define ATA_PROTO_DMA                          (6 << 1)
        !           756: #define ATA_PROTO_PIO_DATA_OUT         (5 << 1)
        !           757: #define ATA_PROTO_PIO_DATA_IN          (4 << 1)
        !           758: #define ATA_PROTO_DATA_NONE                    (3 << 1)
        !           759: #define ATA_PROTO_SRST                         (1 << 1)
        !           760: #define ATA_PROTO_HRST                         (0 << 1)
        !           761: #define ATA_PROTO_EXTEND                       0x01
        !           762:                uchar_t         protocol;      // multiple count, protocol
        !           763: #define ATA_MCOUNT_MSK                         0xe0
        !           764: 
        !           765: #define ATA_FLG_CK_COND                                0x20
        !           766: #define ATA_FLG_T_DIR                          0x08            // data from device
        !           767: #define ATA_FLG_BYT_BLOK                       0x04
        !           768: #define ATA_FLG_TLEN_STPSIU                    0x03
        !           769: #define ATA_FLG_TLEN_SECTOR_COUNT      0x02
        !           770: #define ATA_FLG_TLEN_FEATURE           0x01
        !           771:                uchar_t         flags;
        !           772: 
        !           773:                uchar_t         efeatures;
        !           774:                uchar_t         features;
        !           775:                uchar_t         esector_count;
        !           776:                uchar_t         sector_count;
        !           777:                uchar_t         elba_low;
        !           778:                uchar_t         lba_low;
        !           779:                uchar_t         elba_mid;
        !           780:                uchar_t         lba_mid;
        !           781:                uchar_t         elba_high;
        !           782:                uchar_t         lba_high;
        !           783:                uchar_t         device;
        !           784:                uchar_t         command;
        !           785:                uchar_t         control;
        !           786:        } ata_pass_thru;
        !           787: 
        !           788: // sequential access commands
        !           789:        struct {
        !           790:                uchar_t         opcode;
        !           791: #define ERASE_OPT_LONG 0x01
        !           792:                uchar_t         opt;
        !           793:                uchar_t         rsvd[3];
        !           794:                uchar_t         control;
        !           795:        } erase;
        !           796: 
        !           797:        struct {
        !           798:                uchar_t         opcode;
        !           799: #define LOCATE_OPT_CP  0x2
        !           800: #define LOCATE_OPT_BT  0x4
        !           801:                uchar_t         opt;
        !           802:                uchar_t         rsvd2;
        !           803:                uchar_t         ba[4];                  // block address
        !           804:                uchar_t         rsvd7;
        !           805:                uchar_t         partition;
        !           806:                uchar_t         control;
        !           807:        } locate;
        !           808: 
        !           809:        struct {
        !           810:                uchar_t         opcode;
        !           811:                uchar_t         opt;
        !           812:                uchar_t         rsvd2[3];
        !           813:                uchar_t         control;
        !           814:        } read_block_limits;
        !           815: 
        !           816: #define RP_OPT_BT      0x01                    // block address type
        !           817: #define RP_OPT_LNG     0x02                    // long format
        !           818: #define RP_OPT_TCLP    0x04                    // total current logical position
        !           819:        struct {
        !           820:                uchar_t         opcode;
        !           821:                uchar_t         lun_opt;
        !           822:                uchar_t         rsvd2[7];
        !           823:                uchar_t         control;
        !           824:        } read_position;
        !           825: 
        !           826: #define SRW_OPT_FIXED  0x01
        !           827: #define SRW_OPT_SILI   0x02
        !           828:        struct {
        !           829:                uchar_t         opcode;
        !           830:                uchar_t         opt;
        !           831:                uchar_t         transfer_len[3];
        !           832:                uchar_t         control;
        !           833:        } sa_read_write;
        !           834: 
        !           835:        struct {
        !           836:                uchar_t         opcode;
        !           837:                uchar_t         opt;
        !           838:                uchar_t         rsvd[3];
        !           839:                uchar_t         control;
        !           840:        } rewind;
        !           841: 
        !           842:        struct {
        !           843:                uchar_t         opcode;
        !           844: #define SPACE_CODE_BLOCKS              0x00
        !           845: #define SPACE_CODE_FMRKS               0x01
        !           846: #define SPACE_CODE_SEQ_FMRKS   0x02
        !           847: #define SPACE_CODE_EOD                 0x03
        !           848: #define SPACE_CODE_SMRKS               0x04
        !           849: #define SPACE_CODE_SEQ_SMRKS   0x05
        !           850:                uchar_t         lun_code;
        !           851:                uchar_t         count[3];
        !           852:                uchar_t         control;
        !           853:        } space;
        !           854: 
        !           855:        struct {
        !           856:                uchar_t         opcode;
        !           857: #define WF_OPT_IMMED   0x01
        !           858: #define WF_OPT_WSMK            0x02
        !           859:                uchar_t         opt;
        !           860:                uchar_t         transfer_length[3];
        !           861:                uchar_t         control;
        !           862:        } write_filemarks;
        !           863: 
        !           864:        struct {
        !           865:                uchar_t         opcode;
        !           866: #define RD_OPT_MEDIA   0x01
        !           867:                uchar_t         opt;
        !           868:                uchar_t         rsvd[5];
        !           869:                uchar_t         allocation_length[2];
        !           870:                uchar_t         control;
        !           871:        } report_density;
        !           872: 
        !           873:        struct {
        !           874:                uchar_t         opcode;
        !           875: #define FM_OPT_IMMED   0x01
        !           876: #define FM_OPT_VERIFY  0x02
        !           877:                uchar_t         opt;
        !           878: #define FM_FMT_DFLT                            0x00
        !           879: #define FM_FMT_PARTITION               0x01
        !           880: #define FM_FMT_FORMAT_PARTITION        0x02
        !           881:                uchar_t         format;
        !           882:                uchar_t         transfer_length[2];
        !           883:                uchar_t         control;
        !           884:        } format_media;
        !           885: } CDB;
        !           886: //----------------------------------------------------------------------------------------------------------
        !           887: 
        !           888: struct _ata_sense
        !           889:  {
        !           890:   SCSI_SENSE_DESCRIPTOR               sense;
        !           891:   ATA_STATUS_DESCRIPTOR               desc;
        !           892:  };
        !           893: //----------------------------------------------------------------------------------------------------------
        !           894: 
        !           895: 
        !           896: #endif /* OS_QNXNTO_H_ */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>