root / lab4 / .minix-src / include / sys / chio.h @ 14
History | View | Annotate | Download (9.5 KB)
1 | 13 | up20180614 | /* $NetBSD: chio.h,v 1.13 2015/09/06 06:01:02 dholland Exp $ */
|
---|---|---|---|
2 | |||
3 | /*-
|
||
4 | * Copyright (c) 1996, 1999 The NetBSD Foundation, Inc.
|
||
5 | * All rights reserved.
|
||
6 | *
|
||
7 | * This code is derived from software contributed to The NetBSD Foundation
|
||
8 | * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
|
||
9 | * NASA Ames Research Center.
|
||
10 | *
|
||
11 | * Redistribution and use in source and binary forms, with or without
|
||
12 | * modification, are permitted provided that the following conditions
|
||
13 | * are met:
|
||
14 | * 1. Redistributions of source code must retain the above copyright
|
||
15 | * notice, this list of conditions and the following disclaimer.
|
||
16 | * 2. Redistributions in binary form must reproduce the above copyright
|
||
17 | * notice, this list of conditions and the following disclaimer in the
|
||
18 | * documentation and/or other materials provided with the distribution.
|
||
19 | *
|
||
20 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
||
21 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||
22 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||
23 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
||
24 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||
25 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||
26 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||
27 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||
28 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||
29 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||
30 | * POSSIBILITY OF SUCH DAMAGE.
|
||
31 | */
|
||
32 | |||
33 | #ifndef _SYS_CHIO_H_
|
||
34 | #define _SYS_CHIO_H_
|
||
35 | |||
36 | #include <sys/ioccom.h> |
||
37 | |||
38 | /*
|
||
39 | * Element types. Used as "to" and "from" type indicators in move
|
||
40 | * and exchange operations.
|
||
41 | *
|
||
42 | * Note that code in sys/dev/scsipi/ch.c relies on these values (uses
|
||
43 | * them as offsets in an array, and other evil), so don't muck with them
|
||
44 | * unless you know what you're doing.
|
||
45 | */
|
||
46 | #define CHET_MT 0 /* medium transport (picker) */ |
||
47 | #define CHET_ST 1 /* storage transport (slot) */ |
||
48 | #define CHET_IE 2 /* import/export (portal) */ |
||
49 | #define CHET_DT 3 /* data transfer (drive) */ |
||
50 | |||
51 | /*
|
||
52 | * Structure used to execute a MOVE MEDIUM command.
|
||
53 | */
|
||
54 | struct changer_move_request {
|
||
55 | int cm_fromtype; /* element type to move from */ |
||
56 | int cm_fromunit; /* logical unit of from element */ |
||
57 | int cm_totype; /* element type to move to */ |
||
58 | int cm_tounit; /* logical unit of to element */ |
||
59 | int cm_flags; /* misc. flags */ |
||
60 | }; |
||
61 | |||
62 | /* cm_flags */
|
||
63 | #define CM_INVERT 0x01 /* invert media */ |
||
64 | |||
65 | /*
|
||
66 | * Structure used to execute an EXCHANGE MEDIUM command. In an
|
||
67 | * exchange operation, the following steps occur:
|
||
68 | *
|
||
69 | * - media from source is moved to first destination.
|
||
70 | *
|
||
71 | * - media previously occupying first destination is moved
|
||
72 | * to the second destination.
|
||
73 | *
|
||
74 | * The second destination may or may not be the same as the source.
|
||
75 | * In the case of a simple exchange, the source and second destination
|
||
76 | * are the same.
|
||
77 | */
|
||
78 | struct changer_exchange_request {
|
||
79 | int ce_srctype; /* element type of source */ |
||
80 | int ce_srcunit; /* logical unit of source */ |
||
81 | int ce_fdsttype; /* element type of first destination */ |
||
82 | int ce_fdstunit; /* logical unit of first destination */ |
||
83 | int ce_sdsttype; /* element type of second destination */ |
||
84 | int ce_sdstunit; /* logical unit of second destination */ |
||
85 | int ce_flags; /* misc. flags */ |
||
86 | }; |
||
87 | |||
88 | /* ce_flags */
|
||
89 | #define CE_INVERT1 0x01 /* invert media 1 */ |
||
90 | #define CE_INVERT2 0x02 /* invert media 2 */ |
||
91 | |||
92 | /*
|
||
93 | * Structure used to execute a POSITION TO ELEMENT command. This
|
||
94 | * moves the current picker in front of the specified element.
|
||
95 | */
|
||
96 | struct changer_position_request {
|
||
97 | int cp_type; /* element type */ |
||
98 | int cp_unit; /* logical unit of element */ |
||
99 | int cp_flags; /* misc. flags */ |
||
100 | }; |
||
101 | |||
102 | /* cp_flags */
|
||
103 | #define CP_INVERT 0x01 /* invert picker */ |
||
104 | |||
105 | /*
|
||
106 | * Data returned by CHIOGPARAMS.
|
||
107 | */
|
||
108 | struct changer_params {
|
||
109 | int cp_curpicker; /* current picker */ |
||
110 | int cp_npickers; /* number of pickers */ |
||
111 | int cp_nslots; /* number of slots */ |
||
112 | int cp_nportals; /* number of import/export portals */ |
||
113 | int cp_ndrives; /* number of drives */ |
||
114 | }; |
||
115 | |||
116 | /*
|
||
117 | * Old-style command used to get element status.
|
||
118 | */
|
||
119 | struct ochanger_element_status_request {
|
||
120 | int cesr_type; /* element type */ |
||
121 | uint8_t *cesr_data; /* pre-allocated data storage */
|
||
122 | }; |
||
123 | |||
124 | /*
|
||
125 | * Structure of a changer volume tag.
|
||
126 | */
|
||
127 | #define CHANGER_VOLTAG_SIZE 32 /* same as SCSI voltag size */ |
||
128 | struct changer_voltag {
|
||
129 | char cv_tag[CHANGER_VOLTAG_SIZE + 1]; /* ASCII tag */ |
||
130 | uint16_t cv_serial; /* serial number */
|
||
131 | }; |
||
132 | |||
133 | /*
|
||
134 | * Data returned by CHIOGSTATUS.
|
||
135 | */
|
||
136 | struct changer_element_status {
|
||
137 | int ces_flags; /* CESTATUS_* flags; see below */ |
||
138 | |||
139 | /*
|
||
140 | * The following is only valid on Data Transport elements (drives).
|
||
141 | */
|
||
142 | char ces_xname[16]; /* external name of drive device */ |
||
143 | |||
144 | /*
|
||
145 | * The following fieds indicate the element the medium was
|
||
146 | * moved from in order to arrive in this element.
|
||
147 | */
|
||
148 | int ces_from_type; /* type of element */ |
||
149 | int ces_from_unit; /* logical unit of element */ |
||
150 | |||
151 | /*
|
||
152 | * Volume tag information.
|
||
153 | */
|
||
154 | struct changer_voltag ces_pvoltag; /* primary volume tag */ |
||
155 | struct changer_voltag ces_avoltag; /* alternate volume tag */ |
||
156 | |||
157 | size_t ces_vendor_len; /* length of any vendor-specific data */
|
||
158 | |||
159 | /*
|
||
160 | * These two fields are only valid if CESTATUS_EXCEPT is
|
||
161 | * set in ces_flags, and are only valid on SCSI changers.
|
||
162 | */
|
||
163 | uint8_t ces_asc; /* Additional Sense Code */
|
||
164 | uint8_t ces_ascq; /* Additional Sense Code Qualifier */
|
||
165 | |||
166 | /*
|
||
167 | * These two fields may be useful if ces_xname is not valid.
|
||
168 | * They indicate the target and lun of a drive element. These
|
||
169 | * are only valid on SCSI changers.
|
||
170 | */
|
||
171 | uint8_t ces_target; /* SCSI target of drive */
|
||
172 | uint8_t ces_lun; /* SCSI LUN of drive */
|
||
173 | }; |
||
174 | |||
175 | /*
|
||
176 | * Flags for changer_element_status. These are flags that are returned
|
||
177 | * by hardware. Not all flags have meaning for all element types.
|
||
178 | */
|
||
179 | #define CESTATUS_FULL 0x0001 /* element is full */ |
||
180 | #define CESTATUS_IMPEXP 0x0002 /* media deposited by operator */ |
||
181 | #define CESTATUS_EXCEPT 0x0004 /* element in abnormal state */ |
||
182 | #define CESTATUS_ACCESS 0x0008 /* media accessible by picker */ |
||
183 | #define CESTATUS_EXENAB 0x0010 /* element supports exporting */ |
||
184 | #define CESTATUS_INENAB 0x0020 /* element supports importing */ |
||
185 | |||
186 | #define CESTATUS_PICKER_MASK 0x0005 /* flags valid for pickers */ |
||
187 | #define CESTATUS_SLOT_MASK 0x000c /* flags valid for slots */ |
||
188 | #define CESTATUS_PORTAL_MASK 0x003f /* flags valid for portals */ |
||
189 | #define CESTATUS_DRIVE_MASK 0x000c /* flags valid for drives */ |
||
190 | |||
191 | #define CESTATUS_INVERTED 0x0040 /* medium inverted from storage */ |
||
192 | #define CESTATUS_NOTBUS 0x0080 /* drive not on same bus as changer */ |
||
193 | |||
194 | /*
|
||
195 | * These changer_element_status flags indicate the validity of fields
|
||
196 | * in the returned data.
|
||
197 | */
|
||
198 | #define CESTATUS_STATUS_VALID 0x0100 /* entire structure valid */ |
||
199 | #define CESTATUS_XNAME_VALID 0x0200 /* ces_xname valid */ |
||
200 | #define CESTATUS_FROM_VALID 0x0400 /* ces_from_* valid */ |
||
201 | #define CESTATUS_PVOL_VALID 0x0800 /* ces_pvoltag valid */ |
||
202 | #define CESTATUS_AVOL_VALID 0x1000 /* ces_avoltag valid */ |
||
203 | #define CESTATUS_TARGET_VALID 0x2000 /* ces_target valid */ |
||
204 | #define CESTATUS_LUN_VALID 0x4000 /* ces_lun valid */ |
||
205 | |||
206 | #define CESTATUS_BITS \
|
||
207 | "\20\6INEAB\5EXENAB\4ACCESS\3EXCEPT\2IMPEXP\1FULL"
|
||
208 | |||
209 | /*
|
||
210 | * Command used to get element status.
|
||
211 | */
|
||
212 | struct changer_element_status_request {
|
||
213 | int cesr_type; /* element type */ |
||
214 | int cesr_unit; /* start at this unit */ |
||
215 | int cesr_count; /* for this many units */ |
||
216 | int cesr_flags; /* flags; see below */ |
||
217 | /* pre-allocated data storage */
|
||
218 | /*
|
||
219 | * These fields point to the data to be returned to the
|
||
220 | * user:
|
||
221 | *
|
||
222 | * cesr_deta: pointer to array of cesr_count status descriptors
|
||
223 | *
|
||
224 | * cesr_vendor_data: pointer to array of void *'s which point
|
||
225 | * to pre-allocated areas for vendor-specific data. Optional.
|
||
226 | */
|
||
227 | struct changer_element_status *cesr_data;
|
||
228 | void **cesr_vendor_data;
|
||
229 | }; |
||
230 | |||
231 | #define CESR_VOLTAGS 0x01 /* request volume tags */ |
||
232 | |||
233 | /*
|
||
234 | * Command used to modify a media element's volume tag.
|
||
235 | */
|
||
236 | struct changer_set_voltag_request {
|
||
237 | int csvr_type; /* element type */ |
||
238 | int csvr_unit; /* unit to modify */ |
||
239 | int csvr_flags; /* flags; see below */ |
||
240 | /* the actual volume tag; ignored if clearing
|
||
241 | the tag */
|
||
242 | struct changer_voltag csvr_voltag;
|
||
243 | }; |
||
244 | |||
245 | #define CSVR_MODE_SET 0x00 /* set volume tag if not set */ |
||
246 | #define CSVR_MODE_REPLACE 0x01 /* unconditionally replace volume tag */ |
||
247 | #define CSVR_MODE_CLEAR 0x02 /* clear volume tag */ |
||
248 | #define CSVR_MODE_MASK 0x0f |
||
249 | #define CSVR_ALTERNATE 0x10 /* modify alternate volume tag */ |
||
250 | |||
251 | /*
|
||
252 | * Changer events.
|
||
253 | *
|
||
254 | * When certain events occur, the kernel can indicate this by setting
|
||
255 | * a bit in a bitmask.
|
||
256 | *
|
||
257 | * When a read is issued to the changer, the kernel returns this event
|
||
258 | * bitmask. The read never blocks; if no events are pending, the bitmask
|
||
259 | * will be all-clear.
|
||
260 | *
|
||
261 | * A process may select for read to wait for an event to occur.
|
||
262 | *
|
||
263 | * The event mask is cleared when the changer is closed.
|
||
264 | */
|
||
265 | #define CHANGER_EVENT_SIZE sizeof(u_int) |
||
266 | #define CHEV_ELEMENT_STATUS_CHANGED 0x00000001 |
||
267 | |||
268 | /*
|
||
269 | * ioctls applicable to changers.
|
||
270 | */
|
||
271 | #define CHIOMOVE _IOW('c', 0x01, struct changer_move_request) |
||
272 | #define CHIOEXCHANGE _IOW('c', 0x02, struct changer_exchange_request) |
||
273 | #define CHIOPOSITION _IOW('c', 0x03, struct changer_position_request) |
||
274 | #define CHIOGPICKER _IOR('c', 0x04, int) |
||
275 | #define CHIOSPICKER _IOW('c', 0x05, int) |
||
276 | #define CHIOGPARAMS _IOR('c', 0x06, struct changer_params) |
||
277 | #define CHIOIELEM _IO('c', 0x07) |
||
278 | #define OCHIOGSTATUS _IOW('c', 0x08, struct ochanger_element_status_request) |
||
279 | #define CHIOGSTATUS _IOW('c', 0x09, struct changer_element_status_request) |
||
280 | #define CHIOSVOLTAG _IOW('c', 0x0a, struct changer_set_voltag_request) |
||
281 | |||
282 | #endif /* _SYS_CHIO_H_ */ |