The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/ic/mfireg.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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;

Cache object: 5de8a8019b491551d7a485adda1a3825


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.