Print this page
    
Code review comments
    
      
        | Split | 
	Close | 
      
      | Expand all | 
      | Collapse all | 
    
    
          --- old/usr/src/uts/common/io/mr_sas/ld_pd_map.h
          +++ new/usr/src/uts/common/io/mr_sas/ld_pd_map.h
   1    1  /*
   2    2   * ld_pd_map.h
   3    3   *
   4    4   * Solaris MegaRAID device driver for SAS2.0 controllers
   5    5   * Copyright (c) 2008-2012, LSI Logic Corporation.
   6    6   * All rights reserved.
   7    7   *
   8    8   * Version:
   9    9   * Author:
  10   10   *              Swaminathan K S
  11   11   *              Arun Chandrashekhar
  12   12   *              Manju R
  13   13   *              Rasheed
  14   14   *              Shakeel Bukhari
  15   15   */
  16   16  
  17   17  #ifndef _LD_PD_MAP
  18   18  #define _LD_PD_MAP
  19   19  #include <sys/scsi/scsi.h>
  20   20  #include "fusion.h"
  21   21  
  22   22  struct mrsas_instance;  /* This will be defined in mr_sas.h */
  23   23  
  24   24  /* raid->write_mode; raid->read_ahead; dcmd->state */
  25   25  /* Write through */
  26   26  #define WRITE_THROUGH                           0
  27   27  /* Delayed Write */
  28   28  #define WRITE_BACK                              1
  29   29  
  30   30  /* SCSI CDB definitions */
  31   31  #define READ_6          0x08
  32   32  #define READ_16         0x88
  33   33  #define READ_10         0x28
  34   34  #define READ_12         0xA8
  35   35  #define WRITE_16        0x8A
  36   36  #define WRITE_10        0x2A
  37   37  
  38   38  /* maximum disks per array */
  39   39  #define MAX_ROW_SIZE                            32
  40   40  /* maximum spans per logical drive */
  41   41  #define MAX_SPAN_DEPTH                          8
  42   42  #define MEGASAS_LOAD_BALANCE_FLAG               0x1
  43   43  #define MR_DEFAULT_IO_TIMEOUT   20
  44   44  
  45   45  
  46   46  union desc_value {
  47   47          U64 word;
  48   48          struct {
  49   49                  U32 low;
  50   50                  U32 high;
  51   51          } u1;
  52   52  };
  53   53  
  54   54  typedef struct _LD_LOAD_BALANCE_INFO
  55   55  {
  56   56      U8      loadBalanceFlag;
  57   57      U8      reserved1;
  58   58      U16     raid1DevHandle[2];
  59   59      U16     scsi_pending_cmds[2];
  
    | 
      ↓ open down ↓ | 
    59 lines elided | 
    
      ↑ open up ↑ | 
  
  60   60      U64     last_accessed_block[2];
  61   61  } LD_LOAD_BALANCE_INFO, *PLD_LOAD_BALANCE_INFO;
  62   62  
  63   63  #pragma pack(1)
  64   64  typedef struct _MR_FW_RAID_MAP_ALL {
  65   65          MR_FW_RAID_MAP raidMap;
  66   66          MR_LD_SPAN_MAP ldSpanMap[MAX_LOGICAL_DRIVES - 1];
  67   67  } MR_FW_RAID_MAP_ALL;
  68   68  
  69   69  /*
  70      - * Raid Context structure which describes MegaRAID specific IO Paramenters
       70 + * Raid Context structure which describes MegaRAID specific IO Parameters
  71   71   * This resides at offset 0x60 where the SGL normally starts in MPT IO Frames
  72   72   */
  73   73  typedef struct _MPI2_SCSI_IO_VENDOR_UNIQUE {
  74   74          U8 nsegType;            /* 0x00 nseg[7:4], Type[3:0] */
  75   75          U8 resvd0;              /* 0x01 */
  76   76          U16 timeoutValue;       /* 0x02 -0x03 */
  77   77          U8 regLockFlags;        /* 0x04 */
  78   78          U8 reservedForHw1;      /* 0x05 */
  79   79          U16 ldTargetId;         /* 0x06 - 0x07 */
  80   80          U64 regLockRowLBA;      /* 0x08 - 0x0F */
  81   81          U32 regLockLength;      /* 0x10 - 0x13 */
  82   82          U16 nextLMId;           /* 0x14 - 0x15 */
  83   83          U8 extStatus;           /* 0x16 */
  84   84          U8 status;              /* 0x17 status */
  85   85          U8 RAIDFlags;           /* 0x18 resvd[7:6], ioSubType[5:4], */
  86   86                                  /* resvd[3:1], preferredCpu[0] */
  87   87          U8 numSGE;              /* 0x19 numSge; not including chain entries */
  88   88          U16 configSeqNum;       /* 0x1A -0x1B */
  89   89          U8 spanArm;             /* 0x1C span[7:5], arm[4:0] */
  90   90          U8 resvd2[3];           /* 0x1D-0x1f */
  91   91  } MPI2_SCSI_IO_VENDOR_UNIQUE, MPI25_SCSI_IO_VENDOR_UNIQUE;
  92   92  
  93   93  #define RAID_CTX_SPANARM_ARM_SHIFT      (0)
  94   94  #define RAID_CTX_SPANARM_ARM_MASK       (0x1f)
  95   95  
  96   96  #define RAID_CTX_SPANARM_SPAN_SHIFT     (5)
  97   97  #define RAID_CTX_SPANARM_SPAN_MASK      (0xE0)
  98   98  
  99   99  
 100  100  /*
 101  101   * RAID SCSI IO Request Message
 102  102   * Total SGE count will be one less
 103  103   * than  _MPI2_SCSI_IO_REQUEST
 104  104   */
 105  105  typedef struct _MPI2_RAID_SCSI_IO_REQUEST
 106  106  {
 107  107          uint16_t                DevHandle;                      /* 0x00 */
 108  108          uint8_t                 ChainOffset;                    /* 0x02 */
 109  109          uint8_t                 Function;                       /* 0x03 */
 110  110          uint16_t                Reserved1;                      /* 0x04 */
 111  111          uint8_t                 Reserved2;                      /* 0x06 */
 112  112          uint8_t                 MsgFlags;                       /* 0x07 */
 113  113          uint8_t                 VP_ID;                          /* 0x08 */
 114  114          uint8_t                 VF_ID;                          /* 0x09 */
 115  115          uint16_t                Reserved3;                      /* 0x0A */
 116  116          uint32_t                SenseBufferLowAddress;          /* 0x0C */
 117  117          uint16_t                SGLFlags;                       /* 0x10 */
 118  118          uint8_t                 SenseBufferLength;              /* 0x12 */
 119  119          uint8_t                 Reserved4;                      /* 0x13 */
 120  120          uint8_t                 SGLOffset0;                     /* 0x14 */
 121  121          uint8_t                 SGLOffset1;                     /* 0x15 */
 122  122          uint8_t                 SGLOffset2;                     /* 0x16 */
 123  123          uint8_t                 SGLOffset3;                     /* 0x17 */
 124  124          uint32_t                SkipCount;                      /* 0x18 */
 125  125          uint32_t                DataLength;                     /* 0x1C */
 126  126          uint32_t                BidirectionalDataLength;        /* 0x20 */
 127  127          uint16_t                IoFlags;                        /* 0x24 */
 128  128          uint16_t                EEDPFlags;                      /* 0x26 */
 129  129          uint32_t                EEDPBlockSize;                  /* 0x28 */
 130  130          uint32_t                SecondaryReferenceTag;          /* 0x2C */
 131  131          uint16_t                SecondaryApplicationTag;        /* 0x30 */
 132  132          uint16_t                ApplicationTagTranslationMask;  /* 0x32 */
 133  133          uint8_t                 LUN[8];                         /* 0x34 */
 134  134          uint32_t                Control;                        /* 0x3C */
 135  135          Mpi2ScsiIoCdb_t         CDB;                            /* 0x40 */
 136  136          MPI2_SCSI_IO_VENDOR_UNIQUE RaidContext;                 /* 0x60 */
 137  137          Mpi2SGEIOUnion_t        SGL; /* 0x80 */
 138  138  } MPI2_RAID_SCSI_IO_REQUEST, MPI2_POINTER PTR_MPI2_RAID_SCSI_IO_REQUEST,
 139  139  Mpi2RaidSCSIIORequest_t, MPI2_POINTER pMpi2RaidSCSIIORequest_t;
 140  140  
 141  141  /*
 142  142   * define region lock types
 143  143   */
 144  144  typedef enum    _REGION_TYPE {
 145  145          REGION_TYPE_UNUSED      = 0,    /* lock is currently not active */
 146  146          REGION_TYPE_SHARED_READ = 1,    /* shared lock (for reads) */
 147  147          REGION_TYPE_SHARED_WRITE = 2,
 148  148          REGION_TYPE_EXCLUSIVE   = 3     /* exclusive lock (for writes) */
 149  149  } REGION_TYPE;
 150  150  
 151  151  
 152  152  #define DM_PATH_MAXPATH         2
 153  153  #define DM_PATH_FIRSTPATH       0
 154  154  #define DM_PATH_SECONDPATH      1
 155  155  
 156  156  /* declare valid Region locking values */
 157  157  typedef enum _REGION_LOCK {
 158  158          REGION_LOCK_BYPASS              = 0,
 159  159          /* for RAID 6 single-drive failure */
 160  160          REGION_LOCK_UNCOND_SHARED_READ  = 1,
 161  161          REGION_LOCK_UNCOND_SHARED_WRITE = 2,
 162  162          REGION_LOCK_UNCOND_SHARED_OTHER = 3,
 163  163          REGION_LOCK_UNCOND_SHARED_EXCLUSIVE = 0xFF
 164  164  } REGION_LOCK;
 165  165  
 166  166  
 167  167  struct mrsas_init_frame2 {
 168  168          uint8_t cmd;                            /* 00h */
 169  169          uint8_t reserved_0;                     /* 01h */
 170  170          uint8_t cmd_status;                     /* 02h */
 171  171  
 172  172          uint8_t reserved_1;                     /* 03h */
 173  173          uint32_t reserved_2;                    /* 04h */
 174  174  
 175  175          uint32_t context;                       /* 08h */
 176  176          uint32_t pad_0;                         /* 0Ch */
 177  177  
 178  178          uint16_t flags;                         /* 10h */
 179  179          uint16_t reserved_3;                    /* 12h */
 180  180          uint32_t data_xfer_len;                 /* 14h */
 181  181  
 182  182          uint32_t queue_info_new_phys_addr_lo;   /* 18h */
 183  183          uint32_t queue_info_new_phys_addr_hi;   /* 1Ch */
 184  184          uint32_t queue_info_old_phys_addr_lo;   /* 20h */
 185  185          uint32_t queue_info_old_phys_addr_hi;   /* 24h */
 186  186          uint64_t        driverversion;          /* 28h */
 187  187          uint32_t reserved_4[4];                 /* 30h */
 188  188  };
 189  189  
 190  190  
 191  191  /*
 192  192   * Request descriptor types
 193  193   */
 194  194  #define MPI2_REQ_DESCRIPT_FLAGS_LD_IO           0x7
 195  195  #define MPI2_REQ_DESCRIPT_FLAGS_MFA             0x1
 196  196  #define MPI2_REQ_DESCRIPT_FLAGS_NO_LOCK         0x2
 197  197  
 198  198  #define MPI2_REQ_DESCRIPT_FLAGS_TYPE_SHIFT      1
 199  199  
 200  200  
 201  201  /*
 202  202   * MPT RAID MFA IO Descriptor.
 203  203   */
 204  204  typedef struct _MR_RAID_MFA_IO_DESCRIPTOR {
 205  205          uint32_t        RequestFlags : 8;
 206  206          uint32_t        MessageAddress1 : 24;   /* bits 31:8 */
 207  207          uint32_t        MessageAddress2;        /* bits 61:32 */
 208  208  } MR_RAID_MFA_IO_REQUEST_DESCRIPTOR,
 209  209  *PMR_RAID_MFA_IO_REQUEST_DESCRIPTOR;
 210  210  
 211  211  /* union of Request Descriptors */
 212  212  typedef union _MRSAS_REQUEST_DESCRIPTOR_UNION
 213  213  {
 214  214          MPI2_DEFAULT_REQUEST_DESCRIPTOR         Default;
 215  215          MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR   HighPriority;
 216  216          MPI2_SCSI_IO_REQUEST_DESCRIPTOR         SCSIIO;
 217  217          MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR     SCSITarget;
 218  218          MPI2_RAID_ACCEL_REQUEST_DESCRIPTOR      RAIDAccelerator;
 219  219          MR_RAID_MFA_IO_REQUEST_DESCRIPTOR       MFAIo;
 220  220          U64 Words;
 221  221  } MRSAS_REQUEST_DESCRIPTOR_UNION;
 222  222  
 223  223  #pragma pack()
 224  224  
 225  225  enum {
 226  226          MRSAS_SCSI_VARIABLE_LENGTH_CMD          = 0x7F,
 227  227          MRSAS_SCSI_SERVICE_ACTION_READ32        = 0x9,
 228  228          MRSAS_SCSI_SERVICE_ACTION_WRITE32       = 0xB,
 229  229          MRSAS_SCSI_ADDL_CDB_LEN                 = 0x18,
 230  230          MRSAS_RD_WR_PROTECT                     = 0x20,
 231  231          MRSAS_EEDPBLOCKSIZE                     = 512
 232  232  };
 233  233  
 234  234  
 235  235  #define IEEE_SGE_FLAGS_ADDR_MASK        (0x03)
 236  236  #define IEEE_SGE_FLAGS_SYSTEM_ADDR      (0x00)
 237  237  #define IEEE_SGE_FLAGS_IOCDDR_ADDR      (0x01)
 238  238  #define IEEE_SGE_FLAGS_IOCPLB_ADDR      (0x02)
 239  239  #define IEEE_SGE_FLAGS_IOCPLBNTA_ADDR   (0x03)
 240  240  #define IEEE_SGE_FLAGS_CHAIN_ELEMENT    (0x80)
 241  241  #define IEEE_SGE_FLAGS_END_OF_LIST      (0x40)
 242  242  
 243  243  
 244  244  U8 MR_ValidateMapInfo(MR_FW_RAID_MAP_ALL *map, PLD_LOAD_BALANCE_INFO lbInfo);
 245  245  U16 MR_CheckDIF(U32, MR_FW_RAID_MAP_ALL *);
 246  246  U8 MR_BuildRaidContext(struct mrsas_instance *, struct IO_REQUEST_INFO *,
 247  247      MPI2_SCSI_IO_VENDOR_UNIQUE *, MR_FW_RAID_MAP_ALL *);
 248  248  
 249  249  #endif /* _LD_PD_MAP */
  
    | 
      ↓ open down ↓ | 
    169 lines elided | 
    
      ↑ open up ↑ | 
  
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX