xref: /netbsd-src/sys/dev/i2o/iop.c (revision 08c81a9c2dc8c7300e893321eb65c0925d60871c)
1 /*	$NetBSD: iop.c,v 1.25 2002/09/06 13:18:43 gehenna Exp $	*/
2 
3 /*-
4  * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Andrew Doran.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *        This product includes software developed by the NetBSD
21  *        Foundation, Inc. and its contributors.
22  * 4. Neither the name of The NetBSD Foundation nor the names of its
23  *    contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  */
38 
39 /*
40  * Support for I2O IOPs (intelligent I/O processors).
41  */
42 
43 #include <sys/cdefs.h>
44 __KERNEL_RCSID(0, "$NetBSD: iop.c,v 1.25 2002/09/06 13:18:43 gehenna Exp $");
45 
46 #include "opt_i2o.h"
47 #include "iop.h"
48 
49 #include <sys/param.h>
50 #include <sys/systm.h>
51 #include <sys/kernel.h>
52 #include <sys/device.h>
53 #include <sys/queue.h>
54 #include <sys/proc.h>
55 #include <sys/malloc.h>
56 #include <sys/ioctl.h>
57 #include <sys/endian.h>
58 #include <sys/conf.h>
59 #include <sys/kthread.h>
60 
61 #include <uvm/uvm_extern.h>
62 
63 #include <machine/bus.h>
64 
65 #include <dev/i2o/i2o.h>
66 #include <dev/i2o/iopio.h>
67 #include <dev/i2o/iopreg.h>
68 #include <dev/i2o/iopvar.h>
69 
70 #define POLL(ms, cond)				\
71 do {						\
72 	int i;					\
73 	for (i = (ms) * 10; i; i--) {		\
74 		if (cond)			\
75 			break;			\
76 		DELAY(100);			\
77 	}					\
78 } while (/* CONSTCOND */0);
79 
80 #ifdef I2ODEBUG
81 #define DPRINTF(x)	printf x
82 #else
83 #define	DPRINTF(x)
84 #endif
85 
86 #ifdef I2OVERBOSE
87 #define IFVERBOSE(x)	x
88 #define	COMMENT(x)	NULL
89 #else
90 #define	IFVERBOSE(x)
91 #define	COMMENT(x)
92 #endif
93 
94 #define IOP_ICTXHASH_NBUCKETS	16
95 #define	IOP_ICTXHASH(ictx)	(&iop_ictxhashtbl[(ictx) & iop_ictxhash])
96 
97 #define	IOP_MAX_SEGS	(((IOP_MAX_XFER + PAGE_SIZE - 1) / PAGE_SIZE) + 1)
98 
99 #define	IOP_TCTX_SHIFT	12
100 #define	IOP_TCTX_MASK	((1 << IOP_TCTX_SHIFT) - 1)
101 
102 static LIST_HEAD(, iop_initiator) *iop_ictxhashtbl;
103 static u_long	iop_ictxhash;
104 static void	*iop_sdh;
105 static struct	i2o_systab *iop_systab;
106 static int	iop_systab_size;
107 
108 extern struct cfdriver iop_cd;
109 
110 dev_type_open(iopopen);
111 dev_type_close(iopclose);
112 dev_type_ioctl(iopioctl);
113 
114 const struct cdevsw iop_cdevsw = {
115 	iopopen, iopclose, noread, nowrite, iopioctl,
116 	nostop, notty, nopoll, nommap,
117 };
118 
119 #define	IC_CONFIGURE	0x01
120 #define	IC_PRIORITY	0x02
121 
122 struct iop_class {
123 	u_short	ic_class;
124 	u_short	ic_flags;
125 #ifdef I2OVERBOSE
126 	const char	*ic_caption;
127 #endif
128 } static const iop_class[] = {
129 	{
130 		I2O_CLASS_EXECUTIVE,
131 		0,
132 		COMMENT("executive")
133 	},
134 	{
135 		I2O_CLASS_DDM,
136 		0,
137 		COMMENT("device driver module")
138 	},
139 	{
140 		I2O_CLASS_RANDOM_BLOCK_STORAGE,
141 		IC_CONFIGURE | IC_PRIORITY,
142 		IFVERBOSE("random block storage")
143 	},
144 	{
145 		I2O_CLASS_SEQUENTIAL_STORAGE,
146 		IC_CONFIGURE | IC_PRIORITY,
147 		IFVERBOSE("sequential storage")
148 	},
149 	{
150 		I2O_CLASS_LAN,
151 		IC_CONFIGURE | IC_PRIORITY,
152 		IFVERBOSE("LAN port")
153 	},
154 	{
155 		I2O_CLASS_WAN,
156 		IC_CONFIGURE | IC_PRIORITY,
157 		IFVERBOSE("WAN port")
158 	},
159 	{
160 		I2O_CLASS_FIBRE_CHANNEL_PORT,
161 		IC_CONFIGURE,
162 		IFVERBOSE("fibrechannel port")
163 	},
164 	{
165 		I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL,
166 		0,
167 		COMMENT("fibrechannel peripheral")
168 	},
169  	{
170  		I2O_CLASS_SCSI_PERIPHERAL,
171  		0,
172  		COMMENT("SCSI peripheral")
173  	},
174 	{
175 		I2O_CLASS_ATE_PORT,
176 		IC_CONFIGURE,
177 		IFVERBOSE("ATE port")
178 	},
179 	{
180 		I2O_CLASS_ATE_PERIPHERAL,
181 		0,
182 		COMMENT("ATE peripheral")
183 	},
184 	{
185 		I2O_CLASS_FLOPPY_CONTROLLER,
186 		IC_CONFIGURE,
187 		IFVERBOSE("floppy controller")
188 	},
189 	{
190 		I2O_CLASS_FLOPPY_DEVICE,
191 		0,
192 		COMMENT("floppy device")
193 	},
194 	{
195 		I2O_CLASS_BUS_ADAPTER_PORT,
196 		IC_CONFIGURE,
197 		IFVERBOSE("bus adapter port" )
198 	},
199 };
200 
201 #if defined(I2ODEBUG) && defined(I2OVERBOSE)
202 static const char * const iop_status[] = {
203 	"success",
204 	"abort (dirty)",
205 	"abort (no data transfer)",
206 	"abort (partial transfer)",
207 	"error (dirty)",
208 	"error (no data transfer)",
209 	"error (partial transfer)",
210 	"undefined error code",
211 	"process abort (dirty)",
212 	"process abort (no data transfer)",
213 	"process abort (partial transfer)",
214 	"transaction error",
215 };
216 #endif
217 
218 static inline u_int32_t	iop_inl(struct iop_softc *, int);
219 static inline void	iop_outl(struct iop_softc *, int, u_int32_t);
220 
221 static void	iop_config_interrupts(struct device *);
222 static void	iop_configure_devices(struct iop_softc *, int, int);
223 static void	iop_devinfo(int, char *);
224 static int	iop_print(void *, const char *);
225 static void	iop_shutdown(void *);
226 static int	iop_submatch(struct device *, struct cfdata *, void *);
227 static int	iop_vendor_print(void *, const char *);
228 
229 static void	iop_adjqparam(struct iop_softc *, int);
230 static void	iop_create_reconf_thread(void *);
231 static int	iop_handle_reply(struct iop_softc *, u_int32_t);
232 static int	iop_hrt_get(struct iop_softc *);
233 static int	iop_hrt_get0(struct iop_softc *, struct i2o_hrt *, int);
234 static void	iop_intr_event(struct device *, struct iop_msg *, void *);
235 static int	iop_lct_get0(struct iop_softc *, struct i2o_lct *, int,
236 			     u_int32_t);
237 static void	iop_msg_poll(struct iop_softc *, struct iop_msg *, int);
238 static void	iop_msg_wait(struct iop_softc *, struct iop_msg *, int);
239 static int	iop_ofifo_init(struct iop_softc *);
240 static int	iop_passthrough(struct iop_softc *, struct ioppt *,
241 				struct proc *);
242 static void	iop_reconf_thread(void *);
243 static void	iop_release_mfa(struct iop_softc *, u_int32_t);
244 static int	iop_reset(struct iop_softc *);
245 static int	iop_systab_set(struct iop_softc *);
246 static void	iop_tfn_print(struct iop_softc *, struct i2o_fault_notify *);
247 
248 #ifdef I2ODEBUG
249 static void	iop_reply_print(struct iop_softc *, struct i2o_reply *);
250 #endif
251 
252 static inline u_int32_t
253 iop_inl(struct iop_softc *sc, int off)
254 {
255 
256 	bus_space_barrier(sc->sc_iot, sc->sc_ioh, off, 4,
257 	    BUS_SPACE_BARRIER_WRITE | BUS_SPACE_BARRIER_READ);
258 	return (bus_space_read_4(sc->sc_iot, sc->sc_ioh, off));
259 }
260 
261 static inline void
262 iop_outl(struct iop_softc *sc, int off, u_int32_t val)
263 {
264 
265 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, off, val);
266 	bus_space_barrier(sc->sc_iot, sc->sc_ioh, off, 4,
267 	    BUS_SPACE_BARRIER_WRITE);
268 }
269 
270 /*
271  * Initialise the IOP and our interface.
272  */
273 void
274 iop_init(struct iop_softc *sc, const char *intrstr)
275 {
276 	struct iop_msg *im;
277 	int rv, i, j, state, nsegs;
278 	u_int32_t mask;
279 	char ident[64];
280 
281 	state = 0;
282 
283 	printf("I2O adapter");
284 
285 	if (iop_ictxhashtbl == NULL)
286 		iop_ictxhashtbl = hashinit(IOP_ICTXHASH_NBUCKETS, HASH_LIST,
287 		    M_DEVBUF, M_NOWAIT, &iop_ictxhash);
288 
289 	/* Disable interrupts at the IOP. */
290 	mask = iop_inl(sc, IOP_REG_INTR_MASK);
291 	iop_outl(sc, IOP_REG_INTR_MASK, mask | IOP_INTR_OFIFO);
292 
293 	/* Allocate a scratch DMA map for small miscellaneous shared data. */
294 	if (bus_dmamap_create(sc->sc_dmat, PAGE_SIZE, 1, PAGE_SIZE, 0,
295 	    BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &sc->sc_scr_dmamap) != 0) {
296 		printf("%s: cannot create scratch dmamap\n",
297 		    sc->sc_dv.dv_xname);
298 		return;
299 	}
300 
301 	if (bus_dmamem_alloc(sc->sc_dmat, PAGE_SIZE, PAGE_SIZE, 0,
302 	    sc->sc_scr_seg, 1, &nsegs, BUS_DMA_NOWAIT) != 0) {
303 		printf("%s: cannot alloc scratch dmamem\n",
304 		    sc->sc_dv.dv_xname);
305 		goto bail_out;
306 	}
307 	state++;
308 
309 	if (bus_dmamem_map(sc->sc_dmat, sc->sc_scr_seg, nsegs, PAGE_SIZE,
310 	    &sc->sc_scr, 0)) {
311 		printf("%s: cannot map scratch dmamem\n", sc->sc_dv.dv_xname);
312 		goto bail_out;
313 	}
314 	state++;
315 
316 	if (bus_dmamap_load(sc->sc_dmat, sc->sc_scr_dmamap, sc->sc_scr,
317 	    PAGE_SIZE, NULL, BUS_DMA_NOWAIT)) {
318 		printf("%s: cannot load scratch dmamap\n", sc->sc_dv.dv_xname);
319 		goto bail_out;
320 	}
321 	state++;
322 
323 #ifdef I2ODEBUG
324 	/* So that our debug checks don't choke. */
325 	sc->sc_framesize = 128;
326 #endif
327 
328 	/* Reset the adapter and request status. */
329  	if ((rv = iop_reset(sc)) != 0) {
330  		printf("%s: not responding (reset)\n", sc->sc_dv.dv_xname);
331 		goto bail_out;
332  	}
333 
334  	if ((rv = iop_status_get(sc, 1)) != 0) {
335 		printf("%s: not responding (get status)\n",
336 		    sc->sc_dv.dv_xname);
337 		goto bail_out;
338  	}
339 
340 	sc->sc_flags |= IOP_HAVESTATUS;
341 	iop_strvis(sc, sc->sc_status.productid, sizeof(sc->sc_status.productid),
342 	    ident, sizeof(ident));
343 	printf(" <%s>\n", ident);
344 
345 #ifdef I2ODEBUG
346 	printf("%s: orgid=0x%04x version=%d\n", sc->sc_dv.dv_xname,
347 	    le16toh(sc->sc_status.orgid),
348 	    (le32toh(sc->sc_status.segnumber) >> 12) & 15);
349 	printf("%s: type want have cbase\n", sc->sc_dv.dv_xname);
350 	printf("%s: mem  %04x %04x %08x\n", sc->sc_dv.dv_xname,
351 	    le32toh(sc->sc_status.desiredprivmemsize),
352 	    le32toh(sc->sc_status.currentprivmemsize),
353 	    le32toh(sc->sc_status.currentprivmembase));
354 	printf("%s: i/o  %04x %04x %08x\n", sc->sc_dv.dv_xname,
355 	    le32toh(sc->sc_status.desiredpriviosize),
356 	    le32toh(sc->sc_status.currentpriviosize),
357 	    le32toh(sc->sc_status.currentpriviobase));
358 #endif
359 
360 	sc->sc_maxob = le32toh(sc->sc_status.maxoutboundmframes);
361 	if (sc->sc_maxob > IOP_MAX_OUTBOUND)
362 		sc->sc_maxob = IOP_MAX_OUTBOUND;
363 	sc->sc_maxib = le32toh(sc->sc_status.maxinboundmframes);
364 	if (sc->sc_maxib > IOP_MAX_INBOUND)
365 		sc->sc_maxib = IOP_MAX_INBOUND;
366 	sc->sc_framesize = le16toh(sc->sc_status.inboundmframesize) << 2;
367 	if (sc->sc_framesize > IOP_MAX_MSG_SIZE)
368 		sc->sc_framesize = IOP_MAX_MSG_SIZE;
369 
370 #if defined(I2ODEBUG) || defined(DIAGNOSTIC)
371 	if (sc->sc_framesize < IOP_MIN_MSG_SIZE) {
372 		printf("%s: frame size too small (%d)\n",
373 		    sc->sc_dv.dv_xname, sc->sc_framesize);
374 		goto bail_out;
375 	}
376 #endif
377 
378 	/* Allocate message wrappers. */
379 	im = malloc(sizeof(*im) * sc->sc_maxib, M_DEVBUF, M_NOWAIT|M_ZERO);
380 	if (im == NULL) {
381 		printf("%s: memory allocation failure\n", sc->sc_dv.dv_xname);
382 		goto bail_out;
383 	}
384 	state++;
385 	sc->sc_ims = im;
386 	SLIST_INIT(&sc->sc_im_freelist);
387 
388 	for (i = 0, state++; i < sc->sc_maxib; i++, im++) {
389 		rv = bus_dmamap_create(sc->sc_dmat, IOP_MAX_XFER,
390 		    IOP_MAX_SEGS, IOP_MAX_XFER, 0,
391 		    BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW,
392 		    &im->im_xfer[0].ix_map);
393 		if (rv != 0) {
394 			printf("%s: couldn't create dmamap (%d)",
395 			    sc->sc_dv.dv_xname, rv);
396 			goto bail_out;
397 		}
398 
399 		im->im_tctx = i;
400 		SLIST_INSERT_HEAD(&sc->sc_im_freelist, im, im_chain);
401 	}
402 
403 	/* Initialise the IOP's outbound FIFO. */
404 	if (iop_ofifo_init(sc) != 0) {
405 		printf("%s: unable to init oubound FIFO\n",
406 		    sc->sc_dv.dv_xname);
407 		goto bail_out;
408 	}
409 
410 	/*
411  	 * Defer further configuration until (a) interrupts are working and
412  	 * (b) we have enough information to build the system table.
413  	 */
414 	config_interrupts((struct device *)sc, iop_config_interrupts);
415 
416 	/* Configure shutdown hook before we start any device activity. */
417 	if (iop_sdh == NULL)
418 		iop_sdh = shutdownhook_establish(iop_shutdown, NULL);
419 
420 	/* Ensure interrupts are enabled at the IOP. */
421 	mask = iop_inl(sc, IOP_REG_INTR_MASK);
422 	iop_outl(sc, IOP_REG_INTR_MASK, mask & ~IOP_INTR_OFIFO);
423 
424 	if (intrstr != NULL)
425 		printf("%s: interrupting at %s\n", sc->sc_dv.dv_xname,
426 		    intrstr);
427 
428 #ifdef I2ODEBUG
429 	printf("%s: queue depths: inbound %d/%d, outbound %d/%d\n",
430 	    sc->sc_dv.dv_xname, sc->sc_maxib,
431 	    le32toh(sc->sc_status.maxinboundmframes),
432 	    sc->sc_maxob, le32toh(sc->sc_status.maxoutboundmframes));
433 #endif
434 
435 	lockinit(&sc->sc_conflock, PRIBIO, "iopconf", hz * 30, 0);
436 	return;
437 
438  bail_out:
439  	if (state > 3) {
440 		for (j = 0; j < i; j++)
441 			bus_dmamap_destroy(sc->sc_dmat,
442 			    sc->sc_ims[j].im_xfer[0].ix_map);
443 		free(sc->sc_ims, M_DEVBUF);
444 	}
445 	if (state > 2)
446 		bus_dmamap_unload(sc->sc_dmat, sc->sc_scr_dmamap);
447 	if (state > 1)
448 		bus_dmamem_unmap(sc->sc_dmat, sc->sc_scr, PAGE_SIZE);
449 	if (state > 0)
450 		bus_dmamem_free(sc->sc_dmat, sc->sc_scr_seg, nsegs);
451 	bus_dmamap_destroy(sc->sc_dmat, sc->sc_scr_dmamap);
452 }
453 
454 /*
455  * Perform autoconfiguration tasks.
456  */
457 static void
458 iop_config_interrupts(struct device *self)
459 {
460 	struct iop_attach_args ia;
461 	struct iop_softc *sc, *iop;
462 	struct i2o_systab_entry *ste;
463 	int rv, i, niop;
464 
465 	sc = (struct iop_softc *)self;
466 	LIST_INIT(&sc->sc_iilist);
467 
468 	printf("%s: configuring...\n", sc->sc_dv.dv_xname);
469 
470 	if (iop_hrt_get(sc) != 0) {
471 		printf("%s: unable to retrieve HRT\n", sc->sc_dv.dv_xname);
472 		return;
473 	}
474 
475 	/*
476  	 * Build the system table.
477  	 */
478 	if (iop_systab == NULL) {
479 		for (i = 0, niop = 0; i < iop_cd.cd_ndevs; i++) {
480 			if ((iop = device_lookup(&iop_cd, i)) == NULL)
481 				continue;
482 			if ((iop->sc_flags & IOP_HAVESTATUS) == 0)
483 				continue;
484 			if (iop_status_get(iop, 1) != 0) {
485 				printf("%s: unable to retrieve status\n",
486 				    sc->sc_dv.dv_xname);
487 				iop->sc_flags &= ~IOP_HAVESTATUS;
488 				continue;
489 			}
490 			niop++;
491 		}
492 		if (niop == 0)
493 			return;
494 
495 		i = sizeof(struct i2o_systab_entry) * (niop - 1) +
496 		    sizeof(struct i2o_systab);
497 		iop_systab_size = i;
498 		iop_systab = malloc(i, M_DEVBUF, M_NOWAIT|M_ZERO);
499 
500 		iop_systab->numentries = niop;
501 		iop_systab->version = I2O_VERSION_11;
502 
503 		for (i = 0, ste = iop_systab->entry; i < iop_cd.cd_ndevs; i++) {
504 			if ((iop = device_lookup(&iop_cd, i)) == NULL)
505 				continue;
506 			if ((iop->sc_flags & IOP_HAVESTATUS) == 0)
507 				continue;
508 
509 			ste->orgid = iop->sc_status.orgid;
510 			ste->iopid = iop->sc_dv.dv_unit + 2;
511 			ste->segnumber =
512 			    htole32(le32toh(iop->sc_status.segnumber) & ~4095);
513 			ste->iopcaps = iop->sc_status.iopcaps;
514 			ste->inboundmsgframesize =
515 			    iop->sc_status.inboundmframesize;
516 			ste->inboundmsgportaddresslow =
517 			    htole32(iop->sc_memaddr + IOP_REG_IFIFO);
518 			ste++;
519 		}
520 	}
521 
522 	/*
523 	 * Post the system table to the IOP and bring it to the OPERATIONAL
524 	 * state.
525 	 */
526 	if (iop_systab_set(sc) != 0) {
527 		printf("%s: unable to set system table\n", sc->sc_dv.dv_xname);
528 		return;
529 	}
530 	if (iop_simple_cmd(sc, I2O_TID_IOP, I2O_EXEC_SYS_ENABLE, IOP_ICTX, 1,
531 	    30000) != 0) {
532 		printf("%s: unable to enable system\n", sc->sc_dv.dv_xname);
533 		return;
534 	}
535 
536 	/*
537 	 * Set up an event handler for this IOP.
538 	 */
539 	sc->sc_eventii.ii_dv = self;
540 	sc->sc_eventii.ii_intr = iop_intr_event;
541 	sc->sc_eventii.ii_flags = II_NOTCTX | II_UTILITY;
542 	sc->sc_eventii.ii_tid = I2O_TID_IOP;
543 	iop_initiator_register(sc, &sc->sc_eventii);
544 
545 	rv = iop_util_eventreg(sc, &sc->sc_eventii,
546 	    I2O_EVENT_EXEC_RESOURCE_LIMITS |
547 	    I2O_EVENT_EXEC_CONNECTION_FAIL |
548 	    I2O_EVENT_EXEC_ADAPTER_FAULT |
549 	    I2O_EVENT_EXEC_POWER_FAIL |
550 	    I2O_EVENT_EXEC_RESET_PENDING |
551 	    I2O_EVENT_EXEC_RESET_IMMINENT |
552 	    I2O_EVENT_EXEC_HARDWARE_FAIL |
553 	    I2O_EVENT_EXEC_XCT_CHANGE |
554 	    I2O_EVENT_EXEC_DDM_AVAILIBILITY |
555 	    I2O_EVENT_GEN_DEVICE_RESET |
556 	    I2O_EVENT_GEN_STATE_CHANGE |
557 	    I2O_EVENT_GEN_GENERAL_WARNING);
558 	if (rv != 0) {
559 		printf("%s: unable to register for events", sc->sc_dv.dv_xname);
560 		return;
561 	}
562 
563 	/*
564 	 * Attempt to match and attach a product-specific extension.
565 	 */
566 	ia.ia_class = I2O_CLASS_ANY;
567 	ia.ia_tid = I2O_TID_IOP;
568 	config_found_sm(self, &ia, iop_vendor_print, iop_submatch);
569 
570 	/*
571 	 * Start device configuration.
572 	 */
573 	lockmgr(&sc->sc_conflock, LK_EXCLUSIVE, NULL);
574 	if ((rv = iop_reconfigure(sc, 0)) == -1) {
575 		printf("%s: configure failed (%d)\n", sc->sc_dv.dv_xname, rv);
576 		return;
577 	}
578 	lockmgr(&sc->sc_conflock, LK_RELEASE, NULL);
579 
580 	kthread_create(iop_create_reconf_thread, sc);
581 }
582 
583 /*
584  * Create the reconfiguration thread.  Called after the standard kernel
585  * threads have been created.
586  */
587 static void
588 iop_create_reconf_thread(void *cookie)
589 {
590 	struct iop_softc *sc;
591 	int rv;
592 
593 	sc = cookie;
594 	sc->sc_flags |= IOP_ONLINE;
595 
596 	rv = kthread_create1(iop_reconf_thread, sc, &sc->sc_reconf_proc,
597  	    "%s", sc->sc_dv.dv_xname);
598  	if (rv != 0) {
599 		printf("%s: unable to create reconfiguration thread (%d)",
600  		    sc->sc_dv.dv_xname, rv);
601  		return;
602  	}
603 }
604 
605 /*
606  * Reconfiguration thread; listens for LCT change notification, and
607  * initiates re-configuration if received.
608  */
609 static void
610 iop_reconf_thread(void *cookie)
611 {
612 	struct iop_softc *sc;
613 	struct i2o_lct lct;
614 	u_int32_t chgind;
615 	int rv;
616 
617 	sc = cookie;
618 	chgind = sc->sc_chgind + 1;
619 
620 	for (;;) {
621 		DPRINTF(("%s: async reconfig: requested 0x%08x\n",
622 		    sc->sc_dv.dv_xname, chgind));
623 
624 		PHOLD(sc->sc_reconf_proc);
625 		rv = iop_lct_get0(sc, &lct, sizeof(lct), chgind);
626 		PRELE(sc->sc_reconf_proc);
627 
628 		DPRINTF(("%s: async reconfig: notified (0x%08x, %d)\n",
629 		    sc->sc_dv.dv_xname, le32toh(lct.changeindicator), rv));
630 
631 		if (rv == 0 &&
632 		    lockmgr(&sc->sc_conflock, LK_EXCLUSIVE, NULL) == 0) {
633 			iop_reconfigure(sc, le32toh(lct.changeindicator));
634 			chgind = sc->sc_chgind + 1;
635 			lockmgr(&sc->sc_conflock, LK_RELEASE, NULL);
636 		}
637 
638 		tsleep(iop_reconf_thread, PWAIT, "iopzzz", hz * 5);
639 	}
640 }
641 
642 /*
643  * Reconfigure: find new and removed devices.
644  */
645 int
646 iop_reconfigure(struct iop_softc *sc, u_int chgind)
647 {
648 	struct iop_msg *im;
649 	struct i2o_hba_bus_scan mf;
650 	struct i2o_lct_entry *le;
651 	struct iop_initiator *ii, *nextii;
652 	int rv, tid, i;
653 
654 	/*
655 	 * If the reconfiguration request isn't the result of LCT change
656 	 * notification, then be more thorough: ask all bus ports to scan
657 	 * their busses.  Wait up to 5 minutes for each bus port to complete
658 	 * the request.
659 	 */
660 	if (chgind == 0) {
661 		if ((rv = iop_lct_get(sc)) != 0) {
662 			DPRINTF(("iop_reconfigure: unable to read LCT\n"));
663 			return (rv);
664 		}
665 
666 		le = sc->sc_lct->entry;
667 		for (i = 0; i < sc->sc_nlctent; i++, le++) {
668 			if ((le16toh(le->classid) & 4095) !=
669 			    I2O_CLASS_BUS_ADAPTER_PORT)
670 				continue;
671 			tid = le16toh(le->localtid) & 4095;
672 
673 			im = iop_msg_alloc(sc, IM_WAIT);
674 
675 			mf.msgflags = I2O_MSGFLAGS(i2o_hba_bus_scan);
676 			mf.msgfunc = I2O_MSGFUNC(tid, I2O_HBA_BUS_SCAN);
677 			mf.msgictx = IOP_ICTX;
678 			mf.msgtctx = im->im_tctx;
679 
680 			DPRINTF(("%s: scanning bus %d\n", sc->sc_dv.dv_xname,
681 			    tid));
682 
683 			rv = iop_msg_post(sc, im, &mf, 5*60*1000);
684 			iop_msg_free(sc, im);
685 #ifdef I2ODEBUG
686 			if (rv != 0)
687 				printf("%s: bus scan failed\n",
688 				    sc->sc_dv.dv_xname);
689 #endif
690 		}
691 	} else if (chgind <= sc->sc_chgind) {
692 		DPRINTF(("%s: LCT unchanged (async)\n", sc->sc_dv.dv_xname));
693 		return (0);
694 	}
695 
696 	/* Re-read the LCT and determine if it has changed. */
697 	if ((rv = iop_lct_get(sc)) != 0) {
698 		DPRINTF(("iop_reconfigure: unable to re-read LCT\n"));
699 		return (rv);
700 	}
701 	DPRINTF(("%s: %d LCT entries\n", sc->sc_dv.dv_xname, sc->sc_nlctent));
702 
703 	chgind = le32toh(sc->sc_lct->changeindicator);
704 	if (chgind == sc->sc_chgind) {
705 		DPRINTF(("%s: LCT unchanged\n", sc->sc_dv.dv_xname));
706 		return (0);
707 	}
708 	DPRINTF(("%s: LCT changed\n", sc->sc_dv.dv_xname));
709 	sc->sc_chgind = chgind;
710 
711 	if (sc->sc_tidmap != NULL)
712 		free(sc->sc_tidmap, M_DEVBUF);
713 	sc->sc_tidmap = malloc(sc->sc_nlctent * sizeof(struct iop_tidmap),
714 	    M_DEVBUF, M_NOWAIT|M_ZERO);
715 
716 	/* Allow 1 queued command per device while we're configuring. */
717 	iop_adjqparam(sc, 1);
718 
719 	/*
720 	 * Match and attach child devices.  We configure high-level devices
721 	 * first so that any claims will propagate throughout the LCT,
722 	 * hopefully masking off aliased devices as a result.
723 	 *
724 	 * Re-reading the LCT at this point is a little dangerous, but we'll
725 	 * trust the IOP (and the operator) to behave itself...
726 	 */
727 	iop_configure_devices(sc, IC_CONFIGURE | IC_PRIORITY,
728 	    IC_CONFIGURE | IC_PRIORITY);
729 	if ((rv = iop_lct_get(sc)) != 0)
730 		DPRINTF(("iop_reconfigure: unable to re-read LCT\n"));
731 	iop_configure_devices(sc, IC_CONFIGURE | IC_PRIORITY,
732 	    IC_CONFIGURE);
733 
734 	for (ii = LIST_FIRST(&sc->sc_iilist); ii != NULL; ii = nextii) {
735 		nextii = LIST_NEXT(ii, ii_list);
736 
737 		/* Detach devices that were configured, but are now gone. */
738 		for (i = 0; i < sc->sc_nlctent; i++)
739 			if (ii->ii_tid == sc->sc_tidmap[i].it_tid)
740 				break;
741 		if (i == sc->sc_nlctent ||
742 		    (sc->sc_tidmap[i].it_flags & IT_CONFIGURED) == 0)
743 			config_detach(ii->ii_dv, DETACH_FORCE);
744 
745 		/*
746 		 * Tell initiators that existed before the re-configuration
747 		 * to re-configure.
748 		 */
749 		if (ii->ii_reconfig == NULL)
750 			continue;
751 		if ((rv = (*ii->ii_reconfig)(ii->ii_dv)) != 0)
752 			printf("%s: %s failed reconfigure (%d)\n",
753 			    sc->sc_dv.dv_xname, ii->ii_dv->dv_xname, rv);
754 	}
755 
756 	/* Re-adjust queue parameters and return. */
757 	if (sc->sc_nii != 0)
758 		iop_adjqparam(sc, (sc->sc_maxib - sc->sc_nuii - IOP_MF_RESERVE)
759 		    / sc->sc_nii);
760 
761 	return (0);
762 }
763 
764 /*
765  * Configure I2O devices into the system.
766  */
767 static void
768 iop_configure_devices(struct iop_softc *sc, int mask, int maskval)
769 {
770 	struct iop_attach_args ia;
771 	struct iop_initiator *ii;
772 	const struct i2o_lct_entry *le;
773 	struct device *dv;
774 	int i, j, nent;
775 	u_int usertid;
776 
777 	nent = sc->sc_nlctent;
778 	for (i = 0, le = sc->sc_lct->entry; i < nent; i++, le++) {
779 		sc->sc_tidmap[i].it_tid = le16toh(le->localtid) & 4095;
780 
781 		/* Ignore the device if it's in use. */
782 		usertid = le32toh(le->usertid) & 4095;
783 		if (usertid != I2O_TID_NONE && usertid != I2O_TID_HOST)
784 			continue;
785 
786 		ia.ia_class = le16toh(le->classid) & 4095;
787 		ia.ia_tid = sc->sc_tidmap[i].it_tid;
788 
789 		/* Ignore uninteresting devices. */
790 		for (j = 0; j < sizeof(iop_class) / sizeof(iop_class[0]); j++)
791 			if (iop_class[j].ic_class == ia.ia_class)
792 				break;
793 		if (j < sizeof(iop_class) / sizeof(iop_class[0]) &&
794 		    (iop_class[j].ic_flags & mask) != maskval)
795 			continue;
796 
797 		/*
798 		 * Try to configure the device only if it's not already
799 		 * configured.
800  		 */
801  		LIST_FOREACH(ii, &sc->sc_iilist, ii_list) {
802  			if (ia.ia_tid == ii->ii_tid) {
803 				sc->sc_tidmap[i].it_flags |= IT_CONFIGURED;
804 				strcpy(sc->sc_tidmap[i].it_dvname,
805 				    ii->ii_dv->dv_xname);
806  				break;
807 			}
808 		}
809 		if (ii != NULL)
810 			continue;
811 
812 		dv = config_found_sm(&sc->sc_dv, &ia, iop_print, iop_submatch);
813 		if (dv != NULL) {
814  			sc->sc_tidmap[i].it_flags |= IT_CONFIGURED;
815 			strcpy(sc->sc_tidmap[i].it_dvname, dv->dv_xname);
816 		}
817 	}
818 }
819 
820 /*
821  * Adjust queue parameters for all child devices.
822  */
823 static void
824 iop_adjqparam(struct iop_softc *sc, int mpi)
825 {
826 	struct iop_initiator *ii;
827 
828 	LIST_FOREACH(ii, &sc->sc_iilist, ii_list)
829 		if (ii->ii_adjqparam != NULL)
830 			(*ii->ii_adjqparam)(ii->ii_dv, mpi);
831 }
832 
833 static void
834 iop_devinfo(int class, char *devinfo)
835 {
836 #ifdef I2OVERBOSE
837 	int i;
838 
839 	for (i = 0; i < sizeof(iop_class) / sizeof(iop_class[0]); i++)
840 		if (class == iop_class[i].ic_class)
841 			break;
842 
843 	if (i == sizeof(iop_class) / sizeof(iop_class[0]))
844 		sprintf(devinfo, "device (class 0x%x)", class);
845 	else
846 		strcpy(devinfo, iop_class[i].ic_caption);
847 #else
848 
849 	sprintf(devinfo, "device (class 0x%x)", class);
850 #endif
851 }
852 
853 static int
854 iop_print(void *aux, const char *pnp)
855 {
856 	struct iop_attach_args *ia;
857 	char devinfo[256];
858 
859 	ia = aux;
860 
861 	if (pnp != NULL) {
862 		iop_devinfo(ia->ia_class, devinfo);
863 		printf("%s at %s", devinfo, pnp);
864 	}
865 	printf(" tid %d", ia->ia_tid);
866 	return (UNCONF);
867 }
868 
869 static int
870 iop_vendor_print(void *aux, const char *pnp)
871 {
872 
873 	return (QUIET);
874 }
875 
876 static int
877 iop_submatch(struct device *parent, struct cfdata *cf, void *aux)
878 {
879 	struct iop_attach_args *ia;
880 
881 	ia = aux;
882 
883 	if (cf->iopcf_tid != IOPCF_TID_DEFAULT && cf->iopcf_tid != ia->ia_tid)
884 		return (0);
885 
886 	return ((*cf->cf_attach->ca_match)(parent, cf, aux));
887 }
888 
889 /*
890  * Shut down all configured IOPs.
891  */
892 static void
893 iop_shutdown(void *junk)
894 {
895 	struct iop_softc *sc;
896 	int i;
897 
898 	printf("shutting down iop devices...");
899 
900 	for (i = 0; i < iop_cd.cd_ndevs; i++) {
901 		if ((sc = device_lookup(&iop_cd, i)) == NULL)
902 			continue;
903 		if ((sc->sc_flags & IOP_ONLINE) == 0)
904 			continue;
905 		iop_simple_cmd(sc, I2O_TID_IOP, I2O_EXEC_SYS_QUIESCE, IOP_ICTX,
906 		    0, 5000);
907 		iop_simple_cmd(sc, I2O_TID_IOP, I2O_EXEC_IOP_CLEAR, IOP_ICTX,
908 		    0, 1000);
909 	}
910 
911 	/* Wait.  Some boards could still be flushing, stupidly enough. */
912 	delay(5000*1000);
913 	printf(" done\n");
914 }
915 
916 /*
917  * Retrieve IOP status.
918  */
919 int
920 iop_status_get(struct iop_softc *sc, int nosleep)
921 {
922 	struct i2o_exec_status_get mf;
923 	struct i2o_status *st;
924 	paddr_t pa;
925 	int rv, i;
926 
927 	pa = sc->sc_scr_seg->ds_addr;
928 	st = (struct i2o_status *)sc->sc_scr;
929 
930 	mf.msgflags = I2O_MSGFLAGS(i2o_exec_status_get);
931 	mf.msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_STATUS_GET);
932 	mf.reserved[0] = 0;
933 	mf.reserved[1] = 0;
934 	mf.reserved[2] = 0;
935 	mf.reserved[3] = 0;
936 	mf.addrlow = (u_int32_t)pa;
937 	mf.addrhigh = (u_int32_t)((u_int64_t)pa >> 32);
938 	mf.length = sizeof(sc->sc_status);
939 
940 	memset(st, 0, sizeof(*st));
941 	bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*st),
942 	    BUS_DMASYNC_PREREAD);
943 
944 	if ((rv = iop_post(sc, (u_int32_t *)&mf)) != 0)
945 		return (rv);
946 
947 	for (i = 25; i != 0; i--) {
948 		bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0,
949 		    sizeof(*st), BUS_DMASYNC_POSTREAD);
950 		if (st->syncbyte == 0xff)
951 			break;
952 		if (nosleep)
953 			DELAY(100*1000);
954 		else
955 			tsleep(iop_status_get, PWAIT, "iopstat", hz / 10);
956 	}
957 
958 	if (st->syncbyte != 0xff) {
959 		printf("%s: STATUS_GET timed out\n", sc->sc_dv.dv_xname);
960 		rv = EIO;
961 	} else {
962 		memcpy(&sc->sc_status, st, sizeof(sc->sc_status));
963 		rv = 0;
964 	}
965 
966 	return (rv);
967 }
968 
969 /*
970  * Initialize and populate the IOP's outbound FIFO.
971  */
972 static int
973 iop_ofifo_init(struct iop_softc *sc)
974 {
975 	bus_addr_t addr;
976 	bus_dma_segment_t seg;
977 	struct i2o_exec_outbound_init *mf;
978 	int i, rseg, rv;
979 	u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)], *sw;
980 
981 	sw = (u_int32_t *)sc->sc_scr;
982 
983 	mf = (struct i2o_exec_outbound_init *)mb;
984 	mf->msgflags = I2O_MSGFLAGS(i2o_exec_outbound_init);
985 	mf->msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_OUTBOUND_INIT);
986 	mf->msgictx = IOP_ICTX;
987 	mf->msgtctx = 0;
988 	mf->pagesize = PAGE_SIZE;
989 	mf->flags = IOP_INIT_CODE | ((sc->sc_framesize >> 2) << 16);
990 
991 	/*
992 	 * The I2O spec says that there are two SGLs: one for the status
993 	 * word, and one for a list of discarded MFAs.  It continues to say
994 	 * that if you don't want to get the list of MFAs, an IGNORE SGL is
995 	 * necessary; this isn't the case (and is in fact a bad thing).
996 	 */
997 	mb[sizeof(*mf) / sizeof(u_int32_t) + 0] = sizeof(*sw) |
998 	    I2O_SGL_SIMPLE | I2O_SGL_END_BUFFER | I2O_SGL_END;
999 	mb[sizeof(*mf) / sizeof(u_int32_t) + 1] =
1000 	    (u_int32_t)sc->sc_scr_seg->ds_addr;
1001 	mb[0] += 2 << 16;
1002 
1003 	*sw = 0;
1004 	bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*sw),
1005 	    BUS_DMASYNC_PREREAD);
1006 
1007 	if ((rv = iop_post(sc, mb)) != 0)
1008 		return (rv);
1009 
1010 	POLL(5000,
1011 	    (bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*sw),
1012 	    BUS_DMASYNC_POSTREAD),
1013 	    *sw == htole32(I2O_EXEC_OUTBOUND_INIT_COMPLETE)));
1014 
1015 	if (*sw != htole32(I2O_EXEC_OUTBOUND_INIT_COMPLETE)) {
1016 		printf("%s: outbound FIFO init failed (%d)\n",
1017 		    sc->sc_dv.dv_xname, le32toh(*sw));
1018 		return (EIO);
1019 	}
1020 
1021 	/* Allocate DMA safe memory for the reply frames. */
1022 	if (sc->sc_rep_phys == 0) {
1023 		sc->sc_rep_size = sc->sc_maxob * sc->sc_framesize;
1024 
1025 		rv = bus_dmamem_alloc(sc->sc_dmat, sc->sc_rep_size, PAGE_SIZE,
1026 		    0, &seg, 1, &rseg, BUS_DMA_NOWAIT);
1027 		if (rv != 0) {
1028 			printf("%s: dma alloc = %d\n", sc->sc_dv.dv_xname,
1029 			   rv);
1030 			return (rv);
1031 		}
1032 
1033 		rv = bus_dmamem_map(sc->sc_dmat, &seg, rseg, sc->sc_rep_size,
1034 		    &sc->sc_rep, BUS_DMA_NOWAIT | BUS_DMA_COHERENT);
1035 		if (rv != 0) {
1036 			printf("%s: dma map = %d\n", sc->sc_dv.dv_xname, rv);
1037 			return (rv);
1038 		}
1039 
1040 		rv = bus_dmamap_create(sc->sc_dmat, sc->sc_rep_size, 1,
1041 		    sc->sc_rep_size, 0, BUS_DMA_NOWAIT, &sc->sc_rep_dmamap);
1042 		if (rv != 0) {
1043 			printf("%s: dma create = %d\n", sc->sc_dv.dv_xname,
1044 			    rv);
1045 			return (rv);
1046 		}
1047 
1048 		rv = bus_dmamap_load(sc->sc_dmat, sc->sc_rep_dmamap,
1049 		    sc->sc_rep, sc->sc_rep_size, NULL, BUS_DMA_NOWAIT);
1050 		if (rv != 0) {
1051 			printf("%s: dma load = %d\n", sc->sc_dv.dv_xname, rv);
1052 			return (rv);
1053 		}
1054 
1055 		sc->sc_rep_phys = sc->sc_rep_dmamap->dm_segs[0].ds_addr;
1056 	}
1057 
1058 	/* Populate the outbound FIFO. */
1059 	for (i = sc->sc_maxob, addr = sc->sc_rep_phys; i != 0; i--) {
1060 		iop_outl(sc, IOP_REG_OFIFO, (u_int32_t)addr);
1061 		addr += sc->sc_framesize;
1062 	}
1063 
1064 	return (0);
1065 }
1066 
1067 /*
1068  * Read the specified number of bytes from the IOP's hardware resource table.
1069  */
1070 static int
1071 iop_hrt_get0(struct iop_softc *sc, struct i2o_hrt *hrt, int size)
1072 {
1073 	struct iop_msg *im;
1074 	int rv;
1075 	struct i2o_exec_hrt_get *mf;
1076 	u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)];
1077 
1078 	im = iop_msg_alloc(sc, IM_WAIT);
1079 	mf = (struct i2o_exec_hrt_get *)mb;
1080 	mf->msgflags = I2O_MSGFLAGS(i2o_exec_hrt_get);
1081 	mf->msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_HRT_GET);
1082 	mf->msgictx = IOP_ICTX;
1083 	mf->msgtctx = im->im_tctx;
1084 
1085 	iop_msg_map(sc, im, mb, hrt, size, 0, NULL);
1086 	rv = iop_msg_post(sc, im, mb, 30000);
1087 	iop_msg_unmap(sc, im);
1088 	iop_msg_free(sc, im);
1089 	return (rv);
1090 }
1091 
1092 /*
1093  * Read the IOP's hardware resource table.
1094  */
1095 static int
1096 iop_hrt_get(struct iop_softc *sc)
1097 {
1098 	struct i2o_hrt hrthdr, *hrt;
1099 	int size, rv;
1100 
1101 	PHOLD(curproc);
1102 	rv = iop_hrt_get0(sc, &hrthdr, sizeof(hrthdr));
1103 	PRELE(curproc);
1104 	if (rv != 0)
1105 		return (rv);
1106 
1107 	DPRINTF(("%s: %d hrt entries\n", sc->sc_dv.dv_xname,
1108 	    le16toh(hrthdr.numentries)));
1109 
1110 	size = sizeof(struct i2o_hrt) +
1111 	    (le16toh(hrthdr.numentries) - 1) * sizeof(struct i2o_hrt_entry);
1112 	hrt = (struct i2o_hrt *)malloc(size, M_DEVBUF, M_NOWAIT);
1113 
1114 	if ((rv = iop_hrt_get0(sc, hrt, size)) != 0) {
1115 		free(hrt, M_DEVBUF);
1116 		return (rv);
1117 	}
1118 
1119 	if (sc->sc_hrt != NULL)
1120 		free(sc->sc_hrt, M_DEVBUF);
1121 	sc->sc_hrt = hrt;
1122 	return (0);
1123 }
1124 
1125 /*
1126  * Request the specified number of bytes from the IOP's logical
1127  * configuration table.  If a change indicator is specified, this
1128  * is a verbatim notification request, so the caller is prepared
1129  * to wait indefinitely.
1130  */
1131 static int
1132 iop_lct_get0(struct iop_softc *sc, struct i2o_lct *lct, int size,
1133 	     u_int32_t chgind)
1134 {
1135 	struct iop_msg *im;
1136 	struct i2o_exec_lct_notify *mf;
1137 	int rv;
1138 	u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)];
1139 
1140 	im = iop_msg_alloc(sc, IM_WAIT);
1141 	memset(lct, 0, size);
1142 
1143 	mf = (struct i2o_exec_lct_notify *)mb;
1144 	mf->msgflags = I2O_MSGFLAGS(i2o_exec_lct_notify);
1145 	mf->msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_LCT_NOTIFY);
1146 	mf->msgictx = IOP_ICTX;
1147 	mf->msgtctx = im->im_tctx;
1148 	mf->classid = I2O_CLASS_ANY;
1149 	mf->changeindicator = chgind;
1150 
1151 #ifdef I2ODEBUG
1152 	printf("iop_lct_get0: reading LCT");
1153 	if (chgind != 0)
1154 		printf(" (async)");
1155 	printf("\n");
1156 #endif
1157 
1158 	iop_msg_map(sc, im, mb, lct, size, 0, NULL);
1159 	rv = iop_msg_post(sc, im, mb, (chgind == 0 ? 120*1000 : 0));
1160 	iop_msg_unmap(sc, im);
1161 	iop_msg_free(sc, im);
1162 	return (rv);
1163 }
1164 
1165 /*
1166  * Read the IOP's logical configuration table.
1167  */
1168 int
1169 iop_lct_get(struct iop_softc *sc)
1170 {
1171 	int esize, size, rv;
1172 	struct i2o_lct *lct;
1173 
1174 	esize = le32toh(sc->sc_status.expectedlctsize);
1175 	lct = (struct i2o_lct *)malloc(esize, M_DEVBUF, M_WAITOK);
1176 	if (lct == NULL)
1177 		return (ENOMEM);
1178 
1179 	if ((rv = iop_lct_get0(sc, lct, esize, 0)) != 0) {
1180 		free(lct, M_DEVBUF);
1181 		return (rv);
1182 	}
1183 
1184 	size = le16toh(lct->tablesize) << 2;
1185 	if (esize != size) {
1186 		free(lct, M_DEVBUF);
1187 		lct = (struct i2o_lct *)malloc(size, M_DEVBUF, M_WAITOK);
1188 		if (lct == NULL)
1189 			return (ENOMEM);
1190 
1191 		if ((rv = iop_lct_get0(sc, lct, size, 0)) != 0) {
1192 			free(lct, M_DEVBUF);
1193 			return (rv);
1194 		}
1195 	}
1196 
1197 	/* Swap in the new LCT. */
1198 	if (sc->sc_lct != NULL)
1199 		free(sc->sc_lct, M_DEVBUF);
1200 	sc->sc_lct = lct;
1201 	sc->sc_nlctent = ((le16toh(sc->sc_lct->tablesize) << 2) -
1202 	    sizeof(struct i2o_lct) + sizeof(struct i2o_lct_entry)) /
1203 	    sizeof(struct i2o_lct_entry);
1204 	return (0);
1205 }
1206 
1207 /*
1208  * Request the specified parameter group from the target.  If an initiator
1209  * is specified (a) don't wait for the operation to complete, but instead
1210  * let the initiator's interrupt handler deal with the reply and (b) place a
1211  * pointer to the parameter group op in the wrapper's `im_dvcontext' field.
1212  */
1213 int
1214 iop_field_get_all(struct iop_softc *sc, int tid, int group, void *buf,
1215 		  int size, struct iop_initiator *ii)
1216 {
1217 	struct iop_msg *im;
1218 	struct i2o_util_params_op *mf;
1219 	struct i2o_reply *rf;
1220 	int rv;
1221 	struct iop_pgop *pgop;
1222 	u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)];
1223 
1224 	im = iop_msg_alloc(sc, (ii == NULL ? IM_WAIT : 0) | IM_NOSTATUS);
1225 	if ((pgop = malloc(sizeof(*pgop), M_DEVBUF, M_WAITOK)) == NULL) {
1226 		iop_msg_free(sc, im);
1227 		return (ENOMEM);
1228 	}
1229 	if ((rf = malloc(sizeof(*rf), M_DEVBUF, M_WAITOK)) == NULL) {
1230 		iop_msg_free(sc, im);
1231 		free(pgop, M_DEVBUF);
1232 		return (ENOMEM);
1233 	}
1234 	im->im_dvcontext = pgop;
1235 	im->im_rb = rf;
1236 
1237 	mf = (struct i2o_util_params_op *)mb;
1238 	mf->msgflags = I2O_MSGFLAGS(i2o_util_params_op);
1239 	mf->msgfunc = I2O_MSGFUNC(tid, I2O_UTIL_PARAMS_GET);
1240 	mf->msgictx = IOP_ICTX;
1241 	mf->msgtctx = im->im_tctx;
1242 	mf->flags = 0;
1243 
1244 	pgop->olh.count = htole16(1);
1245 	pgop->olh.reserved = htole16(0);
1246 	pgop->oat.operation = htole16(I2O_PARAMS_OP_FIELD_GET);
1247 	pgop->oat.fieldcount = htole16(0xffff);
1248 	pgop->oat.group = htole16(group);
1249 
1250 	if (ii == NULL)
1251 		PHOLD(curproc);
1252 
1253 	memset(buf, 0, size);
1254 	iop_msg_map(sc, im, mb, pgop, sizeof(*pgop), 1, NULL);
1255 	iop_msg_map(sc, im, mb, buf, size, 0, NULL);
1256 	rv = iop_msg_post(sc, im, mb, (ii == NULL ? 30000 : 0));
1257 
1258 	if (ii == NULL)
1259 		PRELE(curproc);
1260 
1261 	/* Detect errors; let partial transfers to count as success. */
1262 	if (ii == NULL && rv == 0) {
1263 		if (rf->reqstatus == I2O_STATUS_ERROR_PARTIAL_XFER &&
1264 		    le16toh(rf->detail) == I2O_DSC_UNKNOWN_ERROR)
1265 			rv = 0;
1266 		else
1267 			rv = (rf->reqstatus != 0 ? EIO : 0);
1268 
1269 		if (rv != 0)
1270 			printf("%s: FIELD_GET failed for tid %d group %d\n",
1271 			    sc->sc_dv.dv_xname, tid, group);
1272 	}
1273 
1274 	if (ii == NULL || rv != 0) {
1275 		iop_msg_unmap(sc, im);
1276 		iop_msg_free(sc, im);
1277 		free(pgop, M_DEVBUF);
1278 		free(rf, M_DEVBUF);
1279 	}
1280 
1281 	return (rv);
1282 }
1283 
1284 /*
1285  * Set a single field in a scalar parameter group.
1286  */
1287 int
1288 iop_field_set(struct iop_softc *sc, int tid, int group, void *buf,
1289 	      int size, int field)
1290 {
1291 	struct iop_msg *im;
1292 	struct i2o_util_params_op *mf;
1293 	struct iop_pgop *pgop;
1294 	int rv, totsize;
1295 	u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)];
1296 
1297 	totsize = sizeof(*pgop) + size;
1298 
1299 	im = iop_msg_alloc(sc, IM_WAIT);
1300 	if ((pgop = malloc(totsize, M_DEVBUF, M_WAITOK)) == NULL) {
1301 		iop_msg_free(sc, im);
1302 		return (ENOMEM);
1303 	}
1304 
1305 	mf = (struct i2o_util_params_op *)mb;
1306 	mf->msgflags = I2O_MSGFLAGS(i2o_util_params_op);
1307 	mf->msgfunc = I2O_MSGFUNC(tid, I2O_UTIL_PARAMS_SET);
1308 	mf->msgictx = IOP_ICTX;
1309 	mf->msgtctx = im->im_tctx;
1310 	mf->flags = 0;
1311 
1312 	pgop->olh.count = htole16(1);
1313 	pgop->olh.reserved = htole16(0);
1314 	pgop->oat.operation = htole16(I2O_PARAMS_OP_FIELD_SET);
1315 	pgop->oat.fieldcount = htole16(1);
1316 	pgop->oat.group = htole16(group);
1317 	pgop->oat.fields[0] = htole16(field);
1318 	memcpy(pgop + 1, buf, size);
1319 
1320 	iop_msg_map(sc, im, mb, pgop, totsize, 1, NULL);
1321 	rv = iop_msg_post(sc, im, mb, 30000);
1322 	if (rv != 0)
1323 		printf("%s: FIELD_SET failed for tid %d group %d\n",
1324 		    sc->sc_dv.dv_xname, tid, group);
1325 
1326 	iop_msg_unmap(sc, im);
1327 	iop_msg_free(sc, im);
1328 	free(pgop, M_DEVBUF);
1329 	return (rv);
1330 }
1331 
1332 /*
1333  * Delete all rows in a tablular parameter group.
1334  */
1335 int
1336 iop_table_clear(struct iop_softc *sc, int tid, int group)
1337 {
1338 	struct iop_msg *im;
1339 	struct i2o_util_params_op *mf;
1340 	struct iop_pgop pgop;
1341 	u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)];
1342 	int rv;
1343 
1344 	im = iop_msg_alloc(sc, IM_WAIT);
1345 
1346 	mf = (struct i2o_util_params_op *)mb;
1347 	mf->msgflags = I2O_MSGFLAGS(i2o_util_params_op);
1348 	mf->msgfunc = I2O_MSGFUNC(tid, I2O_UTIL_PARAMS_SET);
1349 	mf->msgictx = IOP_ICTX;
1350 	mf->msgtctx = im->im_tctx;
1351 	mf->flags = 0;
1352 
1353 	pgop.olh.count = htole16(1);
1354 	pgop.olh.reserved = htole16(0);
1355 	pgop.oat.operation = htole16(I2O_PARAMS_OP_TABLE_CLEAR);
1356 	pgop.oat.fieldcount = htole16(0);
1357 	pgop.oat.group = htole16(group);
1358 	pgop.oat.fields[0] = htole16(0);
1359 
1360 	PHOLD(curproc);
1361 	iop_msg_map(sc, im, mb, &pgop, sizeof(pgop), 1, NULL);
1362 	rv = iop_msg_post(sc, im, mb, 30000);
1363 	if (rv != 0)
1364 		printf("%s: TABLE_CLEAR failed for tid %d group %d\n",
1365 		    sc->sc_dv.dv_xname, tid, group);
1366 
1367 	iop_msg_unmap(sc, im);
1368 	PRELE(curproc);
1369 	iop_msg_free(sc, im);
1370 	return (rv);
1371 }
1372 
1373 /*
1374  * Add a single row to a tabular parameter group.  The row can have only one
1375  * field.
1376  */
1377 int
1378 iop_table_add_row(struct iop_softc *sc, int tid, int group, void *buf,
1379 		  int size, int row)
1380 {
1381 	struct iop_msg *im;
1382 	struct i2o_util_params_op *mf;
1383 	struct iop_pgop *pgop;
1384 	int rv, totsize;
1385 	u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)];
1386 
1387 	totsize = sizeof(*pgop) + sizeof(u_int16_t) * 2 + size;
1388 
1389 	im = iop_msg_alloc(sc, IM_WAIT);
1390 	if ((pgop = malloc(totsize, M_DEVBUF, M_WAITOK)) == NULL) {
1391 		iop_msg_free(sc, im);
1392 		return (ENOMEM);
1393 	}
1394 
1395 	mf = (struct i2o_util_params_op *)mb;
1396 	mf->msgflags = I2O_MSGFLAGS(i2o_util_params_op);
1397 	mf->msgfunc = I2O_MSGFUNC(tid, I2O_UTIL_PARAMS_SET);
1398 	mf->msgictx = IOP_ICTX;
1399 	mf->msgtctx = im->im_tctx;
1400 	mf->flags = 0;
1401 
1402 	pgop->olh.count = htole16(1);
1403 	pgop->olh.reserved = htole16(0);
1404 	pgop->oat.operation = htole16(I2O_PARAMS_OP_ROW_ADD);
1405 	pgop->oat.fieldcount = htole16(1);
1406 	pgop->oat.group = htole16(group);
1407 	pgop->oat.fields[0] = htole16(0);	/* FieldIdx */
1408 	pgop->oat.fields[1] = htole16(1);	/* RowCount */
1409 	pgop->oat.fields[2] = htole16(row);	/* KeyValue */
1410 	memcpy(&pgop->oat.fields[3], buf, size);
1411 
1412 	iop_msg_map(sc, im, mb, pgop, totsize, 1, NULL);
1413 	rv = iop_msg_post(sc, im, mb, 30000);
1414 	if (rv != 0)
1415 		printf("%s: ADD_ROW failed for tid %d group %d row %d\n",
1416 		    sc->sc_dv.dv_xname, tid, group, row);
1417 
1418 	iop_msg_unmap(sc, im);
1419 	iop_msg_free(sc, im);
1420 	free(pgop, M_DEVBUF);
1421 	return (rv);
1422 }
1423 
1424 /*
1425  * Execute a simple command (no parameters).
1426  */
1427 int
1428 iop_simple_cmd(struct iop_softc *sc, int tid, int function, int ictx,
1429 	       int async, int timo)
1430 {
1431 	struct iop_msg *im;
1432 	struct i2o_msg mf;
1433 	int rv, fl;
1434 
1435 	fl = (async != 0 ? IM_WAIT : IM_POLL);
1436 	im = iop_msg_alloc(sc, fl);
1437 
1438 	mf.msgflags = I2O_MSGFLAGS(i2o_msg);
1439 	mf.msgfunc = I2O_MSGFUNC(tid, function);
1440 	mf.msgictx = ictx;
1441 	mf.msgtctx = im->im_tctx;
1442 
1443 	rv = iop_msg_post(sc, im, &mf, timo);
1444 	iop_msg_free(sc, im);
1445 	return (rv);
1446 }
1447 
1448 /*
1449  * Post the system table to the IOP.
1450  */
1451 static int
1452 iop_systab_set(struct iop_softc *sc)
1453 {
1454 	struct i2o_exec_sys_tab_set *mf;
1455 	struct iop_msg *im;
1456 	bus_space_handle_t bsh;
1457 	bus_addr_t boo;
1458 	u_int32_t mema[2], ioa[2];
1459 	int rv;
1460 	u_int32_t mb[IOP_MAX_MSG_SIZE / sizeof(u_int32_t)];
1461 
1462 	im = iop_msg_alloc(sc, IM_WAIT);
1463 
1464 	mf = (struct i2o_exec_sys_tab_set *)mb;
1465 	mf->msgflags = I2O_MSGFLAGS(i2o_exec_sys_tab_set);
1466 	mf->msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_SYS_TAB_SET);
1467 	mf->msgictx = IOP_ICTX;
1468 	mf->msgtctx = im->im_tctx;
1469 	mf->iopid = (sc->sc_dv.dv_unit + 2) << 12;
1470 	mf->segnumber = 0;
1471 
1472 	mema[1] = sc->sc_status.desiredprivmemsize;
1473 	ioa[1] = sc->sc_status.desiredpriviosize;
1474 
1475 	if (mema[1] != 0) {
1476 		rv = bus_space_alloc(sc->sc_bus_memt, 0, 0xffffffff,
1477 		    le32toh(mema[1]), PAGE_SIZE, 0, 0, &boo, &bsh);
1478 		mema[0] = htole32(boo);
1479 		if (rv != 0) {
1480 			printf("%s: can't alloc priv mem space, err = %d\n",
1481 			    sc->sc_dv.dv_xname, rv);
1482 			mema[0] = 0;
1483 			mema[1] = 0;
1484 		}
1485 	}
1486 
1487 	if (ioa[1] != 0) {
1488 		rv = bus_space_alloc(sc->sc_bus_iot, 0, 0xffff,
1489 		    le32toh(ioa[1]), 0, 0, 0, &boo, &bsh);
1490 		ioa[0] = htole32(boo);
1491 		if (rv != 0) {
1492 			printf("%s: can't alloc priv i/o space, err = %d\n",
1493 			    sc->sc_dv.dv_xname, rv);
1494 			ioa[0] = 0;
1495 			ioa[1] = 0;
1496 		}
1497 	}
1498 
1499 	PHOLD(curproc);
1500 	iop_msg_map(sc, im, mb, iop_systab, iop_systab_size, 1, NULL);
1501 	iop_msg_map(sc, im, mb, mema, sizeof(mema), 1, NULL);
1502 	iop_msg_map(sc, im, mb, ioa, sizeof(ioa), 1, NULL);
1503 	rv = iop_msg_post(sc, im, mb, 5000);
1504 	iop_msg_unmap(sc, im);
1505 	iop_msg_free(sc, im);
1506 	PRELE(curproc);
1507 	return (rv);
1508 }
1509 
1510 /*
1511  * Reset the IOP.  Must be called with interrupts disabled.
1512  */
1513 static int
1514 iop_reset(struct iop_softc *sc)
1515 {
1516 	u_int32_t mfa, *sw;
1517 	struct i2o_exec_iop_reset mf;
1518 	int rv;
1519 	paddr_t pa;
1520 
1521 	sw = (u_int32_t *)sc->sc_scr;
1522 	pa = sc->sc_scr_seg->ds_addr;
1523 
1524 	mf.msgflags = I2O_MSGFLAGS(i2o_exec_iop_reset);
1525 	mf.msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_IOP_RESET);
1526 	mf.reserved[0] = 0;
1527 	mf.reserved[1] = 0;
1528 	mf.reserved[2] = 0;
1529 	mf.reserved[3] = 0;
1530 	mf.statuslow = (u_int32_t)pa;
1531 	mf.statushigh = (u_int32_t)((u_int64_t)pa >> 32);
1532 
1533 	*sw = htole32(0);
1534 	bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*sw),
1535 	    BUS_DMASYNC_PREREAD);
1536 
1537 	if ((rv = iop_post(sc, (u_int32_t *)&mf)))
1538 		return (rv);
1539 
1540 	POLL(2500,
1541 	    (bus_dmamap_sync(sc->sc_dmat, sc->sc_scr_dmamap, 0, sizeof(*sw),
1542 	    BUS_DMASYNC_POSTREAD), *sw != 0));
1543 	if (*sw != htole32(I2O_RESET_IN_PROGRESS)) {
1544 		printf("%s: reset rejected, status 0x%x\n",
1545 		    sc->sc_dv.dv_xname, le32toh(*sw));
1546 		return (EIO);
1547 	}
1548 
1549 	/*
1550 	 * IOP is now in the INIT state.  Wait no more than 10 seconds for
1551 	 * the inbound queue to become responsive.
1552 	 */
1553 	POLL(10000, (mfa = iop_inl(sc, IOP_REG_IFIFO)) != IOP_MFA_EMPTY);
1554 	if (mfa == IOP_MFA_EMPTY) {
1555 		printf("%s: reset failed\n", sc->sc_dv.dv_xname);
1556 		return (EIO);
1557 	}
1558 
1559 	iop_release_mfa(sc, mfa);
1560 	return (0);
1561 }
1562 
1563 /*
1564  * Register a new initiator.  Must be called with the configuration lock
1565  * held.
1566  */
1567 void
1568 iop_initiator_register(struct iop_softc *sc, struct iop_initiator *ii)
1569 {
1570 	static int ictxgen;
1571 	int s;
1572 
1573 	/* 0 is reserved (by us) for system messages. */
1574 	ii->ii_ictx = ++ictxgen;
1575 
1576 	/*
1577 	 * `Utility initiators' don't make it onto the per-IOP initiator list
1578 	 * (which is used only for configuration), but do get one slot on
1579 	 * the inbound queue.
1580 	 */
1581 	if ((ii->ii_flags & II_UTILITY) == 0) {
1582 		LIST_INSERT_HEAD(&sc->sc_iilist, ii, ii_list);
1583 		sc->sc_nii++;
1584 	} else
1585 		sc->sc_nuii++;
1586 
1587 	s = splbio();
1588 	LIST_INSERT_HEAD(IOP_ICTXHASH(ii->ii_ictx), ii, ii_hash);
1589 	splx(s);
1590 }
1591 
1592 /*
1593  * Unregister an initiator.  Must be called with the configuration lock
1594  * held.
1595  */
1596 void
1597 iop_initiator_unregister(struct iop_softc *sc, struct iop_initiator *ii)
1598 {
1599 	int s;
1600 
1601 	if ((ii->ii_flags & II_UTILITY) == 0) {
1602 		LIST_REMOVE(ii, ii_list);
1603 		sc->sc_nii--;
1604 	} else
1605 		sc->sc_nuii--;
1606 
1607 	s = splbio();
1608 	LIST_REMOVE(ii, ii_hash);
1609 	splx(s);
1610 }
1611 
1612 /*
1613  * Handle a reply frame from the IOP.
1614  */
1615 static int
1616 iop_handle_reply(struct iop_softc *sc, u_int32_t rmfa)
1617 {
1618 	struct iop_msg *im;
1619 	struct i2o_reply *rb;
1620 	struct i2o_fault_notify *fn;
1621 	struct iop_initiator *ii;
1622 	u_int off, ictx, tctx, status, size;
1623 
1624 	off = (int)(rmfa - sc->sc_rep_phys);
1625 	rb = (struct i2o_reply *)(sc->sc_rep + off);
1626 
1627 	/* Perform reply queue DMA synchronisation. */
1628 	bus_dmamap_sync(sc->sc_dmat, sc->sc_rep_dmamap, off,
1629 	    sc->sc_framesize, BUS_DMASYNC_POSTREAD);
1630 	if (--sc->sc_curib != 0)
1631 		bus_dmamap_sync(sc->sc_dmat, sc->sc_rep_dmamap,
1632 		    0, sc->sc_rep_size, BUS_DMASYNC_PREREAD);
1633 
1634 #ifdef I2ODEBUG
1635 	if ((le32toh(rb->msgflags) & I2O_MSGFLAGS_64BIT) != 0)
1636 		panic("iop_handle_reply: 64-bit reply");
1637 #endif
1638 	/*
1639 	 * Find the initiator.
1640 	 */
1641 	ictx = le32toh(rb->msgictx);
1642 	if (ictx == IOP_ICTX)
1643 		ii = NULL;
1644 	else {
1645 		ii = LIST_FIRST(IOP_ICTXHASH(ictx));
1646 		for (; ii != NULL; ii = LIST_NEXT(ii, ii_hash))
1647 			if (ii->ii_ictx == ictx)
1648 				break;
1649 		if (ii == NULL) {
1650 #ifdef I2ODEBUG
1651 			iop_reply_print(sc, rb);
1652 #endif
1653 			printf("%s: WARNING: bad ictx returned (%x)\n",
1654 			    sc->sc_dv.dv_xname, ictx);
1655 			return (-1);
1656 		}
1657 	}
1658 
1659 	/*
1660 	 * If we received a transport failure notice, we've got to dig the
1661 	 * transaction context (if any) out of the original message frame,
1662 	 * and then release the original MFA back to the inbound FIFO.
1663 	 */
1664 	if ((rb->msgflags & I2O_MSGFLAGS_FAIL) != 0) {
1665 		status = I2O_STATUS_SUCCESS;
1666 
1667 		fn = (struct i2o_fault_notify *)rb;
1668 		tctx = iop_inl(sc, fn->lowmfa + 12);
1669 		iop_release_mfa(sc, fn->lowmfa);
1670 		iop_tfn_print(sc, fn);
1671 	} else {
1672 		status = rb->reqstatus;
1673 		tctx = le32toh(rb->msgtctx);
1674 	}
1675 
1676 	if (ii == NULL || (ii->ii_flags & II_NOTCTX) == 0) {
1677 		/*
1678 		 * This initiator tracks state using message wrappers.
1679 		 *
1680 		 * Find the originating message wrapper, and if requested
1681 		 * notify the initiator.
1682 		 */
1683 		im = sc->sc_ims + (tctx & IOP_TCTX_MASK);
1684 		if ((tctx & IOP_TCTX_MASK) > sc->sc_maxib ||
1685 		    (im->im_flags & IM_ALLOCED) == 0 ||
1686 		    tctx != im->im_tctx) {
1687 			printf("%s: WARNING: bad tctx returned (0x%08x, %p)\n",
1688 			    sc->sc_dv.dv_xname, tctx, im);
1689 			if (im != NULL)
1690 				printf("%s: flags=0x%08x tctx=0x%08x\n",
1691 				    sc->sc_dv.dv_xname, im->im_flags,
1692 				    im->im_tctx);
1693 #ifdef I2ODEBUG
1694 			if ((rb->msgflags & I2O_MSGFLAGS_FAIL) == 0)
1695 				iop_reply_print(sc, rb);
1696 #endif
1697 			return (-1);
1698 		}
1699 
1700 		if ((rb->msgflags & I2O_MSGFLAGS_FAIL) != 0)
1701 			im->im_flags |= IM_FAIL;
1702 
1703 #ifdef I2ODEBUG
1704 		if ((im->im_flags & IM_REPLIED) != 0)
1705 			panic("%s: dup reply", sc->sc_dv.dv_xname);
1706 #endif
1707 		im->im_flags |= IM_REPLIED;
1708 
1709 #ifdef I2ODEBUG
1710 		if (status != I2O_STATUS_SUCCESS)
1711 			iop_reply_print(sc, rb);
1712 #endif
1713 		im->im_reqstatus = status;
1714 
1715 		/* Copy the reply frame, if requested. */
1716 		if (im->im_rb != NULL) {
1717 			size = (le32toh(rb->msgflags) >> 14) & ~3;
1718 #ifdef I2ODEBUG
1719 			if (size > sc->sc_framesize)
1720 				panic("iop_handle_reply: reply too large");
1721 #endif
1722 			memcpy(im->im_rb, rb, size);
1723 		}
1724 
1725 		/* Notify the initiator. */
1726 		if ((im->im_flags & IM_WAIT) != 0)
1727 			wakeup(im);
1728 		else if ((im->im_flags & (IM_POLL | IM_POLL_INTR)) != IM_POLL)
1729 			(*ii->ii_intr)(ii->ii_dv, im, rb);
1730 	} else {
1731 		/*
1732 		 * This initiator discards message wrappers.
1733 		 *
1734 		 * Simply pass the reply frame to the initiator.
1735 		 */
1736 		(*ii->ii_intr)(ii->ii_dv, NULL, rb);
1737 	}
1738 
1739 	return (status);
1740 }
1741 
1742 /*
1743  * Handle an interrupt from the IOP.
1744  */
1745 int
1746 iop_intr(void *arg)
1747 {
1748 	struct iop_softc *sc;
1749 	u_int32_t rmfa;
1750 
1751 	sc = arg;
1752 
1753 	if ((iop_inl(sc, IOP_REG_INTR_STATUS) & IOP_INTR_OFIFO) == 0)
1754 		return (0);
1755 
1756 	for (;;) {
1757 		/* Double read to account for IOP bug. */
1758 		if ((rmfa = iop_inl(sc, IOP_REG_OFIFO)) == IOP_MFA_EMPTY) {
1759 			rmfa = iop_inl(sc, IOP_REG_OFIFO);
1760 			if (rmfa == IOP_MFA_EMPTY)
1761 				break;
1762 		}
1763 		iop_handle_reply(sc, rmfa);
1764 		iop_outl(sc, IOP_REG_OFIFO, rmfa);
1765 	}
1766 
1767 	return (1);
1768 }
1769 
1770 /*
1771  * Handle an event signalled by the executive.
1772  */
1773 static void
1774 iop_intr_event(struct device *dv, struct iop_msg *im, void *reply)
1775 {
1776 	struct i2o_util_event_register_reply *rb;
1777 	struct iop_softc *sc;
1778 	u_int event;
1779 
1780 	sc = (struct iop_softc *)dv;
1781 	rb = reply;
1782 
1783 	if ((rb->msgflags & I2O_MSGFLAGS_FAIL) != 0)
1784 		return;
1785 
1786 	event = le32toh(rb->event);
1787 	printf("%s: event 0x%08x received\n", dv->dv_xname, event);
1788 }
1789 
1790 /*
1791  * Allocate a message wrapper.
1792  */
1793 struct iop_msg *
1794 iop_msg_alloc(struct iop_softc *sc, int flags)
1795 {
1796 	struct iop_msg *im;
1797 	static u_int tctxgen;
1798 	int s, i;
1799 
1800 #ifdef I2ODEBUG
1801 	if ((flags & IM_SYSMASK) != 0)
1802 		panic("iop_msg_alloc: system flags specified");
1803 #endif
1804 
1805 	s = splbio();
1806 	im = SLIST_FIRST(&sc->sc_im_freelist);
1807 #if defined(DIAGNOSTIC) || defined(I2ODEBUG)
1808 	if (im == NULL)
1809 		panic("iop_msg_alloc: no free wrappers");
1810 #endif
1811 	SLIST_REMOVE_HEAD(&sc->sc_im_freelist, im_chain);
1812 	splx(s);
1813 
1814 	im->im_tctx = (im->im_tctx & IOP_TCTX_MASK) | tctxgen;
1815 	tctxgen += (1 << IOP_TCTX_SHIFT);
1816 	im->im_flags = flags | IM_ALLOCED;
1817 	im->im_rb = NULL;
1818 	i = 0;
1819 	do {
1820 		im->im_xfer[i++].ix_size = 0;
1821 	} while (i < IOP_MAX_MSG_XFERS);
1822 
1823 	return (im);
1824 }
1825 
1826 /*
1827  * Free a message wrapper.
1828  */
1829 void
1830 iop_msg_free(struct iop_softc *sc, struct iop_msg *im)
1831 {
1832 	int s;
1833 
1834 #ifdef I2ODEBUG
1835 	if ((im->im_flags & IM_ALLOCED) == 0)
1836 		panic("iop_msg_free: wrapper not allocated");
1837 #endif
1838 
1839 	im->im_flags = 0;
1840 	s = splbio();
1841 	SLIST_INSERT_HEAD(&sc->sc_im_freelist, im, im_chain);
1842 	splx(s);
1843 }
1844 
1845 /*
1846  * Map a data transfer.  Write a scatter-gather list into the message frame.
1847  */
1848 int
1849 iop_msg_map(struct iop_softc *sc, struct iop_msg *im, u_int32_t *mb,
1850 	    void *xferaddr, int xfersize, int out, struct proc *up)
1851 {
1852 	bus_dmamap_t dm;
1853 	bus_dma_segment_t *ds;
1854 	struct iop_xfer *ix;
1855 	u_int rv, i, nsegs, flg, off, xn;
1856 	u_int32_t *p;
1857 
1858 	for (xn = 0, ix = im->im_xfer; xn < IOP_MAX_MSG_XFERS; xn++, ix++)
1859 		if (ix->ix_size == 0)
1860 			break;
1861 
1862 #ifdef I2ODEBUG
1863 	if (xfersize == 0)
1864 		panic("iop_msg_map: null transfer");
1865 	if (xfersize > IOP_MAX_XFER)
1866 		panic("iop_msg_map: transfer too large");
1867 	if (xn == IOP_MAX_MSG_XFERS)
1868 		panic("iop_msg_map: too many xfers");
1869 #endif
1870 
1871 	/*
1872 	 * Only the first DMA map is static.
1873 	 */
1874 	if (xn != 0) {
1875 		rv = bus_dmamap_create(sc->sc_dmat, IOP_MAX_XFER,
1876 		    IOP_MAX_SEGS, IOP_MAX_XFER, 0,
1877 		    BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &ix->ix_map);
1878 		if (rv != 0)
1879 			return (rv);
1880 	}
1881 
1882 	dm = ix->ix_map;
1883 	rv = bus_dmamap_load(sc->sc_dmat, dm, xferaddr, xfersize, up,
1884 	    (up == NULL ? BUS_DMA_NOWAIT : 0));
1885 	if (rv != 0)
1886 		goto bad;
1887 
1888 	/*
1889 	 * How many SIMPLE SG elements can we fit in this message?
1890 	 */
1891 	off = mb[0] >> 16;
1892 	p = mb + off;
1893 	nsegs = ((sc->sc_framesize >> 2) - off) >> 1;
1894 
1895 	if (dm->dm_nsegs > nsegs) {
1896 		bus_dmamap_unload(sc->sc_dmat, ix->ix_map);
1897 		rv = EFBIG;
1898 		DPRINTF(("iop_msg_map: too many segs\n"));
1899 		goto bad;
1900 	}
1901 
1902 	nsegs = dm->dm_nsegs;
1903 	xfersize = 0;
1904 
1905 	/*
1906 	 * Write out the SG list.
1907 	 */
1908 	if (out)
1909 		flg = I2O_SGL_SIMPLE | I2O_SGL_DATA_OUT;
1910 	else
1911 		flg = I2O_SGL_SIMPLE;
1912 
1913 	for (i = nsegs, ds = dm->dm_segs; i > 1; i--, p += 2, ds++) {
1914 		p[0] = (u_int32_t)ds->ds_len | flg;
1915 		p[1] = (u_int32_t)ds->ds_addr;
1916 		xfersize += ds->ds_len;
1917 	}
1918 
1919 	p[0] = (u_int32_t)ds->ds_len | flg | I2O_SGL_END_BUFFER;
1920 	p[1] = (u_int32_t)ds->ds_addr;
1921 	xfersize += ds->ds_len;
1922 
1923 	/* Fix up the transfer record, and sync the map. */
1924 	ix->ix_flags = (out ? IX_OUT : IX_IN);
1925 	ix->ix_size = xfersize;
1926 	bus_dmamap_sync(sc->sc_dmat, ix->ix_map, 0, xfersize,
1927 	    out ? BUS_DMASYNC_POSTWRITE : BUS_DMASYNC_POSTREAD);
1928 
1929 	/*
1930 	 * If this is the first xfer we've mapped for this message, adjust
1931 	 * the SGL offset field in the message header.
1932 	 */
1933 	if ((im->im_flags & IM_SGLOFFADJ) == 0) {
1934 		mb[0] += (mb[0] >> 12) & 0xf0;
1935 		im->im_flags |= IM_SGLOFFADJ;
1936 	}
1937 	mb[0] += (nsegs << 17);
1938 	return (0);
1939 
1940  bad:
1941  	if (xn != 0)
1942 		bus_dmamap_destroy(sc->sc_dmat, ix->ix_map);
1943 	return (rv);
1944 }
1945 
1946 /*
1947  * Map a block I/O data transfer (different in that there's only one per
1948  * message maximum, and PAGE addressing may be used).  Write a scatter
1949  * gather list into the message frame.
1950  */
1951 int
1952 iop_msg_map_bio(struct iop_softc *sc, struct iop_msg *im, u_int32_t *mb,
1953 		void *xferaddr, int xfersize, int out)
1954 {
1955 	bus_dma_segment_t *ds;
1956 	bus_dmamap_t dm;
1957 	struct iop_xfer *ix;
1958 	u_int rv, i, nsegs, off, slen, tlen, flg;
1959 	paddr_t saddr, eaddr;
1960 	u_int32_t *p;
1961 
1962 #ifdef I2ODEBUG
1963 	if (xfersize == 0)
1964 		panic("iop_msg_map_bio: null transfer");
1965 	if (xfersize > IOP_MAX_XFER)
1966 		panic("iop_msg_map_bio: transfer too large");
1967 	if ((im->im_flags & IM_SGLOFFADJ) != 0)
1968 		panic("iop_msg_map_bio: SGLOFFADJ");
1969 #endif
1970 
1971 	ix = im->im_xfer;
1972 	dm = ix->ix_map;
1973 	rv = bus_dmamap_load(sc->sc_dmat, dm, xferaddr, xfersize, NULL,
1974 	    BUS_DMA_NOWAIT | BUS_DMA_STREAMING);
1975 	if (rv != 0)
1976 		return (rv);
1977 
1978 	off = mb[0] >> 16;
1979 	nsegs = ((sc->sc_framesize >> 2) - off) >> 1;
1980 
1981 	/*
1982 	 * If the transfer is highly fragmented and won't fit using SIMPLE
1983 	 * elements, use PAGE_LIST elements instead.  SIMPLE elements are
1984 	 * potentially more efficient, both for us and the IOP.
1985 	 */
1986 	if (dm->dm_nsegs > nsegs) {
1987 		nsegs = 1;
1988 		p = mb + off + 1;
1989 
1990 		/* XXX This should be done with a bus_space flag. */
1991 		for (i = dm->dm_nsegs, ds = dm->dm_segs; i > 0; i--, ds++) {
1992 			slen = ds->ds_len;
1993 			saddr = ds->ds_addr;
1994 
1995 			while (slen > 0) {
1996 				eaddr = (saddr + PAGE_SIZE) & ~(PAGE_SIZE - 1);
1997 				tlen = min(eaddr - saddr, slen);
1998 				slen -= tlen;
1999 				*p++ = le32toh(saddr);
2000 				saddr = eaddr;
2001 				nsegs++;
2002 			}
2003 		}
2004 
2005 		mb[off] = xfersize | I2O_SGL_PAGE_LIST | I2O_SGL_END_BUFFER |
2006 		    I2O_SGL_END;
2007 		if (out)
2008 			mb[off] |= I2O_SGL_DATA_OUT;
2009 	} else {
2010 		p = mb + off;
2011 		nsegs = dm->dm_nsegs;
2012 
2013 		if (out)
2014 			flg = I2O_SGL_SIMPLE | I2O_SGL_DATA_OUT;
2015 		else
2016 			flg = I2O_SGL_SIMPLE;
2017 
2018 		for (i = nsegs, ds = dm->dm_segs; i > 1; i--, p += 2, ds++) {
2019 			p[0] = (u_int32_t)ds->ds_len | flg;
2020 			p[1] = (u_int32_t)ds->ds_addr;
2021 		}
2022 
2023 		p[0] = (u_int32_t)ds->ds_len | flg | I2O_SGL_END_BUFFER |
2024 		    I2O_SGL_END;
2025 		p[1] = (u_int32_t)ds->ds_addr;
2026 		nsegs <<= 1;
2027 	}
2028 
2029 	/* Fix up the transfer record, and sync the map. */
2030 	ix->ix_flags = (out ? IX_OUT : IX_IN);
2031 	ix->ix_size = xfersize;
2032 	bus_dmamap_sync(sc->sc_dmat, ix->ix_map, 0, xfersize,
2033 	    out ? BUS_DMASYNC_POSTWRITE : BUS_DMASYNC_POSTREAD);
2034 
2035 	/*
2036 	 * Adjust the SGL offset and total message size fields.  We don't
2037 	 * set IM_SGLOFFADJ, since it's used only for SIMPLE elements.
2038 	 */
2039 	mb[0] += ((off << 4) + (nsegs << 16));
2040 	return (0);
2041 }
2042 
2043 /*
2044  * Unmap all data transfers associated with a message wrapper.
2045  */
2046 void
2047 iop_msg_unmap(struct iop_softc *sc, struct iop_msg *im)
2048 {
2049 	struct iop_xfer *ix;
2050 	int i;
2051 
2052 #ifdef I2ODEBUG
2053 	if (im->im_xfer[0].ix_size == 0)
2054 		panic("iop_msg_unmap: no transfers mapped");
2055 #endif
2056 
2057 	for (ix = im->im_xfer, i = 0;;) {
2058 		bus_dmamap_sync(sc->sc_dmat, ix->ix_map, 0, ix->ix_size,
2059 		    ix->ix_flags & IX_OUT ? BUS_DMASYNC_POSTWRITE :
2060 		    BUS_DMASYNC_POSTREAD);
2061 		bus_dmamap_unload(sc->sc_dmat, ix->ix_map);
2062 
2063 		/* Only the first DMA map is static. */
2064 		if (i != 0)
2065 			bus_dmamap_destroy(sc->sc_dmat, ix->ix_map);
2066 		if ((++ix)->ix_size == 0)
2067 			break;
2068 		if (++i >= IOP_MAX_MSG_XFERS)
2069 			break;
2070 	}
2071 }
2072 
2073 /*
2074  * Post a message frame to the IOP's inbound queue.
2075  */
2076 int
2077 iop_post(struct iop_softc *sc, u_int32_t *mb)
2078 {
2079 	u_int32_t mfa;
2080 	int s;
2081 
2082 #ifdef I2ODEBUG
2083 	if ((mb[0] >> 16) > (sc->sc_framesize >> 2))
2084 		panic("iop_post: frame too large");
2085 #endif
2086 
2087 	s = splbio();
2088 
2089 	/* Allocate a slot with the IOP. */
2090 	if ((mfa = iop_inl(sc, IOP_REG_IFIFO)) == IOP_MFA_EMPTY)
2091 		if ((mfa = iop_inl(sc, IOP_REG_IFIFO)) == IOP_MFA_EMPTY) {
2092 			splx(s);
2093 			printf("%s: mfa not forthcoming\n",
2094 			    sc->sc_dv.dv_xname);
2095 			return (EAGAIN);
2096 		}
2097 
2098 	/* Perform reply buffer DMA synchronisation. */
2099 	if (sc->sc_curib++ == 0)
2100 		bus_dmamap_sync(sc->sc_dmat, sc->sc_rep_dmamap, 0,
2101 		    sc->sc_rep_size, BUS_DMASYNC_PREREAD);
2102 
2103 	/* Copy out the message frame. */
2104 	bus_space_write_region_4(sc->sc_iot, sc->sc_ioh, mfa, mb, mb[0] >> 16);
2105 	bus_space_barrier(sc->sc_iot, sc->sc_ioh, mfa, (mb[0] >> 14) & ~3,
2106 	    BUS_SPACE_BARRIER_WRITE);
2107 
2108 	/* Post the MFA back to the IOP. */
2109 	iop_outl(sc, IOP_REG_IFIFO, mfa);
2110 
2111 	splx(s);
2112 	return (0);
2113 }
2114 
2115 /*
2116  * Post a message to the IOP and deal with completion.
2117  */
2118 int
2119 iop_msg_post(struct iop_softc *sc, struct iop_msg *im, void *xmb, int timo)
2120 {
2121 	u_int32_t *mb;
2122 	int rv, s;
2123 
2124 	mb = xmb;
2125 
2126 	/* Terminate the scatter/gather list chain. */
2127 	if ((im->im_flags & IM_SGLOFFADJ) != 0)
2128 		mb[(mb[0] >> 16) - 2] |= I2O_SGL_END;
2129 
2130 	if ((rv = iop_post(sc, mb)) != 0)
2131 		return (rv);
2132 
2133 	if ((im->im_flags & (IM_POLL | IM_WAIT)) != 0) {
2134 		if ((im->im_flags & IM_POLL) != 0)
2135 			iop_msg_poll(sc, im, timo);
2136 		else
2137 			iop_msg_wait(sc, im, timo);
2138 
2139 		s = splbio();
2140 		if ((im->im_flags & IM_REPLIED) != 0) {
2141 			if ((im->im_flags & IM_NOSTATUS) != 0)
2142 				rv = 0;
2143 			else if ((im->im_flags & IM_FAIL) != 0)
2144 				rv = ENXIO;
2145 			else if (im->im_reqstatus != I2O_STATUS_SUCCESS)
2146 				rv = EIO;
2147 			else
2148 				rv = 0;
2149 		} else
2150 			rv = EBUSY;
2151 		splx(s);
2152 	} else
2153 		rv = 0;
2154 
2155 	return (rv);
2156 }
2157 
2158 /*
2159  * Spin until the specified message is replied to.
2160  */
2161 static void
2162 iop_msg_poll(struct iop_softc *sc, struct iop_msg *im, int timo)
2163 {
2164 	u_int32_t rmfa;
2165 	int s, status;
2166 
2167 	s = splbio();
2168 
2169 	/* Wait for completion. */
2170 	for (timo *= 10; timo != 0; timo--) {
2171 		if ((iop_inl(sc, IOP_REG_INTR_STATUS) & IOP_INTR_OFIFO) != 0) {
2172 			/* Double read to account for IOP bug. */
2173 			rmfa = iop_inl(sc, IOP_REG_OFIFO);
2174 			if (rmfa == IOP_MFA_EMPTY)
2175 				rmfa = iop_inl(sc, IOP_REG_OFIFO);
2176 			if (rmfa != IOP_MFA_EMPTY) {
2177 				status = iop_handle_reply(sc, rmfa);
2178 
2179 				/*
2180 				 * Return the reply frame to the IOP's
2181 				 * outbound FIFO.
2182 				 */
2183 				iop_outl(sc, IOP_REG_OFIFO, rmfa);
2184 			}
2185 		}
2186 		if ((im->im_flags & IM_REPLIED) != 0)
2187 			break;
2188 		DELAY(100);
2189 	}
2190 
2191 	if (timo == 0) {
2192 #ifdef I2ODEBUG
2193 		printf("%s: poll - no reply\n", sc->sc_dv.dv_xname);
2194 		if (iop_status_get(sc, 1) != 0)
2195 			printf("iop_msg_poll: unable to retrieve status\n");
2196 		else
2197 			printf("iop_msg_poll: IOP state = %d\n",
2198 			    (le32toh(sc->sc_status.segnumber) >> 16) & 0xff);
2199 #endif
2200 	}
2201 
2202 	splx(s);
2203 }
2204 
2205 /*
2206  * Sleep until the specified message is replied to.
2207  */
2208 static void
2209 iop_msg_wait(struct iop_softc *sc, struct iop_msg *im, int timo)
2210 {
2211 	int s, rv;
2212 
2213 	s = splbio();
2214 	if ((im->im_flags & IM_REPLIED) != 0) {
2215 		splx(s);
2216 		return;
2217 	}
2218 	rv = tsleep(im, PRIBIO, "iopmsg", mstohz(timo));
2219 	splx(s);
2220 
2221 #ifdef I2ODEBUG
2222 	if (rv != 0) {
2223 		printf("iop_msg_wait: tsleep() == %d\n", rv);
2224 		if (iop_status_get(sc, 0) != 0)
2225 			printf("iop_msg_wait: unable to retrieve status\n");
2226 		else
2227 			printf("iop_msg_wait: IOP state = %d\n",
2228 			    (le32toh(sc->sc_status.segnumber) >> 16) & 0xff);
2229 	}
2230 #endif
2231 }
2232 
2233 /*
2234  * Release an unused message frame back to the IOP's inbound fifo.
2235  */
2236 static void
2237 iop_release_mfa(struct iop_softc *sc, u_int32_t mfa)
2238 {
2239 
2240 	/* Use the frame to issue a no-op. */
2241 	iop_outl(sc, mfa, I2O_VERSION_11 | (4 << 16));
2242 	iop_outl(sc, mfa + 4, I2O_MSGFUNC(I2O_TID_IOP, I2O_UTIL_NOP));
2243 	iop_outl(sc, mfa + 8, 0);
2244 	iop_outl(sc, mfa + 12, 0);
2245 
2246 	iop_outl(sc, IOP_REG_IFIFO, mfa);
2247 }
2248 
2249 #ifdef I2ODEBUG
2250 /*
2251  * Dump a reply frame header.
2252  */
2253 static void
2254 iop_reply_print(struct iop_softc *sc, struct i2o_reply *rb)
2255 {
2256 	u_int function, detail;
2257 #ifdef I2OVERBOSE
2258 	const char *statusstr;
2259 #endif
2260 
2261 	function = (le32toh(rb->msgfunc) >> 24) & 0xff;
2262 	detail = le16toh(rb->detail);
2263 
2264 	printf("%s: reply:\n", sc->sc_dv.dv_xname);
2265 
2266 #ifdef I2OVERBOSE
2267 	if (rb->reqstatus < sizeof(iop_status) / sizeof(iop_status[0]))
2268 		statusstr = iop_status[rb->reqstatus];
2269 	else
2270 		statusstr = "undefined error code";
2271 
2272 	printf("%s:   function=0x%02x status=0x%02x (%s)\n",
2273 	    sc->sc_dv.dv_xname, function, rb->reqstatus, statusstr);
2274 #else
2275 	printf("%s:   function=0x%02x status=0x%02x\n",
2276 	    sc->sc_dv.dv_xname, function, rb->reqstatus);
2277 #endif
2278 	printf("%s:   detail=0x%04x ictx=0x%08x tctx=0x%08x\n",
2279 	    sc->sc_dv.dv_xname, detail, le32toh(rb->msgictx),
2280 	    le32toh(rb->msgtctx));
2281 	printf("%s:   tidi=%d tidt=%d flags=0x%02x\n", sc->sc_dv.dv_xname,
2282 	    (le32toh(rb->msgfunc) >> 12) & 4095, le32toh(rb->msgfunc) & 4095,
2283 	    (le32toh(rb->msgflags) >> 8) & 0xff);
2284 }
2285 #endif
2286 
2287 /*
2288  * Dump a transport failure reply.
2289  */
2290 static void
2291 iop_tfn_print(struct iop_softc *sc, struct i2o_fault_notify *fn)
2292 {
2293 
2294 	printf("%s: WARNING: transport failure:\n", sc->sc_dv.dv_xname);
2295 
2296 	printf("%s:  ictx=0x%08x tctx=0x%08x\n", sc->sc_dv.dv_xname,
2297 	    le32toh(fn->msgictx), le32toh(fn->msgtctx));
2298 	printf("%s:  failurecode=0x%02x severity=0x%02x\n",
2299 	    sc->sc_dv.dv_xname, fn->failurecode, fn->severity);
2300 	printf("%s:  highestver=0x%02x lowestver=0x%02x\n",
2301 	    sc->sc_dv.dv_xname, fn->highestver, fn->lowestver);
2302 }
2303 
2304 /*
2305  * Translate an I2O ASCII field into a C string.
2306  */
2307 void
2308 iop_strvis(struct iop_softc *sc, const char *src, int slen, char *dst, int dlen)
2309 {
2310 	int hc, lc, i, nit;
2311 
2312 	dlen--;
2313 	lc = 0;
2314 	hc = 0;
2315 	i = 0;
2316 
2317 	/*
2318 	 * DPT use NUL as a space, whereas AMI use it as a terminator.  The
2319 	 * spec has nothing to say about it.  Since AMI fields are usually
2320 	 * filled with junk after the terminator, ...
2321 	 */
2322 	nit = (le16toh(sc->sc_status.orgid) != I2O_ORG_DPT);
2323 
2324 	while (slen-- != 0 && dlen-- != 0) {
2325 		if (nit && *src == '\0')
2326 			break;
2327 		else if (*src <= 0x20 || *src >= 0x7f) {
2328 			if (hc)
2329 				dst[i++] = ' ';
2330 		} else {
2331 			hc = 1;
2332 			dst[i++] = *src;
2333 			lc = i;
2334 		}
2335 		src++;
2336 	}
2337 
2338 	dst[lc] = '\0';
2339 }
2340 
2341 /*
2342  * Retrieve the DEVICE_IDENTITY parameter group from the target and dump it.
2343  */
2344 int
2345 iop_print_ident(struct iop_softc *sc, int tid)
2346 {
2347 	struct {
2348 		struct	i2o_param_op_results pr;
2349 		struct	i2o_param_read_results prr;
2350 		struct	i2o_param_device_identity di;
2351 	} __attribute__ ((__packed__)) p;
2352 	char buf[32];
2353 	int rv;
2354 
2355 	rv = iop_field_get_all(sc, tid, I2O_PARAM_DEVICE_IDENTITY, &p,
2356 	    sizeof(p), NULL);
2357 	if (rv != 0)
2358 		return (rv);
2359 
2360 	iop_strvis(sc, p.di.vendorinfo, sizeof(p.di.vendorinfo), buf,
2361 	    sizeof(buf));
2362 	printf(" <%s, ", buf);
2363 	iop_strvis(sc, p.di.productinfo, sizeof(p.di.productinfo), buf,
2364 	    sizeof(buf));
2365 	printf("%s, ", buf);
2366 	iop_strvis(sc, p.di.revlevel, sizeof(p.di.revlevel), buf, sizeof(buf));
2367 	printf("%s>", buf);
2368 
2369 	return (0);
2370 }
2371 
2372 /*
2373  * Claim or unclaim the specified TID.
2374  */
2375 int
2376 iop_util_claim(struct iop_softc *sc, struct iop_initiator *ii, int release,
2377 	       int flags)
2378 {
2379 	struct iop_msg *im;
2380 	struct i2o_util_claim mf;
2381 	int rv, func;
2382 
2383 	func = release ? I2O_UTIL_CLAIM_RELEASE : I2O_UTIL_CLAIM;
2384 	im = iop_msg_alloc(sc, IM_WAIT);
2385 
2386 	/* We can use the same structure, as they're identical. */
2387 	mf.msgflags = I2O_MSGFLAGS(i2o_util_claim);
2388 	mf.msgfunc = I2O_MSGFUNC(ii->ii_tid, func);
2389 	mf.msgictx = ii->ii_ictx;
2390 	mf.msgtctx = im->im_tctx;
2391 	mf.flags = flags;
2392 
2393 	rv = iop_msg_post(sc, im, &mf, 5000);
2394 	iop_msg_free(sc, im);
2395 	return (rv);
2396 }
2397 
2398 /*
2399  * Perform an abort.
2400  */
2401 int iop_util_abort(struct iop_softc *sc, struct iop_initiator *ii, int func,
2402 		   int tctxabort, int flags)
2403 {
2404 	struct iop_msg *im;
2405 	struct i2o_util_abort mf;
2406 	int rv;
2407 
2408 	im = iop_msg_alloc(sc, IM_WAIT);
2409 
2410 	mf.msgflags = I2O_MSGFLAGS(i2o_util_abort);
2411 	mf.msgfunc = I2O_MSGFUNC(ii->ii_tid, I2O_UTIL_ABORT);
2412 	mf.msgictx = ii->ii_ictx;
2413 	mf.msgtctx = im->im_tctx;
2414 	mf.flags = (func << 24) | flags;
2415 	mf.tctxabort = tctxabort;
2416 
2417 	rv = iop_msg_post(sc, im, &mf, 5000);
2418 	iop_msg_free(sc, im);
2419 	return (rv);
2420 }
2421 
2422 /*
2423  * Enable or disable reception of events for the specified device.
2424  */
2425 int iop_util_eventreg(struct iop_softc *sc, struct iop_initiator *ii, int mask)
2426 {
2427 	struct i2o_util_event_register mf;
2428 
2429 	mf.msgflags = I2O_MSGFLAGS(i2o_util_event_register);
2430 	mf.msgfunc = I2O_MSGFUNC(ii->ii_tid, I2O_UTIL_EVENT_REGISTER);
2431 	mf.msgictx = ii->ii_ictx;
2432 	mf.msgtctx = 0;
2433 	mf.eventmask = mask;
2434 
2435 	/* This message is replied to only when events are signalled. */
2436 	return (iop_post(sc, (u_int32_t *)&mf));
2437 }
2438 
2439 int
2440 iopopen(dev_t dev, int flag, int mode, struct proc *p)
2441 {
2442 	struct iop_softc *sc;
2443 
2444 	if ((sc = device_lookup(&iop_cd, minor(dev))) == NULL)
2445 		return (ENXIO);
2446 	if ((sc->sc_flags & IOP_ONLINE) == 0)
2447 		return (ENXIO);
2448 	if ((sc->sc_flags & IOP_OPEN) != 0)
2449 		return (EBUSY);
2450 	sc->sc_flags |= IOP_OPEN;
2451 
2452 	return (0);
2453 }
2454 
2455 int
2456 iopclose(dev_t dev, int flag, int mode, struct proc *p)
2457 {
2458 	struct iop_softc *sc;
2459 
2460 	sc = device_lookup(&iop_cd, minor(dev));
2461 	sc->sc_flags &= ~IOP_OPEN;
2462 
2463 	return (0);
2464 }
2465 
2466 int
2467 iopioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
2468 {
2469 	struct iop_softc *sc;
2470 	struct iovec *iov;
2471 	int rv, i;
2472 
2473 	if (securelevel >= 2)
2474 		return (EPERM);
2475 
2476 	sc = device_lookup(&iop_cd, minor(dev));
2477 
2478 	switch (cmd) {
2479 	case IOPIOCPT:
2480 		return (iop_passthrough(sc, (struct ioppt *)data, p));
2481 
2482 	case IOPIOCGSTATUS:
2483 		iov = (struct iovec *)data;
2484 		i = sizeof(struct i2o_status);
2485 		if (i > iov->iov_len)
2486 			i = iov->iov_len;
2487 		else
2488 			iov->iov_len = i;
2489 		if ((rv = iop_status_get(sc, 0)) == 0)
2490 			rv = copyout(&sc->sc_status, iov->iov_base, i);
2491 		return (rv);
2492 
2493 	case IOPIOCGLCT:
2494 	case IOPIOCGTIDMAP:
2495 	case IOPIOCRECONFIG:
2496 		break;
2497 
2498 	default:
2499 #if defined(DIAGNOSTIC) || defined(I2ODEBUG)
2500 		printf("%s: unknown ioctl %lx\n", sc->sc_dv.dv_xname, cmd);
2501 #endif
2502 		return (ENOTTY);
2503 	}
2504 
2505 	if ((rv = lockmgr(&sc->sc_conflock, LK_SHARED, NULL)) != 0)
2506 		return (rv);
2507 
2508 	switch (cmd) {
2509 	case IOPIOCGLCT:
2510 		iov = (struct iovec *)data;
2511 		i = le16toh(sc->sc_lct->tablesize) << 2;
2512 		if (i > iov->iov_len)
2513 			i = iov->iov_len;
2514 		else
2515 			iov->iov_len = i;
2516 		rv = copyout(sc->sc_lct, iov->iov_base, i);
2517 		break;
2518 
2519 	case IOPIOCRECONFIG:
2520 		rv = iop_reconfigure(sc, 0);
2521 		break;
2522 
2523 	case IOPIOCGTIDMAP:
2524 		iov = (struct iovec *)data;
2525 		i = sizeof(struct iop_tidmap) * sc->sc_nlctent;
2526 		if (i > iov->iov_len)
2527 			i = iov->iov_len;
2528 		else
2529 			iov->iov_len = i;
2530 		rv = copyout(sc->sc_tidmap, iov->iov_base, i);
2531 		break;
2532 	}
2533 
2534 	lockmgr(&sc->sc_conflock, LK_RELEASE, NULL);
2535 	return (rv);
2536 }
2537 
2538 static int
2539 iop_passthrough(struct iop_softc *sc, struct ioppt *pt, struct proc *p)
2540 {
2541 	struct iop_msg *im;
2542 	struct i2o_msg *mf;
2543 	struct ioppt_buf *ptb;
2544 	int rv, i, mapped;
2545 
2546 	mf = NULL;
2547 	im = NULL;
2548 	mapped = 1;
2549 
2550 	if (pt->pt_msglen > sc->sc_framesize ||
2551 	    pt->pt_msglen < sizeof(struct i2o_msg) ||
2552 	    pt->pt_nbufs > IOP_MAX_MSG_XFERS ||
2553 	    pt->pt_nbufs < 0 || pt->pt_replylen < 0 ||
2554             pt->pt_timo < 1000 || pt->pt_timo > 5*60*1000)
2555 		return (EINVAL);
2556 
2557 	for (i = 0; i < pt->pt_nbufs; i++)
2558 		if (pt->pt_bufs[i].ptb_datalen > IOP_MAX_XFER) {
2559 			rv = ENOMEM;
2560 			goto bad;
2561 		}
2562 
2563 	mf = malloc(sc->sc_framesize, M_DEVBUF, M_WAITOK);
2564 	if (mf == NULL)
2565 		return (ENOMEM);
2566 
2567 	if ((rv = copyin(pt->pt_msg, mf, pt->pt_msglen)) != 0)
2568 		goto bad;
2569 
2570 	im = iop_msg_alloc(sc, IM_WAIT | IM_NOSTATUS);
2571 	im->im_rb = (struct i2o_reply *)mf;
2572 	mf->msgictx = IOP_ICTX;
2573 	mf->msgtctx = im->im_tctx;
2574 
2575 	for (i = 0; i < pt->pt_nbufs; i++) {
2576 		ptb = &pt->pt_bufs[i];
2577 		rv = iop_msg_map(sc, im, (u_int32_t *)mf, ptb->ptb_data,
2578 		    ptb->ptb_datalen, ptb->ptb_out != 0, p);
2579 		if (rv != 0)
2580 			goto bad;
2581 		mapped = 1;
2582 	}
2583 
2584 	if ((rv = iop_msg_post(sc, im, mf, pt->pt_timo)) != 0)
2585 		goto bad;
2586 
2587 	i = (le32toh(im->im_rb->msgflags) >> 14) & ~3;
2588 	if (i > sc->sc_framesize)
2589 		i = sc->sc_framesize;
2590 	if (i > pt->pt_replylen)
2591 		i = pt->pt_replylen;
2592 	rv = copyout(im->im_rb, pt->pt_reply, i);
2593 
2594  bad:
2595 	if (mapped != 0)
2596 		iop_msg_unmap(sc, im);
2597 	if (im != NULL)
2598 		iop_msg_free(sc, im);
2599 	if (mf != NULL)
2600 		free(mf, M_DEVBUF);
2601 	return (rv);
2602 }
2603