dptreg.h revision 1.6 1 /* $NetBSD: dptreg.h,v 1.6 2000/01/18 16:50:38 ad Exp $ */
2
3 /*
4 * Copyright (c) 1999 Andy Doran <ad (at) NetBSD.org>
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 */
29
30 #ifndef _IC_DPTREG_H_
31 #define _IC_DPTREG_H_ 1
32
33 /* Hardware limits */
34 #define DPT_MAX_TARGETS 16
35 #define DPT_MAX_LUNS 8
36 #define DPT_MAX_CHANNELS 3
37
38 /* Software parameters */
39 #define DPT_MAX_XFER ((DPT_SG_SIZE - 1) << PGSHIFT)
40 #define DPT_MAX_CCBS 256
41 #define DPT_SG_SIZE 64
42 #define DPT_ABORT_TIMEOUT 2000 /* milliseconds */
43 #define DPT_MORE_TIMEOUT 1000 /* microseconds */
44
45 #ifdef _KERNEL
46
47 #define dpt_inb(x, o) \
48 bus_space_read_1((x)->sc_iot, (x)->sc_ioh, (o))
49 #define dpt_inw(x, o) \
50 le16toh(bus_space_read_2((x)->sc_iot, (x)->sc_ioh, (o)))
51 #define dpt_inl(x, o) \
52 le32toh(bus_space_read_4((x)->sc_iot, (x)->sc_ioh, (o)))
53
54 #define dpt_outb(x, o, d) \
55 bus_space_write_1((x)->sc_iot, (x)->sc_ioh, (o), (d))
56 #define dpt_outw(x, o, d) \
57 bus_space_write_2((x)->sc_iot, (x)->sc_ioh, (o), htole16(d))
58 #define dpt_outl(x, o, d) \
59 bus_space_write_4((x)->sc_iot, (x)->sc_ioh, (o), htole32(d))
60
61 #endif /* _KERNEL */
62
63 /*
64 * HBA registers
65 */
66 #define HA_DATA 0
67 #define HA_ERROR 1
68 #define HA_DMA_BASE 2
69 #define HA_ICMD_CODE2 4
70 #define HA_ICMD_CODE1 5
71 #define HA_ICMD 6
72
73 /* EATA commands. There are many more that we don't define or use. */
74 #define HA_COMMAND 7
75 #define CP_PIO_GETCFG 0xf0 /* Read configuration data, PIO */
76 #define CP_PIO_CMD 0xf2 /* Execute command, PIO */
77 #define CP_DMA_GETCFG 0xfd /* Read configuration data, DMA */
78 #define CP_DMA_CMD 0xff /* Execute command, DMA */
79 #define CP_PIO_TRUNCATE 0xf4 /* Truncate transfer command, PIO */
80 #define CP_RESET 0xf9 /* Reset controller and SCSI bus */
81 #define CP_REBOOT 0x06 /* Reboot controller (last resort) */
82 #define CP_IMMEDIATE 0xfa /* EATA immediate command */
83 #define CPI_GEN_ABORT 0x00 /* Generic abort */
84 #define CPI_SPEC_RESET 0x01 /* Specific reset */
85 #define CPI_BUS_RESET 0x02 /* Bus reset */
86 #define CPI_SPEC_ABORT 0x03 /* Specific abort */
87 #define CPI_QUIET_INTR 0x04 /* ?? */
88 #define CPI_ROM_DL_EN 0x05 /* ?? */
89 #define CPI_COLD_BOOT 0x06 /* Cold boot HBA */
90 #define CPI_FORCE_IO 0x07 /* ?? */
91 #define CPI_BUS_OFFLINE 0x08 /* Set SCSI bus offline */
92 #define CPI_RESET_MSKD_BUS 0x09 /* Reset masked bus */
93 #define CPI_POWEROFF_WARN 0x0a /* Power about to fail */
94
95 #define HA_STATUS 7
96 #define HA_ST_ERROR 0x01
97 #define HA_ST_MORE 0x02
98 #define HA_ST_CORRECTD 0x04
99 #define HA_ST_DRQ 0x08
100 #define HA_ST_SEEK_COMPLETE 0x10
101 #define HA_ST_WRT_FLT 0x20
102 #define HA_ST_READY 0x40
103 #define HA_ST_BUSY 0x80
104 #define HA_ST_DATA_RDY (HA_ST_SEEK_COMPLETE|HA_ST_READY|HA_ST_DRQ)
105
106 #define HA_AUX_STATUS 8
107 #define HA_AUX_BUSY 0x01
108 #define HA_AUX_INTR 0x02
109
110 /*
111 * Structure of an EATA command packet.
112 */
113 struct eata_cp {
114 u_int8_t cp_scsireset :1; /* cause a bus reset */
115 u_int8_t cp_hbainit :1; /* cause HBA to reinitialize */
116 u_int8_t cp_autosense :1; /* auto request sense on err */
117 u_int8_t cp_scatter :1; /* doing SG I/O */
118 u_int8_t cp_quick :1; /* return no status packet */
119 u_int8_t cp_interpret :1; /* HBA interprets SCSI CDB */
120 u_int8_t cp_dataout :1; /* data out phase */
121 u_int8_t cp_datain :1; /* data in phase */
122 u_int8_t cp_senselen; /* request sense length */
123 u_int8_t cp_unused0[3]; /* unused */
124 u_int8_t cp_tophys :1; /* send to RAID component */
125 u_int8_t cp_unused1 :7; /* unused */
126 u_int8_t cp_physunit :1; /* phys unit on mirrored pair */
127 u_int8_t cp_noat :1; /* no address translation */
128 u_int8_t cp_nocache :1; /* no HBA caching */
129 u_int8_t cp_unused2 :5; /* unused */
130 u_int8_t cp_id :5; /* SCSI device id of target */
131 u_int8_t cp_channel :3; /* SCSI channel id */
132 u_int8_t cp_lun :3; /* SCSI LUN id */
133 u_int8_t cp_unused3 :2; /* unused */
134 u_int8_t cp_luntar :1; /* CP is for target ROUTINE */
135 u_int8_t cp_dispri :1; /* give disconnect privilege */
136 u_int8_t cp_identify :1; /* always true */
137 u_int8_t cp_msg[3]; /* message bytes 0-3 */
138
139 /* Partial SCSI CDB ref */
140 u_int8_t cp_scsi_cmd;
141 u_int8_t cp_extent :1;
142 u_int8_t cp_bytchk :1;
143 u_int8_t cp_reladr :1;
144 u_int8_t cp_cmplst :1;
145 u_int8_t cp_fmtdata :1;
146 u_int8_t cp_cdblun :3;
147 u_int8_t cp_page;
148 u_int8_t cp_unused4;
149 u_int8_t cp_len;
150 u_int8_t cp_link :1;
151 u_int8_t cp_flag :1;
152 u_int8_t cp_unused5 :4;
153 u_int8_t cp_vendor :2;
154 u_int8_t cp_cdbmore[6];
155
156 u_int32_t cp_datalen; /* length in bytes of data/SG list */
157 u_int32_t cp_ccbid; /* ID of software CCB */
158 u_int32_t cp_dataaddr; /* address of data/SG list */
159 u_int32_t cp_stataddr; /* addr for status packet */
160 u_int32_t cp_senseaddr; /* addr of req. sense (err only) */
161 };
162
163 /*
164 * EATA status packet as returned by controller upon command completion. It
165 * contains status, message info and a handle on the initiating CCB.
166 */
167 struct eata_sp {
168 u_int8_t sp_hba_status; /* host adapter status */
169 u_int8_t sp_scsi_status; /* SCSI bus status */
170 u_int8_t sp_reserved[2]; /* reserved */
171 u_int32_t sp_inv_residue; /* bytes not transfered */
172 u_int32_t sp_ccbid; /* ID of software CCB */
173 u_int8_t sp_id_message;
174 u_int8_t sp_que_message;
175 u_int8_t sp_tag_message;
176 u_int8_t sp_messages[9];
177 };
178
179 /*
180 * HBA status as returned by status packet. Bit 7 signals end of command.
181 */
182 #define HA_NO_ERROR 0x00 /* No error on command */
183 #define HA_ERROR_SEL_TO 0x01 /* Device selection timeout */
184 #define HA_ERROR_CMD_TO 0x02 /* Device command timeout */
185 #define HA_ERROR_RESET 0x03 /* SCSI bus was reset */
186 #define HA_INIT_POWERUP 0x04 /* Initial controller power up */
187 #define HA_UNX_BUSPHASE 0x05 /* Unexpected bus phase */
188 #define HA_UNX_BUS_FREE 0x06 /* Unexpected bus free */
189 #define HA_BUS_PARITY 0x07 /* SCSI bus parity error */
190 #define HA_SCSI_HUNG 0x08 /* SCSI bus hung */
191 #define HA_UNX_MSGRJCT 0x09 /* Unexpected message reject */
192 #define HA_RESET_STUCK 0x0A /* SCSI bus reset stuck */
193 #define HA_RSENSE_FAIL 0x0B /* Auto-request sense failed */
194 #define HA_PARITY 0x0C /* HBA memory parity error */
195 #define HA_ABORT_NA 0x0D /* CP aborted - not on bus */
196 #define HA_ABORTED 0x0E /* CP aborted - was on bus */
197 #define HA_RESET_NA 0x0F /* CP reset - not on bus */
198 #define HA_RESET 0x10 /* CP reset - was on bus */
199 #define HA_ECC 0x11 /* HBA memory ECC error */
200 #define HA_PCI_PARITY 0x12 /* PCI parity error */
201 #define HA_PCI_MASTER 0x13 /* PCI master abort */
202 #define HA_PCI_TARGET 0x14 /* PCI target abort */
203 #define HA_PCI_SIGNAL_TARGET 0x15 /* PCI signalled target abort */
204 #define HA_ABORT 0x20 /* Software abort (too many retries) */
205
206 /*
207 * Scatter-gather list element.
208 */
209 struct eata_sg {
210 u_int32_t sg_addr;
211 u_int32_t sg_len;
212 };
213
214 /*
215 * EATA configuration data as returned by HBA. XXX this is bogus, some fields
216 * don't *seem* to be filled on my SmartCache III. Also, it doesn't sync up
217 * with the structure FreeBSD uses. [ad]
218 */
219 struct eata_cfg {
220 u_int8_t ec_devtype;
221 u_int8_t ec_pagecode;
222 u_int8_t ec_reserved0;
223 u_int8_t ec_cfglen; /* Length in bytes after this field */
224 u_int8_t ec_eatasig[4]; /* EATA signature */
225 u_int8_t ec_eataversion; /* EATA version number */
226 u_int8_t ec_overlapcmds : 1; /* Overlapped cmds supported */
227 u_int8_t ec_targetmode : 1; /* Target mode supported */
228 u_int8_t ec_trunnotrec : 1; /* Truncate cmd not supported */
229 u_int8_t ec_moresupported:1; /* More cmd supported */
230 u_int8_t ec_dmasupported : 1; /* DMA mode supported */
231 u_int8_t ec_dmanumvalid : 1; /* DMA channel field is valid */
232 u_int8_t ec_atadev : 1; /* This is an ATA device */
233 u_int8_t ec_hbavalid : 1; /* HBA field is valid */
234 u_int8_t ec_padlength[2]; /* Pad bytes for PIO cmds */
235 u_int8_t ec_hba[4]; /* Host adapter SCSI IDs */
236 u_int8_t ec_cplen[4]; /* Command packet length */
237 u_int8_t ec_splen[4]; /* Status packet length */
238 u_int8_t ec_queuedepth[2]; /* Controller queue depth */
239 u_int8_t ec_reserved1[2];
240 u_int8_t ec_sglen[2]; /* Maximum scatter gather list size */
241 u_int8_t ec_irqnum : 4; /* IRQ number */
242 u_int8_t ec_irqtrigger : 1; /* IRQ trigger: 0 = edge, 1 = level */
243 u_int8_t ec_secondary : 1; /* Controller not at address 0x170 */
244 u_int8_t ec_dmanum : 2; /* DMA channel index for ISA */
245 u_int8_t ec_irq; /* IRQ address */
246 u_int8_t ec_iodisable : 1; /* ISA I/O address disabled */
247 u_int8_t ec_forceaddr : 1; /* PCI forced to an EISA/ISA addr */
248 u_int8_t ec_sg64k : 1; /* 64K of SG space */
249 u_int8_t ec_sgunaligned : 1; /* Can do unaligned SG, otherwise 4 */
250 u_int8_t ec_reserved2 : 4; /* Reserved */
251 u_int8_t ec_maxtarget : 5; /* Maximun SCSI target ID supported */
252 u_int8_t ec_maxchannel : 3; /* Maximun channel number supported */
253 u_int8_t ec_maxlun; /* Maximum LUN supported */
254 u_int8_t ec_reserved3 : 3; /* Reserved field */
255 u_int8_t ec_autoterm : 1; /* Support auto term (low byte) */
256 u_int8_t ec_pcim1 : 1; /* PCI M1 chipset */
257 u_int8_t ec_bogusraidid : 1; /* Raid ID may be questionable */
258 u_int8_t ec_pci : 1; /* PCI adapter */
259 u_int8_t ec_eisa : 1; /* EISA adapter */
260 u_int8_t ec_raidnum; /* RAID host adapter humber */
261 };
262
263 /*
264 * How SCSI inquiry data breaks down for EATA boards.
265 */
266 struct eata_inquiry_data {
267 u_int8_t ei_device;
268 u_int8_t ei_dev_qual2;
269 u_int8_t ei_version;
270 u_int8_t ei_response_format;
271 u_int8_t ei_additional_length;
272 u_int8_t ei_unused[2];
273 u_int8_t ei_flags;
274 char ei_vendor[8]; /* Vendor, e.g: DPT, NEC */
275 char ei_model[7]; /* Model number */
276 char ei_suffix[9]; /* Model number suffix */
277 char ei_fw[3]; /* Firmware */
278 char ei_fwrev[1]; /* Firmware revision */
279 u_int8_t ei_extra[8];
280 };
281
282 #endif /* !defined _IC_DPTREG_H_ */
283