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