1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
|
/* $OpenBSD: mpt_openbsd.h,v 1.15 2004/12/29 06:57:11 deraadt Exp $ */
/* $NetBSD: mpt_netbsd.h,v 1.2 2003/04/16 23:02:14 thorpej Exp $ */
/*
* Copyright (c) 2004 Milos Urbanek
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/*
* Copyright (c) 2003 Wasabi Systems, Inc.
* All rights reserved.
*
* Written by Jason R. Thorpe for Wasabi Systems, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed for the NetBSD Project by
* Wasabi Systems, Inc.
* 4. The name of Wasabi Systems, Inc. may not be used to endorse
* or promote products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
* Copyright (c) 2000, 2001 by Greg Ansley, Adam Prewett
*
* Partially derived from Matt Jacobs ISP driver.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice immediately at the beginning of the file, without modification,
* this list of conditions, and the following disclaimer.
* 2. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
*/
/*
* Additional Copyright (c) 2002 by Matthew Jacob under same license.
*/
/*
* mpt_openbsd.h:
*
* OpenBSD-specific definitions for LSI Fusion adapters.
*
* Adapted from the NetBSD "mpt" driver by Milos Urbanek for
* ZOOM International, s.r.o.
*/
#ifndef _DEV_IC_MPT_OPENBSD_H_
#define _DEV_IC_MPT_OPENBSD_H_
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/malloc.h>
#include <sys/device.h>
#include <sys/ioctl.h>
#include <sys/kernel.h>
#include <sys/timeout.h>
#include <sys/errno.h>
#include <sys/buf.h>
#include <sys/queue.h>
#include <uvm/uvm_extern.h>
#include <machine/bus.h>
#include <machine/intr.h>
#include <scsi/scsi_all.h>
#include <scsi/scsiconf.h>
#include <dev/biovar.h>
#include <dev/ic/mpt_ioctl.h>
#include <dev/ic/mpt_mpilib.h>
#include "bio.h"
/*
* macro to convert from milliseconds to hz without integer overflow
* Default version using only 32bits arithmetics.
* 64bit port can define 64bit version in their <machine/param.h>
* 0x20000 is safe for hz < 20000
*/
#ifndef mstohz
#define mstohz(ms) \
(((ms +0u) / 1000u) * hz)
#endif
/* Max MPT Reply we are willing to accept (must be a power of 2). */
#define MPT_REPLY_SIZE 128
#define MPT_MAX_REQUESTS(mpt) ((mpt)->is_fc ? 1024 : 256)
#define MPT_REQUEST_AREA 512
#define MPT_SENSE_SIZE 32 /* included in MPT_REQUEST_AREA */
#define MPT_REQ_MEM_SIZE(mpt) (MPT_MAX_REQUESTS(mpt) * MPT_REQUEST_AREA)
/*
* We cannot tell prior to getting IOC facts how big the IOC's request
* area is. Because of this we cannot tell at compile time how many
* simple SG elements we can fit within an IOC request prior to having
* to put in a chain element.
*
* Experimentally we know that the Ultra4 parts have a 96 byte request
* element size and the Fibre Channel units have a 144 byte request
* element size. Therefore, if we have 512-32 (== 480) bytes of request
* area to play with, we have room for between 3 and 5 request sized
* regions- the first of which is the command plus a simple SG list,
* the rest of which are chained continuation SG lists. Given that the
* normal request we use is 48 bytes w/o the first SG element, we can
* assume we have 480-48 == 432 bytes to have simple SG elements and/or
* chain elements. If we assume 32 bit addressing, this works out to
* 54 SG or chain elements. If we assume 5 chain elements, then we have
* a maximum of 49 seperate actual SG segments.
*/
#define MPT_SGL_MAX 49
#define MPT_RQSL(mpt) ((mpt)->request_frame_size << 2)
#define MPT_NSGL(mpt) (MPT_RQSL(mpt) / sizeof(SGE_SIMPLE32))
#define MPT_NSGL_FIRST(mpt) \
((((mpt)->request_frame_size << 2) - \
sizeof(MSG_SCSI_IO_REQUEST) - \
sizeof(SGE_IO_UNION)) / sizeof(SGE_SIMPLE32))
/*
* Convert a physical address returned from IOC to a virtual address
* needed to access the data.
*/
#define MPT_REPLY_PTOV(m, x) \
((void *)(&(m)->reply[(((x) << 1) - (m)->reply_phys)]))
enum mpt_req_state {
REQ_FREE,
REQ_IN_PROGRESS,
REQ_TIMEOUT,
REQ_ON_CHIP,
REQ_DONE
};
typedef struct req_entry {
uint16_t index; /* index of this entry */
struct scsi_xfer *xfer; /* scsipi xfer request */
void *req_vbuf; /* virtual address of entry */
void *sense_vbuf; /* virtual address of sense data */
bus_addr_t req_pbuf; /* physical address of entry */
bus_addr_t sense_pbuf; /* physical address of sense data */
bus_dmamap_t dmap; /* DMA map for data buffer */
SLIST_ENTRY(req_entry) link; /* pointer to next in list */
enum mpt_req_state debug; /* debugging */
uint32_t sequence; /* sequence number */
} request_t;
typedef struct mpt_softc {
struct device mpt_dev; /* base device glue */
int verbose;
int is_fc;
int bus;
/* IOC facts */
uint16_t mpt_global_credits;
uint16_t request_frame_size;
uint8_t mpt_max_devices;
uint8_t mpt_max_buses;
uint8_t fw_download_boot;
uint32_t fw_image_size;
uint32_t im_support;
/* Port facts */
uint16_t mpt_ini_id;
/* Device configuration information */
struct {
struct mpt_spi_cfg {
fCONFIG_PAGE_SCSI_PORT_0 _port_page0;
fCONFIG_PAGE_SCSI_PORT_1 _port_page1;
fCONFIG_PAGE_SCSI_PORT_2 _port_page2;
fCONFIG_PAGE_SCSI_DEVICE_0 _dev_page0[16];
fCONFIG_PAGE_SCSI_DEVICE_1 _dev_page1[16];
uint16_t _negotiated_speed[16];
uint16_t _tag_enable;
uint16_t _disc_enable;
uint16_t _update_params0;
uint16_t _update_params1;
uint16_t _report_xfer_mode;
} spi;
#define mpt_port_page0 cfg.spi._port_page0
#define mpt_port_page1 cfg.spi._port_page1
#define mpt_port_page2 cfg.spi._port_page2
#define mpt_dev_page0 cfg.spi._dev_page0
#define mpt_dev_page1 cfg.spi._dev_page1
#define mpt_negotiated_speed cfg.spi._negotiated_speed
#define mpt_tag_enable cfg.spi._tag_enable
#define mpt_disc_enable cfg.spi._disc_enable
#define mpt_update_params0 cfg.spi._update_params0
#define mpt_update_params1 cfg.spi._update_params1
#define mpt_report_xfer_mode cfg.spi._report_xfer_mode
struct mpt_fc_cfg {
uint8_t nada;
} fc;
struct mpt_mfg_cfg {
fCONFIG_PAGE_MANUFACTURING_0 _mfg_page0;
fCONFIG_PAGE_MANUFACTURING_1 _mfg_page1;
fCONFIG_PAGE_MANUFACTURING_2 _mfg_page2;
fCONFIG_PAGE_MANUFACTURING_3 _mfg_page3;
fCONFIG_PAGE_MANUFACTURING_4 _mfg_page4;
} mfg;
#define mpt_mfg_page0 cfg.mfg._mfg_page0
#define mpt_mfg_page1 cfg.mfg._mfg_page1
#define mpt_mfg_page2 cfg.mfg._mfg_page2
#define mpt_mfg_page3 cfg.mfg._mfg_page3
#define mpt_mfg_page4 cfg.mfg._mfg_page4
struct mpt_iou_cfg {
fCONFIG_PAGE_IO_UNIT_0 _iou_page0;
fCONFIG_PAGE_IO_UNIT_1 _iou_page1;
fCONFIG_PAGE_IO_UNIT_2 _iou_page2;
fCONFIG_PAGE_IO_UNIT_3 _iou_page3;
} iou;
#define mpt_iou_page0 cfg.iou._iou_page0
#define mpt_iou_page1 cfg.iou._iou_page1
#define mpt_iou_page2 cfg.iou._iou_page2
#define mpt_iou_page3 cfg.iou._iou_page3
struct mpt_ioc_cfg {
fCONFIG_PAGE_IOC_0 _ioc_page0;
fCONFIG_PAGE_IOC_1 _ioc_page1;
fCONFIG_PAGE_IOC_2 _ioc_page2;
fCONFIG_PAGE_IOC_3 _ioc_page3;
fCONFIG_PAGE_IOC_4 _ioc_page4;
} ioc;
#define mpt_ioc_page0 cfg.ioc._ioc_page0
#define mpt_ioc_page1 cfg.ioc._ioc_page1
#define mpt_ioc_page2 cfg.ioc._ioc_page2
#define mpt_ioc_page3 cfg.ioc._ioc_page3
#define mpt_ioc_page4 cfg.ioc._ioc_page4
struct mpt_raid_cfg {
fCONFIG_PAGE_RAID_VOL_0 _raidvol_page0;
fCONFIG_PAGE_RAID_PHYS_DISK_0 _raidphys_page0;
} raid;
#define mpt_raidvol_page0 cfg.raid._raidvol_page0
#define mpt_raidphys_page0 cfg.raid._raidphys_page0
} cfg;
bus_space_tag_t sc_st;
bus_space_handle_t sc_sh;
bus_dma_tag_t sc_dmat;
/* Reply memory */
bus_dmamap_t reply_dmap;
char *reply;
bus_addr_t reply_phys;
/* Request memory */
bus_dmamap_t request_dmap;
char *request;
bus_addr_t request_phys;
/* scsi linkage */
request_t *request_pool;
SLIST_HEAD(req_queue, req_entry) request_free_list;
struct scsi_link sc_link;
struct scsi_adapter sc_adapter;
uint32_t sequence; /* sequence number */
uint32_t timeouts; /* timeout count */
uint32_t success; /* success after timeout */
uint8_t vmware; /* If set, running in vmware */
uint8_t upload_fw; /* If set, do a fw upload */
/* Firmware memory */
bus_dmamap_t fw_dmap;
int fw_rseg;
bus_dma_segment_t fw_seg;
char *fw;
/* Companion part in a 929 or 1030, or NULL. */
struct mpt_softc *mpt2;
/* To restore configuration after hard reset. */
void (*sc_set_config_regs)(struct mpt_softc *);
} mpt_softc_t;
#define MPT_SYNC_REQ(mpt, req, ops) \
bus_dmamap_sync((mpt)->sc_dmat, (mpt)->request_dmap, \
(req)->req_pbuf - (mpt)->request_phys, \
MPT_REQUEST_AREA, (ops))
#define mpt_read(mpt, reg) \
bus_space_read_4((mpt)->sc_st, (mpt)->sc_sh, (reg))
#define mpt_write(mpt, reg, val) \
bus_space_write_4((mpt)->sc_st, (mpt)->sc_sh, (reg), (val))
void mpt_attach(mpt_softc_t *);
int mpt_dma_mem_alloc(mpt_softc_t *);
int mpt_intr(void *);
void mpt_prt(mpt_softc_t *, const char *, ...);
#define mpt_set_config_regs(mpt) \
do { \
if ((mpt)->sc_set_config_regs != NULL) \
(*(mpt)->sc_set_config_regs)((mpt)); \
} while (/*CONSTCOND*/0)
#endif /* _DEV_IC_MPT_OPENBSD_H_ */
|