xref: /openbsd-src/sys/scsi/safte.h (revision f2da64fbbbf1b03f09f390ab01267c93dfd77c4c)
1 /*	$OpenBSD: safte.h,v 1.6 2006/01/08 06:28:42 dlg Exp $ */
2 
3 /*
4  * Copyright (c) 2005 David Gwynne <dlg@openbsd.org>
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #ifndef _SCSI_SAFTE_H_
20 #define _SCSI_SAFTE_H_
21 
22 #define SAFTE_EXTRA_OFFSET	0x05
23 /* scsi_inquiry_data.extra */
24 struct safte_inq {
25 	u_int8_t	uniqueid[7];
26 	u_int8_t	chanid;
27 	u_int8_t	ident[6];
28 #define SAFTE_IDENT		"SAF-TE"
29 	u_int8_t	revision[4];
30 #ifdef notyet
31 	u_int8_t	reserved[2];
32 #endif
33 } __packed;
34 #define SAFTE_INQ_LEN		54
35 
36 struct safte_readbuf_cmd {
37 	u_int8_t	opcode;		/* READ_BUFFER */
38 	u_int8_t	flags;
39 #define SAFTE_RD_LUNMASK	0xe0	/* the lun should always be 0 */
40 #define SAFTE_RD_MODEMASK	0x07
41 #define SAFTE_RD_MODE		0x01	/* 0x01 is the SAF-TE command mode */
42 	u_int8_t	bufferid;
43 #define SAFTE_RD_CONFIG		0x00	/* enclosure configuration */
44 #define SAFTE_RD_ENCSTAT	0x01	/* enclosure status */
45 #define SAFTE_RD_USAGE		0x02	/* usage statistics */
46 #define SAFTE_RD_INSERTS	0x03	/* device insertions */
47 #define SAFTE_RD_SLOTSTAT	0x04	/* slot status */
48 #define SAFTE_RD_GLOBALS	0x05	/* global flags */
49 	u_int32_t	reserved1;
50 	u_int16_t	length;		/* transfer length (big endian) */
51 	u_int8_t	reserved2;
52 } __packed;
53 
54 struct safte_writebuf_cmd {
55 	u_int8_t	opcode;		/* WRITE_BUFFER */
56 	u_int8_t	flags;
57 #define SAFTE_WR_LUNMASK	0xe0	/* the lun should always be 0 */
58 #define SAFTE_WR_MODEMASK	0x07
59 #define SAFTE_WR_MODE		0x01	/* 0x01 is the SAF-TE command mode */
60 	u_int8_t	reserved1[5];
61 	u_int16_t	length;		/* transfer length (big endian) */
62 	u_int8_t	reserved2;
63 } __packed;
64 
65 #define	SAFTE_WRITE_SLOTSTAT	0x10	/* write device slot status */
66 #define SAFTE_WRITE_SETID	0x11	/* set scsi id */
67 #define	SAFTE_WRITE_SLOTOP	0x12	/* perform slot operation */
68 #define	SAFTE_WRITE_FANSPEED	0x13	/* set fan speed */
69 #define	SAFTE_WRITE_PWRSUP	0x14	/* activate power supply */
70 #define	SAFTE_WRITE_GLOBALS	0x15	/* global flags */
71 
72 
73 /* enclosure configuration */
74 struct safte_config {
75 	u_int8_t	nfans;		/* number of fans */
76 	u_int8_t	npwrsup;	/* number of power supplies */
77 	u_int8_t	nslots;		/* number of device slots */
78 	u_int8_t	doorlock;	/* door lock installed */
79 	u_int8_t	ntemps;		/* number of temp sensors */
80 	u_int8_t	alarm;		/* audible alarm installed */
81 	u_int8_t	therm;		/* temps in C and num of thermostats */
82 #define SAFTE_CFG_CELSIUSMASK	0x80
83 #define SAFTE_CFG_CELSIUS(a)	((a) & SAFTE_CFG_CELSIUSMASK ? 1 : 0)
84 #define SAFTE_CFG_NTHERMMASK	0x0f
85 #define SAFTE_CFG_NTHERM(a)	((a) & SAFTE_CFG_NTHERMMASK)
86 	u_int8_t	reserved[56]; /* 7 to 62 */
87 	u_int8_t	vendor_bytes;	/* number of vendor specific bytes */
88 } __packed;
89 #define SAFTE_CONFIG_LEN	sizeof(struct safte_config)
90 
91 /* enclosure status fields */
92 /* fan status field */
93 #define SAFTE_FAN_OP		0x00	/* operational */
94 #define SAFTE_FAN_MF		0x01	/* malfunctioning */
95 #define SAFTE_FAN_NOTINST	0x02	/* not installed */
96 #define SAFTE_FAN_UNKNOWN	0x80	/* unknown status or unreportable */
97 
98 /* power supply status field */
99 #define SAFTE_PWR_OP_ON		0x00	/* operational and on */
100 #define SAFTE_PWR_OP_OFF	0x01	/* operational and off */
101 #define SAFTE_PWR_MF_ON		0x10	/* malfunctioning and on */
102 #define SAFTE_PWR_MF_OFF	0x11	/* malfunctioning and off */
103 #define SAFTE_PWR_NOTINST	0x20	/* not present */
104 #define SAFTE_PWR_PRESENT	0x21	/* present */
105 #define SAFTE_PWR_UNKNOWN	0x80	/* unknown status or unreportable */
106 
107 /* scsi id fields */
108 /* are integers, not bitfields */
109 
110 /* door lock status */
111 #define SAFTE_DOOR_LOCKED	0x00	/* locked */
112 #define SAFTE_DOOR_UNLOCKED	0x01	/* unlocked or uncontrollable */
113 #define SAFTE_DOOR_UNKNOWN	0x80	/* unknown status or unreportable */
114 
115 /* speaker status */
116 #define SAFTE_SPKR_OFF		0x00	/* off or not installed */
117 #define SAFTE_SPKR_ON		0x01	/* speaker is currently on */
118 
119 /* temperature */
120 #define SAFTE_TEMP_OFFSET	-10	/* -10 to 245 degrees */
121 
122 /* temp out of range */
123 #define SAFTE_TEMP_ETA		0x8000	/* any temp alert */
124 
125 
126 /* usage statistics */
127 struct safte_usage {
128 	u_int32_t	minutes;	/* total number of minutes on */
129 	u_int32_t	cycles;		/* total number of power cycles */
130 	u_int8_t	reserved[7];
131 	u_int8_t	vendor_bytes;	/* number of vendor specific bytes */
132 };
133 
134 
135 /* device insertions */
136 /* u_int16_t * nslots */
137 
138 
139 /* device slot status */
140 #define SAFTE_SLOTSTAT_INSERT	(1<<0)	/* inserted */
141 #define SAFTE_SLOTSTAT_SWAP	(1<<1)	/* ready to be inserted/removed */
142 #define SAFTE_SLOTSTAT_OPER	(1<<2)	/* ready for operation */
143 
144 
145 /* global flags */
146 struct safte_globals {
147 	u_int8_t	flags1;
148 #define SAFTE_GLOBAL_ALARM	(1<<0)	/* audible alarm */
149 #define SAFTE_GLOBAL_FAILURE	(1<<1)	/* global failure indication */
150 #define SAFTE_GLOBAL_WARNING	(1<<2)	/* global warning indication */
151 #define SAFTE_GLOBAL_POWER	(1<<3)	/* enclosure power */
152 #define	SAFTE_GLOBAL_COOLING	(1<<4)	/* cooling failure */
153 #define SAFTE_GLOBAL_PWRFAIL	(1<<5)	/* power failure */
154 #define SAFTE_GLOBAL_DRVFAIL	(1<<6)	/* drive failure */
155 #define SAFTE_GLOBAL_DRVWARN	(1<<6)	/* drive warning */
156 	u_int8_t	flags2;
157 #define SAFTE_GLOBAL_ARRAYFAIL	(1<<0)	/* array failure */
158 #define SAFTE_GLOBAL_ARRAYWARN	(1<<1)	/* array warning */
159 #define SAFTE_GLOBAL_LOCK	(1<<2)	/* enclosure lock */
160 #define SAFTE_GLOBAL_IDENTIFY	(1<<3)	/* identify enclosure */
161 	u_int8_t	flags3;
162 	u_int8_t	reserved[13];
163 };
164 
165 
166 /*  perform slot operation */
167 struct safte_slotop {
168 	u_int8_t	opcode;		/* SAFTE_WRITE_SLOTOP */
169 	u_int8_t	slot;
170 	u_int8_t	flags;
171 #define SAFTE_SLOTOP_OPERATE	(1<<0)	/* prepare for operation */
172 #define SAFTE_SLOTOP_INSREM	(1<<1)	/* prepare for insert/removal */
173 #define SAFTE_SLOTOP_IDENTIFY	(1<<2)	/* identify */
174 	u_int8_t	reserved[61];	/* zero these */
175 } __packed;
176 
177 #endif /* _SCSI_SAFTE_H_ */
178