summaryrefslogtreecommitdiff
path: root/sys/scsi/scsi_disk.h
blob: 3b3e3350c8864977f1083bc327ef9d22e6b3e43c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
/*	$NetBSD: scsi_disk.h,v 1.8 1995/10/15 23:32:02 thorpej Exp $	*/

/*
 * SCSI interface description
 */

/*
 * Some lines of this file come from a file of the name "scsi.h"
 * distributed by OSF as part of mach2.5,
 *  so the following disclaimer has been kept.
 *
 * Copyright 1990 by Open Software Foundation,
 * Grenoble, FRANCE
 *
 * 		All Rights Reserved
 * 
 *   Permission to use, copy, modify, and distribute this software and
 * its documentation for any purpose and without fee is hereby granted,
 * provided that the above copyright notice appears in all copies and
 * that both the copyright notice and this permission notice appear in
 * supporting documentation, and that the name of OSF or Open Software
 * Foundation not be used in advertising or publicity pertaining to
 * distribution of the software without specific, written prior
 * permission.
 * 
 *   OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
 * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
 * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
 * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/*
 * Largely written by Julian Elischer (julian@tfs.com)
 * for TRW Financial Systems.
 *
 * TRW Financial Systems, in accordance with their agreement with Carnegie
 * Mellon University, makes this software available to CMU to distribute
 * or use in any manner that they see fit as long as this message is kept with 
 * the software. For this reason TFS also grants any other persons or
 * organisations permission to use or modify this software.
 *
 * TFS supplies this software to be publicly redistributed
 * on the understanding that TFS is not responsible for the correct
 * functioning of this software in any circumstances.
 *
 * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
 */

/*
 * SCSI command format
 */

#ifndef	_SCSI_SCSI_DISK_H
#define _SCSI_SCSI_DISK_H 1

struct scsi_reassign_blocks {
	u_char	opcode;
	u_char	byte2;
	u_char	unused[3];
	u_char	control;
};

struct scsi_rw {
	u_char	opcode;
	u_char	addr_2;		/* Most significant */
#define	SRW_TOPADDR	0x1F	/* only 5 bits here */
	u_char	addr_1;
	u_char	addr_0;		/* least significant */
	u_char	length;
	u_char	control;
};

struct scsi_rw_big {
	u_char	opcode;
	u_char	byte2;
#define	SRWB_RELADDR	0x01
	u_char	addr_3;		/* Most significant */
	u_char	addr_2;
	u_char	addr_1;
	u_char	addr_0;		/* least significant */
	u_char	reserved;
	u_char	length2;
	u_char	length1;
	u_char	control;
};

struct scsi_read_capacity {
	u_char	opcode;
	u_char	byte2;
	u_char	addr_3;	/* Most Significant */
	u_char	addr_2;
	u_char	addr_1;
	u_char	addr_0;	/* Least Significant */
	u_char	unused[3];
	u_char	control;
};

struct scsi_start_stop {
	u_char	opcode;
	u_char	byte2;
	u_char	unused[2];
	u_char	how;
#define	SSS_STOP		0x00
#define	SSS_START		0x01
#define	SSS_LOEJ		0x02
	u_char	control;
};



/*
 * Opcodes
 */

#define	REASSIGN_BLOCKS		0x07
#define	READ_COMMAND		0x08
#define WRITE_COMMAND		0x0a
#define MODE_SELECT		0x15
#define MODE_SENSE		0x1a
#define START_STOP		0x1b
#define PREVENT_ALLOW		0x1e
#define	READ_CAPACITY		0x25
#define	READ_BIG		0x28
#define WRITE_BIG		0x2a


struct scsi_read_cap_data {
	u_char	addr_3;	/* Most significant */
	u_char	addr_2;
	u_char	addr_1;
	u_char	addr_0;	/* Least significant */
	u_char	length_3;	/* Most significant */
	u_char	length_2;
	u_char	length_1;
	u_char	length_0;	/* Least significant */
};

struct scsi_reassign_blocks_data {
	u_char	reserved[2];
	u_char	length_msb;
	u_char	length_lsb;
	struct {
		u_char	dlbaddr_3;	/* defect logical block address (MSB) */
		u_char	dlbaddr_2;
		u_char	dlbaddr_1;
		u_char	dlbaddr_0;	/* defect logical block address (LSB) */
	} defect_descriptor[1];
};

union disk_pages { /* this is the structure copied from osf */
	struct page_disk_format {
	   u_char pg_code;	/* page code (should be 3)	      */
#define	DISK_PGCODE	0x3F	/* only 6 bits valid */
	   u_char pg_length;	/* page length (should be 0x16)	      */
	   u_char trk_z_1;	/* tracks per zone (MSB)	      */
	   u_char trk_z_0;	/* tracks per zone (LSB)	      */
	   u_char alt_sec_1;	/* alternate sectors per zone (MSB)   */
	   u_char alt_sec_0;	/* alternate sectors per zone (LSB)   */
	   u_char alt_trk_z_1;	/* alternate tracks per zone (MSB)    */
	   u_char alt_trk_z_0;	/* alternate tracks per zone (LSB)    */
	   u_char alt_trk_v_1;	/* alternate tracks per volume (MSB)  */
	   u_char alt_trk_v_0;	/* alternate tracks per volume (LSB)  */
	   u_char ph_sec_t_1;	/* physical sectors per track (MSB)   */
	   u_char ph_sec_t_0;	/* physical sectors per track (LSB)   */
	   u_char bytes_s_1;	/* bytes per sector (MSB)	      */
	   u_char bytes_s_0;	/* bytes per sector (LSB)	      */
	   u_char interleave_1;/* interleave (MSB)		      */
	   u_char interleave_0;/* interleave (LSB)		      */
	   u_char trk_skew_1;	/* track skew factor (MSB)	      */
	   u_char trk_skew_0;	/* track skew factor (LSB)	      */
	   u_char cyl_skew_1;	/* cylinder skew (MSB)		      */
	   u_char cyl_skew_0;	/* cylinder skew (LSB)		      */
	   u_char flags;	/* various */
#define		DISK_FMT_SURF	0x10
#define		DISK_FMT_RMB	0x20
#define		DISK_FMT_HSEC	0x40
#define		DISK_FMT_SSEC	0x80
	   u_char reserved2;
	   u_char reserved3;
	} disk_format;
	struct page_rigid_geometry {
	   u_char pg_code;	/* page code (should be 4)	      */
	   u_char pg_length;	/* page length (should be 0x16)	      */
	   u_char ncyl_2;	/* number of cylinders (MSB)	      */
	   u_char ncyl_1;	/* number of cylinders 		      */
	   u_char ncyl_0;	/* number of cylinders (LSB)	      */
	   u_char nheads;	/* number of heads 		      */
	   u_char st_cyl_wp_2;	/* starting cyl., write precomp (MSB) */
	   u_char st_cyl_wp_1;	/* starting cyl., write precomp	      */
	   u_char st_cyl_wp_0;	/* starting cyl., write precomp (LSB) */
	   u_char st_cyl_rwc_2;/* starting cyl., red. write cur (MSB)*/
	   u_char st_cyl_rwc_1;/* starting cyl., red. write cur      */
	   u_char st_cyl_rwc_0;/* starting cyl., red. write cur (LSB)*/
	   u_char driv_step_1;	/* drive step rate (MSB)	      */
	   u_char driv_step_0;	/* drive step rate (LSB)	      */
	   u_char land_zone_2;	/* landing zone cylinder (MSB)	      */
	   u_char land_zone_1;	/* landing zone cylinder 	      */
	   u_char land_zone_0;	/* landing zone cylinder (LSB)	      */
	   u_char sp_sync_ctl;	/* spindle synch control              */
#define SPINDLE_SYNCH_MASK	0x03	/* mask of valid bits */
#define SPINDLE_SYNCH_NONE	0x00	/* synch disabled or not supported */
#define SPINDLE_SYNCH_SLAVE	0x01	/* disk is a slave */
#define SPINDLE_SYNCH_MASTER	0x02	/* disk is a master */
#define SPINDLE_SYNCH_MCONTROL	0x03	/* disk is a master control */
	   u_char rot_offset;	/* rotational offset (for spindle synch) */
	   u_char reserved1;
	   u_char rpm_1;	/* media rotation speed (MSB)         */
	   u_char rpm_0;	/* media rotation speed (LSB)         */
	   u_char reserved2;
	   u_char reserved3;
    	} rigid_geometry;
};

#endif /* _SCSI_SCSI_DISK_H */