File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / smartmontools / megaraid.h
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Jul 22 01:17:35 2013 UTC (10 years, 10 months ago) by misho
Branches: smartmontools, elwix, MAIN
CVS tags: v6_2, v6_1p0, v6_1, HEAD
6.1

    1: int megaraid_io_interface(int device, int target, struct scsi_cmnd_io *, int);
    2: 
    3: #undef u32
    4: 
    5: #define u8  uint8_t
    6: #define u16 uint16_t
    7: #define u32 uint32_t
    8: #define u64 uint64_t
    9: 
   10: /*======================================================
   11: * PERC2/3/4 Passthrough SCSI Command Interface
   12: *
   13: * Contents from:
   14: *  drivers/scsi/megaraid/megaraid_ioctl.h
   15: *  drivers/scsi/megaraid/mbox_defs.h
   16: *======================================================*/
   17: #define MEGAIOC_MAGIC   'm'
   18: #define MEGAIOCCMD      _IOWR(MEGAIOC_MAGIC, 0, struct uioctl_t)
   19: 
   20: /* Following subopcode work for opcode == 0x82 */
   21: #define MKADAP(adapno)   (MEGAIOC_MAGIC << 8 | adapno)
   22: #define MEGAIOC_QNADAP     'm'
   23: #define MEGAIOC_QDRVRVER   'e'
   24: #define MEGAIOC_QADAPINFO  'g'
   25: 
   26: #define MEGA_MBOXCMD_PASSTHRU 0x03
   27: 
   28: #define MAX_REQ_SENSE_LEN  0x20
   29: #define MAX_CDB_LEN 10
   30: 
   31: typedef struct
   32: {
   33:   uint8_t  timeout : 3;
   34:   uint8_t  ars : 1;
   35:   uint8_t  reserved : 3;
   36:   uint8_t  islogical : 1;
   37:   uint8_t  logdrv;
   38:   uint8_t  channel;
   39:   uint8_t  target;
   40:   uint8_t  queuetag;
   41:   uint8_t  queueaction;
   42:   uint8_t  cdb[MAX_CDB_LEN];
   43:   uint8_t  cdblen;
   44:   uint8_t  reqsenselen;
   45:   uint8_t  reqsensearea[MAX_REQ_SENSE_LEN];
   46:   uint8_t  numsgelements;
   47:   uint8_t  scsistatus;
   48:   uint32_t dataxferaddr;
   49:   uint32_t dataxferlen;
   50: } __attribute__((packed)) mega_passthru;
   51: 
   52: typedef struct
   53: {
   54:   uint8_t   cmd;
   55:   uint8_t   cmdid;
   56:   uint8_t   opcode;
   57:   uint8_t   subopcode;
   58:   uint32_t  lba;
   59:   uint32_t  xferaddr;
   60:   uint8_t   logdrv;
   61:   uint8_t   resvd[3];
   62:   uint8_t   numstatus;
   63:   uint8_t   status;
   64: } __attribute__((packed)) megacmd_t;
   65: 
   66: typedef union {
   67:   uint8_t   *pointer;
   68:   uint8_t    pad[8];
   69: } ptr_t;
   70: 
   71: // The above definition assumes sizeof(void*) <= 8.
   72: // This assumption also exists in the linux megaraid device driver.
   73: // So define a macro to check expected size of ptr_t at compile time using
   74: // a dummy typedef.  On size mismatch, compiler reports a negative array
   75: // size.  If you see an error message of this form, it means that
   76: // you have an unexpected pointer size on your platform and can not
   77: // use megaraid support in smartmontools.
   78: typedef char assert_sizeof_ptr_t[sizeof(ptr_t) == 8 ? 1 : -1];
   79: 
   80: struct uioctl_t
   81: {
   82:   uint32_t       inlen;
   83:   uint32_t       outlen;
   84:   union {
   85:     uint8_t      fca[16];
   86:     struct {
   87:       uint8_t  opcode;
   88:       uint8_t  subopcode;
   89:       uint16_t adapno;
   90:       ptr_t    buffer;
   91:       uint32_t length;
   92:     } __attribute__((packed)) fcs;
   93:   } __attribute__((packed)) ui;
   94:   
   95:   megacmd_t     mbox;
   96:   mega_passthru pthru;
   97:   ptr_t         data;
   98: } __attribute__((packed));
   99: 
  100: /*===================================================
  101: * PERC5/6 Passthrough SCSI Command Interface
  102: *
  103: * Contents from:
  104: *  drivers/scsi/megaraid/megaraid_sas.h
  105: *===================================================*/
  106: #define MEGASAS_MAGIC          'M'
  107: #define MEGASAS_IOC_FIRMWARE   _IOWR(MEGASAS_MAGIC, 1, struct megasas_iocpacket)
  108: 
  109: #define MFI_CMD_PD_SCSI_IO        0x04
  110: #define MFI_CMD_DCMD              0x05
  111: #define MFI_FRAME_SGL64           0x02
  112: #define MFI_STAT_OK               0x00
  113: #define MFI_DCMD_PD_GET_LIST      0x02010000
  114: /*
  115: * Number of mailbox bytes in DCMD message frame
  116: */
  117: #define MFI_MBOX_SIZE             12
  118: #define MAX_IOCTL_SGE             16
  119: #define MFI_FRAME_DIR_NONE        0x0000
  120: #define MFI_FRAME_DIR_WRITE       0x0008
  121: #define MFI_FRAME_DIR_READ        0x0010
  122: #define MFI_FRAME_DIR_BOTH        0x0018
  123: 
  124: #define MAX_SYS_PDS               240
  125: 
  126: struct megasas_sge32 {
  127:   
  128:   u32 phys_addr;
  129:   u32 length;
  130:   
  131: } __attribute__ ((packed));
  132: 
  133: struct megasas_sge64 {
  134:   
  135:   u64 phys_addr;
  136:   u32 length;
  137:   
  138: } __attribute__ ((packed));
  139: 
  140: union megasas_sgl {
  141:   
  142:   struct megasas_sge32 sge32[1];
  143:   struct megasas_sge64 sge64[1];
  144:   
  145: } __attribute__ ((packed));
  146: 
  147: struct megasas_header {
  148:   
  149:   u8 cmd;           /*00h */
  150:   u8 sense_len;     /*01h */
  151:   u8 cmd_status;    /*02h */
  152:   u8 scsi_status;   /*03h */
  153:   
  154:   u8 target_id;     /*04h */
  155:   u8 lun;           /*05h */
  156:   u8 cdb_len;       /*06h */
  157:   u8 sge_count;     /*07h */
  158:   
  159:   u32 context;      /*08h */
  160:   u32 pad_0;        /*0Ch */
  161:   
  162:   u16 flags;        /*10h */
  163:   u16 timeout;      /*12h */
  164:   u32 data_xferlen; /*14h */
  165:   
  166: } __attribute__ ((packed));
  167: 
  168: struct megasas_pthru_frame {
  169:   
  170:   u8 cmd;            /*00h */
  171:   u8 sense_len;      /*01h */
  172:   u8 cmd_status;     /*02h */
  173:   u8 scsi_status;    /*03h */
  174:   
  175:   u8 target_id;      /*04h */
  176:   u8 lun;            /*05h */
  177:   u8 cdb_len;        /*06h */
  178:   u8 sge_count;      /*07h */
  179:   
  180:   u32 context;       /*08h */
  181:   u32 pad_0;         /*0Ch */
  182:   
  183:   u16 flags;         /*10h */
  184:   u16 timeout;       /*12h */
  185:   u32 data_xfer_len; /*14h */
  186:   
  187:   u32 sense_buf_phys_addr_lo; /*18h */
  188:   u32 sense_buf_phys_addr_hi; /*1Ch */
  189:   
  190:   u8 cdb[16];            /*20h */
  191:   union megasas_sgl sgl; /*30h */
  192:   
  193: } __attribute__ ((packed));
  194: 
  195: struct megasas_dcmd_frame {
  196:   
  197:   u8 cmd;            /*00h */
  198:   u8 reserved_0;     /*01h */
  199:   u8 cmd_status;     /*02h */
  200:   u8 reserved_1[4];  /*03h */
  201:   u8 sge_count;      /*07h */
  202:   
  203:   u32 context;       /*08h */
  204:   u32 pad_0;         /*0Ch */
  205:   
  206:   u16 flags;         /*10h */
  207:   u16 timeout;  /*12h */
  208:   
  209:   u32 data_xfer_len; /*14h */
  210:   u32 opcode;  /*18h */
  211:   
  212:   union {   /*1Ch */
  213:     u8 b[12];
  214:     u16 s[6];
  215:     u32 w[3];
  216:   } mbox;
  217:   
  218:   union megasas_sgl sgl; /*28h */
  219:   
  220: } __attribute__ ((packed));
  221: 
  222: struct megasas_iocpacket {
  223:   u16 host_no;
  224:   u16 __pad1;
  225:   u32 sgl_off;
  226:   u32 sge_count;
  227:   u32 sense_off;
  228:   u32 sense_len;
  229:   union {
  230:     u8 raw[128];
  231:     struct megasas_header hdr;
  232:     struct megasas_pthru_frame pthru;
  233:     struct megasas_dcmd_frame dcmd;
  234:   } frame;
  235:   
  236:   struct iovec sgl[MAX_IOCTL_SGE];
  237: } __attribute__ ((packed));
  238: 
  239: struct megasas_pd_address {
  240:   u16 device_id;
  241:   u16 encl_device_id;
  242:   u8 encl_index;
  243:   u8 slot_number;
  244:   u8 scsi_dev_type; /* 0 = disk */
  245:   u8 connect_port_bitmap;
  246:   u64 sas_addr[2];
  247: }   __attribute__ ((packed));
  248: 
  249: struct megasas_pd_list {
  250:   u32 size;
  251:   u32 count;
  252:   struct megasas_pd_address addr[MAX_SYS_PDS];
  253: } __attribute__ ((packed));
  254: 
  255: #undef u8
  256: #undef u16
  257: #undef u32
  258: #undef u64
  259: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>