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