/*
* 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);