1 /*
   2  * mr_sas.h: header for mr_sas
   3  *
   4  * Solaris MegaRAID driver for SAS2.0 controllers
   5  * Copyright (c) 2008-2009, LSI Logic Corporation.
   6  * All rights reserved.
   7  *
   8  * Redistribution and use in source and binary forms, with or without
   9  * modification, are permitted provided that the following conditions are met:
  10  *
  11  * 1. Redistributions of source code must retain the above copyright notice,
  12  *    this list of conditions and the following disclaimer.
  13  *
  14  * 2. Redistributions in binary form must reproduce the above copyright notice,
  15  *    this list of conditions and the following disclaimer in the documentation
  16  *    and/or other materials provided with the distribution.
  17  *
  18  * 3. Neither the name of the author nor the names of its contributors may be
  19  *    used to endorse or promote products derived from this software without
  20  *    specific prior written permission.
  21  *
  22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  23  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  25  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  26  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  27  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
  29  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
  30  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  31  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  32  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  33  * DAMAGE.
  34  */
  35 
  36 /*
  37  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
  38  */
  39 #ifndef _MR_SAS_H_
  40 #define _MR_SAS_H_
  41 
  42 #ifdef  __cplusplus
  43 extern "C" {
  44 #endif
  45 
  46 #include <sys/scsi/scsi.h>
  47 #include "mr_sas_list.h"
  48 
  49 /*
  50  * MegaRAID SAS2.0 Driver meta data
  51  */
  52 #define MRSAS_VERSION                           "LSIv2.7"
  53 #define MRSAS_RELDATE                           "Apr 21, 2010"
  54 
  55 #define MRSAS_TRUE                              1
  56 #define MRSAS_FALSE                             0
  57 
  58 #define ADAPTER_RESET_NOT_REQUIRED              0
  59 #define ADAPTER_RESET_REQUIRED                  1
  60 
  61 /*
  62  * MegaRAID SAS2.0 device id conversion definitions.
  63  */
  64 #define INST2LSIRDCTL(x)                ((x) << INST_MINOR_SHIFT)
  65 
  66 /*
  67  * MegaRAID SAS2.0 supported controllers
  68  */
  69 #define PCI_DEVICE_ID_LSI_2108VDE               0x0078
  70 #define PCI_DEVICE_ID_LSI_2108V                 0x0079
  71 
  72 /*
  73  * Register Index for 2108 Controllers.
  74  */
  75 #define REGISTER_SET_IO_2108                    (2)
  76 
  77 #define MRSAS_MAX_SGE_CNT                       0x50
  78 
  79 #define MRSAS_IOCTL_DRIVER                      0x12341234
  80 #define MRSAS_IOCTL_FIRMWARE                    0x12345678
  81 #define MRSAS_IOCTL_AEN                         0x87654321
  82 
  83 #define MRSAS_1_SECOND                          1000000
  84 
  85 /* Dynamic Enumeration Flags */
  86 #define MRSAS_PD_LUN            1
  87 #define MRSAS_LD_LUN            0
  88 #define MRSAS_PD_TGT_MAX        255
  89 #define MRSAS_GET_PD_MAX(s)     ((s)->mr_pd_max)
  90 #define WWN_STRLEN              17
  91 #define         APP_RESERVE_CMDS                32
  92 /*
  93  * =====================================
  94  * MegaRAID SAS2.0 MFI firmware definitions
  95  * =====================================
  96  */
  97 /*
  98  * MFI stands for  MegaRAID SAS2.0 FW Interface. This is just a moniker for
  99  * protocol between the software and firmware. Commands are issued using
 100  * "message frames"
 101  */
 102 
 103 /*
 104  * FW posts its state in upper 4 bits of outbound_msg_0 register
 105  */
 106 #define MFI_STATE_SHIFT                         28
 107 #define MFI_STATE_MASK                          ((uint32_t)0xF<<MFI_STATE_SHIFT)
 108 #define MFI_STATE_UNDEFINED                     ((uint32_t)0x0<<MFI_STATE_SHIFT)
 109 #define MFI_STATE_BB_INIT                       ((uint32_t)0x1<<MFI_STATE_SHIFT)
 110 #define MFI_STATE_FW_INIT                       ((uint32_t)0x4<<MFI_STATE_SHIFT)
 111 #define MFI_STATE_WAIT_HANDSHAKE                ((uint32_t)0x6<<MFI_STATE_SHIFT)
 112 #define MFI_STATE_FW_INIT_2                     ((uint32_t)0x7<<MFI_STATE_SHIFT)
 113 #define MFI_STATE_DEVICE_SCAN                   ((uint32_t)0x8<<MFI_STATE_SHIFT)
 114 #define MFI_STATE_BOOT_MESSAGE_PENDING          ((uint32_t)0x9<<MFI_STATE_SHIFT)
 115 #define MFI_STATE_FLUSH_CACHE                   ((uint32_t)0xA<<MFI_STATE_SHIFT)
 116 #define MFI_STATE_READY                         ((uint32_t)0xB<<MFI_STATE_SHIFT)
 117 #define MFI_STATE_OPERATIONAL                   ((uint32_t)0xC<<MFI_STATE_SHIFT)
 118 #define MFI_STATE_FAULT                         ((uint32_t)0xF<<MFI_STATE_SHIFT)
 119 
 120 #define MRMFI_FRAME_SIZE                        64
 121 
 122 /*
 123  * During FW init, clear pending cmds & reset state using inbound_msg_0
 124  *
 125  * ABORT        : Abort all pending cmds
 126  * READY        : Move from OPERATIONAL to READY state; discard queue info
 127  * MFIMODE      : Discard (possible) low MFA posted in 64-bit mode (??)
 128  * CLR_HANDSHAKE: FW is waiting for HANDSHAKE from BIOS or Driver
 129  */
 130 #define MFI_INIT_ABORT                          0x00000001
 131 #define MFI_INIT_READY                          0x00000002
 132 #define MFI_INIT_MFIMODE                        0x00000004
 133 #define MFI_INIT_CLEAR_HANDSHAKE                0x00000008
 134 #define MFI_INIT_HOTPLUG                        0x00000010
 135 #define MFI_STOP_ADP                            0x00000020
 136 #define MFI_RESET_FLAGS         MFI_INIT_READY|MFI_INIT_MFIMODE|MFI_INIT_ABORT
 137 
 138 /*
 139  * MFI frame flags
 140  */
 141 #define MFI_FRAME_POST_IN_REPLY_QUEUE           0x0000
 142 #define MFI_FRAME_DONT_POST_IN_REPLY_QUEUE      0x0001
 143 #define MFI_FRAME_SGL32                         0x0000
 144 #define MFI_FRAME_SGL64                         0x0002
 145 #define MFI_FRAME_SENSE32                       0x0000
 146 #define MFI_FRAME_SENSE64                       0x0004
 147 #define MFI_FRAME_DIR_NONE                      0x0000
 148 #define MFI_FRAME_DIR_WRITE                     0x0008
 149 #define MFI_FRAME_DIR_READ                      0x0010
 150 #define MFI_FRAME_DIR_BOTH                      0x0018
 151 #define         MFI_FRAME_IEEE                  0x0020
 152 
 153 /*
 154  * Definition for cmd_status
 155  */
 156 #define MFI_CMD_STATUS_POLL_MODE                0xFF
 157 #define MFI_CMD_STATUS_SYNC_MODE                0xFF
 158 
 159 /*
 160  * MFI command opcodes
 161  */
 162 #define MFI_CMD_OP_INIT                         0x00
 163 #define MFI_CMD_OP_LD_READ                      0x01
 164 #define MFI_CMD_OP_LD_WRITE                     0x02
 165 #define MFI_CMD_OP_LD_SCSI                      0x03
 166 #define MFI_CMD_OP_PD_SCSI                      0x04
 167 #define MFI_CMD_OP_DCMD                         0x05
 168 #define MFI_CMD_OP_ABORT                        0x06
 169 #define MFI_CMD_OP_SMP                          0x07
 170 #define MFI_CMD_OP_STP                          0x08
 171 
 172 #define MR_DCMD_CTRL_GET_INFO                   0x01010000
 173 
 174 #define MR_DCMD_CTRL_CACHE_FLUSH                0x01101000
 175 #define MR_FLUSH_CTRL_CACHE                     0x01
 176 #define MR_FLUSH_DISK_CACHE                     0x02
 177 
 178 #define MR_DCMD_CTRL_SHUTDOWN                   0x01050000
 179 #define MRSAS_ENABLE_DRIVE_SPINDOWN             0x01
 180 
 181 #define MR_DCMD_CTRL_EVENT_GET_INFO             0x01040100
 182 #define MR_DCMD_CTRL_EVENT_GET                  0x01040300
 183 #define MR_DCMD_CTRL_EVENT_WAIT                 0x01040500
 184 #define MR_DCMD_LD_GET_PROPERTIES               0x03030000
 185 #define MR_DCMD_PD_GET_INFO                     0x02020000
 186 
 187 /*
 188  * Solaris Specific MAX values
 189  */
 190 #define MAX_SGL                                 24
 191 /*
 192  * MFI command completion codes
 193  */
 194 enum MFI_STAT {
 195         MFI_STAT_OK                             = 0x00,
 196         MFI_STAT_INVALID_CMD                    = 0x01,
 197         MFI_STAT_INVALID_DCMD                   = 0x02,
 198         MFI_STAT_INVALID_PARAMETER              = 0x03,
 199         MFI_STAT_INVALID_SEQUENCE_NUMBER        = 0x04,
 200         MFI_STAT_ABORT_NOT_POSSIBLE             = 0x05,
 201         MFI_STAT_APP_HOST_CODE_NOT_FOUND        = 0x06,
 202         MFI_STAT_APP_IN_USE                     = 0x07,
 203         MFI_STAT_APP_NOT_INITIALIZED            = 0x08,
 204         MFI_STAT_ARRAY_INDEX_INVALID            = 0x09,
 205         MFI_STAT_ARRAY_ROW_NOT_EMPTY            = 0x0a,
 206         MFI_STAT_CONFIG_RESOURCE_CONFLICT       = 0x0b,
 207         MFI_STAT_DEVICE_NOT_FOUND               = 0x0c,
 208         MFI_STAT_DRIVE_TOO_SMALL                = 0x0d,
 209         MFI_STAT_FLASH_ALLOC_FAIL               = 0x0e,
 210         MFI_STAT_FLASH_BUSY                     = 0x0f,
 211         MFI_STAT_FLASH_ERROR                    = 0x10,
 212         MFI_STAT_FLASH_IMAGE_BAD                = 0x11,
 213         MFI_STAT_FLASH_IMAGE_INCOMPLETE         = 0x12,
 214         MFI_STAT_FLASH_NOT_OPEN                 = 0x13,
 215         MFI_STAT_FLASH_NOT_STARTED              = 0x14,
 216         MFI_STAT_FLUSH_FAILED                   = 0x15,
 217         MFI_STAT_HOST_CODE_NOT_FOUNT            = 0x16,
 218         MFI_STAT_LD_CC_IN_PROGRESS              = 0x17,
 219         MFI_STAT_LD_INIT_IN_PROGRESS            = 0x18,
 220         MFI_STAT_LD_LBA_OUT_OF_RANGE            = 0x19,
 221         MFI_STAT_LD_MAX_CONFIGURED              = 0x1a,
 222         MFI_STAT_LD_NOT_OPTIMAL                 = 0x1b,
 223         MFI_STAT_LD_RBLD_IN_PROGRESS            = 0x1c,
 224         MFI_STAT_LD_RECON_IN_PROGRESS           = 0x1d,
 225         MFI_STAT_LD_WRONG_RAID_LEVEL            = 0x1e,
 226         MFI_STAT_MAX_SPARES_EXCEEDED            = 0x1f,
 227         MFI_STAT_MEMORY_NOT_AVAILABLE           = 0x20,
 228         MFI_STAT_MFC_HW_ERROR                   = 0x21,
 229         MFI_STAT_NO_HW_PRESENT                  = 0x22,
 230         MFI_STAT_NOT_FOUND                      = 0x23,
 231         MFI_STAT_NOT_IN_ENCL                    = 0x24,
 232         MFI_STAT_PD_CLEAR_IN_PROGRESS           = 0x25,
 233         MFI_STAT_PD_TYPE_WRONG                  = 0x26,
 234         MFI_STAT_PR_DISABLED                    = 0x27,
 235         MFI_STAT_ROW_INDEX_INVALID              = 0x28,
 236         MFI_STAT_SAS_CONFIG_INVALID_ACTION      = 0x29,
 237         MFI_STAT_SAS_CONFIG_INVALID_DATA        = 0x2a,
 238         MFI_STAT_SAS_CONFIG_INVALID_PAGE        = 0x2b,
 239         MFI_STAT_SAS_CONFIG_INVALID_TYPE        = 0x2c,
 240         MFI_STAT_SCSI_DONE_WITH_ERROR           = 0x2d,
 241         MFI_STAT_SCSI_IO_FAILED                 = 0x2e,
 242         MFI_STAT_SCSI_RESERVATION_CONFLICT      = 0x2f,
 243         MFI_STAT_SHUTDOWN_FAILED                = 0x30,
 244         MFI_STAT_TIME_NOT_SET                   = 0x31,
 245         MFI_STAT_WRONG_STATE                    = 0x32,
 246         MFI_STAT_LD_OFFLINE                     = 0x33,
 247         /* UNUSED: 0x34 to 0xfe */
 248         MFI_STAT_INVALID_STATUS                 = 0xFF
 249 };
 250 
 251 enum MR_EVT_CLASS {
 252         MR_EVT_CLASS_DEBUG              = -2,
 253         MR_EVT_CLASS_PROGRESS           = -1,
 254         MR_EVT_CLASS_INFO               =  0,
 255         MR_EVT_CLASS_WARNING            =  1,
 256         MR_EVT_CLASS_CRITICAL           =  2,
 257         MR_EVT_CLASS_FATAL              =  3,
 258         MR_EVT_CLASS_DEAD               =  4
 259 };
 260 
 261 enum MR_EVT_LOCALE {
 262         MR_EVT_LOCALE_LD                = 0x0001,
 263         MR_EVT_LOCALE_PD                = 0x0002,
 264         MR_EVT_LOCALE_ENCL              = 0x0004,
 265         MR_EVT_LOCALE_BBU               = 0x0008,
 266         MR_EVT_LOCALE_SAS               = 0x0010,
 267         MR_EVT_LOCALE_CTRL              = 0x0020,
 268         MR_EVT_LOCALE_CONFIG            = 0x0040,
 269         MR_EVT_LOCALE_CLUSTER           = 0x0080,
 270         MR_EVT_LOCALE_ALL               = 0xffff
 271 };
 272 
 273 #define MR_EVT_CFG_CLEARED              0x0004
 274 #define MR_EVT_LD_CREATED               0x008a
 275 #define MR_EVT_LD_DELETED               0x008b
 276 #define MR_EVT_PD_REMOVED_EXT           0x00f8
 277 #define MR_EVT_PD_INSERTED_EXT          0x00f7
 278 
 279 enum LD_STATE {
 280         LD_OFFLINE              = 0,
 281         LD_PARTIALLY_DEGRADED   = 1,
 282         LD_DEGRADED             = 2,
 283         LD_OPTIMAL              = 3,
 284         LD_INVALID              = 0xFF
 285 };
 286 
 287 enum MRSAS_EVT {
 288         MRSAS_EVT_CONFIG_TGT    = 0,
 289         MRSAS_EVT_UNCONFIG_TGT  = 1,
 290         MRSAS_EVT_UNCONFIG_SMP  = 2
 291 };
 292 
 293 #define DMA_OBJ_ALLOCATED       1
 294 #define DMA_OBJ_REALLOCATED     2
 295 #define DMA_OBJ_FREED           3
 296 
 297 /*
 298  * dma_obj_t    - Our DMA object
 299  * @param buffer        : kernel virtual address
 300  * @param size          : size of the data to be allocated
 301  * @param acc_handle    : access handle
 302  * @param dma_handle    : dma handle
 303  * @param dma_cookie    : scatter-gather list
 304  * @param dma_attr      : dma attributes for this buffer
 305  * Our DMA object. The caller must initialize the size and dma attributes
 306  * (dma_attr) fields before allocating the resources.
 307  */
 308 typedef struct {
 309         caddr_t                 buffer;
 310         uint32_t                size;
 311         ddi_acc_handle_t        acc_handle;
 312         ddi_dma_handle_t        dma_handle;
 313         ddi_dma_cookie_t        dma_cookie[MRSAS_MAX_SGE_CNT];
 314         ddi_dma_attr_t          dma_attr;
 315         uint8_t                 status;
 316         uint8_t                 reserved[3];
 317 } dma_obj_t;
 318 
 319 struct mrsas_eventinfo {
 320         struct mrsas_instance   *instance;
 321         int                     tgt;
 322         int                     lun;
 323         int                     event;
 324 };
 325 
 326 struct mrsas_ld {
 327         dev_info_t              *dip;
 328         uint8_t                 lun_type;
 329         uint8_t                 reserved[3];
 330 };
 331 
 332 struct mrsas_pd {
 333         dev_info_t              *dip;
 334         uint8_t                 lun_type;
 335         uint8_t                 dev_id;
 336         uint8_t                 flags;
 337         uint8_t                 reserved;
 338 };
 339 
 340 struct mrsas_pd_info {
 341         uint16_t        deviceId;
 342         uint16_t        seqNum;
 343         uint8_t         inquiryData[96];
 344         uint8_t         vpdPage83[64];
 345         uint8_t         notSupported;
 346         uint8_t         scsiDevType;
 347         uint8_t         a;
 348         uint8_t         device_speed;
 349         uint32_t        mediaerrcnt;
 350         uint32_t        other;
 351         uint32_t        pred;
 352         uint32_t        lastpred;
 353         uint16_t        fwState;
 354         uint8_t         disabled;
 355         uint8_t         linkspwwd;
 356         uint32_t        ddfType;
 357         struct {
 358                 uint8_t count;
 359                 uint8_t isPathBroken;
 360                 uint8_t connectorIndex[2];
 361                 uint8_t reserved[4];
 362                 uint64_t sasAddr[2];
 363                 uint8_t reserved2[16];
 364         } pathInfo;
 365 };
 366 
 367 typedef struct mrsas_instance {
 368         uint32_t        *producer;
 369         uint32_t        *consumer;
 370 
 371         uint32_t        *reply_queue;
 372         dma_obj_t       mfi_internal_dma_obj;
 373         uint16_t        adapterresetinprogress;
 374         uint16_t        deadadapter;
 375         uint8_t         init_id;
 376         uint8_t         flag_ieee;
 377         uint8_t         disable_online_ctrl_reset;
 378         uint8_t         fw_fault_count_after_ocr;
 379 
 380         uint16_t        max_num_sge;
 381         uint16_t        max_fw_cmds;
 382         uint32_t        max_sectors_per_req;
 383 
 384         struct mrsas_cmd **cmd_list;
 385         mlist_t         cmd_pool_list;
 386         kmutex_t        cmd_pool_mtx;
 387 
 388         mlist_t         app_cmd_pool_list;
 389         kmutex_t        app_cmd_pool_mtx;
 390         mlist_t         cmd_pend_list;
 391         kmutex_t        cmd_pend_mtx;
 392 
 393         dma_obj_t       mfi_evt_detail_obj;
 394         struct mrsas_cmd *aen_cmd;
 395 
 396         uint32_t        aen_seq_num;
 397         uint32_t        aen_class_locale_word;
 398 
 399         scsi_hba_tran_t         *tran;
 400 
 401         kcondvar_t      int_cmd_cv;
 402         kmutex_t        int_cmd_mtx;
 403 
 404         kcondvar_t      aen_cmd_cv;
 405         kmutex_t        aen_cmd_mtx;
 406 
 407         kcondvar_t      abort_cmd_cv;
 408         kmutex_t        abort_cmd_mtx;
 409 
 410         dev_info_t              *dip;
 411         ddi_acc_handle_t        pci_handle;
 412 
 413         timeout_id_t    timeout_id;
 414         uint32_t        unique_id;
 415         uint16_t        fw_outstanding;
 416         caddr_t         regmap;
 417         ddi_acc_handle_t        regmap_handle;
 418         uint8_t         isr_level;
 419         ddi_iblock_cookie_t     iblock_cookie;
 420         ddi_iblock_cookie_t     soft_iblock_cookie;
 421         ddi_softintr_t          soft_intr_id;
 422         uint8_t         softint_running;
 423         kmutex_t        completed_pool_mtx;
 424         mlist_t         completed_pool_list;
 425 
 426         caddr_t         internal_buf;
 427         uint32_t        internal_buf_dmac_add;
 428         uint32_t        internal_buf_size;
 429 
 430         uint16_t        vendor_id;
 431         uint16_t        device_id;
 432         uint16_t        subsysvid;
 433         uint16_t        subsysid;
 434         int             instance;
 435         int             baseaddress;
 436         char            iocnode[16];
 437 
 438         int             fm_capabilities;
 439 
 440         struct mrsas_func_ptr *func_ptr;
 441         /* MSI interrupts specific */
 442         ddi_intr_handle_t *intr_htable;
 443         int             intr_type;
 444         int             intr_cnt;
 445         size_t          intr_size;
 446         uint_t          intr_pri;
 447         int             intr_cap;
 448 
 449         ddi_taskq_t     *taskq;
 450         struct mrsas_ld *mr_ld_list;
 451         kmutex_t        ocr_flags_mtx;
 452 } mrsas_t;
 453 
 454 struct mrsas_func_ptr {
 455         int (*read_fw_status_reg)(struct mrsas_instance *);
 456         void (*issue_cmd)(struct mrsas_cmd *, struct mrsas_instance *);
 457         int (*issue_cmd_in_sync_mode)(struct mrsas_instance *,
 458             struct mrsas_cmd *);
 459         int (*issue_cmd_in_poll_mode)(struct mrsas_instance *,
 460             struct mrsas_cmd *);
 461         void (*enable_intr)(struct mrsas_instance *);
 462         void (*disable_intr)(struct mrsas_instance *);
 463         int (*intr_ack)(struct mrsas_instance *);
 464 };
 465 
 466 /*
 467  * ### Helper routines ###
 468  */
 469 
 470 /*
 471  * con_log() - console log routine
 472  * @param level         : indicates the severity of the message.
 473  * @fparam mt           : format string
 474  *
 475  * con_log displays the error messages on the console based on the current
 476  * debug level. Also it attaches the appropriate kernel severity level with
 477  * the message.
 478  *
 479  *
 480  * console messages debug levels
 481  */
 482 #define CL_NONE         0       /* No debug information */
 483 #define CL_TEST_OCR     1
 484 #define CL_ANN          2       /* print unconditionally, announcements */
 485 #define CL_ANN1         3       /* No o/p  */
 486 #define CL_DLEVEL1      4       /* debug level 1, informative */
 487 #define CL_DLEVEL2      5       /* debug level 2, verbose */
 488 #define CL_DLEVEL3      6       /* debug level 3, very verbose */
 489 
 490 
 491 #ifdef __SUNPRO_C
 492 #define __func__ ""
 493 #endif
 494 
 495 #define con_log(level, fmt) { if (debug_level_g >= level) cmn_err fmt; }
 496 
 497 /*
 498  * ### SCSA definitions ###
 499  */
 500 #define PKT2TGT(pkt)    ((pkt)->pkt_address.a_target)
 501 #define PKT2LUN(pkt)    ((pkt)->pkt_address.a_lun)
 502 #define PKT2TRAN(pkt)   ((pkt)->pkt_adress.a_hba_tran)
 503 #define ADDR2TRAN(ap)   ((ap)->a_hba_tran)
 504 
 505 #define TRAN2MR(tran)   (struct mrsas_instance *)(tran)->tran_hba_private)
 506 #define ADDR2MR(ap)     (TRAN2MR(ADDR2TRAN(ap))
 507 
 508 #define PKT2CMD(pkt)    ((struct scsa_cmd *)(pkt)->pkt_ha_private)
 509 #define CMD2PKT(sp)     ((sp)->cmd_pkt)
 510 #define PKT2REQ(pkt)    (&(PKT2CMD(pkt)->request))
 511 
 512 #define CMD2ADDR(cmd)   (&CMD2PKT(cmd)->pkt_address)
 513 #define CMD2TRAN(cmd)   (CMD2PKT(cmd)->pkt_address.a_hba_tran)
 514 #define CMD2MR(cmd)     (TRAN2MR(CMD2TRAN(cmd)))
 515 
 516 #define CFLAG_DMAVALID          0x0001  /* requires a dma operation */
 517 #define CFLAG_DMASEND           0x0002  /* Transfer from the device */
 518 #define CFLAG_CONSISTENT        0x0040  /* consistent data transfer */
 519 
 520 /*
 521  * ### Data structures for ioctl inteface and internal commands ###
 522  */
 523 
 524 /*
 525  * Data direction flags
 526  */
 527 #define UIOC_RD         0x00001
 528 #define UIOC_WR         0x00002
 529 
 530 #define SCP2HOST(scp)           (scp)->device->host       /* to host */
 531 #define SCP2HOSTDATA(scp)       SCP2HOST(scp)->hostdata      /* to soft state */
 532 #define SCP2CHANNEL(scp)        (scp)->device->channel    /* to channel */
 533 #define SCP2TARGET(scp)         (scp)->device->id /* to target */
 534 #define SCP2LUN(scp)            (scp)->device->lun        /* to LUN */
 535 
 536 #define SCSIHOST2ADAP(host)     (((caddr_t *)(host->hostdata))[0])
 537 #define SCP2ADAPTER(scp)                                \
 538         (struct mrsas_instance *)SCSIHOST2ADAP(SCP2HOST(scp))
 539 
 540 #define MRDRV_IS_LOGICAL_SCSA(instance, acmd)           \
 541         (acmd->device_id < MRDRV_MAX_LD) ? 1 : 0
 542 #define MRDRV_IS_LOGICAL(ap)                            \
 543         ((ap->a_target < MRDRV_MAX_LD) && (ap->a_lun == 0)) ? 1 : 0
 544 #define MAP_DEVICE_ID(instance, ap)                     \
 545         (ap->a_target)
 546 
 547 #define HIGH_LEVEL_INTR                 1
 548 #define NORMAL_LEVEL_INTR               0
 549 
 550 #define         IO_RETRY_COUNT          3
 551 #define         MAX_FW_RESET_COUNT      3
 552 
 553 /*
 554  * scsa_cmd  - Per-command mr private data
 555  * @param cmd_dmahandle         :  dma handle
 556  * @param cmd_dmacookies        :  current dma cookies
 557  * @param cmd_pkt               :  scsi_pkt reference
 558  * @param cmd_dmacount          :  dma count
 559  * @param cmd_cookie            :  next cookie
 560  * @param cmd_ncookies          :  cookies per window
 561  * @param cmd_cookiecnt         :  cookies per sub-win
 562  * @param cmd_nwin              :  number of dma windows
 563  * @param cmd_curwin            :  current dma window
 564  * @param cmd_dma_offset        :  current window offset
 565  * @param cmd_dma_len           :  current window length
 566  * @param cmd_flags             :  private flags
 567  * @param cmd_cdblen            :  length of cdb
 568  * @param cmd_scblen            :  length of scb
 569  * @param cmd_buf               :  command buffer
 570  * @param channel               :  channel for scsi sub-system
 571  * @param target                :  target for scsi sub-system
 572  * @param lun                   :  LUN for scsi sub-system
 573  *
 574  * - Allocated at same time as scsi_pkt by scsi_hba_pkt_alloc(9E)
 575  * - Pointed to by pkt_ha_private field in scsi_pkt
 576  */
 577 struct scsa_cmd {
 578         ddi_dma_handle_t        cmd_dmahandle;
 579         ddi_dma_cookie_t        cmd_dmacookies[MRSAS_MAX_SGE_CNT];
 580         struct scsi_pkt         *cmd_pkt;
 581         ulong_t                 cmd_dmacount;
 582         uint_t                  cmd_cookie;
 583         uint_t                  cmd_ncookies;
 584         uint_t                  cmd_cookiecnt;
 585         uint_t                  cmd_nwin;
 586         uint_t                  cmd_curwin;
 587         off_t                   cmd_dma_offset;
 588         ulong_t                 cmd_dma_len;
 589         ulong_t                 cmd_flags;
 590         uint_t                  cmd_cdblen;
 591         uint_t                  cmd_scblen;
 592         struct buf              *cmd_buf;
 593         ushort_t                device_id;
 594         uchar_t                 islogical;
 595         uchar_t                 lun;
 596         struct mrsas_device     *mrsas_dev;
 597 };
 598 
 599 
 600 struct mrsas_cmd {
 601         union mrsas_frame       *frame;
 602         uint32_t                frame_phys_addr;
 603         uint8_t                 *sense;
 604         uint32_t                sense_phys_addr;
 605         dma_obj_t               frame_dma_obj;
 606         uint8_t                 frame_dma_obj_status;
 607 
 608         uint32_t                index;
 609         uint8_t                 sync_cmd;
 610         uint8_t                 cmd_status;
 611         uint16_t                abort_aen;
 612         mlist_t                 list;
 613         uint32_t                frame_count;
 614         struct scsa_cmd         *cmd;
 615         struct scsi_pkt         *pkt;
 616         uint16_t                retry_count_for_ocr;
 617         uint16_t                drv_pkt_time;
 618 };
 619 
 620 #define MAX_MGMT_ADAPTERS                       1024
 621 #define IOC_SIGNATURE                           "MR-SAS"
 622 
 623 #define IOC_CMD_FIRMWARE                        0x0
 624 #define MRSAS_DRIVER_IOCTL_COMMON               0xF0010000
 625 #define MRSAS_DRIVER_IOCTL_DRIVER_VERSION       0xF0010100
 626 #define MRSAS_DRIVER_IOCTL_PCI_INFORMATION      0xF0010200
 627 #define MRSAS_DRIVER_IOCTL_MRRAID_STATISTICS    0xF0010300
 628 
 629 
 630 #define MRSAS_MAX_SENSE_LENGTH                  32
 631 
 632 struct mrsas_mgmt_info {
 633 
 634         uint16_t                        count;
 635         struct mrsas_instance           *instance[MAX_MGMT_ADAPTERS];
 636         uint16_t                        map[MAX_MGMT_ADAPTERS];
 637         int                             max_index;
 638 };
 639 
 640 #pragma pack(1)
 641 
 642 /*
 643  * SAS controller properties
 644  */
 645 struct mrsas_ctrl_prop {
 646         uint16_t        seq_num;
 647         uint16_t        pred_fail_poll_interval;
 648         uint16_t        intr_throttle_count;
 649         uint16_t        intr_throttle_timeouts;
 650 
 651         uint8_t         rebuild_rate;
 652         uint8_t         patrol_read_rate;
 653         uint8_t         bgi_rate;
 654         uint8_t         cc_rate;
 655         uint8_t         recon_rate;
 656 
 657         uint8_t         cache_flush_interval;
 658 
 659         uint8_t         spinup_drv_count;
 660         uint8_t         spinup_delay;
 661 
 662         uint8_t         cluster_enable;
 663         uint8_t         coercion_mode;
 664         uint8_t         alarm_enable;
 665         uint8_t         reserved_1[13];
 666         uint32_t        on_off_properties;
 667         uint8_t         reserved_4[28];
 668 };
 669 
 670 
 671 /*
 672  * SAS controller information
 673  */
 674 struct mrsas_ctrl_info {
 675         /* PCI device information */
 676         struct {
 677                 uint16_t        vendor_id;
 678                 uint16_t        device_id;
 679                 uint16_t        sub_vendor_id;
 680                 uint16_t        sub_device_id;
 681                 uint8_t reserved[24];
 682         } pci;
 683 
 684         /* Host interface information */
 685         struct {
 686                 uint8_t PCIX            : 1;
 687                 uint8_t PCIE            : 1;
 688                 uint8_t iSCSI           : 1;
 689                 uint8_t SAS_3G          : 1;
 690                 uint8_t reserved_0      : 4;
 691                 uint8_t reserved_1[6];
 692                 uint8_t port_count;
 693                 uint64_t        port_addr[8];
 694         } host_interface;
 695 
 696         /* Device (backend) interface information */
 697         struct {
 698                 uint8_t SPI             : 1;
 699                 uint8_t SAS_3G          : 1;
 700                 uint8_t SATA_1_5G       : 1;
 701                 uint8_t SATA_3G         : 1;
 702                 uint8_t reserved_0      : 4;
 703                 uint8_t reserved_1[6];
 704                 uint8_t port_count;
 705                 uint64_t        port_addr[8];
 706         } device_interface;
 707 
 708         /* List of components residing in flash. All str are null terminated */
 709         uint32_t        image_check_word;
 710         uint32_t        image_component_count;
 711 
 712         struct {
 713                 char    name[8];
 714                 char    version[32];
 715                 char    build_date[16];
 716                 char    built_time[16];
 717         } image_component[8];
 718 
 719         /*
 720          * List of flash components that have been flashed on the card, but
 721          * are not in use, pending reset of the adapter. This list will be
 722          * empty if a flash operation has not occurred. All stings are null
 723          * terminated
 724          */
 725         uint32_t        pending_image_component_count;
 726 
 727         struct {
 728                 char    name[8];
 729                 char    version[32];
 730                 char    build_date[16];
 731                 char    build_time[16];
 732         } pending_image_component[8];
 733 
 734         uint8_t         max_arms;
 735         uint8_t         max_spans;
 736         uint8_t         max_arrays;
 737         uint8_t         max_lds;
 738 
 739         char            product_name[80];
 740         char            serial_no[32];
 741 
 742         /*
 743          * Other physical/controller/operation information. Indicates the
 744          * presence of the hardware
 745          */
 746         struct {
 747                 uint32_t        bbu             : 1;
 748                 uint32_t        alarm           : 1;
 749                 uint32_t        nvram           : 1;
 750                 uint32_t        uart            : 1;
 751                 uint32_t        reserved        : 28;
 752         } hw_present;
 753 
 754         uint32_t        current_fw_time;
 755 
 756         /* Maximum data transfer sizes */
 757         uint16_t                max_concurrent_cmds;
 758         uint16_t                max_sge_count;
 759         uint32_t                max_request_size;
 760 
 761         /* Logical and physical device counts */
 762         uint16_t                ld_present_count;
 763         uint16_t                ld_degraded_count;
 764         uint16_t                ld_offline_count;
 765 
 766         uint16_t                pd_present_count;
 767         uint16_t                pd_disk_present_count;
 768         uint16_t                pd_disk_pred_failure_count;
 769         uint16_t                pd_disk_failed_count;
 770 
 771         /* Memory size information */
 772         uint16_t                nvram_size;
 773         uint16_t                memory_size;
 774         uint16_t                flash_size;
 775 
 776         /* Error counters */
 777         uint16_t                mem_correctable_error_count;
 778         uint16_t                mem_uncorrectable_error_count;
 779 
 780         /* Cluster information */
 781         uint8_t         cluster_permitted;
 782         uint8_t         cluster_active;
 783         uint8_t         reserved_1[2];
 784 
 785         /* Controller capabilities structures */
 786         struct {
 787                 uint32_t        raid_level_0    : 1;
 788                 uint32_t        raid_level_1    : 1;
 789                 uint32_t        raid_level_5    : 1;
 790                 uint32_t        raid_level_1E   : 1;
 791                 uint32_t        reserved        : 28;
 792         } raid_levels;
 793 
 794         struct {
 795                 uint32_t        rbld_rate               : 1;
 796                 uint32_t        cc_rate                 : 1;
 797                 uint32_t        bgi_rate                : 1;
 798                 uint32_t        recon_rate              : 1;
 799                 uint32_t        patrol_rate             : 1;
 800                 uint32_t        alarm_control           : 1;
 801                 uint32_t        cluster_supported       : 1;
 802                 uint32_t        bbu                     : 1;
 803                 uint32_t        spanning_allowed        : 1;
 804                 uint32_t        dedicated_hotspares     : 1;
 805                 uint32_t        revertible_hotspares    : 1;
 806                 uint32_t        foreign_config_import   : 1;
 807                 uint32_t        self_diagnostic         : 1;
 808                 uint32_t        reserved                : 19;
 809         } adapter_operations;
 810 
 811         struct {
 812                 uint32_t        read_policy     : 1;
 813                 uint32_t        write_policy    : 1;
 814                 uint32_t        io_policy       : 1;
 815                 uint32_t        access_policy   : 1;
 816                 uint32_t        reserved        : 28;
 817         } ld_operations;
 818 
 819         struct {
 820                 uint8_t min;
 821                 uint8_t max;
 822                 uint8_t reserved[2];
 823         } stripe_size_operations;
 824 
 825         struct {
 826                 uint32_t        force_online    : 1;
 827                 uint32_t        force_offline   : 1;
 828                 uint32_t        force_rebuild   : 1;
 829                 uint32_t        reserved        : 29;
 830         } pd_operations;
 831 
 832         struct {
 833                 uint32_t        ctrl_supports_sas       : 1;
 834                 uint32_t        ctrl_supports_sata      : 1;
 835                 uint32_t        allow_mix_in_encl       : 1;
 836                 uint32_t        allow_mix_in_ld         : 1;
 837                 uint32_t        allow_sata_in_cluster   : 1;
 838                 uint32_t        reserved                : 27;
 839         } pd_mix_support;
 840 
 841         /* Include the controller properties (changeable items) */
 842         uint8_t                         reserved_2[12];
 843         struct mrsas_ctrl_prop          properties;
 844 
 845         uint8_t                         pad[0x800 - 0x640];
 846 };
 847 
 848 /*
 849  * ==================================
 850  * MegaRAID SAS2.0 driver definitions
 851  * ==================================
 852  */
 853 #define MRDRV_MAX_NUM_CMD                       1024
 854 
 855 #define MRDRV_MAX_PD_CHANNELS                   2
 856 #define MRDRV_MAX_LD_CHANNELS                   2
 857 #define MRDRV_MAX_CHANNELS                      (MRDRV_MAX_PD_CHANNELS + \
 858                                                 MRDRV_MAX_LD_CHANNELS)
 859 #define MRDRV_MAX_DEV_PER_CHANNEL               128
 860 #define MRDRV_DEFAULT_INIT_ID                   -1
 861 #define MRDRV_MAX_CMD_PER_LUN                   1000
 862 #define MRDRV_MAX_LUN                           1
 863 #define MRDRV_MAX_LD                            64
 864 
 865 #define MRDRV_RESET_WAIT_TIME                   300
 866 #define MRDRV_RESET_NOTICE_INTERVAL             5
 867 
 868 #define MRSAS_IOCTL_CMD                         0
 869 
 870 /*
 871  * FW can accept both 32 and 64 bit SGLs. We want to allocate 32/64 bit
 872  * SGLs based on the size of dma_addr_t
 873  */
 874 #define IS_DMA64                (sizeof (dma_addr_t) == 8)
 875 
 876 #define IB_MSG_0_OFF                    0x10    /* XScale */
 877 #define OB_MSG_0_OFF                    0x18    /* XScale */
 878 #define IB_DOORBELL_OFF                 0x20    /* XScale & ROC */
 879 #define OB_INTR_STATUS_OFF              0x30    /* XScale & ROC */
 880 #define OB_INTR_MASK_OFF                0x34    /* XScale & ROC */
 881 #define IB_QPORT_OFF                    0x40    /* XScale & ROC */
 882 #define OB_DOORBELL_CLEAR_OFF           0xA0    /* ROC */
 883 #define OB_SCRATCH_PAD_0_OFF            0xB0    /* ROC */
 884 #define OB_INTR_MASK                    0xFFFFFFFF
 885 #define OB_DOORBELL_CLEAR_MASK          0xFFFFFFFF
 886 #define         WRITE_SEQ_OFF                   0x000000FC
 887 #define         HOST_DIAG_OFF                   0x000000F8
 888 #define         DIAG_RESET_ADAPTER              0x00000004
 889 #define         DIAG_WRITE_ENABLE               0x00000080
 890 /*
 891  * All MFI register set macros accept mrsas_register_set*
 892  */
 893 #define WR_IB_WRITE_SEQ(v, instance)    ddi_put32((instance)->regmap_handle, \
 894         (uint32_t *)((uintptr_t)(instance)->regmap + WRITE_SEQ_OFF), (v))
 895 
 896 #define RD_OB_DRWE(instance)            ddi_get32((instance)->regmap_handle, \
 897         (uint32_t *)((uintptr_t)(instance)->regmap + HOST_DIAG_OFF))
 898 
 899 #define WR_IB_DRWE(v, instance)         ddi_put32((instance)->regmap_handle, \
 900         (uint32_t *)((uintptr_t)(instance)->regmap + HOST_DIAG_OFF), (v))
 901 
 902 #define WR_IB_MSG_0(v, instance)        ddi_put32((instance)->regmap_handle, \
 903         (uint32_t *)((uintptr_t)(instance)->regmap + IB_MSG_0_OFF), (v))
 904 
 905 #define RD_OB_MSG_0(instance)           ddi_get32((instance)->regmap_handle, \
 906         (uint32_t *)((uintptr_t)(instance)->regmap + OB_MSG_0_OFF))
 907 
 908 #define WR_IB_DOORBELL(v, instance)     ddi_put32((instance)->regmap_handle, \
 909         (uint32_t *)((uintptr_t)(instance)->regmap + IB_DOORBELL_OFF), (v))
 910 
 911 #define RD_IB_DOORBELL(instance)        ddi_get32((instance)->regmap_handle, \
 912         (uint32_t *)((uintptr_t)(instance)->regmap + IB_DOORBELL_OFF))
 913 
 914 #define WR_OB_INTR_STATUS(v, instance)  ddi_put32((instance)->regmap_handle, \
 915         (uint32_t *)((uintptr_t)(instance)->regmap + OB_INTR_STATUS_OFF), (v))
 916 
 917 #define RD_OB_INTR_STATUS(instance)     ddi_get32((instance)->regmap_handle, \
 918         (uint32_t *)((uintptr_t)(instance)->regmap + OB_INTR_STATUS_OFF))
 919 
 920 #define WR_OB_INTR_MASK(v, instance)    ddi_put32((instance)->regmap_handle, \
 921         (uint32_t *)((uintptr_t)(instance)->regmap + OB_INTR_MASK_OFF), (v))
 922 
 923 #define RD_OB_INTR_MASK(instance)       ddi_get32((instance)->regmap_handle, \
 924         (uint32_t *)((uintptr_t)(instance)->regmap + OB_INTR_MASK_OFF))
 925 
 926 #define WR_IB_QPORT(v, instance)        ddi_put32((instance)->regmap_handle, \
 927         (uint32_t *)((uintptr_t)(instance)->regmap + IB_QPORT_OFF), (v))
 928 
 929 #define WR_OB_DOORBELL_CLEAR(v, instance) ddi_put32((instance)->regmap_handle, \
 930         (uint32_t *)((uintptr_t)(instance)->regmap + OB_DOORBELL_CLEAR_OFF), \
 931         (v))
 932 
 933 #define RD_OB_SCRATCH_PAD_0(instance)   ddi_get32((instance)->regmap_handle, \
 934         (uint32_t *)((uintptr_t)(instance)->regmap + OB_SCRATCH_PAD_0_OFF))
 935 
 936 /*
 937  * When FW is in MFI_STATE_READY or MFI_STATE_OPERATIONAL, the state data
 938  * of Outbound Msg Reg 0 indicates max concurrent cmds supported, max SGEs
 939  * supported per cmd and if 64-bit MFAs (M64) is enabled or disabled.
 940  */
 941 #define MFI_OB_INTR_STATUS_MASK         0x00000002
 942 
 943 /*
 944  * This MFI_REPLY_2108_MESSAGE_INTR flag is used also
 945  * in enable_intr_ppc also. Hence bit 2, i.e. 0x4 has
 946  * been set in this flag along with bit 1.
 947  */
 948 #define MFI_REPLY_2108_MESSAGE_INTR             0x00000001
 949 #define MFI_REPLY_2108_MESSAGE_INTR_MASK        0x00000005
 950 
 951 #define MFI_POLL_TIMEOUT_SECS           60
 952 
 953 #define MFI_ENABLE_INTR(instance)  ddi_put32((instance)->regmap_handle, \
 954         (uint32_t *)((uintptr_t)(instance)->regmap + OB_INTR_MASK_OFF), 1)
 955 #define MFI_DISABLE_INTR(instance)                                      \
 956 {                                                                       \
 957         uint32_t disable = 1;                                           \
 958         uint32_t mask =  ddi_get32((instance)->regmap_handle,                \
 959             (uint32_t *)((uintptr_t)(instance)->regmap + OB_INTR_MASK_OFF));\
 960         mask &= ~disable;                                           \
 961         ddi_put32((instance)->regmap_handle, (uint32_t *)            \
 962             (uintptr_t)((instance)->regmap + OB_INTR_MASK_OFF), mask);       \
 963 }
 964 
 965 /* By default, the firmware programs for 8 Kbytes of memory */
 966 #define DEFAULT_MFI_MEM_SZ      8192
 967 #define MINIMUM_MFI_MEM_SZ      4096
 968 
 969 /* DCMD Message Frame MAILBOX0-11 */
 970 #define DCMD_MBOX_SZ            12
 971 
 972 /*
 973  * on_off_property of mrsas_ctrl_prop
 974  * bit0-9, 11-31 are reserved
 975  */
 976 #define DISABLE_OCR_PROP_FLAG   0x00000400 /* bit 10 */
 977 
 978 struct mrsas_register_set {
 979         uint32_t        reserved_0[4];
 980 
 981         uint32_t        inbound_msg_0;
 982         uint32_t        inbound_msg_1;
 983         uint32_t        outbound_msg_0;
 984         uint32_t        outbound_msg_1;
 985 
 986         uint32_t        inbound_doorbell;
 987         uint32_t        inbound_intr_status;
 988         uint32_t        inbound_intr_mask;
 989 
 990         uint32_t        outbound_doorbell;
 991         uint32_t        outbound_intr_status;
 992         uint32_t        outbound_intr_mask;
 993 
 994         uint32_t        reserved_1[2];
 995 
 996         uint32_t        inbound_queue_port;
 997         uint32_t        outbound_queue_port;
 998 
 999         uint32_t        reserved_2[22];
1000 
1001         uint32_t        outbound_doorbell_clear;
1002 
1003         uint32_t        reserved_3[3];
1004 
1005         uint32_t        outbound_scratch_pad;
1006 
1007         uint32_t        reserved_4[3];
1008 
1009         uint32_t        inbound_low_queue_port;
1010 
1011         uint32_t        inbound_high_queue_port;
1012 
1013         uint32_t        reserved_5;
1014         uint32_t        index_registers[820];
1015 };
1016 
1017 struct mrsas_sge32 {
1018         uint32_t        phys_addr;
1019         uint32_t        length;
1020 };
1021 
1022 struct mrsas_sge64 {
1023         uint64_t        phys_addr;
1024         uint32_t        length;
1025 };
1026 
1027 struct mrsas_sge_ieee {
1028         uint64_t        phys_addr;
1029         uint32_t        length;
1030         uint32_t        flag;
1031 };
1032 
1033 union mrsas_sgl {
1034         struct mrsas_sge32      sge32[1];
1035         struct mrsas_sge64      sge64[1];
1036         struct mrsas_sge_ieee   sge_ieee[1];
1037 };
1038 
1039 struct mrsas_header {
1040         uint8_t         cmd;
1041         uint8_t         sense_len;
1042         uint8_t         cmd_status;
1043         uint8_t         scsi_status;
1044 
1045         uint8_t         target_id;
1046         uint8_t         lun;
1047         uint8_t         cdb_len;
1048         uint8_t         sge_count;
1049 
1050         uint32_t        context;
1051         uint8_t         req_id;
1052         uint8_t         msgvector;
1053         uint16_t        pad_0;
1054 
1055         uint16_t        flags;
1056         uint16_t        timeout;
1057         uint32_t        data_xferlen;
1058 };
1059 
1060 union mrsas_sgl_frame {
1061         struct mrsas_sge32      sge32[8];
1062         struct mrsas_sge64      sge64[5];
1063 };
1064 
1065 struct mrsas_init_frame {
1066         uint8_t         cmd;
1067         uint8_t         reserved_0;
1068         uint8_t         cmd_status;
1069 
1070         uint8_t         reserved_1;
1071         uint32_t        reserved_2;
1072 
1073         uint32_t        context;
1074         uint8_t         req_id;
1075         uint8_t         msgvector;
1076         uint16_t        pad_0;
1077 
1078         uint16_t        flags;
1079         uint16_t        reserved_3;
1080         uint32_t        data_xfer_len;
1081 
1082         uint32_t        queue_info_new_phys_addr_lo;
1083         uint32_t        queue_info_new_phys_addr_hi;
1084         uint32_t        queue_info_old_phys_addr_lo;
1085         uint32_t        queue_info_old_phys_addr_hi;
1086 
1087         uint32_t        reserved_4[6];
1088 };
1089 
1090 struct mrsas_init_queue_info {
1091         uint32_t                init_flags;
1092         uint32_t                reply_queue_entries;
1093 
1094         uint32_t                reply_queue_start_phys_addr_lo;
1095         uint32_t                reply_queue_start_phys_addr_hi;
1096         uint32_t                producer_index_phys_addr_lo;
1097         uint32_t                producer_index_phys_addr_hi;
1098         uint32_t                consumer_index_phys_addr_lo;
1099         uint32_t                consumer_index_phys_addr_hi;
1100 };
1101 
1102 struct mrsas_io_frame {
1103         uint8_t                 cmd;
1104         uint8_t                 sense_len;
1105         uint8_t                 cmd_status;
1106         uint8_t                 scsi_status;
1107 
1108         uint8_t                 target_id;
1109         uint8_t                 access_byte;
1110         uint8_t                 reserved_0;
1111         uint8_t                 sge_count;
1112 
1113         uint32_t                context;
1114         uint8_t                 req_id;
1115         uint8_t                 msgvector;
1116         uint16_t                pad_0;
1117 
1118         uint16_t                flags;
1119         uint16_t                timeout;
1120         uint32_t                lba_count;
1121 
1122         uint32_t                sense_buf_phys_addr_lo;
1123         uint32_t                sense_buf_phys_addr_hi;
1124 
1125         uint32_t                start_lba_lo;
1126         uint32_t                start_lba_hi;
1127 
1128         union mrsas_sgl         sgl;
1129 };
1130 
1131 struct mrsas_pthru_frame {
1132         uint8_t                 cmd;
1133         uint8_t                 sense_len;
1134         uint8_t                 cmd_status;
1135         uint8_t                 scsi_status;
1136 
1137         uint8_t                 target_id;
1138         uint8_t                 lun;
1139         uint8_t                 cdb_len;
1140         uint8_t                 sge_count;
1141 
1142         uint32_t                context;
1143         uint8_t                 req_id;
1144         uint8_t                 msgvector;
1145         uint16_t                pad_0;
1146 
1147         uint16_t                flags;
1148         uint16_t                timeout;
1149         uint32_t                data_xfer_len;
1150 
1151         uint32_t                sense_buf_phys_addr_lo;
1152         uint32_t                sense_buf_phys_addr_hi;
1153 
1154         uint8_t                 cdb[16];
1155         union mrsas_sgl         sgl;
1156 };
1157 
1158 struct mrsas_dcmd_frame {
1159         uint8_t                 cmd;
1160         uint8_t                 reserved_0;
1161         uint8_t                 cmd_status;
1162         uint8_t                 reserved_1[4];
1163         uint8_t                 sge_count;
1164 
1165         uint32_t                context;
1166         uint8_t                 req_id;
1167         uint8_t                 msgvector;
1168         uint16_t                pad_0;
1169 
1170         uint16_t                flags;
1171         uint16_t                timeout;
1172 
1173         uint32_t                data_xfer_len;
1174         uint32_t                opcode;
1175 
1176         union {
1177                 uint8_t b[DCMD_MBOX_SZ];
1178                 uint16_t s[6];
1179                 uint32_t w[3];
1180         } mbox;
1181 
1182         union mrsas_sgl         sgl;
1183 };
1184 
1185 struct mrsas_abort_frame {
1186         uint8_t         cmd;
1187         uint8_t         reserved_0;
1188         uint8_t         cmd_status;
1189 
1190         uint8_t         reserved_1;
1191         uint32_t        reserved_2;
1192 
1193         uint32_t        context;
1194         uint8_t         req_id;
1195         uint8_t         msgvector;
1196         uint16_t        pad_0;
1197 
1198         uint16_t        flags;
1199         uint16_t        reserved_3;
1200         uint32_t        reserved_4;
1201 
1202         uint32_t        abort_context;
1203         uint32_t        pad_1;
1204 
1205         uint32_t        abort_mfi_phys_addr_lo;
1206         uint32_t        abort_mfi_phys_addr_hi;
1207 
1208         uint32_t        reserved_5[6];
1209 };
1210 
1211 struct mrsas_smp_frame {
1212         uint8_t         cmd;
1213         uint8_t         reserved_1;
1214         uint8_t         cmd_status;
1215         uint8_t         connection_status;
1216 
1217         uint8_t         reserved_2[3];
1218         uint8_t         sge_count;
1219 
1220         uint32_t        context;
1221         uint8_t         req_id;
1222         uint8_t         msgvector;
1223         uint16_t        pad_0;
1224 
1225         uint16_t        flags;
1226         uint16_t        timeout;
1227 
1228         uint32_t        data_xfer_len;
1229 
1230         uint64_t        sas_addr;
1231 
1232         union mrsas_sgl sgl[2];
1233 };
1234 
1235 struct mrsas_stp_frame {
1236         uint8_t         cmd;
1237         uint8_t         reserved_1;
1238         uint8_t         cmd_status;
1239         uint8_t         connection_status;
1240 
1241         uint8_t         target_id;
1242         uint8_t         reserved_2[2];
1243         uint8_t         sge_count;
1244 
1245         uint32_t        context;
1246         uint8_t         req_id;
1247         uint8_t         msgvector;
1248         uint16_t        pad_0;
1249 
1250         uint16_t        flags;
1251         uint16_t        timeout;
1252 
1253         uint32_t        data_xfer_len;
1254 
1255         uint16_t        fis[10];
1256         uint32_t        stp_flags;
1257         union mrsas_sgl sgl;
1258 };
1259 
1260 union mrsas_frame {
1261         struct mrsas_header             hdr;
1262         struct mrsas_init_frame         init;
1263         struct mrsas_io_frame           io;
1264         struct mrsas_pthru_frame        pthru;
1265         struct mrsas_dcmd_frame         dcmd;
1266         struct mrsas_abort_frame        abort;
1267         struct mrsas_smp_frame          smp;
1268         struct mrsas_stp_frame          stp;
1269 
1270         uint8_t                 raw_bytes[64];
1271 };
1272 
1273 typedef struct mrsas_pd_address {
1274         uint16_t        device_id;
1275         uint16_t        encl_id;
1276 
1277         union {
1278                 struct {
1279                         uint8_t encl_index;
1280                         uint8_t slot_number;
1281                 } pd_address;
1282                 struct {
1283                         uint8_t encl_position;
1284                         uint8_t encl_connector_index;
1285                 } encl_address;
1286         }address;
1287 
1288         uint8_t scsi_dev_type;
1289 
1290         union {
1291                 uint8_t         port_bitmap;
1292                 uint8_t         port_numbers;
1293         } connected;
1294 
1295         uint64_t                sas_addr[2];
1296 } mrsas_pd_address_t;
1297 
1298 union mrsas_evt_class_locale {
1299         struct {
1300                 uint16_t        locale;
1301                 uint8_t         reserved;
1302                 int8_t          class;
1303         } members;
1304 
1305         uint32_t        word;
1306 };
1307 
1308 struct mrsas_evt_log_info {
1309         uint32_t        newest_seq_num;
1310         uint32_t        oldest_seq_num;
1311         uint32_t        clear_seq_num;
1312         uint32_t        shutdown_seq_num;
1313         uint32_t        boot_seq_num;
1314 };
1315 
1316 struct mrsas_progress {
1317         uint16_t        progress;
1318         uint16_t        elapsed_seconds;
1319 };
1320 
1321 struct mrsas_evtarg_ld {
1322         uint16_t        target_id;
1323         uint8_t         ld_index;
1324         uint8_t         reserved;
1325 };
1326 
1327 struct mrsas_evtarg_pd {
1328         uint16_t        device_id;
1329         uint8_t         encl_index;
1330         uint8_t         slot_number;
1331 };
1332 
1333 struct mrsas_evt_detail {
1334         uint32_t        seq_num;
1335         uint32_t        time_stamp;
1336         uint32_t        code;
1337         union mrsas_evt_class_locale    cl;
1338         uint8_t         arg_type;
1339         uint8_t         reserved1[15];
1340 
1341         union {
1342                 struct {
1343                         struct mrsas_evtarg_pd  pd;
1344                         uint8_t                 cdb_length;
1345                         uint8_t                 sense_length;
1346                         uint8_t                 reserved[2];
1347                         uint8_t                 cdb[16];
1348                         uint8_t                 sense[64];
1349                 } cdbSense;
1350 
1351                 struct mrsas_evtarg_ld          ld;
1352 
1353                 struct {
1354                         struct mrsas_evtarg_ld  ld;
1355                         uint64_t                count;
1356                 } ld_count;
1357 
1358                 struct {
1359                         uint64_t                lba;
1360                         struct mrsas_evtarg_ld  ld;
1361                 } ld_lba;
1362 
1363                 struct {
1364                         struct mrsas_evtarg_ld  ld;
1365                         uint32_t                prevOwner;
1366                         uint32_t                newOwner;
1367                 } ld_owner;
1368 
1369                 struct {
1370                         uint64_t                ld_lba;
1371                         uint64_t                pd_lba;
1372                         struct mrsas_evtarg_ld  ld;
1373                         struct mrsas_evtarg_pd  pd;
1374                 } ld_lba_pd_lba;
1375 
1376                 struct {
1377                         struct mrsas_evtarg_ld  ld;
1378                         struct mrsas_progress   prog;
1379                 } ld_prog;
1380 
1381                 struct {
1382                         struct mrsas_evtarg_ld  ld;
1383                         uint32_t                prev_state;
1384                         uint32_t                new_state;
1385                 } ld_state;
1386 
1387                 struct {
1388                         uint64_t                strip;
1389                         struct mrsas_evtarg_ld  ld;
1390                 } ld_strip;
1391 
1392                 struct mrsas_evtarg_pd          pd;
1393 
1394                 struct {
1395                         struct mrsas_evtarg_pd  pd;
1396                         uint32_t                err;
1397                 } pd_err;
1398 
1399                 struct {
1400                         uint64_t                lba;
1401                         struct mrsas_evtarg_pd  pd;
1402                 } pd_lba;
1403 
1404                 struct {
1405                         uint64_t                lba;
1406                         struct mrsas_evtarg_pd  pd;
1407                         struct mrsas_evtarg_ld  ld;
1408                 } pd_lba_ld;
1409 
1410                 struct {
1411                         struct mrsas_evtarg_pd  pd;
1412                         struct mrsas_progress   prog;
1413                 } pd_prog;
1414 
1415                 struct {
1416                         struct mrsas_evtarg_pd  pd;
1417                         uint32_t                prevState;
1418                         uint32_t                newState;
1419                 } pd_state;
1420 
1421                 struct {
1422                         uint16_t        vendorId;
1423                         uint16_t        deviceId;
1424                         uint16_t        subVendorId;
1425                         uint16_t        subDeviceId;
1426                 } pci;
1427 
1428                 uint32_t        rate;
1429                 char            str[96];
1430 
1431                 struct {
1432                         uint32_t        rtc;
1433                         uint32_t        elapsedSeconds;
1434                 } time;
1435 
1436                 struct {
1437                         uint32_t        ecar;
1438                         uint32_t        elog;
1439                         char            str[64];
1440                 } ecc;
1441 
1442                 mrsas_pd_address_t      pd_addr;
1443 
1444                 uint8_t         b[96];
1445                 uint16_t        s[48];
1446                 uint32_t        w[24];
1447                 uint64_t        d[12];
1448         } args;
1449 
1450         char    description[128];
1451 
1452 };
1453 
1454 /* only 63 are usable by the application */
1455 #define MAX_LOGICAL_DRIVES                      64
1456 /* only 255 physical devices may be used */
1457 #define MAX_PHYSICAL_DEVICES                    256
1458 #define MAX_PD_PER_ENCLOSURE                    64
1459 /* maximum disks per array */
1460 #define MAX_ROW_SIZE                            32
1461 /* maximum spans per logical drive */
1462 #define MAX_SPAN_DEPTH                          8
1463 /* maximum number of arrays a hot spare may be dedicated to */
1464 #define MAX_ARRAYS_DEDICATED                    16
1465 /* maximum number of arrays which may exist */
1466 #define MAX_ARRAYS                              128
1467 /* maximum number of foreign configs that may ha managed at once */
1468 #define MAX_FOREIGN_CONFIGS                     8
1469 /* maximum spares (global and dedicated combined) */
1470 #define MAX_SPARES_FOR_THE_CONTROLLER           MAX_PHYSICAL_DEVICES
1471 /* maximum possible Target IDs (i.e. 0 to 63) */
1472 #define MAX_TARGET_ID                           63
1473 /* maximum number of supported enclosures */
1474 #define MAX_ENCLOSURES                          32
1475 /* maximum number of PHYs per controller */
1476 #define MAX_PHYS_PER_CONTROLLER                 16
1477 /* maximum number of LDs per array (due to DDF limitations) */
1478 #define MAX_LDS_PER_ARRAY                       16
1479 
1480 /*
1481  * -----------------------------------------------------------------------------
1482  * -----------------------------------------------------------------------------
1483  *
1484  * Logical Drive commands
1485  *
1486  * -----------------------------------------------------------------------------
1487  * -----------------------------------------------------------------------------
1488  */
1489 #define MR_DCMD_LD      0x03000000,     /* Logical Device (LD) opcodes */
1490 
1491 /*
1492  * Input:       dcmd.opcode     - MR_DCMD_LD_GET_LIST
1493  *              dcmd.mbox       - reserved
1494  *              dcmd.sge IN     - ptr to returned MR_LD_LIST structure
1495  * Desc:        Return the logical drive list structure
1496  * Status:      No error
1497  */
1498 
1499 /*
1500  * defines the logical drive reference structure
1501  */
1502 typedef union _MR_LD_REF {      /* LD reference structure */
1503         struct {
1504                 uint8_t targetId; /* LD target id (0 to MAX_TARGET_ID) */
1505                 uint8_t reserved; /* reserved for in line with MR_PD_REF */
1506                 uint16_t seqNum;  /* Sequence Number */
1507         } ld_ref;
1508         uint32_t ref;           /* shorthand reference to full 32-bits */
1509 } MR_LD_REF;                    /* 4 bytes */
1510 
1511 /*
1512  * defines the logical drive list structure
1513  */
1514 typedef struct _MR_LD_LIST {
1515         uint32_t        ldCount;        /* number of LDs */
1516         uint32_t        reserved;       /* pad to 8-byte boundary */
1517         struct {
1518                 MR_LD_REF ref;  /* LD reference */
1519                 uint8_t state;          /* current LD state (MR_LD_STATE) */
1520                 uint8_t reserved[3];    /* pad to 8-byte boundary */
1521                 uint64_t size;          /* LD size */
1522         } ldList[MAX_LOGICAL_DRIVES];
1523 } MR_LD_LIST;
1524 
1525 struct mrsas_drv_ver {
1526         uint8_t signature[12];
1527         uint8_t os_name[16];
1528         uint8_t os_ver[12];
1529         uint8_t drv_name[20];
1530         uint8_t drv_ver[32];
1531         uint8_t drv_rel_date[20];
1532 };
1533 
1534 #define PCI_TYPE0_ADDRESSES             6
1535 #define PCI_TYPE1_ADDRESSES             2
1536 #define PCI_TYPE2_ADDRESSES             5
1537 
1538 struct mrsas_pci_common_header {
1539         uint16_t        vendorID;               /* (ro) */
1540         uint16_t        deviceID;               /* (ro) */
1541         uint16_t        command;                /* Device control */
1542         uint16_t        status;
1543         uint8_t         revisionID;             /* (ro) */
1544         uint8_t         progIf;                 /* (ro) */
1545         uint8_t         subClass;               /* (ro) */
1546         uint8_t         baseClass;              /* (ro) */
1547         uint8_t         cacheLineSize;          /* (ro+) */
1548         uint8_t         latencyTimer;           /* (ro+) */
1549         uint8_t         headerType;             /* (ro) */
1550         uint8_t         bist;                   /* Built in self test */
1551 
1552         union {
1553             struct {
1554                 uint32_t        baseAddresses[PCI_TYPE0_ADDRESSES];
1555                 uint32_t        cis;
1556                 uint16_t        subVendorID;
1557                 uint16_t        subSystemID;
1558                 uint32_t        romBaseAddress;
1559                 uint8_t         capabilitiesPtr;
1560                 uint8_t         reserved1[3];
1561                 uint32_t        reserved2;
1562                 uint8_t         interruptLine;
1563                 uint8_t         interruptPin;   /* (ro) */
1564                 uint8_t         minimumGrant;   /* (ro) */
1565                 uint8_t         maximumLatency; /* (ro) */
1566             } type_0;
1567 
1568             struct {
1569                 uint32_t        baseAddresses[PCI_TYPE1_ADDRESSES];
1570                 uint8_t         primaryBus;
1571                 uint8_t         secondaryBus;
1572                 uint8_t         subordinateBus;
1573                 uint8_t         secondaryLatency;
1574                 uint8_t         ioBase;
1575                 uint8_t         ioLimit;
1576                 uint16_t        secondaryStatus;
1577                 uint16_t        memoryBase;
1578                 uint16_t        memoryLimit;
1579                 uint16_t        prefetchBase;
1580                 uint16_t        prefetchLimit;
1581                 uint32_t        prefetchBaseUpper32;
1582                 uint32_t        prefetchLimitUpper32;
1583                 uint16_t        ioBaseUpper16;
1584                 uint16_t        ioLimitUpper16;
1585                 uint8_t         capabilitiesPtr;
1586                 uint8_t         reserved1[3];
1587                 uint32_t        romBaseAddress;
1588                 uint8_t         interruptLine;
1589                 uint8_t         interruptPin;
1590                 uint16_t        bridgeControl;
1591             } type_1;
1592 
1593             struct {
1594                 uint32_t        socketRegistersBaseAddress;
1595                 uint8_t         capabilitiesPtr;
1596                 uint8_t         reserved;
1597                 uint16_t        secondaryStatus;
1598                 uint8_t         primaryBus;
1599                 uint8_t         secondaryBus;
1600                 uint8_t         subordinateBus;
1601                 uint8_t         secondaryLatency;
1602                 struct {
1603                         uint32_t        base;
1604                         uint32_t        limit;
1605                 } range[PCI_TYPE2_ADDRESSES-1];
1606                 uint8_t         interruptLine;
1607                 uint8_t         interruptPin;
1608                 uint16_t        bridgeControl;
1609             } type_2;
1610         } header;
1611 };
1612 
1613 struct mrsas_pci_link_capability {
1614         union {
1615             struct {
1616                 uint32_t linkSpeed              :4;
1617                 uint32_t linkWidth              :6;
1618                 uint32_t aspmSupport            :2;
1619                 uint32_t losExitLatency         :3;
1620                 uint32_t l1ExitLatency          :3;
1621                 uint32_t rsvdp                  :6;
1622                 uint32_t portNumber             :8;
1623             } bits;
1624 
1625             uint32_t asUlong;
1626         } cap;
1627 
1628 };
1629 
1630 struct mrsas_pci_link_status_capability {
1631         union {
1632             struct {
1633                 uint16_t linkSpeed              :4;
1634                 uint16_t negotiatedLinkWidth    :6;
1635                 uint16_t linkTrainingError      :1;
1636                 uint16_t linkTraning            :1;
1637                 uint16_t slotClockConfig        :1;
1638                 uint16_t rsvdZ                  :3;
1639             } bits;
1640 
1641             uint16_t asUshort;
1642         } stat_cap;
1643 
1644         uint16_t reserved;
1645 
1646 };
1647 
1648 struct mrsas_pci_capabilities {
1649         struct mrsas_pci_link_capability        linkCapability;
1650         struct mrsas_pci_link_status_capability linkStatusCapability;
1651 };
1652 
1653 struct mrsas_pci_information
1654 {
1655         uint32_t                busNumber;
1656         uint8_t                 deviceNumber;
1657         uint8_t                 functionNumber;
1658         uint8_t                 interruptVector;
1659         uint8_t                 reserved;
1660         struct mrsas_pci_common_header pciHeaderInfo;
1661         struct mrsas_pci_capabilities capability;
1662         uint8_t                 reserved2[32];
1663 };
1664 
1665 struct mrsas_ioctl {
1666         uint16_t        version;
1667         uint16_t        controller_id;
1668         uint8_t         signature[8];
1669         uint32_t        reserved_1;
1670         uint32_t        control_code;
1671         uint32_t        reserved_2[2];
1672         uint8_t         frame[64];
1673         union mrsas_sgl_frame sgl_frame;
1674         uint8_t         sense_buff[MRSAS_MAX_SENSE_LENGTH];
1675         uint8_t         data[1];
1676 };
1677 
1678 struct mrsas_aen {
1679         uint16_t        host_no;
1680         uint16_t        cmd_status;
1681         uint32_t        seq_num;
1682         uint32_t        class_locale_word;
1683 };
1684 #pragma pack()
1685 
1686 #ifndef DDI_VENDOR_LSI
1687 #define DDI_VENDOR_LSI          "LSI"
1688 #endif /* DDI_VENDOR_LSI */
1689 
1690 #ifndef KMDB_MODULE
1691 static int      mrsas_getinfo(dev_info_t *, ddi_info_cmd_t,  void *, void **);
1692 static int      mrsas_attach(dev_info_t *, ddi_attach_cmd_t);
1693 #ifdef __sparc
1694 static int      mrsas_reset(dev_info_t *, ddi_reset_cmd_t);
1695 #else /* __sparc */
1696 static int      mrsas_quiesce(dev_info_t *);
1697 #endif  /* __sparc */
1698 static int      mrsas_detach(dev_info_t *, ddi_detach_cmd_t);
1699 static int      mrsas_open(dev_t *, int, int, cred_t *);
1700 static int      mrsas_close(dev_t, int, int, cred_t *);
1701 static int      mrsas_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
1702 
1703 static int      mrsas_tran_tgt_init(dev_info_t *, dev_info_t *,
1704                     scsi_hba_tran_t *, struct scsi_device *);
1705 static struct scsi_pkt *mrsas_tran_init_pkt(struct scsi_address *, register
1706                     struct scsi_pkt *, struct buf *, int, int, int, int,
1707                     int (*)(), caddr_t);
1708 static int      mrsas_tran_start(struct scsi_address *,
1709                     register struct scsi_pkt *);
1710 static int      mrsas_tran_abort(struct scsi_address *, struct scsi_pkt *);
1711 static int      mrsas_tran_reset(struct scsi_address *, int);
1712 static int      mrsas_tran_getcap(struct scsi_address *, char *, int);
1713 static int      mrsas_tran_setcap(struct scsi_address *, char *, int, int);
1714 static void     mrsas_tran_destroy_pkt(struct scsi_address *,
1715                     struct scsi_pkt *);
1716 static void     mrsas_tran_dmafree(struct scsi_address *, struct scsi_pkt *);
1717 static void     mrsas_tran_sync_pkt(struct scsi_address *, struct scsi_pkt *);
1718 static uint_t   mrsas_isr();
1719 static uint_t   mrsas_softintr();
1720 
1721 static int      init_mfi(struct mrsas_instance *);
1722 static int      mrsas_free_dma_obj(struct mrsas_instance *, dma_obj_t);
1723 static int      mrsas_alloc_dma_obj(struct mrsas_instance *, dma_obj_t *,
1724                     uchar_t);
1725 static struct mrsas_cmd *get_mfi_pkt(struct mrsas_instance *);
1726 static void     return_mfi_pkt(struct mrsas_instance *,
1727                     struct mrsas_cmd *);
1728 
1729 static void     free_space_for_mfi(struct mrsas_instance *);
1730 static void     free_additional_dma_buffer(struct mrsas_instance *);
1731 static int      alloc_additional_dma_buffer(struct mrsas_instance *);
1732 static int      read_fw_status_reg_ppc(struct mrsas_instance *);
1733 static void     issue_cmd_ppc(struct mrsas_cmd *, struct mrsas_instance *);
1734 static int      issue_cmd_in_poll_mode_ppc(struct mrsas_instance *,
1735                     struct mrsas_cmd *);
1736 static int      issue_cmd_in_sync_mode_ppc(struct mrsas_instance *,
1737                     struct mrsas_cmd *);
1738 static void     enable_intr_ppc(struct mrsas_instance *);
1739 static void     disable_intr_ppc(struct mrsas_instance *);
1740 static int      intr_ack_ppc(struct mrsas_instance *);
1741 static int      mfi_state_transition_to_ready(struct mrsas_instance *);
1742 static void     destroy_mfi_frame_pool(struct mrsas_instance *);
1743 static int      create_mfi_frame_pool(struct mrsas_instance *);
1744 static int      mrsas_dma_alloc(struct mrsas_instance *, struct scsi_pkt *,
1745                     struct buf *, int, int (*)());
1746 static int      mrsas_dma_move(struct mrsas_instance *,
1747                         struct scsi_pkt *, struct buf *);
1748 static void     flush_cache(struct mrsas_instance *instance);
1749 static void     display_scsi_inquiry(caddr_t);
1750 static int      start_mfi_aen(struct mrsas_instance *instance);
1751 static int      handle_drv_ioctl(struct mrsas_instance *instance,
1752                     struct mrsas_ioctl *ioctl, int mode);
1753 static int      handle_mfi_ioctl(struct mrsas_instance *instance,
1754                     struct mrsas_ioctl *ioctl, int mode);
1755 static int      handle_mfi_aen(struct mrsas_instance *instance,
1756                     struct mrsas_aen *aen);
1757 static void     fill_up_drv_ver(struct mrsas_drv_ver *dv);
1758 static struct mrsas_cmd *build_cmd(struct mrsas_instance *instance,
1759                     struct scsi_address *ap, struct scsi_pkt *pkt,
1760                     uchar_t *cmd_done);
1761 #ifndef __sparc
1762 static int      wait_for_outstanding(struct mrsas_instance *instance);
1763 #endif  /* __sparc */
1764 static int      register_mfi_aen(struct mrsas_instance *instance,
1765                     uint32_t seq_num, uint32_t class_locale_word);
1766 static int      issue_mfi_pthru(struct mrsas_instance *instance, struct
1767                     mrsas_ioctl *ioctl, struct mrsas_cmd *cmd, int mode);
1768 static int      issue_mfi_dcmd(struct mrsas_instance *instance, struct
1769                     mrsas_ioctl *ioctl, struct mrsas_cmd *cmd, int mode);
1770 static int      issue_mfi_smp(struct mrsas_instance *instance, struct
1771                     mrsas_ioctl *ioctl, struct mrsas_cmd *cmd, int mode);
1772 static int      issue_mfi_stp(struct mrsas_instance *instance, struct
1773                     mrsas_ioctl *ioctl, struct mrsas_cmd *cmd, int mode);
1774 static int      abort_aen_cmd(struct mrsas_instance *instance,
1775                     struct mrsas_cmd *cmd_to_abort);
1776 
1777 static int      mrsas_common_check(struct mrsas_instance *instance,
1778                     struct  mrsas_cmd *cmd);
1779 static void     mrsas_fm_init(struct mrsas_instance *instance);
1780 static void     mrsas_fm_fini(struct mrsas_instance *instance);
1781 static int      mrsas_fm_error_cb(dev_info_t *, ddi_fm_error_t *,
1782                     const void *);
1783 static void     mrsas_fm_ereport(struct mrsas_instance *instance,
1784                     char *detail);
1785 static int      mrsas_check_dma_handle(ddi_dma_handle_t handle);
1786 static int      mrsas_check_acc_handle(ddi_acc_handle_t handle);
1787 
1788 static void     mrsas_rem_intrs(struct mrsas_instance *instance);
1789 static int      mrsas_add_intrs(struct mrsas_instance *instance, int intr_type);
1790 
1791 static void     mrsas_tran_tgt_free(dev_info_t *, dev_info_t *,
1792                     scsi_hba_tran_t *, struct scsi_device *);
1793 static int      mrsas_tran_bus_config(dev_info_t *, uint_t,
1794                     ddi_bus_config_op_t, void *, dev_info_t **);
1795 static int      mrsas_parse_devname(char *, int *, int *);
1796 static int      mrsas_config_all_devices(struct mrsas_instance *);
1797 static int      mrsas_config_scsi_device(struct mrsas_instance *,
1798                     struct scsi_device *, dev_info_t **);
1799 static int      mrsas_config_ld(struct mrsas_instance *, uint16_t,
1800                                 uint8_t, dev_info_t **);
1801 static dev_info_t *mrsas_find_child(struct mrsas_instance *, uint16_t,
1802                         uint8_t);
1803 static int      mrsas_name_node(dev_info_t *, char *, int);
1804 static void     mrsas_issue_evt_taskq(struct mrsas_eventinfo *);
1805 static int      mrsas_service_evt(struct mrsas_instance *, int, int, int,
1806                         uint64_t);
1807 static int      mrsas_mode_sense_build(struct scsi_pkt *);
1808 static void     push_pending_mfi_pkt(struct mrsas_instance *,
1809                         struct mrsas_cmd *);
1810 static int      mrsas_issue_init_mfi(struct mrsas_instance *);
1811 static int      mrsas_issue_pending_cmds(struct mrsas_instance *);
1812 static int      mrsas_print_pending_cmds(struct mrsas_instance *);
1813 static int  mrsas_complete_pending_cmds(struct mrsas_instance *);
1814 static int      mrsas_reset_ppc(struct mrsas_instance *);
1815 static uint32_t mrsas_initiate_ocr_if_fw_is_faulty(struct mrsas_instance *);
1816 static int  mrsas_kill_adapter(struct mrsas_instance *);
1817 static void io_timeout_checker(void *instance);
1818 static void complete_cmd_in_sync_mode(struct mrsas_instance *,
1819                 struct mrsas_cmd *);
1820 
1821 #endif  /* KMDB_MODULE */
1822 
1823 
1824 #ifdef  __cplusplus
1825 }
1826 #endif
1827 
1828 #endif /* _MR_SAS_H_ */