[BACK]Return to mfireg.h CVS log [TXT][DIR] Up to [local] / sys / dev / ic

Annotation of sys/dev/ic/mfireg.h, Revision 1.1.1.1

1.1       nbrk        1: /* $OpenBSD: mfireg.h,v 1.24 2006/06/19 19:05:45 marco Exp $ */
                      2: /*
                      3:  * Copyright (c) 2006 Marco Peereboom <marco@peereboom.us>
                      4:  *
                      5:  * Permission to use, copy, modify, and distribute this software for any
                      6:  * purpose with or without fee is hereby granted, provided that the above
                      7:  * copyright notice and this permission notice appear in all copies.
                      8:  *
                      9:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     10:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     11:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     12:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     13:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                     14:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                     15:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     16:  */
                     17:
                     18: /* management interface constants */
                     19: #define MFI_MGMT_VD                            0x01
                     20: #define MFI_MGMT_SD                            0x02
                     21:
                     22: /* generic constants */
                     23: #define MFI_FRAME_SIZE                         64
                     24: #define MFI_SENSE_SIZE                         128
                     25: #define MFI_OSTS_INTR_VALID                    0x00000002 /* valid interrupt */
                     26: #define MFI_INVALID_CTX                                0xffffffff
                     27: #define MFI_ENABLE_INTR                                0x01
                     28: #define MFI_MAXFER                             MAXPHYS /* XXX bogus */
                     29:
                     30: /* register offsets */
                     31: #define MFI_IMSG0                              0x10 /* inbound msg 0 */
                     32: #define MFI_IMSG1                              0x14 /* inbound msg 1 */
                     33: #define MFI_OMSG0                              0x18 /* outbound msg 0 */
                     34: #define MFI_OMSG1                              0x1c /* outbound msg 1 */
                     35: #define MFI_IDB                                        0x20 /* inbound doorbell */
                     36: #define MFI_ISTS                               0x24 /* inbound intr stat */
                     37: #define MFI_IMSK                               0x28 /* inbound intr mask */
                     38: #define MFI_ODB                                        0x2c /* outbound doorbell */
                     39: #define MFI_OSTS                               0x30 /* outbound intr stat */
                     40: #define MFI_OMSK                               0x34 /* outbound inter mask */
                     41: #define MFI_IQP                                        0x40 /* inbound queue port */
                     42: #define MFI_OQP                                        0x44 /* outbound queue port */
                     43:
                     44: /* * firmware states */
                     45: #define MFI_STATE_MASK                         0xf0000000
                     46: #define MFI_STATE_UNDEFINED                    0x00000000
                     47: #define MFI_STATE_BB_INIT                      0x10000000
                     48: #define MFI_STATE_FW_INIT                      0x40000000
                     49: #define MFI_STATE_WAIT_HANDSHAKE               0x60000000
                     50: #define MFI_STATE_FW_INIT_2                    0x70000000
                     51: #define MFI_STATE_DEVICE_SCAN                  0x80000000
                     52: #define MFI_STATE_FLUSH_CACHE                  0xa0000000
                     53: #define MFI_STATE_READY                                0xb0000000
                     54: #define MFI_STATE_OPERATIONAL                  0xc0000000
                     55: #define MFI_STATE_FAULT                                0xf0000000
                     56: #define MFI_STATE_MAXSGL_MASK                  0x00ff0000
                     57: #define MFI_STATE_MAXCMD_MASK                  0x0000ffff
                     58:
                     59: /* command reset register */
                     60: #define MFI_INIT_ABORT                         0x00000000
                     61: #define MFI_INIT_READY                         0x00000002
                     62: #define MFI_INIT_MFIMODE                       0x00000004
                     63: #define MFI_INIT_CLEAR_HANDSHAKE               0x00000008
                     64: #define MFI_RESET_FLAGS                                MFI_INIT_READY|MFI_INIT_MFIMODE
                     65:
                     66: /* mfi Frame flags */
                     67: #define MFI_FRAME_POST_IN_REPLY_QUEUE          0x0000
                     68: #define MFI_FRAME_DONT_POST_IN_REPLY_QUEUE     0x0001
                     69: #define MFI_FRAME_SGL32                                0x0000
                     70: #define MFI_FRAME_SGL64                                0x0002
                     71: #define MFI_FRAME_SENSE32                      0x0000
                     72: #define MFI_FRAME_SENSE64                      0x0004
                     73: #define MFI_FRAME_DIR_NONE                     0x0000
                     74: #define MFI_FRAME_DIR_WRITE                    0x0008
                     75: #define MFI_FRAME_DIR_READ                     0x0010
                     76: #define MFI_FRAME_DIR_BOTH                     0x0018
                     77:
                     78: /* mfi command opcodes */
                     79: #define MFI_CMD_INIT                           0x00
                     80: #define MFI_CMD_LD_READ                                0x01
                     81: #define MFI_CMD_LD_WRITE                       0x02
                     82: #define MFI_CMD_LD_SCSI_IO                     0x03
                     83: #define MFI_CMD_PD_SCSI_IO                     0x04
                     84: #define MFI_CMD_DCMD                           0x05
                     85: #define MFI_CMD_ABORT                          0x06
                     86: #define MFI_CMD_SMP                            0x07
                     87: #define MFI_CMD_STP                            0x08
                     88:
                     89: /* direct commands */
                     90: #define MR_DCMD_CTRL_GET_INFO                  0x01010000
                     91: #define MR_DCMD_CTRL_CACHE_FLUSH               0x01101000
                     92: #define   MR_FLUSH_CTRL_CACHE                  0x01
                     93: #define   MR_FLUSH_DISK_CACHE                  0x02
                     94: #define MR_DCMD_CTRL_SHUTDOWN                  0x01050000
                     95: #define   MR_ENABLE_DRIVE_SPINDOWN             0x01
                     96: #define MR_DCMD_CTRL_EVENT_GET_INFO            0x01040100
                     97: #define MR_DCMD_CTRL_EVENT_GET                 0x01040300
                     98: #define MR_DCMD_CTRL_EVENT_WAIT                        0x01040500
                     99: #define MR_DCMD_PD_GET_LIST                    0x02010000
                    100: #define MR_DCMD_PD_GET_INFO                    0x02020000
                    101: #define MD_DCMD_PD_SET_STATE                   0x02030100
                    102: #define MD_DCMD_PD_REBUILD                     0x02040100
                    103: #define MR_DCMD_PD_BLINK                       0x02070100
                    104: #define MR_DCMD_PD_UNBLINK                     0x02070200
                    105: #define MR_DCMD_LD_GET_LIST                    0x03010000
                    106: #define MR_DCMD_LD_GET_INFO                    0x03020000
                    107: #define MR_DCMD_LD_GET_PROPERTIES              0x03030000
                    108: #define MD_DCMD_CONF_GET                       0x04010000
                    109: #define MR_DCMD_CLUSTER                                0x08000000
                    110: #define MR_DCMD_CLUSTER_RESET_ALL              0x08010100
                    111: #define MR_DCMD_CLUSTER_RESET_LD               0x08010200
                    112:
                    113: #define MR_DCMD_SPEAKER_GET                    0x01030100
                    114: #define MR_DCMD_SPEAKER_ENABLE                 0x01030200
                    115: #define MR_DCMD_SPEAKER_DISABLE                        0x01030300
                    116: #define MR_DCMD_SPEAKER_SILENCE                        0x01030400
                    117: #define MR_DCMD_SPEAKER_TEST                   0x01030500
                    118:
                    119: /* mailbox bytes in direct command */
                    120: #define MFI_MBOX_SIZE                          12
                    121:
                    122: /* mfi completion codes */
                    123: typedef enum {
                    124:        MFI_STAT_OK =                           0x00,
                    125:        MFI_STAT_INVALID_CMD =                  0x01,
                    126:        MFI_STAT_INVALID_DCMD =                 0x02,
                    127:        MFI_STAT_INVALID_PARAMETER =            0x03,
                    128:        MFI_STAT_INVALID_SEQUENCE_NUMBER =      0x04,
                    129:        MFI_STAT_ABORT_NOT_POSSIBLE =           0x05,
                    130:        MFI_STAT_APP_HOST_CODE_NOT_FOUND =      0x06,
                    131:        MFI_STAT_APP_IN_USE =                   0x07,
                    132:        MFI_STAT_APP_NOT_INITIALIZED =          0x08,
                    133:        MFI_STAT_ARRAY_INDEX_INVALID =          0x09,
                    134:        MFI_STAT_ARRAY_ROW_NOT_EMPTY =          0x0a,
                    135:        MFI_STAT_CONFIG_RESOURCE_CONFLICT =     0x0b,
                    136:        MFI_STAT_DEVICE_NOT_FOUND =             0x0c,
                    137:        MFI_STAT_DRIVE_TOO_SMALL =              0x0d,
                    138:        MFI_STAT_FLASH_ALLOC_FAIL =             0x0e,
                    139:        MFI_STAT_FLASH_BUSY =                   0x0f,
                    140:        MFI_STAT_FLASH_ERROR =                  0x10,
                    141:        MFI_STAT_FLASH_IMAGE_BAD =              0x11,
                    142:        MFI_STAT_FLASH_IMAGE_INCOMPLETE =       0x12,
                    143:        MFI_STAT_FLASH_NOT_OPEN =               0x13,
                    144:        MFI_STAT_FLASH_NOT_STARTED =            0x14,
                    145:        MFI_STAT_FLUSH_FAILED =                 0x15,
                    146:        MFI_STAT_HOST_CODE_NOT_FOUNT =          0x16,
                    147:        MFI_STAT_LD_CC_IN_PROGRESS =            0x17,
                    148:        MFI_STAT_LD_INIT_IN_PROGRESS =          0x18,
                    149:        MFI_STAT_LD_LBA_OUT_OF_RANGE =          0x19,
                    150:        MFI_STAT_LD_MAX_CONFIGURED =            0x1a,
                    151:        MFI_STAT_LD_NOT_OPTIMAL =               0x1b,
                    152:        MFI_STAT_LD_RBLD_IN_PROGRESS =          0x1c,
                    153:        MFI_STAT_LD_RECON_IN_PROGRESS =         0x1d,
                    154:        MFI_STAT_LD_WRONG_RAID_LEVEL =          0x1e,
                    155:        MFI_STAT_MAX_SPARES_EXCEEDED =          0x1f,
                    156:        MFI_STAT_MEMORY_NOT_AVAILABLE =         0x20,
                    157:        MFI_STAT_MFC_HW_ERROR =                 0x21,
                    158:        MFI_STAT_NO_HW_PRESENT =                0x22,
                    159:        MFI_STAT_NOT_FOUND =                    0x23,
                    160:        MFI_STAT_NOT_IN_ENCL =                  0x24,
                    161:        MFI_STAT_PD_CLEAR_IN_PROGRESS =         0x25,
                    162:        MFI_STAT_PD_TYPE_WRONG =                0x26,
                    163:        MFI_STAT_PR_DISABLED =                  0x27,
                    164:        MFI_STAT_ROW_INDEX_INVALID =            0x28,
                    165:        MFI_STAT_SAS_CONFIG_INVALID_ACTION =    0x29,
                    166:        MFI_STAT_SAS_CONFIG_INVALID_DATA =      0x2a,
                    167:        MFI_STAT_SAS_CONFIG_INVALID_PAGE =      0x2b,
                    168:        MFI_STAT_SAS_CONFIG_INVALID_TYPE =      0x2c,
                    169:        MFI_STAT_SCSI_DONE_WITH_ERROR =         0x2d,
                    170:        MFI_STAT_SCSI_IO_FAILED =               0x2e,
                    171:        MFI_STAT_SCSI_RESERVATION_CONFLICT =    0x2f,
                    172:        MFI_STAT_SHUTDOWN_FAILED =              0x30,
                    173:        MFI_STAT_TIME_NOT_SET =                 0x31,
                    174:        MFI_STAT_WRONG_STATE =                  0x32,
                    175:        MFI_STAT_LD_OFFLINE =                   0x33,
                    176:        MFI_STAT_PEER_NOTIFICATION_REJECTED =   0x34,
                    177:        MFI_STAT_PEER_NOTIFICATION_FAILED =     0x35,
                    178:        MFI_STAT_RESERVATION_IN_PROGRESS =      0x36,
                    179:        MFI_STAT_I2C_ERRORS_DETECTED =          0x37,
                    180:        MFI_STAT_PCI_ERRORS_DETECTED =          0x38,
                    181:        MFI_STAT_INVALID_STATUS =               0xff
                    182: } mfi_status_t;
                    183:
                    184: typedef enum {
                    185:        MFI_EVT_CLASS_DEBUG =                   -2,
                    186:        MFI_EVT_CLASS_PROGRESS =                -1,
                    187:        MFI_EVT_CLASS_INFO =                    0,
                    188:        MFI_EVT_CLASS_WARNING =                 1,
                    189:        MFI_EVT_CLASS_CRITICAL =                2,
                    190:        MFI_EVT_CLASS_FATAL =                   3,
                    191:        MFI_EVT_CLASS_DEAD =                    4
                    192: } mfi_evt_class_t;
                    193:
                    194: typedef enum {
                    195:        MFI_EVT_LOCALE_LD =                     0x0001,
                    196:        MFI_EVT_LOCALE_PD =                     0x0002,
                    197:        MFI_EVT_LOCALE_ENCL =                   0x0004,
                    198:        MFI_EVT_LOCALE_BBU =                    0x0008,
                    199:        MFI_EVT_LOCALE_SAS =                    0x0010,
                    200:        MFI_EVT_LOCALE_CTRL =                   0x0020,
                    201:        MFI_EVT_LOCALE_CONFIG =                 0x0040,
                    202:        MFI_EVT_LOCALE_CLUSTER =                0x0080,
                    203:        MFI_EVT_LOCALE_ALL =                    0xffff
                    204: } mfi_evt_locale_t;
                    205:
                    206: typedef enum {
                    207:         MR_EVT_ARGS_NONE =                     0x00,
                    208:         MR_EVT_ARGS_CDB_SENSE,
                    209:         MR_EVT_ARGS_LD,
                    210:         MR_EVT_ARGS_LD_COUNT,
                    211:         MR_EVT_ARGS_LD_LBA,
                    212:         MR_EVT_ARGS_LD_OWNER,
                    213:         MR_EVT_ARGS_LD_LBA_PD_LBA,
                    214:         MR_EVT_ARGS_LD_PROG,
                    215:         MR_EVT_ARGS_LD_STATE,
                    216:         MR_EVT_ARGS_LD_STRIP,
                    217:         MR_EVT_ARGS_PD,
                    218:         MR_EVT_ARGS_PD_ERR,
                    219:         MR_EVT_ARGS_PD_LBA,
                    220:         MR_EVT_ARGS_PD_LBA_LD,
                    221:         MR_EVT_ARGS_PD_PROG,
                    222:         MR_EVT_ARGS_PD_STATE,
                    223:         MR_EVT_ARGS_PCI,
                    224:         MR_EVT_ARGS_RATE,
                    225:         MR_EVT_ARGS_STR,
                    226:         MR_EVT_ARGS_TIME,
                    227:         MR_EVT_ARGS_ECC
                    228: } mfi_evt_args;
                    229:
                    230: /* driver definitions */
                    231: #define MFI_MAX_PD_CHANNELS                    2
                    232: #define MFI_MAX_PD_ARRAY                       32
                    233: #define MFI_MAX_LD_CHANNELS                    2
                    234: #define MFI_MAX_CHANNELS       (MFI_MAX_PD_CHANNELS + MFI_MAX_LD_CHANNELS)
                    235: #define MFI_MAX_CHANNEL_DEVS                   128
                    236: #define MFI_DEFAULT_ID                         -1
                    237: #define MFI_MAX_LUN                            8
                    238: #define MFI_MAX_LD                             64
                    239: #define MFI_MAX_SPAN                           8
                    240: #define MFI_MAX_ARRAY_DEDICATED                        16
                    241:
                    242: /* sense buffer */
                    243: struct mfi_sense {
                    244:        uint8_t                 mse_data[MFI_SENSE_SIZE];
                    245: } __packed;
                    246:
                    247: /* scatter gather elements */
                    248: struct mfi_sg32 {
                    249:        uint32_t                addr;
                    250:        uint32_t                len;
                    251: } __packed;
                    252:
                    253: struct mfi_sg64 {
                    254:        uint64_t                addr;
                    255:        uint32_t                len;
                    256: } __packed;
                    257:
                    258: union mfi_sgl {
                    259:        struct mfi_sg32         sg32[1];
                    260:        struct mfi_sg64         sg64[1];
                    261: } __packed;
                    262:
                    263: /* message frame */
                    264: struct mfi_frame_header {
                    265:        uint8_t                 mfh_cmd;
                    266:        uint8_t                 mfh_sense_len;
                    267:        uint8_t                 mfh_cmd_status;
                    268:        uint8_t                 mfh_scsi_status;
                    269:        uint8_t                 mfh_target_id;
                    270:        uint8_t                 mfh_lun_id;
                    271:        uint8_t                 mfh_cdb_len;
                    272:        uint8_t                 mfh_sg_count;
                    273:        uint32_t                mfh_context;
                    274:        uint32_t                mfh_pad0;
                    275:        uint16_t                mfh_flags;
                    276:        uint16_t                mfh_timeout;
                    277:        uint32_t                mfh_data_len;
                    278: } __packed;
                    279:
                    280: union mfi_sgl_frame {
                    281:        struct mfi_sg32         sge32[8];
                    282:        struct mfi_sg64         sge64[5];
                    283:
                    284: } __packed;
                    285:
                    286: struct mfi_init_frame {
                    287:        struct mfi_frame_header mif_header;
                    288:        uint32_t                mif_qinfo_new_addr_lo;
                    289:        uint32_t                mif_qinfo_new_addr_hi;
                    290:        uint32_t                mif_qinfo_old_addr_lo;
                    291:        uint32_t                mif_qinfo_old_addr_hi;
                    292:        uint32_t                mif_reserved[6];
                    293: } __packed;
                    294:
                    295: /* queue init structure */
                    296: struct mfi_init_qinfo {
                    297:        uint32_t                miq_flags;
                    298:        uint32_t                miq_rq_entries;
                    299:        uint32_t                miq_rq_addr_lo;
                    300:        uint32_t                miq_rq_addr_hi;
                    301:        uint32_t                miq_pi_addr_lo;
                    302:        uint32_t                miq_pi_addr_hi;
                    303:        uint32_t                miq_ci_addr_lo;
                    304:        uint32_t                miq_ci_addr_hi;
                    305: } __packed;
                    306:
                    307: #define MFI_IO_FRAME_SIZE      40
                    308: struct mfi_io_frame {
                    309:        struct mfi_frame_header mif_header;
                    310:        uint32_t                mif_sense_addr_lo;
                    311:        uint32_t                mif_sense_addr_hi;
                    312:        uint32_t                mif_lba_lo;
                    313:        uint32_t                mif_lba_hi;
                    314:        union mfi_sgl           mif_sgl;
                    315: } __packed;
                    316:
                    317: #define MFI_PASS_FRAME_SIZE    48
                    318: struct mfi_pass_frame {
                    319:        struct mfi_frame_header mpf_header;
                    320:        uint32_t                mpf_sense_addr_lo;
                    321:        uint32_t                mpf_sense_addr_hi;
                    322:        uint8_t                 mpf_cdb[16];
                    323:        union mfi_sgl           mpf_sgl;
                    324: } __packed;
                    325:
                    326: #define MFI_DCMD_FRAME_SIZE    40
                    327: struct mfi_dcmd_frame {
                    328:        struct mfi_frame_header mdf_header;
                    329:        uint32_t                mdf_opcode;
                    330:        uint8_t                 mdf_mbox[MFI_MBOX_SIZE];
                    331:        union mfi_sgl           mdf_sgl;
                    332: } __packed;
                    333:
                    334: struct mfi_abort_frame {
                    335:        struct mfi_frame_header maf_header;
                    336:        uint32_t                maf_abort_context;
                    337:        uint32_t                maf_pad;
                    338:        uint32_t                maf_abort_mfi_addr_lo;
                    339:        uint32_t                maf_abort_mfi_addr_hi;
                    340:        uint32_t                maf_reserved[6];
                    341: } __packed;
                    342:
                    343: struct mfi_smp_frame {
                    344:        struct mfi_frame_header msf_header;
                    345:        uint64_t                msf_sas_addr;
                    346:        union {
                    347:                struct mfi_sg32 sg32[2];
                    348:                struct mfi_sg64 sg64[2];
                    349:        }                       msf_sgl;
                    350: } __packed;
                    351:
                    352: struct mfi_stp_frame {
                    353:        struct mfi_frame_header msf_header;
                    354:        uint16_t                msf_fis[10];
                    355:        uint32_t                msf_stp_flags;
                    356:        union {
                    357:                struct mfi_sg32 sg32[2];
                    358:                struct mfi_sg64 sg64[2];
                    359:        }                       msf_sgl;
                    360: } __packed;
                    361:
                    362: union mfi_frame {
                    363:        struct mfi_frame_header mfr_header;
                    364:        struct mfi_init_frame   mfr_init;
                    365:        struct mfi_io_frame     mfr_io;
                    366:        struct mfi_pass_frame   mfr_pass;
                    367:        struct mfi_dcmd_frame   mfr_dcmd;
                    368:        struct mfi_abort_frame  mfr_abort;
                    369:        struct mfi_smp_frame    mfr_smp;
                    370:        struct mfi_stp_frame    mfr_stp;
                    371:        uint8_t                 mfr_bytes[MFI_FRAME_SIZE];
                    372: };
                    373:
                    374: union mfi_evt_class_locale {
                    375:        struct {
                    376:                uint16_t        locale;
                    377:                uint8_t         reserved;
                    378:                int8_t          class;
                    379:        } __packed              mec_members;
                    380:
                    381:        uint32_t                mec_word;
                    382: } __packed;
                    383:
                    384: struct mfi_evt_log_info {
                    385:        uint32_t                mel_newest_seq_num;
                    386:        uint32_t                mel_oldest_seq_num;
                    387:        uint32_t                mel_clear_seq_num;
                    388:        uint32_t                mel_shutdown_seq_num;
                    389:        uint32_t                mel_boot_seq_num;
                    390: } __packed;
                    391:
                    392: struct mfi_progress {
                    393:        uint16_t                mp_progress;
                    394:        uint16_t                mp_elapsed_seconds;
                    395: } __packed;
                    396:
                    397: struct mfi_evtarg_ld {
                    398:        uint16_t                mel_target_id;
                    399:        uint8_t                 mel_ld_index;
                    400:        uint8_t                 mel_reserved;
                    401: } __packed;
                    402:
                    403: struct mfi_evtarg_pd {
                    404:        uint16_t                mep_device_id;
                    405:        uint8_t                 mep_encl_index;
                    406:        uint8_t                 mep_slot_number;
                    407: } __packed;
                    408:
                    409: struct mfi_evt_detail {
                    410:        uint32_t                                med_seq_num;
                    411:        uint32_t                                med_time_stamp;
                    412:        uint32_t                                med_code;
                    413:        union mfi_evt_class_locale              med_cl;
                    414:        uint8_t                                 med_arg_type;
                    415:        uint8_t                                 med_reserved1[15];
                    416:
                    417:        union {
                    418:                struct {
                    419:                        struct mfi_evtarg_pd    pd;
                    420:                        uint8_t                 cdb_length;
                    421:                        uint8_t                 sense_length;
                    422:                        uint8_t                 reserved[2];
                    423:                        uint8_t                 cdb[16];
                    424:                        uint8_t                 sense[64];
                    425:                } __packed                      cdb_sense;
                    426:
                    427:                struct mfi_evtarg_ld            ld;
                    428:
                    429:                struct {
                    430:                        struct mfi_evtarg_ld    ld;
                    431:                        uint64_t                count;
                    432:                } __packed                      ld_count;
                    433:
                    434:                struct {
                    435:                        uint64_t                lba;
                    436:                        struct mfi_evtarg_ld    ld;
                    437:                } __packed                      ld_lba;
                    438:
                    439:                struct {
                    440:                        struct mfi_evtarg_ld    ld;
                    441:                        uint32_t                prev_owner;
                    442:                        uint32_t                new_owner;
                    443:                } __packed                      ld_owner;
                    444:
                    445:                struct {
                    446:                        uint64_t                ld_lba;
                    447:                        uint64_t                pd_lba;
                    448:                        struct mfi_evtarg_ld    ld;
                    449:                        struct mfi_evtarg_pd    pd;
                    450:                } __packed                      ld_lba_pd_lba;
                    451:
                    452:                struct {
                    453:                        struct mfi_evtarg_ld    ld;
                    454:                        struct mfi_progress     prog;
                    455:                } __packed                      ld_prog;
                    456:
                    457:                struct {
                    458:                        struct mfi_evtarg_ld    ld;
                    459:                        uint32_t                prev_state;
                    460:                        uint32_t                new_state;
                    461:                } __packed                      ld_state;
                    462:
                    463:                struct {
                    464:                        uint64_t                strip;
                    465:                        struct mfi_evtarg_ld    ld;
                    466:                } __packed                      ld_strip;
                    467:
                    468:                struct mfi_evtarg_pd            pd;
                    469:
                    470:                struct {
                    471:                        struct mfi_evtarg_pd    pd;
                    472:                        uint32_t                err;
                    473:                } __packed                      pd_err;
                    474:
                    475:                struct {
                    476:                        uint64_t                lba;
                    477:                        struct mfi_evtarg_pd    pd;
                    478:                } __packed                      pd_lba;
                    479:
                    480:                struct {
                    481:                        uint64_t                lba;
                    482:                        struct mfi_evtarg_pd    pd;
                    483:                        struct mfi_evtarg_ld    ld;
                    484:                } __packed                      pd_lba_ld;
                    485:
                    486:                struct {
                    487:                        struct mfi_evtarg_pd    pd;
                    488:                        struct mfi_progress     prog;
                    489:                } __packed                      pd_prog;
                    490:
                    491:                struct {
                    492:                        struct mfi_evtarg_pd    pd;
                    493:                        uint32_t                prev_state;
                    494:                        uint32_t                new_state;
                    495:                } __packed                      pd_state;
                    496:
                    497:                struct {
                    498:                        uint16_t                vendor_id;
                    499:                        uint16_t                device_id;
                    500:                        uint16_t                subvendor_id;
                    501:                        uint16_t                subdevice_id;
                    502:                } __packed                      pci;
                    503:
                    504:                uint32_t                        rate;
                    505:                char                            str[96];
                    506:
                    507:                struct {
                    508:                        uint32_t                rtc;
                    509:                        uint32_t                elapsed_seconds;
                    510:                } __packed                      time;
                    511:
                    512:                struct {
                    513:                        uint32_t                ecar;
                    514:                        uint32_t                elog;
                    515:                        char                    str[64];
                    516:                } __packed                      ecc;
                    517:
                    518:                uint8_t                         b[96];
                    519:                uint16_t                        s[48];
                    520:                uint32_t                        w[24];
                    521:                uint64_t                        d[12];
                    522:        }                                       args;
                    523:
                    524:        char                                    med_description[128];
                    525: } __packed;
                    526:
                    527: /* controller properties from mfi_ctrl_info */
                    528: struct mfi_ctrl_props {
                    529:        uint16_t                mcp_seq_num;
                    530:        uint16_t                mcp_pred_fail_poll_interval;
                    531:        uint16_t                mcp_intr_throttle_cnt;
                    532:        uint16_t                mcp_intr_throttle_timeout;
                    533:        uint8_t                 mcp_rebuild_rate;
                    534:        uint8_t                 mcp_patrol_read_rate;
                    535:        uint8_t                 mcp_bgi_rate;
                    536:        uint8_t                 mcp_cc_rate;
                    537:        uint8_t                 mcp_recon_rate;
                    538:        uint8_t                 mcp_cache_flush_interval;
                    539:        uint8_t                 mcp_spinup_drv_cnt;
                    540:        uint8_t                 mcp_spinup_delay;
                    541:        uint8_t                 mcp_cluster_enable;
                    542:        uint8_t                 mcp_coercion_mode;
                    543:        uint8_t                 mcp_alarm_enable;
                    544:        uint8_t                 mcp_disable_auto_rebuild;
                    545:        uint8_t                 mcp_disable_battery_warn;
                    546:        uint8_t                 mcp_ecc_bucket_size;
                    547:        uint16_t                mcp_ecc_bucket_leak_rate;
                    548:        uint8_t                 mcp_restore_hotspare_on_insertion;
                    549:        uint8_t                 mcp_expose_encl_devices;
                    550:        uint8_t                 mcp_reserved[38];
                    551: } __packed;
                    552:
                    553: /* pci info */
                    554: struct mfi_info_pci {
                    555:        uint16_t                mip_vendor;
                    556:        uint16_t                mip_device;
                    557:        uint16_t                mip_subvendor;
                    558:        uint16_t                mip_subdevice;
                    559:        uint8_t                 mip_reserved[24];
                    560: } __packed;
                    561:
                    562: /* host interface infor */
                    563: struct mfi_info_host {
                    564:        uint8_t                 mih_type;
                    565: #define MFI_INFO_HOST_PCIX     0x01
                    566: #define MFI_INFO_HOST_PCIE     0x02
                    567: #define MFI_INFO_HOST_ISCSI    0x04
                    568: #define MFI_INFO_HOST_SAS3G    0x08
                    569:        uint8_t                 mih_reserved[6];
                    570:        uint8_t                 mih_port_count;
                    571:        uint64_t                mih_port_addr[8];
                    572: } __packed;
                    573:
                    574: /* device  interface info */
                    575: struct mfi_info_device {
                    576:        uint8_t                 mid_type;
                    577: #define MFI_INFO_DEV_SPI       0x01
                    578: #define MFI_INFO_DEV_SAS3G     0x02
                    579: #define MFI_INFO_DEV_SATA1     0x04
                    580: #define MFI_INFO_DEV_SATA3G    0x08
                    581:        uint8_t                 mid_reserved[6];
                    582:        uint8_t                 mid_port_count;
                    583:        uint64_t                mid_port_addr[8];
                    584: } __packed;
                    585:
                    586: /* firmware component info */
                    587: struct mfi_info_component {
                    588:        char                    mic_name[8];
                    589:        char                    mic_version[32];
                    590:        char                    mic_build_date[16];
                    591:        char                    mic_build_time[16];
                    592: } __packed;
                    593:
                    594: /* controller info from MFI_DCMD_CTRL_GETINFO. */
                    595: struct mfi_ctrl_info {
                    596:        struct mfi_info_pci     mci_pci;
                    597:        struct mfi_info_host    mci_host;
                    598:        struct mfi_info_device  mci_device;
                    599:
                    600:        /* Firmware components that are present and active. */
                    601:        uint32_t                mci_image_check_word;
                    602:        uint32_t                mci_image_component_count;
                    603:        struct mfi_info_component mci_image_component[8];
                    604:
                    605:        /* Firmware components that have been flashed but are inactive */
                    606:        uint32_t                mci_pending_image_component_count;
                    607:        struct mfi_info_component mci_pending_image_component[8];
                    608:
                    609:        uint8_t                 mci_max_arms;
                    610:        uint8_t                 mci_max_spans;
                    611:        uint8_t                 mci_max_arrays;
                    612:        uint8_t                 mci_max_lds;
                    613:        char                    mci_product_name[80];
                    614:        char                    mci_serial_number[32];
                    615:        uint32_t                mci_hw_present;
                    616: #define MFI_INFO_HW_BBU                0x01
                    617: #define MFI_INFO_HW_ALARM      0x02
                    618: #define MFI_INFO_HW_NVRAM      0x04
                    619: #define MFI_INFO_HW_UART       0x08
                    620:        uint32_t                mci_current_fw_time;
                    621:        uint16_t                mci_max_cmds;
                    622:        uint16_t                mci_max_sg_elements;
                    623:        uint32_t                mci_max_request_size;
                    624:        uint16_t                mci_lds_present;
                    625:        uint16_t                mci_lds_degraded;
                    626:        uint16_t                mci_lds_offline;
                    627:        uint16_t                mci_pd_present;
                    628:        uint16_t                mci_pd_disks_present;
                    629:        uint16_t                mci_pd_disks_pred_failure;
                    630:        uint16_t                mci_pd_disks_failed;
                    631:        uint16_t                mci_nvram_size;
                    632:        uint16_t                mci_memory_size;
                    633:        uint16_t                mci_flash_size;
                    634:        uint16_t                mci_ram_correctable_errors;
                    635:        uint16_t                mci_ram_uncorrectable_errors;
                    636:        uint8_t                 mci_cluster_allowed;
                    637:        uint8_t                 mci_cluster_active;
                    638:        uint16_t                mci_max_strips_per_io;
                    639:
                    640:        uint32_t                mci_raid_levels;
                    641: #define MFI_INFO_RAID_0                0x01
                    642: #define MFI_INFO_RAID_1                0x02
                    643: #define MFI_INFO_RAID_5                0x04
                    644: #define MFI_INFO_RAID_1E       0x08
                    645: #define MFI_INFO_RAID_6                0x10
                    646:
                    647:        uint32_t                mci_adapter_ops;
                    648: #define MFI_INFO_AOPS_RBLD_RATE                0x0001
                    649: #define MFI_INFO_AOPS_CC_RATE          0x0002
                    650: #define MFI_INFO_AOPS_BGI_RATE         0x0004
                    651: #define MFI_INFO_AOPS_RECON_RATE       0x0008
                    652: #define MFI_INFO_AOPS_PATROL_RATE      0x0010
                    653: #define MFI_INFO_AOPS_ALARM_CONTROL    0x0020
                    654: #define MFI_INFO_AOPS_CLUSTER_SUPPORTED        0x0040
                    655: #define MFI_INFO_AOPS_BBU              0x0080
                    656: #define MFI_INFO_AOPS_SPANNING_ALLOWED 0x0100
                    657: #define MFI_INFO_AOPS_DEDICATED_SPARES 0x0200
                    658: #define MFI_INFO_AOPS_REVERTIBLE_SPARES        0x0400
                    659: #define MFI_INFO_AOPS_FOREIGN_IMPORT   0x0800
                    660: #define MFI_INFO_AOPS_SELF_DIAGNOSTIC  0x1000
                    661: #define MFI_INFO_AOPS_MIXED_ARRAY      0x2000
                    662: #define MFI_INFO_AOPS_GLOBAL_SPARES    0x4000
                    663:
                    664:        uint32_t                mci_ld_ops;
                    665: #define MFI_INFO_LDOPS_READ_POLICY     0x01
                    666: #define MFI_INFO_LDOPS_WRITE_POLICY    0x02
                    667: #define MFI_INFO_LDOPS_IO_POLICY       0x04
                    668: #define MFI_INFO_LDOPS_ACCESS_POLICY   0x08
                    669: #define MFI_INFO_LDOPS_DISK_CACHE_POLICY 0x10
                    670:
                    671:        struct {
                    672:                uint8_t         min;
                    673:                uint8_t         max;
                    674:                uint8_t         reserved[2];
                    675:        } __packed              mci_stripe_sz_ops;
                    676:
                    677:        uint32_t                mci_pd_ops;
                    678: #define MFI_INFO_PDOPS_FORCE_ONLINE    0x01
                    679: #define MFI_INFO_PDOPS_FORCE_OFFLINE   0x02
                    680: #define MFI_INFO_PDOPS_FORCE_REBUILD   0x04
                    681:
                    682:        uint32_t                mci_pd_mix_support;
                    683: #define MFI_INFO_PDMIX_SAS             0x01
                    684: #define MFI_INFO_PDMIX_SATA            0x02
                    685: #define MFI_INFO_PDMIX_ENCL            0x04
                    686: #define MFI_INFO_PDMIX_LD              0x08
                    687: #define MFI_INFO_PDMIX_SATA_CLUSTER    0x10
                    688:
                    689:        uint8_t                 mci_ecc_bucket_count;
                    690:        uint8_t                 mci_reserved2[11];
                    691:        struct mfi_ctrl_props   mci_properties;
                    692:        char                    mci_package_version[0x60];
                    693:        uint8_t                 mci_pad[0x800 - 0x6a0];
                    694: } __packed;
                    695:
                    696: /* logical disk info from MR_DCMD_LD_GET_LIST */
                    697: struct mfi_ld {
                    698:        uint8_t                 mld_target;
                    699:        uint8_t                 mld_res;
                    700:        uint16_t                mld_seq;
                    701: } __packed;
                    702:
                    703: struct mfi_ld_list {
                    704:        uint32_t                mll_no_ld;
                    705:        uint32_t                mll_res;
                    706:        struct {
                    707:                struct mfi_ld   mll_ld;
                    708:                uint8_t         mll_state;
                    709: #define MFI_LD_OFFLINE                 0x00
                    710: #define MFI_LD_PART_DEGRADED           0x01
                    711: #define MFI_LD_DEGRADED                        0x02
                    712: #define MFI_LD_ONLINE                  0x03
                    713:                uint8_t         mll_res2;
                    714:                uint8_t         mll_res3;
                    715:                uint8_t         mll_res4;
                    716:                u_quad_t        mll_size;
                    717:        } mll_list[MFI_MAX_LD];
                    718: } __packed;
                    719:
                    720: /* logicl disk details from MR_DCMD_LD_GET_INFO */
                    721: struct mfi_ld_prop {
                    722:        struct mfi_ld           mlp_ld;
                    723:        char                    mlp_name[16];
                    724:        uint8_t                 mlp_cache_policy;
                    725:        uint8_t                 mlp_acces_policy;
                    726:        uint8_t                 mlp_diskcache_policy;
                    727:        uint8_t                 mlp_cur_cache_policy;
                    728:        uint8_t                 mlp_disable_bgi;
                    729:        uint8_t                 mlp_res[7];
                    730: } __packed;
                    731:
                    732: struct mfi_ld_parm {
                    733:        uint8_t                 mpa_pri_raid;   /* SNIA DDF PRL */
                    734: #define MFI_DDF_PRL_RAID0      0x00
                    735: #define MFI_DDF_PRL_RAID1      0x01
                    736: #define MFI_DDF_PRL_RAID3      0x03
                    737: #define MFI_DDF_PRL_RAID4      0x04
                    738: #define MFI_DDF_PRL_RAID5      0x05
                    739: #define MFI_DDF_PRL_RAID1E     0x11
                    740: #define MFI_DDF_PRL_JBOD       0x0f
                    741: #define MFI_DDF_PRL_CONCAT     0x1f
                    742: #define MFI_DDF_PRL_RAID5E     0x15
                    743: #define MFI_DDF_PRL_RAID5EE    0x25
                    744: #define MFI_DDF_PRL_RAID6      0x16
                    745:        uint8_t                 mpa_raid_qual;  /* SNIA DDF RLQ */
                    746:        uint8_t                 mpa_sec_raid;   /* SNIA DDF SRL */
                    747: #define MFI_DDF_SRL_STRIPED    0x00
                    748: #define MFI_DDF_SRL_MIRRORED   0x01
                    749: #define MFI_DDF_SRL_CONCAT     0x02
                    750: #define MFI_DDF_SRL_SPANNED    0x03
                    751:        uint8_t                 mpa_stripe_size;
                    752:        uint8_t                 mpa_no_drv_per_span;
                    753:        uint8_t                 mpa_span_depth;
                    754:        uint8_t                 mpa_state;
                    755:        uint8_t                 mpa_init_state;
                    756:        uint8_t                 mpa_res[24];
                    757: } __packed;
                    758:
                    759: struct mfi_ld_span {
                    760:        u_quad_t                mls_start_block;
                    761:        u_quad_t                mls_no_blocks;
                    762:        uint16_t                mls_index;
                    763:        uint8_t                 mls_res[6];
                    764: } __packed;
                    765:
                    766: struct mfi_ld_cfg {
                    767:        struct mfi_ld_prop      mlc_prop;
                    768:        struct mfi_ld_parm      mlc_parm;
                    769:        struct mfi_ld_span      mlc_span[MFI_MAX_SPAN];
                    770: } __packed;
                    771:
                    772: struct mfi_ld_progress {
                    773:        uint32_t                mlp_in_prog;
                    774: #define MFI_LD_PROG_CC         0x01
                    775: #define MFI_LD_PROG_BGI                0x02
                    776: #define MFI_LD_PROG_FGI                0x04
                    777: #define MFI_LD_PROG_RECONSTRUCT        0x08
                    778:        struct mfi_progress     mlp_cc;
                    779:        struct mfi_progress     mlp_bgi;
                    780:        struct mfi_progress     mlp_fgi;
                    781:        struct mfi_progress     mlp_reconstruct;
                    782:        struct mfi_progress     mlp_res[4];
                    783: } __packed;
                    784:
                    785: struct mfi_ld_details {
                    786:        struct mfi_ld_cfg       mld_cfg;
                    787:        u_quad_t                mld_size;
                    788:        struct mfi_ld_progress  mld_progress;
                    789:        uint16_t                mld_clust_own_id;
                    790:        uint8_t                 mld_res1;
                    791:        uint8_t                 mld_res2;
                    792:        uint8_t                 mld_inq_page83[64];
                    793:        uint8_t                 mld_res[16];
                    794: } __packed;
                    795:
                    796: /* physical disk info from MR_DCMD_PD_GET_LIST */
                    797: struct mfi_pd_address {
                    798:        uint16_t                mpa_pd_id;
                    799:        uint16_t                mpa_enc_id;
                    800:        uint8_t                 mpa_enc_index;
                    801:        uint8_t                 mpa_enc_slot;
                    802:        uint8_t                 mpa_scsi_type;
                    803:        uint8_t                 mpa_port;
                    804:        u_quad_t                mpa_sas_address[2];
                    805: } __packed;
                    806:
                    807: struct mfi_pd_list {
                    808:        uint32_t                mpl_size;
                    809:        uint32_t                mpl_no_pd;
                    810:        struct mfi_pd_address   mpl_address[1];
                    811: } __packed;
                    812: #define MFI_PD_LIST_SIZE       (256 * sizeof(struct mfi_pd_address) + 8)
                    813:
                    814: struct mfi_pd {
                    815:        uint16_t                mfp_id;
                    816:        uint16_t                mfp_seq;
                    817: } __packed;
                    818:
                    819: struct mfi_pd_progress {
                    820:        uint32_t                mfp_in_prog;
                    821: #define MFI_PD_PROG_RBLD       0x01
                    822: #define MFI_PD_PROG_PR         0x02
                    823: #define MFI_PD_PROG_CLEAR      0x04
                    824:        struct mfi_progress     mfp_rebuild;
                    825:        struct mfi_progress     mfp_patrol_read;
                    826:        struct mfi_progress     mfp_clear;
                    827:        struct mfi_progress     mfp_res[4];
                    828: } __packed;
                    829:
                    830: struct mfi_pd_details {
                    831:        struct mfi_pd           mpd_pd;
                    832:        uint8_t                 mpd_inq_data[96];
                    833:        uint8_t                 mpd_inq_page83[64];
                    834:        uint8_t                 mpd_no_support;
                    835:        uint8_t                 mpd_scsy_type;
                    836:        uint8_t                 mpd_port;
                    837:        uint8_t                 mpd_speed;
                    838:        uint32_t                mpd_mediaerr_cnt;
                    839:        uint32_t                mpd_othererr_cnt;
                    840:        uint32_t                mpd_predfail_cnt;
                    841:        uint32_t                mpd_last_pred_event;
                    842:        uint16_t                mpd_fw_state;
                    843:        uint8_t                 mpd_rdy_for_remove;
                    844:        uint8_t                 mpd_link_speed;
                    845:        uint32_t                mpd_ddf_state;
                    846: #define MFI_DDF_GUID_FORCED    0x01
                    847: #define MFI_DDF_PART_OF_VD     0x02
                    848: #define MFI_DDF_GLOB_HOTSPARE  0x04
                    849: #define MFI_DDF_HOTSPARE       0x08
                    850: #define MFI_DDF_FOREIGN                0x10
                    851: #define MFI_DDF_TYPE_MASK      0xf000
                    852: #define MFI_DDF_TYPE_UNKNOWN   0x0000
                    853: #define MFI_DDF_TYPE_PAR_SCSI  0x1000
                    854: #define MFI_DDF_TYPE_SAS       0x2000
                    855: #define MFI_DDF_TYPE_SATA      0x3000
                    856: #define MFI_DDF_TYPE_FC                0x4000
                    857:        struct {
                    858:                uint8_t         mpp_cnt;
                    859:                uint8_t         mpp_severed;
                    860:                uint8_t         mpp_res[6];
                    861:                u_quad_t        mpp_sas_addr[4];
                    862:        } __packed mpd_path;
                    863:        u_quad_t                mpd_size;
                    864:        u_quad_t                mpd_no_coerce_size;
                    865:        u_quad_t                mpd_coerce_size;
                    866:        uint16_t                mpd_enc_id;
                    867:        uint8_t                 mpd_enc_idx;
                    868:        uint8_t                 mpd_enc_slot;
                    869:        struct mfi_pd_progress  mpd_progress;
                    870:        uint8_t                 mpd_bblock_full;
                    871:        uint8_t                 mpd_unusable;
                    872:        uint8_t                 mpd_res[218]; /* size is 512 */
                    873: } __packed;
                    874:
                    875: /* array configuration from MD_DCMD_CONF_GET */
                    876: struct mfi_array {
                    877:        u_quad_t                mar_smallest_pd;
                    878:        uint8_t                 mar_no_disk;
                    879:        uint8_t                 mar_res1;
                    880:        uint16_t                mar_array_ref;
                    881:        uint8_t                 mar_res2[20];
                    882:        struct {
                    883:                struct mfi_pd   mar_pd;
                    884:                uint16_t        mar_pd_state;
                    885: #define MFI_PD_UNCONFIG_GOOD   0x00
                    886: #define MFI_PD_UNCONFIG_BAD    0x01
                    887: #define MFI_PD_HOTSPARE                0x02
                    888: #define MFI_PD_OFFLINE         0x10
                    889: #define MFI_PD_FAILED          0x11
                    890: #define MFI_PD_REBUILD         0x14
                    891: #define MFI_PD_ONLINE          0x18
                    892:                uint8_t         mar_enc_pd;
                    893:                uint8_t         mar_enc_slot;
                    894:        } pd[MFI_MAX_PD_ARRAY];
                    895: } __packed;
                    896:
                    897: struct mfi_hotspare {
                    898:        struct mfi_pd   mhs_pd;
                    899:        uint8_t         mhs_type;
                    900: #define MFI_PD_HS_DEDICATED    0x01
                    901: #define MFI_PD_HS_REVERTIBLE   0x02
                    902: #define MFI_PD_HS_ENC_AFFINITY 0x04
                    903:        uint8_t         mhs_res[2];
                    904:        uint8_t         mhs_array_max;
                    905:        uint16_t        mhs_array_ref[MFI_MAX_ARRAY_DEDICATED];
                    906: } __packed;
                    907:
                    908: struct mfi_conf {
                    909:        uint32_t                mfc_size;
                    910:        uint16_t                mfc_no_array;
                    911:        uint16_t                mfc_array_size;
                    912:        uint16_t                mfc_no_ld;
                    913:        uint16_t                mfc_ld_size;
                    914:        uint16_t                mfc_no_hs;
                    915:        uint16_t                mfc_hs_size;
                    916:        uint8_t                 mfc_res[16];
                    917:        /*
                    918:         * XXX this is a ridiculous hack and does not reflect reality
                    919:         * Structures are actually indexed and therefore need pointer
                    920:         * math to reach.  We need the size of this structure first so
                    921:         * call it with the size of this structure and then use the returned
                    922:         * values to allocate memory and do the transfer of the whole structure
                    923:         * then calculate pointers to each of these structures.
                    924:         */
                    925:        struct mfi_array        mfc_array[1];
                    926:        struct mfi_ld_cfg       mfc_ld[1];
                    927:        struct mfi_hotspare     mfc_hs[1];
                    928: } __packed;

CVSweb