ftp.nice.ch/pub/next/tools/scsi/SCSI2_ToolBox.940921.NI.bs.tar.gz#/SCSI2_ToolBox/SCSI2_Kit/Source/scsi2reg.h

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.