Annotation of sys/dev/ic/cissreg.h, Revision 1.1.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