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