Merge branch 'master' into squeeze
[debian/amanda] / ndmp-src / smc.h
diff --git a/ndmp-src/smc.h b/ndmp-src/smc.h
new file mode 100644 (file)
index 0000000..a6c0d03
--- /dev/null
@@ -0,0 +1,180 @@
+/*
+ * 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);