Home | History | Annotate | Line # | Download | only in i2o
iop.c revision 1.7
      1 /*	$NetBSD: iop.c,v 1.7 2000/12/03 15:51:36 ad Exp $	*/
      2 
      3 /*-
      4  * Copyright (c) 2000 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 "opt_i2o.h"
     44 #include "iop.h"
     45 
     46 #include <sys/param.h>
     47 #include <sys/systm.h>
     48 #include <sys/kernel.h>
     49 #include <sys/device.h>
     50 #include <sys/queue.h>
     51 #include <sys/proc.h>
     52 #include <sys/malloc.h>
     53 #include <sys/ioctl.h>
     54 #include <sys/endian.h>
     55 #include <sys/pool.h>
     56 #include <sys/conf.h>
     57 #include <sys/kthread.h>
     58 
     59 #include <uvm/uvm_extern.h>
     60 
     61 #include <machine/bus.h>
     62 
     63 #include <dev/i2o/i2o.h>
     64 #include <dev/i2o/iopreg.h>
     65 #include <dev/i2o/iopvar.h>
     66 
     67 #define POLL(ms, cond)				\
     68 do {						\
     69 	int i;					\
     70 	for (i = (ms) * 10; i; i--) {		\
     71 		if (cond)			\
     72 			break;			\
     73 		DELAY(100);			\
     74 	}					\
     75 } while (/* CONSTCOND */0);
     76 
     77 #ifdef I2ODEBUG
     78 #define DPRINTF(x)	printf x
     79 #else
     80 #define	DPRINTF(x)
     81 #endif
     82 
     83 #ifdef I2OVERBOSE
     84 #define IFVERBOSE(x)	x
     85 #else
     86 #define	IFVERBOSE(x)
     87 #endif
     88 
     89 #define	COMMENT(x)	""
     90 
     91 #define IOP_ICTXHASH_NBUCKETS	16
     92 #define	IOP_ICTXHASH(ictx)	(&iop_ictxhashtbl[(ictx) & iop_ictxhash])
     93 #define IOP_TCTXHASH_NBUCKETS	64
     94 #define	IOP_TCTXHASH(tctx)	(&iop_tctxhashtbl[(tctx) & iop_tctxhash])
     95 
     96 static LIST_HEAD(, iop_initiator) *iop_ictxhashtbl;
     97 static u_long	iop_ictxhash;
     98 static TAILQ_HEAD(, iop_msg) *iop_tctxhashtbl;
     99 static u_long	iop_tctxhash;
    100 static void	*iop_sdh;
    101 static struct	pool *iop_msgpool;
    102 static struct	i2o_systab *iop_systab;
    103 static int	iop_systab_size;
    104 
    105 extern struct cfdriver iop_cd;
    106 
    107 #define	IC_CONFIGURE	0x01
    108 
    109 struct iop_class {
    110 	u_short	ic_class;
    111 	u_short	ic_flags;
    112 	const char	*ic_caption;
    113 } static const iop_class[] = {
    114 	{
    115 		I2O_CLASS_EXECUTIVE,
    116 		0,
    117 		COMMENT("executive")
    118 	},
    119 	{
    120 		I2O_CLASS_DDM,
    121 		0,
    122 		COMMENT("device driver module")
    123 	},
    124 	{
    125 		I2O_CLASS_RANDOM_BLOCK_STORAGE,
    126 		IC_CONFIGURE,
    127 		IFVERBOSE("random block storage")
    128 	},
    129 	{
    130 		I2O_CLASS_SEQUENTIAL_STORAGE,
    131 		IC_CONFIGURE,
    132 		IFVERBOSE("sequential storage")
    133 	},
    134 	{
    135 		I2O_CLASS_LAN,
    136 		IC_CONFIGURE,
    137 		IFVERBOSE("LAN port")
    138 	},
    139 	{
    140 		I2O_CLASS_WAN,
    141 		IC_CONFIGURE,
    142 		IFVERBOSE("WAN port")
    143 	},
    144 	{
    145 		I2O_CLASS_FIBRE_CHANNEL_PORT,
    146 		IC_CONFIGURE,
    147 		IFVERBOSE("fibrechannel port")
    148 	},
    149 	{
    150 		I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL,
    151 		0,
    152 		COMMENT("fibrechannel peripheral")
    153 	},
    154  	{
    155  		I2O_CLASS_SCSI_PERIPHERAL,
    156  		0,
    157  		COMMENT("SCSI peripheral")
    158  	},
    159 	{
    160 		I2O_CLASS_ATE_PORT,
    161 		IC_CONFIGURE,
    162 		IFVERBOSE("ATE port")
    163 	},
    164 	{
    165 		I2O_CLASS_ATE_PERIPHERAL,
    166 		0,
    167 		COMMENT("ATE peripheral")
    168 	},
    169 	{
    170 		I2O_CLASS_FLOPPY_CONTROLLER,
    171 		IC_CONFIGURE,
    172 		IFVERBOSE("floppy controller")
    173 	},
    174 	{
    175 		I2O_CLASS_FLOPPY_DEVICE,
    176 		0,
    177 		COMMENT("floppy device")
    178 	},
    179 	{
    180 		I2O_CLASS_BUS_ADAPTER_PORT,
    181 		IC_CONFIGURE,
    182 		IFVERBOSE("bus adapter port" )
    183 	},
    184 };
    185 
    186 #if defined(I2ODEBUG) && defined(I2OVERBOSE)
    187 static const char *iop_status[] = {
    188 	"success",
    189 	"abort (dirty)",
    190 	"abort (no data transfer)",
    191 	"abort (partial transfer)",
    192 	"error (dirty)",
    193 	"error (no data transfer)",
    194 	"error (partial transfer)",
    195 	"undefined error code",
    196 	"process abort (dirty)",
    197 	"process abort (no data transfer)",
    198 	"process abort (partial transfer)",
    199 	"transaction error",
    200 };
    201 #endif
    202 
    203 static inline u_int32_t	iop_inl(struct iop_softc *, int);
    204 static inline void	iop_outl(struct iop_softc *, int, u_int32_t);
    205 
    206 static void	iop_config_interrupts(struct device *);
    207 static void	iop_configure_devices(struct iop_softc *);
    208 static void	iop_devinfo(int, char *);
    209 static int	iop_print(void *, const char *);
    210 static int	iop_reconfigure(struct iop_softc *, u_int32_t);
    211 static void	iop_shutdown(void *);
    212 static int	iop_submatch(struct device *, struct cfdata *, void *);
    213 #ifdef notyet
    214 static int	iop_vendor_print(void *, const char *);
    215 #endif
    216 
    217 static void	iop_intr_event(struct device *, struct iop_msg *, void *);
    218 static int	iop_hrt_get(struct iop_softc *);
    219 static int	iop_hrt_get0(struct iop_softc *, struct i2o_hrt *, int);
    220 static int	iop_lct_get0(struct iop_softc *, struct i2o_lct *, int,
    221 			     u_int32_t);
    222 static int	iop_msg_wait(struct iop_softc *, struct iop_msg *, int);
    223 static int	iop_ofifo_init(struct iop_softc *);
    224 static int	iop_handle_reply(struct iop_softc *, u_int32_t);
    225 static void	iop_reconfigure_proc(void *);
    226 static void	iop_release_mfa(struct iop_softc *, u_int32_t);
    227 static int	iop_reset(struct iop_softc *);
    228 static int	iop_status_get(struct iop_softc *);
    229 static int	iop_systab_set(struct iop_softc *);
    230 
    231 #ifdef I2ODEBUG
    232 static void	iop_reply_print(struct iop_softc *, struct iop_msg *,
    233 				struct i2o_reply *);
    234 #endif
    235 
    236 cdev_decl(iop);
    237 
    238 static inline u_int32_t
    239 iop_inl(struct iop_softc *sc, int off)
    240 {
    241 
    242 	bus_space_barrier(sc->sc_iot, sc->sc_ioh, off, 4,
    243 	    BUS_SPACE_BARRIER_WRITE | BUS_SPACE_BARRIER_READ);
    244 	return (bus_space_read_4(sc->sc_iot, sc->sc_ioh, off));
    245 }
    246 
    247 static inline void
    248 iop_outl(struct iop_softc *sc, int off, u_int32_t val)
    249 {
    250 
    251 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, off, val);
    252 	bus_space_barrier(sc->sc_iot, sc->sc_ioh, off, 4,
    253 	    BUS_SPACE_BARRIER_WRITE);
    254 }
    255 
    256 /*
    257  * Initialise the adapter.
    258  */
    259 void
    260 iop_init(struct iop_softc *sc, const char *intrstr)
    261 {
    262 	int rv;
    263 	u_int32_t mask;
    264 	static int again;
    265 	char ident[64];
    266 
    267 	if (again == 0) {
    268 		/* Create the shared message wrapper pool and hashes. */
    269 		iop_msgpool = pool_create(sizeof(struct iop_msg), 0, 0, 0,
    270 		    "ioppl", 0, NULL, NULL, M_DEVBUF);
    271 		iop_ictxhashtbl = hashinit(IOP_ICTXHASH_NBUCKETS, HASH_LIST,
    272 		    M_DEVBUF, M_NOWAIT, &iop_ictxhash);
    273 		iop_tctxhashtbl = hashinit(IOP_TCTXHASH_NBUCKETS, HASH_TAILQ,
    274 		    M_DEVBUF, M_NOWAIT, &iop_tctxhash);
    275 		again = 1;
    276 	}
    277 
    278 	/* Reset the IOP and request status. */
    279 	printf("I2O adapter");
    280 
    281 	if ((rv = iop_reset(sc)) != 0) {
    282 		printf("%s: not responding (reset)\n", sc->sc_dv.dv_xname);
    283 		return;
    284 	}
    285 	if ((rv = iop_status_get(sc)) != 0) {
    286 		printf("%s: not responding (get status)\n", sc->sc_dv.dv_xname);
    287 		return;
    288 	}
    289 	DPRINTF((" (state=%d)",
    290 	    (le32toh(sc->sc_status.segnumber) >> 16) & 0xff));
    291 	sc->sc_flags |= IOP_HAVESTATUS;
    292 
    293 	iop_strvis(sc, sc->sc_status.productid, sizeof(sc->sc_status.productid),
    294 	    ident, sizeof(ident));
    295 	printf(" <%s>\n", ident);
    296 
    297 #ifdef I2ODEBUG
    298 	printf("%s: orgid=0x%04x version=%d\n", sc->sc_dv.dv_xname,
    299 	    le16toh(sc->sc_status.orgid),
    300 	    (le32toh(sc->sc_status.segnumber) >> 12) & 15);
    301 	printf("%s: type want have cbase\n", sc->sc_dv.dv_xname);
    302 	printf("%s: mem  %04x %04x %08x\n", sc->sc_dv.dv_xname,
    303 	    le32toh(sc->sc_status.desiredprivmemsize),
    304 	    le32toh(sc->sc_status.currentprivmemsize),
    305 	    le32toh(sc->sc_status.currentprivmembase));
    306 	printf("%s: i/o  %04x %04x %08x\n", sc->sc_dv.dv_xname,
    307 	    le32toh(sc->sc_status.desiredpriviosize),
    308 	    le32toh(sc->sc_status.currentpriviosize),
    309 	    le32toh(sc->sc_status.currentpriviobase));
    310 #endif
    311 
    312 	sc->sc_maxreplycnt = le32toh(sc->sc_status.maxoutboundmframes);
    313 	if (sc->sc_maxreplycnt > IOP_MAX_HW_REPLYCNT)
    314 		sc->sc_maxreplycnt = IOP_MAX_HW_REPLYCNT;
    315 	sc->sc_maxqueuecnt = le32toh(sc->sc_status.maxinboundmframes);
    316 	if (sc->sc_maxqueuecnt > IOP_MAX_HW_QUEUECNT)
    317 		sc->sc_maxqueuecnt = IOP_MAX_HW_QUEUECNT;
    318 
    319 	if (iop_ofifo_init(sc) != 0) {
    320 		printf("%s: unable to init oubound FIFO\n", sc->sc_dv.dv_xname);
    321 		return;
    322 	}
    323 
    324 	/*
    325  	 * Defer further configuration until (a) interrupts are working and
    326  	 * (b) we have enough information to build the system table.
    327  	 */
    328 	config_interrupts((struct device *)sc, iop_config_interrupts);
    329 
    330 	/* Configure shutdown hook before we start any device activity. */
    331 	if (iop_sdh == NULL)
    332 		iop_sdh = shutdownhook_establish(iop_shutdown, NULL);
    333 
    334 	/* Ensure interrupts are enabled at the IOP. */
    335 	mask = iop_inl(sc, IOP_REG_INTR_MASK);
    336 	iop_outl(sc, IOP_REG_INTR_MASK, mask & ~IOP_INTR_OFIFO);
    337 
    338 	if (intrstr != NULL)
    339 		printf("%s: interrupting at %s\n", sc->sc_dv.dv_xname,
    340 		    intrstr);
    341 
    342 #ifdef I2ODEBUG
    343 	printf("%s: queue depths: inbound %d/%d, outbound %d/%d\n",
    344 	    sc->sc_dv.dv_xname,
    345 	    sc->sc_maxqueuecnt, le32toh(sc->sc_status.maxinboundmframes),
    346 	    sc->sc_maxreplycnt, le32toh(sc->sc_status.maxoutboundmframes));
    347 #endif
    348 
    349 	lockinit(&sc->sc_conflock, PRIBIO, "iopconf", hz * 30, 0);
    350 	SIMPLEQ_INIT(&sc->sc_queue);
    351 }
    352 
    353 /*
    354  * Perform autoconfiguration tasks.
    355  */
    356 static void
    357 iop_config_interrupts(struct device *self)
    358 {
    359 	struct iop_softc *sc, *iop;
    360 	struct i2o_systab_entry *ste;
    361 	int rv, i, niop;
    362 
    363 	sc = (struct iop_softc *)self;
    364 	LIST_INIT(&sc->sc_iilist);
    365 
    366 	printf("%s: configuring...\n", sc->sc_dv.dv_xname);
    367 
    368 	if (iop_hrt_get(sc) != 0) {
    369 		printf("%s: unable to retrieve HRT\n", sc->sc_dv.dv_xname);
    370 		return;
    371 	}
    372 
    373 	/*
    374  	 * Build the system table.
    375  	 */
    376 	if (iop_systab == NULL) {
    377 		for (i = 0, niop = 0; i < iop_cd.cd_ndevs; i++) {
    378 			if ((iop = device_lookup(&iop_cd, i)) == NULL)
    379 				continue;
    380 			if ((iop->sc_flags & IOP_HAVESTATUS) == 0)
    381 				continue;
    382 			if (iop_status_get(iop) != 0) {
    383 				printf("%s: unable to retrieve status\n",
    384 				    sc->sc_dv.dv_xname);
    385 				iop->sc_flags &= ~IOP_HAVESTATUS;
    386 				continue;
    387 			}
    388 			niop++;
    389 		}
    390 		if (niop == 0)
    391 			return;
    392 
    393 		i = sizeof(struct i2o_systab_entry) * (niop - 1) +
    394 		    sizeof(struct i2o_systab);
    395 		iop_systab_size = i;
    396 		iop_systab = malloc(i, M_DEVBUF, M_NOWAIT);
    397 
    398 		memset(iop_systab, 0, i);
    399 		iop_systab->numentries = niop;
    400 		iop_systab->version = I2O_VERSION_11;
    401 
    402 		for (i = 0, ste = iop_systab->entry; i < iop_cd.cd_ndevs; i++) {
    403 			if ((iop = device_lookup(&iop_cd, i)) == NULL)
    404 				continue;
    405 			if ((iop->sc_flags & IOP_HAVESTATUS) == 0)
    406 				continue;
    407 
    408 			ste->orgid = iop->sc_status.orgid;
    409 			ste->iopid = iop->sc_dv.dv_unit + 2;
    410 			ste->segnumber =
    411 			    htole32(le32toh(iop->sc_status.segnumber) & ~4095);
    412 			ste->iopcaps = iop->sc_status.iopcaps;
    413 			ste->inboundmsgframesize =
    414 			    iop->sc_status.inboundmframesize;
    415 			ste->inboundmsgportaddresslow =
    416 			    htole32(iop->sc_memaddr + IOP_REG_IFIFO);
    417 			ste++;
    418 		}
    419 	}
    420 
    421 	if (iop_systab_set(sc) != 0) {
    422 		printf("%s: unable to set system table\n", sc->sc_dv.dv_xname);
    423 		return;
    424 	}
    425 	if (iop_simple_cmd(sc, I2O_TID_IOP, I2O_EXEC_SYS_ENABLE, IOP_ICTX, 1,
    426 	    5000) != 0) {
    427 		printf("%s: unable to enable system\n", sc->sc_dv.dv_xname);
    428 		return;
    429 	}
    430 
    431 	/*
    432 	 * Set up an event handler for this IOP.
    433 	 */
    434 	sc->sc_eventii.ii_dv = self;
    435 	sc->sc_eventii.ii_intr = iop_intr_event;
    436 	sc->sc_eventii.ii_flags = II_DISCARD | II_UTILITY;
    437 	sc->sc_eventii.ii_tid = I2O_TID_IOP;
    438 	if (iop_initiator_register(sc, &sc->sc_eventii) != 0) {
    439 		printf("%s: unable to register initiator", sc->sc_dv.dv_xname);
    440 		return;
    441 	}
    442 	if (iop_util_eventreg(sc, &sc->sc_eventii, 0xffffffff)) {
    443 		printf("%s: unable to register for events", sc->sc_dv.dv_xname);
    444 		return;
    445 	}
    446 
    447 #ifdef notyet
    448 	/* Attempt to match and attach a product-specific extension. */
    449 	ia.ia_class = I2O_CLASS_ANY;
    450 	ia.ia_tid = I2O_TID_IOP;
    451 	config_found_sm(self, &ia, iop_vendor_print, iop_submatch);
    452 #endif
    453 
    454 	if ((rv = iop_reconfigure(sc, 0)) != 0) {
    455 		printf("%s: configure failed (%d)\n", sc->sc_dv.dv_xname, rv);
    456 		return;
    457 	}
    458 
    459 	sc->sc_flags |= IOP_ONLINE;
    460 
    461 	rv = kthread_create1(iop_reconfigure_proc, sc, &sc->sc_reconf_proc,
    462 	    "%s", sc->sc_dv.dv_xname);
    463 	if (rv != 0) {
    464 		printf("%s: unable to create thread (%d)",
    465 		    sc->sc_dv.dv_xname, rv);
    466 		return;
    467 	}
    468 }
    469 
    470 /*
    471  * Reconfiguration thread; listens for LCT change notification, and
    472  * initiates re-configuration if recieved.
    473  */
    474 static void
    475 iop_reconfigure_proc(void *cookie)
    476 {
    477 	struct iop_softc *sc;
    478 	struct i2o_lct lct;
    479 	u_int32_t chgind;
    480 
    481 	sc = cookie;
    482 
    483 	for (;;) {
    484 		chgind = le32toh(sc->sc_chgindicator) + 1;
    485 
    486 		if (iop_lct_get0(sc, &lct, sizeof(lct), chgind) == 0) {
    487 			DPRINTF(("%s: async reconfiguration (0x%08x)\n",
    488 			    sc->sc_dv.dv_xname, le32toh(lct.changeindicator)));
    489 			iop_reconfigure(sc, lct.changeindicator);
    490 		}
    491 
    492 		tsleep(iop_reconfigure_proc, PWAIT, "iopzzz", hz * 5);
    493 	}
    494 }
    495 
    496 /*
    497  * Reconfigure: find new and removed devices.
    498  */
    499 static int
    500 iop_reconfigure(struct iop_softc *sc, u_int32_t chgind)
    501 {
    502 	struct iop_msg *im;
    503 	struct i2o_hba_bus_scan *mb;
    504 	struct i2o_lct_entry *le;
    505 	struct iop_initiator *ii, *nextii;
    506 	int rv, tid, i;
    507 
    508 	rv = lockmgr(&sc->sc_conflock, LK_EXCLUSIVE | LK_RECURSEFAIL, NULL);
    509 	if (rv != 0) {
    510 		DPRINTF(("iop_reconfigure: unable to acquire lock\n"));
    511 		return (rv);
    512 	}
    513 
    514 	/*
    515 	 * If the reconfiguration request isn't the result of LCT change
    516 	 * notification, then be more thorough: ask all bus ports to scan
    517 	 * their busses.  Wait up to 5 minutes for each bus port to complete
    518 	 * the request.
    519 	 */
    520 	if (chgind == 0) {
    521 		if ((rv = iop_lct_get(sc)) != 0) {
    522 			DPRINTF(("iop_reconfigure: unable to read LCT\n"));
    523 			goto done;
    524 		}
    525 
    526 		le = sc->sc_lct->entry;
    527 		for (i = 0; i < sc->sc_nlctent; i++, le++) {
    528 			if ((le16toh(le->classid) & 4095) !=
    529 			    I2O_CLASS_BUS_ADAPTER_PORT)
    530 				continue;
    531 			tid = le32toh(le->localtid) & 4095;
    532 
    533 			rv = iop_msg_alloc(sc, NULL, &im, IM_NOINTR);
    534 			if (rv != 0) {
    535 				DPRINTF(("iop_reconfigure: alloc msg\n"));
    536 				goto done;
    537 			}
    538 
    539 			mb = (struct i2o_hba_bus_scan *)im->im_msg;
    540 			mb->msgflags = I2O_MSGFLAGS(i2o_hba_bus_scan);
    541 			mb->msgfunc = I2O_MSGFUNC(tid, I2O_HBA_BUS_SCAN);
    542 			mb->msgictx = IOP_ICTX;
    543 			mb->msgtctx = im->im_tctx;
    544 
    545 			DPRINTF(("%s: scanning bus %d\n", sc->sc_dv.dv_xname,
    546 			    tid));
    547 
    548 			rv = iop_msg_enqueue(sc, im, 5*60*1000);
    549 			iop_msg_free(sc, NULL, im);
    550 			if (rv != 0) {
    551 				DPRINTF(("iop_reconfigure: scan failed\n"));
    552 				goto done;
    553 			}
    554 		}
    555 	} else if (chgind == sc->sc_chgindicator) {
    556 		DPRINTF(("%s: LCT unchanged (async)\n", sc->sc_dv.dv_xname));
    557 		goto done;
    558 	}
    559 
    560 	/* Re-read the LCT and determine if it has changed. */
    561 	if ((rv = iop_lct_get(sc)) != 0) {
    562 		DPRINTF(("iop_reconfigure: unable to re-read LCT\n"));
    563 		goto done;
    564 	}
    565 	DPRINTF(("%s: %d LCT entries\n", sc->sc_dv.dv_xname, sc->sc_nlctent));
    566 
    567 	if (sc->sc_lct->changeindicator == sc->sc_chgindicator) {
    568 		DPRINTF(("%s: LCT unchanged\n", sc->sc_dv.dv_xname));
    569 		/* Nothing to do. */
    570 		rv = 0;
    571 		goto done;
    572 	}
    573 	DPRINTF(("%s: LCT changed\n", sc->sc_dv.dv_xname));
    574 	sc->sc_chgindicator = sc->sc_lct->changeindicator;
    575 
    576 	if (sc->sc_tidmap != NULL)
    577 		free(sc->sc_tidmap, M_DEVBUF);
    578 	sc->sc_tidmap = malloc(sc->sc_nlctent * sizeof(struct iop_tidmap),
    579 	    M_DEVBUF, M_NOWAIT);
    580 	memset(sc->sc_tidmap, 0, sc->sc_nlctent * sizeof(struct iop_tidmap));
    581 
    582 	/* Match and attach child devices. */
    583 	iop_configure_devices(sc);
    584 
    585 	for (ii = LIST_FIRST(&sc->sc_iilist); ii != NULL; ii = nextii) {
    586 		nextii = LIST_NEXT(ii, ii_list);
    587 		if ((ii->ii_flags & II_UTILITY) != 0)
    588 			continue;
    589 		if ((ii->ii_flags & II_CONFIGURED) == 0) {
    590 			ii->ii_flags |= II_CONFIGURED;
    591 			continue;
    592 		}
    593 
    594 		/* Detach devices that were configured, but are now gone. */
    595 		for (i = 0; i < sc->sc_nlctent; i++)
    596 			if (ii->ii_tid == sc->sc_tidmap[i].it_tid)
    597 				break;
    598 		if (i == sc->sc_nlctent ||
    599 		    (sc->sc_tidmap[i].it_flags & IT_CONFIGURED) == 0)
    600 			config_detach(ii->ii_dv, DETACH_FORCE);
    601 
    602 		/*
    603 		 * Tell initiators that existed before the re-configuration
    604 		 * to re-configure.
    605 		 */
    606 		if (ii->ii_reconfig == NULL)
    607 			continue;
    608 		if ((rv = (*ii->ii_reconfig)(ii->ii_dv)) != 0)
    609 			printf("%s: %s failed reconfigure (%d)\n",
    610 			    sc->sc_dv.dv_xname, ii->ii_dv->dv_xname, rv);
    611 	}
    612 	rv = 0;
    613 
    614 done:
    615 	lockmgr(&sc->sc_conflock, LK_RELEASE, NULL);
    616 	return (rv);
    617 }
    618 
    619 /*
    620  * Configure I2O devices into the system.
    621  */
    622 static void
    623 iop_configure_devices(struct iop_softc *sc)
    624 {
    625 	struct iop_attach_args ia;
    626 	struct iop_initiator *ii;
    627 	const struct i2o_lct_entry *le;
    628 	int i, nent;
    629 
    630 	nent = sc->sc_nlctent;
    631 	for (i = 0, le = sc->sc_lct->entry; i < nent; i++, le++) {
    632 		/*
    633 		 * Ignore the device if it's in use.
    634 		 */
    635 		if ((le32toh(le->usertid) & 4095) != 4095)
    636 			continue;
    637 
    638 		ia.ia_class = le16toh(le->classid) & 4095;
    639 		ia.ia_tid = le32toh(le->localtid) & 4095;
    640 
    641 		/*
    642 		 * Try to configure the device only if it's not already
    643 		 * configured.
    644  		 */
    645  		LIST_FOREACH(ii, &sc->sc_iilist, ii_list) {
    646  			if ((ii->ii_flags & II_UTILITY) != 0)
    647  				continue;
    648  			if (ia.ia_tid == ii->ii_tid)
    649 				break;
    650 		}
    651 		if (ii != NULL)
    652 			continue;
    653 
    654 		if (config_found_sm(&sc->sc_dv, &ia, iop_print, iop_submatch))
    655 			sc->sc_tidmap[i].it_flags |= IT_CONFIGURED;
    656 	}
    657 }
    658 
    659 static void
    660 iop_devinfo(int class, char *devinfo)
    661 {
    662 #ifdef I2OVERBOSE
    663 	int i;
    664 
    665 	for (i = 0; i < sizeof(iop_class) / sizeof(iop_class[0]); i++)
    666 		if (class == iop_class[i].ic_class)
    667 			break;
    668 
    669 	if (i == sizeof(iop_class) / sizeof(iop_class[0]))
    670 		sprintf(devinfo, "device (class 0x%x)", class);
    671 	else
    672 		strcpy(devinfo, iop_class[i].ic_caption);
    673 #else
    674 
    675 	sprintf(devinfo, "device (class 0x%x)", class);
    676 #endif
    677 }
    678 
    679 static int
    680 iop_print(void *aux, const char *pnp)
    681 {
    682 	struct iop_attach_args *ia;
    683 	char devinfo[256];
    684 
    685 	ia = aux;
    686 
    687 	if (pnp != NULL) {
    688 		iop_devinfo(ia->ia_class, devinfo);
    689 		printf("%s at %s", devinfo, pnp);
    690 	}
    691 	printf(" tid %d", ia->ia_tid);
    692 	return (UNCONF);
    693 }
    694 
    695 #ifdef notyet
    696 static int
    697 iop_vendor_print(void *aux, const char *pnp)
    698 {
    699 
    700 	if (pnp != NULL)
    701 		printf("vendor specific extension at %s", pnp);
    702 	return (UNCONF);
    703 }
    704 #endif
    705 
    706 static int
    707 iop_submatch(struct device *parent, struct cfdata *cf, void *aux)
    708 {
    709 	struct iop_attach_args *ia;
    710 
    711 	ia = aux;
    712 
    713 	if (cf->iopcf_tid != IOPCF_TID_DEFAULT && cf->iopcf_tid != ia->ia_tid)
    714 		return (0);
    715 
    716 	return ((*cf->cf_attach->ca_match)(parent, cf, aux));
    717 }
    718 
    719 /*
    720  * Shut down all configured IOPs.
    721  */
    722 static void
    723 iop_shutdown(void *junk)
    724 {
    725 	struct iop_softc *sc;
    726 	int i;
    727 
    728 	printf("shutting down iop devices... ");
    729 
    730 	for (i = 0; i < iop_cd.cd_ndevs; i++) {
    731 		if ((sc = device_lookup(&iop_cd, i)) == NULL)
    732 			continue;
    733 		if ((sc->sc_flags & IOP_ONLINE) == 0)
    734 			continue;
    735 		iop_simple_cmd(sc, I2O_TID_IOP, I2O_EXEC_SYS_QUIESCE, IOP_ICTX,
    736 		    0, 5000);
    737 		iop_simple_cmd(sc, I2O_TID_IOP, I2O_EXEC_IOP_CLEAR, IOP_ICTX,
    738 		    0, 5000);
    739 	}
    740 
    741 	/* Wait.  Some boards could still be flushing, stupidly enough. */
    742 	delay(5000*1000);
    743 	printf(" done\n");
    744 }
    745 
    746 /*
    747  * Retrieve adapter status.
    748  */
    749 static int
    750 iop_status_get(struct iop_softc *sc)
    751 {
    752 	struct iop_msg *im;
    753 	struct i2o_exec_status_get *mb;
    754 	int rv, s;
    755 
    756 	if ((rv = iop_msg_alloc(sc, NULL, &im, IM_NOWAIT | IM_NOICTX)) != 0)
    757 		return (rv);
    758 
    759 	mb = (struct i2o_exec_status_get *)im->im_msg;
    760 	mb->msgflags = I2O_MSGFLAGS(i2o_exec_status_get);
    761 	mb->msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_STATUS_GET);
    762 	mb->reserved[0] = 0;
    763 	mb->reserved[1] = 0;
    764 	mb->reserved[2] = 0;
    765 	mb->reserved[3] = 0;
    766 	mb->addrlow = kvtop((caddr_t)&sc->sc_status);	/* XXX */
    767 	mb->addrhigh = 0;
    768 	mb->length = sizeof(sc->sc_status);
    769 
    770 	s = splbio();
    771 	memset(&sc->sc_status, 0, sizeof(sc->sc_status));
    772 
    773 	if ((rv = iop_msg_send(sc, im, 0)) != 0) {
    774 		splx(s);
    775 		iop_msg_free(sc, NULL, im);
    776 		return (rv);
    777 	}
    778 
    779 	/* XXX */
    780 	POLL(2500, *((volatile u_char *)&sc->sc_status.syncbyte) == 0xff);
    781 
    782 	splx(s);
    783 	iop_msg_free(sc, NULL, im);
    784 	return (*((volatile u_char *)&sc->sc_status.syncbyte) != 0xff);
    785 }
    786 
    787 /*
    788  * Initalize and populate the adapter's outbound FIFO.
    789  */
    790 static int
    791 iop_ofifo_init(struct iop_softc *sc)
    792 {
    793 	struct iop_msg *im;
    794 	volatile u_int32_t status;
    795 	bus_addr_t addr;
    796 	bus_dma_segment_t seg;
    797 	struct i2o_exec_outbound_init *mb;
    798 	int i, rseg, rv;
    799 
    800 	if ((rv = iop_msg_alloc(sc, NULL, &im, IM_NOWAIT | IM_NOICTX)) != 0)
    801 		return (rv);
    802 
    803 	mb = (struct i2o_exec_outbound_init *)im->im_msg;
    804 	mb->msgflags = I2O_MSGFLAGS(i2o_exec_outbound_init);
    805 	mb->msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_OUTBOUND_INIT);
    806 	mb->msgictx = IOP_ICTX;
    807 	mb->msgtctx = im->im_tctx;
    808 	mb->pagesize = PAGE_SIZE;
    809 	mb->flags = 0x80 | ((IOP_MAX_REPLY_SIZE >> 2) << 16);	/* XXX */
    810 
    811 	status = 0;
    812 
    813 	/*
    814 	 * The I2O spec says that there are two SGLs: one for the status
    815 	 * word, and one for a list of discarded MFAs.  It continues to say
    816 	 * that if you don't want to get the list of MFAs, an IGNORE SGL is
    817 	 * necessary; this isn't the case (and in fact appears to be a bad
    818 	 * thing).
    819 	 */
    820 	iop_msg_map(sc, im, (void *)&status, sizeof(status), 0);
    821 	if ((rv = iop_msg_send(sc, im, 0)) != 0) {
    822 		iop_msg_free(sc, NULL, im);
    823 		return (rv);
    824 	}
    825 	iop_msg_unmap(sc, im);
    826 	iop_msg_free(sc, NULL, im);
    827 
    828 	/* XXX */
    829 	POLL(5000, status == I2O_EXEC_OUTBOUND_INIT_COMPLETE);
    830 	if (status != I2O_EXEC_OUTBOUND_INIT_COMPLETE) {
    831 		printf("%s: outbound FIFO init failed\n", sc->sc_dv.dv_xname);
    832 		return (EIO);
    833 	}
    834 
    835 	/* If we need to allocate DMA safe memory, do it now. */
    836 	if (sc->sc_rep_phys == 0) {
    837 		sc->sc_rep_size = sc->sc_maxreplycnt * IOP_MAX_REPLY_SIZE;
    838 
    839 		rv = bus_dmamem_alloc(sc->sc_dmat, sc->sc_rep_size, PAGE_SIZE,
    840 		    0, &seg, 1, &rseg, BUS_DMA_NOWAIT);
    841 		if (rv != 0) {
    842 			printf("%s: dma alloc = %d\n", sc->sc_dv.dv_xname,
    843 			   rv);
    844 			return (rv);
    845 		}
    846 
    847 		rv = bus_dmamem_map(sc->sc_dmat, &seg, rseg, sc->sc_rep_size,
    848 		    &sc->sc_rep, BUS_DMA_NOWAIT | BUS_DMA_COHERENT);
    849 		if (rv != 0) {
    850 			printf("%s: dma map = %d\n", sc->sc_dv.dv_xname, rv);
    851 			return (rv);
    852 		}
    853 
    854 		rv = bus_dmamap_create(sc->sc_dmat, sc->sc_rep_size, 1,
    855 		    sc->sc_rep_size, 0, BUS_DMA_NOWAIT, &sc->sc_rep_dmamap);
    856 		if (rv != 0) {
    857 			printf("%s: dma create = %d\n", sc->sc_dv.dv_xname, rv);
    858 			return (rv);
    859 		}
    860 
    861 		rv = bus_dmamap_load(sc->sc_dmat, sc->sc_rep_dmamap, sc->sc_rep,
    862 		    sc->sc_rep_size, NULL, BUS_DMA_NOWAIT);
    863 		if (rv != 0) {
    864 			printf("%s: dma load = %d\n", sc->sc_dv.dv_xname, rv);
    865 			return (rv);
    866 		}
    867 
    868 		sc->sc_rep_phys = sc->sc_rep_dmamap->dm_segs[0].ds_addr;
    869 	}
    870 
    871 	/* Populate the outbound FIFO. */
    872 	for (i = sc->sc_maxreplycnt, addr = sc->sc_rep_phys; i != 0; i--) {
    873 		iop_outl(sc, IOP_REG_OFIFO, (u_int32_t)addr);
    874 		addr += IOP_MAX_REPLY_SIZE;
    875 	}
    876 
    877 	return (0);
    878 }
    879 
    880 /*
    881  * Read the specified number of bytes from the IOP's hardware resource table.
    882  */
    883 static int
    884 iop_hrt_get0(struct iop_softc *sc, struct i2o_hrt *hrt, int size)
    885 {
    886 	struct iop_msg *im;
    887 	int rv;
    888 	struct i2o_exec_hrt_get *mb;
    889 
    890 	if ((rv = iop_msg_alloc(sc, NULL, &im, IM_NOINTR)) != 0)
    891 		return (rv);
    892 
    893 	mb = (struct i2o_exec_hrt_get *)im->im_msg;
    894 	mb->msgflags = I2O_MSGFLAGS(i2o_exec_hrt_get);
    895 	mb->msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_HRT_GET);
    896 	mb->msgictx = IOP_ICTX;
    897 	mb->msgtctx = im->im_tctx;
    898 
    899 	iop_msg_map(sc, im, hrt, size, 0);
    900 	rv = iop_msg_enqueue(sc, im, 5000);
    901 	iop_msg_unmap(sc, im);
    902 	iop_msg_free(sc, NULL, im);
    903 	return (rv);
    904 }
    905 
    906 /*
    907  * Read the IOP's hardware resource table.
    908  */
    909 static int
    910 iop_hrt_get(struct iop_softc *sc)
    911 {
    912 	struct i2o_hrt hrthdr, *hrt;
    913 	int size, rv;
    914 
    915 	if ((rv = iop_hrt_get0(sc, &hrthdr, sizeof(hrthdr))) != 0)
    916 		return (rv);
    917 
    918 	DPRINTF(("%s: %d hrt entries\n", sc->sc_dv.dv_xname,
    919 	    le16toh(hrthdr.numentries)));
    920 
    921 	size = sizeof(struct i2o_hrt) +
    922 	    (htole32(hrthdr.numentries) - 1) * sizeof(struct i2o_hrt_entry);
    923 	hrt = (struct i2o_hrt *)malloc(size, M_DEVBUF, M_NOWAIT);
    924 
    925 	if ((rv = iop_hrt_get0(sc, hrt, size)) != 0) {
    926 		free(hrt, M_DEVBUF);
    927 		return (rv);
    928 	}
    929 
    930 	if (sc->sc_hrt != NULL)
    931 		free(sc->sc_hrt, M_DEVBUF);
    932 	sc->sc_hrt = hrt;
    933 	return (0);
    934 }
    935 
    936 /*
    937  * Request the specified number of bytes from the IOP's logical
    938  * configuration table.  If a change indicator is specified, this
    939  * is an verbatim notification request, so the caller is prepared
    940  * to wait indefinitely.
    941  */
    942 static int
    943 iop_lct_get0(struct iop_softc *sc, struct i2o_lct *lct, int size,
    944 	     u_int32_t chgind)
    945 {
    946 	struct iop_msg *im;
    947 	struct i2o_exec_lct_notify *mb;
    948 	int rv;
    949 
    950 	if ((rv = iop_msg_alloc(sc, NULL, &im, IM_NOINTR)) != 0)
    951 		return (rv);
    952 
    953 	memset(lct, 0, size);
    954 	memset(im->im_msg, 0, sizeof(im->im_msg));
    955 
    956 	mb = (struct i2o_exec_lct_notify *)im->im_msg;
    957 	mb->msgflags = I2O_MSGFLAGS(i2o_exec_lct_notify);
    958 	mb->msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_LCT_NOTIFY);
    959 	mb->msgictx = IOP_ICTX;
    960 	mb->msgtctx = im->im_tctx;
    961 	mb->classid = I2O_CLASS_ANY;
    962 	mb->changeindicator = chgind;
    963 
    964 	DPRINTF(("iop_lct_get0: reading LCT\n"));
    965 
    966 	iop_msg_map(sc, im, lct, size, 0);
    967 	rv = iop_msg_enqueue(sc, im, (chgind == 0 ? 120*1000 : 0));
    968 	iop_msg_unmap(sc, im);
    969 	iop_msg_free(sc, NULL, im);
    970 	return (rv);
    971 }
    972 
    973 /*
    974  * Read the IOP's logical configuration table.
    975  */
    976 int
    977 iop_lct_get(struct iop_softc *sc)
    978 {
    979 	int esize, size, rv;
    980 	struct i2o_lct *lct;
    981 
    982 	esize = le32toh(sc->sc_status.expectedlctsize);
    983 	lct = (struct i2o_lct *)malloc(esize, M_DEVBUF, M_WAITOK);
    984 	if (lct == NULL)
    985 		return (ENOMEM);
    986 
    987 	if ((rv = iop_lct_get0(sc, lct, esize, 0)) != 0) {
    988 		free(lct, M_DEVBUF);
    989 		return (rv);
    990 	}
    991 
    992 	size = le16toh(lct->tablesize) << 2;
    993 	if (esize != size) {
    994 		free(lct, M_DEVBUF);
    995 		lct = (struct i2o_lct *)malloc(size, M_DEVBUF, M_WAITOK);
    996 		if (lct == NULL)
    997 			return (ENOMEM);
    998 
    999 		if ((rv = iop_lct_get0(sc, lct, size, 0)) != 0) {
   1000 			free(lct, M_DEVBUF);
   1001 			return (rv);
   1002 		}
   1003 	}
   1004 
   1005 	/* Swap in the new LCT. */
   1006 	if (sc->sc_lct != NULL)
   1007 		free(sc->sc_lct, M_DEVBUF);
   1008 	sc->sc_lct = lct;
   1009 	sc->sc_nlctent = ((le16toh(sc->sc_lct->tablesize) << 2) -
   1010 	    sizeof(struct i2o_lct) + sizeof(struct i2o_lct_entry)) /
   1011 	    sizeof(struct i2o_lct_entry);
   1012 	return (0);
   1013 }
   1014 
   1015 /*
   1016  * Request the specified parameter group from the target.
   1017  */
   1018 int
   1019 iop_param_op(struct iop_softc *sc, int tid, int write, int group, void *buf,
   1020 	     int size)
   1021 {
   1022 	struct iop_msg *im;
   1023 	struct i2o_util_params_op *mb;
   1024 	int rv, func, op;
   1025 	struct {
   1026 		struct	i2o_param_op_list_header olh;
   1027 		struct	i2o_param_op_all_template oat;
   1028 	} req;
   1029 
   1030 	if ((rv = iop_msg_alloc(sc, NULL, &im, IM_NOINTR)) != 0)
   1031 		return (rv);
   1032 
   1033 	if (write) {
   1034 		func = I2O_UTIL_PARAMS_SET;
   1035 		op = I2O_PARAMS_OP_FIELD_SET;
   1036 	} else {
   1037 		func = I2O_UTIL_PARAMS_GET;
   1038 		op = I2O_PARAMS_OP_FIELD_GET;
   1039 	}
   1040 
   1041 	mb = (struct i2o_util_params_op *)im->im_msg;
   1042 	mb->msgflags = I2O_MSGFLAGS(i2o_util_params_op);
   1043 	mb->msgfunc = I2O_MSGFUNC(tid, func);
   1044 	mb->msgictx = IOP_ICTX;
   1045 	mb->msgtctx = im->im_tctx;
   1046 	mb->flags = 0;
   1047 
   1048 	req.olh.count = htole16(1);
   1049 	req.olh.reserved = htole16(0);
   1050 	req.oat.operation = htole16(op);
   1051 	req.oat.fieldcount = htole16(0xffff);
   1052 	req.oat.group = htole16(group);
   1053 
   1054 	memset(buf, 0, size);
   1055 	iop_msg_map(sc, im, &req, sizeof(req), 1);
   1056 	iop_msg_map(sc, im, buf, size, write);
   1057 
   1058 	rv = iop_msg_enqueue(sc, im, 5000);
   1059 	iop_msg_unmap(sc, im);
   1060 	iop_msg_free(sc, NULL, im);
   1061 	return (rv);
   1062 }
   1063 
   1064 /*
   1065  * Execute a simple command (no parameters).
   1066  */
   1067 int
   1068 iop_simple_cmd(struct iop_softc *sc, int tid, int function, int ictx,
   1069 	       int async, int timo)
   1070 {
   1071 	struct iop_msg *im;
   1072 	struct i2o_msg *mb;
   1073 	int rv, fl;
   1074 
   1075 	fl = (async != 0 ? IM_NOWAIT : 0);
   1076 	if ((rv = iop_msg_alloc(sc, NULL, &im, fl | IM_NOINTR)) != 0)
   1077 		return (rv);
   1078 
   1079 	mb = (struct i2o_msg *)im->im_msg;
   1080 	mb->msgflags = I2O_MSGFLAGS(i2o_msg);
   1081 	mb->msgfunc = I2O_MSGFUNC(tid, function);
   1082 	mb->msgictx = ictx;
   1083 	mb->msgtctx = im->im_tctx;
   1084 
   1085 	if (async)
   1086 		rv = iop_msg_enqueue(sc, im, timo);
   1087 	else
   1088 		rv = iop_msg_send(sc, im, timo);
   1089 	iop_msg_free(sc, NULL, im);
   1090 	return (rv);
   1091 }
   1092 
   1093 /*
   1094  * Post the system table to the IOP.
   1095  */
   1096 static int
   1097 iop_systab_set(struct iop_softc *sc)
   1098 {
   1099 	struct i2o_exec_sys_tab_set *mb;
   1100 	struct iop_msg *im;
   1101 	u_int32_t mema[2], ioa[2];
   1102 	int rv;
   1103 
   1104 	if ((rv = iop_msg_alloc(sc, NULL, &im, IM_NOINTR)) != 0)
   1105 		return (rv);
   1106 
   1107 	mb = (struct i2o_exec_sys_tab_set *)im->im_msg;
   1108 	mb->msgflags = I2O_MSGFLAGS(i2o_exec_sys_tab_set);
   1109 	mb->msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_SYS_TAB_SET);
   1110 	mb->msgictx = IOP_ICTX;
   1111 	mb->msgtctx = im->im_tctx;
   1112 	mb->iopid = (sc->sc_dv.dv_unit + 2) << 12;
   1113 	mb->segnumber = 0;
   1114 
   1115 	/* XXX This is questionable, but better than nothing... */
   1116 	mema[0] = le32toh(sc->sc_status.currentprivmembase);
   1117 	mema[1] = le32toh(sc->sc_status.currentprivmemsize);
   1118 	ioa[0] = le32toh(sc->sc_status.currentpriviobase);
   1119 	ioa[1] = le32toh(sc->sc_status.currentpriviosize);
   1120 
   1121 	iop_msg_map(sc, im, iop_systab, iop_systab_size, 1);
   1122 	iop_msg_map(sc, im, mema, sizeof(mema), 1);
   1123 	iop_msg_map(sc, im, ioa, sizeof(ioa), 1);
   1124 
   1125 	rv = iop_msg_enqueue(sc, im, 5000);
   1126 	iop_msg_unmap(sc, im);
   1127 	iop_msg_free(sc, NULL, im);
   1128 	return (rv);
   1129 }
   1130 
   1131 /*
   1132  * Reset the adapter.  Must be called with interrupts disabled.
   1133  */
   1134 static int
   1135 iop_reset(struct iop_softc *sc)
   1136 {
   1137 	struct iop_msg *im;
   1138 	volatile u_int32_t sw;
   1139 	u_int32_t mfa;
   1140 	struct i2o_exec_iop_reset *mb;
   1141 	int rv;
   1142 
   1143 	if ((rv = iop_msg_alloc(sc, NULL, &im, IM_NOWAIT | IM_NOICTX)) != 0)
   1144 		return (rv);
   1145 
   1146 	sw = 0;
   1147 
   1148 	mb = (struct i2o_exec_iop_reset *)im->im_msg;
   1149 	mb->msgflags = I2O_MSGFLAGS(i2o_exec_iop_reset);
   1150 	mb->msgfunc = I2O_MSGFUNC(I2O_TID_IOP, I2O_EXEC_IOP_RESET);
   1151 	mb->reserved[0] = 0;
   1152 	mb->reserved[1] = 0;
   1153 	mb->reserved[2] = 0;
   1154 	mb->reserved[3] = 0;
   1155 	mb->statuslow = kvtop((caddr_t)&sw);		/* XXX */
   1156 	mb->statushigh = 0;
   1157 
   1158 	if ((rv = iop_msg_send(sc, im, 0)))
   1159 		return (rv);
   1160 	iop_msg_free(sc, NULL, im);
   1161 
   1162 	POLL(2500, sw != 0);					/* XXX */
   1163 	if (sw != I2O_RESET_IN_PROGRESS) {
   1164 		printf("%s: reset rejected\n", sc->sc_dv.dv_xname);
   1165 		return (EIO);
   1166 	}
   1167 
   1168 	/*
   1169 	 * IOP is now in the INIT state.  Wait no more than 10 seconds for
   1170 	 * the inbound queue to become responsive.
   1171 	 */
   1172 	POLL(10000, (mfa = iop_inl(sc, IOP_REG_IFIFO)) != IOP_MFA_EMPTY);
   1173 	if (mfa == IOP_MFA_EMPTY) {
   1174 		printf("%s: reset failed\n", sc->sc_dv.dv_xname);
   1175 		return (EIO);
   1176 	}
   1177 
   1178 	if (sw == I2O_RESET_REJECTED)
   1179 		printf("%s: reset rejected?\n", sc->sc_dv.dv_xname);
   1180 
   1181 	iop_release_mfa(sc, mfa);
   1182 	return (0);
   1183 }
   1184 
   1185 /*
   1186  * Register a new initiator.
   1187  */
   1188 int
   1189 iop_initiator_register(struct iop_softc *sc, struct iop_initiator *ii)
   1190 {
   1191 	static int ictx;
   1192 	static int stctx;
   1193 
   1194 	/* 0 is reserved for system messages. */
   1195 	ii->ii_ictx = ++ictx;
   1196 	ii->ii_stctx = ++stctx | 0x80000000;
   1197 
   1198 	LIST_INSERT_HEAD(&sc->sc_iilist, ii, ii_list);
   1199 	LIST_INSERT_HEAD(IOP_ICTXHASH(ii->ii_ictx), ii, ii_hash);
   1200 
   1201 	return (0);
   1202 }
   1203 
   1204 /*
   1205  * Unregister an initiator.
   1206  */
   1207 void
   1208 iop_initiator_unregister(struct iop_softc *sc, struct iop_initiator *ii)
   1209 {
   1210 
   1211 	LIST_REMOVE(ii, ii_list);
   1212 	LIST_REMOVE(ii, ii_hash);
   1213 }
   1214 
   1215 /*
   1216  * Handle a reply frame from the adapter.
   1217  */
   1218 static int
   1219 iop_handle_reply(struct iop_softc *sc, u_int32_t rmfa)
   1220 {
   1221 	struct iop_msg *im;
   1222 	struct i2o_reply *rb;
   1223 	struct iop_initiator *ii;
   1224 	u_int off, ictx, tctx, status, size;
   1225 
   1226 	off = (int)(rmfa - sc->sc_rep_phys);
   1227 	rb = (struct i2o_reply *)(sc->sc_rep + off);
   1228 
   1229 	/* Perform reply queue DMA synchronisation... */
   1230 	bus_dmamap_sync(sc->sc_dmat, sc->sc_rep_dmamap, off, IOP_MAX_MSG_SIZE,
   1231 	    BUS_DMASYNC_POSTREAD);
   1232 	if (--sc->sc_stat.is_cur_hwqueue != 0)
   1233 		bus_dmamap_sync(sc->sc_dmat, sc->sc_rep_dmamap,
   1234 		    0, sc->sc_rep_size, BUS_DMASYNC_PREREAD);
   1235 
   1236 #ifdef I2ODEBUG
   1237 	if ((le32toh(rb->msgflags) & I2O_MSGFLAGS_64BIT) != 0)
   1238 		panic("iop_handle_reply: 64-bit reply");
   1239 #endif
   1240 	/*
   1241 	 * Find the initiator.
   1242 	 */
   1243 	ictx = le32toh(rb->msgictx);
   1244 	if (ictx == IOP_ICTX)
   1245 		ii = NULL;
   1246 	else {
   1247 		ii = LIST_FIRST(IOP_ICTXHASH(ictx));
   1248 		for (; ii != NULL; ii = LIST_NEXT(ii, ii_hash))
   1249 			if (ii->ii_ictx == ictx)
   1250 				break;
   1251 		if (ii == NULL) {
   1252 #ifdef I2ODEBUG
   1253 			iop_reply_print(sc, NULL, rb);
   1254 #endif
   1255 			printf("%s: WARNING: bad ictx returned (%x)",
   1256 			    sc->sc_dv.dv_xname, ictx);
   1257 
   1258 			/* Return the reply frame to the IOP's outbound FIFO. */
   1259 			iop_outl(sc, IOP_REG_OFIFO, rmfa);
   1260 			return (-1);
   1261 		}
   1262 	}
   1263 
   1264 	status = rb->reqstatus;
   1265 
   1266 	if (ii == NULL || (ii->ii_flags & II_DISCARD) == 0) {
   1267 		/*
   1268 		 * This initiator tracks state using message wrappers.
   1269 		 *
   1270 		 * Find the originating message wrapper, and if requested
   1271 		 * notify the initiator.
   1272 		 */
   1273 		tctx = le32toh(rb->msgtctx);
   1274 		im = TAILQ_FIRST(IOP_TCTXHASH(tctx));
   1275 		for (; im != NULL; im = TAILQ_NEXT(im, im_hash))
   1276 			if (im->im_tctx == tctx)
   1277 				break;
   1278 		if (im == NULL || (im->im_flags & IM_ALLOCED) == 0) {
   1279 #ifdef I2ODEBUG
   1280 			iop_reply_print(sc, NULL, rb);
   1281 #endif
   1282 			printf("%s: WARNING: bad tctx returned (%x, %p)",
   1283 			    sc->sc_dv.dv_xname, tctx, im);
   1284 
   1285 			/* Return the reply frame to the IOP's outbound FIFO. */
   1286 			iop_outl(sc, IOP_REG_OFIFO, rmfa);
   1287 			return (-1);
   1288 		}
   1289 #ifdef I2ODEBUG
   1290 		if ((im->im_flags & IM_REPLIED) != 0)
   1291 			panic("%s: dup reply", sc->sc_dv.dv_xname);
   1292 #endif
   1293 
   1294 		im->im_flags |= IM_REPLIED;
   1295 
   1296 #ifdef I2ODEBUG
   1297 		if (rb->reqstatus != 0)
   1298 			iop_reply_print(sc, im, rb);
   1299 #endif
   1300 		/* Notify the initiator. */
   1301 		if ((im->im_flags & IM_WAITING) != 0) {
   1302 			size = (le32toh(rb->msgflags) >> 14) & ~3;
   1303 			if (size > IOP_MAX_REPLY_SIZE)
   1304 				size = IOP_MAX_REPLY_SIZE;
   1305 			memcpy(im->im_msg, rb, size);
   1306 			wakeup(im);
   1307 		} else if ((im->im_flags & IM_NOINTR) == 0)
   1308 			(*ii->ii_intr)(ii->ii_dv, im, rb);
   1309 	} else {
   1310 		/*
   1311 		 * This initiator discards message wrappers.
   1312 		 *
   1313 		 * Simply pass the reply frame to the initiator.
   1314 		 */
   1315 		(*ii->ii_intr)(ii->ii_dv, NULL, rb);
   1316 	}
   1317 
   1318 	/* Return the reply frame to the IOP's outbound FIFO. */
   1319 	iop_outl(sc, IOP_REG_OFIFO, rmfa);
   1320 
   1321 	/* Run the queue. */
   1322 	if ((im = SIMPLEQ_FIRST(&sc->sc_queue)) != NULL)
   1323 		iop_msg_enqueue(sc, im, 0);
   1324 
   1325 	return (status);
   1326 }
   1327 
   1328 /*
   1329  * Handle an interrupt from the adapter.
   1330  */
   1331 int
   1332 iop_intr(void *arg)
   1333 {
   1334 	struct iop_softc *sc;
   1335 	u_int32_t rmfa;
   1336 
   1337 	sc = arg;
   1338 
   1339 	if ((iop_inl(sc, IOP_REG_INTR_STATUS) & IOP_INTR_OFIFO) == 0)
   1340 		return (0);
   1341 
   1342 	for (;;) {
   1343 		/* Double read to account for IOP bug. */
   1344 		if ((rmfa = iop_inl(sc, IOP_REG_OFIFO)) == IOP_MFA_EMPTY &&
   1345 		    (rmfa = iop_inl(sc, IOP_REG_OFIFO)) == IOP_MFA_EMPTY)
   1346 			break;
   1347 		iop_handle_reply(sc, rmfa);
   1348 	}
   1349 
   1350 	return (1);
   1351 }
   1352 
   1353 /*
   1354  * Handle an event signalled by the executive.
   1355  */
   1356 static void
   1357 iop_intr_event(struct device *dv, struct iop_msg *im, void *reply)
   1358 {
   1359 	struct i2o_util_event_register_reply *rb;
   1360 	struct iop_softc *sc;
   1361 	u_int event;
   1362 
   1363 	sc = (struct iop_softc *)dv;
   1364 	rb = reply;
   1365 	event = le32toh(rb->event);
   1366 
   1367 #ifndef I2ODEBUG
   1368 	if (event == I2O_EVENT_GEN_EVENT_MASK_MODIFIED)
   1369 		return;
   1370 #endif
   1371 
   1372 	printf("%s: event 0x%08x received\n", dv->dv_xname, event);
   1373 }
   1374 
   1375 /*
   1376  * Allocate a message wrapper.
   1377  */
   1378 int
   1379 iop_msg_alloc(struct iop_softc *sc, struct iop_initiator *ii,
   1380 	      struct iop_msg **imp, int flags)
   1381 {
   1382 	struct iop_msg *im;
   1383 	static int tctxgen = 666;
   1384 	int s, rv, i, tctx;
   1385 
   1386 #ifdef I2ODEBUG
   1387 	if ((flags & IM_SYSMASK) != 0)
   1388 		panic("iop_msg_alloc: system flags specified");
   1389 #endif
   1390 
   1391 	s = splbio();	/* XXX */
   1392 
   1393 	if (ii != NULL && (ii->ii_flags & II_DISCARD) != 0) {
   1394 		flags |= IM_DISCARD;
   1395 		tctx = ii->ii_stctx;
   1396 	} else
   1397 		tctx = tctxgen++ & 0x7fffffff;
   1398 
   1399 	im = (struct iop_msg *)pool_get(iop_msgpool,
   1400 	    (flags & IM_NOWAIT) == 0 ? PR_WAITOK : 0);
   1401 	if (im == NULL) {
   1402 		splx(s);
   1403 		return (ENOMEM);
   1404 	}
   1405 
   1406 	/* XXX */
   1407 	rv = bus_dmamap_create(sc->sc_dmat, IOP_MAX_XFER, IOP_MAX_SGL_ENTRIES,
   1408 	    IOP_MAX_XFER, 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW,
   1409 	    &im->im_xfer[0].ix_map);
   1410 	if (rv != 0) {
   1411 		pool_put(iop_msgpool, im);
   1412 		splx(s);
   1413 		return (rv);
   1414 	}
   1415 
   1416 	if ((flags & (IM_DISCARD | IM_NOICTX)) == 0)
   1417 		TAILQ_INSERT_TAIL(IOP_TCTXHASH(tctx), im, im_hash);
   1418 
   1419 	splx(s);
   1420 
   1421 	im->im_tctx = tctx;
   1422 	im->im_flags = flags | IM_ALLOCED;
   1423 	for (i = 0; i < IOP_MAX_MSG_XFERS; i++)
   1424 		im->im_xfer[i].ix_size = 0;
   1425 	*imp = im;
   1426 
   1427 	return (0);
   1428 }
   1429 
   1430 /*
   1431  * Free a message wrapper.
   1432  */
   1433 void
   1434 iop_msg_free(struct iop_softc *sc, struct iop_initiator *ii, struct iop_msg *im)
   1435 {
   1436 	int s;
   1437 
   1438 #ifdef I2ODEBUG
   1439 	if ((im->im_flags & IM_ALLOCED) == 0)
   1440 		panic("iop_msg_free: wrapper not allocated");
   1441 #endif
   1442 
   1443 	/* XXX */
   1444 	bus_dmamap_destroy(sc->sc_dmat, im->im_xfer[0].ix_map);
   1445 
   1446 	s = splbio();	/* XXX */
   1447 
   1448 	if ((im->im_flags & (IM_DISCARD | IM_NOICTX)) == 0)
   1449 		TAILQ_REMOVE(IOP_TCTXHASH(im->im_tctx), im, im_hash);
   1450 
   1451 	im->im_flags = 0;
   1452 	pool_put(iop_msgpool, im);
   1453 	splx(s);
   1454 }
   1455 
   1456 /*
   1457  * Map a data transfer.  Write a scatter-gather list into the message frame.
   1458  */
   1459 int
   1460 iop_msg_map(struct iop_softc *sc, struct iop_msg *im, void *xferaddr,
   1461 	    int xfersize, int out)
   1462 {
   1463 	struct iop_xfer *ix;
   1464 	u_int32_t *mb;
   1465 	int rv, seg, i;
   1466 
   1467 	for (i = 0, ix = im->im_xfer; i < IOP_MAX_MSG_XFERS; i++, ix++)
   1468 		if (ix->ix_size == 0)
   1469 			break;
   1470 #ifdef I2ODEBUG
   1471 	if (i == IOP_MAX_MSG_XFERS)
   1472 		panic("iop_msg_map: too many xfers");
   1473 #endif
   1474 
   1475 	/* Only the first DMA map is static. */
   1476 	if (i != 0) {
   1477 		rv = bus_dmamap_create(sc->sc_dmat, IOP_MAX_XFER,
   1478 		    IOP_MAX_SGL_ENTRIES, IOP_MAX_XFER, 0,
   1479 		    BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &ix->ix_map);
   1480 		if (rv != 0)
   1481 			return (rv);
   1482 	}
   1483 
   1484 	ix->ix_flags = (out ? IX_OUT : IX_IN);
   1485 	ix->ix_size = xfersize;
   1486 
   1487 	rv = bus_dmamap_load(sc->sc_dmat, ix->ix_map, xferaddr, xfersize,
   1488 	    NULL, 0);
   1489 	if (rv != 0)
   1490 		return (rv);
   1491 	bus_dmamap_sync(sc->sc_dmat, ix->ix_map, 0, xfersize,
   1492 	    out ? BUS_DMASYNC_POSTWRITE : BUS_DMASYNC_POSTREAD);
   1493 
   1494 	mb = im->im_msg + (im->im_msg[0] >> 16);
   1495 	if (out)
   1496 		out = I2O_SGL_SIMPLE | I2O_SGL_DATA_OUT;
   1497 	else
   1498 		out = I2O_SGL_SIMPLE;
   1499 
   1500 	for (seg = 0; seg < ix->ix_map->dm_nsegs; seg++) {
   1501 #ifdef I2ODEBUG
   1502 		if ((seg << 1) + (im->im_msg[0] >> 16) >=
   1503 		    (IOP_MAX_MSG_SIZE >> 2))
   1504 			panic("iop_map_xfer: message frame too large");
   1505 #endif
   1506 		if (seg == ix->ix_map->dm_nsegs - 1)
   1507 			out |= I2O_SGL_END_BUFFER;
   1508 		*mb++ = (u_int32_t)ix->ix_map->dm_segs[seg].ds_len | out;
   1509 		*mb++ = (u_int32_t)ix->ix_map->dm_segs[seg].ds_addr;
   1510 	}
   1511 
   1512 	/*
   1513 	 * If this is the first xfer we've mapped for this message, adjust
   1514 	 * the SGL offset field in the message header.
   1515 	 */
   1516 	if ((im->im_flags & IM_SGLOFFADJ) == 0) {
   1517 		im->im_msg[0] += ((im->im_msg[0] >> 16) + seg * 2) << 4;
   1518 		im->im_flags |= IM_SGLOFFADJ;
   1519 	}
   1520 	im->im_msg[0] += (seg << 17);
   1521 	return (0);
   1522 }
   1523 
   1524 /*
   1525  * Unmap all data transfers associated with a message wrapper.
   1526  */
   1527 void
   1528 iop_msg_unmap(struct iop_softc *sc, struct iop_msg *im)
   1529 {
   1530 	struct iop_xfer *ix;
   1531 	int i;
   1532 
   1533 	for (i = 0, ix = im->im_xfer; i < IOP_MAX_MSG_XFERS; i++, ix++) {
   1534 		if (ix->ix_size == 0)
   1535 			break;
   1536 		bus_dmamap_sync(sc->sc_dmat, ix->ix_map, 0, ix->ix_size,
   1537 		    ix->ix_flags & IX_OUT ? BUS_DMASYNC_POSTWRITE :
   1538 		    BUS_DMASYNC_POSTREAD);
   1539 		bus_dmamap_unload(sc->sc_dmat, ix->ix_map);
   1540 
   1541 		/* Only the first DMA map is static. */
   1542 		if (i != 0)
   1543 			bus_dmamap_destroy(sc->sc_dmat, ix->ix_map);
   1544 
   1545 		ix->ix_size = 0;
   1546 	}
   1547 }
   1548 
   1549 /*
   1550  * Send a message to the IOP.  Optionally, poll on completion.  Return
   1551  * non-zero if failure status is returned and IM_NOINTR is set.
   1552  */
   1553 int
   1554 iop_msg_send(struct iop_softc *sc, struct iop_msg *im, int timo)
   1555 {
   1556 	u_int32_t mfa, rmfa;
   1557 	int rv, status, i, s;
   1558 
   1559 #ifdef I2ODEBUG
   1560 	if ((im->im_flags & IM_NOICTX) == 0)
   1561 		if (im->im_msg[3] == IOP_ICTX &&
   1562 		    (im->im_flags & IM_NOINTR) == 0)
   1563 			panic("iop_msg_send: IOP_ICTX and !IM_NOINTR");
   1564 	if ((im->im_flags & IM_DISCARD) != 0)
   1565 		panic("iop_msg_send: IM_DISCARD");
   1566 #endif
   1567 
   1568 	s = splbio();	/* XXX */
   1569 
   1570 	/* Wait up to 250ms for an MFA. */
   1571 	POLL(250, (mfa = iop_inl(sc, IOP_REG_IFIFO)) != IOP_MFA_EMPTY);
   1572 	if (mfa == IOP_MFA_EMPTY) {
   1573 		DPRINTF(("%s: mfa not forthcoming\n", sc->sc_dv.dv_xname));
   1574 		splx(s);
   1575 		return (EBUSY);
   1576 	}
   1577 
   1578 	/* Perform reply queue DMA synchronisation and update counters. */
   1579 	if ((im->im_flags & IM_NOICTX) == 0) {
   1580 		if (sc->sc_stat.is_cur_hwqueue == 0)
   1581 			bus_dmamap_sync(sc->sc_dmat, sc->sc_rep_dmamap, 0,
   1582 			    sc->sc_rep_size, BUS_DMASYNC_PREREAD);
   1583 		for (i = 0; i < IOP_MAX_MSG_XFERS; i++)
   1584 			sc->sc_stat.is_bytes += im->im_xfer[i].ix_size;
   1585 		sc->sc_stat.is_requests++;
   1586 		if (++sc->sc_stat.is_cur_hwqueue > sc->sc_stat.is_peak_hwqueue)
   1587 			sc->sc_stat.is_peak_hwqueue =
   1588 			    sc->sc_stat.is_cur_hwqueue;
   1589 	}
   1590 
   1591 	/* Terminate scatter/gather lists. */
   1592 	if ((im->im_flags & IM_SGLOFFADJ) != 0)
   1593 		im->im_msg[(im->im_msg[0] >> 16) - 2] |= I2O_SGL_END;
   1594 
   1595 	/* Post the message frame. */
   1596 	bus_space_write_region_4(sc->sc_iot, sc->sc_ioh, mfa,
   1597 	    im->im_msg, im->im_msg[0] >> 16);
   1598 	bus_space_barrier(sc->sc_iot, sc->sc_ioh, mfa,
   1599 	    (im->im_msg[0] >> 14) & ~3, BUS_SPACE_BARRIER_WRITE);
   1600 
   1601 	/* Post the MFA back to the IOP, thus starting the command. */
   1602 	iop_outl(sc, IOP_REG_IFIFO, mfa);
   1603 
   1604 	if (timo == 0) {
   1605 		splx(s);
   1606 		return (0);
   1607 	}
   1608 
   1609 	/* Wait for completion. */
   1610 	for (timo *= 10; timo != 0; timo--) {
   1611 		if ((iop_inl(sc, IOP_REG_INTR_STATUS) & IOP_INTR_OFIFO) != 0) {
   1612 			/* Double read to account for IOP bug. */
   1613 			rmfa = iop_inl(sc, IOP_REG_OFIFO);
   1614 			if (rmfa == IOP_MFA_EMPTY)
   1615 				rmfa = iop_inl(sc, IOP_REG_OFIFO);
   1616 			if (rmfa != IOP_MFA_EMPTY)
   1617 				status = iop_handle_reply(sc, rmfa);
   1618 		}
   1619 		if ((im->im_flags & IM_REPLIED) != 0)
   1620 			break;
   1621 		DELAY(100);
   1622 	}
   1623 
   1624 	splx(s);
   1625 
   1626 	if (timo == 0) {
   1627 #ifdef I2ODEBUG
   1628 		printf("%s: poll - no reply\n", sc->sc_dv.dv_xname);
   1629 		if (iop_status_get(sc) != 0)
   1630 			printf("iop_msg_send: unable to retrieve status\n");
   1631 		else
   1632 			printf("iop_msg_send: IOP state = %d\n",
   1633 			    (le32toh(sc->sc_status.segnumber) >> 16) & 0xff);
   1634 #endif
   1635 		rv = EBUSY;
   1636 	} else if ((im->im_flags & IM_NOINTR) != 0)
   1637 		rv = (status != I2O_STATUS_SUCCESS ? EIO : 0);
   1638 
   1639 	return (rv);
   1640 }
   1641 
   1642 /*
   1643  * Try to post a message to the adapter; if that's not possible, enqueue it
   1644  * with us.  If a timeout is specified, wait for the message to complete.
   1645  */
   1646 int
   1647 iop_msg_enqueue(struct iop_softc *sc, struct iop_msg *im, int timo)
   1648 {
   1649 	u_int mfa;
   1650 	int s, fromqueue, i, rv;
   1651 
   1652 #ifdef I2ODEBUG
   1653 	if (im == NULL)
   1654 		panic("iop_msg_enqueue: im == NULL");
   1655 	if (sc == NULL)
   1656 		panic("iop_msg_enqueue: sc == NULL");
   1657 	if ((im->im_flags & IM_NOICTX) != 0)
   1658 		panic("iop_msg_enqueue: IM_NOICTX");
   1659 	if (im->im_msg[3] == IOP_ICTX && (im->im_flags & IM_NOINTR) == 0)
   1660 		panic("iop_msg_enqueue: IOP_ICTX and no IM_NOINTR");
   1661 	if ((im->im_flags & IM_DISCARD) != 0 && timo != 0)
   1662 		panic("iop_msg_enqueue: IM_DISCARD && timo != 0");
   1663 	if ((im->im_flags & IM_NOINTR) == 0 && timo != 0)
   1664 		panic("iop_msg_enqueue: !IM_NOINTR && timo != 0");
   1665 #endif
   1666 
   1667 	s = splbio();	/* XXX */
   1668 	fromqueue = (im == SIMPLEQ_FIRST(&sc->sc_queue));
   1669 
   1670 	if (sc->sc_stat.is_cur_hwqueue >= sc->sc_maxqueuecnt) {
   1671 		/*
   1672 		 * While the IOP may be able to accept more inbound message
   1673 		 * frames than it advertises, don't push harder than it
   1674 		 * wants to go lest we starve it.
   1675 		 *
   1676 		 * XXX We should be handling IOP resource shortages.
   1677 		 */
   1678 		mfa = IOP_MFA_EMPTY;
   1679 		DPRINTF(("iop_msg_enqueue: exceeded max queue count\n"));
   1680 	} else {
   1681 		/* Double read to account for IOP bug. */
   1682 		if ((mfa = iop_inl(sc, IOP_REG_IFIFO)) == IOP_MFA_EMPTY)
   1683 			mfa = iop_inl(sc, IOP_REG_IFIFO);
   1684 	}
   1685 
   1686 	if (mfa == IOP_MFA_EMPTY) {
   1687 		DPRINTF(("iop_msg_enqueue: no mfa\n"));
   1688 		/* Can't transfer to h/w queue - queue with us. */
   1689 		if (!fromqueue) {
   1690 			SIMPLEQ_INSERT_TAIL(&sc->sc_queue, im, im_queue);
   1691 			if (++sc->sc_stat.is_cur_swqueue >
   1692 			    sc->sc_stat.is_peak_swqueue)
   1693 				sc->sc_stat.is_peak_swqueue =
   1694 				    sc->sc_stat.is_cur_swqueue;
   1695 		}
   1696 		splx(s);
   1697 		if ((im->im_flags & IM_NOINTR) != 0)
   1698 			rv = iop_msg_wait(sc, im, timo);
   1699 		else
   1700 			rv = 0;
   1701 		return (rv);
   1702 	} else if (fromqueue) {
   1703 		SIMPLEQ_REMOVE_HEAD(&sc->sc_queue, im, im_queue);
   1704 		sc->sc_stat.is_cur_swqueue--;
   1705 	}
   1706 
   1707 	if ((im->im_flags & IM_NOINTR) != 0)
   1708 		im->im_flags |= IM_WAITING;
   1709 
   1710 	/* Perform reply queue DMA synchronisation and update counters. */
   1711 	if (sc->sc_stat.is_cur_hwqueue == 0)
   1712 		bus_dmamap_sync(sc->sc_dmat, sc->sc_rep_dmamap, 0,
   1713 		    sc->sc_rep_size, BUS_DMASYNC_PREREAD);
   1714 
   1715 	for (i = 0; i < IOP_MAX_MSG_XFERS; i++)
   1716 		sc->sc_stat.is_bytes += im->im_xfer[i].ix_size;
   1717 	sc->sc_stat.is_requests++;
   1718 	if (++sc->sc_stat.is_cur_hwqueue > sc->sc_stat.is_peak_hwqueue)
   1719 		sc->sc_stat.is_peak_hwqueue = sc->sc_stat.is_cur_hwqueue;
   1720 
   1721 	/* Terminate the scatter/gather list. */
   1722 	if ((im->im_flags & IM_SGLOFFADJ) != 0)
   1723 		im->im_msg[(im->im_msg[0] >> 16) - 2] |= I2O_SGL_END;
   1724 
   1725 	/* Post the message frame. */
   1726 	bus_space_write_region_4(sc->sc_iot, sc->sc_ioh, mfa,
   1727 	    im->im_msg, im->im_msg[0] >> 16);
   1728 	bus_space_barrier(sc->sc_iot, sc->sc_ioh, mfa,
   1729 	    (im->im_msg[0] >> 14) & ~3, BUS_SPACE_BARRIER_WRITE);
   1730 
   1731 	/* Post the MFA back to the IOP, thus starting the command. */
   1732 	iop_outl(sc, IOP_REG_IFIFO, mfa);
   1733 
   1734 	/* If this is a discardable message wrapper, free it. */
   1735 	if ((im->im_flags & IM_DISCARD) != 0)
   1736 		iop_msg_free(sc, NULL, im);
   1737 	splx(s);
   1738 
   1739 	if ((im->im_flags & IM_NOINTR) != 0)
   1740 		rv = iop_msg_wait(sc, im, timo);
   1741 	else
   1742 		rv = 0;
   1743 	return (rv);
   1744 }
   1745 
   1746 /*
   1747  * Wait for the specified message to complete.
   1748  */
   1749 static int
   1750 iop_msg_wait(struct iop_softc *sc, struct iop_msg *im, int timo)
   1751 {
   1752 	struct i2o_reply *rb;
   1753 	int rv, s;
   1754 
   1755 	s = splbio();
   1756 	if ((im->im_flags & IM_REPLIED) != 0) {
   1757 		splx(s);
   1758 		return (0);
   1759 	}
   1760 	rv = tsleep(im, PRIBIO, "iopmsg", timo * hz / 1000);
   1761 	splx(s);
   1762 #ifdef I2ODEBUG
   1763 	if (rv != 0) {
   1764 		printf("iop_msg_wait: tsleep() == %d\n", rv);
   1765 		if (iop_status_get(sc) != 0)
   1766 			printf("iop_msg_wait: unable to retrieve status\n");
   1767 		else
   1768 			printf("iop_msg_wait: IOP state = %d\n",
   1769 			    (le32toh(sc->sc_status.segnumber) >> 16) & 0xff);
   1770 	}
   1771 #endif
   1772 	if ((im->im_flags & (IM_REPLIED | IM_NOSTATUS)) == IM_REPLIED) {
   1773 		rb = (struct i2o_reply *)im->im_msg;
   1774 		rv = (rb->reqstatus != I2O_STATUS_SUCCESS ? EIO : 0);
   1775 	}
   1776 	return (rv);
   1777 }
   1778 
   1779 /*
   1780  * Release an unused message frame back to the IOP's inbound fifo.
   1781  */
   1782 static void
   1783 iop_release_mfa(struct iop_softc *sc, u_int32_t mfa)
   1784 {
   1785 
   1786 	/* Use the frame to issue a no-op. */
   1787 	iop_outl(sc, mfa, I2O_VERSION_11 | (4 << 16));
   1788 	iop_outl(sc, mfa + 4, I2O_MSGFUNC(I2O_TID_IOP, I2O_UTIL_NOP));
   1789 	iop_outl(sc, mfa + 8, 0);
   1790 	iop_outl(sc, mfa + 12, 0);
   1791 
   1792 	iop_outl(sc, IOP_REG_IFIFO, mfa);
   1793 }
   1794 
   1795 #ifdef I2ODEBUG
   1796 /*
   1797  * Print status information from a failure reply frame.
   1798  */
   1799 static void
   1800 iop_reply_print(struct iop_softc *sc, struct iop_msg *im,
   1801 		struct i2o_reply *rb)
   1802 {
   1803 	u_int function, detail;
   1804 #ifdef I2OVERBOSE
   1805 	const char *statusstr;
   1806 #endif
   1807 
   1808 	if (im != NULL && (im->im_flags & IM_REPLIED) == 0)
   1809 		panic("iop_msg_print_status: %p not replied to", im);
   1810 
   1811 	function = (le32toh(rb->msgfunc) >> 24) & 0xff;
   1812 	detail = le16toh(rb->detail);
   1813 
   1814 	printf("%s: reply:\n", sc->sc_dv.dv_xname);
   1815 
   1816 #ifdef I2OVERBOSE
   1817 	if (rb->reqstatus < sizeof(iop_status) / sizeof(iop_status[0]))
   1818 		statusstr = iop_status[rb->reqstatus];
   1819 	else
   1820 		statusstr = "undefined error code";
   1821 
   1822 	printf("%s:   function=0x%02x status=0x%02x (%s)\n",
   1823 	    sc->sc_dv.dv_xname, function, rb->reqstatus, statusstr);
   1824 #else
   1825 	printf("%s:   function=0x%02x status=0x%02x\n",
   1826 	    sc->sc_dv.dv_xname, function, rb->reqstatus);
   1827 #endif
   1828 	printf("%s:   detail=0x%04x ictx=0x%08x tctx=0x%08x\n",
   1829 	    sc->sc_dv.dv_xname, detail, le32toh(rb->msgictx),
   1830 	    le32toh(rb->msgtctx));
   1831 	printf("%s:   tidi=%d tidt=%d flags=0x%02x\n", sc->sc_dv.dv_xname,
   1832 	    (le32toh(rb->msgfunc) >> 12) & 4095, le32toh(rb->msgfunc) & 4095,
   1833 	    (le32toh(rb->msgflags) >> 8) & 0xff);
   1834 }
   1835 #endif
   1836 
   1837 /*
   1838  * Translate an I2O ASCII field into a C string.
   1839  */
   1840 void
   1841 iop_strvis(struct iop_softc *sc, const char *src, int slen, char *dst, int dlen)
   1842 {
   1843 	int hc, lc, i, nit;
   1844 
   1845 	dlen--;
   1846 	lc = 0;
   1847 	hc = 0;
   1848 	i = 0;
   1849 
   1850 	/*
   1851 	 * DPT use NUL as a space, whereas AMI use it as a terminator.  The
   1852 	 * spec has nothing to say about it.  Since AMI fields are usually
   1853 	 * filled with junk after the terminator, ...
   1854 	 */
   1855 	nit = (le16toh(sc->sc_status.orgid) != I2O_ORG_DPT);
   1856 
   1857 	while (slen-- != 0 && dlen-- != 0) {
   1858 		if (nit && *src == '\0')
   1859 			break;
   1860 		else if (*src <= 0x20 || *src >= 0x7f) {
   1861 			if (hc)
   1862 				dst[i++] = ' ';
   1863 		} else {
   1864 			hc = 1;
   1865 			dst[i++] = *src;
   1866 			lc = i;
   1867 		}
   1868 		src++;
   1869 	}
   1870 
   1871 	dst[lc] = '\0';
   1872 }
   1873 
   1874 /*
   1875  * Claim or unclaim the specified TID.
   1876  */
   1877 int
   1878 iop_util_claim(struct iop_softc *sc, struct iop_initiator *ii, int release,
   1879 	      int flags)
   1880 {
   1881 	struct iop_msg *im;
   1882 	struct i2o_util_claim *mb;
   1883 	int rv, func;
   1884 
   1885 	func = release ? I2O_UTIL_CLAIM_RELEASE : I2O_UTIL_CLAIM;
   1886 
   1887 	if ((rv = iop_msg_alloc(sc, ii, &im, IM_NOINTR)) != 0)
   1888 		return (rv);
   1889 
   1890 	/* We can use the same structure, as both are identical. */
   1891 	mb = (struct i2o_util_claim *)im->im_msg;
   1892 	mb->msgflags = I2O_MSGFLAGS(i2o_util_claim);
   1893 	mb->msgfunc = I2O_MSGFUNC(ii->ii_tid, func);
   1894 	mb->msgictx = ii->ii_ictx;
   1895 	mb->msgtctx = im->im_tctx;
   1896 	mb->flags = flags;
   1897 
   1898 	rv = iop_msg_enqueue(sc, im, 5000);
   1899 	iop_msg_free(sc, ii, im);
   1900 	return (rv);
   1901 }
   1902 
   1903 /*
   1904  * Perform an abort.
   1905  */
   1906 int iop_util_abort(struct iop_softc *sc, struct iop_initiator *ii, int func,
   1907 		  int tctxabort, int flags)
   1908 {
   1909 	struct iop_msg *im;
   1910 	struct i2o_util_abort *mb;
   1911 	int rv;
   1912 
   1913 	if ((rv = iop_msg_alloc(sc, ii, &im, IM_NOINTR)) != 0)
   1914 		return (rv);
   1915 
   1916 	mb = (struct i2o_util_abort *)im->im_msg;
   1917 	mb->msgflags = I2O_MSGFLAGS(i2o_util_abort);
   1918 	mb->msgfunc = I2O_MSGFUNC(ii->ii_tid, I2O_UTIL_ABORT);
   1919 	mb->msgictx = ii->ii_ictx;
   1920 	mb->msgtctx = im->im_tctx;
   1921 	mb->flags = (func << 24) | flags;
   1922 	mb->tctxabort = tctxabort;
   1923 
   1924 	rv = iop_msg_enqueue(sc, im, 5000);
   1925 	iop_msg_free(sc, ii, im);
   1926 	return (rv);
   1927 }
   1928 
   1929 /*
   1930  * Enable or disable event types for the specified device.
   1931  */
   1932 int iop_util_eventreg(struct iop_softc *sc, struct iop_initiator *ii, int mask)
   1933 {
   1934 	struct iop_msg *im;
   1935 	struct i2o_util_event_register *mb;
   1936 	int rv;
   1937 
   1938 	if ((rv = iop_msg_alloc(sc, ii, &im, 0)) != 0)
   1939 		return (rv);
   1940 
   1941 	mb = (struct i2o_util_event_register *)im->im_msg;
   1942 	mb->msgflags = I2O_MSGFLAGS(i2o_util_event_register);
   1943 	mb->msgfunc = I2O_MSGFUNC(ii->ii_tid, I2O_UTIL_EVENT_REGISTER);
   1944 	mb->msgictx = ii->ii_ictx;
   1945 	mb->msgtctx = im->im_tctx;
   1946 	mb->eventmask = mask;
   1947 
   1948 	return (iop_msg_enqueue(sc, im, 0));
   1949 }
   1950 
   1951 int
   1952 iopopen(dev_t dev, int flag, int mode, struct proc *p)
   1953 {
   1954 	struct iop_softc *sc;
   1955 	int unit, error;
   1956 
   1957 	unit = minor(dev);
   1958 
   1959 	sc = device_lookup(&iop_cd, minor(dev));
   1960 	if ((sc = iop_cd.cd_devs[unit]) == NULL)
   1961 		return (ENXIO);
   1962 	if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
   1963 		return (error);
   1964 
   1965 	if ((sc->sc_flags & IOP_OPEN) != 0)
   1966 		return (EBUSY);
   1967 	if ((sc->sc_flags & IOP_ONLINE) == 0)
   1968 		return (EIO);
   1969 	sc->sc_flags |= IOP_OPEN;
   1970 
   1971 	return (0);
   1972 }
   1973 
   1974 int
   1975 iopclose(dev_t dev, int flag, int mode, struct proc *p)
   1976 {
   1977 	struct iop_softc *sc;
   1978 
   1979 	sc = device_lookup(&iop_cd, minor(dev));
   1980 	sc->sc_flags &= ~IOP_OPEN;
   1981 	return (0);
   1982 }
   1983 
   1984 int
   1985 iopioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
   1986 {
   1987 	struct iop_softc *sc;
   1988 	struct iovec *iov;
   1989 	struct ioppt *pt;
   1990 	struct iop_msg *im;
   1991 	struct i2o_msg *mb;
   1992 	struct i2o_reply *rb;
   1993 	int rv, i;
   1994 
   1995 	if (securelevel >= 2)
   1996 		return (EPERM);
   1997 
   1998 	sc = device_lookup(&iop_cd, minor(dev));
   1999 
   2000 	switch (cmd) {
   2001 	case IOPIOCPT:
   2002 		pt = (struct ioppt *)data;
   2003 
   2004 		if (pt->pt_msglen > IOP_MAX_MSG_SIZE ||
   2005 		    pt->pt_msglen < sizeof(struct i2o_msg) ||
   2006 		    pt->pt_nbufs > IOP_MAX_MSG_XFERS ||
   2007 		    pt->pt_nbufs < 0 ||
   2008 		    pt->pt_replylen < 0 ||
   2009 		    pt->pt_timo < 1000 ||
   2010 		    pt->pt_timo > 5*60*1000) {
   2011 		    	rv = EINVAL;
   2012 		    	break;
   2013 		}
   2014 
   2015 		rv = iop_msg_alloc(sc, NULL, &im, IM_NOINTR | IM_NOSTATUS);
   2016 		if (rv != 0)
   2017 			break;
   2018 
   2019 		if ((rv = copyin(pt->pt_msg, im->im_msg, pt->pt_msglen)) != 0) {
   2020 			iop_msg_free(sc, NULL, im);
   2021 			break;
   2022 		}
   2023 
   2024 		mb = (struct i2o_msg *)im->im_msg;
   2025 		mb->msgictx = IOP_ICTX;
   2026 		mb->msgtctx = im->im_tctx;
   2027 
   2028 		for (i = 0; i < pt->pt_nbufs; i++) {
   2029 			rv = iop_msg_map(sc, im, pt->pt_bufs[i].ptb_data,
   2030 			    pt->pt_bufs[i].ptb_datalen,
   2031 			    pt->pt_bufs[i].ptb_out != 0);
   2032 			if (rv != 0) {
   2033 				iop_msg_free(sc, NULL, im);
   2034 				return (rv);
   2035 			}
   2036 		}
   2037 
   2038 		if ((rv = iop_msg_enqueue(sc, im, pt->pt_timo)) == 0) {
   2039 			rb = (struct i2o_reply *)im->im_msg;
   2040 			i = (le32toh(rb->msgflags) >> 14) & ~3;	/* XXX */
   2041 			if (i > IOP_MAX_REPLY_SIZE)
   2042 				i = IOP_MAX_REPLY_SIZE;
   2043 			if (i > pt->pt_replylen)
   2044 				i = pt->pt_replylen;
   2045 			rv = copyout(rb, pt->pt_reply, i);
   2046 		}
   2047 
   2048 		iop_msg_free(sc, NULL, im);
   2049 		break;
   2050 
   2051 	case IOPIOCGLCT:
   2052 		iov = (struct iovec *)data;
   2053 		rv = lockmgr(&sc->sc_conflock, LK_EXCLUSIVE, NULL);
   2054 		if (rv == 0) {
   2055 			i = le16toh(sc->sc_lct->tablesize) << 2;
   2056 			if (i > iov->iov_len)
   2057 				i = iov->iov_len;
   2058 			else
   2059 				iov->iov_len = i;
   2060 			rv = copyout(sc->sc_lct, iov->iov_base, i);
   2061 			lockmgr(&sc->sc_conflock, LK_RELEASE, NULL);
   2062 		}
   2063 		break;
   2064 
   2065 	case IOPIOCGSTATUS:
   2066 		iov = (struct iovec *)data;
   2067 		i = sizeof(struct i2o_status);
   2068 		if (i > iov->iov_len)
   2069 			i = iov->iov_len;
   2070 		else
   2071 			iov->iov_len = i;
   2072 		if ((rv = iop_status_get(sc)) == 0)
   2073 			rv = copyout(&sc->sc_status, iov->iov_base, i);
   2074 		break;
   2075 
   2076 	case IOPIOCRECONFIG:
   2077 		rv = iop_reconfigure(sc, 0);
   2078 		break;
   2079 
   2080 	default:
   2081 #if defined(DIAGNOSTIC) || defined(I2ODEBUG)
   2082 		printf("%s: unknown ioctl %lx\n", sc->sc_dv.dv_xname, cmd);
   2083 #endif
   2084 		rv = ENOTTY;
   2085 		break;
   2086 	}
   2087 
   2088 	return (rv);
   2089 }
   2090