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.