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