File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / smartmontools / megaraid.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 16:32:16 2012 UTC (12 years, 4 months ago) by misho
Branches: smartmontools, elwix, MAIN
CVS tags: v5_43, v5_42, HEAD
smartmontools

    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_FRAME_SGL64           0x02
  111: #define MFI_FRAME_DIR_READ        0x10 
  112: 
  113: #define MAX_IOCTL_SGE			16
  114: 
  115: struct megasas_sge32 {
  116: 
  117: 	u32 phys_addr;
  118: 	u32 length;
  119: 
  120: } __attribute__ ((packed));
  121: 
  122: struct megasas_sge64 {
  123: 
  124: 	u64 phys_addr;
  125: 	u32 length;
  126: 
  127: } __attribute__ ((packed));
  128: 
  129: union megasas_sgl {
  130: 
  131: 	struct megasas_sge32 sge32[1];
  132: 	struct megasas_sge64 sge64[1];
  133: 
  134: } __attribute__ ((packed));
  135: 
  136: struct megasas_header {
  137: 
  138: 	u8 cmd;			/*00h */
  139: 	u8 sense_len;		/*01h */
  140: 	u8 cmd_status;		/*02h */
  141: 	u8 scsi_status;		/*03h */
  142: 
  143: 	u8 target_id;		/*04h */
  144: 	u8 lun;			/*05h */
  145: 	u8 cdb_len;		/*06h */
  146: 	u8 sge_count;		/*07h */
  147: 
  148: 	u32 context;		/*08h */
  149: 	u32 pad_0;		/*0Ch */
  150: 
  151: 	u16 flags;		/*10h */
  152: 	u16 timeout;		/*12h */
  153: 	u32 data_xferlen;	/*14h */
  154: 
  155: } __attribute__ ((packed));
  156: 
  157: struct megasas_pthru_frame {
  158: 
  159: 	u8 cmd;			/*00h */
  160: 	u8 sense_len;		/*01h */
  161: 	u8 cmd_status;		/*02h */
  162: 	u8 scsi_status;		/*03h */
  163: 
  164: 	u8 target_id;		/*04h */
  165: 	u8 lun;			/*05h */
  166: 	u8 cdb_len;		/*06h */
  167: 	u8 sge_count;		/*07h */
  168: 
  169: 	u32 context;		/*08h */
  170: 	u32 pad_0;		/*0Ch */
  171: 
  172: 	u16 flags;		/*10h */
  173: 	u16 timeout;		/*12h */
  174: 	u32 data_xfer_len;	/*14h */
  175: 
  176: 	u32 sense_buf_phys_addr_lo;	/*18h */
  177: 	u32 sense_buf_phys_addr_hi;	/*1Ch */
  178: 
  179: 	u8 cdb[16];		/*20h */
  180: 	union megasas_sgl sgl;	/*30h */
  181: 
  182: } __attribute__ ((packed));
  183: 
  184: struct megasas_dcmd_frame {
  185: 
  186: 	u8 cmd;			/*00h */
  187: 	u8 reserved_0;		/*01h */
  188: 	u8 cmd_status;		/*02h */
  189: 	u8 reserved_1[4];	/*03h */
  190: 	u8 sge_count;		/*07h */
  191: 
  192: 	u32 context;		/*08h */
  193: 	u32 pad_0;		/*0Ch */
  194: 
  195: 	u16 flags;		/*10h */
  196: 	u16 timeout;		/*12h */
  197: 
  198: 	u32 data_xfer_len;	/*14h */
  199: 	u32 opcode;		/*18h */
  200: 
  201: 	union {			/*1Ch */
  202: 		u8 b[12];
  203: 		u16 s[6];
  204: 		u32 w[3];
  205: 	} mbox;
  206: 
  207: 	union megasas_sgl sgl;	/*28h */
  208: 
  209: } __attribute__ ((packed));
  210: 
  211: struct megasas_iocpacket {
  212: 
  213: 	u16 host_no;
  214: 	u16 __pad1;
  215: 	u32 sgl_off;
  216: 	u32 sge_count;
  217: 	u32 sense_off;
  218: 	u32 sense_len;
  219: 	union {
  220: 		u8 raw[128];
  221: 		struct megasas_header hdr;
  222: 		struct megasas_pthru_frame pthru;
  223: 	} frame;
  224: 
  225: 	struct iovec sgl[MAX_IOCTL_SGE];
  226: 
  227: } __attribute__ ((packed));
  228: 
  229: #undef u8
  230: #undef u16
  231: #undef u32
  232: #undef u64
  233: 

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