[BACK]Return to ses.h CVS log [TXT][DIR] Up to [local] / sys / scsi

Annotation of sys/scsi/ses.h, Revision 1.1.1.1

1.1       nbrk        1: /* $OpenBSD: ses.h,v 1.10 2006/05/11 00:45:59 krw Exp $ */
                      2: /*
                      3:  * Copyright (c) 2005 Marco Peereboom
                      4:  * All rights reserved.
                      5:  *
                      6:  * Redistribution and use in source and binary forms, with or without
                      7:  * modification, are permitted provided that the following conditions
                      8:  * are met:
                      9:  * 1. Redistributions of source code must retain the above copyright
                     10:  *    notice, this list of conditions and the following disclaimer.
                     11:  * 2. Redistributions in binary form must reproduce the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer in the
                     13:  *    documentation and/or other materials provided with the distribution.
                     14:  *
                     15:  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
                     16:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     17:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     18:  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
                     19:  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     20:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     21:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     22:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     23:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     24:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     25:  * SUCH DAMAGE.
                     26:  *
                     27:  */
                     28:
                     29: #ifndef _SCSI_SES_H_
                     30: #define _SCSI_SES_H_
                     31:
                     32: /* the scsi command */
                     33: struct ses_scsi_diag {
                     34:        u_int8_t        opcode; /* SEND_DIAGNOSTIC or RECEIVE_DIAGNOSTIC */
                     35:        u_int8_t        flags;
                     36: #define SES_DIAG_PCV           (1<<0)  /* page code valid */
                     37: #define SES_DIAG_PF            (1<<4)  /* set this bit if page code is valid */
                     38:        u_int8_t        pgcode;
                     39: #define SES_PAGE_CONFIG                0x01    /* Configuration */
                     40: #define SES_PAGE_STATUS                0x02    /* Enclosure Status */
                     41: #define SES_PAGE_EDESC         0x07    /* Element Descriptor */
                     42:        u_int16_t       length;
                     43:        u_int8_t        control;
                     44: } __packed;
                     45:
                     46:
                     47: /* all the different sensor types */
                     48: #define SES_T_UNSPEC           0x00
                     49: #define SES_T_DEVICE           0x01
                     50: #define SES_T_POWERSUPPLY      0x02
                     51: #define SES_T_COOLING          0x03
                     52: #define SES_T_TEMP             0x04
                     53: #define SES_T_DOORLOCK         0x05
                     54: #define SES_T_ALARM            0x06
                     55: #define SES_T_ENC_SRV_CTRL     0x07
                     56: #define SES_T_SCC_CTRL         0x08
                     57: #define SES_T_NONVOL_CACHE     0x09
                     58: #define SES_T_INV_OP_REASON    0x0a
                     59: #define SES_T_UPS              0x0b
                     60: #define SES_T_DISPLAY          0x0c
                     61: #define SES_T_KEYPAD           0x0d
                     62: #define SES_T_ENCLOSURE                0x0e
                     63: #define SES_T_SCSI_PORT_TRANS  0x0f
                     64: #define SES_T_LANGUAGE         0x10
                     65: #define SES_T_COMM_PORT                0x11
                     66: #define SES_T_VOLTAGE          0x12
                     67: #define SES_T_CURRENT          0x13
                     68: #define SES_T_SCSI_TARGET_PORT 0x14
                     69: #define SES_T_SCSI_INIT_PORT   0x15
                     70: #define SES_T_SIMP_SUBENC      0x16
                     71: #define SES_T_ARRAY_DEVICE     0x17
                     72:
                     73: #define SES_NUM_TYPES          256
                     74:
                     75: /* diagnostic page header */
                     76: struct ses_config_hdr {
                     77:        u_int8_t        pgcode; /* SES_PAGE_CONFIG */
                     78:        u_int8_t        n_subenc;
                     79:        u_int16_t       length;
                     80:        u_int32_t       gencode;
                     81: } __packed;
                     82: #define SES_CFG_HDRLEN         sizeof(struct ses_config_hdr)
                     83:
                     84: /* enclosure descriptor header */
                     85: struct ses_enc_hdr {
                     86:        u_int8_t        enc_id;
                     87:        u_int8_t        subenc_id;
                     88:        u_int8_t        n_types;
                     89:        u_int8_t        vendor_len;
                     90: } __packed;
                     91: #define SES_ENC_HDRLEN         sizeof(struct ses_enc_hdr)
                     92:
                     93: /* enclosure descriptor strings */
                     94: struct ses_enc_desc {
                     95:        u_int8_t        logical_id[8]; /* this isnt a string */
                     96:        u_int8_t        vendor_id[8];
                     97:        u_int8_t        prod_id[16];
                     98:        u_int8_t        prod_rev[4];
                     99:        u_int8_t        vendor[0];
                    100: } __packed;
                    101:
                    102: /* type descriptor header */
                    103: struct ses_type_desc {
                    104:        u_int8_t        type;
                    105:        u_int8_t        n_elem;
                    106:        u_int8_t        subenc_id;
                    107:        u_int8_t        desc_len;
                    108: } __packed;
                    109: #define SES_TYPE_DESCLEN       sizeof(struct ses_type_desc)
                    110:
                    111: /* status page header */
                    112: struct ses_status_hdr {
                    113:        u_int8_t        pgcode;         /* SES_PAGE_STATUS */
                    114:        u_int8_t        flags;
                    115: #define SES_STAT_UNRECOV       (1<<0)  /* unrecoverable error */
                    116: #define SES_STAT_CRIT          (1<<1)  /* critical error */
                    117: #define SES_STAT_NONCRIT       (1<<2)  /* noncritical error */
                    118: #define SES_STAT_INFO          (1<<3)  /* info available */
                    119: #define SES_STAT_INVOP         (1<<4)  /* invalid operation */
                    120:        u_int16_t       length;
                    121:        u_int32_t       gencode;
                    122: } __packed;
                    123: #define SES_STAT_HDRLEN                sizeof(struct ses_status_hdr)
                    124:
                    125: struct ses_status {
                    126:        u_int8_t        com;
                    127: #define SES_STAT_CODE_MASK     0x0f
                    128: #define SES_STAT_CODE(x)       ((x) & SES_STAT_CODE_MASK)
                    129: #define SES_STAT_CODE_UNSUP    0x00 /* unsupported */
                    130: #define SES_STAT_CODE_OK       0x01 /* installed and ok */
                    131: #define SES_STAT_CODE_CRIT     0x02 /* critical */
                    132: #define SES_STAT_CODE_NONCRIT  0x03 /* warning */
                    133: #define SES_STAT_CODE_UNREC    0x04 /* unrecoverable */
                    134: #define SES_STAT_CODE_NOTINST  0x05 /* not installed */
                    135: #define SES_STAT_CODE_UNKNOWN  0x06 /* unknown */
                    136: #define SES_STAT_CODE_NOTAVAIL 0x07 /* not available */
                    137: #define SES_STAT_SWAP          (1<<4)  /* element has been swapped */
                    138: #define SES_STAT_DISABLED      (1<<5)  /* disabled */
                    139: #define SES_STAT_PRDFAIL       (1<<6)  /* predicted failure */
                    140: #define SES_STAT_SELECT                (1<<7)  /* set to modify element */
                    141:
                    142:        u_int8_t        f1;     /* use of these flags depends on the SES_T */
                    143:        u_int8_t        f2;
                    144:        u_int8_t        f3;
                    145: } __packed;
                    146: #define SES_STAT_ELEMLEN       sizeof(struct ses_status)
                    147:
                    148: /* device status */
                    149: /* f1 is the device address */
                    150: /* f2 */
                    151: #define SES_S_DEV_REPORT       (1<<0)  /* enc report in progress */
                    152: #define SES_S_DEV_IDENT                (1<<1)  /* currently identifying */
                    153: #define SES_S_DEV_REMOVE       (1<<2)  /* ready to remove */
                    154: #define SES_S_DEV_INSERT       (1<<3)  /* ready to insert */
                    155: #define SES_S_DEV_ENCBYPB      (1<<4)  /* port B bypassed by enc */
                    156: #define SES_S_DEV_ENCBYPA      (1<<5)  /* port A bypassed by enc */
                    157: #define SES_S_DEV_DONOTREM     (1<<6)  /* do not remove */
                    158: #define SES_S_DEV_APPCLBYPA    (1<<7)  /* port A bypassed by app */
                    159: /* f3 */
                    160: #define SES_S_DEV_DEVBYPB      (1<<0)  /* port B bypassed by dev */
                    161: #define SES_S_DEV_DEVBYPA      (1<<1)  /* port A bypassed by dev */
                    162: #define SES_S_DEV_BYPB         (1<<2)
                    163: #define SES_S_DEV_BYPA         (1<<3)
                    164: #define SES_S_DEV_OFF          (1<<4)  /* device is off */
                    165: #define SES_S_DEV_FAULTRQST    (1<<5)  /* fault indicator rqsted */
                    166: #define SES_S_DEV_FAULTSENSE   (1<<6)  /* fault sensed */
                    167: #define SES_S_DEV_APPCLBYPB    (1<<7)  /* port B bypassed by app */
                    168:
                    169: /* device configuration */
                    170: /* f1 is reserved */
                    171: /* f2 */
                    172: #define SES_C_DEV_IDENT                (1<<1)  /* ident */
                    173: #define SES_C_DEV_REMOVE       (1<<2)  /* remove */
                    174: #define SES_C_DEV_INSERT       (1<<3)  /* insert */
                    175: #define SES_C_DEV_DONOTREM     (1<<6)  /* do not remove */
                    176: #define SES_C_DEV_ACTIVE       (1<<7)  /* active indicator */
                    177: #define SES_C_DEV_F2MASK       (SES_C_DEV_IDENT | SES_C_DEV_REMOVE | \
                    178:     SES_C_DEV_INSERT | SES_C_DEV_DONOTREM | SES_C_DEV_ACTIVE )
                    179: /* f3 */
                    180: #define SES_C_DEV_BYPB         (1<<2)  /* port B bypass */
                    181: #define SES_C_DEV_BYPA         (1<<3)  /* port A bypass */
                    182: #define SES_C_DEV_OFF          (1<<4)  /* off */
                    183: #define SES_C_DEV_FAULT                (1<<5)  /* fault indicator */
                    184: #define SES_C_DEV_F3MASK       (SES_C_DEV_BYPB | SES_C_DEV_BYPA | \
                    185:     SES_C_DEV_OFF | SES_C_DEV_FAULT)
                    186:
                    187: /* power supply element */
                    188: #define SES_S_PSU_IDENT(d)     ((d)->f1 & (1<<6)) /* identify */
                    189: #define SES_S_PSU_DCOC(d)      ((d)->f2 & (1<<1)) /* DC over current */
                    190: #define SES_S_PSU_DCUV(d)      ((d)->f2 & (1<<2)) /* DC under voltage */
                    191: #define SES_S_PSU_DCOV(d)      ((d)->f2 & (1<<3)) /* DC over voltage */
                    192: #define SES_S_PSU_DCFAIL(d)    ((d)->f3 & (1<<0)) /* DC fail */
                    193: #define SES_S_PSU_ACFAIL(d)    ((d)->f3 & (1<<1)) /* AC fail */
                    194: #define SES_S_PSU_TEMPWARN(d)  ((d)->f3 & (1<<2)) /* Temp warn */
                    195: #define SES_S_PSU_OVERTEMP(d)  ((d)->f3 & (1<<3)) /* over temp fail */
                    196: #define SES_S_PSU_OFF(d)       ((d)->f3 & (1<<4)) /* is the unit off */
                    197: #define SES_S_PSU_RQSTON(d)    ((d)->f3 & (1<<5)) /* manually on */
                    198: #define SES_S_PSU_FAIL(d)      ((d)->f3 & (1<<6)) /* fail is set on */
                    199:
                    200: /* cooling element */
                    201: #define SES_S_COOL_IDENT(d)    ((d)->f1 & (1<<6)) /* identify */
                    202: #define SES_S_COOL_SPEED_MASK  0x03
                    203: #define SES_S_COOL_SPEED(d)    ((d)->f2 + \
                    204:     ((u_int16_t)((d)->f2 & SES_S_COOL_SPEED_MASK) << 8))
                    205: #define SES_S_COOL_FACTOR      10
                    206: #define SES_S_COOL_CODE(d)     ((d)->f3 & 0x7) /* actual speed code */
                    207: #define SES_S_COOL_C_STOPPED   0x0 /* stopped */
                    208: #define SES_S_COOL_C_LOW1      0x1 /* lowest speed */
                    209: #define SES_S_COOL_C_LOW2      0x2 /* second lowest speed */
                    210: #define SES_S_COOL_C_LOW3      0x3 /* third lowest speed */
                    211: #define SES_S_COOL_C_INTER     0x4 /* intermediate speed */
                    212: #define SES_S_COOL_C_HI3       0x5 /* third highest speed */
                    213: #define SES_S_COOL_C_HI2       0x6 /* second highest speed */
                    214: #define SES_S_COOL_C_HI1       0x7 /* highest speed */
                    215: #define SES_S_COOL_OFF         ((d)->f3 & (1<<4)) /* not cooling */
                    216: #define SES_S_COOL_RQSTON      ((d)->f3 & (1<<5)) /* manually on */
                    217: #define SES_S_COOL_FAIL                ((d)->f3 & (1<<6)) /* fail indic is on */
                    218:
                    219: /* temperature sensor */
                    220: #define SES_S_TEMP_IDENT(d)    ((d)->f1 & (1<<7)) /* identify */
                    221: #define SES_S_TEMP(d)          ((d)->f2)
                    222: #define SES_S_TEMP_OFFSET      (-20)
                    223: #define SES_S_TEMP_UTWARN      ((d)->f3 & (1<<0)) /* under temp warning */
                    224: #define SES_S_TEMP_UTFAIL      ((d)->f3 & (1<<1)) /* under temp failure */
                    225: #define SES_S_TEMP_OTWARN      ((d)->f3 & (1<<2)) /* over temp warning */
                    226: #define SES_S_TEMP_OTFAIL      ((d)->f3 & (1<<3)) /* over temp failure */
                    227:
                    228: /*
                    229:  * the length of the status page is the header and a status element for
                    230:  * each type plus the number of elements for each type
                    231:  */
                    232: #define SES_STAT_LEN(t, e)     \
                    233:     (SES_STAT_HDRLEN + SES_STAT_ELEMLEN * ((t)+(e)))
                    234:
                    235: #endif /* _SCSI_SES_H_ */

CVSweb