|
|
GNU Mach 1.0
/*
* Mach Operating System
* Copyright (c) 1991,1990 Carnegie Mellon University
* All Rights Reserved.
*
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
* Software Distribution Coordinator or [email protected]
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie Mellon
* the rights to redistribute these changes.
*/
/*
* File: scsi2.h
* Author: Alessandro Forin, Carnegie Mellon University
* Date: 9/90
*
* Additions and changes of the SCSI-II standard viz SCSI-I
*/
#ifndef _SCSI_SCSI2_H_
#define _SCSI_SCSI2_H_
#include <scsi/scsi_endian.h>
/*
* Single byte messages
*
* originator: I-nitiator T-arget
* T-support: M-andatory O-ptional
*/
#define SCSI_ABORT_TAG 0x0d /* O I 2 */
#define SCSI_CLEAR_QUEUE 0x0e /* O I 2 */
#define SCSI_INITIATE_RECOVERY 0x0f /* O IT2 */
#define SCSI_RELEASE_RECOVERY 0x10 /* O I 2 */
#define SCSI_TERMINATE_IO_PROCESS 0x11 /* O I 2 */
/*
* Two byte messages
*/
#define SCSI_SIMPLE_QUEUE_TAG 0x20 /* O IT2 */
#define SCSI_HEADOF_QUEUE_TAG 0x21 /* O I 2 */
#define SCSI_ORDERED_QUEUE_TAG 0x22 /* O I 2 */
#define SCSI_IGNORE_WIDE_RESIDUE 0x23 /* O T2 */
/* 0x24..0x2f reserved */
/*
* Extended messages, codes and formats
*/
#define SCSI_WIDE_XFER_REQUEST 0x03 /* IT 2 */
typedef struct {
unsigned char xtn_msg_tag; /* const 0x01 */
unsigned char xtn_msg_len; /* const 0x02 */
unsigned char xtn_msg_code; /* const 0x03 */
unsigned char xtn_msg_xfer_width;
} scsi_wide_xfer_t;
/*
* NOTE: some command-specific mods and extensions
* are actually defined in the scsi.h file for
* readability reasons
*/
/* GROUP 1 */
#define SCSI_CMD_READ_DEFECT_DATA 0x37 /* O2 disk opti */
typedef scsi_command_group_1 scsi_cmd_read_defect_t;
# define SCSI_CMD_RDD_LIST_TYPE 0x07
# define SCSI_CMD_RDD_GLIST 0x08
# define SCSI_CMD_RDD_PLIST 0x10
#define SCSI_CMD_WRITE_BUFFER 0x3b /* O2 all */
typedef scsi_command_group_1 scsi_cmd_write_buffer_t;
# define SCSI_CMD_BUF_MODE 0x07
# define scsi_cmd_buf_id scs_cmd_lba1
# define scsi_cmd_buf_offset1 scs_cmd_lba2
# define scsi_cmd_buf_offset2 scs_cmd_lba3
# define scsi_cmd_buf_offset3 scs_cmd_lba4
# define scsi_cmd_buf_alloc1 scs_cmd_xxx
# define scsi_cmd_buf_alloc2 scs_cmd_xfer_len_1
# define scsi_cmd_buf_alloc3 scs_cmd_xfer_len_2
#define SCSI_CMD_READ_BUFFER 0x3c /* O2 all */
#define scsi_cmd_read_buffer_t scsi_command_group_1
/* GROUP 2 */
#define SCSI_CMD_CHANGE_DEFINITION 0x40 /* O2 all */
#define scsi_cmd_change_def_t scsi_command_group_2
# define scsi_cmd_chg_save scsi_cmd_lba1
# define scsi_cmd_chg_definition scsi_cmd_lba2
# define SCSI_CMD_CHG_CURRENT 0x00
# define SCSI_CMD_CHG_SCSI_1 0x01
# define SCSI_CMD_CHG_CCS 0x02
# define SCSI_CMD_CHG_SCSI_2 0x03
/* 0x41 reserved */
#define SCSI_CMD_READ_SUBCH 0x42 /* O2 rom */
#define scsi_cmd_read_subch_t scsi_command_group_2
# define SCSI_CMD_CD_MSF 0x02
# define SCSI_CMD_RS_SUBQ 0x40
# define scsi_cmd_rs_format scsi_cmd_lba2
# define SCSI_CMD_RS_FMT_SUBQ 0x00
# define SCSI_CMD_RS_FMT_CURPOS 0x01
# define SCSI_CMD_RS_FMT_CATALOG 0x02
# define SCSI_CMD_RS_FMT_ISRC 0x03
# define scsi_cmd_rs_trackno scsi_cmd_xxx
#define SCSI_CMD_READ_TOC 0x43 /* O2 rom */
#define scsi_cmd_read_toc_t scsi_command_group_2
# define scsi_cmd_rtoc_startT scsi_cmd_xxx
#define SCSI_CMD_READ_HEADER 0x44 /* O2 rom */
#define scsi_cmd_read_header_t scsi_command_group_2
#define SCSI_CMD_PLAY_AUDIO 0x45 /* O2 rom */
#define scsi_cmd_play_audio_t scsi_command_group_2
#define SCSI_CMD_PLAY_AUDIO_MSF 0x47 /* O2 rom */
#define scsi_cmd_play_audio_msf_t scsi_command_group_2
# define scsi_cmd_pamsf_startM scsi_cmd_lba2
# define scsi_cmd_pamsf_startS scsi_cmd_lba3
# define scsi_cmd_pamsf_startF scsi_cmd_lba4
# define scsi_cmd_pamsf_endM scsi_cmd_xxx
# define scsi_cmd_pamsf_endS scsi_cmd_xfer_len_1
# define scsi_cmd_pamsf_endF scsi_cmd_xfer_len_2
#define SCSI_CMD_PLAY_AUDIO_TI 0x48 /* O2 rom */
#define scsi_cmd_play_audio_ti_t scsi_command_group_2
# define scsi_cmd_pati_startT scsi_cmd_lba3
# define scsi_cmd_pati_startI scsi_cmd_lba4
# define scsi_cmd_pati_endT scsi_cmd_xfer_len_1
# define scsi_cmd_pati_endI scsi_cmd_xfer_len_2
#define SCSI_CMD_PLAY_AUDIO_TR 0x49 /* O2 rom */
#define scsi_cmd_play_audio_tr_t scsi_command_group_2
# define scsi_cmd_patr_startT scsi_cmd_xxx
#define SCSI_CMD_PAUSE_RESUME 0x4b /* O2 rom */
#define scsi_cmd_pausres_t scsi_command_group_2
# define SCSI_CMD_PAUSRES_RESUME 0x01
# define scsi_cmd_pausres_res scsi_cmd_xfer_len_2
#define SCSI_CMD_LOG_SELECT 0x4c /* O2 all */
#define scsi_cmd_logsel_t scsi_command_group_2
# define SCSI_CMD_LOG_SP 0x01
# define SCSI_CMD_LOG_PCR 0x02
# define scsi_cmd_log_page_control scsi_cmd_lba1
#define SCSI_CMD_LOG_SENSE 0x4d /* O2 all */
#define scsi_cmd_logsense_t scsi_command_group_2
# define SCSI_CMD_LOG_PPC 0x02
# define scsi_cmd_log_page_code scsi_cmd_lba1
# define scsi_cmd_log_param_ptr1 scsi_cmd_lba4
# define scsi_cmd_log_param_ptr2 scsi_cmd_xxx
/* 0x4e..0x54 reserved */
#define SCSI_CMD_MODE_SELECT_2 0x55 /* Z2 */
#define scsi_cmd_mode_select_long_t scsi_command_group_2
# define SCSI_CMD_MSL2_PF 0x10
# define SCSI_CMD_MSL2_SP 0x01
/* 0x56..0x59 reserved */
#define SCSI_CMD_MODE_SENSE_2 0x5a /* Z2 */
#define scsi_cmd_mode_sense_long_t scsi_command_group_2
# define SCSI_CMD_MSS2_DBD 0x08
/* 0x5b..0x5f reserved */
/* GROUP 5 */
#define SCSI_CMD_PLAY_AUDIO_LONG 0xa5 /* O2 rom */
#define scsi_cmd_play_audio_l_t scsi_command_group_5
#define SCSI_CMD_PLAY_AUDIO_TR_LONG 0xa9 /* O2 rom */
#define scsi_cmd_play_audio_tr_l_t scsi_command_group_5
# define scsi_cmd_patrl_startT scsi_cmd_xxx1
/*
* Command specific defines
*/
typedef struct {
BITFIELD_2(unsigned char,
periph_type : 5,
periph_qual : 3);
#define SCSI_SCANNER 0x06 /* periph_type values */
#define SCSI_MEMORY 0x07
#define SCSI_J_BOX 0x08
#define SCSI_COMM 0x09
#define SCSI_PREPRESS1 0x0a
#define SCSI_PREPRESS2 0x0b
#define SCSI_PERIPH_CONNECTED 0x00 /* periph_qual values */
#define SCSI_PERIPH_DISCONN 0x20
#define SCSI_PERIPH_NOTHERE 0x30
BITFIELD_2(unsigned char,
device_type : 7,
rmb : 1);
BITFIELD_3( unsigned char,
ansi : 3,
ecma : 3,
iso : 2);
BITFIELD_4( unsigned char,
response_fmt : 4,
res1 : 2,
trmIOP : 1,
aenc : 1);
unsigned char length;
unsigned char res2;
unsigned char res3;
BITFIELD_8(unsigned char,
SftRe : 1,
CmdQue : 1,
res4 : 1,
Linked : 1,
Sync : 1,
Wbus16 : 1,
Wbus32 : 1,
RelAdr : 1);
unsigned char vendor_id[8];
unsigned char product_id[16];
unsigned char product_rev[4];
unsigned char vendor_uqe[20];
unsigned char reserved[40];
unsigned char vendor_uqe1[1]; /* varsize */
} scsi2_inquiry_data_t;
#define SCSI_INQ_SUPP_PAGES 0x00
#define SCSI_INQ_A_INFO 0x01 /* 0x01..0x1f, really */
#define SCSI_INQ_SERIALNO 0x80
#define SCSI_INQ_IMPL_OPDEF 0x81
#define SCSI_INQ_A_IMPL_OPDEF 0x82
/* mode_select */
typedef struct {
unsigned char data_len;
unsigned char medium_type;
unsigned char device_specific;
unsigned char desc_len;
/* block descriptors are optional, same struct as scsi1 */
/* page info then follows, see individual pages */
} scsi2_mode_param_t;
/*
* CDROM thingies
*/
typedef union {
struct {
unsigned char xxx;
unsigned char minute;
unsigned char second;
unsigned char frame;
} msf;
struct {
unsigned char lba1;
unsigned char lba2;
unsigned char lba3;
unsigned char lba4;
} lba;
} cdrom_addr_t;
typedef struct {
unsigned char len1; /* MSB */
unsigned char len2; /* LSB */
unsigned char first_track;
unsigned char last_track;
struct cdrom_toc_desc {
unsigned char xxx;
BITFIELD_2(unsigned char,
control : 4,
adr : 4);
unsigned char trackno;
unsigned char xxx1;
cdrom_addr_t absolute_address;
} descs[1]; /* varsize */
} cdrom_toc_t;
typedef struct {
unsigned char xxx;
unsigned char audio_status;
#define SCSI_CDST_INVALID 0x00
#define SCSI_CDST_PLAYING 0x11
#define SCSI_CDST_PAUSED 0x12
#define SCSI_CDST_COMPLETED 0x13
#define SCSI_CDST_ERROR 0x14
#define SCSI_CDST_NO_STATUS 0x15
unsigned char len1;
unsigned char len2;
struct cdrom_chanQ {
unsigned char format;
BITFIELD_2(unsigned char,
control : 4,
adr : 4);
unsigned char trackno;
unsigned char indexno;
cdrom_addr_t absolute_address;
cdrom_addr_t relative_address;
BITFIELD_2(unsigned char,
xxx : 7,
mcv : 1);
unsigned char catalog[15];
BITFIELD_2(unsigned char,
xxx1 : 7,
tcv : 1);
unsigned char isrc[15];
} subQ;
} cdrom_chan_data_t;
/* subsets */
typedef struct {
unsigned char xxx;
unsigned char audio_status;
unsigned char len1;
unsigned char len2;
struct {
unsigned char format;
BITFIELD_2(unsigned char,
control : 4,
adr : 4);
unsigned char trackno;
unsigned char indexno;
cdrom_addr_t absolute_address;
cdrom_addr_t relative_address;
} subQ;
} cdrom_chan_curpos_t;
typedef struct {
unsigned char xxx;
unsigned char audio_status;
unsigned char len1;
unsigned char len2;
struct {
unsigned char format;
unsigned char xxx1[3];
BITFIELD_2(unsigned char,
xxx : 7,
mcv : 1);
unsigned char catalog[15];
} subQ;
} cdrom_chan_catalog_t;
typedef struct {
unsigned char xxx;
unsigned char audio_status;
unsigned char len1;
unsigned char len2;
struct {
unsigned char format;
BITFIELD_2(unsigned char,
control : 4,
adr : 4);
unsigned char trackno;
unsigned char xxx0;
BITFIELD_2(unsigned char,
xxx1 : 7,
tcv : 1);
unsigned char isrc[15];
} subQ;
} cdrom_chan_isrc_t;
/* Audio page */
typedef struct {
scsi_mode_sense_data_t h; /* includes bdescs */
unsigned char page_code;
#define SCSI_CD_AUDIO_PAGE 0x0e
unsigned char page_len;
BITFIELD_4(unsigned char,
xxx1 : 1,
sotc : 1,
imm : 1,
xxx2 : 5);
unsigned char xxx3[2];
BITFIELD_3(unsigned char,
fmt : 4,
xxx4 : 3,
aprv : 1);
unsigned char bps1;
unsigned char bps2;
BITFIELD_2(unsigned char,
sel0 : 4,
xxx5 : 4);
unsigned char vol0;
BITFIELD_2(unsigned char,
sel1 : 4,
xxx6 : 4);
unsigned char vol1;
BITFIELD_2(unsigned char,
sel2 : 4,
xxx7 : 4);
unsigned char vol2;
BITFIELD_2(unsigned char,
sel3 : 4,
xxx8 : 4);
unsigned char vol3;
} cdrom_audio_page_t;
/*
* Status byte (a-la scsi2)
*/
typedef union {
struct {
BITFIELD_3( unsigned char,
scsi_status_reserved1:1,
scsi_status_code:5,
scsi_status_reserved2:2);
/* more scsi_status_code values */
/* 00..0c as in SCSI-I */
# define SCSI_ST2_CMD_TERMINATED 0x11 /* 2 */
# define SCSI_ST2_QUEUE_FULL 0x14 /* 2 */
/* anything else is reserved */
} st;
unsigned char bits;
} scsi2_status_byte_t;
#endif _SCSI_SCSI2_H_
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.