Annotation of embedaddon/smartmontools/megaraid.h, revision 1.1.1.2
1.1 misho 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: /*======================================================
1.1.1.2 ! misho 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)
1.1 misho 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: {
1.1.1.2 ! misho 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;
1.1 misho 50: } __attribute__((packed)) mega_passthru;
51:
52: typedef struct
53: {
1.1.1.2 ! misho 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;
1.1 misho 64: } __attribute__((packed)) megacmd_t;
65:
66: typedef union {
1.1.1.2 ! misho 67: uint8_t *pointer;
! 68: uint8_t pad[8];
1.1 misho 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: {
1.1.1.2 ! misho 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;
1.1 misho 98: } __attribute__((packed));
99:
100: /*===================================================
1.1.1.2 ! misho 101: * PERC5/6 Passthrough SCSI Command Interface
! 102: *
! 103: * Contents from:
! 104: * drivers/scsi/megaraid/megaraid_sas.h
! 105: *===================================================*/
1.1 misho 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
1.1.1.2 ! misho 110: #define MFI_CMD_DCMD 0x05
1.1 misho 111: #define MFI_FRAME_SGL64 0x02
1.1.1.2 ! misho 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
1.1 misho 123:
1.1.1.2 ! misho 124: #define MAX_SYS_PDS 240
1.1 misho 125:
126: struct megasas_sge32 {
1.1.1.2 ! misho 127:
! 128: u32 phys_addr;
! 129: u32 length;
! 130:
1.1 misho 131: } __attribute__ ((packed));
132:
133: struct megasas_sge64 {
1.1.1.2 ! misho 134:
! 135: u64 phys_addr;
! 136: u32 length;
! 137:
1.1 misho 138: } __attribute__ ((packed));
139:
140: union megasas_sgl {
1.1.1.2 ! misho 141:
! 142: struct megasas_sge32 sge32[1];
! 143: struct megasas_sge64 sge64[1];
! 144:
1.1 misho 145: } __attribute__ ((packed));
146:
147: struct megasas_header {
1.1.1.2 ! misho 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:
1.1 misho 166: } __attribute__ ((packed));
167:
168: struct megasas_pthru_frame {
1.1.1.2 ! misho 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:
1.1 misho 193: } __attribute__ ((packed));
194:
195: struct megasas_dcmd_frame {
1.1.1.2 ! misho 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:
1.1 misho 220: } __attribute__ ((packed));
221:
222: struct megasas_iocpacket {
1.1.1.2 ! misho 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];
1.1 misho 253: } __attribute__ ((packed));
254:
255: #undef u8
256: #undef u16
257: #undef u32
258: #undef u64
259:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>