cissreg.h revision 1.1 1 1.1 he /* $NetBSD: cissreg.h,v 1.1 2006/03/21 20:42:14 he Exp $ */
2 1.1 he /* $OpenBSD: cissreg.h,v 1.4 2005/12/13 15:55:59 brad Exp $ */
3 1.1 he
4 1.1 he /*
5 1.1 he * Copyright (c) 2005 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.1 he #define CISS_IDB 0x20
22 1.1 he #define CISS_IDB_CFG 0x01
23 1.1 he #define CISS_ISR 0x30
24 1.1 he #define CISS_IMR 0x34
25 1.1 he #define CISS_READYENAB 4
26 1.1 he #define CISS_READYENA 8
27 1.1 he #define CISS_INQ 0x40
28 1.1 he #define CISS_OUTQ 0x44
29 1.1 he #define CISS_CFG_BAR 0xb4
30 1.1 he #define CISS_CFG_OFF 0xb8
31 1.1 he
32 1.1 he #define CISS_DRVMAP_SIZE (128 / 8)
33 1.1 he
34 1.1 he #define CISS_CMD_CTRL_GET 0x26
35 1.1 he #define CISS_CMD_CTRL_SET 0x27
36 1.1 he /* sub-commands for GET/SET */
37 1.1 he #define CISS_CMS_CTRL_LDID 0x10
38 1.1 he #define CISS_CMS_CTRL_CTRL 0x11
39 1.1 he #define CISS_CMS_CTRL_LDSTAT 0x12
40 1.1 he #define CISS_CMS_CTRL_PDID 0x15
41 1.1 he #define CISS_CMS_CTRL_PDBLINK 0x16
42 1.1 he #define CISS_CMS_CTRL_PDBLSENS 0x17
43 1.1 he #define CISS_CMS_CTRL_FLUSH 0xc2
44 1.1 he #define CISS_CMS_CTRL_ACCEPT 0xe0
45 1.1 he
46 1.1 he #define CISS_CMD_LDMAP 0xc2
47 1.1 he #define CISS_CMD_PDMAP 0xc3
48 1.1 he
49 1.1 he struct ciss_softc;
50 1.1 he
51 1.1 he struct ciss_config {
52 1.1 he u_int32_t signature;
53 1.1 he #define CISS_SIGNATURE (*(const u_int32_t *)"CISS")
54 1.1 he u_int32_t version;
55 1.1 he u_int32_t methods;
56 1.1 he #define CISS_METH_READY 0x0001
57 1.1 he #define CISS_METH_SIMPL 0x0002
58 1.1 he #define CISS_METH_PERF 0x0004
59 1.1 he #define CISS_METH_EMQ 0x0008
60 1.1 he u_int32_t amethod;
61 1.1 he u_int32_t rmethod;
62 1.1 he u_int32_t paddr_lim;
63 1.1 he u_int32_t int_delay;
64 1.1 he u_int32_t int_count;
65 1.1 he u_int32_t maxcmd;
66 1.1 he u_int32_t scsibus;
67 1.1 he #define CISS_BUS_U2 0x0001
68 1.1 he #define CISS_BUS_U3 0x0002
69 1.1 he #define CISS_BUS_FC1 0x0100
70 1.1 he #define CISS_BUS_FC2 0x0200
71 1.1 he u_int32_t troff;
72 1.1 he u_int8_t hostname[16];
73 1.1 he u_int32_t heartbeat;
74 1.1 he u_int32_t driverf;
75 1.1 he #define CISS_DRV_UATT 0x0001
76 1.1 he #define CISS_DRV_QINI 0x0002
77 1.1 he #define CISS_DRV_LCKINT 0x0004
78 1.1 he #define CISS_DRV_QTAGS 0x0008
79 1.1 he #define CISS_DRV_ALPHA 0x0010
80 1.1 he #define CISS_DRV_LUNS 0x0020
81 1.1 he #define CISS_DRV_MSGRQ 0x0080
82 1.1 he #define CISS_DRV_DBRD 0x0100
83 1.1 he #define CISS_DRV_PRF 0x0200
84 1.1 he u_int32_t maxsg;
85 1.1 he } __packed;
86 1.1 he
87 1.1 he struct ciss_inquiry {
88 1.1 he u_int8_t numld;
89 1.1 he u_int8_t sign[4];
90 1.1 he u_int8_t fw_running[4];
91 1.1 he u_int8_t fw_stored[4];
92 1.1 he u_int8_t hw_rev;
93 1.1 he u_int8_t resv0[12];
94 1.1 he u_int16_t pci_vendor;
95 1.1 he u_int16_t pci_product;
96 1.1 he u_int8_t resv1[10];
97 1.1 he u_int8_t market_rev;
98 1.1 he u_int8_t flags;
99 1.1 he #define CISS_INQ_WIDE 0x08
100 1.1 he #define CISS_INQ_BIGMAP 0x80
101 1.1 he #define CISS_INQ_BITS "\020\04WIDE\010BIGMAP"
102 1.1 he u_int8_t resv2[2];
103 1.1 he u_int8_t nscsi_bus;
104 1.1 he u_int8_t resv3[4];
105 1.1 he u_int8_t clk[4]; /* unaligned dumbness */
106 1.1 he u_int8_t buswidth;
107 1.1 he u_int8_t disks[CISS_DRVMAP_SIZE];
108 1.1 he u_int8_t extdisks[CISS_DRVMAP_SIZE];
109 1.1 he u_int8_t nondisks[CISS_DRVMAP_SIZE];
110 1.1 he } __packed;
111 1.1 he
112 1.1 he struct ciss_ldmap {
113 1.1 he u_int32_t size;
114 1.1 he u_int32_t resv;
115 1.1 he struct {
116 1.1 he u_int32_t tgt;
117 1.1 he u_int32_t tgt2;
118 1.1 he } map[1];
119 1.1 he } __packed;
120 1.1 he
121 1.1 he struct ciss_flush {
122 1.1 he u_int16_t flush;
123 1.1 he #define CISS_FLUSH_ENABLE 0
124 1.1 he #define CISS_FLUSH_DISABLE 1
125 1.1 he u_int16_t resv[255];
126 1.1 he } __packed;
127 1.1 he
128 1.1 he struct ciss_cmd {
129 1.1 he u_int8_t resv0; /* 00 */
130 1.1 he u_int8_t sgin; /* 01: #sg in the cmd */
131 1.1 he u_int16_t sglen; /* 02: #sg total */
132 1.1 he u_int32_t id; /* 04: cmd id << 2 and status bits */
133 1.1 he #define CISS_CMD_ERR 0x02
134 1.1 he u_int32_t id_hi; /* 08: not used */
135 1.1 he u_int32_t tgt; /* 0c: tgt:bus:mode or lun:mode */
136 1.1 he #define CISS_CMD_MODE_PERIPH 0x00000000
137 1.1 he #define CISS_CMD_MODE_LD 0x40000000
138 1.1 he #define CISS_CMD_TGT_MASK 0x40ffffff
139 1.1 he #define CISS_CMD_BUS_MASK 0x3f000000
140 1.1 he #define CISS_CMD_BUS_SHIFT 24
141 1.1 he u_int32_t tgt2; /* 10: scsi-3 address bytes */
142 1.1 he
143 1.1 he u_int8_t cdblen; /* 14: valid length of cdb */
144 1.1 he u_int8_t flags; /* 15 */
145 1.1 he #define CISS_CDB_CMD 0x00
146 1.1 he #define CISS_CDB_MSG 0x01
147 1.1 he #define CISS_CDB_NOTAG 0x00
148 1.1 he #define CISS_CDB_SIMPL 0x20
149 1.1 he #define CISS_CDB_QHEAD 0x28
150 1.1 he #define CISS_CDB_ORDR 0x30
151 1.1 he #define CISS_CDB_AUTO 0x38
152 1.1 he #define CISS_CDB_IN 0x80
153 1.1 he #define CISS_CDB_OUT 0x40
154 1.1 he u_int16_t tmo; /* 16: timeout in seconds */
155 1.1 he #define CISS_MAX_CDB 12
156 1.1 he u_int8_t cdb[16];/* 18 */
157 1.1 he
158 1.1 he u_int64_t err_pa; /* 28: pa(struct ciss_error *) */
159 1.1 he u_int32_t err_len;/* 30 */
160 1.1 he
161 1.1 he struct { /* 34 */
162 1.1 he u_int32_t addr_lo;
163 1.1 he u_int32_t addr_hi;
164 1.1 he u_int32_t len;
165 1.1 he u_int32_t flags;
166 1.1 he #define CISS_SG_EXT 0x0001
167 1.1 he } sgl[1];
168 1.1 he } __packed;
169 1.1 he
170 1.1 he struct ciss_error {
171 1.1 he u_int8_t scsi_stat; /* SCSI_OK etc */
172 1.1 he u_int8_t senselen;
173 1.1 he u_int16_t cmd_stat;
174 1.1 he #define CISS_ERR_OK 0
175 1.1 he #define CISS_ERR_TGTST 1 /* target status */
176 1.1 he #define CISS_ERR_UNRUN 2
177 1.1 he #define CISS_ERR_OVRUN 3
178 1.1 he #define CISS_ERR_INVCMD 4
179 1.1 he #define CISS_ERR_PROTE 5
180 1.1 he #define CISS_ERR_HWERR 6
181 1.1 he #define CISS_ERR_CLOSS 7
182 1.1 he #define CISS_ERR_ABRT 8
183 1.1 he #define CISS_ERR_FABRT 9
184 1.1 he #define CISS_ERR_UABRT 10
185 1.1 he #define CISS_ERR_TMO 11
186 1.1 he #define CISS_ERR_NABRT 12
187 1.1 he u_int32_t resid;
188 1.1 he u_int8_t err_type[4];
189 1.1 he u_int32_t err_info;
190 1.1 he u_int8_t sense[32];
191 1.1 he } __packed;
192 1.1 he
193 1.1 he struct ciss_ccb {
194 1.1 he TAILQ_ENTRY(ciss_ccb) ccb_link;
195 1.1 he struct ciss_softc *ccb_sc;
196 1.1 he paddr_t ccb_cmdpa;
197 1.1 he enum {
198 1.1 he CISS_CCB_FREE = 0x01,
199 1.1 he CISS_CCB_READY = 0x02,
200 1.1 he CISS_CCB_ONQ = 0x04,
201 1.1 he CISS_CCB_PREQ = 0x08,
202 1.1 he CISS_CCB_POLL = 0x10,
203 1.1 he CISS_CCB_FAIL = 0x80
204 1.1 he #define CISS_CCB_BITS "\020\01FREE\02READY\03ONQ\04PREQ\05POLL\010FAIL"
205 1.1 he } ccb_state;
206 1.1 he
207 1.1 he struct scsipi_xfer *ccb_xs;
208 1.1 he size_t ccb_len;
209 1.1 he void *ccb_data;
210 1.1 he bus_dmamap_t ccb_dmamap;
211 1.1 he
212 1.1 he struct ciss_error ccb_err;
213 1.1 he struct ciss_cmd ccb_cmd; /* followed by sgl */
214 1.1 he };
215 1.1 he
216 1.1 he typedef TAILQ_HEAD(ciss_queue_head, ciss_ccb) ciss_queue_head;
217 1.1 he
218