summaryrefslogtreecommitdiffstats
path: root/sys/cam/scsi/scsi_enc.h
blob: 1a97292d33a081e67f0301c2d100ab043b3f9c03 (plain)
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
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
/* $FreeBSD$ */
/*-
 * Copyright (c) 2000 by Matthew Jacob
 * 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, this list of conditions, and the following disclaimer,
 *    without modification, immediately at the beginning of the file.
 * 2. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 *
 * Alternatively, this software may be distributed under the terms of the
 * the GNU Public License ("GPL").
 *
 * 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.
 *
 */
#ifndef	_SCSI_ENC_H_
#define	_SCSI_ENC_H_

#include <cam/scsi/scsi_ses.h>

#define	ENCIOC			('s' - 040)
#define	ENCIOC_GETNELM		_IO(ENCIOC, 1)
#define	ENCIOC_GETELMMAP	_IO(ENCIOC, 2)
#define	ENCIOC_GETENCSTAT	_IO(ENCIOC, 3)
#define	ENCIOC_SETENCSTAT	_IO(ENCIOC, 4)
#define	ENCIOC_GETELMSTAT	_IO(ENCIOC, 5)
#define	ENCIOC_SETELMSTAT	_IO(ENCIOC, 6)
#define	ENCIOC_GETTEXT		_IO(ENCIOC, 7)
#define	ENCIOC_INIT		_IO(ENCIOC, 8)
#define	ENCIOC_GETELMDESC	_IO(ENCIOC, 9)
#define	ENCIOC_GETELMDEVNAMES	_IO(ENCIOC, 10)
#define	ENCIOC_GETSTRING	_IO(ENCIOC, 11)
#define	ENCIOC_SETSTRING	_IO(ENCIOC, 12)
#define	ENCIOC_GETENCNAME	_IO(ENCIOC, 13)
#define	ENCIOC_GETENCID		_IO(ENCIOC, 14)

/*
 * Platform Independent Definitions for enclosure devices.
 */
/*
 * SCSI Based Environmental Services Application Defines
 *
 * Based almost entirely on SCSI-3 ENC Revision 8A specification,
 * but slightly abstracted as the underlying device may in fact
 * be a SAF-TE or vendor unique device.
 */
/*
 * ENC Driver Operations:
 * (The defines themselves are platform and access method specific)
 *
 * ENCIOC_GETNELM
 * ENCIOC_GETELMMAP
 * ENCIOC_GETENCSTAT
 * ENCIOC_SETENCSTAT
 * ENCIOC_GETELMSTAT
 * ENCIOC_SETELMSTAT
 * ENCIOC_INIT
 *
 *
 * An application finds out how many elements an enclosure instance
 * is managing by performing a ENCIOC_GETNELM operation. It then
 * performs a ENCIOC_GETELMMAP to get the map that contains the
 * elment identifiers for all elements (see encioc_element_t below).
 * This information is static.
 * 
 * The application may perform ENCIOC_GETELMSTAT operations to retrieve
 * status on an element (see the enc_elm_status_t structure below),
 * ENCIOC_SETELMSTAT operations to set status for an element.
 *
 * Similarly, overall enclosure status me be fetched or set via
 * ENCIOC_GETENCSTAT or  ENCIOC_SETENCSTAT operations (see encioc_enc_status_t
 * below).
 *
 * Readers should note that there is nothing that requires either a set
 * or a clear operation to actually latch and do anything in the target.
 *
 * A ENCIOC_INIT operation causes the enclosure to be initialized.
 */

/* Element Types */
typedef enum {
	ELMTYP_UNSPECIFIED	= 0x00,
	ELMTYP_DEVICE		= 0x01,
	ELMTYP_POWER		= 0x02,
	ELMTYP_FAN		= 0x03,
	ELMTYP_THERM		= 0x04,
	ELMTYP_DOORLOCK		= 0x05,
	ELMTYP_ALARM		= 0x06,
	ELMTYP_ESCC		= 0x07,	/* Enclosure SCC */
	ELMTYP_SCC		= 0x08,	/* SCC */
	ELMTYP_NVRAM		= 0x09,
	ELMTYP_INV_OP_REASON    = 0x0a,
	ELMTYP_UPS		= 0x0b,
	ELMTYP_DISPLAY		= 0x0c,
	ELMTYP_KEYPAD		= 0x0d,
	ELMTYP_ENCLOSURE	= 0x0e,
	ELMTYP_SCSIXVR		= 0x0f,
	ELMTYP_LANGUAGE		= 0x10,
	ELMTYP_COMPORT		= 0x11,
	ELMTYP_VOM		= 0x12,
	ELMTYP_AMMETER		= 0x13,
	ELMTYP_SCSI_TGT		= 0x14,
	ELMTYP_SCSI_INI		= 0x15,
	ELMTYP_SUBENC		= 0x16,
	ELMTYP_ARRAY_DEV	= 0x17,
	ELMTYP_SAS_EXP		= 0x18, /* SAS expander */
	ELMTYP_SAS_CONN		= 0x19  /* SAS connector */
} elm_type_t;

typedef struct encioc_element {
	/* Element Index */
	unsigned int	elm_idx;	

	/* ID of SubEnclosure containing Element*/
	unsigned int	elm_subenc_id;

	/* Element Type */
	elm_type_t	elm_type;
} encioc_element_t;

/*
 * Overall Enclosure Status
 */
typedef unsigned char encioc_enc_status_t;

/*
 * Element Status
 */
typedef struct encioc_elm_status {
	unsigned int	elm_idx;
	unsigned char	cstat[4];
} encioc_elm_status_t;

/*
 * ENC String structure, for StringIn and StringOut commands; use this with
 * the ENCIOC_GETSTRING and ENCIOC_SETSTRING ioctls.
 */
typedef struct encioc_string {
	size_t bufsiz;		/* IN/OUT: length of string provided/returned */
#define	ENC_STRING_MAX	0xffff
	uint8_t *buf;		/* IN/OUT: string */
} encioc_string_t;

/*============================================================================*/

/* 
 * SES v2 r20 6.1.10 (pg 39) - Element Descriptor diagnostic page
 * Tables 21, 22, and 23
 */
typedef struct encioc_elm_desc {
	unsigned int	 elm_idx;       /* IN: elment requested */
	uint16_t	 elm_desc_len; /* IN: buffer size; OUT: bytes written */
	char		*elm_desc_str; /* IN/OUT: buffer for descriptor data */
} encioc_elm_desc_t;

/*
 * ENCIOC_GETELMDEVNAMES:
 * ioctl structure to get an element's device names, if available
 */
typedef struct  encioc_elm_devnames {
	unsigned int	 elm_idx;	/* IN: element index */
	size_t		 elm_names_size;/* IN: size of elm_devnames */
	size_t		 elm_names_len;	/* OUT: actual size returned */
	/*
	 * IN/OUT: comma separated list of peripheral driver
	 * instances servicing this element.
	 */
	char		*elm_devnames;
} encioc_elm_devnames_t;

/* ioctl structure for requesting FC info for a port */
typedef struct encioc_elm_fc_port {
	unsigned int		elm_idx;
	unsigned int		port_idx;
	struct ses_elm_fc_port	port_data;
} encioc_elm_fc_port_t;

/* ioctl structure for requesting SAS info for element phys */
typedef struct encioc_elm_sas_device_phy {
	unsigned int			elm_idx;
	unsigned int			phy_idx;
	struct ses_elm_sas_device_phy	phy_data;
} enioc_elm_sas_phy_t;

/* ioctl structure for requesting SAS info for an expander phy */
typedef struct encioc_elm_sas_expander_phy {
	unsigned int			elm_idx;
	unsigned int			phy_idx;
	struct ses_elm_sas_expander_phy phy_data;
} encioc_elm_sas_expander_phy_t;

/* ioctl structure for requesting SAS info for a port phy */
typedef struct encioc_elm_sas_port_phy {
	unsigned int			elm_idx;
	unsigned int			phy_idx;
	struct ses_elm_sas_port_phy	phy_data;
} enioc_elm_sas_port_phy_t;

/* ioctl structure for requesting additional status for an element */
typedef struct encioc_addl_status {
	unsigned int			   elm_idx;
	union ses_elm_addlstatus_descr_hdr addl_hdr;
	union ses_elm_addlstatus_proto_hdr proto_hdr;
} enioc_addl_status_t;

#endif /* _SCSI_ENC_H_ */
OpenPOWER on IntegriCloud