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.78 94/11/27 17:01:29 chris Exp $" #ifndef _BSD_DEV_SCSIREG_ #define _BSD_DEV_SCSIREG_ #import <sys/ioctl.h> #import <sys/time.h> #import <kernserv/queue.h> #import <sys/types.h> // **************** // Define Constants // **************** // cdb control byte values #define CTRL_NOLINK 0x00 // no command linking #define CTRL_LINK 0x01 // link only #define CTRL_LINKFLAG 0x03 // link and flag bits // six byte cdb opcodes #define C6OP_TESTRDY 0x00 // test unit ready #define C6OP_REWIND 0x01 // rewind #define C6OP_REZEROUNIT 0x01 // rezero unit #define C6OP_REQSENSE 0x03 // request sense #define C6OP_FORMAT 0x04 // format unit #define C6OP_READBLOCKLIMITS 0x05 // Read block limits (tape) #define C6OP_REASSIGNBLK 0x07 // OPT: reassign block #define C6OP_READ 0x08 // read data #define C6OP_WRITE 0x0a // write data #define C6OP_SEEK 0x0b // seek #define C6OP_READREV 0x0F // read reverse #define C6OP_WRTFM 0x10 // write filemarks #define C6OP_SPACE 0x11 // space records/filemarks #define C6OP_INQUIRY 0x12 // get device specific info #define C6OP_VERIFY 0x13 // sequential verify #define C6OP_MODESELECT 0x15 // OPT: set device parameters #define C6OP_MODESENSE 0x1a // OPT: get device parameters #define C6OP_STARTSTOP 0x1b // OPT: start or stop device #define C6OP_RECEIVEDIAG 0x1C // Receive diagnostic #define C6OP_SENDDIAG 0x1d // send diagnostic #define C6OP_MEDIUMREMOVAL 0x1e // Prevent/Allow Medium Removal // ten byte cdb opcodes #define C10OP_READCAPACITY 0x25 // read capacity #define C10OP_READEXTENDED 0x28 // read extended #define C10OP_WRITEEXTENDED 0x2a // write extended #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) // extended sense command status byte codes #define STAT_GOOD 0x00 // cmd successfully completed #define STAT_CHECK 0x02 // abnormal condition occurred #define STAT_CONDMET 0x04 // condition met / good #define STAT_BUSY 0x08 // target busy #define STAT_INTMGOOD 0x10 // intermediate / good #define STAT_INTMCONDMET 0x14 // intermediate / cond met / good #define STAT_RESERVED 0x18 // reservation conflict #define STAT_MASK 0x1e // clears vendor unique bits #define STAT_VALIDMASK 0x3e // Valid bits of Status Byte #define STAT_TERMINATED 0x22 // command terminated #define STAT_QUEUEFULL 0x28 // queue full // extended sense command sense key codes #define SENSE_NOSENSE 0x0 // no error to report #define SENSE_RECOVERED 0x1 // recovered error #define SENSE_NOTREADY 0x2 // target not ready #define SENSE_MEDIA 0x3 // media flaw #define SENSE_HARDWARE 0x4 // hardware failure #define SENSE_ILLEGALREQUEST 0x5 // illegal request #define SENSE_UNITATTENTION 0x6 // drive attention #define SENSE_DATAPROTECT 0x7 // drive access protected #define SENSE_ABORTEDCOMMAND 0xb // target aborted command #define SENSE_VOLUMEOVERFLOW 0xd // eom, some data not transfered #define SENSE_MISCOMPARE 0xe // source/media data mismatch // extended sense command device qualifiers #define DEVQUAL_OK 0x00 // device is connected to this lun #define DEVQUAL_MIA 0x01 // device not connected to lun #define DEVQUAL_RSVD 0x02 // reserved #define DEVQUAL_NODEV 0x03 // target doesn't support dev on lun #define DEVQUAL_VUMASK 0x04 // 1XXb is vendor specific // inquiry command device types #define DEVTYPE_DISK 0x00 // read/write disks #define DEVTYPE_TAPE 0x01 // tapes and other sequential devices #define DEVTYPE_PRINTER 0x02 // printers #define DEVTYPE_PROCESSOR 0x03 // cpu's #define DEVTYPE_WORM 0x04 // write-once optical disks #define DEVTYPE_CDROM 0x05 // cd rom's, etc #define DEVTYPE_SCANNER 0x06 // scanner #define DEVTYPE_OPTICAL 0x07 // other optical storage #define DEVTYPE_CHANGER 0x08 // jukebox #define DEVTYPE_COMM 0x09 // communication device #define DEVTYPE_GRAPH_A 0x0a // ASC IT8 graphics #define DEVTYPE_GRAPH_B 0x0b // ASC IT8 graphics #define DEVTYPE_NOTPRESENT 0x1f // logical unit not present // miscellaneous constants #define MAXPAGES 8 // maximum number of mode select pages #define MAXBLOCKDESCRIPTORS 8 // maximum number of block descriptors #define MODESENSEBUFLENGTH 200 // size for mode sense buffer length #define KILOBYTE 1024 // kilobyte #define MEGABYTE 1048576 // a "real" binary megabyte #define CDB_6_MAX_LENGTH 255 // max block count for 6 byte commands #define CDB_6_MAX_LBA ((1<<21)-1) // max block address for 6 byte commands #define SCSI_NTARGETS 8 // 0 - 7 for target numbers #define SCSI_NLUNS 8 // 0 - 7 luns for each target // mode select/sense page codes #define RWERRORRECOVERYPAGE 0x01 // read write error recovery page #define DISCONNECTPAGE 0x02 // disconnect/reconnect page #define FORMATDEVICEPAGE 0x03 // format device page #define RIGIDDISKPAGE 0x04 // rigid disk page #define FLEXIBLEDISKPAGE 0x05 // flexible disk page #define VERRORRECOVERYPAGE 0x07 // verify error recovery page #define CACHINGPAGE 0x08 // caching page #define PERIPHERALPAGE 0x09 // peripheral page #define CONTROLMODEPAGE 0x0A // control mode page #define MEDIUMTYPESPAGE 0x0B // medium types page #define NOTCHPAGE 0x0C // notch page #define CDROMPARAMETERSPAGE 0x0D // cdrom parameters page #define CDROMAUDIOCONTROLPAGE 0x0E // cdrom audio control page #define DEVICECONFIGPAGE 0x10 // device configuration page // scsi_req status codes typedef enum { SR_IOST_GOOD = 0, // successful SR_IOST_SELTO = 1, // selection timeout SR_IOST_CHKSV = 2, // check status, sr_esense valid SR_IOST_CHKSNV = 3, // check status, sr_esense not valid SR_IOST_DMAOR = 4, // target attempted to move more than sr_dma_max bytes SR_IOST_IOTO = 5, // sr_ioto exceeded SR_IOST_BV = 6, // SCSI Bus violation SR_IOST_CMDREJ = 7, // command reject (by driver) SR_IOST_MEMALL = 8, // memory allocation failure SR_IOST_MEMF = 9, // memory fault SR_IOST_PERM = 10, // not super user SR_IOST_NOPEN = 11, // device not open SR_IOST_TABT = 12, // target aborted command ST_IOST_BADST = 13, // bad SCSI status byte ST_IOST_INT = 14, // internal driver error SR_IOST_BCOUNT = 15, // unexpected byte count seen on SCSI bus SR_IOST_VOLNA = 16, // desired volume not available SR_IOST_WP = 17, // Media Write Protected SR_IOST_ALIGN = 18, // DMA alignment error SR_IOST_IPCFAIL = 19, // Mach IPC failure SR_IOST_RESET = 20, // bus was reset during processing of command SR_IOST_PARITY = 21, // SCSI Bus Parity Error SR_IOST_HW = 22, // Gross Hardware Failure SR_IOST_DMA = 23, // DMA error SR_IOST_INVALID = 100, // should never be seen } sc_status; #define SR_IOST_BADST ST_IOST_BADST #define SR_IOST_INT ST_IOST_INT // dma direction specifier for scsi_req typedef enum { SR_DMA_RD = 0, // DMA from device to host SR_DMA_WR = 1, // DMA from host to device } sc_dma_dir; // generic SCSI ioctl requests #define SGIOCREQ _IOWR('s', 1, struct scsi_req) // cmd request using struct scsi_req (use with openDevice:) #define SGIOCSTL _IOW('s', 0, struct scsi_adr) // set target/lun #define SGIOCENAS _IO( 's', 2) // enable autosense #define SGIOCDAS _IO( 's', 3) // disable autosense #define SGIOCRST _IO( 's', 4) // reset SCSI bus #define SGIOCCNTR _IOW( 's', 6, int) // select controller // ioctl requests specific to SCSI disks #define SDIOCSRQ _IOWR('s', 1, struct scsi_req) // cmd request using struct scsi_req (use with openDevice:) #define SDIOCGETCAP _IOR('s', 5, struct capacity_reply) // get read capacity info // ioctl requests specific to SCSI tapes #define MTIOCSRQ _IOWR('m', 11, struct scsi_req) // cmd request using struct scsi_req (use with openDevice:) #define MTIOCFIXBLK _IOW('m', 5, int ) // set fixed block mode #define MTIOCVARBLK _IO('m', 6) // set variable block mode #define MTIOCMODSEL _IOW('m', 7, struct modesel_parms) // mode select #define MTIOCMODSEN _IOWR('m',8, struct modesel_parms) // mode sense #define MTIOCINILL _IO('m', 9) // inhibit illegal length errors #define MTIOCALILL _IO('m', 10) // allow illegal length errors // ***************** // 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 end // with _BExx, 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 postfixed with _BExx 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 _BExx element is oddly aligned the element is // declared as an array of characters - be careful to specify // the correct element bit length! (ie: someElement_BE24[3] is 24 // bits long and would be read using this function call: // val = readBigEndianValue(&struct.someElement_BE24, 24); // // // Command reply structure definitions // struct capacity_reply // Reply structure for read capacity command { u_int cr_lastlba_BE32; // 00-03 last logical block address (number of blocks - 1) u_int cr_blklen_BE32; // 04-07 block length (in bytes) }; struct inquiry_reply // Reply structure for inquiry command { #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 ir_reserved5; // 05 reserved u_char ir_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 }; typedef struct esense_reply // Table 7-35 reply structure for extended sense command { #ifdef __BIG_ENDIAN__ u_char esr_valid:1, // 00 0 = non-standard, 1 = standard format esr_errorclass:3, // error class esr_errorcode:4; // error code u_char esr_segmentnumber; // 01 number of current segment descriptor u_char esr_filemark:1, // 02 filemark read or set esr_eom:1, // end of medium esr_ili:1, // incorrect length indicator esr_reserved2:1, // reserved esr_sensekey:4; // sense keys (tables 7-39 and 7-40) #else u_char esr_errorcode:4, // 00 error code esr_errorclass:3, // error class esr_valid:1; // 0 = non-standard, 1 = standard format u_char esr_segmentnumber; // 01 number of current segment descriptor u_char esr_sensekey:4, // 02 sense keys (tables 7-39 and 7-40) esr_reserved_2:1, // reserved esr_ili:1, // incorrect length indicator esr_eom:1, // end of medium esr_filemark:1; // filemark read or set #endif u_char esr_information_BE32[4]; // 03-06 information (device type and command specific) u_char esr_aslength; // 07 additional sense bytes u_char esr_csi_BE32[4]; // 08-11 command specific information u_char esr_ascode; // 12 additional sense code u_char esr_asqual; // 13 additional sense code qualifier u_char esr_reserved14; // 14 u_char esr_reserved15; // 15 u_char esr_errcount[3]; // 16-18 u_char esr_stat[3]; // 19-21 u_char esr_reserved22; // 22 u_char esr_remaining[3]; // 23-25 } esense_reply; // // SCSI command data structures // struct cdb6 // generic 6 byte command descriptor block { u_char c6_opcode; // 00 device command u_char c6_lunlba_BE24[3]; // 01-03 upper 3 bits lun, lower 21 bits lba (wierd but necessary!) // access it like this: // writeBigEndianValue((lun<<21)+lba, &cdb->c6_lunlba_BE24, 24) u_char c6_len; // 04 transfer length u_char c6_ctrl; // 05 control byte }; struct cdb10 // generic 10 byte command descriptor block { 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 c10_lba_BE32[4]; // 02-05 logical block address u_char c10_reserved6; // 06 reserved: must be zero u_char c10_len_BE16[2]; // 07-08 transfer length u_char c10_ctrl; // 09 control byte }; struct cdb12 // generic 12 byte command descriptor block { u_char c12_opcode; // 00 device command #ifdef __BIG_ENDIAN__ u_char c12_lun:3, // 01 logical unit c12_dpo:1, // disable page out c12_fua:1, // force unit access c12_reserved1:2, // reserved: must be zero c12_reladr:1; // address relative to previous #else u_char c12_reladr:1, // 01 address relative to previous c12_reserved1:2, // reserved: must be zero c12_fua:1, // force unit access c12_dpo:1, // disable page out c12_lun:3; // logical unit #endif u_char c12_lba_BE32[4]; // 02-05 logical block address u_char c12_reserved6; // 06 reserved: must be zero u_char c12_reserved7; // 07 reserved: must be zero u_char c12_reserved8; // 08 reserved: must be zero u_char c12_len_BE16[2]; // 09-10 transfer length u_char c12_ctrl; // 11 control byte }; struct cdb6_mode_sense // Table 7-24 cdb for mode sense command { 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 cdb6_mode_select { u_char msl_opcode; // 00 mode select opcode #ifdef __BIG_ENDIAN__ u_char msl_lun:3, // 01 logical unit number msl_pf:1, // page format bit (1 = conforms to SCSI 2 spec) msl_reserved1:3, // reserved msl_sp:1; // save page bit #else u_char msl_sp:1, // save page bit msl_reserved1:3, // reserved msl_pf:1, // page format bit (1 = conforms to SCSI2 spec) msl_lun:3; // logical unit number #endif u_char msl_reserved2; // 02 reserved u_char msl_reserved3; // 03 reserved u_char msl_pll; // 04 parameter list length u_char msl_control; // 05 control byte }; struct cdb6_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 sd_pll_BE16[2]; // 03-04 parameter list length (16 bit word on an odd boundary!) u_char sd_control; // 05 control byte }; struct cdb6_format_unit // Table 8-2 cdb for format unit command { u_char fu_opcode; // 00 format unit opcode #ifdef __BIG_ENDIAN__ u_char fu_lun:3, // 01 logical unit number fu_fmtdata:1, // format data bit fu_cmplist:1, // complete list bit fu_dlf:3; // defect list format #else u_char fu_dlf:3, // 01 defect list format fu_cmplist:1, // complete list bit fu_fmtdata:1, // format data bit fu_lun:3; // logical unit number #endif u_char fu_reserved2; // 02 vendor specific u_char fu_interleave_BE16[2]; // 03-04 interleave value (0 = use drive default) u_char fu_control; // 05 control }; struct defect_list_header // Table 8-3 { u_char dlh_reserved0; // 00 reserved #ifdef __BIG_ENDIAN__ u_char dlh_fov:1, // 01 format options valid bit dlh_dpry:1, // disable primary bit dlh_dcrt:1, // disable certification bit dlh_stpf:1, // stop format bit dlh_ip:1, // initialization pattern bit dlh_dsp:1, // disable saving parameters dlh_immed:1, // immediate bit dlh_vs:1; // ??? #else u_char dlh_vs:1, // 01 ??? dlh_immed:1, // immediate bit dlh_dsp:1, // disable saving parameters dlh_ip:1, // initialization pattern bit dlh_stpf:1, // stop format bit dlh_dcrt:1, // disable certification bit dlh_dpry:1, // disable primary bit dlh_fov:1; // format options valid bit #endif u_char dlh_dll_BE16[2]; // 02-03 defect list length }; struct cdb6_start_stop // cdb for start stop command { 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 cdb10_play_audio_msf // Table 13-8 cdb for play audio command { 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 cdb10_read_toc // Table 13-6 cdb for read toc command { u_char rtoc_opcode; // 00 read table of contents opcode #ifdef __BIG_ENDIAN__ u_char rtoc_lun:3, // 01 logical unit number rtoc_reserved1a:3, // reserved rtoc_msf:1, // 1 = use msf format, 0 = use abs addr format rtoc_reserved1b:1; // reserved #else u_char rtoc_reserved1b:1, // 01 reserved rtoc_msf:1, // 1 = use msf format, 0 = use abs addr format rtoc_reserved1a:3, // reserved rtoc_lun:3; // logical unit number #endif u_char rtoc_reserved2; // 02 reserved u_char rtoc_reserved3; // 03 reserved u_char rtoc_reserved4; // 04 reserved u_char rtoc_reserved5; // 05 reserved u_char rtoc_starttrack; // 06 starting track u_char rtoc_length_BE16[2]; // 07-08 length of structure allocated to hold toc entries u_char rtoc_control; // 09 control byte }; typedef union cdb { struct cdb6 cdb6; struct cdb6_format_unit cdb6_format_unit; struct cdb6_mode_select cdb6_mode_select; struct cdb6_mode_sense cdb6_mode_sense; struct cdb6_send_diagnostic cdb6_send_diagnostic; struct cdb6_start_stop cdb6_start_stop; struct cdb10 cdb10; struct cdb10_play_audio_msf cdb10_play_audio_msf; struct cdb10_read_toc cdb10_read_toc; struct cdb12 cdb12; } cdb; typedef struct scsi_req // SCSI Request used by sg driver via SGIOCREQ and internally in st driver { // inputs cdb sr_cdb; // command descriptor block one of three formats sc_dma_dir sr_dma_dir; // DMA direction caddr_t sr_addr; // memory addr for data transfers int sr_dma_max; // maximum number of bytes to transfer int sr_ioto; // I/O timeout in seconds // returned status information int sr_io_status; // driver status u_char sr_scsi_status; // SCSI status byte esense_reply sr_esense; // extended sense in case of check status int sr_dma_xfr; // actual number of bytes transferred by DMA struct timeval sr_exec_time; // execution time in microseconds u_char sr_flags; // flags queue_chain_t sr_io_q; // for linking onto sgdp-> sdg_io_q } scsi_req; struct scsi_adr { u_char sa_target; // 00 target ID u_char sa_lun; // 01 target lun }; // // Mode sense/select data structures // typedef struct page_header // Table 7-64 { #ifdef __BIG_ENDIAN__ u_char ph_ps:1, // 00 parameters savable bit ph_reserved1:1, // reserved ph_pagecode:6; // page code #else u_char ph_pagecode:6, // 00 page code ph_reserved1:1, // reserved ph_ps:1; // parameters savable bit #endif u_char ph_pagelength; // 01 page length in bytes } ph; struct caching_page // Table 8-48 { ph cp_ph; // 00-01 page header #ifdef __BIG_ENDIAN__ u_char cp_reserved2:5, // 02 reserved cp_wce:1, // write cache enabled cp_mf:1, // interpret min/max prefetch as multiplication factor cp_rcd:1; // read cache disabled u_char cp_drrp:4, // 03 demand read retention priority (see Table 8-49) cp_wrp:4; // write retention priority (see Table 8-49) #else u_char cp_rcd:1, // 02 read cache disabled cp_mf:1, // interpret min/max prefetch as multiplication factor cp_wce:1, // write cache enabled cp_reserved2:5; // reserved u_char cp_wrp:4, // 03 write retention priority (see Table 8-49) cp_drrp:4; // demand read retention priority (see table 8-49) #endif u_char cp_dptl_BE16[2]; // 04-05 disable pre-fetch transfer length u_char cp_minprefetch_BE16[2]; // 06-07 minimum pre-fetch (interpretation depends on mf bit) u_char cp_maxprefetch_BE16[2]; // 08-09 maximum pre-fetch (interpretation depends on mf bit) u_char cp_maxprefetchceiling_BE16[2]; // 10-11 maximum pre-fetch ceiling (in sectors) }; struct cdrom_audio_control_page // Table 13-35 { ph cacp_ph; // 00-01 page header #ifdef __BIG_ENDIAN__ u_char cacp_reserved2:5, // 02 reserved cacp_immed:1, // immediate mode cacp_sotc:1, // stop on track crossing cacp_reserved2a:1; // reserved u_char cacp_reserved3; // 03 reserved u_char cacp_reserved4; // 04 reserved u_char cacp_aprval:1, // 05 audio playback rate valid cacp_reserved5:3, // reserved cacp_format:4; // format of lbas/second u_short cacp_lbsplayback_BE16; // 06-07 logical blocks/second of audio playback u_char cacp_reserved8:4, // 08 reserved cacp_output0selection:4; // audio output port 0 channel selection (Table 13-35) u_char cacp_output0volume; // 09 audio output port 0 volume selection u_char cacp_reserved10:4, // 10 reserved cacp_output1selection:4; // audio output port 1 channel selection (Table 13-35) u_char cacp_output1volume; // 11 audio output port 1 volume selection u_char cacp_reserved12:4, // 12 reserved cacp_output2selection:4; // audio output port 2 channel selection (Table 13-35) u_char cacp_output2volume; // 13 audio output port 2 volume selection u_char cacp_reserved14:4, // 14 reserved cacp_output3selection:4; // audio output port 3 channel selection (Table 13-35) u_char cacp_output3volume; // 15 audio output port 3 volume selection #else u_char cacp_reserved2a:1, // 02 reserved cacp_sotc:1, // stop on track crossing cacp_immed:1, // immediate mode cacp_reserved2:5; // reserved u_char cacp_reserved3; // 03 reserved u_char cacp_reserved4; // 04 reserved u_char cacp_format:4, // 05 format of lbas/second cacp_reserved5:3, // reserved cacp_aprval:1; // audio playback rate valid u_short cacp_lbsplayback_BE16; // 06-07 logical blocks/second of audio playback u_char cacp_output0selection:4, // 08 audio output port 0 channel selection (Table 13-35) cacp_reserved8:4; // reserved u_char cacp_output0volume; // 09 audio output port 0 volume selection u_char cacp_output1selection:4, // 10 audio output port 1 channel selection (Table 13-35) cacp_reserved10:4; // reserved u_char cacp_output1volume; // 11 audio output port 1 volume selection u_char cacp_output2selection:4, // 12 audio output port 2 channel selection (Table 13-35) cacp_reserved12:4; // reserved u_char cacp_output2volume; // 13 audio output port 2 volume selection u_char cacp_output3selection:4, // 14 audio output port 3 channel selection (Table 13-35) cacp_reserved14:4; // reserved u_char cacp_output3volume; // 15 audio output port 3 volume selection #endif }; struct cdrom_parameters_page // Table 13-36 { ph cpp_ph; // 00-01 page header u_char cpp_reserved2; // 02 reserved #ifdef __BIG_ENDIAN__ u_char cpp_reserved3:4, // 03 reserved cpp_inactivitytimer:4; // inactivity timer multiplier #else u_char cpp_inactivityTimerMult:4, // 03 inactivity timer multiplier cpp_reserved3:4; // reserved #endif u_short cpp_spermunits_BE16; // 04-05 number of MSF S units per MSF M unit u_short cpp_fpersunits_BE16; // 06-07 number of MSF F units per MSF S unit }; struct control_mode_page // Table 7-66 { ph cmp_ph; // 00-01 page header #ifdef __BIG_ENDIAN__ u_char cmp_reserved2:7, // 02 reserved cmp_rlec:1; // report log exception condition bit u_char cmp_qam:4, // 03 queue algorithm modifier cmp_reserved3:2, // reserved cmp_qerr:1, // queue error management cmp_dqeue:1; // disable queuing u_char cmp_eeca:1, // 04 enable extended contingent allegiance cmp_reserved4:4, // reserved cmp_raenp:1, // ready AEN permission cmp_uaaenp:1, // unit attention AEN permission cmp_eaenp:1; // error AEN permission #else u_char cmp_rlec:1, // 02 report log exception condition cmp_reserved2:7; // reserved u_char cmp_dque:1, // 03 disable queuing cmp_qerr:1, // queue error management cmp_reserved3:2, // reserved cmp_qam:4; // 04 queue algorithm modifier u_char cmp_eaenp:1, // errror AEN permission cmp_uaaenp:1, // unit attention aen permission cmp_raenp:1, // ready AEN permission cmp_reserved4:4, // reserved cmp_eeca:1; // enable extended contingent allegiance #endif u_char cmp_reserved5; // 05 reserved u_short cmp_raenhop_BE16; // 06-07 ready AEN hold-off period (milliseconds) }; struct device_configuration_page // Table 9-24 { ph dcp_ph; // 00-01 page header #ifdef __BIG_ENDIAN__ u_char dcp_reserved2:1, // 02 reserved dcp_cap:1, // change active partition to that specified in activePartition dcp_caf:1, // change active format to that specifed in activeFormat dcp_activeformat:5; // specifies active recording format (vendor specific) #else u_char dcp_activeformat:5, // 02 specifies active recording format (vendor specific) dcp_caf:1, // change active format to that specified in activeFormat dcp_cap:1, // change active partition to that specified in activePartition dcp_reserved2:1; // reserved #endif u_char dcp_activepartition; // 03 current logical partition number in use on medium u_char dcp_wbfr; // 04 indicates how full buffer should be before writing to medium u_char dcp_rber; // 05 indicates how empty buffer should be before reading from medium u_short dcp_writedelay_BE16; // 06-07 maximum write delay time in 100 millisecond increments #ifdef __BIG_ENDIAN__ u_char dcp_dbr:1, // 08 data buffer recovery dcp_bis:1, // block identifiers supported dcp_rsmk:1, // report set marks dcp_avc:1, // automatic velocity control dcp_socf:2, // stop on consecutive filemarks dcp_rbo:1, // recover buffer order dcp_rew:1; // report early warning u_char dcp_gapsize; // 09 inter-block gap size u_char dcp_eod:3, // 10 end of data defined dcp_eeg:1, // enable eod generation dcp_sew:1, // synchronize early warning dcp_reserved10:3; // reserved #else u_char dcp_rew:1, // 08 report early warning dcp_rbo:1, // recover buffer order dcp_socf:2, // stop on consecutive filemarks dcp_avc:1, // automatic velocity control dcp_rsmk:1, // report set marks dcp_bis:1, // block identifiers supported dcp_dbr:1; // data buffer recovery u_char dcp_gapsize; // 09 inter-block gap size u_char dcp_reserved10:3, // 10 reserved dcp_sew:1, // synchronize early warning dcp_eeg:1, // enable eod generation dcp_eod:3; // end of data defined #endif u_char dcp_earlywarning_BE24[3]; // 11-13 buffer size in bytes while writing after early-warning u_char dcp_sdca; // 14 vendor specific compression algorithm specifier u_char dcp_reserved15; // 15 reserved }; struct disconnect_reconnect_page // Table 7-68 { ph drp_ph; // 00-01 page header u_char drp_bufferfullratio, // 02 buffer full ratio drp_bufferemptyratio; // 03 buffer empty ratio u_short drp_businactivitylimit_BE16, // 04-05 bus inactivity limit (100 ms increments) drp_disconnecttimelimit_BE16, // 06-07 disconnect time limit (100 ms increments) drp_connecttimelimit_BE16, // 08-09 connect time limit (100 ms increments) drp_maximumburstsize_BE16; // 10-11 maximum burst size (512 byte increments) #ifdef __BIG_ENDIAN__ u_char drp_reserved12:6, // 12 reserved drp_dtdc:2; // data transfer disconnect control (Table 7-69) #else u_char drp_dtdc:2, // 12 data transfer disconnect control (Table 7-69) drp_reserved12:6; // reserved #endif u_char drp_reserved13, // 13 reserved drp_reserved14, // 14 reserved drp_reserved15; // 15 reserved }; struct flexible_disk_page // Table 8-49 and 8-50 { ph fdp_ph; // 00-01 page header u_short fdp_transferrate_BE16; // 02-03 data rate in kilobits/second u_char fdp_numheads, // 04 number of read/write heads fdp_sectorspertrack; // 05 number of sectors per revolution per head u_short fdp_databytespersector_BE16, // 06-07 number of bytes of data in a sector fdp_numcylinders_BE16, // 08-09 number of cylinders used for data storage fdp_scwp_BE16, // 10-11 starting cylinder for write precompensation fdp_scrwc_BE16, // 12-13 starting cylinder for reduced write current fdp_drivesteprate_BE16; // 14-15 step rate in units of 100 microseconds u_char fdp_drivesteppulsewidth; // 16 width of the step pulse in microseconds (0 = default) u_short fdp_headsettledelay_BE16; // 17-18 head settle time in units of 100 microseconds (0 = default) u_char fdp_motorondelay, // 19 motor on delay in units of 1/10ths of a second fdp_motoroffdelay; // 20 motor off delau in units of 1/10ths of a second #ifdef __BIG_ENDIAN__ u_char fdp_trdy:1, // 21 true ready signal provided fdp_ssn:1, // sector start number (0 or 1) fdp_mo:1, // motor on (pin 16) handling fdp_reserved21:5; // reserved u_char fdp_reserved22:4, // 22 reserved fdp_spc:4; // additional head step pulses required per cylinder u_char fdp_wpv, // 23 amount of write pre-compenstion (vendor specific) fdp_headloaddelay, // 24 head loading time in milliseconds (0 = default) fdp_headunloaddelay; // 25 head unloading time in milliseconds (0 = default) u_char fdp_pin34:4, // 26 defines usage of pin 34 fdp_pin2:4; // defines usage of pin 2 u_char fdp_pin4:4, // 27 defines usage of pin 4 fdp_pin1:4; // defines usage of pin 1 #else u_char fdp_reserved21:5, // 21 reserved fdp_mo:1, // motor on (pin 16) handling fdp_ssn:1, // sector start number (0 or 1) fdp_trdy:1; // true ready signal provided u_char fdp_spc:4, // 22 additional head step pulses required per cylinder fdp_reserved22:4; // reserved u_char fdp_wpv, // 23 amount of write pre-compensation (vendor specific) fdp_headloaddelay, // 24 head loading time in milliseconds (0 = default) fdp_headunloaddelay; // 25 head unloading time in milliseconds (0 = default) u_char fdp_pin2:4, // 26 defines usage of pin 2 fdp_pin34:4; // defines usage of pin 34 u_char fdp_pin1:4, // 27 defines usage of pin 4 fdp_pin4:4; // defines usage of pin 1 #endif u_char fdp_mediumrotationrate_BE16[2]; // 28-29 medium rotation rate in rotations per minute u_char fdp_reserved30, // 30 reserved fdp_reserved31; // 31 reserved }; struct format_device_page // Table 8-52 { ph fodp_ph; // 00-01 page header u_char fodp_tracksperzone_BE16[2], // 02-03 tracks per zone fodp_altsectorsperzone_BE16[2], // 04-05 alternate sectors per zone fodp_alttracksperzone_BE16[2], // 06-07 alternate tracks per zone fodp_alttracksperunit_BE16[2], // 08-09 alternate tracks per logical unit fodp_sectorspertrack_BE16[2], // 10-11 sectors per track fodp_databytespersector_BE16[2],// 12-13 data bytes per physical sector fodp_interleave_BE16[2], // 14-15 interleave fodp_trackskewfactor_BE16[2], // 16-17 track skew factor fodp_cylinderskewfactor_BE16[2];// 18-19 cylinder skew factor #ifdef __BIG_ENDIAN__ u_char fodp_ssec: 1, // 20 soft sector formatting fodp_hsec: 1, // hard sector formatting fodp_rmb: 1, // removable media fodp_surf: 1, // sequential blocks by surface (1) or cylinder (0) fodp_reserved20: 4; // reserved #else u_char fodp_reserved20: 4, // 20 reserved fodp_surf: 1, // sequential blocks by surface (1) or cylinder (0) fodp_rmb: 1, // removable media fodp_hsec: 1, // hard sector formatting fodp_ssec: 1; // soft sector formatting #endif u_char fodp_reserved21; // 21 reserved u_char fodp_reserved22; // 22 reserved u_char fodp_reserved23; // 23 reserved }; struct medium_types_page // Table 8-53 { ph mtp_ph; // 00-01 page header u_char mtp_reserved2, // 02 reserved mtp_reserved3; // 03 reserved u_char mtp_mediumtype[4]; // 04-07 media types supported by target }; struct notch_page // Table 8-54 { ph np_ph; // 00-01 page header #ifdef __BIG_ENDIAN__ u_char np_nd: 1, // 02 notched drive np_lpn: 1, // logical or physical notch np_reserved2: 6; // reserved #else u_char np_reserved2: 6, // 02 reserved np_lpn: 1, // logical or physical notch np_nd: 1; // notched drive #endif u_char np_reserved3; // 03 reserved u_short np_maxnotches_BE16, // 04-05 maximum number of notches supported np_activenotch_BE16; // 06-07 currently active notch u_long np_startingboundary_BE32, // 08-11 beginning of current notch np_endingboundary_BE32; // 12-15 end of current notch u_char np_pagesnotched[8]; // 16-23 bit-map of notch variable mode page codes }; struct peripheral_page // Table 7-70 { ph pp_ph; // 00 - 01 page header u_short pp_interfaceindentifier_BE16; // 02 - 03 interface identifier (Table 7-71) u_char pp_reserved4, // 04 reserved pp_reserved5, // 05 reserved pp_reserved6, // 06 reserved pp_reserved7; // 07 reserved u_char pp_vendorspecific; // 08 - ?? start of vendor specific area }; struct read_write_error_recovery_page // Table 8-55 { ph rwerp_ph; // 00-01 page header #ifdef __BIG_ENDIAN__ u_char rwerp_awre:1, // 02 automatic write reallocation enabled rwerp_arre:1, // automatic read reallocation enabled rwerp_tb:1, // transfer block rwerp_rc:1, // read continuous rwerp_eer:1, // enable early recovery (see Table 8-56) rwerp_per:1, // post error (see Table 8-56) rwerp_dte:1, // disable transfer on error (see Table 8-56) rwerp_dcr:1; // disable correction (see Table 8-56) #else u_char rwerp_dcr:1, // 02 disable correction (see Table 8-56) rwerp_dte:1, // disable transfer on error (see Table 8-56) rwerp_per:1, // post error (see Table 8-56) rwerp_eer:1, // enable early recovery (see Table 8-56) rwerp_rc:1, // read continuous flag rwerp_tb:1, // transfer block rwerp_arre:1, // automatic read reallocation enabled rwerp_awre:1; // automatic write reallocation enabled #endif u_char rwerp_readretrycount, // 03 read retry count rwerp_correctionspan, // 04 size in bits of largest error to attempt correction for rwerp_headoffsetcount, // 05 head offset in two's complement rwerp_datastrobeoffsetcount, // 06 data strobe offset in two's complement rwerp_reserved7, // 07 reserved rwerp_writeretrycount, // 08 write retry count rwerp_reserved9; // 09 reserved u_char rwerp_rtl_BE16[2]; // 10-11 recovery time limit }; struct rigid_disk_page // Table 8-61 { ph rdp_ph; // 00-01 page header u_char rdp_numcyls_BE24[3]; // 02-04 number of physical cylinders used for data storage. u_char rdp_numheads; // 05 number of physical heads used for data storage u_char rdp_scwp_BE24[3]; // 06-08 start cylinder for write pre-compensaction u_char rdp_scrwc_BE24[3]; // 09-11 start cylinder for reduced write current u_short rdp_drivesteprate_BE16; // 12-13 step rate in 100 nanosecond intervals u_char rdp_landingzonecy_BE24[3]; // 14-16 two's complement location for head positioning #ifdef __BIG_ENDIAN__ u_char rdp_reserved17:6, // 17 reserved rdp_rpl:2; // rotational position locking (see Table 8-62) #else u_char rdp_rpl:2, // 17 rotational position locking (see Table 8-62) rdp_reserved17:6; // reserved #endif u_char rdp_rotoffset; // 18 amount of rotational skew to use when synchronized u_char rdp_reserved19; // 19 reserved u_char rdp_rotrate_BE16[2]; // 20-21 medium rotation rate in rotations per minute u_char rdp_reserved22, // 22 reserved rdp_reserved23; // 23 reserved }; struct verify_error_recovery_page // Table 8-63 { ph verp_ph; // 00-01 page header #ifdef __BIG_ENDIAN__ u_char verp_reserved2:4, // 02 reserved verp_eer:1, // enable early recovery (see Table 8-56) verp_per:1, // post error (see Table 8-56) verp_dte:1, // disable transfer on error (see Table 8-56) verp_dcr:1; // disable correction (see Table 8-56) #else u_char verp_dcr:1, // 02 disable correction (see Table 8-56) verp_dte:1, // disable transfer on errror (see Table 8-56) verp_per:1, // post error (see Table 8-56) verp_eer:1, // enable early recovery (see Table 8-56) verp_reserved2:4; // reserved #endif u_char verp_retrycount, // 03 verify retry count verp_correctionspan, // 04 size in bits of largest error to attempt recovery for verp_reserved5, // 05 reserved verp_reserved6, // 06 reserved verp_reserved7, // 07 reserved verp_reserved8, // 08 reserved verp_reserved9; // 09 reserved u_char verp_rtl_BE16[2]; // 10 verify recovery time limit in milliseconds }; typedef union mode_page { ph ph; struct caching_page cp; struct cdrom_audio_control_page cacp; struct cdrom_parameters_page cpp; struct control_mode_page cmp; struct device_configuration_page dcp; struct disconnect_reconnect_page drp; struct flexible_disk_page fdp; struct format_device_page fodp; struct medium_types_page mtp; struct notch_page np; struct peripheral_page pp; struct rigid_disk_page rdp; struct read_write_error_recovery_page rwerp; struct verify_error_recovery_page verp; } mode_page; typedef struct block_descriptor { u_char bd_densitycode; // 00 unique for each device type u_char bd_numberofblocks_BE24[3]; // 01-03 number of blocks (24 bits! bytes 2, 1, 0) u_char bd_reserved4; // 04 reserved u_char bd_blocklength_BE24[3]; // 05-07 block length (24 bits! bytes 2, 1, 0) } bd; typedef union device_specific_parameters { #ifdef __BIG_ENDIAN__ // direct access devices u_char dsp_swp:1, // 00 write protect flag dsp_sbufferedmode:3, // buffer mode dsp_sspeed:4; // speed // sequential access devices u_char dsp_dwp:1, // 00 write protect flag dsp_dreserved2a:2, // reserved dsp_dcache: 1, // cache enabled flag dsp_dreserved2b:4; // reserved #else u_char dsp_sspeed:4, // 00 speed dsp_sbufferedmode:3, // buffer mode dsp_swp:1; // write protect flag // direct access devices u_char dsp_dreserved2b: 4, // 00 reserved dsp_dcache: 1, // cache enabled flag dsp_dreserved2a: 2, // reserved dsp_dwp: 1; // write protect flag // sequential access devices #endif } dsp; typedef struct mode_parameter_list // Table 7-61 { u_char mpl_datalength; // 00 length in bytes of mode sense data u_char mpl_mediumtype; // 01 media type (device type specific) dsp mpl_dsp; // 02 device specific parameters u_char mpl_bdlength; // 03 length in bytes of all block descriptors bd mpl_bd[1]; // 04- zero, one, or more block descriptors MIGHT be here! // followed by zero, one or more pages of sense data! } mode_parameter_list; // // CD ROM reply structures // struct msf { u_char msf_reserved; u_char msf_minute; u_char msf_second; u_char msf_frame; }; typedef union cd_address { u_int addr_abs_BE32; struct msf addr_msf; } cd_address; typedef struct track_descriptor // Table 13-27 track descriptor { u_char td_reserved0; // 00 reserved #ifdef __BIG_ENDIAN__ u_char td_adr:4, // 01 type of information encoded in Q sub-channel (Table 13-21) td_control:4; // control attributes of track (Table 13-22) #else u_char td_control:4, // 01 control attributes of track (Table 13-22) td_adr:4; // type of information encoded in Q sub-channel (Table 13-21) #endif u_char td_track; // 02 track number u_char td_reserved3; // 03 reserved cd_address td_address; // 03-07 address in either msf or absolute form depending on msf bit } td; struct toc // Table 13-27 CD table of contents { u_short toc_datalength_BE16; // 00 - 01 length of valid data contained in this structure u_char toc_firsttrack; // 02 first track number u_char toc_lasttrack; // 03 last track number td toc_track[100]; // 04 - track descriptors for each track in the range given above }; 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; }; #endif _BSD_DEV_SCSIREG_
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.