/
smc.h
180 lines (137 loc) · 5.23 KB
/
smc.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
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);