159874Speter/* $FreeBSD: stable/10/sys/cam/scsi/scsi_ch.h 311402 2017-01-05 11:20:31Z mav $ */
239213Sgibbs/*	$NetBSD: scsi_changer.h,v 1.11 1998/02/13 08:28:32 enami Exp $	*/
339213Sgibbs
4139743Simp/*-
539213Sgibbs * Copyright (c) 1996 Jason R. Thorpe <thorpej@and.com>
639213Sgibbs * All rights reserved.
739213Sgibbs *
839213Sgibbs * Partially based on an autochanger driver written by Stefan Grefen
939213Sgibbs * and on an autochanger driver written by the Systems Programming Group
1039213Sgibbs * at the University of Utah Computer Science Department.
1139213Sgibbs *
1239213Sgibbs * Redistribution and use in source and binary forms, with or without
1339213Sgibbs * modification, are permitted provided that the following conditions
1439213Sgibbs * are met:
1539213Sgibbs * 1. Redistributions of source code must retain the above copyright
1639213Sgibbs *    notice, this list of conditions and the following disclaimer.
1739213Sgibbs * 2. Redistributions in binary form must reproduce the above copyright
1839213Sgibbs *    notice, this list of conditions and the following disclaimer in the
1939213Sgibbs *    documentation and/or other materials provided with the distribution.
2039213Sgibbs * 3. All advertising materials mentioning features or use of this software
2139213Sgibbs *    must display the following acknowledgements:
2239213Sgibbs *	This product includes software developed by Jason R. Thorpe
2339213Sgibbs *	for And Communications, http://www.and.com/
2439213Sgibbs * 4. The name of the author may not be used to endorse or promote products
2539213Sgibbs *    derived from this software without specific prior written permission.
2639213Sgibbs *
2739213Sgibbs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
2839213Sgibbs * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2939213Sgibbs * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
3039213Sgibbs * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
3139213Sgibbs * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
3239213Sgibbs * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
3339213Sgibbs * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
3439213Sgibbs * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
3539213Sgibbs * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3639213Sgibbs * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3739213Sgibbs * SUCH DAMAGE.
3839213Sgibbs */
3939213Sgibbs
4039213Sgibbs/*
4139213Sgibbs * SCSI changer interface description
4239213Sgibbs */
4339213Sgibbs
44139743Simp/*-
4539213Sgibbs * Partially derived from software written by Stefan Grefen
4639213Sgibbs * (grefen@goofy.zdv.uni-mainz.de soon grefen@convex.com)
4739213Sgibbs * based on the SCSI System by written Julian Elischer (julian@tfs.com)
4839213Sgibbs * for TRW Financial Systems.
4939213Sgibbs *
5039213Sgibbs * TRW Financial Systems, in accordance with their agreement with Carnegie
5139213Sgibbs * Mellon University, makes this software available to CMU to distribute
5239213Sgibbs * or use in any manner that they see fit as long as this message is kept with
5339213Sgibbs * the software. For this reason TFS also grants any other persons or
5439213Sgibbs * organisations permission to use or modify this software.
5539213Sgibbs *
5639213Sgibbs * TFS supplies this software to be publicly redistributed
5739213Sgibbs * on the understanding that TFS is not responsible for the correct
5839213Sgibbs * functioning of this software in any circumstances.
5939213Sgibbs *
6039213Sgibbs * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
6139213Sgibbs */
6239213Sgibbs
6339213Sgibbs#ifndef _SCSI_SCSI_CH_H
6439213Sgibbs#define _SCSI_SCSI_CH_H 1
6539213Sgibbs
6639213Sgibbs#include <sys/cdefs.h>
6739213Sgibbs
6839213Sgibbs/*
6939213Sgibbs * SCSI command format
7039213Sgibbs */
7139213Sgibbs
7239213Sgibbs/*
7339213Sgibbs * Exchange the medium in the source element with the medium
7439213Sgibbs * located at the destination element.
7539213Sgibbs */
7639213Sgibbsstruct scsi_exchange_medium {
7739213Sgibbs	u_int8_t	opcode;
7839213Sgibbs#define EXCHANGE_MEDIUM		0xa6
7939213Sgibbs	u_int8_t	byte2;
8039213Sgibbs	u_int8_t	tea[2];	/* transport element address */
8139213Sgibbs	u_int8_t	src[2];	/* source address */
8239213Sgibbs	u_int8_t	fdst[2]; /* first destination address */
8339213Sgibbs	u_int8_t	sdst[2]; /* second destination address */
8439213Sgibbs	u_int8_t	invert;
8539213Sgibbs#define EXCHANGE_MEDIUM_INV1	0x01
8639213Sgibbs#define EXCHANGE_MEDIUM_INV2	0x02
8739213Sgibbs	u_int8_t	control;
8839213Sgibbs};
8939213Sgibbs
9039213Sgibbs/*
9139213Sgibbs * Cause the medium changer to check all elements for medium and any
9239213Sgibbs * other status relevant to the element.
9339213Sgibbs */
9439213Sgibbsstruct scsi_initialize_element_status {
9539213Sgibbs	u_int8_t	opcode;
9639213Sgibbs#define INITIALIZE_ELEMENT_STATUS	0x07
9739213Sgibbs	u_int8_t	byte2;
9839213Sgibbs	u_int8_t	reserved[3];
9939213Sgibbs	u_int8_t	control;
10039213Sgibbs};
10139213Sgibbs
10239213Sgibbs/*
10339213Sgibbs * Request the changer to move a unit of media from the source element
10439213Sgibbs * to the destination element.
10539213Sgibbs */
10639213Sgibbsstruct scsi_move_medium {
10739213Sgibbs	u_int8_t	opcode;
10839213Sgibbs	u_int8_t	byte2;
10939213Sgibbs	u_int8_t	tea[2];	/* transport element address */
11039213Sgibbs	u_int8_t	src[2];	/* source element address */
11139213Sgibbs	u_int8_t	dst[2];	/* destination element address */
11239213Sgibbs	u_int8_t	reserved[2];
11339213Sgibbs	u_int8_t	invert;
11439213Sgibbs#define MOVE_MEDIUM_INVERT	0x01
11539213Sgibbs	u_int8_t	control;
11639213Sgibbs};
11739213Sgibbs
11839213Sgibbs/*
11939213Sgibbs * Position the specified transport element (picker) in front of
12039213Sgibbs * the destination element specified.
12139213Sgibbs */
12239213Sgibbsstruct scsi_position_to_element {
12339213Sgibbs	u_int8_t	opcode;
12439213Sgibbs	u_int8_t	byte2;
12539213Sgibbs	u_int8_t	tea[2];	/* transport element address */
12639213Sgibbs	u_int8_t	dst[2];	/* destination element address */
12739213Sgibbs	u_int8_t	reserved[2];
12839213Sgibbs	u_int8_t	invert;
12939213Sgibbs#define POSITION_TO_ELEMENT_INVERT	0x01
13039213Sgibbs	u_int8_t	control;
13139213Sgibbs};
13239213Sgibbs
13339213Sgibbs/*
13439213Sgibbs * Request that the changer report the status of its internal elements.
13539213Sgibbs */
13639213Sgibbsstruct scsi_read_element_status {
13739213Sgibbs	u_int8_t	opcode;
13839213Sgibbs	u_int8_t	byte2;
139249658Sken#define	READ_ELEMENT_STATUS_VOLTAG	0x10	/* report volume tag info */
14039213Sgibbs	/* ...next 4 bits are an element type code... */
14139213Sgibbs	u_int8_t	sea[2];	/* starting element address */
14239213Sgibbs	u_int8_t	count[2]; /* number of elements */
143249658Sken	u_int8_t	flags;
144249658Sken#define	READ_ELEMENT_STATUS_DVCID	0x01 /* report device serial number */
145249658Sken#define	READ_ELEMENT_STATUS_CURDATA	0x02 /* allow motion during command */
146249658Sken
14739213Sgibbs	u_int8_t	len[3];	/* length of data buffer */
14839213Sgibbs	u_int8_t	reserved1;
14939213Sgibbs	u_int8_t	control;
15039213Sgibbs};
15139213Sgibbs
15239213Sgibbsstruct scsi_request_volume_element_address {
15339213Sgibbs	u_int8_t	opcode;
15439213Sgibbs	u_int8_t	byte2;
155249658Sken#define	REQUEST_VOLUME_ELEMENT_ADDRESS_VOLTAG	0x10
15639213Sgibbs	/* ...next 4 bits are an element type code... */
15739213Sgibbs	u_int8_t	eaddr[2];	/* element address */
15839213Sgibbs	u_int8_t	count[2];	/* number of elements */
15939213Sgibbs	u_int8_t	reserved0;
16039213Sgibbs	u_int8_t	len[3];		/* length of data buffer */
16139213Sgibbs	u_int8_t	reserved1;
16239213Sgibbs	u_int8_t	control;
16339213Sgibbs};
16439213Sgibbs
16539213Sgibbs/* XXX scsi_release */
16639213Sgibbs
16739213Sgibbs/*
16839213Sgibbs * Changer-specific mode page numbers.
16939213Sgibbs */
17039213Sgibbs#define	CH_ELEMENT_ADDR_ASSIGN_PAGE	0x1D
17139213Sgibbs#define	CH_TRANS_GEOM_PARAMS_PAGE	0x1E
17239213Sgibbs#define	CH_DEVICE_CAP_PAGE		0x1F
17339213Sgibbs
17439213Sgibbs/*
17539213Sgibbs * Data returned by READ ELEMENT STATUS consists of an 8-byte header
17639213Sgibbs * followed by one or more read_element_status_pages.
17739213Sgibbs */
17839213Sgibbsstruct read_element_status_header {
17939213Sgibbs	u_int8_t	fear[2];  /* first element address reported */
18039213Sgibbs	u_int8_t	count[2]; /* number of elements available */
18139213Sgibbs	u_int8_t	reserved;
18239213Sgibbs	u_int8_t	nbytes[3]; /* byte count of all pages */
18339213Sgibbs};
18439213Sgibbs
18539213Sgibbsstruct read_element_status_page_header {
18639213Sgibbs	u_int8_t	type;	/* element type code; see type codes below */
18739213Sgibbs	u_int8_t	flags;
188249658Sken#define	READ_ELEMENT_STATUS_AVOLTAG	0x40
189249658Sken#define	READ_ELEMENT_STATUS_PVOLTAG	0x80
19039213Sgibbs	u_int8_t	edl[2];	/* element descriptor length */
19139213Sgibbs	u_int8_t	reserved;
19239213Sgibbs	u_int8_t	nbytes[3]; /* byte count of all descriptors */
19339213Sgibbs};
19439213Sgibbs
19539213Sgibbs/*
19639213Sgibbs * Format of a volume tag
19739213Sgibbs */
19839213Sgibbs
19939213Sgibbsstruct volume_tag {
20039213Sgibbs	u_int8_t	vif[32];	/* volume identification field */
20139213Sgibbs	u_int8_t	reserved[2];
20239213Sgibbs	u_int8_t	vsn[2];		/* volume sequence number */
20339213Sgibbs};
20439213Sgibbs
205249658Skenstruct read_element_status_device_id {
206249658Sken	u_int8_t	prot_code_set;
207249658Sken#define	READ_ELEMENT_STATUS_CODE_SET(p) ((p) & 0x0F)
208249658Sken#define	READ_ELEMENT_STATUS_PROTOCOL_ID(p) ((p) >> 4)
209249658Sken
210249658Sken	u_int8_t	piv_assoc_designator_type;
211249658Sken#define	READ_ELEMENT_STATUS_PIV_SET 0x80
212249658Sken#define	READ_ELEMENT_STATUS_ASSOCIATION(p) ((p) >> 4)
213249658Sken#define	READ_ELEMENT_STATUS_DESIGNATOR_TYPE(p) ((p) & 0x0F)
214249658Sken
215249658Sken	u_int8_t	reserved2;
216249658Sken	u_int8_t	designator_length;
217249658Sken	u_int8_t	designator[256]; /* Allocate max length */
218249658Sken};
219249658Sken
22039213Sgibbsstruct read_element_status_descriptor {
22139213Sgibbs	u_int8_t	eaddr[2];	/* element address */
22239213Sgibbs	u_int8_t	flags1;
22339213Sgibbs
224249658Sken#define	READ_ELEMENT_STATUS_FULL	0x01
225249658Sken#define	READ_ELEMENT_STATUS_IMPEXP	0x02
226249658Sken#define	READ_ELEMENT_STATUS_EXCEPT	0x04
227249658Sken#define	READ_ELEMENT_STATUS_ACCESS	0x08
228249658Sken#define	READ_ELEMENT_STATUS_EXENAB	0x10
229249658Sken#define	READ_ELEMENT_STATUS_INENAB	0x20
23039213Sgibbs
231249658Sken#define	READ_ELEMENT_STATUS_MT_MASK1	0x05
232249658Sken#define	READ_ELEMENT_STATUS_ST_MASK1	0x0c
233249658Sken#define	READ_ELEMENT_STATUS_IE_MASK1	0x3f
234249658Sken#define	READ_ELEMENT_STATUS_DT_MASK1	0x0c
23539213Sgibbs
23639213Sgibbs	u_int8_t	reserved0;
23739213Sgibbs	u_int8_t	sense_code;
23839213Sgibbs	u_int8_t	sense_qual;
23939213Sgibbs
240249658Sken	union {
241249658Sken		struct {
242249658Sken			u_int8_t	dt_scsi_flags;
24339213Sgibbs
244249658Sken#define	READ_ELEMENT_STATUS_DT_LUNMASK	0x07
245249658Sken#define	READ_ELEMENT_STATUS_DT_LUVALID	0x10
246249658Sken#define	READ_ELEMENT_STATUS_DT_IDVALID	0x20
247249658Sken#define	READ_ELEMENT_STATUS_DT_NOTBUS	0x80
24839213Sgibbs
249249658Sken			u_int8_t	dt_scsi_addr;
250249658Sken			u_int8_t	reserved1;
251249658Sken		} scsi_2;
25239213Sgibbs
253249658Sken		/* reserved and obsolete (as of SCSI-3) fields */
254249658Sken		u_int8_t	reserved_or_obsolete[3];
255249658Sken	} dt_or_obsolete;
25639213Sgibbs
25739213Sgibbs	u_int8_t	flags2;
258249658Sken#define	READ_ELEMENT_STATUS_INVERT		0x40
259249658Sken#define	READ_ELEMENT_STATUS_SVALID		0x80
260249658Sken#define	READ_ELEMENT_STATUS_ED			0x80
261249658Sken#define	READ_ELEMENT_STATUS_MEDIA_TYPE_MASK	0x07
262249658Sken
26339213Sgibbs	u_int8_t	ssea[2];	/* source storage element address */
26439213Sgibbs
265249658Sken	union {
266249658Sken		struct volume_tag			pvoltag;
267249658Sken		struct volume_tag 			voltag[2];
268249658Sken		struct read_element_status_device_id	devid;
269249658Sken		struct {
270249658Sken			struct volume_tag			pvoltag;
271249658Sken			struct read_element_status_device_id	devid;
272249658Sken		} pvol_and_devid;
273249658Sken		struct {
274249658Sken			struct volume_tag			voltag[2];
275249658Sken			struct read_element_status_device_id	devid;
276249658Sken		} vol_tags_and_devid;
277249658Sken	} voltag_devid;
27839213Sgibbs};
27939213Sgibbs
28039213Sgibbs/* XXX add data returned by REQUEST VOLUME ELEMENT ADDRESS */
28139213Sgibbs
28239213Sgibbs/* Element type codes */
28339213Sgibbs#define ELEMENT_TYPE_MASK	0x0f	/* Note: these aren't bits */
28439213Sgibbs#define ELEMENT_TYPE_ALL	0x00
28539213Sgibbs#define ELEMENT_TYPE_MT		0x01
28639213Sgibbs#define ELEMENT_TYPE_ST		0x02
28739213Sgibbs#define ELEMENT_TYPE_IE		0x03
28839213Sgibbs#define ELEMENT_TYPE_DT		0x04
28939213Sgibbs
29039213Sgibbs/*
29139213Sgibbs * XXX The following definitions should be common to all SCSI device types.
29239213Sgibbs */
29339213Sgibbs#define PGCODE_MASK	0x3f	/* valid page number bits in pg_code */
29439213Sgibbs#define PGCODE_PS	0x80	/* indicates page is savable */
29539213Sgibbs
29639213Sgibbs/*
29739213Sgibbs * Send volume tag information to the changer
29839213Sgibbs */
29939213Sgibbs
30039213Sgibbsstruct scsi_send_volume_tag {
30139213Sgibbs	u_int8_t	opcode;
30239213Sgibbs#define SEND_VOLUME_TAG	0xb6
30339213Sgibbs	u_int8_t	byte2;
30439213Sgibbs	u_int8_t	ea[2];		/* element address */
30539213Sgibbs	u_int8_t	reserved2;
30639213Sgibbs  	u_int8_t	sac;		/* send action code */
30739213Sgibbs
30839213Sgibbs#define SEND_VOLUME_TAG_ASSERT_PRIMARY		0x08
30939213Sgibbs#define SEND_VOLUME_TAG_ASSERT_ALTERNATE	0x09
31039213Sgibbs#define SEND_VOLUME_TAG_REPLACE_PRIMARY		0x0a
31139213Sgibbs#define SEND_VOLUME_TAG_REPLACE_ALTERNATE	0x0b
31239213Sgibbs#define SEND_VOLUME_TAG_UNDEFINED_PRIMARY	0x0c
31339213Sgibbs#define SEND_VOLUME_TAG_UNDEFINED_ALTERNATE	0x0d
31439213Sgibbs
31539213Sgibbs	u_int8_t	reserved4[2];
31639213Sgibbs	u_int8_t	pll[2];		/* parameter list length */
31739213Sgibbs	u_int8_t	reserved5;
31839213Sgibbs	u_int8_t	control;
31939213Sgibbs};
32039213Sgibbs
32139213Sgibbs/*
32239213Sgibbs * Parameter format for SEND VOLUME TAG
32339213Sgibbs */
32439213Sgibbs
32539213Sgibbsstruct scsi_send_volume_tag_parameters {
32639213Sgibbs	u_int8_t	vitf[32];	/* volume tag identification template */
32739213Sgibbs	u_int8_t	reserved1[2];
32839213Sgibbs	u_int8_t	minvsn[2];	/* minimum volume sequence number */
32939213Sgibbs	u_int8_t	reserved2[2];
33039213Sgibbs	u_int8_t	maxvsn[2];	/* maximum volume sequence number */
33139213Sgibbs};
33239213Sgibbs
33339213Sgibbs/*
33439213Sgibbs * Device capabilities page.
33539213Sgibbs *
336311402Smav * This page defines characteristics of the element types in the
33739213Sgibbs * medium changer device.
33839213Sgibbs *
33939213Sgibbs * Note in the definitions below, the following abbreviations are
34039213Sgibbs * used:
34139213Sgibbs *		MT	Medium transport element (picker)
34239213Sgibbs *		ST	Storage transport element (slot)
34339213Sgibbs *		IE	Import/export element (portal)
344311402Smav *		DT	Data transfer element (tape/disk drive)
34539213Sgibbs */
34639213Sgibbsstruct page_device_capabilities {
34739213Sgibbs	u_int8_t	pg_code;	/* page code (0x1f) */
34839213Sgibbs	u_int8_t	pg_length;	/* page length (0x12) */
34939213Sgibbs
35039213Sgibbs	/*
35139213Sgibbs	 * The STOR_xx bits indicate that an element of a given
35239213Sgibbs	 * type may provide independent storage for a unit of
35339213Sgibbs	 * media.  The top four bits of this value are reserved.
35439213Sgibbs	 */
35539213Sgibbs	u_int8_t	stor;
35639213Sgibbs#define STOR_MT		0x01
35739213Sgibbs#define STOR_ST		0x02
35839213Sgibbs#define STOR_IE		0x04
35939213Sgibbs#define STOR_DT		0x08
36039213Sgibbs
36139213Sgibbs	u_int8_t	reserved0;
36239213Sgibbs
36339213Sgibbs	/*
36439213Sgibbs	 * The MOVE_TO_yy bits indicate the changer supports
36539213Sgibbs	 * moving a unit of medium from an element of a given type to an
36639213Sgibbs	 * element of type yy.  This is used to determine if a given
36739213Sgibbs	 * MOVE MEDIUM command is legal.  The top four bits of each
36839213Sgibbs	 * of these values are reserved.
36939213Sgibbs	 */
370115464Sphk	u_int8_t	move_from[CHET_MAX + 1];
37139213Sgibbs#define MOVE_TO_MT	0x01
37239213Sgibbs#define MOVE_TO_ST	0x02
37339213Sgibbs#define MOVE_TO_IE	0x04
37439213Sgibbs#define MOVE_TO_DT	0x08
37539213Sgibbs
37641910Sgibbs	u_int8_t	reserved1[4];
37739213Sgibbs
37839213Sgibbs	/*
37939213Sgibbs	 * Similar to above, but for EXCHANGE MEDIUM.
38039213Sgibbs	 */
381115464Sphk	u_int8_t	exchange_with[CHET_MAX + 1];
38239213Sgibbs#define EXCHANGE_WITH_MT	0x01
38339213Sgibbs#define EXCHANGE_WITH_ST	0x02
38439213Sgibbs#define EXCHANGE_WITH_IE	0x04
38539213Sgibbs#define EXCHANGE_WITH_DT	0x08
38639213Sgibbs};
38739213Sgibbs
38839213Sgibbs/*
38939213Sgibbs * Medium changer elemement address assignment page.
39039213Sgibbs *
39139213Sgibbs * Some of these fields can be a little confusing, so an explanation
39239213Sgibbs * is in order.
39339213Sgibbs *
394227489Seadler * Each component within a medium changer apparatus is called an
39539213Sgibbs * "element".
39639213Sgibbs *
39739213Sgibbs * The "medium transport element address" is the address of the first
39839213Sgibbs * picker (robotic arm).  "Number of medium transport elements" tells
39939213Sgibbs * us how many pickers exist in the changer.
40039213Sgibbs *
40139213Sgibbs * The "first storage element address" is the address of the first
40239213Sgibbs * slot in the tape or disk magazine.  "Number of storage elements" tells
40339213Sgibbs * us how many slots exist in the changer.
40439213Sgibbs *
40539213Sgibbs * The "first import/export element address" is the address of the first
40639213Sgibbs * medium portal accessible both by the medium changer and an outside
40739213Sgibbs * human operator.  This is where the changer might deposit tapes destined
40839213Sgibbs * for some vault.  The "number of import/export elements" tells us
40939213Sgibbs * not many of these portals exist in the changer.  NOTE: this number may
41039213Sgibbs * be 0.
41139213Sgibbs *
41239213Sgibbs * The "first data transfer element address" is the address of the first
41339213Sgibbs * tape or disk drive in the changer.  "Number of data transfer elements"
41439213Sgibbs * tells us how many drives exist in the changer.
41539213Sgibbs */
41639213Sgibbsstruct page_element_address_assignment {
41739213Sgibbs	u_int8_t	pg_code;	/* page code (0x1d) */
41839213Sgibbs	u_int8_t	pg_length;	/* page length (0x12) */
41939213Sgibbs
42039213Sgibbs	/* Medium transport element address */
42139213Sgibbs	u_int8_t	mtea[2];
42239213Sgibbs
42339213Sgibbs	/* Number of medium transport elements */
42439213Sgibbs	u_int8_t	nmte[2];
42539213Sgibbs
42639213Sgibbs	/* First storage element address */
42739213Sgibbs	u_int8_t	fsea[2];
42839213Sgibbs
42939213Sgibbs	/* Number of storage elements */
43039213Sgibbs	u_int8_t	nse[2];
43139213Sgibbs
43239213Sgibbs	/* First import/export element address */
43339213Sgibbs	u_int8_t	fieea[2];
43439213Sgibbs
43539213Sgibbs	/* Number of import/export elements */
43639213Sgibbs	u_int8_t	niee[2];
43739213Sgibbs
43839213Sgibbs	/* First data transfer element address */
43939213Sgibbs	u_int8_t	fdtea[2];
44039213Sgibbs
44139213Sgibbs	/* Number of data trafer elements */
44239213Sgibbs	u_int8_t	ndte[2];
44339213Sgibbs
44439213Sgibbs	u_int8_t	reserved[2];
44539213Sgibbs};
44639213Sgibbs
44739213Sgibbs/*
44839213Sgibbs * Transport geometry parameters page.
44939213Sgibbs *
45039213Sgibbs * Defines whether each medium transport element is a member of a set of
45139213Sgibbs * elements that share a common robotics subsystem and whether the element
45239213Sgibbs * is capable of media rotation.  One transport geometry descriptor is
45339213Sgibbs * transferred for each medium transport element, beginning with the first
45439213Sgibbs * medium transport element (other than the default transport element address
45539213Sgibbs * of 0).
45639213Sgibbs */
45739213Sgibbsstruct page_transport_geometry_parameters {
45839213Sgibbs	u_int8_t	pg_code;	/* page code (0x1e) */
45939213Sgibbs	u_int8_t	pg_length;	/* page length; variable */
46039213Sgibbs
46139213Sgibbs	/* Transport geometry descriptor(s) are here. */
46239213Sgibbs
46339213Sgibbs	u_int8_t	misc;
46439213Sgibbs#define CAN_ROTATE	0x01
46539213Sgibbs
46639213Sgibbs	/* Member number in transport element set. */
46739213Sgibbs	u_int8_t	member;
46839213Sgibbs};
46939213Sgibbs
47039213Sgibbs__BEGIN_DECLS
47139213Sgibbsvoid scsi_move_medium(struct ccb_scsiio *csio, u_int32_t retries,
47239213Sgibbs		      void (*cbfcnp)(struct cam_periph *, union ccb *),
47339213Sgibbs		      u_int8_t tag_action, u_int32_t tea, u_int32_t src,
47439213Sgibbs		      u_int32_t dst, int invert, u_int8_t sense_len,
47539213Sgibbs		      u_int32_t timeout);
47639213Sgibbs
47739213Sgibbsvoid scsi_exchange_medium(struct ccb_scsiio *csio, u_int32_t retries,
47839213Sgibbs			  void (*cbfcnp)(struct cam_periph *, union ccb *),
47939213Sgibbs			  u_int8_t tag_action, u_int32_t tea, u_int32_t src,
48039213Sgibbs			  u_int32_t dst1, u_int32_t dst2, int invert1,
48139213Sgibbs			  int invert2, u_int8_t sense_len, u_int32_t timeout);
48239213Sgibbs
48339213Sgibbsvoid scsi_position_to_element(struct ccb_scsiio *csio, u_int32_t retries,
48439213Sgibbs			      void (*cbfcnp)(struct cam_periph *, union ccb *),
48539213Sgibbs			      u_int8_t tag_action, u_int32_t tea, u_int32_t dst,
48639213Sgibbs			      int invert, u_int8_t sense_len,
48739213Sgibbs			      u_int32_t timeout);
48839213Sgibbs
48939213Sgibbsvoid scsi_read_element_status(struct ccb_scsiio *csio, u_int32_t retries,
49039213Sgibbs			      void (*cbfcnp)(struct cam_periph *, union ccb *),
49139213Sgibbs			      u_int8_t tag_action, int voltag, u_int32_t sea,
492249658Sken			      int curdata, int dvcid,
49339213Sgibbs			      u_int32_t count, u_int8_t *data_ptr,
49439213Sgibbs			      u_int32_t dxfer_len, u_int8_t sense_len,
49539213Sgibbs			      u_int32_t timeout);
49639213Sgibbs
49739213Sgibbsvoid scsi_initialize_element_status(struct ccb_scsiio *csio, u_int32_t retries,
49839213Sgibbs			       void (*cbfcnp)(struct cam_periph *, union ccb *),
49939213Sgibbs			       u_int8_t tag_action, u_int8_t sense_len,
50039213Sgibbs			       u_int32_t timeout);
50139213Sgibbsvoid scsi_send_volume_tag(struct ccb_scsiio *csio, u_int32_t retries,
50239213Sgibbs			  void (*cbfcnp)(struct cam_periph *, union ccb *),
50339213Sgibbs			  u_int8_t tag_action,
50439213Sgibbs			  u_int16_t element_address,
50539213Sgibbs			  u_int8_t send_action_code,
50639213Sgibbs			  struct scsi_send_volume_tag_parameters *parameters,
50739213Sgibbs			  u_int8_t sense_len, u_int32_t timeout);
50839213Sgibbs__END_DECLS
50939213Sgibbs
51039213Sgibbs#endif /* _SCSI_SCSI_CH_H */
511