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