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