Annotation of sys/dev/ic/cissreg.h, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: cissreg.h,v 1.8 2006/08/28 03:22:37 mickey Exp $ */
! 2:
! 3: /*
! 4: * Copyright (c) 2005,2006 Michael Shalayeff
! 5: * All rights reserved.
! 6: *
! 7: * Permission to use, copy, modify, and distribute this software for any
! 8: * purpose with or without fee is hereby granted, provided that the above
! 9: * copyright notice and this permission notice appear in all copies.
! 10: *
! 11: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
! 12: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 13: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
! 14: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 15: * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN
! 16: * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
! 17: * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 18: */
! 19:
! 20: #define CISS_BIGBIT 0x80 /* texas radio and the big beat! */
! 21:
! 22: #define CISS_IDB 0x20
! 23: #define CISS_IDB_CFG 0x01
! 24: #define CISS_ISR 0x30
! 25: #define CISS_IMR 0x34
! 26: #define CISS_READYENAB 4
! 27: #define CISS_READYENA 8
! 28: #define CISS_INQ 0x40
! 29: #define CISS_OUTQ 0x44
! 30: #define CISS_CFG_BAR 0xb4
! 31: #define CISS_CFG_OFF 0xb8
! 32:
! 33: #define CISS_DRVMAP_SIZE (128 / 8)
! 34:
! 35: #define CISS_CMD_CTRL_GET 0x26
! 36: #define CISS_CMD_CTRL_SET 0x27
! 37: /* sub-commands for GET/SET */
! 38: #define CISS_CMS_CTRL_LDID 0x10
! 39: #define CISS_CMS_CTRL_CTRL 0x11
! 40: #define CISS_CMS_CTRL_LDSTAT 0x12
! 41: #define CISS_CMS_CTRL_PDID 0x15
! 42: #define CISS_CMS_CTRL_PDBLINK 0x16
! 43: #define CISS_CMS_CTRL_PDBLSENS 0x17
! 44: #define CISS_CMS_CTRL_LDIDEXT 0x18
! 45: #define CISS_CMS_CTRL_REDSTAT 0x82
! 46: #define CISS_CMS_CTRL_FLUSH 0xc2
! 47: #define CISS_CMS_CTRL_ACCEPT 0xe0
! 48:
! 49: #define CISS_CMD_READ 0xc0
! 50: #define CISS_CMD_READ_EVENT 0xd0
! 51: #define CISS_EVENT_RECENT 0x08 /* ignore previous events */
! 52: #define CISS_EVENT_RSTOLD 0x04 /* start w/ the oldest one */
! 53: #define CISS_EVENT_ORDER 0x02 /* keep the order */
! 54: #define CISS_EVENT_SYNC 0x01 /* sync mode: wait till new come */
! 55: #define CISS_CMD_LDMAP 0xc2
! 56: #define CISS_CMD_PDMAP 0xc3
! 57:
! 58: #define ciss_bitset(d, v) ((v)[(d) >> 3] & (1 << ((d) & 7)))
! 59:
! 60: struct ciss_softc;
! 61:
! 62: struct ciss_config {
! 63: u_int32_t signature;
! 64: #define CISS_SIGNATURE (*(u_int32_t *)"CISS")
! 65: u_int32_t version;
! 66: u_int32_t methods;
! 67: #define CISS_METH_READY 0x0001
! 68: #define CISS_METH_SIMPL 0x0002
! 69: #define CISS_METH_PERF 0x0004
! 70: #define CISS_METH_EMQ 0x0008
! 71: u_int32_t amethod;
! 72: u_int32_t rmethod;
! 73: u_int32_t paddr_lim;
! 74: u_int32_t int_delay;
! 75: u_int32_t int_count;
! 76: u_int32_t maxcmd;
! 77: u_int32_t scsibus;
! 78: #define CISS_BUS_U2 0x0001
! 79: #define CISS_BUS_U3 0x0002
! 80: #define CISS_BUS_FC1 0x0100
! 81: #define CISS_BUS_FC2 0x0200
! 82: u_int32_t troff;
! 83: u_int8_t hostname[16];
! 84: u_int32_t heartbeat;
! 85: u_int32_t driverf;
! 86: #define CISS_DRV_UATT 0x0001
! 87: #define CISS_DRV_QINI 0x0002
! 88: #define CISS_DRV_LCKINT 0x0004
! 89: #define CISS_DRV_QTAGS 0x0008
! 90: #define CISS_DRV_ALPHA 0x0010
! 91: #define CISS_DRV_LUNS 0x0020
! 92: #define CISS_DRV_MSGRQ 0x0080
! 93: #define CISS_DRV_DBRD 0x0100
! 94: #define CISS_DRV_PRF 0x0200
! 95: u_int32_t maxsg;
! 96: } __packed;
! 97:
! 98: struct ciss_inquiry {
! 99: u_int8_t numld;
! 100: u_int8_t sign[4];
! 101: u_int8_t fw_running[4];
! 102: u_int8_t fw_stored[4];
! 103: u_int8_t hw_rev;
! 104: u_int8_t resv0[12];
! 105: u_int16_t pci_vendor;
! 106: u_int16_t pci_product;
! 107: u_int8_t resv1[10];
! 108: u_int8_t market_rev;
! 109: u_int8_t flags;
! 110: #define CISS_INQ_WIDE 0x08
! 111: #define CISS_INQ_BIGMAP 0x80
! 112: #define CISS_INQ_BITS "\020\04WIDE\010BIGMAP"
! 113: u_int8_t resv2[2];
! 114: u_int8_t nscsi_bus;
! 115: u_int8_t resv3[4];
! 116: u_int8_t clk[4]; /* unaligned dumbness */
! 117: u_int8_t buswidth;
! 118: u_int8_t disks[CISS_DRVMAP_SIZE];
! 119: u_int8_t extdisks[CISS_DRVMAP_SIZE];
! 120: u_int8_t nondisks[CISS_DRVMAP_SIZE];
! 121: } __packed;
! 122:
! 123: struct ciss_ldmap {
! 124: u_int32_t size;
! 125: u_int32_t resv;
! 126: struct {
! 127: u_int32_t tgt;
! 128: u_int32_t tgt2;
! 129: } map[1];
! 130: } __packed;
! 131:
! 132: struct ciss_flush {
! 133: u_int16_t flush;
! 134: #define CISS_FLUSH_ENABLE 0
! 135: #define CISS_FLUSH_DISABLE 1
! 136: u_int16_t resv[255];
! 137: } __packed;
! 138:
! 139: struct ciss_blink {
! 140: u_int32_t duration; /* x100ms */
! 141: u_int32_t elapsed; /* only for sense */
! 142: u_int8_t pdtab[256];
! 143: #define CISS_BLINK_ALL 1
! 144: #define CISS_BLINK_TIMED 2
! 145: u_int8_t res[248];
! 146: } __packed;
! 147:
! 148: struct ciss_ldid {
! 149: u_int16_t blksize;
! 150: u_int16_t nblocks[2]; /* UNALIGNED! */
! 151: u_int8_t params[16];
! 152: u_int8_t type;
! 153: #define CISS_LD_RAID0 0
! 154: #define CISS_LD_RAID4 1
! 155: #define CISS_LD_RAID1 2
! 156: #define CISS_LD_RAID5 3
! 157: #define CISS_LD_RAID51 4
! 158: #define CISS_LD_RAIDADG 5
! 159: u_int8_t res0;
! 160: u_int8_t bios_dis;
! 161: u_int8_t res1;
! 162: u_int32_t id;
! 163: u_int8_t label[64];
! 164: u_int64_t nbigblocks;
! 165: u_int8_t res2[410];
! 166: } __packed;
! 167:
! 168: struct ciss_ldstat {
! 169: u_int8_t stat;
! 170: #define CISS_LD_OK 0
! 171: #define CISS_LD_FAILED 1
! 172: #define CISS_LD_UNCONF 2
! 173: #define CISS_LD_DEGRAD 3
! 174: #define CISS_LD_RBLDRD 4 /* ready for rebuild */
! 175: #define CISS_LD_REBLD 5
! 176: #define CISS_LD_PDINV 6 /* wrong phys drive replaced */
! 177: #define CISS_LD_PDUNC 7 /* phys drive is not connected proper */
! 178: #define CISS_LD_EXPND 10 /* expanding */
! 179: #define CISS_LD_NORDY 11 /* volume is not ready */
! 180: #define CISS_LD_QEXPND 12 /* queued for expansion */
! 181: u_int8_t failed[4]; /* failed map */
! 182: u_int8_t res0[416];
! 183: u_int8_t prog[4]; /* blocks left to rebuild/expand */
! 184: u_int8_t rebuild; /* drive that is rebuilding */
! 185: u_int16_t remapcnt[32]; /* count of re3mapped blocks for pds */
! 186: u_int8_t replaced[4]; /* replaced drives map */
! 187: u_int8_t spare[4]; /* used spares map */
! 188: u_int8_t sparestat; /* spare status */
! 189: #define CISS_LD_CONF 0x01 /* spare configured */
! 190: #define CISS_LD_RBLD 0x02 /* spare is used and rebuilding */
! 191: #define CISS_LD_DONE 0x04 /* spare rebuild done */
! 192: #define CISS_LD_FAIL 0x08 /* at least one spare drive has failed */
! 193: #define CISS_LD_USED 0x10 /* at least one spare drive is used */
! 194: #define CISS_LD_AVAIL 0x20 /* at least one spare is available */
! 195: u_int8_t sparemap[32]; /* spare->pd replacement map */
! 196: u_int8_t replok[4]; /* replaced failed map */
! 197: u_int8_t readyok; /* ready to become ok */
! 198: u_int8_t memfail; /* cache mem failure */
! 199: u_int8_t expfail; /* expansion failure */
! 200: u_int8_t rebldfail; /* rebuild failure */
! 201: #define CISS_LD_RBLD_READ 0x01 /* read faild */
! 202: #define CISS_LD_RBLD_WRITE 0x02 /* write fail */
! 203: u_int8_t bigfailed[16]; /* bigmap vers of same of the above */
! 204: u_int8_t bigremapcnt[256];
! 205: u_int8_t bigreplaced[16];
! 206: u_int8_t bigspare[16];
! 207: u_int8_t bigsparemap[128];
! 208: u_int8_t bigreplok[16];
! 209: u_int8_t bigrebuild; /* big-number rebuilding driveno */
! 210: } __packed;
! 211:
! 212: struct ciss_pdid {
! 213: u_int8_t bus;
! 214: u_int8_t target;
! 215: u_int16_t blksz;
! 216: u_int32_t nblocks;
! 217: u_int32_t resblks;
! 218: u_int8_t model[40];
! 219: u_int8_t serial[40];
! 220: u_int8_t revision[8];
! 221: u_int8_t bits;
! 222: u_int8_t res0[2];
! 223: u_int8_t present;
! 224: #define CISS_PD_PRESENT 0x01
! 225: #define CISS_PD_NONDSK 0x02
! 226: #define CISS_PD_WIDE 0x04
! 227: #define CISS_PD_SYNC 0x08
! 228: #define CISS_PD_NARROW 0x10
! 229: #define CISS_PD_W2NARR 0x20 /* wide downgrade to narrow */
! 230: #define CISS_PD_ULTRA 0x40
! 231: #define CISS_PD_ULTRA2 0x80
! 232: u_int8_t config;
! 233: #define CISS_PD_SMART 0x01
! 234: #define CISS_PD_SMERRR 0x02
! 235: #define CISS_PD_SMERRE 0x04
! 236: #define CISS_PD_SMERRD 0x08
! 237: #define CISS_PD_EXT 0x10
! 238: #define CISS_PD_CONF 0x20
! 239: #define CISS_PD_SPARE 0x40
! 240: #define CISS_PD_CASAVE 0x80
! 241: u_int8_t res1;
! 242: u_int8_t cache;
! 243: #define CISS_PD_CACHE 0x01
! 244: #define CISS_PD_CASAFE 0x01
! 245: u_int8_t res2[5];
! 246: u_int8_t connector[2];
! 247: u_int8_t res3;
! 248: u_int8_t bay;
! 249: u_int16_t rpm;
! 250: u_int8_t type;
! 251: u_int8_t res4[393];
! 252: } __packed;
! 253:
! 254: struct ciss_event {
! 255: u_int32_t reltime; /* time since controller boot */
! 256: u_int16_t event;
! 257: #define CISS_EVCLS_PROTO 0
! 258: #define CISS_EVCLS_PLUG 1
! 259: #define CISS_EVCLS_HW 2
! 260: #define CISS_EVCLS_ENV 3
! 261: #define CISS_EVCLS_PD 4 /* ciss_evpdchg in details */
! 262: #define CISS_EVCLS_LD 5
! 263: #define CISS_EVCLS_CTRL 6
! 264: #define CISS_EVCLS_CISS 8 /* funky errors */
! 265: #define CISS_EVCLS_RESV 9
! 266: u_int16_t subevent;
! 267: #define CISS_EVPROTO_STAT 0
! 268: #define CISS_EVPROTO_ERR 1
! 269: #define CISS_EVPLUG_PDCHG 0 /* ciss_evpdchg */
! 270: #define CISS_EVPLUG_POWER 1 /* ciss_evpschg */
! 271: #define CISS_EVPLUG_FAN 2 /* ciss_evfanchg */
! 272: #define CISS_EVPLUG_UPS 3 /* ciss_evupschg */
! 273: #define CISS_EVPLUG_CTRL 4 /* ciss_evctrlchg: ctrl removed? (; */
! 274: #define CISS_EVHW_CABLES 0
! 275: #define CISS_EVHW_MEMORY 1
! 276: #define CISS_EVHW_FAN 2 /* detail as in CISS_EVPLUG_FAN */
! 277: #define CISS_EVHW_VRM 3
! 278: #define CISS_EVENV_TEMP 0 /* ciss_evtempchg */
! 279: #define CISS_EVENV_PS 1
! 280: #define CISS_EVENV_CHASSIS 2
! 281: #define CISS_EVENV_AC 3
! 282: #define CISS_EVPD_STAT 0
! 283: #define CISS_EVLD_STAT 0
! 284: #define CISS_EVLD_ERR 1
! 285: #define CISS_EVLD_CHECK 2 /* surface check */
! 286: #define CISS_EVCTRL_STAT 0
! 287: u_int16_t detail;
! 288: #define CISS_EVSTAT_NONE 0
! 289: #define CISS_EVSTAT_DISABLE 1
! 290: #define CISS_EVSTAT_TMO 2 /* async event poll timeout */
! 291: #define CISS_EVERR_OVERFLOW 0 /* event queue overflow */
! 292: #define CISS_EVPLUG_REMOVE 0
! 293: #define CISS_EVPLUG_INSERT 1
! 294: #define CISS_EVFAN_FAULT 0
! 295: #define CISS_EVFAN_DEGRADED 1
! 296: #define CISS_EVFAN_OK 2
! 297: #define CISS_EVVRM_REMOVE 0
! 298: #define CISS_EVVRM_INSERT 1
! 299: #define CISS_EVVRM_FAILED 2
! 300: #define CISS_EVVRM_OK 3
! 301: #define CISS_EVTEMP_LIMEX 0 /* limit exceeded */
! 302: #define CISS_EVTEMP_WARN 1
! 303: #define CISS_EVTEMP_OK 2
! 304: #define CISS_EVPS_FAIL 0
! 305: #define CISS_EVPS_OK 2
! 306: #define CISS_EVCHAS_OPEN 0
! 307: #define CISS_EVCHAS_CLOSE 2
! 308: #define CISS_EVAC_FAIL 0
! 309: #define CISS_EVAC_BATTLOW 1
! 310: #define CISS_EVPDSTAT_FAIL 0
! 311: #define CISS_EVLDSTAT_CHG 0 /* ciss_evldchg */
! 312: #define CISS_EVLDSTAT_EXMEDIA 1 /* untolerant cfg got drive replaced */
! 313: #define CISS_EVLDSTAT_RERDERR 2 /* ciss_evldrblderr */
! 314: #define CISS_EVLDSTAT_REWRERR 3 /* ciss_evldrblderr */
! 315: #define CISS_EVLDERR_FATAL 0 /* ciss_evlderr */
! 316: #define CISS_EVCHECK_DONE 0 /* details have onle 16bit ld num */
! 317: #define CISS_EVCTRLSTAT_CHG 0 /* ciss_evctrlstat */
! 318: u_int8_t data[64];
! 319: u_int8_t msg[80];
! 320: u_int32_t tag;
! 321: u_int16_t monday;
! 322: u_int16_t year;
! 323: u_int32_t time;
! 324: u_int16_t presec; /* time for events before boot */
! 325: u_int8_t device[8];
! 326: u_int8_t resv[336];
! 327: } __packed;
! 328:
! 329: struct ciss_evpdchg { /* details pointer */
! 330: u_int16_t pd;
! 331: u_int8_t flag; /* 1 for configured */
! 332: u_int8_t spare;
! 333: u_int8_t bigpd; /* big number of the pd */
! 334: u_int8_t baynum;
! 335: } __packed;
! 336:
! 337: struct ciss_evpschg { /* details pointer */
! 338: u_int16_t port;
! 339: u_int16_t psid;
! 340: u_int16_t box;
! 341: } __packed;
! 342:
! 343: struct ciss_evfanchg { /* details pointer */
! 344: u_int16_t port;
! 345: u_int16_t fanid;
! 346: u_int16_t box;
! 347: } __packed;
! 348:
! 349: struct ciss_evupschg { /* details pointer */
! 350: u_int16_t port;
! 351: u_int16_t upsid;
! 352: } __packed;
! 353:
! 354: struct ciss_evctrlchg { /* details pointer */
! 355: u_int16_t slot;
! 356: } __packed;
! 357:
! 358: struct ciss_evtempchg { /* details pointer */
! 359: u_int16_t port;
! 360: u_int16_t sensid;
! 361: u_int16_t box;
! 362: } __packed;
! 363:
! 364: struct ciss_evldchg { /* details pointer */
! 365: u_int16_t ld;
! 366: u_int8_t prevstat; /* same as ldstat->state */
! 367: u_int8_t newstat; /* same as ldstat->state */
! 368: u_int8_t sparestat;
! 369: } __packed;
! 370:
! 371: struct ciss_evldrblderr { /* details pointer */
! 372: u_int16_t ld;
! 373: u_int8_t replace;
! 374: u_int8_t errpd;
! 375: u_int8_t bigreplace;
! 376: u_int8_t bigerrpd;
! 377: } __packed;
! 378:
! 379: struct ciss_evlderr { /* details pointer */
! 380: u_int16_t ld;
! 381: u_int16_t blkno[2]; /* unaligned; if >2tb see big later */
! 382: u_int16_t count;
! 383: u_int8_t ldcmd;
! 384: u_int8_t bus;
! 385: u_int8_t target;
! 386: u_int8_t bigblkno[8]; /* unaligned */
! 387: } __packed;
! 388:
! 389: struct ciss_evctrlstat { /* details pointer */
! 390: u_int8_t prefctrl;
! 391: u_int8_t currmode;
! 392: u_int8_t redctrl;
! 393: u_int8_t redfail;
! 394: u_int8_t prevctrl;
! 395: u_int8_t prevmode;
! 396: u_int8_t prevred;
! 397: u_int8_t prevfail;
! 398: } __packed;
! 399:
! 400: struct ciss_cmd {
! 401: u_int8_t resv0; /* 00 */
! 402: u_int8_t sgin; /* 01: #sg in the cmd */
! 403: u_int16_t sglen; /* 02: #sg total */
! 404: u_int32_t id; /* 04: cmd id << 2 and status bits */
! 405: #define CISS_CMD_ERR 0x02
! 406: u_int32_t id_hi; /* 08: not used */
! 407: u_int32_t tgt; /* 0c: tgt:bus:mode or lun:mode */
! 408: #define CISS_CMD_MODE_PERIPH 0x00000000
! 409: #define CISS_CMD_MODE_LD 0x40000000
! 410: #define CISS_CMD_TGT_MASK 0x40ffffff
! 411: #define CISS_CMD_BUS_MASK 0x3f000000
! 412: #define CISS_CMD_BUS_SHIFT 24
! 413: u_int32_t tgt2; /* 10: scsi-3 address bytes */
! 414:
! 415: u_int8_t cdblen; /* 14: valid length of cdb */
! 416: u_int8_t flags; /* 15 */
! 417: #define CISS_CDB_CMD 0x00
! 418: #define CISS_CDB_MSG 0x01
! 419: #define CISS_CDB_NOTAG 0x00
! 420: #define CISS_CDB_SIMPL 0x20
! 421: #define CISS_CDB_QHEAD 0x28
! 422: #define CISS_CDB_ORDR 0x30
! 423: #define CISS_CDB_AUTO 0x38
! 424: #define CISS_CDB_IN 0x80
! 425: #define CISS_CDB_OUT 0x40
! 426: u_int16_t tmo; /* 16: timeout in seconds */
! 427: #define CISS_MAX_CDB 12
! 428: u_int8_t cdb[16];/* 18 */
! 429:
! 430: u_int64_t err_pa; /* 28: pa(struct ciss_error *) */
! 431: u_int32_t err_len;/* 30 */
! 432:
! 433: struct { /* 34 */
! 434: u_int32_t addr_lo;
! 435: u_int32_t addr_hi;
! 436: u_int32_t len;
! 437: u_int32_t flags;
! 438: #define CISS_SG_EXT 0x0001
! 439: } sgl[1];
! 440: } __packed;
! 441:
! 442: struct ciss_error {
! 443: u_int8_t scsi_stat; /* SCSI_OK etc */
! 444: u_int8_t senselen;
! 445: u_int16_t cmd_stat;
! 446: #define CISS_ERR_OK 0
! 447: #define CISS_ERR_TGTST 1 /* target status */
! 448: #define CISS_ERR_UNRUN 2
! 449: #define CISS_ERR_OVRUN 3
! 450: #define CISS_ERR_INVCMD 4
! 451: #define CISS_ERR_PROTE 5
! 452: #define CISS_ERR_HWERR 6
! 453: #define CISS_ERR_CLOSS 7
! 454: #define CISS_ERR_ABRT 8
! 455: #define CISS_ERR_FABRT 9
! 456: #define CISS_ERR_UABRT 10
! 457: #define CISS_ERR_TMO 11
! 458: #define CISS_ERR_NABRT 12
! 459: u_int32_t resid;
! 460: u_int8_t err_type[4];
! 461: u_int32_t err_info;
! 462: u_int8_t sense[32];
! 463: } __packed;
! 464:
! 465: struct ciss_ccb {
! 466: TAILQ_ENTRY(ciss_ccb) ccb_link;
! 467: struct ciss_softc *ccb_sc;
! 468: paddr_t ccb_cmdpa;
! 469: enum {
! 470: CISS_CCB_FREE = 0x01,
! 471: CISS_CCB_READY = 0x02,
! 472: CISS_CCB_ONQ = 0x04,
! 473: CISS_CCB_PREQ = 0x08,
! 474: CISS_CCB_POLL = 0x10,
! 475: CISS_CCB_FAIL = 0x80
! 476: #define CISS_CCB_BITS "\020\01FREE\02READY\03ONQ\04PREQ\05POLL\010FAIL"
! 477: } ccb_state;
! 478:
! 479: struct scsi_xfer *ccb_xs;
! 480: size_t ccb_len;
! 481: void *ccb_data;
! 482: bus_dmamap_t ccb_dmamap;
! 483:
! 484: struct ciss_error ccb_err;
! 485: struct ciss_cmd ccb_cmd; /* followed by sgl */
! 486: };
! 487:
! 488: typedef TAILQ_HEAD(ciss_queue_head, ciss_ccb) ciss_queue_head;
! 489:
CVSweb