Home | History | Annotate | Line # | Download | only in scsipi
scsi_changer.h revision 1.13
      1  1.13  thorpej /*	$NetBSD: scsi_changer.h,v 1.13 1999/07/22 17:43:53 thorpej Exp $	*/
      2   1.4      cgd 
      3   1.1      cgd /*
      4  1.13  thorpej  * Copyright (c) 1996, 1999 Jason R. Thorpe <thorpej (at) and.com>
      5   1.7  thorpej  * All rights reserved.
      6   1.7  thorpej  *
      7   1.7  thorpej  * Partially based on an autochanger driver written by Stefan Grefen
      8   1.7  thorpej  * and on an autochanger driver written by the Systems Programming Group
      9   1.7  thorpej  * at the University of Utah Computer Science Department.
     10   1.7  thorpej  *
     11   1.7  thorpej  * Redistribution and use in source and binary forms, with or without
     12   1.7  thorpej  * modification, are permitted provided that the following conditions
     13   1.7  thorpej  * are met:
     14   1.7  thorpej  * 1. Redistributions of source code must retain the above copyright
     15   1.7  thorpej  *    notice, this list of conditions and the following disclaimer.
     16   1.7  thorpej  * 2. Redistributions in binary form must reproduce the above copyright
     17   1.7  thorpej  *    notice, this list of conditions and the following disclaimer in the
     18   1.7  thorpej  *    documentation and/or other materials provided with the distribution.
     19   1.7  thorpej  * 3. All advertising materials mentioning features or use of this software
     20   1.7  thorpej  *    must display the following acknowledgements:
     21   1.7  thorpej  *	This product includes software developed by Jason R. Thorpe
     22   1.7  thorpej  *	for And Communications, http://www.and.com/
     23   1.7  thorpej  * 4. The name of the author may not be used to endorse or promote products
     24   1.7  thorpej  *    derived from this software without specific prior written permission.
     25   1.7  thorpej  *
     26   1.7  thorpej  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     27   1.7  thorpej  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     28   1.7  thorpej  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     29   1.7  thorpej  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     30   1.7  thorpej  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     31   1.7  thorpej  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     32   1.7  thorpej  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     33   1.7  thorpej  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     34   1.7  thorpej  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     35   1.7  thorpej  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     36   1.7  thorpej  * SUCH DAMAGE.
     37   1.7  thorpej  */
     38   1.7  thorpej 
     39   1.7  thorpej /*
     40   1.2      cgd  * SCSI changer interface description
     41   1.3  mycroft  */
     42   1.3  mycroft 
     43   1.3  mycroft /*
     44   1.7  thorpej  * Partially derived from software written by Stefan Grefen
     45   1.7  thorpej  * (grefen (at) goofy.zdv.uni-mainz.de soon grefen (at) convex.com)
     46   1.1      cgd  * based on the SCSI System by written Julian Elischer (julian (at) tfs.com)
     47   1.1      cgd  * for TRW Financial Systems.
     48   1.1      cgd  *
     49   1.1      cgd  * TRW Financial Systems, in accordance with their agreement with Carnegie
     50   1.1      cgd  * Mellon University, makes this software available to CMU to distribute
     51   1.1      cgd  * or use in any manner that they see fit as long as this message is kept with
     52   1.1      cgd  * the software. For this reason TFS also grants any other persons or
     53   1.1      cgd  * organisations permission to use or modify this software.
     54   1.1      cgd  *
     55   1.1      cgd  * TFS supplies this software to be publicly redistributed
     56   1.1      cgd  * on the understanding that TFS is not responsible for the correct
     57   1.1      cgd  * functioning of this software in any circumstances.
     58   1.1      cgd  *
     59   1.1      cgd  * Ported to run under 386BSD by Julian Elischer (julian (at) tfs.com) Sept 1992
     60   1.1      cgd  */
     61   1.7  thorpej 
     62   1.1      cgd /*
     63   1.1      cgd  * SCSI command format
     64   1.1      cgd  */
     65   1.1      cgd 
     66   1.7  thorpej /*
     67   1.7  thorpej  * Exchange the medium in the source element with the medium
     68   1.7  thorpej  * located at the destination element.
     69   1.7  thorpej  */
     70   1.7  thorpej struct scsi_exchange_medium {
     71   1.7  thorpej 	u_int8_t	opcode;
     72   1.7  thorpej #define EXCHANGE_MEDIUM		0xa6
     73   1.7  thorpej 	u_int8_t	byte2;
     74   1.7  thorpej 	u_int8_t	tea[2];	/* transport element address */
     75   1.7  thorpej 	u_int8_t	src[2];	/* source address */
     76   1.7  thorpej 	u_int8_t	fdst[2]; /* first destination address */
     77   1.7  thorpej 	u_int8_t	sdst[2]; /* second destination address */
     78   1.7  thorpej 	u_int8_t	flags;
     79   1.7  thorpej #define EXCHANGE_MEDIUM_INV1	0x01
     80   1.7  thorpej #define EXCHANGE_MEDIUM_INV2	0x02
     81   1.7  thorpej 	u_int8_t	control;
     82   1.7  thorpej };
     83   1.7  thorpej 
     84   1.7  thorpej /*
     85   1.7  thorpej  * Cause the medium changer to check all elements for medium and any
     86   1.7  thorpej  * other status relevant to the element.
     87   1.7  thorpej  */
     88   1.9   mjacob struct scsi_initialize_element_status {
     89   1.7  thorpej 	u_int8_t	opcode;
     90   1.7  thorpej #define INITIALIZE_ELEMENT_STATUS	0x07
     91   1.7  thorpej 	u_int8_t	byte2;
     92   1.7  thorpej 	u_int8_t	reserved[3];
     93   1.7  thorpej 	u_int8_t	control;
     94   1.7  thorpej };
     95   1.7  thorpej 
     96   1.7  thorpej /*
     97   1.7  thorpej  * Request the changer to move a unit of media from the source element
     98   1.7  thorpej  * to the destination element.
     99   1.7  thorpej  */
    100   1.5  mycroft struct scsi_move_medium {
    101   1.7  thorpej 	u_int8_t	opcode;
    102   1.7  thorpej #define MOVE_MEDIUM	0xa5
    103   1.7  thorpej 	u_int8_t	byte2;
    104   1.7  thorpej 	u_int8_t	tea[2];	/* transport element address */
    105   1.7  thorpej 	u_int8_t	src[2];	/* source element address */
    106   1.7  thorpej 	u_int8_t	dst[2];	/* destination element address */
    107   1.7  thorpej 	u_int8_t	reserved[2];
    108   1.7  thorpej 	u_int8_t	flags;
    109   1.7  thorpej #define MOVE_MEDIUM_INVERT	0x01
    110   1.7  thorpej 	u_int8_t	control;
    111   1.1      cgd };
    112   1.1      cgd 
    113   1.7  thorpej /*
    114   1.7  thorpej  * Position the specified transport element (picker) in front of
    115   1.7  thorpej  * the destination element specified.
    116   1.7  thorpej  */
    117   1.5  mycroft struct scsi_position_to_element {
    118   1.7  thorpej 	u_int8_t	opcode;
    119   1.7  thorpej #define POSITION_TO_ELEMENT	0x2b
    120   1.7  thorpej 	u_int8_t	byte2;
    121   1.7  thorpej 	u_int8_t	tea[2];	/* transport element address */
    122   1.7  thorpej 	u_int8_t	dst[2];	/* destination element address */
    123   1.7  thorpej 	u_int8_t	reserved[2];
    124   1.7  thorpej 	u_int8_t	flags;
    125   1.7  thorpej #define POSITION_TO_ELEMENT_INVERT	0x01
    126   1.7  thorpej 	u_int8_t	control;
    127   1.7  thorpej };
    128   1.7  thorpej 
    129   1.7  thorpej /*
    130   1.7  thorpej  * Request that the changer report the status of its internal elements.
    131   1.7  thorpej  */
    132   1.7  thorpej struct scsi_read_element_status {
    133   1.7  thorpej 	u_int8_t	opcode;
    134   1.7  thorpej #define READ_ELEMENT_STATUS	0xb8
    135   1.7  thorpej 	u_int8_t	byte2;
    136   1.7  thorpej #define READ_ELEMENT_STATUS_VOLTAG	0x10	/* report volume tag info */
    137   1.7  thorpej 	/* ...next 4 bits are an element type code... */
    138   1.7  thorpej 	u_int8_t	sea[2];	/* starting element address */
    139   1.7  thorpej 	u_int8_t	count[2]; /* number of elements */
    140   1.7  thorpej 	u_int8_t	reserved0;
    141   1.7  thorpej 	u_int8_t	len[3];	/* length of data buffer */
    142   1.7  thorpej 	u_int8_t	reserved1;
    143   1.7  thorpej 	u_int8_t	control;
    144   1.7  thorpej };
    145   1.7  thorpej 
    146   1.7  thorpej struct scsi_request_volume_element_address {
    147   1.7  thorpej 	u_int8_t	opcode;
    148   1.7  thorpej #define REQUEST_VOLUME_ELEMENT_ADDRESS	0xb5
    149   1.7  thorpej 	u_int8_t	byte2;
    150   1.7  thorpej #define REQUEST_VOLUME_ELEMENT_ADDRESS_VOLTAG	0x10
    151   1.7  thorpej 	/* ...next 4 bits are an element type code... */
    152   1.7  thorpej 	u_int8_t	eaddr[2];	/* element address */
    153   1.7  thorpej 	u_int8_t	count[2];	/* number of elements */
    154   1.7  thorpej 	u_int8_t	reserved0;
    155   1.7  thorpej 	u_int8_t	len[3];		/* length of data buffer */
    156   1.7  thorpej 	u_int8_t	reserved1;
    157   1.7  thorpej 	u_int8_t	control;
    158   1.7  thorpej };
    159   1.7  thorpej 
    160   1.7  thorpej /* XXX scsi_release */
    161   1.7  thorpej 
    162   1.7  thorpej /*
    163   1.7  thorpej  * Data returned by READ ELEMENT STATUS consists of an 8-byte header
    164   1.7  thorpej  * followed by one or more read_element_status_pages.
    165   1.7  thorpej  */
    166   1.7  thorpej struct read_element_status_header {
    167   1.7  thorpej 	u_int8_t	fear[2];  /* first element address reported */
    168   1.7  thorpej 	u_int8_t	count[2]; /* number of elements available */
    169   1.7  thorpej 	u_int8_t	reserved;
    170   1.7  thorpej 	u_int8_t	nbytes[3]; /* byte count of all pages */
    171   1.7  thorpej };
    172   1.7  thorpej 
    173   1.7  thorpej struct read_element_status_page_header {
    174   1.7  thorpej 	u_int8_t	type;	/* element type code; see type codes below */
    175   1.7  thorpej 	u_int8_t	flags;
    176   1.7  thorpej #define READ_ELEMENT_STATUS_AVOLTAG	0x40
    177   1.7  thorpej #define READ_ELEMENT_STATUS_PVOLTAG	0x80
    178   1.7  thorpej 	u_int8_t	edl[2];	/* element descriptor length */
    179   1.7  thorpej 	u_int8_t	reserved;
    180   1.7  thorpej 	u_int8_t	nbytes[3]; /* byte count of all descriptors */
    181   1.7  thorpej };
    182   1.7  thorpej 
    183   1.7  thorpej struct read_element_status_descriptor {
    184   1.7  thorpej 	u_int8_t	eaddr[2];	/* element address */
    185   1.7  thorpej 	u_int8_t	flags1;
    186   1.7  thorpej 
    187   1.7  thorpej #define READ_ELEMENT_STATUS_FULL	0x01
    188   1.7  thorpej #define READ_ELEMENT_STATUS_IMPEXP	0x02
    189   1.7  thorpej #define READ_ELEMENT_STATUS_EXCEPT	0x04
    190   1.7  thorpej #define READ_ELEMENT_STATUS_ACCESS	0x08
    191   1.7  thorpej #define READ_ELEMENT_STATUS_EXENAB	0x10
    192   1.7  thorpej #define READ_ELEMENT_STATUS_INENAB	0x20
    193   1.7  thorpej 
    194   1.7  thorpej #define READ_ELEMENT_STATUS_MT_MASK1	0x05
    195   1.7  thorpej #define READ_ELEMENT_STATUS_ST_MASK1	0x0c
    196   1.7  thorpej #define READ_ELEMENT_STATUS_IE_MASK1	0x3f
    197   1.7  thorpej #define READ_ELEMENT_STATUS_DT_MASK1	0x0c
    198   1.7  thorpej 
    199   1.7  thorpej 	u_int8_t	reserved0;
    200   1.7  thorpej 	u_int8_t	sense_code;
    201   1.7  thorpej 	u_int8_t	sense_qual;
    202   1.7  thorpej 
    203   1.7  thorpej 	/*
    204   1.7  thorpej 	 * dt_scsi_flags and dt_scsi_addr are valid only on data transport
    205   1.7  thorpej 	 * elements.  These bytes are undefined for all other element types.
    206   1.7  thorpej 	 */
    207   1.7  thorpej 	u_int8_t	dt_scsi_flags;
    208   1.7  thorpej 
    209   1.7  thorpej #define READ_ELEMENT_STATUS_DT_LUNMASK	0x07
    210   1.7  thorpej #define READ_ELEMENT_STATUS_DT_LUVALID	0x10
    211   1.7  thorpej #define READ_ELEMENT_STATUS_DT_IDVALID	0x20
    212   1.7  thorpej #define READ_ELEMENT_STATUS_DT_NOTBUS	0x80
    213   1.7  thorpej 
    214   1.7  thorpej 	u_int8_t	dt_scsi_addr;
    215   1.7  thorpej 
    216   1.7  thorpej 	u_int8_t	reserved1;
    217   1.7  thorpej 
    218   1.7  thorpej 	u_int8_t	flags2;
    219   1.7  thorpej #define READ_ELEMENT_STATUS_INVERT	0x40
    220   1.7  thorpej #define READ_ELEMENT_STATUS_SVALID	0x80
    221   1.7  thorpej 	u_int8_t	ssea[2];	/* source storage element address */
    222   1.7  thorpej 
    223   1.7  thorpej 	/*
    224   1.7  thorpej 	 * bytes 12-47:	Primary volume tag information.
    225   1.7  thorpej 	 *		(field omitted if PVOLTAG = 0)
    226   1.7  thorpej 	 *
    227   1.7  thorpej 	 * bytes 48-83:	Alternate volume tag information.
    228   1.7  thorpej 	 *		(field omitted if AVOLTAG = 0)
    229   1.7  thorpej 	 *
    230   1.7  thorpej 	 * bytes 84-87:	Reserved (moved up if either of the above fields
    231   1.7  thorpej 	 *		are omitted)
    232   1.7  thorpej 	 *
    233   1.7  thorpej 	 * bytes 88-end: Vendor-specific: (moved up if either of the
    234   1.7  thorpej 	 *		 above fields are missing)
    235   1.7  thorpej 	 */
    236   1.7  thorpej };
    237   1.7  thorpej 
    238  1.13  thorpej /*
    239  1.13  thorpej  * Volume Tag format:
    240  1.13  thorpej  *
    241  1.13  thorpej  * Volume Tags are a sequence of ASCII characters, unused portion is
    242  1.13  thorpej  * blank-filled.  There should be no blanks in the significant portion
    243  1.13  thorpej  * of the tag.  For maximum compatibility, volume tag characters should
    244  1.13  thorpej  * be limited to '0'..'9', 'A'..'Z', '_'.
    245  1.13  thorpej  */
    246  1.13  thorpej struct changer_volume_tag {
    247  1.13  thorpej 	u_int8_t volid[32];	/* 32 bytes of ASCII, blank-terminated */
    248  1.13  thorpej 	u_int8_t reserved[2];
    249  1.13  thorpej 	u_int8_t volseq[2];	/* volume sequence number */
    250  1.13  thorpej };
    251   1.7  thorpej 
    252   1.7  thorpej /* Element type codes */
    253   1.7  thorpej #define ELEMENT_TYPE_MASK	0x0f	/* Note: these aren't bits */
    254   1.7  thorpej #define ELEMENT_TYPE_ALL	0x00
    255   1.7  thorpej #define ELEMENT_TYPE_MT		0x01
    256   1.7  thorpej #define ELEMENT_TYPE_ST		0x02
    257   1.7  thorpej #define ELEMENT_TYPE_IE		0x03
    258   1.7  thorpej #define ELEMENT_TYPE_DT		0x04
    259   1.7  thorpej 
    260   1.7  thorpej /*
    261   1.7  thorpej  * XXX The following definitions should be common to all SCSI device types.
    262   1.7  thorpej  */
    263   1.7  thorpej #define PGCODE_MASK	0x3f	/* valid page number bits in pg_code */
    264   1.7  thorpej #define PGCODE_PS	0x80	/* indicates page is savable */
    265   1.7  thorpej 
    266   1.7  thorpej /*
    267   1.7  thorpej  * Device capabilities page.
    268   1.7  thorpej  *
    269   1.7  thorpej  * This page defines characteristics of the elemenet types in the
    270   1.7  thorpej  * medium changer device.
    271   1.7  thorpej  *
    272   1.7  thorpej  * Note in the definitions below, the following abbreviations are
    273   1.7  thorpej  * used:
    274   1.7  thorpej  *		MT	Medium transport element (picker)
    275   1.7  thorpej  *		ST	Storage transport element (slot)
    276   1.7  thorpej  *		IE	Import/export element (portal)
    277   1.7  thorpej  *		DT	Data tranfer element (tape/disk drive)
    278   1.7  thorpej  */
    279   1.7  thorpej struct page_device_capabilities {
    280   1.7  thorpej 	u_int8_t	pg_code;	/* page code (0x1f) */
    281   1.7  thorpej 	u_int8_t	pg_length;	/* page length (0x12) */
    282   1.7  thorpej 
    283   1.7  thorpej 	/*
    284   1.7  thorpej 	 * The STOR_xx bits indicate that an element of a given
    285   1.7  thorpej 	 * type may provide independent storage for a unit of
    286   1.7  thorpej 	 * media.  The top four bits of this value are reserved.
    287   1.7  thorpej 	 */
    288   1.7  thorpej 	u_int8_t	stor;
    289   1.7  thorpej #define STOR_MT		0x01
    290   1.7  thorpej #define STOR_ST		0x02
    291   1.7  thorpej #define STOR_IE		0x04
    292   1.7  thorpej #define STOR_DT		0x08
    293   1.7  thorpej 
    294   1.7  thorpej 	u_int8_t	reserved0;
    295   1.7  thorpej 
    296   1.7  thorpej 	/*
    297   1.7  thorpej 	 * The MOVE_TO_yy bits indicate the changer supports
    298   1.7  thorpej 	 * moving a unit of medium from an element of a given type to an
    299   1.7  thorpej 	 * element of type yy.  This is used to determine if a given
    300   1.7  thorpej 	 * MOVE MEDIUM command is legal.  The top four bits of each
    301   1.7  thorpej 	 * of these values are reserved.
    302   1.7  thorpej 	 */
    303   1.7  thorpej 	u_int8_t	move_from_mt;
    304   1.7  thorpej 	u_int8_t	move_from_st;
    305   1.7  thorpej 	u_int8_t	move_from_ie;
    306   1.7  thorpej 	u_int8_t	move_from_dt;
    307   1.7  thorpej #define MOVE_TO_MT	0x01
    308   1.7  thorpej #define MOVE_TO_ST	0x02
    309   1.7  thorpej #define MOVE_TO_IE	0x04
    310   1.7  thorpej #define MOVE_TO_DT	0x08
    311   1.7  thorpej 
    312  1.12    gibbs 	u_int8_t	reserved1[4];
    313   1.7  thorpej 
    314   1.7  thorpej 	/*
    315   1.7  thorpej 	 * Similar to above, but for EXCHANGE MEDIUM.
    316   1.7  thorpej 	 */
    317   1.7  thorpej 	u_int8_t	exchange_with_mt;
    318   1.7  thorpej 	u_int8_t	exchange_with_st;
    319   1.7  thorpej 	u_int8_t	exchange_with_ie;
    320   1.7  thorpej 	u_int8_t	exchange_with_dt;
    321   1.7  thorpej #define EXCHANGE_WITH_MT	0x01
    322   1.7  thorpej #define EXCHANGE_WITH_ST	0x02
    323   1.7  thorpej #define EXCHANGE_WITH_IE	0x04
    324   1.7  thorpej #define EXCHANGE_WITH_DT	0x08
    325   1.7  thorpej };
    326   1.7  thorpej 
    327   1.7  thorpej /*
    328   1.7  thorpej  * Medium changer elemement address assignment page.
    329   1.7  thorpej  *
    330   1.7  thorpej  * Some of these fields can be a little confusing, so an explanation
    331   1.7  thorpej  * is in order.
    332   1.7  thorpej  *
    333   1.7  thorpej  * Each component within a a medium changer apparatus is called an
    334   1.7  thorpej  * "element".
    335   1.7  thorpej  *
    336   1.7  thorpej  * The "medium transport element address" is the address of the first
    337   1.7  thorpej  * picker (robotic arm).  "Number of medium transport elements" tells
    338   1.7  thorpej  * us how many pickers exist in the changer.
    339   1.7  thorpej  *
    340   1.7  thorpej  * The "first storage element address" is the address of the first
    341   1.7  thorpej  * slot in the tape or disk magazine.  "Number of storage elements" tells
    342   1.7  thorpej  * us how many slots exist in the changer.
    343   1.7  thorpej  *
    344   1.7  thorpej  * The "first import/export element address" is the address of the first
    345   1.7  thorpej  * medium portal accessible both by the medium changer and an outside
    346   1.7  thorpej  * human operator.  This is where the changer might deposit tapes destined
    347   1.7  thorpej  * for some vault.  The "number of import/export elements" tells us
    348   1.7  thorpej  * not many of these portals exist in the changer.  NOTE: this number may
    349   1.7  thorpej  * be 0.
    350   1.7  thorpej  *
    351   1.7  thorpej  * The "first data transfer element address" is the address of the first
    352   1.7  thorpej  * tape or disk drive in the changer.  "Number of data transfer elements"
    353   1.7  thorpej  * tells us how many drives exist in the changer.
    354   1.7  thorpej  */
    355   1.7  thorpej struct page_element_address_assignment {
    356   1.7  thorpej 	u_int8_t	pg_code;	/* page code (0x1d) */
    357   1.7  thorpej 	u_int8_t	pg_length;	/* page length (0x12) */
    358   1.7  thorpej 
    359   1.7  thorpej 	/* Medium transport element address */
    360   1.7  thorpej 	u_int8_t	mtea[2];
    361   1.7  thorpej 
    362   1.7  thorpej 	/* Number of medium transport elements */
    363   1.7  thorpej 	u_int8_t	nmte[2];
    364   1.7  thorpej 
    365   1.7  thorpej 	/* First storage element address */
    366   1.7  thorpej 	u_int8_t	fsea[2];
    367   1.7  thorpej 
    368   1.7  thorpej 	/* Number of storage elements */
    369   1.7  thorpej 	u_int8_t	nse[2];
    370   1.7  thorpej 
    371   1.7  thorpej 	/* First import/export element address */
    372   1.7  thorpej 	u_int8_t	fieea[2];
    373   1.7  thorpej 
    374   1.7  thorpej 	/* Number of import/export elements */
    375   1.7  thorpej 	u_int8_t	niee[2];
    376   1.7  thorpej 
    377   1.7  thorpej 	/* First data transfer element address */
    378   1.7  thorpej 	u_int8_t	fdtea[2];
    379   1.7  thorpej 
    380   1.7  thorpej 	/* Number of data trafer elements */
    381   1.7  thorpej 	u_int8_t	ndte[2];
    382   1.7  thorpej 
    383   1.7  thorpej 	u_int8_t	reserved[2];
    384   1.7  thorpej };
    385   1.7  thorpej 
    386   1.7  thorpej /*
    387   1.7  thorpej  * Transport geometry parameters page.
    388   1.7  thorpej  *
    389   1.7  thorpej  * Defines whether each medium transport element is a member of a set of
    390   1.7  thorpej  * elements that share a common robotics subsystem and whether the element
    391   1.7  thorpej  * is capable of media rotation.  One transport geometry descriptor is
    392   1.7  thorpej  * transferred for each medium transport element, beginning with the first
    393   1.7  thorpej  * medium transport element (other than the default transport element address
    394   1.7  thorpej  * of 0).
    395   1.7  thorpej  */
    396   1.7  thorpej struct page_transport_geometry_parameters {
    397   1.7  thorpej 	u_int8_t	pg_code;	/* page code (0x1e) */
    398   1.7  thorpej 	u_int8_t	pg_length;	/* page length; variable */
    399   1.7  thorpej 
    400   1.7  thorpej 	/* Transport geometry descriptor(s) are here. */
    401   1.7  thorpej 
    402   1.7  thorpej 	u_int8_t	misc;
    403   1.7  thorpej #define CAN_ROTATE	0x01
    404   1.7  thorpej 
    405   1.7  thorpej 	/* Member number in transport element set. */
    406   1.7  thorpej 	u_int8_t	member;
    407   1.1      cgd };
    408