This is scsi2reg.h in view mode; [Download] [Up]
// // SCSI2_Class - provides architecture independendent low-level // SCSI device access. // // Copyright (C) 1994 by Christopher Wolf. // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Library General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // Library General Public License for more details. // // You should have received a copy of the GNU Library General Public // License along with this library; if not, write to the Free // Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // // Bug-reports, comments and questions should be directed to: // Christopher Wolf <chris@alchemy.geo.cornell.edu> // // Portions of this code are derived from an earlier work // (SCSI Inquirer) Copyright (C) 1990, 1991, 1992 by Jiro Nakamura // and used with permission. // // // For best results view this file with a tab size of 4 and // a display width of 132 columns or wider. // // file version infomation #define RCSSRH "$Id: scsi2reg.h,v 0.40 94/09/19 22:40:24 chris Exp Locker: chris $" // generic Unix headers #import <bsd/dev/scsireg.h> // **************** // Define Constants // **************** // Additional opcodes #define C6OP_READBLOCKLIMITS 0x05 // Read block limits (tape) #define C6OP_RECEIVEDIAG 0x1C // Receive diagnostic #define C6OP_REZEROUNIT 0x01 // rezero unit #define C6OP_MEDIUMREMOVAL 0x1e // Prevent/Allow Medium Removal #define C10OP_SEEKEXTENDED 0x2B // seek extended #define C10OP_SETLIMITS 0x33 // set limits #define C10OP_SYNCHRONIZECACHE 0x35 // Synchronize Cache #define C10OP_READDEFECTDATA 0x37 // Read Defect Data #define C10OP_READLONG 0x3e // Read Long #define C10OP_READSUBCHANNEL 0x42 // CD-ROM Read SubChannel #define C10OP_READTOC 0x43 // CD-ROM Read TOC #define C10OP_PLAYAUDIOMSF 0x47 // CD-ROM Play Audio MSF #define C10OP_MODESENSEEXTENDED 0x5A // Mode Sense(10) // Status byte codes #define STAT_VALIDMASK 0x3e // Valid bits of Status Byte #define STAT_TERMINATED 0x22 #define STAT_QUEUEFULL 0x28 // Mode sense data format #define MODESENSEBUFLENGTH 512 // Mode sense pages #define RWERRORRECOVERYPAGE 0x01 #define DISCONNECTPAGE 0x02 #define FORMATDEVICEPAGE 0x03 #define RIGIDDISKPAGE 0x04 #define FLEXIBLEDISKPAGE 0x05 #define VERRORRECOVERYPAGE 0x07 #define CACHINGPAGE 0x08 #define PERIPHERALPAGE 0x09 #define CONTROLMODEPAGE 0x0A #define MEDIUMTYPESPAGE 0x0B #define NOTCHPAGE 0x0C #define CDROMPARAMETERSPAGE 0x0D #define CDROMAUDIOCONTROLPAGE 0x0E #define DEVICECONFIGPAGE 0x10 // Parameter descriptor block info #define MAXPAGES 8 #define MAXBLOCKDESCRIPTORS 8 // Measurement unit constants #define KILOBYTE (1024.0) #define MEGABYTE (1024.0 * 1024.0) // ***************** // Define Structures // ***************** // // Note: // // Any references to "Sections" or "Tables" within this header // file refer to the pertinent area of the SCSI-2 specification. // // Numbers in the first column of the comment field indicate // BYTE offsets within the structure. // // Many of the structures defined in this header file include multi- // byte elements which must be stored in big-endian byte ordering // format. These elements, whose names have been changed to begin // with BE_, require special handling to ensure that programs // accessing them will work on both Intel (__LITTLE_ENDIAN__) // and Morotola (__BIG_ENDIAN__) architectures. // // To manipulate values in fields beginning with BE_ use one of // the readBigEndian or writeBigEndian functions defined in the // SCSI2 class. Provide these functions with the starting address // of the element and the number of bits in the element. In some // cases where a BE_ element is oddly aligned the element is // declared as an array of characters - be careful to specify // the correct element bit length! (ie: BE_someElement[3] is 24 // bits long and would be read using this function call: // val = readBigEndianValue(&struct.BE_someElement, 24); // // // Command structure definitions // struct cdb2_10 { u_char c10_opcode; // 00 device command #ifdef __BIG_ENDIAN__ u_char c10_lun:3, // 01 logical unit c10_dpo:1, // disable page out c10_fua:1, // force unit access c10_reserved1:2, // reserved: must be zero c10_reladr:1; // address relative to previous #else u_char c10_reladr:1, // 01 address relative to previous c10_reserved1:2, // reserved: must be zero c10_fua:1, // force unit access c10_dpo:1, // disable page out c10_lun:3; // logical unit #endif u_char BE_c10_lba[4]; // 02-05 logical block address u_char c10_reserved6; // 06 reserved: must be zero u_char BE_c10_len[2]; // 07-08 transfer length u_char c10_ctrl; // 09 control byte }; struct cdb_mode_sense // Table 7-24 { u_char ms_opcode; // 00 mode sense opcode #ifdef __BIG_ENDIAN__ u_char ms_lun:3, // 01 logical unit number ms_reserved1a:1, // reserved ms_dbd:1, // disable block descriptors ms_reserved1b:3; // reserved u_char ms_pageControl:2, // 02 page control field (see Table 7-25) ms_pageCode:6; // page code (see Table 7-26) #else u_char ms_reserved1b:3, // 01 reserved ms_dbd:1, // disable block descriptors ms_reserved1a:1, // reserved ms_lun:3; // logical unit number u_char ms_pageCode:6, // 02 page code (see Table 7-26) ms_pageControl:2; // page control field (see Table 7-25) #endif u_char ms_reserved3; // 03 reserved u_char ms_allocationLength; // 04 allocation length u_char ms_control; // 05 control byte }; struct cdb_start_stop { u_char ss_opcode; // 00 start stop opcode #ifdef __BIG_ENDIAN__ u_char ss_lun:3, // 01 logical unit number ss_reserved1:4, // reserved ss_imm:1; // immediate bit u_char ss_reserved2; // 02 reserved u_char ss_reserved3; // 03 reserved u_char ss_reserved4:6, // 04 reserved ss_loej:1, // load/eject bit ss_start:1; // start bit #else u_char ss_imm:1, // 01 immediate bit ss_reserved1:4, // reserved ss_lun:3; // logical unit number u_char ss_reserved2; // 02 reserved u_char ss_reserved3; // 03 reserved u_char ss_start:1, // 04 start bit ss_loej:1, // load eject ss_reserved4:6; // reserved #endif u_char ss_control; // 05 control }; struct cdb_play_audio_msf // Table 13-8 { u_char pam_opcode; // 00 play audio msf opcode #ifdef __BIG_ENDIAN__ u_char pam_lun:3, // 01 logical unit number pam_reserved1:5; // reserved #else u_char pam_reserved1:5, // 01 reserved pam_lun:3; // logical unit number #endif u_char pam_reserved2; // 02 reserved u_char pam_start_m; // 03 starting minute u_char pam_start_s; // 04 starting second u_char pam_start_f; // 05 starting frame u_char pam_end_m; // 06 ending minute u_char pam_end_s; // 07 ending second u_char pam_end_f; // 08 ending frame u_char pam_control; // 09 control }; struct cdb_send_diagnostic // Table 7-42 { u_char sd_opcode; // 00 send diagnostic opcode #ifdef __BIG_ENDIAN__ u_char sd_lun:3, // 01 logical unit number sd_pf:1, // page format bit sd_reserved1:1, // reserved sd_selftest:1, // self test bit sd_devofl:1, // device off line bit sd_unitofl:1; // unit off line bit #else u_char sd_unitofl:1, // 01 unit off line bit sd_devofl:1, // device off line bit sd_selftest:1, // self test bit sd_reserved1:1, // reserved sd_pf:1, // page format bit sd_lun:3; // logical unit number #endif u_char sd_reserved2; // 02 reserved byte u_char BE_sd_pll[2]; // 03-04 parameter list length (16 bits! // defined this way because its on an odd byte boundary) u_char sd_control; // 05 control byte }; // // Command reply structure definitions // struct capacity2_reply { u_int BE_cr_lastlba; // 00-03 last logical block address (number of blocks - 1) u_int BE_cr_blklen; // 04-07 block length (in bytes) }; struct inquiry2_reply { #ifdef __BIG_ENDIAN__ u_char ir_peripheralqualifier:3, // 00 peripheral qualifier flags ir_devicetype:5; // device type, see below u_char ir_removable:1, // 01 removable media bit ir_typequalifier:7; // device type qualifier u_char ir_isoversion:2, // 02 ISO version number ir_ecmaversion:3, // ECMA version number ir_ansiversion:3; // ANSI version number u_char ir_aenc: 1, // 03 Asynchronous event notification ir_trmiop: 1, // terminate I/O process ir_zero4:2, // reserved ir_rspdatafmt:4; // response data format u_char ir_addlistlen; // 04 additional list length u_char ir_reserved5; // 05 reserved u_char ir_reserved6; // 06 reserved u_char ir_reladr: 1, // 07 relative addressing mode supported ir_wbus32: 1, // 32 bit wide bus supported ir_wbus16:1, // 16 bit wide bus supported ir_sync:1, // synchronous transfer supported ir_linked:1, // linked commands supported ir_zero5:1, // reserved ir_cmdque:1, // command queuing supported ir_sftre:1; // soft reset supported #else u_char ir_devicetype:5, // 00 device type, see below ir_peripheralqualifier:3; // peripheral qualifier flags u_char ir_typequalifier:7, // 01 device type qualifier ir_removable:1; // removable media flag u_char ir_ansiversion:3, // 02 ANSI version number ir_ecmaversion:3, // ECMA version number ir_isoversion:2; // ISO version number u_char ir_rspdatafmt:4, // 03 response data format ir_zero4:2, // reserved ir_trmiop:1, // terminate I/O process ir_aenc:1; // Asynchronous event notification u_char ir_addlistlen; // 04 additional list length u_char reserved5; // 05 reserved u_char reserved6; // 06 reserved u_char ir_sftre:1, // 07 soft reset supported ir_cmdque:1, // command queuing supported ir_zero5:1, // reserved ir_linked:1, // linked commands supported ir_sync:1, // synchronous transfer supported ir_wbus16:1, // 16 bit wide bus supported ir_wbus32:1, // 32 bit wide bus supported ir_reladr:1; // relative addressing mode supported #endif char ir_vendorid[8]; // 08 - 15 vendor name in ascii char ir_productid[16]; // 16 - 31 product name in ascii char ir_revision[4]; // 32 - 35 revision level info in ascii char ir_vendorspecific[20]; // 36 - 55 vendor specific information char ir_zero6[40]; // 56 - 95 reserved char ir_endofid[1]; // 96 just a handle for end of id info }; struct esense2_reply // Table 7-35 { #ifdef __BIG_ENDIAN__ u_char valid: 1, // 00 0 = non-standard, 1 = standard format errorClass:3, // error class errorCode: 4; // error code u_char segmentNumber; // 01 number of current segment descriptor u_char filemark: 1, // 02 filemark read or set eom: 1, // end of medium ili: 1, // incorrect length indicator reserved_2 : 1, // reserved senseKey: 4; // sense keys (tables 7-39 and 7-40) #else u_char errorCode: 4, // 00 error code errorClass: 3, // error class valid: 1; // 0 = non-standard, 1 = standard format u_char segmentNumber; // 01 number of current segment descriptor u_char senseKey: 4, // 02 sense keys (tables 7-39 and 7-40) reserved_2: 1, // reserved ili: 1, // incorrect length indicator eom: 1, // end of medium filemark: 1; // filemark read or set #endif u_char BE_information[4]; // 03-06 information (device type and command specific) u_char addSenseLength; // 07 additional sense bytes u_int BE_csi; // 08-11 command specific information u_char addSenseCode; // 12 additional sense code u_char addSenseCodeQualifier; // 13 additional sense code qualifier u_char fruc; // 14 field replacable unit code union senseKeySpecificField; // 15-17 sense key specific bytes (see below) }; struct FieldPointer // Table 7-36 { #ifdef __BIG_ENDIAN__ u_char sksv: 1, // 15 sense key specific valid cd: 1, // command/data reserved15: 1, // reserved bpv: 1, // bit pointer valid bitPointer: 3; // bit pointer #else u_char bitPointer: 3, // 15 bit pointer bpv: 1, // bit pointer valid reserved15: 2, // reserved cd: 1, // command/data sksv: 1; // sense key specific valid #endif u_short BE_fieldPointer; // 16-17 field pointer }; struct ActualRetryCount // Table 7-37 { #ifdef __BIG_ENDIAN__ u_char sksv: 1, // 15 sense key specific valid reserved15: 7; // reserved #else u_char reserved: 7, // 15 reserved sksv: 1; // sense key specific valid #endif u_short BE_fieldPointer; // 16-17 field pointer }; struct FormatProgressIndication // Table 7-38 { #ifdef __BIG_ENDIAN__ u_char sksv: 1, // 15 sense key specific valid reserved: 7; // reserved #else u_char reserved: 7, // 15 reserved sksv: 1; // sense key specific valid #endif u_short BE_progressIndication; // 16-17 percent complete indicator }; union senseKeySpecificField { struct FieldPointer fp; struct ActualRetryCount arc; struct FormatProgressIndication fpi; }; // // Mode parameter information structs // struct SADModeParameterHeader6 // Table 7-61 { u_char modeDataLength; // 00 length in bytes of mode sense data u_char mediumType; // 01 media type (device type specific) #ifdef __BIG_ENDIAN__ u_char wp: 1, // 02 write protect bit bufferedMode: 3, // buffer mode speed: 4; // speed #else u_char speed: 4, // 02 speed bufferedMode: 3, // buffer mode wp: 1; // write protect #endif u_char blockDescriptorLength; // 03 length in bytes of all block descriptors }; struct DADModeParameterHeader6 // Table 7-61 { u_char modeDataLength; // 00 length in bytes of mode sense data u_char mediumType; // 01 media type (device type specific) #ifdef __BIG_ENDIAN__ u_char wp: 1, // 02 write protect flag _reserved2: 2, // reserved cache: 1, // cache enabled flag _reserved3:4; // reserved #else u_char _reserved3: 4, // 02 reserved cache: 1, // cache enabled flag _reserved2: 2, // reserved wp: 1; // write protect flag #endif u_char blockDescriptorLength; // 03 length in bytes of all block descriptors }; union ModeParameterHeader6 { struct DADModeParameterHeader6 dad; struct SADModeParameterHeader6 sad; }; struct ModeParameterBlockDescriptor // Table 7-63 { u_char densityCode; // 00 unique for each device type u_char BE_numberOfBlocks[3]; // 01-03 number of blocks (24 bits! bytes 2, 1, 0) u_char _reserved4; // 04 reserved u_char BE_blockLength[3]; // 05-07 block length (24 bits! bytes 2, 1, 0) }; // // Mode sense/mode select page structs for all devices // struct ModePageFormatHeader // Table 7-64 { #ifdef __BIG_ENDIAN__ u_char ps: 1, // 00 parameters savable bit _reserved1: 1, // reserved pageCode: 6; // page code #else u_char pageCode: 6, // 00 page code _reserved1: 1, // reserved ps: 1; // parameters savable bit #endif u_char pageLength; // 01 page length in bytes }; struct GenericPage { struct ModePageFormatHeader pageHeader; // 00-01 page header }; struct PeripheralPage // Table 7-70 { struct ModePageFormatHeader pageHeader; // 00 - 01 page header u_short BE_interfaceIndentifier; // 02 - 03 interface identifier (Table 7-71) u_char _reserved4, // 04 reserved _reserved5, // 05 reserved _reserved6, // 06 reserved _reserved7; // 07 reserved u_char vendorSpecific; // 08 - ?? start of vendor specific area }; struct ControlModePage // Table 7-66 { struct ModePageFormatHeader pageHeader; // 00-01 page header #ifdef __BIG_ENDIAN__ u_char _reserved2: 7, // 02 reserved rlec: 1; // report log exception condition bit u_char queueAlgorithmModifier: 4, // 03 queue algorithm modifier _reserved3: 2, // reserved qErr: 1, // queue error management dQue: 1; // disable queuing u_char eeca: 1, // 04 enable extended contingent allegiance _reserved4: 4, // reserved raenp: 1, // ready AEN permission uaaenp: 1, // unit attention AEN permission eaenp: 1; // error AEN permission #else u_char rlec: 1, // 02 report log exception condition _reserved2: 7; // reserved u_char dQue: 1, // 03 disable queuing qErr: 1, // queue error management _reserved3: 2, // reserved queueAlgorithmModifier: 4; // 04 queue algorithm modifier u_char eaenp: 1, // errror AEN permission uaaenp: 1, // unit attention aen permission raenp: 1, // ready AEN permission _reserved4: 4, // reserved eeca: 1; // enable extended contingent allegiance #endif u_char _reserved5; // 05 reserved u_short BE_readyAENHoldoffPeriod; // 06-07 ready AEN hold-off period (milliseconds) }; struct DisconnectReconnectPage // Table 7-68 { struct ModePageFormatHeader pageHeader; // 00-01 page header u_char bufferFullRatio, // 02 buffer full ratio bufferEmptyRatio; // 03 buffer empty ratio u_short BE_busInactivityLimit, // 04-05 bus inactivity limit (100 ms increments) BE_disconnectTimeLimit, // 06-07 disconnect time limit (100 ms increments) BE_connectTimeLimit, // 08-09 connect time limit (100 ms increments) BE_maximumBurstSize; // 10-11 maximum burst size (512 byte increments) #ifdef __BIG_ENDIAN__ u_char _reserved12: 6, // 12 reserved dtdc: 2; // data transfer disconnect control (Table 7-69) #else u_char dtdc: 2, // 12 data transfer disconnect control (Table 7-69) _reserved12: 6; // reserved #endif u_char _reserved13, // 13 reserved _reserved14, // 14 reserved _reserved15; // 15 reserved }; // // Mode sense/mode select page structs for direct access devices // struct CachingPage // Table 8-48 { struct ModePageFormatHeader pageHeader; // 00-01 page header #ifdef __BIG_ENDIAN__ u_char _reserved2:5, // 02 reserved wce: 1, // write cache enabled mf: 1, // interpret min/max prefetch as multiplication factor rcd: 1; // read cache disabled u_char drrp: 4, // 03 demand read retention priority (see Table 8-49) wrp: 4; // write retention priority (see Table 8-49) #else u_char rcd:1, // 02 read cache disabled mf:1, // interpret min/max prefetch as multiplication factor wce:1, // write cache enabled _reserved2:5; // reserved u_char wrp:4, // 03 write retention priority (see Table 8-49) drrp:4; // demand read retention priority (see table 8-49) #endif u_short BE_dptl; // 04-05 disable pre-fetch transfer length u_short BE_minPrefetch; // 06-07 minimum pre-fetch (interpretation depends on mf bit) u_short BE_maxPrefetch; // 08-09 maximum pre-fetch (interpretation depends on mf bit) u_short BE_maxPrefetchCeiling; // 10-11 maximum pre-fetch cieling (in sectors) }; struct FlexibleDiskPage // Table 8-49 and 8-50 { struct ModePageFormatHeader pageHeader; // 00-01 page header u_short BE_transferRate; // 02-03 data rate in kilobits/second u_char numHeads, // 04 number of read/write heads sectorsPerTrack; // 05 number of sectors per revolution per head u_short BE_dataBytesPerSector, // 06-07 number of bytes of data in a sector BE_numCylinders, // 08-09 number of cylinders used for data storage BE_scwp, // 10-11 starting cylinder for write precompensation BE_scrwc, // 12-13 starting cylinder for reduced write current BE_driveStepRate; // 14-15 step rate in units of 100 microseconds u_char driveStepPulseWidth; // 16 width of the step pulse in microseconds (0 = default) u_short BE_headSettleDelay; // 17-18 head settle time in units of 100 microseconds (0 = default) u_char motorOnDelay, // 19 motor on delay in units of 1/10ths of a second motorOffDelay; // 20 motor off delau in units of 1/10ths of a second #ifdef __BIG_ENDIAN__ u_char trdy: 1, // 21 true ready signal provided ssn: 1, // sector start number (0 or 1) mo: 1, // motor on (pin 16) handling _reserved21: 5; // reserved u_char _reserved22: 4, // 22 reserved spc: 4; // additional head step pulses required per cylinder u_char wpv, // 23 amount of write pre-compenstion (vendor specific) headLoadDelay, // 24 head loading time in milliseconds (0 = default) headUnloadDelay; // 25 head unloading time in milliseconds (0 = default) u_char pin34: 4, // 26 defines usage of pin 34 pin2: 4; // defines usage of pin 2 u_char pin4: 4, // 27 defines usage of pin 4 pin1: 4; // defines usage of pin 1 #else u_char _reserved21:5, // 21 reserved mo:1, // motor on (pin 16) handling ssn:1, // sector start number (0 or 1) trdy:1; // true ready signal provided u_char spc:4, // 22 additional head step pulses required per cylinder _reserved22:4; // reserved u_char wpv, // 23 amount of write pre-compensation (vendor specific) headLoadDelay, // 24 head loading time in milliseconds (0 = default) headUnloadDelay; // 25 head unloading time in milliseconds (0 = default) u_char pin2:4, // 26 defines usage of pin 2 pin34:4; // defines usage of pin 34 u_char pin1:4, // 27 defines usage of pin 4 pin4:4; // defines usage of pin 1 #endif u_short BE_mediumRotationRate; // 28-29 medium rotation rate in rotations per minute u_char _reserved30, // 30 reserved _reserved31; // 31 reserved }; struct FormatDevicePage // Table 8-52 { struct ModePageFormatHeader pageHeader; // 00-01 page geader u_short BE_tracksPerZone, // 02-03 tracks per zone BE_altSectorsPerZone, // 04-05 alternate sectors per zone BE_altTracksPerZone, // 06-07 alternate tracks per zone BE_altTracksPerUnit, // 08-09 alternate tracks per logical unit BE_sectorsPerTrack, // 10-11 sectors per track BE_dataBytesPerSector, // 12-13 data bytes per physical sector BE_interleave, // 14-15 interleave BE_trackSkewFactor, // 16-17 track skew factor BE_cylinderSkewFactor; // 18-19 cylinder skew factor #ifdef __BIG_ENDIAN__ u_char ssec: 1, // 20 soft sector formatting hsec: 1, // hard sector formatting rmb: 1, // removable media surf: 1, // sequential blocks by surface (1) or cylinder (0) _reserved20: 4; // reserved #else u_char _reserved20: 4, // 20 reserved surf: 1, // sequential blocks by surface (1) or cylinder (0) rmb: 1, // removable media hsec: 1, // hard sector formatting ssec: 1; // soft sector formatting #endif u_char _reserved21; // 21 reserved u_char _reserved22; // 22 reserved u_char _reserved23; // 23 reserved }; struct MediumTypesPage // Table 8-53 { struct ModePageFormatHeader pageHeader; // 00-01 page header u_char _reserved2, // 02 reserved _reserved3; // 03 reserved u_char mediumType[4]; // 04-07 media types supported by target }; struct NotchPage // Table 8-54 { struct ModePageFormatHeader pageHeader; // 00-01 page header #ifdef __BIG_ENDIAN__ u_char nd: 1, // 02 notched drive lpn: 1, // logical or physical notch _reserved2: 6; // reserved #else u_char _reserved2: 6, // 02 reserved lpn: 1, // logical or physical notch nd: 1; // notched drive #endif u_char _reserved3; // 03 reserved u_short BE_maxNotches, // 04-05 maximum number of notches supported BE_activeNotch; // 06-07 currently active notch u_long BE_startingBoundary, // 08-11 beginning of current notch BE_endingBoundary; // 12-15 end of current notch u_char BE_pagesNotched[8]; // 16-23 bit-map of notch variable mode page codes }; struct RWErrorRecoveryPage // Table 8-55 { struct ModePageFormatHeader pageHeader; // 00-01 page header #ifdef __BIG_ENDIAN__ u_char awre: 1, // 02 automatic write reallocation enabled arre: 1, // automatic read reallocation enabled tb: 1, // transfer block rc: 1, // read continuous eer: 1, // enable early recovery (see Table 8-56) per: 1, // post error (see Table 8-56) dte: 1, // disable transfer on error (see Table 8-56) dcr: 1; // disable correction (see Table 8-56) #else u_char dcr: 1, // 02 disable correction (see Table 8-56) dte: 1, // disable transfer on error (see Table 8-56) per: 1, // post error (see Table 8-56) eer: 1, // enable early recovery (see Table 8-56) rc: 1, // read continuous flag tb: 1, // transfer block arre: 1, // automatic read reallocation enabled awre: 1; // automatic write reallocation enabled #endif u_char readRetryCount, // 03 read retry count correctionSpan, // 04 size in bits of largest error to attempt correction for headOffsetCount, // 05 head offset in two's complement dataStrobeOffsetCount, // 06 data strobe offset in two's complement _reserved7, // 07 reserved writeRetryCount, // 08 write retry count _reserved9; // 09 reserved u_short BE_recoveryTimeLimit; // 10-11 maximum time duration for error recovery in milliseconds }; struct RigidDiskPage // Table 8-61 { struct ModePageFormatHeader pageHeader; // 00-01 page header u_char BE_numCylinders[3]; // 02-04 number of physical cylinders used for data storage. u_char numHeads; // 05 number of physical heads used for data storage u_char BE_scwp[3]; // 06-08 start cylinder for write pre-compensaction u_char BE_scrwc[3]; // 09-11 start cylinder for reduced write current u_short BE_driveStepRate; // 12-13 step rate in 100 nanosecond intervals u_char BE_landingZoneCylinder[3]; // 14-16 two's complement location for head positioning #ifdef __BIG_ENDIAN__ u_char _reserved17: 6, // 17 reserved rpl: 2; // rotational position locking (see Table 8-62) #else u_char rpl:2, // 17 rotational position locking (see Table 8-62) _reserved17:6; // reserved #endif u_char rotationalOffset; // 18 amount of rotational skew to use when synchronized u_char _reserved19; // 19 reserved u_short BE_mediumRotationRate; // 20-21 medium rotation rate in rotations per minute u_char _reserved22, // 22 reserved _reserved23; // 23 reserved }; struct VErrorRecoveryPage // Table 8-63 { struct ModePageFormatHeader pageHeader; // 00-01 page header #ifdef __BIG_ENDIAN__ u_char _reserved2:4, // 02 reserved eer:1, // enable early recovery (see Table 8-56) per:1, // post error (see Table 8-56) dte:1, // disable transfer on error (see Table 8-56) dcr:1; // disable correction (see Table 8-56) #else u_char dcr:1, // 02 disable correction (see Table 8-56) dte:1, // disable transfer on errror (see Table 8-56) per:1, // post error (see Table 8-56) eer:1, // enable early recovery (see Table 8-56) _reserved2:4; // reserved #endif u_char verifyRetryCount, // 03 verify retry count verifyCorrectionSpan, // 04 size in bits of largest error to attempt recovery for _reserved5, // 05 reserved _reserved6, // 06 reserved _reserved7, // 07 reserved _reserved8, // 08 reserved _reserved9; // 09 reserved u_short BE_recoveryTimeLimit; // 10 verify recovery time limit in milliseconds }; // // Mode sense/mode select page structs for sequential access devices // struct DeviceConfigurationPage // Table 9-24 { struct ModePageFormatHeader pageHeader; // 00-01 page header #ifdef __BIG_ENDIAN__ u_char _reserved2:1, // 02 reserved changeActivePartition:1, // change active partition to that specified in activePartition changeActiveFormat:1, // change active format to that specifed in activeFormat activeFormat:5; // specifies active recording format (vendor specific) #else u_char activeFormat:5, // 02 specifies active recording format (vendor specific) changeActiveFormat:1, // change active format to that specified in activeFormat changeActivePartition:1, // change active partition to that specified in activePartition _reserved2:1; // reserved #endif u_char activePartition; // 03 current logical partition number in use on medium u_char writeBufferFullRatio; // 04 indicates how full buffer should be before writing to medium u_char readBufferEmptyRatio; // 05 indicates how empty buffer should be before reading from medium u_short BE_writeDelayTime; // 06-07 maximum write delay time in 100 millisecond increments #ifdef __BIG_ENDIAN__ u_char dbr:1, // 08 data buffer recovery bis:1, // block identifiers supported rsmk:1, // report set marks avc:1, // automatic velocity control socf:2, // stop on consecutive filemarks rbo:1, // recover buffer order rew:1; // report early warning u_char gapSize; // 09 inter-block gap size u_char eod:3, // 10 end of data defined eeg:1, // enable eod generation sew:1, // synchronize early warning _reserved10:3; // reserved #else u_char rew:1, // 08 report early warning rbo:1, // recover buffer order socf:2, // stop on consecutive filemarks avc:1, // automatic velocity control rsmk:1, // report set marks bis:1, // block identifiers supported dbr:1; // data buffer recovery u_char gapSize; // 09 inter-block gap size u_char _reserved10:3, // 10 reserved sew:1, // synchronize early warning eeg:1, // enable eod generation eod:3; // end of data defined #endif u_char BE_bufferSizeAtEarlyWarning[3]; // 11-13 buffer size in bytes while writing after early-warning u_char selectDataCompressionAlgorithm; // 14 vendor specific compression algorithm specifier u_char _reserved15; // 15 reserved }; // // Mode sense/select pages for CDROM // struct CDROMParametersPage // Table 13-36 { struct ModePageFormatHeader pageHeader; // 00-01 page header u_char _reserved2; // 02 reserved #ifdef __BIG_ENDIAN__ u_char _reserved3:4, // 03 reserved inactivityTimerMult:4; // inactivity timer multiplier #else u_char inactivityTimerMult:4, // 03 inactivity timer multiplier _reserved3:4; // reserved #endif u_short BE_sPerMunits; // 04-05 number of MSF S units per MSF M unit u_short BE_fPerSunits; // 06-07 number of MSF F units per MSF S unit }; struct CDROMAudioControlPage // Table 13-35 { struct ModePageFormatHeader pageHeader; // 00-01 page header #ifdef __BIG_ENDIAN__ u_char _reserved2:5, // 02 reserved immed:1, // immediate mode sotc:1, // stop on track crossing _reserved2a:1; // reserved u_char _reserved3; // 03 reserved u_char _reserved4; // 04 reserved u_char aprval:1, // 05 audio playback rate valid _reserved5:3, // reserved format:4; // format of lbas/second u_short BE_lbsplayback; // 06-07 logical blocks/second of audio playback u_char _reserved8:4, // 08 reserved output0selection:4; // audio output port 0 channel selection (Table 13-35) u_char output0volume; // 09 audio output port 0 volume selection u_char _reserved10:4, // 10 reserved output1selection:4; // audio output port 1 channel selection (Table 13-35) u_char output1volume; // 11 audio output port 1 volume selection u_char _reserved12:4, // 12 reserved output2selection:4; // audio output port 2 channel selection (Table 13-35) u_char output2volume; // 13 audio output port 2 volume selection u_char _reserved14:4, // 14 reserved output3selection:4; // audio output port 3 channel selection (Table 13-35) u_char output3volume; // 15 audio output port 3 volume selection #else u_char _reserved2a:1, // 02 reserved sotc:1, // stop on track crossing immed:1, // immediate mode _reserved2:5; // reserved u_char _reserved3; // 03 reserved u_char _reserved4; // 04 reserved u_char format:4, // 05 format of lbas/second _reserved5:3, // reserved aprval:1; // audio playback rate valid u_short BE_lbsplayback; // 06-07 logical blocks/second of audio playback u_char output0selection:4, // 08 audio output port 0 channel selection (Table 13-35) _reserved8:4; // reserved u_char output0volume; // 09 audio output port 0 volume selection u_char output1selection:4, // 10 audio output port 1 channel selection (Table 13-35) _reserved10:4; // reserved u_char output1volume; // 11 audio output port 1 volume selection u_char output2selection:4, // 12 audio output port 2 channel selection (Table 13-35) _reserved12:4; // reserved u_char output2volume; // 13 audio output port 2 volume selection u_char output3selection:4, // 14 audio output port 3 channel selection (Table 13-35) _reserved14:4; // reserved u_char output3volume; // 15 audio output port 3 volume selection #endif }; union PageFormat { struct CachingPage caching; struct CDROMAudioControlPage cdaudio; struct CDROMParametersPage cdparameters; struct ControlModePage controlMode; struct DisconnectReconnectPage disconnectReconnect; struct FlexibleDiskPage flexibleDisk; struct FormatDevicePage formatDevice; struct GenericPage genericPage; struct MediumTypesPage mediumTypes; struct NotchPage notch; struct RigidDiskPage rigidDisk; struct RWErrorRecoveryPage rwErrorRecovery; struct VErrorRecoveryPage vErrorRecovery; struct DeviceConfigurationPage deviceConfiguration; }; struct mode_parameters { union ModeParameterHeader6 mph; struct ModeParameterBlockDescriptor mpbd[8]; union PageFormat mpp[MAXPAGES]; int BE_blockDescriptorCount; int BE_pageCount; }; // // CD_ROM structures // // I haven't gotten around to commenting or testing any structures beyond this point... struct subqchannel_page { #ifdef __BIG_ENDIAN__ u_char sc_adr:4, /* Q mode info */ sc_control:4; /* sub-c Q control bits */ #else u_char sc_control:4, sc_adr:4; #endif u_char sc_track; /* track # */ u_char sc_index; /* index # */ u_int BE_sc_absoluteaddress; /* CD-ROM absolute address */ u_int BE_sc_trackrelative; /* CD-ROM track relative address */ #ifdef __BIG_ENDIAN u_char sc_mcval: 1, /* media catalogue valid */ sc_reserved16:7; #else u_char sc_reserved16:7, sc_mcval:1; #endif char sc_mediacatalog[15]; /* media catalogue # (UPC/Barcode) */ #ifdef __BIG_ENDIAN__ u_char sc_tcval:1, /* track code valid */ sc_reserved32:7; #else u_char sc_reserved32:7, sc_tcval:1; #endif char sc_trackisrc[15]; /* track international standard recording code */ }; struct cdromposition_page { #ifdef __BIG_ENDIAN__ u_char sc_adr:4, /* Q mode info */ sc_control:4; /* sub-c Q control bits */ #else u_char sc_control:4, sc_adr:4; #endif u_char sc_track; /* track # */ u_char sc_index; /* index # */ u_int BE_sc_absoluteaddress; /* CD-ROM absolute address */ u_int BE_sc_trackrelative; /* CD-ROM track relative address */ }; struct mediacatalog_page { u_char sc_reserved5; u_char sc_reserved6; u_char sc_reserved7; #ifdef __BIG_ENDIAN__ u_char sc_mcval: 1, /* media catalogue valid */ sc_reserved8:7; #else u_char sc_reserved8:7, sc_mcval: 1; #endif char sc_mediacatalog[15]; /* media catalogue # (UPC/Barcode) */ }; struct trackisrc_page { u_char sc_track; u_char sc_reserved6; u_char sc_reserved7; #ifdef __BIG_ENDIAN__ u_char sc_tcval: 1, /* media catalogue valid */ sc_reserved8:7; #else u_char sc_reserved8:7, sc_tcval: 1; #endif char sc_trackisrc[15]; /* track international standard recording code */ }; struct vendorunique_page { u_short BE_sc_rawdata[30]; }; union subcpages { struct subqchannel_page subq; struct cdromposition_page position; struct mediacatalog_page mediacatalog; struct trackisrc_page trackisrc; struct vendorunique_page vendorunique; } ; struct subchannelReply { u_char sc_reserved0; /* Reserved */ u_char sc_audiostatus; u_short BE_sc_datalength; /* Sub-channel data length */ u_char sc_dataformat; /* data format code */ union subcpages data; }; struct tocTrackDescriptor { u_char toc_reserved0; #ifdef __BIG_ENDIAN__ u_char toc_adr:4, toc_control:4; #else u_char toc_control:4, toc_adr:4; #endif u_char toc_track; u_char toc_reserved3; u_int BE_toc_absoluteaddress; } ; struct tocReply { u_short BE_toc_datalength; /* TOC Data length */ u_char toc_firsttrack; u_char toc_lasttrack; struct tocTrackDescriptor track[100]; };
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.