+/*
+ * Copyright (c) 1998,1999,2000
+ * Traakan, Inc., Los Altos, CA
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Project: NDMJOB
+ * Ident: $Id: $
+ *
+ * Description:
+ *
+ */
+
+
+/*
+ * 17.1 Medium-changer device model
+ *
+ * Medium changer devices mechanize the movement of media to and from
+ * primary devices (such as disk or tape drives) and other locations
+ * within the range of the medium changer. The medium changer command set
+ * is based on a physical model of this functionality.
+ *
+ * This command set supports varied physical implementations of the medium
+ * changer function. Most of these variations are hidden from the
+ * initiator by the high level of function provided by the MOVE MEDIUM and
+ * EXCHANGE MEDIUM commands and by the generalized nature of the element
+ * addressing scheme. However, initiators may need to be aware of the
+ * capabilities of the particular medium changer device. These
+ * characteristics and capabilities are conveyed via MODE SENSE pages.
+ *
+ * 17.1.1 Medium-changer elements
+ *
+ * The medium-changer command set uses as its address space the set of
+ * physical locations and mechanisms within the scope of a medium changer
+ * device. The term element is used throughout this clause to refer to one
+ * member of the medium changer address space. Each element is a discrete
+ * physical entity that may hold zero or one physical unit of media - one
+ * disk cartridge, one spool of tape, etc. Element addresses do not extend
+ * across multiple physical units of media. Likewise, element addresses
+ * are independent of any logical partitioning that the primary device may
+ * support within a physical unit of media.
+ *
+ * A medium changer is viewed as a set of addressable elements, each of
+ * which may contain a unit of media or be used to move a unit of media.
+ * Each medium changer element has a unique 16 bit element address. Each
+ * element is an instance of one of four classes or element types.
+ *
+ * a) MEDIUM TRANSPORT ELEMENT
+ * b) STORAGE ELEMENT
+ * c) IMPORT EXPORT ELEMENT
+ * d) DATA TRANSFER ELEMENT
+ *
+ * Units of media (cartridges, cassettes, caddies, etc.) are referred to
+ * only indirectly by this device model. Units of media can be moved to
+ * or from any of the elements of the medium changer device. The presence
+ * of media at the various elements in a medium changer can be sensed. In
+ * order to ensure exclusive access to a unit of media, the element where
+ * the unit of media is located (the element address) must be reserved.
+ *
+ * Elements of the medium transport, import export and (rarely) data
+ * transport types may not provide independent storage for medium. The
+ * capabilities of a particular medium changer in this respect can be
+ * sensed via the device capabilities page of the mode sense data. The
+ * following hypothetical medium changer implementation illustrates one
+ * case of an element not providing independent storage for medium.
+ * Consider a medium changer which has a carousel style storage for
+ * medium. The import export function could be provided by a port which
+ * allows operator access to one of the storage elements. In such a
+ * device, the MOVE ELEMENT command from storage element to import export
+ * element would rotate the carousel to align the addressed storage
+ * element to the import export position. In this case the import export
+ * element does not provide independent storage but rather access to one
+ * of the storage elements.
+ *
+ * 17.1.1.1 Medium transport elements
+ *
+ * Medium transport elements address the functions of the medium changer
+ * device that perform the movement of units of media. Where a medium
+ * transport element can serve (even temporarily) as a storage location
+ * for medium, the location of each unit of media must have a separate
+ * element address.
+ *
+ * In larger medium changer devices, the medium movement functions may be
+ * performed by multiple independent robotics subsystems. Each of these
+ * may have a number of medium transport element addresses. The element
+ * addresses within each subsystem shall be contiguous. Any of the element
+ * addresses within a subsystem may be used interchangeably in the medium
+ * transport element address field of MOVE MEDIUM and EXCHANGE MEDIUM
+ * commands. An initiator may determine the capabilities of the medium
+ * movement facilities of a medium changer device via the transport
+ * geometry MODE SENSE page, see 17.3.3.3.
+ *
+ * Element address zero is reserved for use in the medium transport
+ * element address field of MOVE MEDIUM and EXCHANGE MEDIUM commands to
+ * direct the medium changer to use a default or medium changer selected
+ * medium transport element.
+ *
+ * In some implementations, medium transport elements may be source and/or
+ * destination addresses in MOVE MEDIUM and EXCHANGE MEDIUM commands.
+ * They may or may not provide independent storage of a unit of media.
+ * See the device capabilities MODE SENSE page, see 17.3.3.
+ *
+ * 17.1.1.2 Storage elements
+ *
+ * Storage elements are locations of units of media while not in some
+ * other element type. Medium in storage elements is available for access
+ * by medium transport elements.
+ *
+ * Storage elements may be source and/or destination addresses in MOVE
+ * MEDIUM and EXCHANGE MEDIUM commands.
+ *
+ * 17.1.1.3 Import export elements
+ *
+ * Import export elements are locations of units of media which are being
+ * inserted into or withdrawn from the medium changer device. Medium in
+ * these elements is accessible by both medium transport elements, by the
+ * operator, or by another independent medium changer device.
+ *
+ * Import export elements may be source and/or destination addresses in
+ * MOVE MEDIUM and EXCHANGE MEDIUM commands. They may or may not provide
+ * independent storage of a unit of media, see the device capabilities
+ * MODE SENSE page, see 17.3.3.
+ *
+ * Particular import export elements may be capable of either import
+ * actions, export actions, both or neither (if an element is not
+ * present).
+ *
+ * 17.1.1.4 Data transfer element
+ *
+ * Data transfer elements are locations of the primary devices which are
+ * capable of reading or writing the medium. Data transfer elements may
+ * also be viewed as medium changer element addresses of units of media
+ * loaded in or available for loading in or removal from primary devices
+ * such as disk or tape drives. Note that the medium changer function
+ * specified in this clause does not control the primary device. That is
+ * the responsibility of the system.
+ *
+ * Data transfer elements may be source and/or destination addresses in
+ * MOVE MEDIUM and EXCHANGE MEDIUM commands. They may or may not provide
+ * independent storage of a unit of media, see the device capabilities
+ * MODE SENSE page, see 17.3.3.
+ */
+
+/*
+ * Table 333 - Element type code
+ * +=============-===================================================+
+ * | Code | Description |
+ * |-------------+---------------------------------------------------|
+ * | 0h | All element types reported, (valid in CDB only) |
+ * | 1h | Medium transport element |
+ * | 2h | Storage element |
+ * | 3h | Import export element |
+ * | 4h | Data transfer element |
+ * | 5h - Fh | Reserved |
+ * +=================================================================+
+ */
+
+#define SMC_ELEM_TYPE_ALL 0
+#define SMC_ELEM_TYPE_MTE 1
+#define SMC_ELEM_TYPE_SE 2
+#define SMC_ELEM_TYPE_IEE 3
+#define SMC_ELEM_TYPE_DTE 4
+
+
+
+/*
+ * 17.1.5 Volume tags
+ *
+ * The read element status descriptor format for all element types
+ * includes two sets of fields that contain volume tag information. These
+ * optional fields are used to report media identification information
+ * that the medium changer has acquired either by reading an external
+ * label (e.g. bar code labels), by a SEND VOLUME TAG command or by other
+ * means which may be vendor unique. The same volume tag information shall
+ * be available to all initiators whether assigned by that initiator, by
+ * some other initiator or by the media changer itself.
+ *
+ * Volume tag information provides a means to confirm the identity of a
+ * unit of media that resides in a medium changer element. This command
+ * set does not define any direct addressing of units of media based on
+ * these fields. However, commands are defined that provide translation
+ * between volume tag information and the element address where that unit
+ * of media currently resides.
+ *
+ * The medium changer command set definition does not impose the
+ * requirement that volume tag information be unique over the units of
+ * media within the scope of the changer device.
+ *
+ * The following commands support the optional volume tag functionality:
+ * a) SEND VOLUME TAG - either as a translation request or to associate
+ * a volume tag with the unit of media currently residing at an
+ * element address.
+ * b) REQUEST VOLUME ELEMENT ADDRESS - return the element address
+ * currently associated with the volume tag information transferred
+ * with the last send volume tag command.
+ * c) READ ELEMENT STATUS - optionally reports volume tag information
+ * for all element types.
+ * d) MOVE MEDIUM and EXCHANGE MEDIUM commands - if volume tags are
+ * implemented, these commands must retain the association between
+ * volume tag information and units of media as they are moved from
+ * element to element.
+ *
+ * 17.1.5.1 Volume tag format
+ *
+ * Volume tag information consists of a volume identifier field of 32
+ * bytes plus a volume sequence number field of 2 bytes. The volume
+ * identifier shall consist of a left justified sequence of ASCII
+ * characters. Unused positions shall be blank (20h) filled. In order for
+ * the SEND VOLUME TAG translate with template to work the characters '*'
+ * and'?' (2Ah and 3Fh) must not appear in volume identification data and
+ * there must be no blanks (20h) within the significant part of the volume
+ * identifier. If volume tag information for a particular element is
+ * undefined, the volume identifier field shall be zero.
+ *
+ * The volume sequence number is a 2 byte integer field. If the volume
+ * sequence number is not used this field shall be zero. The volume tag
+ * contents are independent of the volume identification information
+ * recorded on the media.
+ *
+ * NOTE 199 For compatibility with the volume identifier defined by volume
+ * and file structure standards, it is recommended that the characters in the
+ * significant non-blank portion of the volume identifier field be restricted
+ * to the set: '0'..'9', 'A'..'Z', and '_' (30h .. 39h, 41h .. 5Ah, 5Fh).
+ * Specific systems may have differing requirements that may take precedence
+ * over this recommendation.
+ *
+ * Table 326 defines the fields within the 36 byte primary and alternate
+ * volume tag information fields found in READ ELEMENT STATUS descriptors
+ * and in the data format for the SEND VOLUME TAG command.
+ *
+ * Table 326 - Volume tag information format
+ * +=====-=======-=======-=======-========-========-========-=======-========+
+ * | Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+ * |Byte | | | | | | | | |
+ * |=====+===================================================================|
+ * | 0 | |
+ * |- - -+--- Volume identification field ---|
+ * | 31 | |
+ * |-----+-------------------------------------------------------------------|
+ * | 32 | |
+ * |- - -+--- Reserved ---|
+ * | 33 | |
+ * |-----+-------------------------------------------------------------------|
+ * | 34 | (MSB) |
+ * |-----+--- Volume sequence number ---|
+ * | 35 | (LSB) |
+ * +=========================================================================+
+ *
+ *
+ * 17.1.5.2 Primary and alternate volume tag information
+ *
+ * Element status descriptors as reported by the READ ELEMENT STATUS
+ * command define a primary volume tag and an alternate volume tag.
+ * Alternate volume tag information provides a means for a system to use
+ * different volume identification information for each side of double
+ * sided media. In such a system, the primary volume tag information
+ * refers to the logical medium accessible via a MOVE MEDIUM command
+ * without the invert bit set. The alternate volume tag information refers
+ * to the other side of the media, i.e. the side that would be accessed
+ * via a MOVE MEDIUM command with the invert bit set.
+ */
+
+#define SMC_VOL_TAG_LEN 36
+
+struct smc_raw_volume_tag {
+ unsigned char volume_id[32];
+ unsigned char resv32[2];
+ unsigned char volume_seq[2];
+};
+
+
+
+
+/*
+ * 17.1.4 Element status maintenance requirements
+ *
+ * If the medium changer device chooses to implement the READ ELEMENT
+ * STATUS command, the medium changer device must be capable of reporting
+ * the various data (i.e. full, error, etc.) required by each page type.
+ * The medium changer may maintain this information at all times or
+ * regenerate it in response to the READ ELEMENT STATUS command. The
+ * INITIALIZE ELEMENT STATUS command can be used to force regeneration of
+ * this information.
+ */
+
+/*
+ * 17.2.5 READ ELEMENT STATUS command
+ *
+ * The READ ELEMENT STATUS command (see table 332) requests that the
+ * target report the status of its internal elements to the initiator.
+ *
+ * Table 332 - READ ELEMENT STATUS command
+ * +====-=======-========-========-========-========-========-========-=======+
+ * | Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+ * |Byte| | | | | | | | |
+ * |====+=====================================================================|
+ * | 0 | Operation code (B8h) |
+ * |----+---------------------------------------------------------------------|
+ * | 1 |Logical unit number | VolTag | Element type code |
+ * |----+---------------------------------------------------------------------|
+ * | 2 |(MSB) |
+ * |----+-- Starting element address --|
+ * | 3 | (LSB)|
+ * |----+---------------------------------------------------------------------|
+ * | 4 |(MSB) |
+ * |----+-- Number of elements --|
+ * | 5 | (LSB)|
+ * |----+---------------------------------------------------------------------|
+ * | 6 | Reserved |
+ * |----+---------------------------------------------------------------------|
+ * | 7 |(MSB) |
+ * |----+-- --|
+ * | 8 | Allocation length |
+ * |----+-- --|
+ * | 9 | (LSB)|
+ * |----+---------------------------------------------------------------------|
+ * |10 | Reserved |
+ * |----+---------------------------------------------------------------------|
+ * |11 | Control |
+ * +==========================================================================+
+ *
+ *
+ * A volume tag (VolTag) bit of one indicates that the target shall report
+ * volume tag information if this feature is supported. A value of zero
+ * indicates that volume tag information shall not be reported. If the
+ * volume tag feature is not supported this field shall be treated as
+ * reserved.
+ *
+ * The element type code field specifies the particular element type(s)
+ * selected for reporting by this command. A value of zero specifies that
+ * status for all element types shall be reported. The element type codes
+ * are defined in table 333.
+ *
+ * Table 333 - Element type code
+ * (SEE ABOVE)
+ *
+ * The starting element address specifies the minimum element address to
+ * report. Only elements with an element type code permitted by the
+ * element type code specification, and an element address greater than or
+ * equal to the starting element address shall be reported. Element
+ * descriptor blocks are not generated for undefined element addresses.
+ *
+ * The number of elements specifies the maximum number of element
+ * descriptors to be created by the target for this command. The value
+ * specified by this field is not the range of element addresses to be
+ * considered for reporting but rather the number of defined elements to
+ * report. If the allocation length is not sufficient to transfer all the
+ * element descriptors, the target shall transfer all those descriptors
+ * that can be completely transferred and this shall not be considered an
+ * error.
+ *
+ * 17.2.5.1 Element status data
+ *
+ * The data returned by the READ ELEMENT STATUS command is defined in
+ * table 334 and 17.2.5.3 through 17.2.5.6. Element status data consists
+ * of an eight-byte header, (see table 334) followed by one or more
+ * element status pages.
+ *
+ * Table 334 - Element status data
+ * +====-=======-========-========-========-========-========-========-=======+
+ * | Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+ * |Byte| | | | | | | | |
+ * |====+=====================================================================|
+ * | 0 |(MSB) |
+ * |----+-- First element address reported --|
+ * | 1 | (LSB)|
+ * |----+---------------------------------------------------------------------|
+ * | 2 |(MSB) |
+ * |----+-- Number of elements available --|
+ * | 3 | (LSB)|
+ * |----+---------------------------------------------------------------------|
+ * | 4 | Reserved |
+ * |----+---------------------------------------------------------------------|
+ * | 5 |(MSB) |
+ * |----+-- --|
+ * | 6 | Byte count of report available |
+ * |----+-- (all pages, n - 7 ) --|
+ * | 7 | (LSB)|
+ * |====+=====================================================================|
+ * | 8 | |
+ * |- - +-- Element status page(s) --|
+ * | n | |
+ * +==========================================================================+
+ *
+ *
+ * The first element address reported field indicates the element address
+ * of the element with the smallest element address found to meet the CDB
+ * request.
+ *
+ * The number of elements available field indicates the number of elements
+ * meeting the request in the command descriptor block. The status for
+ * these elements is returned if sufficient allocation length was
+ * specified.
+ *
+ * The byte count of report available field indicates the number of bytes
+ * of element status page data available for all elements meeting the
+ * request in the command descriptor block. This value shall not be
+ * adjusted to match the allocation length available.
+ *
+ * NOTE 202 - The READ ELEMENT STATUS command can be issued with an
+ * allocation length of eight bytes in order to determine the allocation
+ * length required to transfer all the element status data specified by the
+ * command.
+ *
+ * Figure 28 provides an illustration of the element status data
+ * structure.
+ *
+ * Figure 28 - Illustration of element status data structure
+ *
+ *
+ * 17.2.5.2 Element status page
+ *
+ * The element status page is defined in table 335. Each element status
+ * page includes an eight-byte header followed by one or more element
+ * descriptor blocks. The header includes the element type code, the
+ * length of each descriptor block and the number of bytes of element
+ * descriptor information that follow the header for this element type.
+ *
+ * Table 335 - Element status page
+ * +====-=======-========-========-========-========-========-========-=======+
+ * | Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+ * |Byte| | | | | | | | |
+ * |====+=====================================================================|
+ * | 0 | Element type code |
+ * |----+---------------------------------------------------------------------|
+ * | 1 |PVolTag| AVolTag| Reserved |
+ * |----+---------------------------------------------------------------------|
+ * | 2 |(MSB) |
+ * |----+-- Element descriptor length --|
+ * | 3 | (LSB)|
+ * |----+---------------------------------------------------------------------|
+ * | 4 | Reserved |
+ * |----+---------------------------------------------------------------------|
+ * | 5 |(MSB) |
+ * |----+-- --|
+ * | 6 | Byte count of descriptor data available |
+ * |----+-- (this page, n - 7) --|
+ * | 7 | (LSB)|
+ * |====+=====================================================================|
+ * | 8 | |
+ * |- - +-- Element descriptor(s) --|
+ * | n | |
+ * +==========================================================================+
+ *
+ *
+ * The element type code field indicates the element type reported by this
+ * page.
+ *
+ * A primary volume tag (PVolTag) bit of one indicates that the primary
+ * volume tag information field is present in each of the following
+ * element descriptor blocks. A value of zero indicates that these bytes
+ * are omitted from the element descriptors that follow.
+ *
+ * An alternate volume tag (AVolTag) bit of one indicates that the
+ * alternate volume tag information field is present in each of the
+ * following element descriptor blocks. A value of zero indicates that
+ * these bytes are omitted from the element descriptors that follow.
+ *
+ * The element descriptor length field indicates the number of bytes in
+ * each element descriptor.
+ *
+ * The byte count of descriptor data available field indicates the number
+ * of bytes of element descriptor data available for elements of this
+ * element type meeting the request in the CDB. This value shall not be
+ * adjusted to match the allocation length available.
+ *
+ * Each element descriptor includes the element address and status flags;
+ * it may also contain sense code information as well as other information
+ * depending on the element type (see 17.2.5.3 through 17.2.5.6).
+ *
+ * 17.2.5.3 Medium transport element descriptor
+ *
+ * Table 336 defines the medium transport element descriptor.
+ *
+ * Table 336 - Medium transport element descriptor
+ * +====-======-========-========-========-========-========-========-=======+
+ * | Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+ * |Byte| | | | | | | | |
+ * |====+====================================================================|
+ * | 0 |(MSB) |
+ * |----+-- Element address --|
+ * | 1 | (LSB)|
+ * |----+--------------------------------------------------------------------|
+ * | 2 | Reserved | Except |Reserved| Full |
+ * |----+--------------------------------------------------------------------|
+ * | 3 | Reserved |
+ * |----+--------------------------------------------------------------------|
+ * | 4 | Additional sense code |
+ * |----+--------------------------------------------------------------------|
+ * | 5 | Additional sense code qualifier |
+ * |----+--------------------------------------------------------------------|
+ * | 6 | |
+ * | - -+-- Reserved --|
+ * | 8 | |
+ * |----+--------------------------------------------------------------------|
+ * | 9 |SValid| Invert | Reserved |
+ * |----+--------------------------------------------------------------------|
+ * |10 |(MSB) |
+ * |----+-- Source storage element address --|
+ * |11 | (LSB) |
+ * |----+--------------------------------------------------------------------|
+ * |12 | |
+ * | - -+-- Primary volume tag information --|
+ * |47 | (Field omitted if PVolTag = 0) |
+ * |----+--------------------------------------------------------------------|
+ * |48 | |
+ * | - -+-- Alternate volume tag information --|
+ * |83 | (Field omitted if AVolTag = 0) |
+ * |----+--------------------------------------------------------------------|
+ * |84 | |
+ * | - -+-- Reserved --|
+ * |87 | (Field moved up if volume tag information field(s) are omitted.) |
+ * |----+--------------------------------------------------------------------|
+ * |88 | |
+ * | - -+-- Vendor-specific --|
+ * |z-1 | (Field moved up if volume tag information field(s) are omitted.) |
+ * +=========================================================================+
+ *
+ *
+ * The element address field gives the address of the medium changer
+ * element whose status is reported by this element descriptor block.
+ *
+ * An exception (Except) bit of one indicates the element is in an
+ * abnormal state. An exception bit of zero indicates the element is in a
+ * normal state. If this bit is one, information on the abnormal state
+ * may be available in the additional sense code and additional sense code
+ * qualifier bytes.
+ *
+ * A full bit value of one indicates that the element contains a unit of
+ * media. A value of zero indicates that the element does not contain a
+ * unit of media.
+ *
+ * The additional sense code field may provide specific information on an
+ * abnormal element state. The values in this field are as defined for
+ * the additional sense code of the REQUEST SENSE data (see 8.2.14.3).
+ *
+ * The additional sense code qualifier field may provide more detailed
+ * information on an abnormal element state. The values in this field are
+ * as defined for the additional sense code qualifier of the REQUEST SENSE
+ * data (see 8.2.14.4).
+ *
+ * A source valid (SValid) bit value of one indicates that the source
+ * storage element address field and the invert bit information are valid.
+ * A value of zero indicates that the values in these fields are not
+ * valid.
+ *
+ * An invert bit value of one indicates that the unit of media now in this
+ * element was inverted by MOVE MEDIUM or EXCHANGE MEDIUM operations since
+ * it was last in the source storage element. A value of zero indicates
+ * that no inversion occurred during the operation.
+ *
+ * The source storage element address field provides the address of the
+ * last storage element this unit of media was moved. This field is valid
+ * only if the SValid bit is one.
+ *
+ * The primary and alternate volume tag information fields provide for
+ * identifying the unit of media residing in this element (see 17.1.5.).
+ * Either or both of these fields may be omitted for all the element
+ * descriptor blocks that comprise an element status page as indicated by
+ * the PVolTag and AVolTag bits in the element status page header.
+ *
+ * 17.2.5.4 Storage element descriptor
+ *
+ * Table 337 defines the storage element descriptor.
+ *
+ * Table 337 - Storage element descriptor
+ * +=====-======-========-========-========-========-========-========-=======+
+ * | Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+ * |Byte| | | | | | | | |
+ * |====+====================================================================|
+ * | 0 |(MSB) |
+ * |----+-- Element address --|
+ * | 1 | (LSB)|
+ * |----+--------------------------------------------------------------------|
+ * | 2 | Reserved | Access | Except |Reserved| Full |
+ * |----+--------------------------------------------------------------------|
+ * | 3 | Reserved |
+ * |----+--------------------------------------------------------------------|
+ * | 4 | Additional sense code |
+ * |----+--------------------------------------------------------------------|
+ * | 5 | Additional sense code qualifier |
+ * |----+--------------------------------------------------------------------|
+ * | 6 | |
+ * | - -+-- Reserved --|
+ * | 8 | |
+ * |----+--------------------------------------------------------------------|
+ * | 9 |SValid| Invert | Reserved |
+ * |----+--------------------------------------------------------------------|
+ * |10 |(MSB) |
+ * |----+-- Source element address --|
+ * |11 | (LSB) |
+ * |----+--------------------------------------------------------------------|
+ * |12 | |
+ * | - -+-- Primary volume tag information --|
+ * |47 | (Field omitted if PVolTag = 0) |
+ * |----+--------------------------------------------------------------------|
+ * |48 | |
+ * | - -+-- Alternate volume tag information --|
+ * |83 | (Field omitted if PVolTag = 0) |
+ * |----+--------------------------------------------------------------------|
+ * |84 | |
+ * | - -+-- Reserved --|
+ * |87 | (Field moved up if volume tag information field(s) are omitted.) |
+ * |----+--------------------------------------------------------------------|
+ * |88 | |
+ * | - -+-- Vendor unique --|
+ * |z-1 | (Field moved up if volume tag information field(s) are omitted.) |
+ * +=========================================================================+
+ *
+ *
+ * An access bit value of one indicates that access to the element by a
+ * medium transport element is allowed. An access bit of zero indicates
+ * that access to the element by the medium transport element is denied.
+ *
+ * The source storage element address field provides the address of the
+ * last storage element this unit of media was moved from. This element
+ * address value may or may not be the same as this element. This field is
+ * valid only if the SValid bit is one.
+ *
+ * For fields not defined in this subclause, see 17.2.5.3.
+ *
+ * 17.2.5.5 Import export element descriptor
+ *
+ * Table 338 defines the import export element descriptor.
+ *
+ * Table 338 - Import export element descriptor
+ * +====-======-========-========-========-========-========-========-=======+
+ * | Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+ * |Byte| | | | | | | | |
+ * |====+====================================================================|
+ * | 0 |(MSB) |
+ * |----+-- Element address --|
+ * | 1 | (LSB)|
+ * |----+--------------------------------------------------------------------|
+ * | 2 | Reserved | InEnab | ExEnab | Access | Except | ImpExp | Full |
+ * |----+--------------------------------------------------------------------|
+ * | 3 | Reserved |
+ * |----+--------------------------------------------------------------------|
+ * | 4 | Additional sense code |
+ * |----+--------------------------------------------------------------------|
+ * | 5 | Additional sense code qualifier |
+ * |----+--------------------------------------------------------------------|
+ * | 6 | |
+ * |----+-- Reserved --|
+ * | 8 | |
+ * |----+--------------------------------------------------------------------|
+ * | 9 |SValid| Invert | Reserved |
+ * |----+--------------------------------------------------------------------|
+ * |10 |(MSB) |
+ * |----+-- Source storage element address --|
+ * |11 | (LSB) |
+ * |----+--------------------------------------------------------------------|
+ * |12 | |
+ * | - -+-- Primary volume tag information --|
+ * |47 | (Field omitted if PVolTag = 0) |
+ * |----+--------------------------------------------------------------------|
+ * |48 | |
+ * | - -+-- Alternate volume tag information --|
+ * |83 | (Field omitted if PVolTag = 0) |
+ * |----+--------------------------------------------------------------------|
+ * |84 | |
+ * | - -+-- Reserved --|
+ * |87 | (Field moved up if volume tag information field(s) are omitted.) |
+ * |----+--------------------------------------------------------------------|
+ * |88 | |
+ * | - -+-- Vendor unique --|
+ * |z-1 | (Field moved up if volume tag information field(s) are omitted.) |
+ * +=========================================================================+
+ *
+ *
+ * An import enable (InEnab) bit of one indicates that the import export
+ * element supports movement of media into the scope of the medium changer
+ * device. An InEnab bit of zero indicates that this element does not
+ * support import actions.
+ *
+ * An export enable (ExEnab) bit of one indicates that the import export
+ * element supports movement of media out of the scope of the medium
+ * changer device. An ExEnab bit of zero indicates that this element does
+ * not support export actions.
+ *
+ * An access bit of one indicates that access to the import export element
+ * by a medium transport element is allowed. An access bit of zero
+ * indicates access to the import export element by medium transport
+ * elements is denied.
+ *
+ * NOTE 203 An example of when access would be denied is when the operator
+ * has exclusive access to the import export element.
+ *
+ * An import export (ImpExp) bit of one indicates the unit of media in the
+ * import export element was placed there by an operator. An ImpExp bit
+ * of zero indicates the unit of media in the import export element was
+ * placed there by the medium transport element.
+ *
+ * For fields not defined in this clause, see 17.2.5.3.
+ *
+ * 17.2.5.6 Data transfer element descriptor
+ *
+ * Table 339 defines the data transfer element descriptor.
+ *
+ * Table 339 - Data transfer element descriptor
+ * +====-=======-========-========-========-========-========-========-=======+
+ * | Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+ * |Byte| | | | | | | | |
+ * |====+=====================================================================|
+ * | 0 |(MSB) |
+ * |----+-- Element address --|
+ * | 1 | (LSB)|
+ * |----+---------------------------------------------------------------------|
+ * | 2 | Reserved | Access | Except |Reserved| Full |
+ * |----+---------------------------------------------------------------------|
+ * | 3 | Reserved |
+ * |----+---------------------------------------------------------------------|
+ * | 4 | Additional sense code |
+ * |----+---------------------------------------------------------------------|
+ * | 5 | Additional sense code qualifier |
+ * |----+---------------------------------------------------------------------|
+ * | 6 Not bus|Reserved|ID valid|LU valid|Reserved| Logical unit number |
+ * |----+---------------------------------------------------------------------|
+ * | 7 | SCSI bus address |
+ * |----+---------------------------------------------------------------------|
+ * | 8 | Reserved |
+ * |----+---------------------------------------------------------------------|
+ * | 9 |SValid | Invert | Reserved |
+ * |----+---------------------------------------------------------------------|
+ * |10 |(MSB) |
+ * |----+-- Source storage element address --|
+ * |11 | (LSB) |
+ * |----+---------------------------------------------------------------------|
+ * |12 | |
+ * | - -+-- Primary volume tag information --|
+ * |47 | (Field omitted if PVolTag = 0) |
+ * |----+---------------------------------------------------------------------|
+ * |48 | |
+ * | - -+-- Alternate volume tag information --|
+ * |83 | (Field omitted if PVolTag = 0) |
+ * |----+---------------------------------------------------------------------|
+ * |84 | |
+ * | - -+-- Reserved --|
+ * |87 | (Field moved up if volume tag information field(s) are omitted.) |
+ * |----+---------------------------------------------------------------------|
+ * |88 | |
+ * | - -+-- Vendor unique --|
+ * |z-1 | (Field moved up if volume tag information field(s) are omitted.) |
+ * +==========================================================================+
+ *
+ *
+ * An access bit value of one indicates access to the data transfer
+ * element by the medium transport element is allowed. A value of zero
+ * indicates access to the data transfer element by a medium transport
+ * element is denied.
+ *
+ * NOTE 204 Access to the data transfer element by medium transport elements
+ * might be denied if a data transfer operation was under way. Note that a
+ * one value in this bit may not be sufficient to ensure a successful
+ * operation. This bit can only reflect the best information available to the
+ * medium changer device, which may not accurately reflect the state of the
+ * primary (data transfer) device.
+ *
+ * A not this bus (not bus) bit value of one indicates that the SCSI bus
+ * address and logical unit number values are not valid for the SCSI bus
+ * used to select the medium changer device. A not bus bit value of zero
+ * indicates that the SCSI address and logical unit values, if valid, are
+ * on the same bus as the medium changer device.
+ *
+ * An ID Valid bit value of one indicates that the SCSI bus address field
+ * contains valid information. An LU Valid bit value of one indicates that
+ * the logical unit number field contains valid information.
+ *
+ * The SCSI bus address field, if valid, provides the SCSI address (binary
+ * representation) of the primary device served by the medium changer at
+ * this element address.
+ *
+ * The logical unit number field, if valid, provides the logical unit
+ * number within the SCSI bus device of the primary device served by the
+ * medium changer at this element address.
+ *
+ * For fields not defined in this clause, see 17.2.5.3.
+ */
+
+struct smc_raw_element_status_data_header {
+ unsigned char first_elem[2];
+ unsigned char n_elem[2];
+ unsigned char resv4;
+ unsigned char byte_count[3];
+};
+
+struct smc_raw_element_status_page_header {
+ unsigned char element_type;
+ unsigned char flag1;
+#define SMC_RAW_ESP_F1_PVolTag 0x80
+#define SMC_RAW_ESP_F1_AVolTag 0x40
+ unsigned char elem_desc_len[2];
+ unsigned char resv4;
+ unsigned char byte_count[3];
+};
+
+struct smc_raw_element_descriptor {
+ unsigned char element_address[2];
+ unsigned char flags2;
+#define SMC_RAW_ED_F2_Full 0x01
+#define SMC_RAW_ED_F2_ImpExp 0x02
+#define SMC_RAW_ED_F2_Except 0x04
+#define SMC_RAW_ED_F2_Access 0x08
+#define SMC_RAW_ED_F2_ExEnab 0x10
+#define SMC_RAW_ED_F2_InEnab 0x20
+
+ unsigned char resv3;
+ unsigned char asc;
+ unsigned char ascq;
+ unsigned char flags6;
+#define SMC_RAW_ED_F6_LUN 0x07
+#define SMC_RAW_ED_F6_LU_valid 0x10
+#define SMC_RAW_ED_F6_ID_valid 0x20
+#define SMC_RAW_ED_F6_Not_bus 0x80
+
+ unsigned char scsi_sid;
+
+ unsigned char resv8;
+
+ unsigned char flags9;
+#define SMC_RAW_ED_F9_Invert 0x40
+#define SMC_RAW_ED_F9_SValid 0x80
+
+ unsigned char src_se_addr[2];
+
+ struct smc_raw_volume_tag primary_vol_tag;
+ struct smc_raw_volume_tag alternate_vol_tag;
+
+ unsigned char resv84[4];
+ unsigned char vendor_specific[4];
+};
+
+
+/*
+ * 17.3.3.2 Element address assignment page
+ *
+ * The element address assignment page (see table 352) is used to assign
+ * addresses to the elements of the medium changer (MODE SELECT) and to
+ * report those assignments (MODE SENSE). This page also defines the
+ * number of each type of element present.
+ *
+ * Table 352 - Element address assignment page
+ * +====-=======-========-========-========-========-========-========-=======+
+ * | Bit| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+ * |Byte| | | | | | | | |
+ * |====+=======+========+====================================================|
+ * | 0 | PS |Reserved| Page code (1Dh) |
+ * |----+---------------------------------------------------------------------|
+ * | 1 | Parameter length (12h) |
+ * |----+---------------------------------------------------------------------|
+ * | 2 |(MSB) |
+ * |----+-- Medium transport element address --|
+ * | 3 | (LSB)|
+ * |----+---------------------------------------------------------------------|
+ * | 4 |(MSB) |
+ * |----+-- Number of medium transport elements --|
+ * | 5 | (LSB)|
+ * |----+---------------------------------------------------------------------|
+ * | 6 |(MSB) |
+ * |----+-- First storage element address --|
+ * | 7 | (LSB)|
+ * |----+---------------------------------------------------------------------|
+ * | 8 |(MSB) |
+ * |----+-- Number of storage elements --|
+ * | 9 | (LSB)|
+ * |----+---------------------------------------------------------------------|
+ * | 10 |(MSB) |
+ * |----+-- First import export element address --|
+ * | 11 | (LSB)|
+ * |----+---------------------------------------------------------------------|
+ * | 12 |(MSB) |
+ * |----+-- Number of import export elements --|
+ * | 13 | (LSB)|
+ * |----+---------------------------------------------------------------------|
+ * | 14 |(MSB) |
+ * |----+-- First data transfer element address --|
+ * | 15 | (LSB)|
+ * |----+---------------------------------------------------------------------|
+ * | 16 |(MSB) |
+ * |----+-- Number of data transfer elements --|
+ * | 17 | (LSB)|
+ * |----+---------------------------------------------------------------------|
+ * | 18 | |
+ * |----+-- Reserved --|
+ * | 19 | |
+ * +==========================================================================+
+ *
+ *
+ * The parameters savable (PS) bit is only used with the MODE SENSE
+ * command. This bit is reserved with the MODE SELECT command. A PS bit
+ * of one indicates that the target is capable of saving the page in a
+ * non-volatile vendor-specific location.
+ *
+ * The first medium transport element address field identifies the first
+ * medium transport element contained in the medium changer (other than
+ * the default medium transport address of zero). The number of medium
+ * transport elements field defines the total number of medium transport
+ * elements contained in the medium changer. If the number of medium
+ * transport elements field in a MODE SELECT command is greater than the
+ * default value returned in the MODE SENSE parameter data, the target
+ * shall return CHECK CONDITION status and set the sense key to ILLEGAL
+ * REQUEST.
+ *
+ * The first storage element address field identifies the first medium
+ * storage element contained in the medium changer. The number of storage
+ * elements field defines the total number of medium storage elements
+ * contained in the medium changer. If the number of medium storage
+ * elements field in a MODE SELECT command is greater than the default
+ * value returned in the MODE SENSE parameter data, the target shall
+ * return CHECK CONDITION status and set the sense key to ILLEGAL REQUEST.
+ *
+ * The first import export element address field identifies the first
+ * medium portal that is accessible both by the medium transport devices
+ * and also by an operator from outside the medium changer. The number of
+ * import export elements field defines the total number of import export
+ * elements contained in the medium changer and accessible to the medium
+ * transport elements. If the number of import export elements field in a
+ * MODE SELECT command is greater than the default value returned in the
+ * MODE SENSE parameter data, the target shall return CHECK CONDITION
+ * status and set the sense key to ILLEGAL REQUEST .
+ *
+ * NOTE 207 The number of import export elements may be zero.
+ *
+ * The first data transfer element address field identifies the first data
+ * transfer element contained in the medium changer. The data transfer
+ * elements may be either read/write or read-only devices. The number of
+ * data transfer field defines the total number of data transfer elements
+ * contained within the medium changer and accessible to the medium
+ * transport elements. If the number of data transfer elements field in a
+ * MODE SELECT command is greater than the default value returned in the
+ * MODE SENSE parameter data, the target shall return CHECK CONDITION
+ * status and set the sense key to ILLEGAL REQUEST .
+ *
+ * Each element in the medium changer must have a unique address. If the
+ * address ranges defined for any of the element types overlap, the target
+ * shall return CHECK CONDITION status and set the sense key to ILLEGAL
+ * REQUEST.
+ */
+
+struct smc_raw_element_address_assignment_page {
+ unsigned char page_code; /* 0x1D */
+#define SMC_RAW_EA_PC_PS 0x80
+ unsigned char param_length; /* 0x12 */
+ unsigned char mte_addr[2];
+ unsigned char mte_count[2];
+ unsigned char se_addr[2];
+ unsigned char se_count[2];
+ unsigned char iee_addr[2];
+ unsigned char iee_count[2];
+ unsigned char dte_addr[2];
+ unsigned char dte_count[2];
+ unsigned char resv18[2];
+};
+
+
+
+
+#define SMC_GET2(VEC) \
+ (unsigned short) \
+ ( (((unsigned char)(VEC)[0] << 8)) \
+ + (((unsigned char)(VEC)[1])))
+
+#define SMC_PUT2(VEC,VAL) \
+ ((VEC)[0] = (unsigned char)((VAL)>>8), \
+ (VEC)[1] = (unsigned char)((VAL)))
+
+#define SMC_GET3(VEC) \
+ (unsigned long) \
+ ( (((unsigned char)(VEC)[0] << 16)) \
+ + (((unsigned char)(VEC)[1] << 8)) \
+ + ((unsigned char)(VEC)[2]))
+
+#define SMC_PUT3(VEC,VAL) \
+ ((VEC)[0] = (unsigned char)((VAL)>>16), \
+ (VEC)[1] = (unsigned char)((VAL)>>8), \
+ (VEC)[2] = (unsigned char)((VAL)))
+
+#define SMC_GET4(VEC) \
+ (unsigned long) \
+ ( (((unsigned char)(VEC)[0] << 24)) \
+ + (((unsigned char)(VEC)[1] << 16)) \
+ + (((unsigned char)(VEC)[2] << 8)) \
+ + ((unsigned char)(VEC)[3]))
+
+#define SMC_PUT4(VEC,VAL) \
+ ((VEC)[0] = (unsigned char)((VAL)>>24), \
+ (VEC)[1] = (unsigned char)((VAL)>>16), \
+ (VEC)[2] = (unsigned char)((VAL)>>8), \
+ (VEC)[3] = (unsigned char)((VAL)))