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