--- /dev/null
+/*
+ * 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:
+ *
+ */
+
+
+#define SMC_MAX_SENSE_DATA 127
+
+/* carefully layed out so that 16-byte/line hex dumps look nice */
+struct smc_scsi_req {
+ unsigned char completion_status;
+ unsigned char status_byte;
+ unsigned char data_dir;
+ unsigned char n_cmd;
+
+ unsigned char cmd[12];
+
+ unsigned char * data;
+ unsigned n_data_avail;
+ unsigned n_data_done;
+ unsigned long _pad;
+
+ unsigned char n_sense_data;
+ unsigned char sense_data[SMC_MAX_SENSE_DATA];
+};
+
+#define SMCSR_CS_GOOD 0
+#define SMCSR_CS_FAIL 1
+/* more? */
+
+#define SMCSR_DD_NONE 0
+#define SMCSR_DD_IN 1 /* adapter->app */
+#define SMCSR_DD_OUT 2 /* app->adapter */
+
+
+
+struct smc_volume_tag {
+ unsigned char volume_id[32];
+ unsigned short volume_seq;
+};
+
+
+
+struct smc_element_address_assignment {
+ unsigned mte_addr; /* media transport element */
+ unsigned mte_count;
+
+ unsigned se_addr; /* storage element */
+ unsigned se_count;
+
+ unsigned iee_addr; /* import/export element */
+ unsigned iee_count;
+
+ unsigned dte_addr; /* data transfer element */
+ unsigned dte_count;
+};
+
+
+#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
+
+struct smc_element_descriptor {
+ unsigned char element_type_code;
+ unsigned short element_address;
+
+ /* Flags, use SCSI spec names for convenience */
+ unsigned PVolTag : 1; /* MSID primary vol tag info present */
+ unsigned AVolTag : 1; /* MSID alternate vol tag present */
+ unsigned InEnab : 1; /* --I- supports import */
+ unsigned ExEnab : 1; /* --I- supports export */
+ unsigned Access : 1; /* -SID access by a MTE allowed */
+ unsigned Except : 1; /* MSID element in abnormal state */
+ unsigned ImpExp : 1; /* --I- placed by operator */
+ unsigned Full : 1; /* MSID contains a unit of media */
+ unsigned Not_bus : 1; /* ---D if ID_valid, not same bus */
+ unsigned ID_valid: 1; /* ---D scsi_sid valid */
+ unsigned LU_valid: 1; /* ---D scsi_lun valid */
+ unsigned SValid : 1; /* MSID src_se_addr and Invert valid */
+ unsigned Invert : 1; /* MSID inverted by MOVE/EXCHANGE */
+
+ unsigned char asc; /* Additional sense code */
+ unsigned char ascq; /* Additional sense code qualifier */
+ unsigned short src_se_addr; /* if Svalid, last *STORAGE* element */
+
+ unsigned char scsi_sid; /* if ID_valid, SID of drive */
+ unsigned char scsi_lun; /* if LU_valid, LUN of drive */
+
+ struct smc_volume_tag primary_vol_tag; /* if PVolTag */
+ struct smc_volume_tag alternate_vol_tag;/* if AVolTag */
+};
+
+
+
+#ifndef SMC_MAX_ELEMENT
+#define SMC_MAX_ELEMENT 80
+#endif
+
+struct smc_ctrl_block {
+ unsigned char ident[32];
+
+ unsigned char valid_elem_aa;
+ unsigned char valid_elem_desc;
+
+ struct smc_element_address_assignment
+ elem_aa;
+
+ struct smc_element_descriptor
+ elem_desc[SMC_MAX_ELEMENT];
+ unsigned n_elem_desc;
+
+ struct smc_scsi_req scsi_req;
+
+ int (*issue_scsi_req)(struct smc_ctrl_block *smc);
+ void * app_data;
+
+ int dont_ask_for_voltags;
+
+ char errmsg[64];
+};
+
+
+extern int smc_inquire (struct smc_ctrl_block *smc);
+extern int smc_test_unit_ready (struct smc_ctrl_block *smc);
+extern int smc_get_elem_aa (struct smc_ctrl_block *smc);
+extern int smc_init_elem_status (struct smc_ctrl_block *smc);
+extern int smc_read_elem_status (struct smc_ctrl_block *smc);
+
+extern int smc_move (struct smc_ctrl_block *smc,
+ unsigned from_addr, unsigned to_addr, int invert,
+ unsigned chs_addr);
+extern int smc_position (struct smc_ctrl_block *smc,
+ unsigned to_addr, int invert);
+
+extern int smc_handy_move_to_drive (struct smc_ctrl_block *smc,
+ unsigned from_se_ix);
+extern int smc_handy_move_from_drive (struct smc_ctrl_block *smc,
+ unsigned to_se_ix);
+
+extern char * smc_elem_type_code_to_str(int code);
+
+extern int smc_pp_element_address_assignments (
+ struct smc_element_address_assignment *eaa,
+ int lineno, char *buf);
+
+extern int smc_pp_element_descriptor (struct smc_element_descriptor *edp,
+ int lineno, char *ret_buf);